1 45 46 package org.openejb.alt.assembler.classic; 47 48 import org.openejb.Container; 49 import org.openejb.OpenEJBException; 50 import org.openejb.RpcContainer; 51 import org.openejb.loader.SystemInstance; 52 import org.openejb.core.DeploymentInfo; 53 import org.openejb.util.Logger; 54 import org.openejb.util.SafeToolkit; 55 56 import java.io.File ; 57 import java.lang.reflect.Constructor ; 58 import java.lang.reflect.InvocationTargetException ; 59 import java.net.MalformedURLException ; 60 import java.net.URL ; 61 import java.net.URLClassLoader ; 62 import java.util.ArrayList ; 63 import java.util.HashMap ; 64 import java.util.List ; 65 import java.util.Properties ; 66 67 70 public class ContainerBuilder { 71 72 private static final Logger logger = Logger.getInstance("OpenEJB", "org.openejb.util.resources"); 73 74 private final Properties props; 75 private final EjbJarInfo[] ejbJars; 76 private final ContainerInfo[] containerInfos; 77 private final String [] decorators; 78 79 80 public ContainerBuilder(ContainerSystemInfo containerSystemInfo, Properties props) { 81 this.props = props; 82 this.ejbJars = containerSystemInfo.ejbJars; 83 this.containerInfos = containerSystemInfo.containers; 84 String decorators = props.getProperty("openejb.container.decorators"); 85 this.decorators = (decorators == null)? new String []{}: decorators.split(":"); 86 } 87 88 public Object build() throws OpenEJBException { 89 HashMap deployments = new HashMap (); 90 URL [] jars = new URL [this.ejbJars.length]; 91 for (int i = 0; i < this.ejbJars.length; i++) { 92 try { 93 jars[i] = new File (this.ejbJars[i].jarPath).toURL(); 94 } catch (MalformedURLException e) { 95 throw new OpenEJBException(AssemblerTool.messages.format("cl0001", ejbJars[i].jarPath, e.getMessage())); 96 } 97 } 98 99 ClassLoader classLoader = new URLClassLoader (jars, org.openejb.OpenEJB.class.getClassLoader()); 100 101 for (int i = 0; i < this.ejbJars.length; i++) { 102 EjbJarInfo ejbJar = this.ejbJars[i]; 103 104 EnterpriseBeanInfo[] ejbs = ejbJar.enterpriseBeans; 105 for (int j = 0; j < ejbs.length; j++) { 106 EnterpriseBeanInfo ejbInfo = ejbs[j]; 107 EnterpriseBeanBuilder deploymentBuilder = new EnterpriseBeanBuilder(classLoader, ejbInfo); 108 DeploymentInfo deployment = (DeploymentInfo) deploymentBuilder.build(); 109 deployments.put(ejbInfo.ejbDeploymentId, deployment); 110 } 111 } 112 113 List containers = new ArrayList (); 114 for (int i = 0; i < containerInfos.length; i++) { 115 ContainerInfo containerInfo = containerInfos[i]; 116 117 HashMap deploymentsList = new HashMap (); 118 for (int z = 0; z < containerInfo.ejbeans.length; z++) { 119 String ejbDeploymentId = containerInfo.ejbeans[z].ejbDeploymentId; 120 DeploymentInfo deployment = (DeploymentInfo) deployments.get(ejbDeploymentId); 121 deploymentsList.put(ejbDeploymentId, deployment); 122 } 123 124 containers.add(buildContainer(containerInfo, deploymentsList)); 125 } 126 return containers; 127 } 128 129 private Container buildContainer(ContainerInfo containerInfo, HashMap deploymentsList) throws OpenEJBException { 130 String className = containerInfo.className; 131 String codebase = containerInfo.codebase; 132 String containerName = containerInfo.containerName; 133 134 try { 135 Class factory = SafeToolkit.loadClass(className, codebase); 136 if (!Container.class.isAssignableFrom(factory)) { 137 throw new OpenEJBException(AssemblerTool.messages.format("init.0100", "Container", containerName, factory.getName(), Container.class.getName())); 138 } 139 140 Properties clonedProps = (Properties ) (props.clone()); 141 clonedProps.putAll(containerInfo.properties); 142 143 Container container = (Container) factory.newInstance(); 144 145 ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); 146 for (int i = 0; i < decorators.length && container instanceof RpcContainer; i++) { 147 try { 148 String decoratorName = decorators[i]; 149 Class decorator = contextClassLoader.loadClass(decoratorName); 150 Constructor constructor = decorator.getConstructor(new Class []{RpcContainer.class}); 151 container = (Container) constructor.newInstance(new Object []{container}); 152 } catch (NoSuchMethodException e) { 153 String name = decorators[i].replaceAll(".*\\.", ""); 154 logger.error("Container wrapper " + decorators[i] + " does not have the required constructor 'public " + name + "(RpcContainer container)'"); 155 } catch (InvocationTargetException e) { 156 logger.error("Container wrapper " + decorators[i] + " could not be constructed and will be skipped. Received message: " + e.getCause().getMessage(), e.getCause()); 157 } catch (ClassNotFoundException e) { 158 logger.error("Container wrapper class " + decorators[i] + " could not be loaded and will be skipped."); 159 } 160 } 161 162 Properties systemProperties = System.getProperties(); 163 synchronized(systemProperties) { 164 String userDir = systemProperties.getProperty("user.dir"); 165 try{ 166 File base = SystemInstance.get().getBase().getDirectory(); 167 systemProperties.setProperty("user.dir", base.getAbsolutePath()); 168 container.init(containerName, deploymentsList, clonedProps); 169 } finally { 170 systemProperties.setProperty("user.dir",userDir); 171 } 172 } 173 174 return container; 175 } catch (OpenEJBException e) { 176 throw new OpenEJBException(AssemblerTool.messages.format("as0002", containerName, e.getMessage())); 177 } catch (InstantiationException e) { 178 throw new OpenEJBException(AssemblerTool.messages.format("as0003", containerName, e.getMessage())); 179 } catch (IllegalAccessException e) { 180 throw new OpenEJBException(AssemblerTool.messages.format("as0003", containerName, e.getMessage())); 181 } 182 } 183 } 184 | Popular Tags |