You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by de...@apache.org on 2006/04/02 22:07:00 UTC

svn commit: r390894 - in /myfaces/core/trunk/impl/src: main/java/org/apache/myfaces/config/ main/java/org/apache/myfaces/webapp/ test/java/org/apache/myfaces/config/

Author: dennisbyrne
Date: Sun Apr  2 13:06:58 2006
New Revision: 390894

URL: http://svn.apache.org/viewcvs?rev=390894&view=rev
Log:
MYFACES-1147, added validate feature for startup

Added:
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/FacesConfigValidator.java
    myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/config/FacesConfigValidatorTestCase.java
Modified:
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/RuntimeConfig.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/StartupServletContextListener.java

Added: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/FacesConfigValidator.java
URL: http://svn.apache.org/viewcvs/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/FacesConfigValidator.java?rev=390894&view=auto
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/FacesConfigValidator.java (added)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/FacesConfigValidator.java Sun Apr  2 13:06:58 2006
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2004-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.myfaces.config;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.faces.context.ExternalContext;
+
+import org.apache.myfaces.config.element.ManagedBean;
+import org.apache.myfaces.config.element.NavigationCase;
+import org.apache.myfaces.config.element.NavigationRule;
+import org.apache.myfaces.shared_impl.util.ClassUtils;
+
+public class FacesConfigValidator
+{
+
+    public static final String VALIDATE_CONTEXT_PARAM = "org.apache.myfaces.validate";
+    
+    private FacesConfigValidator(){
+        // hidden 
+    }
+
+    public static List validate(ExternalContext ctx, String ctxPath){
+        
+        RuntimeConfig runtimeConfig = RuntimeConfig.getCurrentInstance(ctx);
+        
+        Map managedBeansMap = runtimeConfig.getManagedBeans();
+        
+        Iterator managedBeans = managedBeansMap == null ? null : 
+                                managedBeansMap.values() == null ? null :
+                                    managedBeansMap.values().iterator();
+        
+        Iterator navRules = runtimeConfig.getNavigationRules() == null ? 
+                            null : runtimeConfig.getNavigationRules().iterator();
+        
+        return validate(managedBeans, navRules, ctxPath);
+        
+    }
+    
+    public static List validate(Iterator managedBeans, Iterator navRules, String ctxPath){
+        
+        List list = new ArrayList();
+        
+        if(navRules != null)
+            validateNavRules(navRules, list, ctxPath);
+        
+        if(managedBeans != null)
+            validateManagedBeans(managedBeans, list);
+        
+        return list;
+    }
+
+    private static void validateNavRules(Iterator navRules, List list, String ctxPath){
+        
+        while(navRules.hasNext()){
+            
+            NavigationRule navRule = (NavigationRule) navRules.next();
+            
+            validateNavRule(navRule, list, ctxPath);
+            
+        }
+        
+    }
+    
+    private static void validateNavRule(NavigationRule navRule, List list, String ctxPath){
+        
+        String filePath = ctxPath + navRule.getFromViewId();
+        
+        if(! new File(filePath).exists())
+            list.add("File for navigation 'from id' does not exist " + filePath);
+        
+        Collection cases = navRule.getNavigationCases();
+        
+        Iterator iterator = cases.iterator();
+        
+        while(iterator.hasNext()){
+            
+            NavigationCase caze = (NavigationCase) iterator.next();
+            
+            String toViewPath = ctxPath + caze.getToViewId();
+            
+            if(! new File(toViewPath).exists())
+                list.add("File for navigation 'to id' does not exist " + toViewPath);
+            
+        }
+        
+    }
+    
+    private static void validateManagedBeans(Iterator managedBeans, List list){
+        
+        while(managedBeans.hasNext()){
+            
+            ManagedBean managedBean = (ManagedBean) managedBeans.next();
+            
+            validateManagedBean(managedBean, list);
+            
+        }
+        
+    }
+
+    private static void validateManagedBean(ManagedBean managedBean, List list){
+        
+        String className = managedBean.getManagedBeanClassName();
+        
+        try
+        {
+            Class clazz = ClassUtils.classForName(className);
+        }
+        catch (ClassNotFoundException e)
+        { 
+            
+            String msg = "Could not locate class " 
+                + className + " for managed bean '" + managedBean.getManagedBeanName() + "'";
+            
+            list.add(msg);
+            
+        }
+
+    }
+
+}
\ No newline at end of file

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/RuntimeConfig.java
URL: http://svn.apache.org/viewcvs/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/RuntimeConfig.java?rev=390894&r1=390893&r2=390894&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/RuntimeConfig.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/RuntimeConfig.java Sun Apr  2 13:06:58 2006
@@ -62,6 +62,12 @@
                 null : Collections.unmodifiableCollection(_navigationRules);
     }
 
+    public Map getManagedBeans()
+    {
+        return _managedBeans == null ?
+                null : Collections.unmodifiableMap(_managedBeans);
+    }
+    
     public void addNavigationRule(NavigationRule navigationRule)
     {
         _navigationRules.add(navigationRule);

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/StartupServletContextListener.java
URL: http://svn.apache.org/viewcvs/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/StartupServletContextListener.java?rev=390894&r1=390893&r2=390894&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 Sun Apr  2 13:06:58 2006
@@ -15,12 +15,16 @@
  */
 package org.apache.myfaces.webapp;
 
+import java.util.Iterator;
+import java.util.List;
+
 import javax.faces.FactoryFinder;
 import javax.faces.context.ExternalContext;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
 
+import org.apache.myfaces.config.FacesConfigValidator;
 import org.apache.myfaces.config.FacesConfigurator;
 import org.apache.myfaces.context.servlet.ServletExternalContextImpl;
 import org.apache.myfaces.shared_impl.util.StateUtils;
@@ -63,6 +67,19 @@
                 //And configure everything
                 new FacesConfigurator(externalContext).configure();
 
+                if ("true".equals(servletContext
+                                .getInitParameter(FacesConfigValidator.VALIDATE_CONTEXT_PARAM)))
+                {
+                    List list = FacesConfigValidator.validate(externalContext,
+                            servletContext.getRealPath("/"));
+
+                    Iterator iterator = list.iterator();
+
+                    while (iterator.hasNext())
+                        log.warn(iterator.next());
+
+                }
+                
                 // parse web.xml
                 WebXml.init(externalContext);
 

Added: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/config/FacesConfigValidatorTestCase.java
URL: http://svn.apache.org/viewcvs/myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/config/FacesConfigValidatorTestCase.java?rev=390894&view=auto
==============================================================================
--- myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/config/FacesConfigValidatorTestCase.java (added)
+++ myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/config/FacesConfigValidatorTestCase.java Sun Apr  2 13:06:58 2006
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2004-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.myfaces.config;
+
+import java.io.ByteArrayInputStream;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.myfaces.config.impl.digester.DigesterFacesConfigDispenserImpl;
+import org.apache.myfaces.config.impl.digester.DigesterFacesConfigUnmarshallerImpl;
+import org.apache.shale.test.base.AbstractJsfTestCase;
+
+public class FacesConfigValidatorTestCase extends AbstractJsfTestCase
+{
+
+    private Log log = LogFactory.getLog(FacesConfigValidatorTestCase.class);
+    private FacesConfigDispenser dispenser;
+    private FacesConfigUnmarshaller unmarshaller;
+    
+    public FacesConfigValidatorTestCase(String name)
+    {
+        super(name);
+    }
+    
+    public static Test suite() {
+        return new TestSuite(FacesConfigValidatorTestCase.class); // keep this method or maven won't run it
+    }
+    
+    public void setUp()
+    {
+
+        super.setUp();
+        
+        dispenser = new DigesterFacesConfigDispenserImpl();
+        unmarshaller = new DigesterFacesConfigUnmarshallerImpl(externalContext);
+        try
+        {
+            ByteArrayInputStream bais = new ByteArrayInputStream(testFacesConfig.getBytes());
+            dispenser.feed(unmarshaller.getFacesConfig(bais, null));
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        
+    }
+    
+    public void testVerifyExistence(){
+        
+        Iterator managedBeans = dispenser.getManagedBeans();
+        Iterator navRules = dispenser.getNavigationRules();
+        
+        List list = FacesConfigValidator.validate(managedBeans, navRules, "C:/somePath/");
+        
+        int expected = 3;
+        
+        assertTrue(list.size() + " should equal " + expected, list.size() == expected);
+        
+    }
+    
+    private static final String testFacesConfig =
+        "<?xml version='1.0' encoding='UTF-8'?>" +
+        "<!DOCTYPE faces-config PUBLIC " +
+            "\"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN\" " +
+            "\"http://java.sun.com/dtd/web-facesconfig_1_1.dtd\">" +
+            "<faces-config>" +
+            "<navigation-rule>" +
+            "    <from-view-id>/doesNotExist.jsp</from-view-id>" +
+            "    <navigation-case>" +
+            "        <from-outcome>doesNotMatter</from-outcome>" +
+            "        <to-view-id>/doesNotExist2.jsp</to-view-id>" +
+            "    </navigation-case>" +
+            "</navigation-rule>" +
+            "<managed-bean>" +
+            "    <managed-bean-name>exist</managed-bean-name>" +
+            "    <managed-bean-class>org.apache.myfaces.config.FacesConfigValidatorTestCase</managed-bean-class>" +
+            "    <managed-bean-scope>request</managed-bean-scope>" +
+            "</managed-bean>" +
+            "<managed-bean>" +
+            "    <managed-bean-name>nonExist</managed-bean-name>" +
+            "    <managed-bean-class>org.apache.myfaces.config.NonExist</managed-bean-class>" +
+            "    <managed-bean-scope>request</managed-bean-scope>" +
+            "</managed-bean>" +
+       "</faces-config>";
+}