SlideShare a Scribd company logo
MyFaces CODI Feature Tour
Make JSF more type-safe with MyFaces CODI
Join CONFESS_2012!
Agenda


•   Type-safety
•   CODI in a Nutshell
•   CODI Setup
•   CODI Core
•   CODI JSF-Module
•   CODI Message-Module
•   CODI JPA-Module
•   CODI Bean-Validation
•   CODI Scripting-Module
•   Integration and Unit Tests with CODI
Type-safety - Why should we care about it?


•   Allows to use std. IDE features like auto-completion
•   Specialized IDE support is always behind
•   No Typos
•   Several features allow compile-time or at least startup checks
•   Easier for new developers to find usages
•   Easier refactorings
•   Easier maintenance
•   …
MyFaces CODI - Overview


• MyFaces Extensions CDI aka MyFaces CODI is a
  portable CDI extension which can be used with
  Apache OpenWebBeans, JBoss Weld,… and
  in combination with other portable CDI extensions
• CODI-Core is required in any case
• Modules
   –   JSF Module (for 1.2 and 2.0 and 2.1)
   –   JPA Module
   –   BV Module
   –   I18n-Message Module
   –   Scripting Module
   –   Test Support Modules
MyFaces CODI in a Nutshell



•   JSF 1.2 and 2.x          • Type-safe View-Configs
•   Type-safety              • Type-safe Navigation
•   Extensibility            • JPA Integration
•   Advanced Scopes          • Dependency Injection
•   Various Events             Support for BV
•   View-Controller          • Advanced I18n
•   JSF 2 Scope Mappings     • Scripting Integration
                             • And more!
CODI - SETUP
Getting CODI up and running


• Add CODI to the project
    – With Maven
        • Add the modules (or the all-in-one package) to the POM
    – Without Maven
        • Download the current dist package
        • Add the modules (or the all-in-one package) to the Classpath of
          the project
•   Start using it!
Getting CODI up and running - Hints


• With JEE 5 and Mojarra use the controlled bootstrapping
  add-on
• Attention (hint for all bean archives):
  Ensure that the libs aren’t duplicated – otherwise the CDI
  implementation will blame ambiguous interceptors, beans,…
CODI CORE
Startup*


• Startup-Observer for the StartupEvent
  Triggered after the environment is initialized
    – Initialization tasks which need an up and running environment
    – Easy logging that the module was started

      protected void logModuleStart(
         @Observes StartupEvent startupEvent) {
         ...
      }
•   StartupEventBroadcaster
    Allows to integrate custom broadcasting mechanisms before
    the first mechanism of CODI gets called
ProjectStage and ProjectStageActivated


• Configure beans for a special project-stage in a type-safe way
• Examples
    – Sample data
    – Debug Phase-Listener
    @ProjectStageActivated(
       ProjectStage.Development.class)
    public class SampleDataStartupObserver {

        protected void createSampleData(
          @Observes StartupEvent startupEvent,
          UserRepository userRepository) {
            //...
            userRepository.save(user);
        }
    }
Custom Project-Stages - 1


public class ProjectStages
  implements ProjectStageHolder {

    @Typed() //no bean!
    public static final class CustomProjectStage
      extends ProjectStage {}

    public static final CustomProjectStage
      CustomProjectStage =
        new CustomProjectStage();
}

+ Service-Loader config
Custom Project-Stages - 2


• Configure the project-stage like std. CODI project stages
    – JSF std. project stage
    – org.apache.myfaces.extensions.cdi.ProjectStage
    – ConfiguredValueResolver
• Injecting the current project-stage
   @Inject private ProjectStage projectStage;

• Compare the injected value
   ProjectStage.Development.equals(this.projectStage)

• Overrule the current project-stage manually
   ProjectStageProducer.setProjectStage(
     ProjectStages.CustomProjectStage)
[CODI-Hint] Deactivatable


• CDI allows deactivation via a veto-mechanism
• Won‘t work for artifacts which aren‘t managed by CDI
• CODI allows do deactivate such implementations which
  implement Deactivatable
• Deactivating classes via an implementation of
  ClassDeactivator (+ Service-Loader config)
CODI JSF-MODULE
@JsfPhaseListener


  @ProjectStageActivated(
      ProjectStage.Development.class,
      CustomProjectStage.Debugging.class)
  @Advanced
  @JsfPhaseListener
  public class DebugPhaseListener implements PhaseListener {
    @Inject
    private Logger logger;
      public void beforePhase(PhaseEvent phaseEvent) {
        this.logger.info("before " + phaseEvent.getPhaseId());
      }

      public void afterPhase(PhaseEvent phaseEvent) {
        this.logger.info("after " + phaseEvent.getPhaseId());
      }
      public PhaseId getPhaseId() {
        return PhaseId.ANY_PHASE;
      }
  }
@InvocationOrder


• Allows to specify the order of multiple artifacts
• Example

  @JsfPhaseListener
  @InvocationOrder(1) //optional
  public class DebugPhaseListener
    implements PhaseListener {
    //...
  }
JSF LOMs – JSF Lifecycle Observer Methods


• Annotations
    – @BeforePhase
    – @AfterPhase
•   Example

    public void preInvokeApplication(
      @Observes @BeforePhase(ANY_PHASE)
      PhaseEvent event) {
      //...
    }
CODI View-Configs and @Page


• Allow to
   – host meta-data for pages
   – structure pages
   – navigate in a type-safe way
• Inline usage at page-beans is possible with restrictions
• Example for index.xhtml

  @Page
  public class Index implements ViewConfig {}
Organizing your pages


• Meta-data gets inherited
  (multiple inheritance with interfaces)
• Nested classes for defining the view-id via convention
  (explicit configuration is also possible)
• Example for /pages/index.xhtml

  @Page(navigation = REDIRECT)
  public interface Pages extends ViewConfig {
    public @Page class Index implements Pages {
    }
  }
Inherit Page-Configs by Example




@Page(navigation = REDIRECT)
public interface Pages extends ViewConfig {

    public @Page class Login
      extends DefaultErrorView implements Pages {}
}
Type-safe Navigation


• View-Conig
  public Class<? extends Pages> register() {
    //...
    return Pages.Login.class;
  }
• ViewNavigationHandler (for manual navigation)
  @Inject
  private ViewNavigationHandler vnh;

  vnh.navigateTo(Pages.Login.class);
• Navigation Event (PreViewConfigNavigateEvent)
  Allows to observe type-safe navigations and change the
  navigation target
@Secured by Example


@Secured(LoginAccessDecisionVoter.class)
public interface Secure extends Pages {

    @PageBean(FeedbackPage.class)
    public @Page class FeedbackList implements Secure {}
}

@ApplicationScoped
public class LoginAccessDecisionVoter extends
AbstractAccessDecisionVoter {
  @Override
  protected void checkPermission(
    InvocationContext ic, Set<SecurityViolation> violations) {
      if(...) {
        violations.add(newSecurityViolation("access denied"));
      }
    }
}
View-Controller


• Via
   – View-Config (@PageBean)
   – Inline (@View)
   – Package based
        • @Page for Page-Beans
        • @InlineViewConfigRoot as marker
• Annotations
   –    @InitView
   –    @PrePageAction
   –    @PreRenderView
   –    @PostRenderView
View-Controller – Examples


@Secured(LoginAccessDecisionVoter.class)
public interface Secure extends Pages {

     @PageBean(FeedbackPage.class)
     public @Page class FeedbackList
       implements Secure {}
}

or

@View(Pages.Secure.FeedbackList.class)
public class FeedbackPage
  implements Serializable { ... }
Error-Pages


• Configure a default error page
• Security violations  default error page
  (or the explicitly configured page)
• Manual Navigation to the default error view
  (independent of the configured error page)

  @Inject
  private ViewNavigationHandler vnh;

  vnh.navigateTo(DefaultErrorView.class);
Type-save Config by Example



@Specializes
public class CustomJsfModuleConfig
  extends JsfModuleConfig {

    @Override
    public boolean isAlwaysKeepMessages () {
      return false;
    }
}




                     With Weld you have to use @Alternative + xml config
Custom View-Meta-data


• Allows to create custom meta-data
• Get the meta-data with:
  ViewConfigResolver
    #getViewConfigDescriptor(...)#getMetaData();
• Example

  @Target({TYPE})
  @Retention(RUNTIME)
  @Documented
  @ViewMetaData
  public @interface AppInfo { ... }

  @AppInfo
  public @Page class About implements Pages {}
CODI MESSAGE-MODULE
I18n – The Message-Module


• Highly customizable
• Easy fluent API
• Different argument formats
   – Numbered
   – Named
   – EL-Expressions (optional)
• Serializable (key + config instead of the final message)
   other users get the persisted message in their specific language
• Message-Payload (e.g. MessageSeverity)
• Different message sources
• Optimized for JSF (in combination with the JSF Module)
I18n – The Message-Module - Example


@Inject
private MessageContext messageContext;

//...
this.messageContext.message()
 .text("{msgUserRegistered}")
 .namedArgument("userName", this.user.getUserName())
 . create();


             msgUserRegistered=User {userName} registered successfully!
I18n – The Message-Module – JSF Example


@Inject
private @Jsf MessageContext messageContext;

//...

this.messageContext.message()
  .text("{msgLoginFailed}")
  .payload(ERROR)
  . add();
CODI JPA-MODULE
@Transactional


• Alternative to EJBs esp. outside an Application-Server
• Allows to customize the behaviour
• Supports multiple persistence-units with qualifiers
@Transactional - Example


@ApplicationScoped
@Transactional
public abstract class AbstractGenericJpaRepository {

    @PersistenceContext(unitName = "default")
    protected EntityManager entityManager;

    public T loadById(Long id) {
      //...
    }
}
@Transactional with multiple Persistence Units


@Produces                                    + @Disposes
@Users                                       or @PreDestroy
@PersistenceContext(unitName="UserDB")
private EntityManager usersEntityManager;

//...
@Inject
@Users
protected EntityManager entityManager;

@Transactional(Users.class)
public void update(User user) {
  this.entityManager.merge(user);
}
LET’S WRITE CODE
CODI BEAN-VALIDATION
Bean-Validation by Example - 1


@Inject @Advanced
private Validator validator;
//...
validator.validate(user);
//...

@UniqueLoginName
public class User extends AbstractEntity
{
  //...
}
Bean-Validation by Example - 2


@Target({TYPE}) @Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {
  UniqueLoginNameValidator.class})
public @interface UniqueLoginName {
}

@Dependent
public class UniqueLoginNameValidator
  extends ClassLevelValidator
    <UniqueLoginName, User> {
    @Inject
    private UserRepository userRepository;
}
CODI SCRIPTING-MODULE
Scripting-Module by Example


public class ServerSideScriptingBean {
  @Inject
  @ScriptLanguage(JavaScript.class)
  private ScriptExecutor se;

    private Double calc() {
       return se.eval("10 + 4", Double.class);
    }
}
UNIT TESTS WITH CODI
CODI and JUnit by Example


@RunWith(JUnit4.class)
public class SimpleTestCase extends AbstractJsfAwareTest {
  @Inject private RegistrationPage registrationPage;
  @Inject private UserRepository repository;

    @Test public void testRegistration() {
      User user = this.registrationPage.getUser();
      user.setUserName("gp");
      user.setFirstName("Gerhard");
      //...
      assertEquals(Pages.Login.class,
        this.registrationPage.register());
      assertEquals("Gerhard",
        this.repository.loadUser("gp").getFirstName());
    }
}
INTEGRATION TESTS WITH CODI
CODI and Cargo by Example


@RunWith(JUnit4.class)
public class SimpleTestCase
  extends AbstractContainerAwareCargoTest {

    @Test
    public void testSimpleForm() {
      SimplePageInteraction pageInteraction =
        new SimplePageInteraction(getTestConfiguration())
                  .start(Pages.Index.class)
                  .useDefaultForm();

        String inputId = "userName";
        pageInteraction.setValue(inputId, "gpetracek")
                       .clickOk()
                       .checkState(Pages.Result.class);
    }
}
WHAT’S NEXT?
… more about MyFaces CODI and Apache DeltaSpike at:
Links


•   http://myfaces.apache.org/extensions/cdi/
•   https://cwiki.apache.org/confluence/display/EXTCDI/Index
•   https://svn.apache.org/repos/asf/myfaces/extensions/cdi/
•   http://twitter.com/MyFacesTeam
•   http://myfaces.apache.org/extensions/cdi/mail-lists.html
•   Recommended
    – http://openwebbeans.apache.org
    – http://code.google.com/a/apache-extras.org/p/
      myfaces-codi-addons/
    – http://os890.spaaze.com/myfaces-codi

More Related Content

PDF
MyFaces CODI Conversations
PDF
MyFaces CODI and JBoss Seam3 become Apache DeltaSpike
PDF
Apache DeltaSpike
PDF
OpenWebBeans and DeltaSpike at ApacheCon
PDF
Apache DeltaSpike the CDI toolbox
PDF
MyFaces Universe at ApacheCon
PDF
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDI
PDF
Polygot Java EE on the GraalVM
MyFaces CODI Conversations
MyFaces CODI and JBoss Seam3 become Apache DeltaSpike
Apache DeltaSpike
OpenWebBeans and DeltaSpike at ApacheCon
Apache DeltaSpike the CDI toolbox
MyFaces Universe at ApacheCon
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDI
Polygot Java EE on the GraalVM

What's hot (20)

PPTX
Step by step guide to create theme for liferay dxp 7
PDF
Spring 4 on Java 8 by Juergen Hoeller
PPTX
Java EE 8
PPTX
Node.js Development with Apache NetBeans
PDF
Liferay maven sdk
PDF
Spring - CDI Interop
KEY
OSGi in 5 minutes
PDF
Developing modern java web applications with java ee 7 and angular js
PDF
Java(ee) mongo db applications in the cloud
PDF
Intelligent Projects with Maven - DevFest Istanbul
PPT
Introduction tomaven
PPTX
From JavaEE to AngularJS
PPTX
Faster Java EE Builds with Gradle
PPT
Java build tool_comparison
PDF
Open Services Gateway Initiative (OSGI)
PDF
OSGi Presentation
PDF
OSGi and Java EE: A Hybrid Approach to Enterprise Java Application Development
PDF
Intro To OSGi
PDF
Note - Apache Maven Intro
PPTX
Maven for Dummies
Step by step guide to create theme for liferay dxp 7
Spring 4 on Java 8 by Juergen Hoeller
Java EE 8
Node.js Development with Apache NetBeans
Liferay maven sdk
Spring - CDI Interop
OSGi in 5 minutes
Developing modern java web applications with java ee 7 and angular js
Java(ee) mongo db applications in the cloud
Intelligent Projects with Maven - DevFest Istanbul
Introduction tomaven
From JavaEE to AngularJS
Faster Java EE Builds with Gradle
Java build tool_comparison
Open Services Gateway Initiative (OSGI)
OSGi Presentation
OSGi and Java EE: A Hybrid Approach to Enterprise Java Application Development
Intro To OSGi
Note - Apache Maven Intro
Maven for Dummies
Ad

Similar to Make JSF more type-safe with CDI and MyFaces CODI (20)

PDF
Apache DeltaSpike: The CDI Toolbox
PDF
Red Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
ODP
Java EE web project introduction
PPTX
SOLID Programming with Portable Class Libraries
PPTX
Liferay (DXP) 7 Tech Meetup for Developers
PPTX
PPT
Spring - a framework written by developers
PDF
Contextual Dependency Injection for Apachecon 2010
PDF
Eclipse plug in development
PDF
Spring framework core
PDF
Java EE 與 雲端運算的展望
PDF
Toolbox for Selenium Tests in Java: WebDriverManager and Selenium-Jupiter
PPTX
MVC 6 - the new unified Web programming model
PDF
Building modular software with OSGi - Ulf Fildebrandt
PPTX
Real World Asp.Net WebApi Applications
PDF
Spring Boot Workshop - January w/ Women Who Code
PDF
CFWheels - Pragmatic, Beautiful Code
PDF
How to help your editor love your vue component library
PPTX
PDF
Staging Drupal 8 31 09 1 3
Apache DeltaSpike: The CDI Toolbox
Red Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
Java EE web project introduction
SOLID Programming with Portable Class Libraries
Liferay (DXP) 7 Tech Meetup for Developers
Spring - a framework written by developers
Contextual Dependency Injection for Apachecon 2010
Eclipse plug in development
Spring framework core
Java EE 與 雲端運算的展望
Toolbox for Selenium Tests in Java: WebDriverManager and Selenium-Jupiter
MVC 6 - the new unified Web programming model
Building modular software with OSGi - Ulf Fildebrandt
Real World Asp.Net WebApi Applications
Spring Boot Workshop - January w/ Women Who Code
CFWheels - Pragmatic, Beautiful Code
How to help your editor love your vue component library
Staging Drupal 8 31 09 1 3
Ad

More from os890 (7)

PDF
Flexibilitaet mit CDI und Apache DeltaSpike
PDF
MyFaces Extensions Validator r4 news
PDF
MyFaces CODI v0.9.0 News
PDF
MyFaces Extensions Validator r3 News
PDF
Metadatenbasierte Validierung
PDF
MyFaces Extensions Validator 1.x.2 News
PDF
MyFaces Extensions Validator Part 1 of 3
Flexibilitaet mit CDI und Apache DeltaSpike
MyFaces Extensions Validator r4 news
MyFaces CODI v0.9.0 News
MyFaces Extensions Validator r3 News
Metadatenbasierte Validierung
MyFaces Extensions Validator 1.x.2 News
MyFaces Extensions Validator Part 1 of 3

Recently uploaded (20)

PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPT
Teaching material agriculture food technology
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Empathic Computing: Creating Shared Understanding
PDF
Approach and Philosophy of On baking technology
PDF
Electronic commerce courselecture one. Pdf
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
cuic standard and advanced reporting.pdf
PPTX
Programs and apps: productivity, graphics, security and other tools
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
Reach Out and Touch Someone: Haptics and Empathic Computing
Teaching material agriculture food technology
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Understanding_Digital_Forensics_Presentation.pptx
NewMind AI Weekly Chronicles - August'25 Week I
Review of recent advances in non-invasive hemoglobin estimation
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
“AI and Expert System Decision Support & Business Intelligence Systems”
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Empathic Computing: Creating Shared Understanding
Approach and Philosophy of On baking technology
Electronic commerce courselecture one. Pdf
20250228 LYD VKU AI Blended-Learning.pptx
Dropbox Q2 2025 Financial Results & Investor Presentation
cuic standard and advanced reporting.pdf
Programs and apps: productivity, graphics, security and other tools
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Mobile App Security Testing_ A Comprehensive Guide.pdf

Make JSF more type-safe with CDI and MyFaces CODI

  • 1. MyFaces CODI Feature Tour Make JSF more type-safe with MyFaces CODI
  • 3. Agenda • Type-safety • CODI in a Nutshell • CODI Setup • CODI Core • CODI JSF-Module • CODI Message-Module • CODI JPA-Module • CODI Bean-Validation • CODI Scripting-Module • Integration and Unit Tests with CODI
  • 4. Type-safety - Why should we care about it? • Allows to use std. IDE features like auto-completion • Specialized IDE support is always behind • No Typos • Several features allow compile-time or at least startup checks • Easier for new developers to find usages • Easier refactorings • Easier maintenance • …
  • 5. MyFaces CODI - Overview • MyFaces Extensions CDI aka MyFaces CODI is a portable CDI extension which can be used with Apache OpenWebBeans, JBoss Weld,… and in combination with other portable CDI extensions • CODI-Core is required in any case • Modules – JSF Module (for 1.2 and 2.0 and 2.1) – JPA Module – BV Module – I18n-Message Module – Scripting Module – Test Support Modules
  • 6. MyFaces CODI in a Nutshell • JSF 1.2 and 2.x • Type-safe View-Configs • Type-safety • Type-safe Navigation • Extensibility • JPA Integration • Advanced Scopes • Dependency Injection • Various Events Support for BV • View-Controller • Advanced I18n • JSF 2 Scope Mappings • Scripting Integration • And more!
  • 8. Getting CODI up and running • Add CODI to the project – With Maven • Add the modules (or the all-in-one package) to the POM – Without Maven • Download the current dist package • Add the modules (or the all-in-one package) to the Classpath of the project • Start using it!
  • 9. Getting CODI up and running - Hints • With JEE 5 and Mojarra use the controlled bootstrapping add-on • Attention (hint for all bean archives): Ensure that the libs aren’t duplicated – otherwise the CDI implementation will blame ambiguous interceptors, beans,…
  • 11. Startup* • Startup-Observer for the StartupEvent Triggered after the environment is initialized – Initialization tasks which need an up and running environment – Easy logging that the module was started protected void logModuleStart( @Observes StartupEvent startupEvent) { ... } • StartupEventBroadcaster Allows to integrate custom broadcasting mechanisms before the first mechanism of CODI gets called
  • 12. ProjectStage and ProjectStageActivated • Configure beans for a special project-stage in a type-safe way • Examples – Sample data – Debug Phase-Listener @ProjectStageActivated( ProjectStage.Development.class) public class SampleDataStartupObserver { protected void createSampleData( @Observes StartupEvent startupEvent, UserRepository userRepository) { //... userRepository.save(user); } }
  • 13. Custom Project-Stages - 1 public class ProjectStages implements ProjectStageHolder { @Typed() //no bean! public static final class CustomProjectStage extends ProjectStage {} public static final CustomProjectStage CustomProjectStage = new CustomProjectStage(); } + Service-Loader config
  • 14. Custom Project-Stages - 2 • Configure the project-stage like std. CODI project stages – JSF std. project stage – org.apache.myfaces.extensions.cdi.ProjectStage – ConfiguredValueResolver • Injecting the current project-stage @Inject private ProjectStage projectStage; • Compare the injected value ProjectStage.Development.equals(this.projectStage) • Overrule the current project-stage manually ProjectStageProducer.setProjectStage( ProjectStages.CustomProjectStage)
  • 15. [CODI-Hint] Deactivatable • CDI allows deactivation via a veto-mechanism • Won‘t work for artifacts which aren‘t managed by CDI • CODI allows do deactivate such implementations which implement Deactivatable • Deactivating classes via an implementation of ClassDeactivator (+ Service-Loader config)
  • 17. @JsfPhaseListener @ProjectStageActivated( ProjectStage.Development.class, CustomProjectStage.Debugging.class) @Advanced @JsfPhaseListener public class DebugPhaseListener implements PhaseListener { @Inject private Logger logger; public void beforePhase(PhaseEvent phaseEvent) { this.logger.info("before " + phaseEvent.getPhaseId()); } public void afterPhase(PhaseEvent phaseEvent) { this.logger.info("after " + phaseEvent.getPhaseId()); } public PhaseId getPhaseId() { return PhaseId.ANY_PHASE; } }
  • 18. @InvocationOrder • Allows to specify the order of multiple artifacts • Example @JsfPhaseListener @InvocationOrder(1) //optional public class DebugPhaseListener implements PhaseListener { //... }
  • 19. JSF LOMs – JSF Lifecycle Observer Methods • Annotations – @BeforePhase – @AfterPhase • Example public void preInvokeApplication( @Observes @BeforePhase(ANY_PHASE) PhaseEvent event) { //... }
  • 20. CODI View-Configs and @Page • Allow to – host meta-data for pages – structure pages – navigate in a type-safe way • Inline usage at page-beans is possible with restrictions • Example for index.xhtml @Page public class Index implements ViewConfig {}
  • 21. Organizing your pages • Meta-data gets inherited (multiple inheritance with interfaces) • Nested classes for defining the view-id via convention (explicit configuration is also possible) • Example for /pages/index.xhtml @Page(navigation = REDIRECT) public interface Pages extends ViewConfig { public @Page class Index implements Pages { } }
  • 22. Inherit Page-Configs by Example @Page(navigation = REDIRECT) public interface Pages extends ViewConfig { public @Page class Login extends DefaultErrorView implements Pages {} }
  • 23. Type-safe Navigation • View-Conig public Class<? extends Pages> register() { //... return Pages.Login.class; } • ViewNavigationHandler (for manual navigation) @Inject private ViewNavigationHandler vnh; vnh.navigateTo(Pages.Login.class); • Navigation Event (PreViewConfigNavigateEvent) Allows to observe type-safe navigations and change the navigation target
  • 24. @Secured by Example @Secured(LoginAccessDecisionVoter.class) public interface Secure extends Pages { @PageBean(FeedbackPage.class) public @Page class FeedbackList implements Secure {} } @ApplicationScoped public class LoginAccessDecisionVoter extends AbstractAccessDecisionVoter { @Override protected void checkPermission( InvocationContext ic, Set<SecurityViolation> violations) { if(...) { violations.add(newSecurityViolation("access denied")); } } }
  • 25. View-Controller • Via – View-Config (@PageBean) – Inline (@View) – Package based • @Page for Page-Beans • @InlineViewConfigRoot as marker • Annotations – @InitView – @PrePageAction – @PreRenderView – @PostRenderView
  • 26. View-Controller – Examples @Secured(LoginAccessDecisionVoter.class) public interface Secure extends Pages { @PageBean(FeedbackPage.class) public @Page class FeedbackList implements Secure {} } or @View(Pages.Secure.FeedbackList.class) public class FeedbackPage implements Serializable { ... }
  • 27. Error-Pages • Configure a default error page • Security violations  default error page (or the explicitly configured page) • Manual Navigation to the default error view (independent of the configured error page) @Inject private ViewNavigationHandler vnh; vnh.navigateTo(DefaultErrorView.class);
  • 28. Type-save Config by Example @Specializes public class CustomJsfModuleConfig extends JsfModuleConfig { @Override public boolean isAlwaysKeepMessages () { return false; } } With Weld you have to use @Alternative + xml config
  • 29. Custom View-Meta-data • Allows to create custom meta-data • Get the meta-data with: ViewConfigResolver #getViewConfigDescriptor(...)#getMetaData(); • Example @Target({TYPE}) @Retention(RUNTIME) @Documented @ViewMetaData public @interface AppInfo { ... } @AppInfo public @Page class About implements Pages {}
  • 31. I18n – The Message-Module • Highly customizable • Easy fluent API • Different argument formats – Numbered – Named – EL-Expressions (optional) • Serializable (key + config instead of the final message)  other users get the persisted message in their specific language • Message-Payload (e.g. MessageSeverity) • Different message sources • Optimized for JSF (in combination with the JSF Module)
  • 32. I18n – The Message-Module - Example @Inject private MessageContext messageContext; //... this.messageContext.message() .text("{msgUserRegistered}") .namedArgument("userName", this.user.getUserName()) . create(); msgUserRegistered=User {userName} registered successfully!
  • 33. I18n – The Message-Module – JSF Example @Inject private @Jsf MessageContext messageContext; //... this.messageContext.message() .text("{msgLoginFailed}") .payload(ERROR) . add();
  • 35. @Transactional • Alternative to EJBs esp. outside an Application-Server • Allows to customize the behaviour • Supports multiple persistence-units with qualifiers
  • 36. @Transactional - Example @ApplicationScoped @Transactional public abstract class AbstractGenericJpaRepository { @PersistenceContext(unitName = "default") protected EntityManager entityManager; public T loadById(Long id) { //... } }
  • 37. @Transactional with multiple Persistence Units @Produces + @Disposes @Users or @PreDestroy @PersistenceContext(unitName="UserDB") private EntityManager usersEntityManager; //... @Inject @Users protected EntityManager entityManager; @Transactional(Users.class) public void update(User user) { this.entityManager.merge(user); }
  • 40. Bean-Validation by Example - 1 @Inject @Advanced private Validator validator; //... validator.validate(user); //... @UniqueLoginName public class User extends AbstractEntity { //... }
  • 41. Bean-Validation by Example - 2 @Target({TYPE}) @Retention(RUNTIME) @Documented @Constraint(validatedBy = { UniqueLoginNameValidator.class}) public @interface UniqueLoginName { } @Dependent public class UniqueLoginNameValidator extends ClassLevelValidator <UniqueLoginName, User> { @Inject private UserRepository userRepository; }
  • 43. Scripting-Module by Example public class ServerSideScriptingBean { @Inject @ScriptLanguage(JavaScript.class) private ScriptExecutor se; private Double calc() { return se.eval("10 + 4", Double.class); } }
  • 45. CODI and JUnit by Example @RunWith(JUnit4.class) public class SimpleTestCase extends AbstractJsfAwareTest { @Inject private RegistrationPage registrationPage; @Inject private UserRepository repository; @Test public void testRegistration() { User user = this.registrationPage.getUser(); user.setUserName("gp"); user.setFirstName("Gerhard"); //... assertEquals(Pages.Login.class, this.registrationPage.register()); assertEquals("Gerhard", this.repository.loadUser("gp").getFirstName()); } }
  • 47. CODI and Cargo by Example @RunWith(JUnit4.class) public class SimpleTestCase extends AbstractContainerAwareCargoTest { @Test public void testSimpleForm() { SimplePageInteraction pageInteraction = new SimplePageInteraction(getTestConfiguration()) .start(Pages.Index.class) .useDefaultForm(); String inputId = "userName"; pageInteraction.setValue(inputId, "gpetracek") .clickOk() .checkState(Pages.Result.class); } }
  • 49. … more about MyFaces CODI and Apache DeltaSpike at:
  • 50. Links • http://myfaces.apache.org/extensions/cdi/ • https://cwiki.apache.org/confluence/display/EXTCDI/Index • https://svn.apache.org/repos/asf/myfaces/extensions/cdi/ • http://twitter.com/MyFacesTeam • http://myfaces.apache.org/extensions/cdi/mail-lists.html • Recommended – http://openwebbeans.apache.org – http://code.google.com/a/apache-extras.org/p/ myfaces-codi-addons/ – http://os890.spaaze.com/myfaces-codi