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);
+ }
+ }
+ }
+
}