KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jfox > deployment > application > EARModule


1 /* JFox, the OpenSource J2EE Application Server
2  *
3  * Distributable under GNU LGPL license by gun.org
4  * more details please visit http://www.huihoo.org/jfox
5  */

6 package org.jfox.deployment.application;
7
8 import java.io.File JavaDoc;
9 import java.net.URL JavaDoc;
10 import java.net.URLClassLoader JavaDoc;
11 import java.util.ArrayList JavaDoc;
12 import java.util.Iterator JavaDoc;
13 import java.util.List JavaDoc;
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 /**
31  * @author <a HREF="mailto:young_yy@hotmail.com">Young Yang</a>
32  */

33
34 public class EARModule extends J2EEModule {
35     private File JavaDoc earFile;
36     private J2EEClassLoader loader = new J2EEClassLoader(new URL JavaDoc[]{}, EARModule.class.getClassLoader());
37
38     private EARDescriptor earDescriptor;
39
40     // directory relative to the earFile directory
41
private String JavaDoc baseDeployDirectory = J2EEDeployMonitor.getDeploymentDir();
42
43     private List JavaDoc nestedEjbs = new ArrayList JavaDoc();
44     private List JavaDoc nestedWebs = new ArrayList JavaDoc();
45
46     public EARModule(File JavaDoc 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 JavaDoc[] cpArray = JarUtils.getClassPathFromManifest(earFile);
55
56             // move the jar file to lib directory , and add it to ClassLoader
57
for(int i = 0; i < cpArray.length; i++) {
58                 File JavaDoc jarLib = new File JavaDoc(getTempDeployDirectory(), cpArray[i]);
59                 if(jarLib.exists()) {
60                     File JavaDoc file = Files.move(jarLib, new File JavaDoc(getTempDeployDirectory(), "lib"));
61                     loader.addURL(file.toURL());
62                 }
63             }
64
65             // parse application.xml
66
earDescriptor = new EARDescriptor(this);
67             URL JavaDoc url = getDescriptorURL();
68             earDescriptor.processXML(XMLUtils.getDocument(url).getDocumentElement());
69
70             // set the ejb reference
71
initEjbReference();
72         }
73         catch(Exception JavaDoc e) {
74             throw new DeployException(e);
75         }
76
77     }
78
79     private void initEjbReference() throws EJBDescriptionException {
80         for(Iterator JavaDoc 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 JavaDoc linkedEjbName = ejbRef.getEjbName();
88                 if(linkedEjbName == null || linkedEjbName.trim().equals("")) {
89                     // if not specify ejb-link, just use ejb-ref
90
ejbRef.setJndiName(ejbRef.getRefName());
91                 }
92                 else {
93                     String JavaDoc 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 JavaDoc findEjbJndiNameByEjbName(String JavaDoc ejbName) {
104         EJBDescriptor ejbDescriptor = null;
105         for(Iterator JavaDoc 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 JavaDoc getDescriptorURL() {
114         try {
115             return new File JavaDoc(getTempDeployDirectory(), "META-INF/application.xml").toURL();
116         }
117         catch(Exception JavaDoc e) {
118             return null;
119         }
120     }
121
122     public File JavaDoc getPackage() {
123         return earFile;
124     }
125
126     public URLClassLoader JavaDoc getClassLoader() {
127         return loader;
128     }
129
130     public File JavaDoc getTempDeployDirectory() {
131         File JavaDoc dir = new File JavaDoc(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 JavaDoc[] args) {
168
169     }
170
171 }
172
173
Popular Tags