1 6 package org.jfox.deployment.application; 7 8 import java.io.File ; 9 import java.net.URL ; 10 import java.net.URLClassLoader ; 11 import java.util.ArrayList ; 12 import java.util.Iterator ; 13 import java.util.List ; 14 15 import org.jfox.deployment.J2EEClassLoader; 16 import org.jfox.deployment.J2EEDeployMonitor; 17 import org.jfox.deployment.J2EEModule; 18 import org.jfox.deployment.ejb.NestedEJBModule; 19 import org.jfox.deployment.web.NestedWebModule; 20 import org.jfox.deployment.web.WebDescriptor; 21 import org.jfox.ejb.meta.EJBDescriptionException; 22 import org.jfox.ejb.meta.EJBDescriptor; 23 import org.jfox.ejb.meta.EJBReferenceDescriptor; 24 import org.jfox.ioc.deploy.DeployException; 25 import org.jfox.ioc.deployment.Deployer; 26 import org.jfox.ioc.util.Files; 27 import org.jfox.ioc.util.JarUtils; 28 import org.jfox.ioc.util.XMLUtils; 29 30 33 34 public class EARModule extends J2EEModule { 35 private File earFile; 36 private J2EEClassLoader loader = new J2EEClassLoader(new URL []{}, EARModule.class.getClassLoader()); 37 38 private EARDescriptor earDescriptor; 39 40 private String baseDeployDirectory = J2EEDeployMonitor.getDeploymentDir(); 42 43 private List nestedEjbs = new ArrayList (); 44 private List nestedWebs = new ArrayList (); 45 46 public EARModule(File earFile) throws DeployException { 47 this.earFile = earFile; 48 init(); 49 } 50 51 private void init() throws DeployException { 52 try { 53 JarUtils.extract(getPackage(), getTempDeployDirectory()); 54 String [] cpArray = JarUtils.getClassPathFromManifest(earFile); 55 56 for(int i = 0; i < cpArray.length; i++) { 58 File jarLib = new File (getTempDeployDirectory(), cpArray[i]); 59 if(jarLib.exists()) { 60 File file = Files.move(jarLib, new File (getTempDeployDirectory(), "lib")); 61 loader.addURL(file.toURL()); 62 } 63 } 64 65 earDescriptor = new EARDescriptor(this); 67 URL url = getDescriptorURL(); 68 earDescriptor.processXML(XMLUtils.getDocument(url).getDocumentElement()); 69 70 initEjbReference(); 72 } 73 catch(Exception e) { 74 throw new DeployException(e); 75 } 76 77 } 78 79 private void initEjbReference() throws EJBDescriptionException { 80 for(Iterator it = nestedWebs.iterator(); it.hasNext();) { 81 NestedWebModule nestedWebModule = (NestedWebModule) it.next(); 82 WebDescriptor webDescriptor = nestedWebModule.getWebDescriptor(); 83 EJBReferenceDescriptor[] ejbRefs = webDescriptor.getEjbReferences(); 84 for(int i = 0; i < ejbRefs.length; i++) { 85 EJBReferenceDescriptor ejbRef = (EJBReferenceDescriptor) ejbRefs[i]; 86 87 String linkedEjbName = ejbRef.getEjbName(); 88 if(linkedEjbName == null || linkedEjbName.trim().equals("")) { 89 ejbRef.setJndiName(ejbRef.getRefName()); 91 } 92 else { 93 String ejbJndiName = findEjbJndiNameByEjbName(linkedEjbName); 94 if(ejbJndiName == null) { 95 throw new EJBDescriptionException("not find the ejb name for ejb-link: " + linkedEjbName + " in ear module: " + earFile.getName()); 96 } 97 ejbRef.setJndiName(ejbJndiName); 98 } 99 } 100 } 101 } 102 103 private String findEjbJndiNameByEjbName(String ejbName) { 104 EJBDescriptor ejbDescriptor = null; 105 for(Iterator it = nestedEjbs.iterator(); it.hasNext();) { 106 NestedEJBModule nestedEjbModule = (NestedEJBModule) it.next(); 107 ejbDescriptor = nestedEjbModule.getEJBBundle().getEjb(ejbName); 108 if(ejbDescriptor != null) break; 109 } 110 return ejbDescriptor == null ? null : ejbDescriptor.getJndiName(); 111 } 112 113 public URL getDescriptorURL() { 114 try { 115 return new File (getTempDeployDirectory(), "META-INF/application.xml").toURL(); 116 } 117 catch(Exception e) { 118 return null; 119 } 120 } 121 122 public File getPackage() { 123 return earFile; 124 } 125 126 public URLClassLoader getClassLoader() { 127 return loader; 128 } 129 130 public File getTempDeployDirectory() { 131 File dir = new File (earFile.getParentFile(), baseDeployDirectory + earFile.getName()); 132 if(!dir.exists()) { 133 dir.mkdirs(); 134 } 135 return dir; 136 } 137 138 public NestedEJBModule[] getNestedEJBModules() { 139 return (NestedEJBModule[]) nestedEjbs.toArray(new NestedEJBModule[nestedEjbs.size()]); 140 } 141 142 public NestedWebModule[] getNestedWebModules() { 143 return (NestedWebModule[]) nestedWebs.toArray(new NestedWebModule[nestedWebs.size()]); 144 } 145 146 void addNestedEJBModule(NestedEJBModule nestedEjb) { 147 nestedEjbs.add(nestedEjb); 148 } 149 150 void addNestedWebModule(NestedWebModule nestedWeb) { 151 nestedWebs.add(nestedWeb); 152 } 153 154 public synchronized EARDescriptor getEARDescriptor() throws EJBDescriptionException { 155 return earDescriptor; 156 } 157 158 public void deploy(Deployer deployer) throws DeployException { 159 if(deployer instanceof EARDeployer) { 160 deployer.deploy(this); 161 } 162 else { 163 throw new DeployException("can use deployer " + deployer + " to deploy component " + this); 164 } 165 } 166 167 public static void main(String [] args) { 168 169 } 170 171 } 172 173 | Popular Tags |