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"/>