You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ma...@apache.org on 2010/03/04 09:40:06 UTC
svn commit: r918892 - in /myfaces/core/trunk:
impl/src/main/java/org/apache/myfaces/application/
impl/src/main/java/org/apache/myfaces/config/
impl/src/main/java/org/apache/myfaces/util/
impl/src/main/java/org/apache/myfaces/webapp/ src/site/
Author: matzew
Date: Thu Mar 4 08:40:05 2010
New Revision: 918892
URL: http://svn.apache.org/viewvc?rev=918892&view=rev
Log:
MYFACES-2559 - Google App Engine Support for Myfaces 2
Thanks to Ali OK (aliok at aliok dot com dot tr) for his patch
Modified:
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/FacesConfigurator.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/util/ContainerUtils.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/MyFacesServlet.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/StartupServletContextListener.java
myfaces/core/trunk/src/site/site.xml
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java?rev=918892&r1=918891&r2=918892&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java Thu Mar 4 08:40:05 2010
@@ -699,6 +699,15 @@
{
// no-op
}
+ catch (NoClassDefFoundError er)
+ {
+ //On Google App Engine, javax.naming.Context is a restricted class.
+ //In that case, NoClassDefFoundError is thrown. stageName needs to be configured
+ //below by context parameter.
+ //It can be done with changing the order to look first at context param, but it is defined in the spec.
+ //http://java.sun.com/javaee/6/docs/api/javax/faces/application/Application.html#getProjectStage()
+ //no-op
+ }
}
/*
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/FacesConfigurator.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/FacesConfigurator.java?rev=918892&r1=918891&r2=918892&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/FacesConfigurator.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/FacesConfigurator.java Thu Mar 4 08:40:05 2010
@@ -112,6 +112,7 @@
import org.apache.myfaces.shared_impl.util.StateUtils;
import org.apache.myfaces.shared_impl.util.serial.DefaultSerialFactory;
import org.apache.myfaces.shared_impl.util.serial.SerialFactory;
+import org.apache.myfaces.util.ContainerUtils;
import org.apache.myfaces.util.ExternalSpecifications;
import org.apache.myfaces.view.ViewDeclarationLanguageFactoryImpl;
import org.apache.myfaces.view.facelets.tag.jsf.TagHandlerDelegateFactoryImpl;
@@ -395,6 +396,11 @@
public void update()
{
+ //Google App Engine does not allow to get last modified time of a file;
+ //and when an application is running on GAE there is no way to update faces config xml file.
+ //thus, no need to check if the config file is modified.
+ if (ContainerUtils.isRunningOnGoogleAppEngine(_externalContext))
+ return;
long refreshPeriod = (MyfacesConfig.getCurrentInstance(_externalContext).getConfigRefreshPeriod()) * 1000;
if (refreshPeriod > 0)
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/util/ContainerUtils.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/util/ContainerUtils.java?rev=918892&r1=918891&r2=918892&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/util/ContainerUtils.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/util/ContainerUtils.java Thu Mar 4 08:40:05 2010
@@ -18,6 +18,12 @@
*/
package org.apache.myfaces.util;
+import javax.faces.context.ExternalContext;
+import javax.portlet.PortletContext;
+import javax.servlet.ServletContext;
+
+import org.apache.myfaces.shared_impl.util.ExternalContextUtils;
+
/**
* Utilities for determining the current container and for the unified
* expression language.
@@ -26,13 +32,22 @@
public class ContainerUtils
{
/**
+ * Used for determining whether Myfaces is running on Google App Engine.
+ */
+ private static final String GAE_SERVER_INFO_BEGINNING = "Google App Engine";
+
+ /**
* Determines whether we're running in a Servlet 2.5/JSP 2.1 environment.
*
* @return <code>true</code> if we're running in a JSP 2.1 environment,
* <code>false</code> otherwise
*/
- public static boolean isJsp21()
+ public static boolean isJsp21(ServletContext context)
{
+ //if running on GAE, treat like it is JSP 2.0
+ if(isRunningOnGoogleAppEngine(context))
+ return false;
+
try
{
// simply check if the class JspApplicationContext is available
@@ -74,4 +89,60 @@
int end = value.lastIndexOf('}');
return (end >=0 && start < end);
}
+
+private static Boolean runningOnGoogleAppEngine = null;
+
+ /**Returns true if running on Google App Engine (both production and development environment).
+ * <p>If this method returns true, then
+ * <ul>
+ * <li>MyFaces is initialized as in JSP 2.0 or less environment.</li>
+ * <li>Last modification check of faces config is not done during update.</li>
+ * </ul>
+ */
+ public static boolean isRunningOnGoogleAppEngine(
+ ServletContext servletContext)
+ {
+ if (runningOnGoogleAppEngine != null)
+ {
+ return runningOnGoogleAppEngine.booleanValue();
+ }
+ else
+ {
+ return isServerGoogleAppEngine(servletContext.getServerInfo());
+ }
+ }
+
+ /**
+ * @see ContainerUtils#isRunningOnGoogleAppEngine(ServletContext)
+ */
+ public static boolean isRunningOnGoogleAppEngine(
+ ExternalContext externalContext)
+ {
+
+ if (runningOnGoogleAppEngine != null)
+ {
+ return runningOnGoogleAppEngine.booleanValue();
+ }
+ else
+ {
+ String serverInfo = ExternalContextUtils.getServerInfo(externalContext);
+
+ return isServerGoogleAppEngine(serverInfo);
+ }
+ }
+
+ private static boolean isServerGoogleAppEngine(String serverInfo)
+ {
+ //for GAE, server info can be "Google App Engine/x.x.x" or "Google App Engine Development/x.x.x"
+ if (serverInfo != null && serverInfo.startsWith(GAE_SERVER_INFO_BEGINNING))
+ {
+ runningOnGoogleAppEngine = Boolean.TRUE;
+ }
+ else
+ {
+ runningOnGoogleAppEngine = Boolean.FALSE;
+ }
+
+ return runningOnGoogleAppEngine;
+ }
}
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java?rev=918892&r1=918891&r2=918892&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java Thu Mar 4 08:40:05 2010
@@ -42,6 +42,7 @@
import org.apache.myfaces.config.FacesConfigValidator;
import org.apache.myfaces.config.FacesConfigurator;
import org.apache.myfaces.config.RuntimeConfig;
+import org.apache.myfaces.config.annotation.DefaultLifecycleProviderFactory;
import org.apache.myfaces.context.servlet.ServletExternalContextImpl;
import org.apache.myfaces.shared_impl.util.StateUtils;
import org.apache.myfaces.shared_impl.webapp.webxml.WebXml;
@@ -109,6 +110,12 @@
dispatchInitDestroyEvent(servletContext, PostConstructApplicationEvent.class);
+ //initialize LifecycleProvider.
+ //if not set here, first call of getLifecycleProvider is invoked with null external context
+ //and org.apache.myfaces.config.annotation.LifecycleProvider context parameter is ignored.
+ //see MYFACES-2555
+ DefaultLifecycleProviderFactory.getLifecycleProviderFactory().getLifecycleProvider(externalContext);
+
// print out a very prominent log message if the project stage is != Production
if (!FacesContext.getCurrentInstance().isProjectStage(ProjectStage.Production))
{
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/MyFacesServlet.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/MyFacesServlet.java?rev=918892&r1=918891&r2=918892&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/MyFacesServlet.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/MyFacesServlet.java Thu Mar 4 08:40:05 2010
@@ -49,11 +49,11 @@
private FacesInitializer _facesInitializer;
- protected FacesInitializer getFacesInitializer()
+ protected void initFaces(ServletContext context)
{
if (_facesInitializer == null)
{
- if (ContainerUtils.isJsp21())
+ if (ContainerUtils.isJsp21(context))
{
_facesInitializer = new Jsp21FacesInitializer();
}
@@ -63,7 +63,7 @@
}
}
- return _facesInitializer;
+ _facesInitializer.initFaces(context);
}
public void setFacesInitializer(FacesInitializer facesInitializer)
@@ -96,7 +96,7 @@
{
if(log.isLoggable(Level.WARNING))
log.warning("ServletContextListener not yet called");
- getFacesInitializer().initFaces(servletConfig.getServletContext());
+ initFaces(servletConfig.getServletContext());
}
delegate.init(servletConfig);
log.info("MyFacesServlet for context '" + servletConfig.getServletContext().getRealPath("/") + "' initialized.");
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/StartupServletContextListener.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/StartupServletContextListener.java?rev=918892&r1=918891&r2=918892&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/StartupServletContextListener.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/StartupServletContextListener.java Thu Mar 4 08:40:05 2010
@@ -152,7 +152,7 @@
if (b == null || b.booleanValue() == false)
{
dispatchInitializationEvent(event, FACES_INIT_PHASE_PREINIT);
- getFacesInitializer().initFaces(_servletContext);
+ initFaces(_servletContext);
dispatchInitializationEvent(event, FACES_INIT_PHASE_POSTINIT);
_servletContext.setAttribute(FACES_INIT_DONE, Boolean.TRUE);
}
@@ -165,21 +165,21 @@
_detroyerListener.contextInitialized(event);
}
- protected FacesInitializer getFacesInitializer()
+ protected void initFaces(ServletContext context)
{
if (_facesInitializer == null)
{
- if (ContainerUtils.isJsp21())
+ if (ContainerUtils.isJsp21(context))
{
_facesInitializer = new Jsp21FacesInitializer();
- }
- else
+ }
+ else
{
_facesInitializer = new Jsp20FacesInitializer();
}
}
- return _facesInitializer;
+ _facesInitializer.initFaces(_servletContext);
}
/**
Modified: myfaces/core/trunk/src/site/site.xml
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/src/site/site.xml?rev=918892&r1=918891&r2=918892&view=diff
==============================================================================
--- myfaces/core/trunk/src/site/site.xml (original)
+++ myfaces/core/trunk/src/site/site.xml Thu Mar 4 08:40:05 2010
@@ -76,6 +76,7 @@
<menu name="Documentation" inherit="top">
<item name="Getting Started" href="http://myfaces.apache.org/core20/gettingstarted.html"/>
<item name="MyFaces and RI" href="http://myfaces.apache.org/core20/risamples.html"/>
+ <item name="MyFaces and Google App Engine" href="http://myfaces.apache.org/core20/googleappenginesupport.html"/>
<item name="Tomcat Config" href="http://myfaces.apache.org/core20/tomcat.html"/>
<item name="Javadocs" href="http://myfaces.apache.org/core20/javadoc.html"/>
<item name="FAQ" href="http://myfaces.apache.org/core20/faq.html"/>