dblevins    2005/08/26 17:04:51

  Modified:    modules/core/src/java/org/openejb/alt/assembler/classic
                        ContainerBuilder.java
  Log:

  Added ability to decorate containers.  Added decorator for plugging in Tomcat 
JNDI support.
  
  Revision  Changes    Path
  1.2       +30 -2     
openejb1/modules/core/src/java/org/openejb/alt/assembler/classic/ContainerBuilder.java
  
  Index: ContainerBuilder.java
  ===================================================================
  RCS file: 
/home/projects/openejb/scm/openejb1/modules/core/src/java/org/openejb/alt/assembler/classic/ContainerBuilder.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ContainerBuilder.java     16 Aug 2005 01:05:03 -0000      1.1
  +++ ContainerBuilder.java     26 Aug 2005 21:04:51 -0000      1.2
  @@ -47,10 +47,14 @@
   
   import org.openejb.Container;
   import org.openejb.OpenEJBException;
  +import org.openejb.RpcContainer;
   import org.openejb.core.DeploymentInfo;
  +import org.openejb.util.Logger;
   import org.openejb.util.SafeToolkit;
   
   import java.io.File;
  +import java.lang.reflect.Constructor;
  +import java.lang.reflect.InvocationTargetException;
   import java.net.MalformedURLException;
   import java.net.URL;
   import java.net.URLClassLoader;
  @@ -63,14 +67,20 @@
    * @version $Revision$ $Date$
    */
   public class ContainerBuilder {
  +
  +    private static final Logger logger = Logger.getInstance("OpenEJB", 
"org.openejb.util.resources");
  +
       private final Properties props;
       private final EjbJarInfo[] ejbJars;
       private final ContainerInfo[] containerInfos;
  +    private final String[] decorators;
  +
   
       public ContainerBuilder(ContainerSystemInfo containerSystemInfo, 
Properties props) {
           this.props = props;
           this.ejbJars = containerSystemInfo.ejbJars;
           this.containerInfos = containerSystemInfo.containers;
  +        this.decorators = props.getProperty("openejb.container.decorators", 
"").split(":");
       }
   
       public Object build() throws OpenEJBException {
  @@ -125,6 +135,24 @@
               clonedProps.putAll(containerInfo.properties);
   
               Container container = (Container) factory.newInstance();
  +
  +            ClassLoader contextClassLoader = 
Thread.currentThread().getContextClassLoader();
  +            for (int i = 0; i < decorators.length && container instanceof 
RpcContainer; i++) {
  +                try {
  +                    String decoratorName = decorators[i];
  +                    Class decorator = 
contextClassLoader.loadClass(decoratorName);
  +                    Constructor constructor = decorator.getConstructor(new 
Class[]{RpcContainer.class});
  +                    container = (Container) constructor.newInstance(new 
Object[]{container});
  +                } catch (NoSuchMethodException e) {
  +                    String name = decorators[i].replaceAll(".*\\.", "");
  +                    logger.error("Container wrapper " + decorators[i] + " 
does not have the required constructor 'public " + name + "(RpcContainer 
container)'");
  +                } catch (InvocationTargetException e) {
  +                    logger.error("Container wrapper " + decorators[i] + " 
could not be constructed and will be skipped.  Received message: " + 
e.getCause().getMessage(), e.getCause());
  +                } catch (ClassNotFoundException e) {
  +                    logger.error("Container wrapper class " + decorators[i] 
+ " could not be loaded and will be skipped.");
  +                }
  +            }
  +
               container.init(containerName, deploymentsList, clonedProps);
               return container;
           } catch (OpenEJBException e) {
  
  
  

Reply via email to