001    /*******************************************************************************
002     * Copyright (C) PicoContainer Organization. All rights reserved.
003     * --------------------------------------------------------------------------
004     * The software in this package is published under the terms of the BSD style
005     * license a copy of which has been included with this distribution in the
006     * LICENSE.txt file.
007     ******************************************************************************/
008    package org.picocontainer.web.struts2;
009    
010    import org.picocontainer.web.PicoServletContainerListener;
011    import org.picocontainer.DefaultPicoContainer;
012    import org.picocontainer.MutablePicoContainer;
013    import org.picocontainer.PicoCompositionException;
014    import org.picocontainer.ComponentMonitor;
015    import org.picocontainer.monitors.NullComponentMonitor;
016    import org.picocontainer.monitors.ConsoleComponentMonitor;
017    import org.picocontainer.lifecycle.NullLifecycleStrategy;
018    import org.picocontainer.behaviors.Caching;
019    import org.picocontainer.behaviors.Storing;
020    
021    public class Struts2PicoServletContainerListener extends PicoServletContainerListener {
022    
023        protected ScopedContainers makeScopedContainers() {
024    
025            ComponentMonitor cm = makeComponentMonitor();
026    
027            NullLifecycleStrategy ls = new NullLifecycleStrategy();
028    
029            DefaultPicoContainer ac = new DefaultPicoContainer(new Caching(), makeParentContainer());
030            Storing ss = new Storing();
031            DefaultPicoContainer sc = new DefaultPicoContainer(ss, ac);
032            Storing rs = new Storing();
033            DefaultPicoContainer rc = new DefaultPicoContainer(rs, ls, sc, cm);
034            return new ScopedContainers(ac,sc,rc,ss,rs);
035    
036        }
037    
038        /**
039         * Struts2 handles whole value objects in some configurations.
040         * This enables lazy instantiation of them    
041         */
042        @Override
043        protected ComponentMonitor makeComponentMonitor() {
044            return new StrutsActionInstantiatingComponentMonitor();
045        }
046    
047        public static class StrutsActionInstantiatingComponentMonitor extends NullComponentMonitor {
048            public Object noComponentFound(MutablePicoContainer mutablePicoContainer, Object o) {
049                return noComponent(mutablePicoContainer, o);
050            }
051    
052            private Object noComponent(MutablePicoContainer mutablePicoContainer, Object o) {
053                if (o instanceof Class) {
054                    try {
055                        return ((Class) o).newInstance();
056                    } catch (InstantiationException e) {
057                        throw new PicoCompositionException("can't instantiate " + o);
058                    } catch (IllegalAccessException e) {
059                        throw new PicoCompositionException("illegal access " + o);
060                    }
061                }
062                return super.noComponentFound(mutablePicoContainer, o);
063            }
064        }
065    }