Package org.nanocontainer.nanowar

Source Code of org.nanocontainer.nanowar.ScopedContainerComposerTestCase

/*****************************************************************************
* Copyright (C) NanoContainer Organization. All rights reserved.            *
* ------------------------------------------------------------------------- *
* The software in this package is published under the terms of the BSD      *
* style license a copy of which has been included with this distribution in *
* the LICENSE.txt file.                                                     *
*                                                                           *
* Original code by                                                          *
*****************************************************************************/
package org.nanocontainer.nanowar;

import java.io.StringReader;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.jmock.Mock;
import org.jmock.MockObjectTestCase;
import org.nanocontainer.script.ScriptedContainerBuilder;
import org.nanocontainer.script.ScriptedContainerBuilderFactory;
import org.nanocontainer.script.groovy.GroovyContainerBuilder;
import org.nanocontainer.script.xml.XMLContainerBuilder;
import org.picocontainer.MutablePicoContainer;
import org.picocontainer.PicoContainer;
import org.picocontainer.defaults.DefaultPicoContainer;
import org.picocontainer.defaults.ObjectReference;
import org.picocontainer.defaults.SimpleReference;

/**
* @author Mauro Talevi
* @author Konstantin Pribluda ( konstantin.pribluda[at]infodesire.com )
*/
public class ScopedContainerComposerTestCase extends MockObjectTestCase {

    public void testCompositionWithInvalidScope() throws ClassNotFoundException {
        ScopedContainerComposer composer = new ScopedContainerComposer();
        MutablePicoContainer applicationContainer = new DefaultPicoContainer();
        composer.composeContainer(applicationContainer, "invalid-scope");
        assertNull(applicationContainer.getComponentInstance("applicationScopedInstance"));
    }
   
    public void testComposedHierarchyWithDefaultConfiguration() throws ClassNotFoundException {
        assertComposedHierarchy(new ScopedContainerComposer());
    }
   
    public void testComposedHierarchyWithCustomMXLConfiguration() throws ClassNotFoundException {
        String xmlConfig =
            "<container>" +
            "<component-implementation class='org.nanocontainer.nanowar.ScopedContainerConfigurator'>"+
            "      <parameter><string>org.nanocontainer.script.xml.XMLContainerBuilder</string></parameter>"+
            "      <parameter><string>nanowar-application.xml</string></parameter> "+
            "      <parameter><string>nanowar-session.xml</string></parameter>        "+
            "      <parameter><string>nanowar-request.xml</string></parameter> "+
            "</component-implementation>" +                        
            "</container>";
        assertComposedHierarchy(new ScopedContainerComposer(createConfigurationContainer(xmlConfig, XMLContainerBuilder.class)));
    }
   
    //requires GroovyContainerBuilder to implement ContainerPopulator
    public void TODO_testComposedHierarchyWithCustomGroovyConfiguration() throws ClassNotFoundException {
        String groovyConfig =
            "pico = builder.container(parent:parent, scope:assemblyScope) {\n" +
            "   component(class:'org.nanocontainer.nanowar.ScopedContainerConfigurator', \n"+
            "             parameters:['org.nanocontainer.script.groovy.GroovyContainerBuilder', " +
            "                         'nanowar-application.groovy', " +
            "                         'nanowar-session.groovy', " +
            "                         'nanowar-request.groovy' ])\n" +
            "}";
        assertComposedHierarchy(new ScopedContainerComposer(createConfigurationContainer(groovyConfig, GroovyContainerBuilder.class)));       
    }
   
    private void assertComposedHierarchy(ScopedContainerComposer composer) throws ClassNotFoundException {
        MutablePicoContainer applicationContainer = new DefaultPicoContainer();
        Mock servletContextMock = mock(ServletContext.class);

        composer.composeContainer(applicationContainer, servletContextMock.proxy());
        assertNotNull(applicationContainer.getComponentInstance("applicationScopedInstance"));
        assertNotNull(applicationContainer.getComponentInstance("testFoo"));

        MutablePicoContainer sessionContainer = new DefaultPicoContainer(applicationContainer);
        Mock httpSessionMock = mock(HttpSession.class);
        composer.composeContainer(sessionContainer, httpSessionMock.proxy());
        assertNotNull(sessionContainer.getComponentInstance("applicationScopedInstance"));
        assertNotNull(sessionContainer.getComponentInstance("sessionScopedInstance"));

        MutablePicoContainer requestContainer = new DefaultPicoContainer(sessionContainer);
        Mock httpRequestMock = mock(HttpServletRequest.class);
        composer.composeContainer(requestContainer, httpRequestMock.proxy());
        assertNotNull(requestContainer.getComponentInstance("applicationScopedInstance"));
        assertNotNull(requestContainer.getComponentInstance("sessionScopedInstance"));
        assertNotNull(requestContainer.getComponentInstance("requestScopedInstance"));
        assertNotNull(requestContainer.getComponentInstance("testFooHierarchy"));
    }
   

    private PicoContainer createConfigurationContainer(String script, Class containerBuilder) throws ClassNotFoundException{
        ScriptedContainerBuilderFactory scriptedContainerBuilderFactory = new ScriptedContainerBuilderFactory(
                new StringReader(script), containerBuilder.getName(), Thread.currentThread().getContextClassLoader());
        return buildContainer(scriptedContainerBuilderFactory.getContainerBuilder());       
    }
   
    private PicoContainer buildContainer(ScriptedContainerBuilder builder) {
        ObjectReference containerRef = new SimpleReference();
        builder.buildContainer(containerRef, new SimpleReference(), new SimpleReference(), false);
        return (PicoContainer) containerRef.get();
    }
       
}
TOP

Related Classes of org.nanocontainer.nanowar.ScopedContainerComposerTestCase

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.