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 }