This is an automated email from the ASF dual-hosted git repository.

doebele pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/master by this push:
     new c3e4d262 EMPIREDB-424 Mojarra implementation and JSF Sample 
Application updated
c3e4d262 is described below

commit c3e4d26277f66a6208eb890af344bfa8a6a2c178
Author: Rainer Döbele <[email protected]>
AuthorDate: Sun Apr 21 19:18:24 2024 +0200

    EMPIREDB-424
    Mojarra implementation and JSF Sample Application updated
---
 .../jsf2/websample/web/AppExceptionHandler.java    |  11 +-
 .../websample/web/AppExceptionHandlerFactory.java  |  10 +-
 ...tener.java => AuthenticationPhaseListener.java} |   6 +-
 .../websample/web/SampleAppStartupListener.java    |  42 ++++++++
 .../jsf2/websample/web/SampleApplication.java      |  12 ++-
 .../src/main/webapp/WEB-INF/faces-config.xml       |  43 +++++---
 .../src/main/webapp/resources/empire/control.xhtml |   2 +-
 .../main/webapp/resources/empire/formGrid.xhtml    |   2 +-
 .../src/main/webapp/resources/empire/input.xhtml   |   2 +-
 .../src/main/webapp/resources/empire/label.xhtml   |   2 +-
 .../src/main/webapp/resources/empire/link.xhtml    |   2 +-
 .../src/main/webapp/resources/empire/mitem.xhtml   |   2 +-
 .../src/main/webapp/resources/empire/mlist.xhtml   |   2 +-
 .../src/main/webapp/resources/empire/record.xhtml  |   2 +-
 .../src/main/webapp/resources/empire/select.xhtml  |   2 +-
 .../src/main/webapp/resources/empire/tabPage.xhtml |   2 +-
 .../src/main/webapp/resources/empire/tabView.xhtml |   2 +-
 .../src/main/webapp/resources/empire/title.xhtml   |   2 +-
 .../src/main/webapp/resources/empire/value.xhtml   |   2 +-
 .../apache/empire/jsf2/app/FacesConfiguration.java |  65 ++----------
 .../empire/jsf2/app/WebAppStartupListener.java     |  54 +++++++---
 .../org/apache/empire/jsf2/app/WebApplication.java |   3 +-
 .../org/apache/empire/jsf2/components/LinkTag.java |   5 +-
 .../empire/jsf2/impl/FacesImplementation.java      |  19 +++-
 .../empire/jsf2/impl/MojarraImplementation.java    | 116 +++++++++++++++++++--
 .../empire/jsf2/impl/MyFacesImplementation.java    | 101 ++++++++++++++++--
 26 files changed, 383 insertions(+), 130 deletions(-)

diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/AppExceptionHandler.java
 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/AppExceptionHandler.java
index 3e4d2cac..39a36ab4 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/AppExceptionHandler.java
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/AppExceptionHandler.java
@@ -44,10 +44,19 @@ import org.slf4j.LoggerFactory;
 public class AppExceptionHandler extends ExceptionHandlerWrapper
 {
     private static final Logger    log = 
LoggerFactory.getLogger(AppExceptionHandler.class);
+    
+    private final ExceptionHandler delegate;
 
     public AppExceptionHandler(ExceptionHandler delegate)
     {
-        super(delegate);
+        // super(delegate);  --- Use this in MyFaces 2.3.x
+        this.delegate = delegate;
+    }
+    
+    @Override
+    public ExceptionHandler getWrapped()
+    {
+        return delegate;
     }
 
     @Override
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/AppExceptionHandlerFactory.java
 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/AppExceptionHandlerFactory.java
index b44d295f..0ed6e601 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/AppExceptionHandlerFactory.java
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/AppExceptionHandlerFactory.java
@@ -26,9 +26,17 @@ import javax.faces.context.ExceptionHandlerFactory;
  */
 public class AppExceptionHandlerFactory extends ExceptionHandlerFactory
 {
+    private final ExceptionHandlerFactory delegate;
     public AppExceptionHandlerFactory(ExceptionHandlerFactory delegate)
     {
-        super(delegate);
+        // super(delegate);  --- Use this in MyFaces 2.3.x
+        this.delegate = delegate;
+    }
+    
+    @Override
+    public ExceptionHandlerFactory getWrapped()
+    {
+        return delegate;
     }
 
     @Override
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/AutheticationPhaseListener.java
 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/AuthenticationPhaseListener.java
similarity index 94%
rename from 
empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/AutheticationPhaseListener.java
rename to 
empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/AuthenticationPhaseListener.java
index ee9700de..90bd402b 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/AutheticationPhaseListener.java
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/AuthenticationPhaseListener.java
@@ -32,15 +32,15 @@ import 
org.apache.empire.jsf2.websample.web.pages.SamplePages;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class AutheticationPhaseListener implements PhaseListener
+public class AuthenticationPhaseListener implements PhaseListener
 {
     private static final long   serialVersionUID = 1L;
-    private static final Logger log              = 
LoggerFactory.getLogger(AutheticationPhaseListener.class);
+    private static final Logger log              = 
LoggerFactory.getLogger(AuthenticationPhaseListener.class);
 
     private static final String LOGOUT_PARAM     = "logout";    // must be 
?logout=true
 //    private static final String LANGUAGE_PARAM   = "prefLanguage";    // 
must be ?logout=true
     
-    public AutheticationPhaseListener()
+    public AuthenticationPhaseListener()
     {
     }
 
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleAppStartupListener.java
 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleAppStartupListener.java
new file mode 100644
index 00000000..b23e4d4e
--- /dev/null
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleAppStartupListener.java
@@ -0,0 +1,42 @@
+package org.apache.empire.jsf2.websample.web;
+
+import javax.faces.context.FacesContext;
+import javax.servlet.ServletContext;
+
+import org.apache.empire.jsf2.app.FacesConfiguration;
+import org.apache.empire.jsf2.app.WebAppStartupListener;
+import org.apache.empire.jsf2.app.WebApplication;
+import org.apache.empire.jsf2.impl.FacesImplementation;
+
+/**
+ * Custom StartupListener
+ * Faces Configuration is done programmatically 
+ * @author rainer
+ */
+public class SampleAppStartupListener extends WebAppStartupListener
+{
+    public final SampleConfig config = new SampleConfig();
+    
+    public SampleAppStartupListener()
+    {
+        super(FacesConfiguration.class);
+    }
+    
+    @Override
+    protected void initFacesConfiguration(FacesContext startupContext, 
FacesImplementation facesImplementation)
+    {
+        ServletContext servletContext = 
(ServletContext)startupContext.getExternalContext().getContext();
+        config.init(servletContext.getRealPath("WEB-INF/config.xml"));
+        // Load Configuration
+        super.initFacesConfiguration(startupContext, facesImplementation);
+    }
+    
+    @Override
+    protected void initWebApplication(WebApplication facesApp, FacesContext 
startupContext, FacesImplementation facesImplementation)
+    {
+        // Set Configuration
+        ((SampleApplication)facesApp).setConfig(config);
+        // init now
+        super.initWebApplication(facesApp, startupContext, 
facesImplementation);
+    }
+}
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
index 3e55bf5d..505d90bf 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
@@ -55,7 +55,7 @@ public class SampleApplication extends WebApplication {
        protected static final String MANAGED_BEAN_NAME = "sampleApplication";
        protected static final Locale DEFAULT_LOCALE = Locale.ENGLISH;
        // Non-Static
-       private SampleConfig config = new SampleConfig();
+       private SampleConfig config = null; // SampleAppStartupListener.config;
        private SampleDB sampleDB = null;
 
        private Connection conn = null;
@@ -69,13 +69,21 @@ public class SampleApplication extends WebApplication {
                // trace
                SampleApplication.log.trace("SampleApplication created");
        }
+       
+       /**
+        * Sets the Configuration
+        * Called only from SampleAppStartupListener
+        */
+       void setConfig(SampleConfig config) 
+       {
+           this.config = config;
+       }
 
        @Override
        public void init(ServletContext servletContext) {
                // register all controls
                // InputControlManager.registerControl("myType", new
                // MyTypeInputControl());
-               config.init(servletContext.getRealPath("WEB-INF/config.xml"));
 
                // Get a JDBC Connection
                log.info("*** getJDBCConnection() ***");
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/faces-config.xml
 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/faces-config.xml
index caf21913..e38bc6d7 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/faces-config.xml
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/faces-config.xml
@@ -21,7 +21,12 @@
        <application>
            <!-- System event listener --> 
            <system-event-listener>
+               <!-- (StartupListener for manual configuration)
                        
<system-event-listener-class>org.apache.empire.jsf2.app.WebAppStartupListener</system-event-listener-class>
+                       -->
+               <!-- (StartupListener for programmatic configuration) -->
+                       
<system-event-listener-class>org.apache.empire.jsf2.websample.web.SampleAppStartupListener</system-event-listener-class>
+                       <!-- Faces Event -->
                        
<system-event-class>javax.faces.event.PostConstructApplicationEvent</system-event-class>
            </system-event-listener>
            <!-- locales -->
@@ -37,18 +42,21 @@
                        <base-name>lang.messages</base-name>
                        <var>msg</var>
                </resource-bundle>
-               <!-- EL resolver -->
+               <!-- EL-Resolvers (Cannot be added programmatically in 
Mojarra!) -->
                
<el-resolver>org.apache.empire.jsf2.app.DBELResolver</el-resolver>
                
<el-resolver>org.apache.empire.jsf2.pages.PagesELResolver</el-resolver>
-               <!-- Navigation handler -->
+               <!-- Navigation handler (added programmatically)
                
<navigation-handler>org.apache.empire.jsf2.pages.PageNavigationHandler</navigation-handler>
+                -->
        </application>
 
        <!-- Lifecycle -->
        <lifecycle>
+               <!-- (added programmatically)
                
<phase-listener>org.apache.empire.jsf2.app.FacesRequestPhaseListener</phase-listener>
                
<phase-listener>org.apache.empire.jsf2.pages.PagePhaseListener</phase-listener>
-               
<phase-listener>org.apache.empire.jsf2.websample.web.AutheticationPhaseListener</phase-listener>
+                -->
+               
<phase-listener>org.apache.empire.jsf2.websample.web.AuthenticationPhaseListener</phase-listener>
        </lifecycle>
 
        <!-- Application bean (MUST be named 'webApplication' for 
WebAppStartupListener!) -->
@@ -77,58 +85,59 @@
                <managed-bean-scope>session</managed-bean-scope>
        </managed-bean>
 
-       <!-- Empire-JSF components -->
+       <!-- Empire-JSF components (added programmatically)
        <component>
-               <component-type>components.RecordTag</component-type>
+               
<component-type>org.apache.empire.component.RecordTag</component-type>
                
<component-class>org.apache.empire.jsf2.components.RecordTag</component-class>
        </component>
        <component>
-               <component-type>components.ControlTag</component-type>
+               
<component-type>org.apache.empire.component.ControlTag</component-type>
                
<component-class>org.apache.empire.jsf2.components.ControlTag</component-class>
        </component>
        <component>
-               <component-type>components.InputTag</component-type>
+               
<component-type>org.apache.empire.component.InputTag</component-type>
                
<component-class>org.apache.empire.jsf2.components.InputTag</component-class>
        </component>
        <component>
-               <component-type>components.FormGridTag</component-type>
+               
<component-type>org.apache.empire.component.FormGridTag</component-type>
                
<component-class>org.apache.empire.jsf2.components.FormGridTag</component-class>
        </component>
        <component>
-               <component-type>components.LabelTag</component-type>
+               
<component-type>org.apache.empire.component.LabelTag</component-type>
                
<component-class>org.apache.empire.jsf2.components.LabelTag</component-class>
        </component>
        <component>
-               <component-type>components.LinkTag</component-type>
+               
<component-type>org.apache.empire.component.LinkTag</component-type>
                
<component-class>org.apache.empire.jsf2.components.LinkTag</component-class>
        </component>
        <component>
-               <component-type>components.SelectTag</component-type>
+               
<component-type>org.apache.empire.component.SelectTag</component-type>
                
<component-class>org.apache.empire.jsf2.components.SelectTag</component-class>
        </component>    
        <component>
-               <component-type>components.TitleTag</component-type>
+               
<component-type>org.apache.empire.component.TitleTag</component-type>
                
<component-class>org.apache.empire.jsf2.components.TitleTag</component-class>
        </component>
        <component>
-               <component-type>components.ValueTag</component-type>
+               
<component-type>org.apache.empire.component.ValueTag</component-type>
                
<component-class>org.apache.empire.jsf2.components.ValueTag</component-class>
        </component>
        <component>
-               <component-type>components.MenuListTag</component-type>
+               
<component-type>org.apache.empire.component.MenuListTag</component-type>
                
<component-class>org.apache.empire.jsf2.components.MenuListTag</component-class>
        </component>
        <component>
-               <component-type>components.MenuItemTag</component-type>
+               
<component-type>org.apache.empire.component.MenuItemTag</component-type>
                
<component-class>org.apache.empire.jsf2.components.MenuItemTag</component-class>
        </component>
        <component>
-               <component-type>components.TabViewTag</component-type>
+               
<component-type>org.apache.empire.component.TabViewTag</component-type>
                
<component-class>org.apache.empire.jsf2.components.TabViewTag</component-class>
        </component>
        <component>
-               <component-type>components.TabPageTag</component-type>
+               
<component-type>org.apache.empire.component.TabPageTag</component-type>
                
<component-class>org.apache.empire.jsf2.components.TabPageTag</component-class>
        </component>
+        -->
 
 </faces-config>
\ No newline at end of file
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/control.xhtml
 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/control.xhtml
index fc82e744..528e61e9 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/control.xhtml
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/control.xhtml
@@ -22,7 +22,7 @@
        xmlns:cc="http://java.sun.com/jsf/composite";>
 
        <!-- Interface -->
-       <cc:interface componentType="components.ControlTag">
+       <cc:interface componentType="org.apache.empire.component.ControlTag">
                <cc:attribute name="column" required="true" />  
                <cc:attribute name="record" />
                <cc:attribute name="custom" />  
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/formGrid.xhtml
 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/formGrid.xhtml
index dee8bc63..eb07beb4 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/formGrid.xhtml
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/formGrid.xhtml
@@ -22,7 +22,7 @@
        xmlns:cc="http://java.sun.com/jsf/composite";>
 
        <!-- Interface -->
-       <cc:interface componentType="components.FormGridTag">
+       <cc:interface componentType="org.apache.empire.component.FormGridTag">
                <cc:attribute name="mode" />
                <cc:attribute name="renderAutoId" />    
        </cc:interface>
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/input.xhtml
 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/input.xhtml
index d61b1d9c..c78d2dcd 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/input.xhtml
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/input.xhtml
@@ -22,7 +22,7 @@
        xmlns:cc="http://java.sun.com/jsf/composite";>
 
        <!-- Interface -->
-       <cc:interface componentType="components.InputTag">
+       <cc:interface componentType="org.apache.empire.component.InputTag">
                <cc:attribute name="column" required="true" />
                <cc:attribute name="record" />
                <cc:attribute name="value" />
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/label.xhtml
 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/label.xhtml
index 8a6071e0..211c0f8e 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/label.xhtml
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/label.xhtml
@@ -22,7 +22,7 @@
        xmlns:cc="http://java.sun.com/jsf/composite";>
 
        <!-- Interface -->
-       <cc:interface componentType="components.LabelTag">
+       <cc:interface componentType="org.apache.empire.component.LabelTag">
                <cc:attribute name="column" required="true" />  
                <cc:attribute name="format" />
                <cc:attribute name="styleClass" />
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/link.xhtml
 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/link.xhtml
index 614f7b04..6d4d3be3 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/link.xhtml
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/link.xhtml
@@ -22,7 +22,7 @@
        xmlns:cc="http://java.sun.com/jsf/composite";>
 
        <!-- Interface -->
-       <cc:interface componentType="components.LinkTag">
+       <cc:interface componentType="org.apache.empire.component.LinkTag">
                <cc:attribute name="styleClass" />
                <cc:attribute name="page" />
                <cc:attribute name="idparam" />
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/mitem.xhtml
 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/mitem.xhtml
index b216323f..919d3588 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/mitem.xhtml
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/mitem.xhtml
@@ -22,7 +22,7 @@
        xmlns:cc="http://java.sun.com/jsf/composite";>
 
        <!-- Interface -->
-       <cc:interface componentType="components.MenuItemTag">
+       <cc:interface componentType="org.apache.empire.component.MenuItemTag">
                <cc:attribute name="menuId" required="true"/>
                <cc:attribute name="page" required="true" />
                <cc:attribute name="idparam"/>
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/mlist.xhtml
 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/mlist.xhtml
index 68926d6e..513e2894 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/mlist.xhtml
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/mlist.xhtml
@@ -22,7 +22,7 @@
        xmlns:cc="http://java.sun.com/jsf/composite";>
 
        <!-- Interface -->
-       <cc:interface componentType="components.MenuListTag">
+       <cc:interface componentType="org.apache.empire.component.MenuListTag">
                <cc:attribute name="currentId" />
                <cc:attribute name="currentClass"/>
                <cc:attribute name="expandedClass"/>
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/record.xhtml
 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/record.xhtml
index fb19e939..d3222683 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/record.xhtml
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/record.xhtml
@@ -22,7 +22,7 @@
        xmlns:cc="http://java.sun.com/jsf/composite";>
 
        <!-- Interface -->
-       <cc:interface componentType="components.RecordTag">
+       <cc:interface componentType="org.apache.empire.component.RecordTag">
                <cc:attribute name="value" />
                <cc:attribute name="readonly" />        
        </cc:interface>
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/select.xhtml
 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/select.xhtml
index aef32660..efd1f7e6 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/select.xhtml
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/select.xhtml
@@ -22,7 +22,7 @@
        xmlns:cc="http://java.sun.com/jsf/composite";>
 
        <!-- Interface -->
-       <cc:interface componentType="components.SelectTag">
+       <cc:interface componentType="org.apache.empire.component.SelectTag">
                <cc:attribute name="options" required="true" />
                <cc:attribute name="allowNull"/>        
                <cc:attribute name="nullText"/> 
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/tabPage.xhtml
 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/tabPage.xhtml
index 8e237381..80d8f7a0 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/tabPage.xhtml
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/tabPage.xhtml
@@ -22,7 +22,7 @@
        xmlns:cc="http://java.sun.com/jsf/composite";>
 
        <!-- Interface -->
-       <cc:interface componentType="components.TabPageTag">
+       <cc:interface componentType="org.apache.empire.component.TabPageTag">
        </cc:interface>
 
        <!-- Implementation -->
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/tabView.xhtml
 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/tabView.xhtml
index a83b0efe..d0eb4533 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/tabView.xhtml
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/tabView.xhtml
@@ -22,7 +22,7 @@
        xmlns:cc="http://java.sun.com/jsf/composite";>
 
        <!-- Interface -->
-       <cc:interface componentType="components.TabViewTag">
+       <cc:interface componentType="org.apache.empire.component.TabViewTag">
                <cc:attribute name="mode" />
                <cc:attribute name="minHeight" />
                <cc:attribute name="activeIndex" type="java.lang.Integer" />
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/title.xhtml
 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/title.xhtml
index 93e89f93..65cb9482 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/title.xhtml
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/title.xhtml
@@ -22,7 +22,7 @@
        xmlns:cc="http://java.sun.com/jsf/composite";>
 
        <!-- Interface -->
-       <cc:interface componentType="components.TitleTag">
+       <cc:interface componentType="org.apache.empire.component.TitleTag">
                <cc:attribute name="column" required="true" />  
                <cc:attribute name="format" />
                <cc:attribute name="tag" />
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/value.xhtml
 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/value.xhtml
index c620ff0e..496d185f 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/value.xhtml
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/resources/empire/value.xhtml
@@ -22,7 +22,7 @@
        xmlns:cc="http://java.sun.com/jsf/composite";>
 
        <!-- Interface -->
-       <cc:interface componentType="components.ValueTag">
+       <cc:interface componentType="org.apache.empire.component.ValueTag">
                <cc:attribute name="column" required="true" />  
                <cc:attribute name="record" />
                <cc:attribute name="format" />
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/FacesConfiguration.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/FacesConfiguration.java
index 186e1353..acb60870 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/FacesConfiguration.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/FacesConfiguration.java
@@ -19,7 +19,6 @@
 package org.apache.empire.jsf2.app;
 
 import java.util.Iterator;
-import java.util.List;
 
 import javax.el.ELResolver;
 import javax.faces.FactoryFinder;
@@ -45,14 +44,10 @@ import org.apache.empire.exceptions.ItemNotFoundException;
 import org.apache.empire.exceptions.ObjectNotValidException;
 import org.apache.empire.exceptions.UnspecifiedErrorException;
 import org.apache.empire.jsf2.impl.FacesImplementation;
+import org.apache.empire.jsf2.impl.FacesImplementation.BeanStorageProvider;
 import org.apache.empire.jsf2.pages.PageNavigationHandler;
 import org.apache.empire.jsf2.pages.PagePhaseListener;
 import org.apache.empire.jsf2.pages.PagesELResolver;
-import org.apache.myfaces.cdi.util.BeanEntry;
-import org.apache.myfaces.config.RuntimeConfig;
-import org.apache.myfaces.spi.InjectionProvider;
-import org.apache.myfaces.spi.InjectionProviderException;
-import org.apache.myfaces.spi.InjectionProviderFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -125,7 +120,6 @@ public class FacesConfiguration
      * Temp Variables
      */
     protected Application application;
-    protected RuntimeConfig runtimeConfig;
     protected BeanStorageProvider beanStorage;
 
     public FacesConfiguration()
@@ -139,8 +133,7 @@ public class FacesConfiguration
         {   // Set temporary variables
             ExternalContext externalContext = context.getExternalContext();
             this.application = context.getApplication();
-            this.runtimeConfig = 
RuntimeConfig.getCurrentInstance(externalContext);
-            this.beanStorage = new BeanStorageProvider(externalContext);
+            this.beanStorage = 
facesImpl.getBeanStorageProvider(externalContext);
             
             // Set ProjectStage
             projectStage = 
externalContext.getInitParameter(PROJECT_STAGE_PARAM);
@@ -154,8 +147,8 @@ public class FacesConfiguration
         finally
         {   // cleanup
             this.beanStorage = null;
-            this.runtimeConfig = null;
             this.application = null;
+            this.facesImpl.configComplete();
         }
     }
     
@@ -279,7 +272,7 @@ public class FacesConfiguration
     
     protected RenderKit getApplicationRenderKit(FacesContext context)
     {
-        String renderKitId = application.getDefaultRenderKitId(); 
+        String renderKitId = 
StringUtils.coalesce(application.getDefaultRenderKitId(), 
RenderKitFactory.HTML_BASIC_RENDER_KIT); 
         return 
((RenderKitFactory)FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY)).getRenderKit(context,
 renderKitId);
     }
     
@@ -326,20 +319,9 @@ public class FacesConfiguration
     
     protected void addELResolver(Class<? extends ELResolver> resolverClass)
     {
-        List<ELResolver> list = runtimeConfig.getFacesConfigElResolvers();
-        if (list!=null) {
-            for (ELResolver resolver : list)
-            {
-                if (resolver.getClass().equals(resolverClass))
-                    return; // already there
-            }
-        }
-        log.info("Adding FacesConfigElResolver {}", resolverClass.getName());
-        ELResolver elResolver = ClassUtils.newInstance(resolverClass);
-        // Add to bean storage
-        beanStorage.injectBean(elResolver);
-        // Add to RuntimeConfig
-        runtimeConfig.addFacesConfigElResolver(elResolver);
+        boolean added = facesImpl.registerElResolver(resolverClass);
+        if (added)
+            log.info("Adding FacesConfigElResolver {}", 
resolverClass.getName());
     }
     
     /*
@@ -450,39 +432,6 @@ public class FacesConfiguration
         }
         
     }
-
-    /**
-    * BeanStorageProvider
-    * @author doebele
-    */
-    protected static class BeanStorageProvider
-    {
-        private final List<BeanEntry> injectedBeanStorage;
-        private final InjectionProvider injectionProvider;
-
-        @SuppressWarnings("unchecked")
-        public BeanStorageProvider(ExternalContext ec)
-        {
-           this.injectionProvider = 
InjectionProviderFactory.getInjectionProviderFactory(ec).getInjectionProvider(ec);
-           final String INJECTED_BEAN_STORAGE_KEY = 
"org.apache.myfaces.spi.BEAN_ENTRY_STORAGE";
-           this.injectedBeanStorage = 
(List<BeanEntry>)ec.getApplicationMap().get(INJECTED_BEAN_STORAGE_KEY);
-           if (this.injectedBeanStorage==null)
-               throw new ItemNotFoundException(INJECTED_BEAN_STORAGE_KEY);
-        }
-        
-        public void injectBean(Object bean)
-        {   try
-            {   // Add to bean storage
-                Object creationMetaData = injectionProvider.inject(bean);
-                injectedBeanStorage.add(new BeanEntry(bean, creationMetaData));
-                injectionProvider.postConstruct(bean, creationMetaData);
-            }
-            catch (InjectionProviderException e)
-            {
-                throw new InternalException(e);
-            }
-        }
-    }
     
     /**
     * LifecycleUpdater
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebAppStartupListener.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebAppStartupListener.java
index f6e06923..24c9e5d3 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebAppStartupListener.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebAppStartupListener.java
@@ -19,6 +19,7 @@
 package org.apache.empire.jsf2.app;
 
 import javax.faces.application.Application;
+import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 import javax.faces.event.AbortProcessingException;
 import javax.faces.event.PostConstructApplicationEvent;
@@ -69,19 +70,16 @@ public class WebAppStartupListener implements 
SystemEventListener
         if (event instanceof PostConstructApplicationEvent)
         {
             FacesContext startupContext = FacesContext.getCurrentInstance();
+            ExternalContext externalContext = 
startupContext.getExternalContext();
             // Detect implementation
-            FacesImplementation facesImplementation = 
detectFacesImplementation();
+            FacesImplementation facesImplementation = 
detectFacesImplementation(externalContext);
             // Init Configuration
             initFacesConfiguration(startupContext, facesImplementation);
-            // Create Application
-            Object app = 
facesImplementation.getManagedBean(WebApplication.APPLICATION_BEAN_NAME, 
startupContext);
-            if (!(app instanceof WebApplication))
-                throw new AbortProcessingException("Error: Application is not 
a "+WebApplication.class.getName()+" instance. Please create a 
ApplicationFactory!");
             // Create and Init application
-            WebApplication facesApp = (WebApplication)app;
-            facesApp.init(facesImplementation, startupContext);
+            WebApplication facesApp = createWebApplication(startupContext, 
facesImplementation);
+            initWebApplication(facesApp, startupContext, facesImplementation);
             // Set Servlet Attribute
-            ServletContext servletContext = (ServletContext) 
startupContext.getExternalContext().getContext();
+            ServletContext servletContext = (ServletContext) 
externalContext.getContext();
             if 
(servletContext.getAttribute(WebApplication.APPLICATION_BEAN_NAME)!=facesApp)
             {
                 log.warn("WARNING: Ambiguous application definition. An object 
of name '{}' already exists on application scope!", 
WebApplication.APPLICATION_BEAN_NAME);
@@ -99,20 +97,20 @@ public class WebAppStartupListener implements 
SystemEventListener
      * Supported Implementations are Sun Mojarra (2.2.x) and Apache MyFaces 
(2.2.x) 
      * @return the faces implementation
      */
-    protected FacesImplementation detectFacesImplementation()
+    protected FacesImplementation detectFacesImplementation(ExternalContext 
externalContext)
     {
         log.debug("Detecting JSF-Implementation...");
         // Test for Apache MyFaces
         try {
             
Class.forName("org.apache.myfaces.application.ApplicationFactoryImpl");
-            return new MyFacesImplementation();
+            return new MyFacesImplementation(externalContext);
         } catch (ClassNotFoundException e) {
             // It's not MyFaces
         }
         // Test for Sun Mojarra
         try {
             Class.forName("com.sun.faces.application.ApplicationFactoryImpl");
-            return new MojarraImplementation();
+            return new MojarraImplementation(externalContext);
         } catch (ClassNotFoundException e) {
             // It's not Mojarra
         }
@@ -123,15 +121,43 @@ public class WebAppStartupListener implements 
SystemEventListener
 
     /**
      * Allows to programmatically extend the faces configuration
-     * @param impl
+     * @param facesImplementation the Faces Implementation
+     * @param startupContext the Startup Context
      */
-    protected void initFacesConfiguration(FacesContext startupContext, 
FacesImplementation impl)
+    protected void initFacesConfiguration(FacesContext startupContext, 
FacesImplementation facesImplementation)
     {
         // Init FacesExtentions
         if (facesConfigClass!=null) {
             log.info("Initializing FacesExtentions");
-            FacesConfiguration.initialize(facesConfigClass, startupContext, 
impl);
+            FacesConfiguration.initialize(facesConfigClass, startupContext, 
facesImplementation);
         }
     }
+
+    /**
+     * Creates a WebApplication instance
+     * @param facesImplementation the Faces Implementation
+     * @param startupContext the Startup Context
+     * @return the WebApplication instance
+     */
+    protected WebApplication createWebApplication(FacesContext startupContext, 
FacesImplementation facesImplementation)
+    {
+        // Create Application
+        Object app = 
facesImplementation.getManagedBean(WebApplication.APPLICATION_BEAN_NAME, 
startupContext);
+        if (!(app instanceof WebApplication))
+            throw new AbortProcessingException("Error: Application is not a 
"+WebApplication.class.getName()+" instance. Please create an 
ApplicationFactory!");
+        // done
+        return (WebApplication)app;
+    }
+    
+    /**
+     * Initializes a WebApplication instance
+     * @param facesApp the WebApplication instance
+     * @param facesImplementation the Faces Implementation
+     * @param startupContext the Startup Context
+     */
+    protected void initWebApplication(WebApplication facesApp, FacesContext 
startupContext, FacesImplementation facesImplementation)
+    {
+        facesApp.init(facesImplementation, startupContext);
+    }
     
 }
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebApplication.java 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebApplication.java
index 986a12df..f79430de 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebApplication.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebApplication.java
@@ -53,7 +53,6 @@ import org.apache.empire.jsf2.controls.TextAreaInputControl;
 import org.apache.empire.jsf2.controls.TextInputControl;
 import org.apache.empire.jsf2.impl.FacesImplementation;
 import org.apache.empire.jsf2.impl.ResourceTextResolver;
-import org.apache.myfaces.lifecycle.ViewNotFoundException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -282,7 +281,7 @@ public abstract class WebApplication
         if (logger==null)
             logger=log;
         // View Exceptions
-        if ((e instanceof ViewExpiredException) || (e instanceof 
ViewNotFoundException))
+        if ((e instanceof ViewExpiredException)) // || (e instanceof 
ViewNotFoundException)) -- MyFaces only
         {   // Session expired
             logger.warn(message+": "+e.getMessage());
             return;
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/LinkTag.java 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/LinkTag.java
index c0a40ed5..d9e27338 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/LinkTag.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/LinkTag.java
@@ -46,7 +46,6 @@ import org.apache.empire.jsf2.utils.StringResponseWriter;
 import org.apache.empire.jsf2.utils.TagEncodingHelper;
 import org.apache.empire.jsf2.utils.TagEncodingHelperFactory;
 import org.apache.empire.jsf2.utils.TagStyleClass;
-import org.apache.myfaces.shared.renderkit.html.HTML;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -68,6 +67,8 @@ public class LinkTag extends UIOutput // implements 
NamingContainer
     
     protected final TagEncodingHelper helper = 
TagEncodingHelperFactory.create(this, TagStyleClass.LINK.get());
 
+    public final static String SPAN_ELEM = "span";
+    
     private boolean creatingComponents = false;
     
     private boolean encodeLinkChildren = false;
@@ -242,7 +243,7 @@ public class LinkTag extends UIOutput // implements 
NamingContainer
             if (isLinkDisabled())
             {   // Disabled
                 ResponseWriter writer = context.getResponseWriter();
-                writer.endElement(StringUtils.coalesce(this.disabledTagName, 
HTML.SPAN_ELEM));
+                writer.endElement(StringUtils.coalesce(this.disabledTagName, 
SPAN_ELEM));
             }
             else
             {   // Enabled
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/impl/FacesImplementation.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/impl/FacesImplementation.java
index 25eb1cfd..6c12fea9 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/impl/FacesImplementation.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/impl/FacesImplementation.java
@@ -18,12 +18,17 @@
  */
 package org.apache.empire.jsf2.impl;
 
+import javax.el.ELResolver;
 import javax.el.ValueExpression;
 import javax.faces.component.UIComponent;
+import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 
 public interface FacesImplementation 
 {
+    
+    boolean registerElResolver(Class<? extends ELResolver> resolverClass);
+    
        /**
         *      Registers a managed bean        
         *
@@ -100,5 +105,17 @@ public interface FacesImplementation
         * @return the unwrapped ValueExpression (may be null)
         */
        ValueExpression unwrapValueExpression(ValueExpression ve);
-       
+
+    /**
+     * BeanStorageProvider
+     * @author rainer
+     */
+       public interface BeanStorageProvider
+    {
+        void injectBean(Object bean);
+    }
+    
+    BeanStorageProvider getBeanStorageProvider(ExternalContext 
externalContext);
+
+    void configComplete();     
 }
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/impl/MojarraImplementation.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/impl/MojarraImplementation.java
index 9027dd4a..12a6c513 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/impl/MojarraImplementation.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/impl/MojarraImplementation.java
@@ -18,32 +18,46 @@
  */
 package org.apache.empire.jsf2.impl;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.el.ELResolver;
 import javax.el.ValueExpression;
+import javax.faces.FacesException;
 import javax.faces.component.UIComponent;
+import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
+import javax.servlet.ServletContext;
 
 import org.apache.empire.exceptions.ItemExistsException;
+import org.apache.empire.exceptions.NotSupportedException;
 import org.apache.empire.jsf2.utils.ValueExpressionUnwrapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.sun.faces.application.ApplicationAssociate;
+import com.sun.faces.application.ApplicationInstanceFactoryMetadataMap;
 import com.sun.faces.component.CompositeComponentStackManager;
+import com.sun.faces.config.ConfigManager;
+import com.sun.faces.config.processor.ApplicationConfigProcessor;
 import com.sun.faces.facelets.el.ContextualCompositeValueExpression;
 import com.sun.faces.facelets.el.TagValueExpression;
 import com.sun.faces.mgbean.BeanManager;
 import com.sun.faces.mgbean.ManagedBeanInfo;
+import com.sun.faces.spi.InjectionProvider;
+import com.sun.faces.spi.InjectionProviderException;
 
 public class MojarraImplementation implements FacesImplementation 
 {
     // Logger
     private static final Logger log = 
LoggerFactory.getLogger(FacesImplementation.class);
-
-    private BeanManager bm;
     
-    public MojarraImplementation()
+    private final ApplicationAssociate applAssociate;
+
+    public MojarraImplementation(ExternalContext externalContext)
        {
            log.debug("MojarraImplementation created");
+           this.applAssociate = 
ApplicationAssociate.getInstance(externalContext);
        }
                
        /*
@@ -62,10 +76,38 @@ public class MojarraImplementation implements 
FacesImplementation
        }
        */
 
+    @Override
+    public boolean registerElResolver(Class<? extends ELResolver> 
resolverClass)
+    {
+        List<ELResolver> list =applAssociate.getELResolversFromFacesConfig();
+        if (list!=null) {
+            for (ELResolver resolver : list)
+            {
+                if (resolver.getClass().equals(resolverClass))
+                    return false; // already there
+            }
+        } else {
+            list = new ArrayList<ELResolver>();
+            applAssociate.setELResolversFromFacesConfig(list);
+        }
+        /*
+        // create
+        ELResolver elResolver = ClassUtils.newInstance(resolverClass);
+        // Add to bean storage
+        getBeanStorageProvider(null).injectBean(elResolver);
+        // Add to RuntimeConfig
+        list.add(elResolver);
+        return true;
+        */
+        log.error("registerElResolver is not supported for Mojarra! Reason is, 
that is is too late and the ElResolver chain has already been built. Plase put 
it in faces-config.xml");
+        throw new NotSupportedException(this, "registerElResolver");
+    }
+
        @Override
        public void registerManagedBean(final String beanName,final String 
beanClass,final String scope) 
        {
                // check
+        BeanManager bm = applAssociate.getBeanManager();
         if (bm.getRegisteredBeans().containsKey(beanName))
         {
             throw new ItemExistsException(beanName);
@@ -79,8 +121,7 @@ public class MojarraImplementation implements 
FacesImplementation
        public Object getManagedBean(final String beanName, final FacesContext 
fc)
        {
            // Find Bean
-           if (bm==null)
-            bm = 
ApplicationAssociate.getInstance(fc.getExternalContext()).getBeanManager();
+        BeanManager bm = applAssociate.getBeanManager();
                Object mbean = bm.getBeanFromScope(beanName, fc);
                if (mbean==null)
                        mbean= bm.create(beanName, fc);
@@ -113,5 +154,68 @@ public class MojarraImplementation implements 
FacesImplementation
         // now unwrap using the ValueExpressionUnwrapper 
         return ValueExpressionUnwrapper.getInstance().unwrap(ve);
     }
-       
+    
+    private BeanStorageProvider beanStorage = null;
+    
+    @Override
+    public BeanStorageProvider getBeanStorageProvider(ExternalContext 
externalContext)
+    {
+        if (beanStorage==null) {
+            if (externalContext==null)
+                externalContext = 
FacesContext.getCurrentInstance().getExternalContext();
+            beanStorage = new MojarraBeanStorageProvider(externalContext); 
+        }
+        return beanStorage; 
+    }
+    
+    @Override
+    public void configComplete()
+    {
+        beanStorage = null;
+    }
+    
+    /**
+      * BeanStorageProvider
+      * @author doebele
+      */
+    protected static class MojarraBeanStorageProvider implements 
BeanStorageProvider
+    {
+        private final ApplicationInstanceFactoryMetadataMap<String,Object> 
classMetadataMap;
+        private final InjectionProvider injectionProvider;
+
+        @SuppressWarnings("unchecked")
+        public MojarraBeanStorageProvider(ExternalContext externalContext)
+        {
+            final String METADATA_MAP_KEY = 
ApplicationConfigProcessor.class.getName()+".METADATA";
+            ServletContext sc = (ServletContext)externalContext.getContext();
+            this.classMetadataMap = 
(ApplicationInstanceFactoryMetadataMap<String,Object>) 
sc.getAttribute(METADATA_MAP_KEY);
+            this.injectionProvider = (InjectionProvider) 
FacesContext.getCurrentInstance().getAttributes().get(ConfigManager.INJECTION_PROVIDER_KEY);
+        }
+        
+        @Override
+        public void injectBean(Object bean)
+        {
+            if (classMetadataMap==null)
+                return;
+            // put first
+            String className = bean.getClass().getName();
+            classMetadataMap.put(className, bean.getClass());
+            // check annotations
+            if (classMetadataMap.hasAnnotations(className)) {
+                try {
+                    injectionProvider.inject(bean);
+                } catch (InjectionProviderException ex) {
+                    log.error("Unable to inject instance" + className, ex);
+                    throw new FacesException(ex);
+                }
+                try {
+                    injectionProvider.invokePostConstruct(bean);
+                } catch (InjectionProviderException ex) {
+                    log.error("Unable to invoke @PostConstruct annotated 
method on instance " + className, ex);
+                    throw new FacesException(ex);
+                }
+            }
+        }
+    }
+    
 }
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/impl/MyFacesImplementation.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/impl/MyFacesImplementation.java
index a88936fe..346c6863 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/impl/MyFacesImplementation.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/impl/MyFacesImplementation.java
@@ -18,16 +18,27 @@
  */
 package org.apache.empire.jsf2.impl;
 
+import java.util.List;
+
 import javax.el.ELContext;
+import javax.el.ELResolver;
 import javax.el.ValueExpression;
 import javax.faces.application.Application;
 import javax.faces.component.UIComponent;
+import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 
+import org.apache.empire.commons.ClassUtils;
+import org.apache.empire.exceptions.InternalException;
 import org.apache.empire.exceptions.ItemExistsException;
+import org.apache.empire.exceptions.ItemNotFoundException;
 import org.apache.empire.jsf2.utils.ValueExpressionUnwrapper;
+import org.apache.myfaces.cdi.util.BeanEntry;
 import org.apache.myfaces.config.RuntimeConfig;
 import org.apache.myfaces.config.impl.digester.elements.ManagedBeanImpl;
+import org.apache.myfaces.spi.InjectionProvider;
+import org.apache.myfaces.spi.InjectionProviderException;
+import org.apache.myfaces.spi.InjectionProviderFactory;
 import org.apache.myfaces.view.facelets.el.ContextAwareTagValueExpression;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -37,9 +48,12 @@ public class MyFacesImplementation implements 
FacesImplementation
     // Logger
     private static final Logger log = 
LoggerFactory.getLogger(FacesImplementation.class);
 
-    public MyFacesImplementation()
+    private final RuntimeConfig runtimeConfig;
+    
+    public MyFacesImplementation(ExternalContext externalContext)
     {
         log.debug("MyFacesImplementation created");
+        this.runtimeConfig = RuntimeConfig.getCurrentInstance(externalContext);
     }
     
     /*
@@ -53,14 +67,30 @@ public class MyFacesImplementation implements 
FacesImplementation
        }
        */
 
+    @Override
+    public boolean registerElResolver(Class<? extends ELResolver> 
resolverClass)
+    {
+        List<ELResolver> list = runtimeConfig.getFacesConfigElResolvers();
+        if (list!=null) {
+            for (ELResolver resolver : list)
+            {
+                if (resolver.getClass().equals(resolverClass))
+                    return false; // already there
+            }
+        }
+        // create
+        ELResolver elResolver = ClassUtils.newInstance(resolverClass);
+        // Add to bean storage
+        getBeanStorageProvider(null).injectBean(elResolver);
+        // Add to RuntimeConfig
+        runtimeConfig.addFacesConfigElResolver(elResolver);
+        return true;
+    }
+    
        @Override
-       public void registerManagedBean(final String beanName, final String 
beanClass, final String scope) {
-               
-        // get Runtime Config
-               FacesContext  fc = FacesContext.getCurrentInstance();
-               RuntimeConfig rc = 
RuntimeConfig.getCurrentInstance(fc.getExternalContext());
-               // check
-        if (rc.getManagedBeans().containsKey(beanName))
+       public void registerManagedBean(final String beanName, final String 
beanClass, final String scope) 
+       {       // check
+        if (runtimeConfig.getManagedBeans().containsKey(beanName))
         {
             throw new ItemExistsException(beanName);
         }
@@ -70,7 +100,7 @@ public class MyFacesImplementation implements 
FacesImplementation
         mbi.setName(beanName);
         mbi.setBeanClass(beanClass);
         mbi.setScope(scope);
-        rc.addManagedBean(beanName, mbi);
+        runtimeConfig.addManagedBean(beanName, mbi);
        }
 
        @Override
@@ -85,7 +115,6 @@ public class MyFacesImplementation implements 
FacesImplementation
        @Override
        public UIComponent getValueParentComponent(final ValueExpression ve)
        {
-               /* No implmentation for MyFaces currently available */
                return null;
        }
 
@@ -101,4 +130,56 @@ public class MyFacesImplementation implements 
FacesImplementation
         return ValueExpressionUnwrapper.getInstance().unwrap(ve);
     }
 
+    private BeanStorageProvider beanStorage = null;
+
+    @Override
+    public BeanStorageProvider getBeanStorageProvider(ExternalContext 
externalContext)
+    {
+        if (beanStorage==null) {
+            if (externalContext==null)
+                externalContext = 
FacesContext.getCurrentInstance().getExternalContext();
+            beanStorage = new MyFacesBeanStorageProvider(externalContext); 
+        }
+        return beanStorage; 
+    }
+
+    @Override
+    public void configComplete()
+    {
+        beanStorage = null;
+    }
+    
+    /**
+     * BeanStorageProvider
+     */
+    protected static class MyFacesBeanStorageProvider implements 
BeanStorageProvider
+    {
+        private final List<BeanEntry> injectedBeanStorage;
+        private final InjectionProvider injectionProvider;
+
+        @SuppressWarnings("unchecked")
+        public MyFacesBeanStorageProvider(ExternalContext ec)
+        {
+           this.injectionProvider = 
InjectionProviderFactory.getInjectionProviderFactory(ec).getInjectionProvider(ec);
+           final String INJECTED_BEAN_STORAGE_KEY = 
"org.apache.myfaces.spi.BEAN_ENTRY_STORAGE";
+           this.injectedBeanStorage = 
(List<BeanEntry>)ec.getApplicationMap().get(INJECTED_BEAN_STORAGE_KEY);
+           if (this.injectedBeanStorage==null)
+               throw new ItemNotFoundException(INJECTED_BEAN_STORAGE_KEY);
+        }
+        
+        @Override
+        public void injectBean(Object bean)
+        {   try
+            {   // Add to bean storage
+                Object creationMetaData = injectionProvider.inject(bean);
+                injectedBeanStorage.add(new BeanEntry(bean, creationMetaData));
+                injectionProvider.postConstruct(bean, creationMetaData);
+            }
+            catch (InjectionProviderException e)
+            {
+                throw new InternalException(e);
+            }
+        }
+    }
+    
 }

Reply via email to