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