SlideShare uma empresa Scribd logo
1 de 50
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

Mais conteúdo relacionado

Mais procurados

Step by step guide to create theme for liferay dxp 7
Step by step guide to create theme for liferay dxp 7Step by step guide to create theme for liferay dxp 7
Step by step guide to create theme for liferay dxp 7Azilen Technologies Pvt. Ltd.
 
Spring 4 on Java 8 by Juergen Hoeller
Spring 4 on Java 8 by Juergen HoellerSpring 4 on Java 8 by Juergen Hoeller
Spring 4 on Java 8 by Juergen HoellerZeroTurnaround
 
Node.js Development with Apache NetBeans
Node.js Development with Apache NetBeansNode.js Development with Apache NetBeans
Node.js Development with Apache NetBeansRyan Cuprak
 
Spring - CDI Interop
Spring - CDI InteropSpring - CDI Interop
Spring - CDI InteropRay Ploski
 
OSGi in 5 minutes
OSGi in 5 minutesOSGi in 5 minutes
OSGi in 5 minutesSerge Huber
 
Developing modern java web applications with java ee 7 and angular js
Developing modern java web applications with java ee 7 and angular jsDeveloping modern java web applications with java ee 7 and angular js
Developing modern java web applications with java ee 7 and angular jsShekhar Gulati
 
Java(ee) mongo db applications in the cloud
Java(ee) mongo db applications in the cloud Java(ee) mongo db applications in the cloud
Java(ee) mongo db applications in the cloud Shekhar Gulati
 
Intelligent Projects with Maven - DevFest Istanbul
Intelligent Projects with Maven - DevFest IstanbulIntelligent Projects with Maven - DevFest Istanbul
Intelligent Projects with Maven - DevFest IstanbulMert Çalışkan
 
Introduction tomaven
Introduction tomavenIntroduction tomaven
Introduction tomavenManav Prasad
 
Faster Java EE Builds with Gradle
Faster Java EE Builds with GradleFaster Java EE Builds with Gradle
Faster Java EE Builds with GradleRyan Cuprak
 
Java build tool_comparison
Java build tool_comparisonJava build tool_comparison
Java build tool_comparisonManav Prasad
 
Open Services Gateway Initiative (OSGI)
Open Services Gateway Initiative (OSGI)Open Services Gateway Initiative (OSGI)
Open Services Gateway Initiative (OSGI)Peter R. Egli
 
OSGi and Java EE: A Hybrid Approach to Enterprise Java Application Development
OSGi and Java EE: A Hybrid Approach to Enterprise Java Application DevelopmentOSGi and Java EE: A Hybrid Approach to Enterprise Java Application Development
OSGi and Java EE: A Hybrid Approach to Enterprise Java Application DevelopmentSanjeeb Sahoo
 
Note - Apache Maven Intro
Note - Apache Maven IntroNote - Apache Maven Intro
Note - Apache Maven Introboyw165
 
Maven for Dummies
Maven for DummiesMaven for Dummies
Maven for DummiesTomer Gabel
 

Mais procurados (20)

Step by step guide to create theme for liferay dxp 7
Step by step guide to create theme for liferay dxp 7Step by step guide to create theme for liferay dxp 7
Step by step guide to create theme for liferay dxp 7
 
Spring 4 on Java 8 by Juergen Hoeller
Spring 4 on Java 8 by Juergen HoellerSpring 4 on Java 8 by Juergen Hoeller
Spring 4 on Java 8 by Juergen Hoeller
 
Java EE 8
Java EE 8Java EE 8
Java EE 8
 
Node.js Development with Apache NetBeans
Node.js Development with Apache NetBeansNode.js Development with Apache NetBeans
Node.js Development with Apache NetBeans
 
Liferay maven sdk
Liferay maven sdkLiferay maven sdk
Liferay maven sdk
 
Spring - CDI Interop
Spring - CDI InteropSpring - CDI Interop
Spring - CDI Interop
 
OSGi in 5 minutes
OSGi in 5 minutesOSGi in 5 minutes
OSGi in 5 minutes
 
Developing modern java web applications with java ee 7 and angular js
Developing modern java web applications with java ee 7 and angular jsDeveloping modern java web applications with java ee 7 and angular js
Developing modern java web applications with java ee 7 and angular js
 
Java(ee) mongo db applications in the cloud
Java(ee) mongo db applications in the cloud Java(ee) mongo db applications in the cloud
Java(ee) mongo db applications in the cloud
 
Intelligent Projects with Maven - DevFest Istanbul
Intelligent Projects with Maven - DevFest IstanbulIntelligent Projects with Maven - DevFest Istanbul
Intelligent Projects with Maven - DevFest Istanbul
 
Introduction tomaven
Introduction tomavenIntroduction tomaven
Introduction tomaven
 
From JavaEE to AngularJS
From JavaEE to AngularJSFrom JavaEE to AngularJS
From JavaEE to AngularJS
 
Faster Java EE Builds with Gradle
Faster Java EE Builds with GradleFaster Java EE Builds with Gradle
Faster Java EE Builds with Gradle
 
Java build tool_comparison
Java build tool_comparisonJava build tool_comparison
Java build tool_comparison
 
Open Services Gateway Initiative (OSGI)
Open Services Gateway Initiative (OSGI)Open Services Gateway Initiative (OSGI)
Open Services Gateway Initiative (OSGI)
 
OSGi Presentation
OSGi PresentationOSGi Presentation
OSGi Presentation
 
OSGi and Java EE: A Hybrid Approach to Enterprise Java Application Development
OSGi and Java EE: A Hybrid Approach to Enterprise Java Application DevelopmentOSGi and Java EE: A Hybrid Approach to Enterprise Java Application Development
OSGi and Java EE: A Hybrid Approach to Enterprise Java Application Development
 
Intro To OSGi
Intro To OSGiIntro To OSGi
Intro To OSGi
 
Note - Apache Maven Intro
Note - Apache Maven IntroNote - Apache Maven Intro
Note - Apache Maven Intro
 
Maven for Dummies
Maven for DummiesMaven for Dummies
Maven for Dummies
 

Semelhante a Make JSF More Type-Safe with MyFaces CODI Feature Tour

Red Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
Red Hat JBoss BRMS and BPMS Workbench and Rich Client TechnologyRed Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
Red Hat JBoss BRMS and BPMS Workbench and Rich Client TechnologyMark Proctor
 
Java EE web project introduction
Java EE web project introductionJava EE web project introduction
Java EE web project introductionOndrej Mihályi
 
SOLID Programming with Portable Class Libraries
SOLID Programming with Portable Class LibrariesSOLID Programming with Portable Class Libraries
SOLID Programming with Portable Class LibrariesVagif Abilov
 
Contextual Dependency Injection for Apachecon 2010
Contextual Dependency Injection for Apachecon 2010Contextual Dependency Injection for Apachecon 2010
Contextual Dependency Injection for Apachecon 2010Rohit Kelapure
 
Eclipse plug in development
Eclipse plug in developmentEclipse plug in development
Eclipse plug in developmentMartin Toshev
 
Java EE 與 雲端運算的展望
Java EE 與 雲端運算的展望 Java EE 與 雲端運算的展望
Java EE 與 雲端運算的展望 javatwo2011
 
Toolbox for Selenium Tests in Java: WebDriverManager and Selenium-Jupiter
Toolbox for Selenium Tests in Java: WebDriverManager and Selenium-JupiterToolbox for Selenium Tests in Java: WebDriverManager and Selenium-Jupiter
Toolbox for Selenium Tests in Java: WebDriverManager and Selenium-JupiterBoni García
 
MVC 6 - the new unified Web programming model
MVC 6 - the new unified Web programming modelMVC 6 - the new unified Web programming model
MVC 6 - the new unified Web programming modelAlex Thissen
 
Building modular software with OSGi - Ulf Fildebrandt
Building modular software with OSGi - Ulf FildebrandtBuilding modular software with OSGi - Ulf Fildebrandt
Building modular software with OSGi - Ulf Fildebrandtmfrancis
 
Real World Asp.Net WebApi Applications
Real World Asp.Net WebApi ApplicationsReal World Asp.Net WebApi Applications
Real World Asp.Net WebApi ApplicationsEffie Arditi
 
Spring Boot Workshop - January w/ Women Who Code
Spring Boot Workshop - January w/ Women Who CodeSpring Boot Workshop - January w/ Women Who Code
Spring Boot Workshop - January w/ Women Who CodePurnima Kamath
 
CFWheels - Pragmatic, Beautiful Code
CFWheels - Pragmatic, Beautiful CodeCFWheels - Pragmatic, Beautiful Code
CFWheels - Pragmatic, Beautiful Codeindiver
 
How to help your editor love your vue component library
How to help your editor love your vue component libraryHow to help your editor love your vue component library
How to help your editor love your vue component libraryPiotr Tomiak
 
Staging Drupal 8 31 09 1 3
Staging Drupal 8 31 09 1 3Staging Drupal 8 31 09 1 3
Staging Drupal 8 31 09 1 3Drupalcon Paris
 
SoCal Code Camp 2011 - ASP.NET MVC 4
SoCal Code Camp 2011 - ASP.NET MVC 4SoCal Code Camp 2011 - ASP.NET MVC 4
SoCal Code Camp 2011 - ASP.NET MVC 4Jon Galloway
 

Semelhante a Make JSF More Type-Safe with MyFaces CODI Feature Tour (20)

Apache DeltaSpike: The CDI Toolbox
Apache DeltaSpike: The CDI ToolboxApache DeltaSpike: The CDI Toolbox
Apache DeltaSpike: The CDI Toolbox
 
Red Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
Red Hat JBoss BRMS and BPMS Workbench and Rich Client TechnologyRed Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
Red Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
 
Java EE web project introduction
Java EE web project introductionJava EE web project introduction
Java EE web project introduction
 
SOLID Programming with Portable Class Libraries
SOLID Programming with Portable Class LibrariesSOLID Programming with Portable Class Libraries
SOLID Programming with Portable Class Libraries
 
Liferay (DXP) 7 Tech Meetup for Developers
Liferay (DXP) 7 Tech Meetup for DevelopersLiferay (DXP) 7 Tech Meetup for Developers
Liferay (DXP) 7 Tech Meetup for Developers
 
JSF2
JSF2JSF2
JSF2
 
Contextual Dependency Injection for Apachecon 2010
Contextual Dependency Injection for Apachecon 2010Contextual Dependency Injection for Apachecon 2010
Contextual Dependency Injection for Apachecon 2010
 
Eclipse plug in development
Eclipse plug in developmentEclipse plug in development
Eclipse plug in development
 
Spring framework core
Spring framework coreSpring framework core
Spring framework core
 
Java EE 與 雲端運算的展望
Java EE 與 雲端運算的展望 Java EE 與 雲端運算的展望
Java EE 與 雲端運算的展望
 
Toolbox for Selenium Tests in Java: WebDriverManager and Selenium-Jupiter
Toolbox for Selenium Tests in Java: WebDriverManager and Selenium-JupiterToolbox for Selenium Tests in Java: WebDriverManager and Selenium-Jupiter
Toolbox for Selenium Tests in Java: WebDriverManager and Selenium-Jupiter
 
MVC 6 - the new unified Web programming model
MVC 6 - the new unified Web programming modelMVC 6 - the new unified Web programming model
MVC 6 - the new unified Web programming model
 
Building modular software with OSGi - Ulf Fildebrandt
Building modular software with OSGi - Ulf FildebrandtBuilding modular software with OSGi - Ulf Fildebrandt
Building modular software with OSGi - Ulf Fildebrandt
 
Real World Asp.Net WebApi Applications
Real World Asp.Net WebApi ApplicationsReal World Asp.Net WebApi Applications
Real World Asp.Net WebApi Applications
 
Spring Boot Workshop - January w/ Women Who Code
Spring Boot Workshop - January w/ Women Who CodeSpring Boot Workshop - January w/ Women Who Code
Spring Boot Workshop - January w/ Women Who Code
 
CFWheels - Pragmatic, Beautiful Code
CFWheels - Pragmatic, Beautiful CodeCFWheels - Pragmatic, Beautiful Code
CFWheels - Pragmatic, Beautiful Code
 
How to help your editor love your vue component library
How to help your editor love your vue component libraryHow to help your editor love your vue component library
How to help your editor love your vue component library
 
Codeinator
CodeinatorCodeinator
Codeinator
 
Staging Drupal 8 31 09 1 3
Staging Drupal 8 31 09 1 3Staging Drupal 8 31 09 1 3
Staging Drupal 8 31 09 1 3
 
SoCal Code Camp 2011 - ASP.NET MVC 4
SoCal Code Camp 2011 - ASP.NET MVC 4SoCal Code Camp 2011 - ASP.NET MVC 4
SoCal Code Camp 2011 - ASP.NET MVC 4
 

Mais de os890

Flexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpikeFlexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpikeos890
 
MyFaces Extensions Validator r4 news
MyFaces Extensions Validator r4 newsMyFaces Extensions Validator r4 news
MyFaces Extensions Validator r4 newsos890
 
MyFaces CODI v0.9.0 News
MyFaces CODI v0.9.0 NewsMyFaces CODI v0.9.0 News
MyFaces CODI v0.9.0 Newsos890
 
MyFaces Extensions Validator r3 News
MyFaces Extensions Validator r3 NewsMyFaces Extensions Validator r3 News
MyFaces Extensions Validator r3 Newsos890
 
Metadatenbasierte Validierung
Metadatenbasierte ValidierungMetadatenbasierte Validierung
Metadatenbasierte Validierungos890
 
MyFaces Extensions Validator 1.x.2 News
MyFaces Extensions Validator 1.x.2 NewsMyFaces Extensions Validator 1.x.2 News
MyFaces Extensions Validator 1.x.2 Newsos890
 
MyFaces Extensions Validator Part 1 of 3
MyFaces Extensions Validator Part 1 of 3MyFaces Extensions Validator Part 1 of 3
MyFaces Extensions Validator Part 1 of 3os890
 

Mais de os890 (7)

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

Último

Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 

Último (20)

Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 

Make JSF More Type-Safe with MyFaces CODI Feature Tour

  • 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