com.sun.faces.config.ConfigFileTestCase.java Source code

Java tutorial

Introduction

Here is the source code for com.sun.faces.config.ConfigFileTestCase.java

Source

/*
 * $Id: ConfigFileTestCase.java,v 1.64.10.1 2006/04/12 19:33:01 ofung Exp $
 */

/*
 * The contents of this file are subject to the terms
 * of the Common Development and Distribution License
 * (the License). You may not use this file except in
 * compliance with the License.
 * 
 * You can obtain a copy of the License at
 * https://javaserverfaces.dev.java.net/CDDL.html or
 * legal/CDDLv1.0.txt. 
 * See the License for the specific language governing
 * permission and limitations under the License.
 * 
 * When distributing Covered Code, include this CDDL
 * Header Notice in each file and include the License file
 * at legal/CDDLv1.0.txt.    
 * If applicable, add the following below the CDDL Header,
 * with the fields enclosed by brackets [] replaced by
 * your own identifying information:
 * "Portions Copyrighted [year] [name of copyright owner]"
 * 
 * [Name of File] [ver.__] [Date]
 * 
 * Copyright 2006 Sun Microsystems Inc. All Rights Reserved
 */

package com.sun.faces.config;

import com.sun.faces.ServletFacesTestCase;
import com.sun.faces.application.ApplicationAssociate;
import com.sun.faces.application.ApplicationImpl;
import com.sun.faces.config.beans.FacesConfigBean;
import com.sun.faces.util.Util;
import org.apache.cactus.WebRequest;
import org.apache.commons.digester.Digester;

import javax.faces.FactoryFinder;
import javax.faces.application.ApplicationFactory;
import javax.faces.application.NavigationHandler;
import javax.faces.component.UIComponent;
import javax.faces.component.UIViewRoot;
import javax.faces.convert.Converter;
import javax.faces.render.RenderKit;
import javax.faces.render.RenderKitFactory;
import javax.faces.validator.Validator;
import javax.servlet.ServletContext;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * <p>Unit tests for Configuration File processing.</p>
 */

public class ConfigFileTestCase extends ServletFacesTestCase {

    // ----------------------------------------------------- Instance Variables
    List mappings;
    ConfigParser parser = new ConfigParser();

    public static class ConfigParser extends ConfigureListener {
        public void parseFromStr(ServletContext context, String str) throws Exception {
            Digester digester = null;
            URL url = null;
            FacesConfigBean fcb = (FacesConfigBean) context.getAttribute(FACES_CONFIG_BEAN_KEY);

            // Step 1, configure a Digester instance we can use
            digester = digester(isFeatureEnabled(context, VALIDATE_XML));

            url = (new File(System.getProperty("testRootDir"))).toURL();
            url = new URL(url, str);
            parse(digester, url, fcb);
            configure(context, fcb);
        }
    }

    // ----------------------------------------------------------- Constructors

    /**
     * Construct a new instance of this test case.
     *
     * @param name Name of the test case
     */
    public ConfigFileTestCase(String name) {

        super(name);
        mappings = new ArrayList();
        mappings.add("/faces/*");

    }

    public void beginLifecyclePhaseListener(WebRequest theRequest) {
        theRequest.setURL("localhost:8080", "/test", "/faces", null, null);
    }

    // --------------------------------------------------- Overall Test Methods

    // ------------------------------------------------ Individual Test Methods

    protected void parseConfig(String resource, ServletContext context) throws Exception {
        parser.parseFromStr(context, resource);
    }

    // Test parsing a full configuration file
    public void testFull() throws Exception {
        ApplicationFactory aFactory = (ApplicationFactory) FactoryFinder
                .getFactory(FactoryFinder.APPLICATION_FACTORY);
        ApplicationImpl application = (ApplicationImpl) aFactory.getApplication();
        parseConfig("WEB-INF/faces-config.xml", config.getServletContext());

        // <application>
        assertTrue(application.getActionListener() instanceof com.sun.faces.TestActionListener);
        assertTrue(application.getNavigationHandler() instanceof com.sun.faces.TestNavigationHandler);
        assertTrue(application.getPropertyResolver() instanceof com.sun.faces.AdapterPropertyResolver);
        assertTrue(((com.sun.faces.AdapterPropertyResolver) application.getPropertyResolver())
                .getRoot() instanceof com.sun.faces.TestPropertyResolver);
        assertTrue(application.getVariableResolver() instanceof com.sun.faces.TestVariableResolver);
        assertTrue(application.getViewHandler() instanceof com.sun.faces.TestViewHandler);

        // <component>

        Iterator iter = application.getComponentTypes();
        assertTrue(iter.hasNext());
        String cType = null;
        UIComponent comp = null;
        while (iter.hasNext()) {
            cType = (String) iter.next();
            comp = application.createComponent(cType);
            assertNotNull(comp);
        }
        UIComponent command = application.createComponent("Command");
        assertNotNull(command);
        comp = null;
        application.addComponent("fooType", "javax.faces.component.UICommand");
        comp = application.createComponent("fooType");
        assertNotNull(comp);

        // <converter>

        iter = application.getConverterIds();
        assertTrue(iter.hasNext());
        String convId = null;
        Converter conv = null;
        while (iter.hasNext()) {
            convId = (String) iter.next();
            conv = application.createConverter(convId);
            assertNotNull(conv);
        }
        Converter first = application.createConverter("First");
        assertNotNull(first);
        conv = null;
        application.addConverter("fooId", "javax.faces.convert.DateTimeConverter");
        conv = application.createConverter("fooId");
        assertNotNull(conv);

        // <validator>

        iter = application.getValidatorIds();
        assertTrue(iter.hasNext());
        String valId = null;
        Validator val = null;
        while (iter.hasNext()) {
            valId = (String) iter.next();
            val = application.createValidator(valId);
            assertNotNull(val);
        }
        Validator second = application.createValidator("Second");
        assertNotNull(second);
        val = null;
        application.addValidator("fooId", "javax.faces.validator.DoubleRangeValidator");
        val = application.createValidator("fooId");
        assertNotNull(val);

    }

    public void testFull_1_0() throws Exception {
        ApplicationFactory aFactory = (ApplicationFactory) FactoryFinder
                .getFactory(FactoryFinder.APPLICATION_FACTORY);
        ApplicationImpl application = (ApplicationImpl) aFactory.getApplication();
        parseConfig("WEB-INF/faces-config-1.0.xml", config.getServletContext());

        // <application>
        assertTrue(application.getActionListener() instanceof com.sun.faces.TestActionListener);
        assertTrue(application.getNavigationHandler() instanceof com.sun.faces.TestNavigationHandler);
        assertTrue(application.getPropertyResolver() instanceof com.sun.faces.AdapterPropertyResolver);
        assertTrue(((com.sun.faces.AdapterPropertyResolver) application.getPropertyResolver())
                .getRoot() instanceof com.sun.faces.TestPropertyResolver);
        assertTrue(application.getVariableResolver() instanceof com.sun.faces.TestVariableResolver);
        assertTrue(application.getViewHandler() instanceof com.sun.faces.TestViewHandler);

        // <component>

        Iterator iter = application.getComponentTypes();
        assertTrue(iter.hasNext());
        String cType = null;
        UIComponent comp = null;
        while (iter.hasNext()) {
            cType = (String) iter.next();
            comp = application.createComponent(cType);
            assertNotNull(comp);
        }
        UIComponent command = application.createComponent("Command");
        assertNotNull(command);
        comp = null;
        application.addComponent("fooType", "javax.faces.component.UICommand");
        comp = application.createComponent("fooType");
        assertNotNull(comp);

        // <converter>

        iter = application.getConverterIds();
        assertTrue(iter.hasNext());
        String convId = null;
        Converter conv = null;
        while (iter.hasNext()) {
            convId = (String) iter.next();
            conv = application.createConverter(convId);
            assertNotNull(conv);
        }
        Converter first = application.createConverter("First");
        assertNotNull(first);
        conv = null;
        application.addConverter("fooId", "javax.faces.convert.DateTimeConverter");
        conv = application.createConverter("fooId");
        assertNotNull(conv);

        // <validator>

        iter = application.getValidatorIds();
        assertTrue(iter.hasNext());
        String valId = null;
        Validator val = null;
        while (iter.hasNext()) {
            valId = (String) iter.next();
            val = application.createValidator(valId);
            assertNotNull(val);
        }
        Validator second = application.createValidator("Second");
        assertNotNull(second);
        val = null;
        application.addValidator("fooId", "javax.faces.validator.DoubleRangeValidator");
        val = application.createValidator("fooId");
        assertNotNull(val);

    }

    public void testEmpty() throws Exception {
        parseConfig("WEB-INF/faces-config-empty.xml", config.getServletContext());
    }

    // Assert that create and stored managed bean is the same as specified in the 
    // config file.

    public void testConfigManagedBeanFactory() throws Exception {

        parseConfig("WEB-INF/faces-config.xml", config.getServletContext());

        ApplicationFactory aFactory = (ApplicationFactory) FactoryFinder
                .getFactory(FactoryFinder.APPLICATION_FACTORY);
        ApplicationImpl application = (ApplicationImpl) aFactory.getApplication();

        ApplicationAssociate associate = ApplicationAssociate.getInstance(getFacesContext().getExternalContext());
        Object bean = associate.createAndMaybeStoreManagedBeans(getFacesContext(), "SimpleBean");

        // Assert the correct methods have been created in the bean
        // Also assert the value returned from the "get" method matches
        // the one specified in the config file.
        //
        try {
            Class c = bean.getClass();
            Method m[] = c.getDeclaredMethods();
            for (int i = 0; i < m.length; i++) {
                Util.doAssert(m[i].getName().equals("setSimpleProperty")
                        || m[i].getName().equals("getSimpleProperty") || m[i].getName().equals("setIntProperty")
                        || m[i].getName().equals("getIntProperty") || m[i].getName().equals("getTrueValue")
                        || m[i].getName().equals("getFalseValue") || m[i].getName().equals("setNonManagedBean")
                        || m[i].getName().equals("getNonManagedBean"));
                if (m[i].getName().equals("getSimpleProperty")) {
                    Object args[] = null;
                    Object value = m[i].invoke(bean, args);
                    Util.doAssert(((String) value).equals("Bobby Orr"));
                }
            }
        } catch (Throwable t) {
            assertTrue(false);
        }
    }

    /********** PENDING return to running
    public void testMapAndListPropertyPositive() throws Exception {
    ApplicationFactory aFactory = (ApplicationFactory) FactoryFinder.getFactory(
        FactoryFinder.APPLICATION_FACTORY);
    ApplicationImpl application = (ApplicationImpl) aFactory.getApplication();
    parseConfig("WEB-INF/faces-config.xml",
                config.getServletContext());
        
    ValueBinding valueBinding =
        application.createValueBinding(
            "#{NewCustomerFormHandler.claimAmounts}");
    assertNotNull(valueBinding);
        
    Map claimAmounts = (Map) valueBinding.getValue(getFacesContext());
    assertNotNull(claimAmounts);
        
    assertNotNull(claimAmounts.get("fire"));
    assertTrue(claimAmounts.get("fire") instanceof Double);
    assertNull(claimAmounts.get("water"));
    assertNull(claimAmounts.get("earthquake"));
        
    valueBinding =
        application.createValueBinding(
            "#{NewCustomerFormHandler.allowableValues}");
    assertNotNull(valueBinding);
        
    List list1 = (List) valueBinding.getValue(getFacesContext());
    assertNotNull(list1);
        
    assertEquals("allowableValues size not as expected", 4, list1.size());
    assertEquals("allowableValues.get(0) not as expected",
                 new Integer(10), list1.get(0));
    assertEquals("allowableValues.get(1) not as expected",
                 new Integer(20), list1.get(1));
    assertEquals("allowableValues.get(2) not as expected",
                 new Integer(60), list1.get(2));
    assertNull("allowableValues.get(3) not as expected", list1.get(3));
        
    valueBinding =
        application.createValueBinding(
            "#{NewCustomerFormHandler.firstNames}");
    assertNotNull(valueBinding);
        
    String[] strings =
        (String[]) valueBinding.getValue(getFacesContext());
    assertNotNull(strings);
        
    assertEquals("firstNames size not as expected", 5, strings.length);
    assertEquals("firstNames[0] not as expected", "bob", strings[0]);
    assertEquals("firstNames[1] not as expected", "jerry", strings[1]);
    assertEquals("firstNames[2] not as expected", "Thomas", strings[2]);
    assertNull("firstNames[3] not as expected", strings[3]);
    assertNull("firstNames[4] not as expected", strings[4]);
        
    }
        
        
    public void testMapAndListPositive() throws Exception {
    ApplicationFactory aFactory = (ApplicationFactory) FactoryFinder.getFactory(
        FactoryFinder.APPLICATION_FACTORY);
    ApplicationImpl application = (ApplicationImpl) aFactory.getApplication();
    parseConfig("WEB-INF/config-lists-and-maps.xml",
                config.getServletContext());
        
    ValueBinding valueBinding =
        application.createValueBinding("#{simpleList}");
    assertNotNull(valueBinding);
        
    List list = (List) valueBinding.getValue(getFacesContext());
    assertNotNull(list);
        
    assertEquals("simpleList size not as expected", 4, list.size());
    assertEquals("simpleList.get(0) not as expected",
                 new Integer(10), list.get(0));
    assertEquals("simpleList.get(1) not as expected",
                 new Integer(20), list.get(1));
    assertEquals("simpleList.get(2) not as expected",
                 new Integer(60), list.get(2));
    assertNull("simpleList.get(3) not as expected", list.get(3));
        
    valueBinding = application.createValueBinding("#{objectList}");
    assertNotNull(valueBinding);
        
    list = (List) valueBinding.getValue(getFacesContext());
    assertNotNull(list);
        
    assertEquals("simpleList size not as expected", 4, list.size());
    assertTrue("simpleList.get(0) not as expected",
               list.get(0) instanceof SimpleBean);
    assertTrue("simpleList.get(1) not as expected",
               list.get(1) instanceof SimpleBean);
    assertTrue("simpleList.get(2) not as expected",
               list.get(2) instanceof SimpleBean);
    assertNull("simpleList.get(3) not as expected", list.get(3));
        
        
    valueBinding = application.createValueBinding("#{floatMap}");
    assertNotNull(valueBinding);
        
    Map
        nestedMap = null,
        map = (Map) valueBinding.getValue(getFacesContext());
    assertNotNull(map);
        
    Iterator keys = map.keySet().iterator();
    Float
        key1 = new Float(3.1415),
        key2 = new Float(3.14),
        key3 = new Float(6.02),
        key4 = new Float(0.00001);
    Object
        curKey = null,
        value = null;
        
    while (keys.hasNext()) {
        assertTrue((curKey = keys.next()) instanceof Float);
        if (null != (value = map.get(curKey))) {
            assertTrue(value instanceof SimpleBean);
        }
    }
        
    assertTrue("map.get(key1) not a SimpleBean",
               map.get(key1) instanceof SimpleBean);
    assertTrue("map.get(key2) not a SimpleBean",
               map.get(key2) instanceof SimpleBean);
    assertTrue("map.get(key3) not a SimpleBean",
               map.get(key3) instanceof SimpleBean);
    assertNull("map.get(key4) not null", map.get(key4));
        
    valueBinding = application.createValueBinding("#{crazyMap}");
    assertNotNull(valueBinding);
        
    map = (Map) valueBinding.getValue(getFacesContext());
    assertNotNull(map);
        
    keys = map.keySet().iterator();
    while (keys.hasNext()) {
        assertTrue((curKey = keys.next()) instanceof String);
        if (null != (value = map.get(curKey))) {
            assertTrue(value instanceof Map);
            nestedMap = (Map) value;
            assertTrue("nestedMap.get(key1) not a SimpleBean",
                       nestedMap.get(key1) instanceof SimpleBean);
            assertTrue("nestedMap.get(key2) not a SimpleBean",
                       nestedMap.get(key2) instanceof SimpleBean);
            assertTrue("nestedMap.get(key3) not a SimpleBean",
                       nestedMap.get(key3) instanceof SimpleBean);
            assertNull("nestedMap.get(key4) not null",
                       nestedMap.get(key4));
        }
    }
    assertTrue("map.get(one) not a Map",
               map.get("one") instanceof Map);
    assertTrue("map.get(two) not a Map",
               map.get("two") instanceof Map);
    assertNull("map.get(three) not null", map.get("three"));
        
        
    }
    ********************/

    public void testNavigationCase() throws Exception {
        parseConfig("WEB-INF/faces-config.xml", config.getServletContext());
        ApplicationFactory aFactory = (ApplicationFactory) FactoryFinder
                .getFactory(FactoryFinder.APPLICATION_FACTORY);
        ApplicationImpl application = (ApplicationImpl) aFactory.getApplication();
        NavigationHandler navHandler = application.getNavigationHandler();
        UIViewRoot page = Util.getViewHandler(getFacesContext()).createView(getFacesContext(), null);
        page.setViewId("/login.jsp");
        getFacesContext().setViewRoot(page);
        navHandler.handleNavigation(getFacesContext(), "#{UserBean.login}", "success");
        String newViewId = getFacesContext().getViewRoot().getViewId();
        assertTrue(newViewId.equals("/home.jsp"));
    }

    public void testRenderKit() {
        // test the default renderkit
        ApplicationFactory aFactory = (ApplicationFactory) FactoryFinder
                .getFactory(FactoryFinder.APPLICATION_FACTORY);
        ApplicationImpl application = (ApplicationImpl) aFactory.getApplication();
        RenderKitFactory renderKitFactory = (RenderKitFactory) FactoryFinder
                .getFactory(FactoryFinder.RENDER_KIT_FACTORY);
        Map renderKitsMap = null, renderersMap = null;
        String defaultRenderers[] = { "Button", "Checkbox", "Form", "Grid", "Group", "Hidden", "Link", "Image",
                "Label", "Listbox", "Menu", "Message", "Radio", "Secret", "CheckboxList", "Textarea", "Text" };
        Iterator rendererIter = null;

        Iterator iter = renderKitFactory.getRenderKitIds();
        assertTrue(iter.hasNext());
        RenderKit renderKit = renderKitFactory.getRenderKit(getFacesContext(),
                renderKitFactory.HTML_BASIC_RENDER_KIT);
        assertTrue(renderKit != null);
        for (int i = 0; i < defaultRenderers.length; i++) {
            // FIXME - following will fail for two reasons
            // (1) no actual component family arguments
            // (2) JSFA130 means all the identifiers are "javax.faces." prefixed
            // assertTrue(null != (renderKit.getRenderer(null, defaultRenderers[i])));
        }
    }

    /**
     * <p>Test that using the same name for different artifacts works.</p>
     */

    /****************** PENDING return to running
    public void testDuplicateNames() throws Exception {
    ApplicationFactory aFactory = (ApplicationFactory) FactoryFinder.getFactory(
        FactoryFinder.APPLICATION_FACTORY);
    ApplicationImpl application = (ApplicationImpl) aFactory.getApplication();
    parseConfig("config1.xml", config.getServletContext());
    }
        
        
        
     * <p>Parse a config file that has a managed-bean entry that has an
     * error.  Make sure the expected behavior occurrs.</p>
        
        
        
    public void testConversionErrorDuringParse() throws Exception {
    ApplicationFactory aFactory = (ApplicationFactory) FactoryFinder.getFactory(
        FactoryFinder.APPLICATION_FACTORY);
    ApplicationImpl application = (ApplicationImpl) aFactory.getApplication();
    boolean exceptionThrown = false;
    try {
        parseConfig("config-with-failing-property-conversion.xml",
                    config.getServletContext());
    } catch (RuntimeException re) {
        exceptionThrown = true;
        assertTrue(-1 != re.getMessage().indexOf("convert"));
    }
    assertTrue(exceptionThrown);
        
    }
        
    public void testLifecyclePhaseListener() throws Exception {
    final String HANDLED_BEFORE_AFTER = "Handled Before After";
    LifecycleFactory lFactory = (LifecycleFactory) FactoryFinder.getFactory(
        FactoryFinder.LIFECYCLE_FACTORY);
    Lifecycle lifecycle = lFactory.getLifecycle(
        LifecycleFactory.DEFAULT_LIFECYCLE);
    parseConfig("config1.xml", config.getServletContext());
        
    UIViewRoot page = Util.getViewHandler(getFacesContext()).createView(getFacesContext(), null);
    page.setViewId("/login.jsp");
    getFacesContext().setViewRoot(page);
    try {
        System.setProperty(HANDLED_BEFORE_AFTER, "");
        lifecycle.execute(getFacesContext());
    } catch (Exception e) {
        assertTrue(e.getMessage(), false);
    }
        
    String handledBeforeAfter = System.getProperty(HANDLED_BEFORE_AFTER);
    assertTrue(handledBeforeAfter != null);
    assertTrue(handledBeforeAfter.equals(HANDLED_BEFORE_AFTER));
    }
        
        
    public void testFileNotFoundWhenParsing() throws Exception {
    // make sure we get a FileNotFoundException on null input for
    // all variants of parseConfig.
    boolean exceptionThrown = false;
    try {
        cp.parseConfig((InputStream) null);
    } catch (FileNotFoundException e) {
        exceptionThrown = true;
    }
    assertTrue(exceptionThrown);
        
    exceptionThrown = false;
    try {
        cp.parseConfig(null, config.getServletContext());
    } catch (FileNotFoundException e) {
        exceptionThrown = true;
    }
    assertTrue(exceptionThrown);
        
    exceptionThrown = false;
    try {
        cp.parseConfig((InputSource) null);
    } catch (FileNotFoundException e) {
        exceptionThrown = true;
    }
    assertTrue(exceptionThrown);
        
    }
    ********************/

    public void testNoneScopedBeans() throws Exception {
        parseConfig("WEB-INF/none-scoped-beans.xml", config.getServletContext());
        ApplicationFactory aFactory = (ApplicationFactory) FactoryFinder
                .getFactory(FactoryFinder.APPLICATION_FACTORY);
        ApplicationImpl application = (ApplicationImpl) aFactory.getApplication();
        ApplicationAssociate associate = ApplicationAssociate.getInstance(getFacesContext().getExternalContext());

        com.sun.faces.TestBean bean = (com.sun.faces.TestBean) associate
                .createAndMaybeStoreManagedBeans(getFacesContext(), "outer");
        assertNotNull(bean.getCustomerBean());
        assertTrue(bean.getCustomerBean() instanceof com.sun.faces.CustomerBean);

    }

    public void testNonManagedBeans() throws Exception {
        parseConfig("WEB-INF/faces-config.xml", config.getServletContext());

        ApplicationFactory aFactory = (ApplicationFactory) FactoryFinder
                .getFactory(FactoryFinder.APPLICATION_FACTORY);
        ApplicationImpl application = (ApplicationImpl) aFactory.getApplication();

        ApplicationAssociate associate = ApplicationAssociate.getInstance(getFacesContext().getExternalContext());
        Object bean = associate.createAndMaybeStoreManagedBeans(getFacesContext(), "SimpleBean");

        // Assert the methods exist on the created bean..
        try {
            Class c = bean.getClass();
            Method m[] = c.getDeclaredMethods();
            int methodCnt = 0;
            for (int i = 0; i < m.length; i++) {
                if (m[i].getName().equals("setNonManagedBean")) {
                    methodCnt++;
                }
                if (m[i].getName().equals("getNonManagedBean")) {
                    methodCnt++;
                }
            }
            assertEquals("non managed bean methods not found", methodCnt, 2);
        } catch (Throwable t) {
            assertTrue(false);
        }

    }

}