KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jfox > deployment > ejb > EJBDeployer


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.ejb;
7
8 import java.util.ArrayList JavaDoc;
9 import java.util.HashMap JavaDoc;
10 import java.util.List JavaDoc;
11 import java.util.Map JavaDoc;
12 import javax.ejb.EJBHome JavaDoc;
13 import javax.ejb.EJBMetaData JavaDoc;
14 import javax.ejb.EJBObject JavaDoc;
15 import javax.ejb.EnterpriseBean JavaDoc;
16 import javax.jms.MessageListener JavaDoc;
17
18 import org.jfox.ejb.BucketMeta;
19 import org.jfox.ejb.BucketMetaImpl;
20 import org.jfox.ejb.EJBMetaDataImpl;
21 import org.jfox.ejb.connector.EJBContainerImpl;
22 import org.jfox.ejb.meta.EJBBundle;
23 import org.jfox.ejb.meta.EJBDescriptor;
24 import org.jfox.ejb.meta.MDBDescriptor;
25 import org.jfox.ejb.meta.SessionDescriptor;
26 import org.jfox.ioc.common.AbstractComponent;
27 import org.jfox.ioc.connector.Container;
28 import org.jfox.ioc.deploy.DeployException;
29 import org.jfox.ioc.deployment.Deployable;
30 import org.jfox.ioc.deployment.Deployer;
31 import org.jfox.ioc.logger.Logger;
32
33 /**
34  * @author <a HREF="mailto:young_yy@hotmail.com">Young Yang</a>
35  */

36
37 public class EJBDeployer extends AbstractComponent implements Deployer {
38     private EJBContainerImpl container;
39     private Logger logger = Logger.getLogger(getClass().getName());
40
41     // ejbModule => ejbDescriptor List
42
private Map JavaDoc deployedEjbs = new HashMap JavaDoc();
43
44 // private static EJBDeployer instance = new EJBDeployer(ContainerImpl.getInstance());
45

46     public EJBDeployer(Container ejbContainer) {
47         this.container = (EJBContainerImpl)ejbContainer;
48     }
49
50     public void deploy(Deployable comp) throws DeployException {
51         if(!(comp instanceof EJBModule)) {
52             throw new DeployException("can not deploy non ejb module");
53         }
54         EJBModule ejbModule = (EJBModule) comp;
55         // redeploy, do undeploy first
56
if(deployedEjbs.containsKey(ejbModule)) {
57             undeploy(ejbModule);
58         }
59
60         ClassLoader JavaDoc loader = ejbModule.getClassLoader();
61         EJBBundle ejbBundle = ejbModule.getEJBBundle();
62         EJBDescriptor[] ejbDescriptors = ejbBundle.getEjbDescriptors();
63         for(int i = 0; i < ejbDescriptors.length; i++) {
64             EJBDescriptor ejbDescriptor = ejbDescriptors[i];
65             try {
66                 // load EJBMeta as addition description
67
// loadEjbMeta(loader, ejbDescriptor);
68
// try to deploy ejb
69
deploy(loader, ejbDescriptor);
70                 addDeployedEjb(ejbModule, ejbDescriptor);
71             }
72             catch(Exception JavaDoc e) {
73                 logger.warn(e);
74             }
75         }
76     }
77
78     protected void doInit() throws Exception JavaDoc {
79     }
80
81     protected void doDestroy() throws Exception JavaDoc {
82     }
83
84     private void addDeployedEjb(EJBModule ejbModule, EJBDescriptor ejbDescriptor) {
85         if(!deployedEjbs.containsKey(ejbModule)) {
86             List JavaDoc ejbDesriptors = new ArrayList JavaDoc();
87             ejbDesriptors.add(ejbDescriptor);
88             deployedEjbs.put(ejbModule, ejbDesriptors);
89         }
90         else {
91             List JavaDoc ejbDescriptors = (List JavaDoc) deployedEjbs.get(ejbModule);
92             ejbDescriptors.add(ejbDescriptor);
93         }
94     }
95
96     private void deploy(ClassLoader JavaDoc loader, EJBDescriptor ejbDescriptor) throws DeployException {
97         if(ejbDescriptor instanceof SessionDescriptor){
98             deploySession(loader,(SessionDescriptor)ejbDescriptor);
99         }
100         else if(ejbDescriptor instanceof MDBDescriptor){
101             deployMDB(loader,(MDBDescriptor)ejbDescriptor);
102         }
103         else {
104             throw new DeployException(" unkonw ejb desriptor type " + ejbDescriptor);
105         }
106
107     }
108
109     private void deploySession(ClassLoader JavaDoc loader, SessionDescriptor sessionDescriptor) throws DeployException {
110
111         try {
112             Class JavaDoc homeClass = loader.loadClass(sessionDescriptor.getHomeClassName());
113             loader.loadClass("javax.ejb.EJBHome");
114             if(!testHomeClass(homeClass)) {
115                 logger.warn("Home Class: " + homeClass + " not extends " + EJBHome JavaDoc.class.getName());
116             }
117
118             Class JavaDoc remoteClass = loader.loadClass(sessionDescriptor.getRemoteClassName());
119             if(!testRemoteClass(remoteClass)) {
120                 logger.warn("Bean Interface Class: " + remoteClass + " not extends " + EJBObject JavaDoc.class.getName());
121             }
122
123             Class JavaDoc beanClass = loader.loadClass(sessionDescriptor.getEjbClassName());
124             if(!testBeanClass(beanClass)) {
125                 logger.warn("Bean Class: " + beanClass + " not extends " + EnterpriseBean JavaDoc.class.getName());
126             }
127
128             EJBMetaData JavaDoc ejbMetaData = null;
129             if(sessionDescriptor.getType().equals(EJBDescriptor.SESSION_BEAN)) { // is SessionBean
130
ejbMetaData = new EJBMetaDataImpl(homeClass, remoteClass, true, ((SessionDescriptor) sessionDescriptor).isStateless());
131             }
132             else { // Maybe EntityBean, but not support now
133
ejbMetaData = new EJBMetaDataImpl(homeClass, remoteClass, true, false);
134             }
135             // will create a ejb bucket and bind it's home to jndi
136
BucketMeta bucketMeta = new BucketMetaImpl(ejbMetaData, sessionDescriptor, beanClass);
137             container.createBucket(bucketMeta);
138             logger.info("deploy SessionBean " + beanClass.getName() + " successful");
139         }
140         catch(Exception JavaDoc e) {
141             e.printStackTrace();
142             throw new DeployException("deploy ejb " + sessionDescriptor.getEjbName() + " failed.", e);
143         }
144     }
145
146     private void deployMDB(ClassLoader JavaDoc loader, MDBDescriptor mdbDescriptor) throws DeployException{
147         try {
148             Class JavaDoc beanClass = loader.loadClass(mdbDescriptor.getEjbClassName());
149             if(!testMDBBeanClass(beanClass)){
150                 logger.warn("MDB Bean Class " + beanClass.getName() + " is invalid, maybe not implements " + EnterpriseBean JavaDoc.class.getName() + " and " + MessageListener JavaDoc.class.getName());
151             }
152             BucketMeta meta = new BucketMetaImpl(new EJBMetaDataImpl(null,null,false,false), mdbDescriptor,beanClass);
153             container.createBucket(meta);
154             logger.info("deploy MessageDriven Bean " + beanClass.getName() + " successful.");
155         }
156         catch(Exception JavaDoc e){
157             throw new DeployException("deploy MessageDriven Bean " + mdbDescriptor.getEjbName() + " failed.", e);
158         }
159     }
160
161     public void undeploy(Deployable comp) throws DeployException {
162         EJBModule ejbModule = (EJBModule) comp;
163         if(deployedEjbs.containsKey(ejbModule)) {
164             List JavaDoc ejbDescriptors = (List JavaDoc) deployedEjbs.get(ejbModule);
165             for(int i = 0; i < ejbDescriptors.size(); i++) {
166                 String JavaDoc ejbName = ((EJBDescriptor) ejbDescriptors.get(i)).getEjbName();
167                 try {
168                     container.dropBucket(ejbName);
169                     logger.debug("undeploy " + ejbName + " successful.");
170                 }
171                 catch(Exception JavaDoc e) {
172                     logger.warn("undeploy " + ejbName + " failed.", e);
173                 }
174             }
175         }
176         deployedEjbs.remove(ejbModule);
177     }
178
179     private boolean testHomeClass(Class JavaDoc homeClass) {
180         return EJBHome JavaDoc.class.isAssignableFrom(homeClass);
181     }
182
183     private boolean testRemoteClass(Class JavaDoc remoteClass) {
184         return EJBObject JavaDoc.class.isAssignableFrom(remoteClass);
185     }
186
187     private boolean testBeanClass(Class JavaDoc beanClass) {
188         return EnterpriseBean JavaDoc.class.isAssignableFrom(beanClass);
189     }
190
191     private boolean testMDBBeanClass(Class JavaDoc beanClass){
192         return (EnterpriseBean JavaDoc.class.isAssignableFrom(beanClass) && MessageListener JavaDoc.class.isAssignableFrom(beanClass));
193     }
194     public static void main(String JavaDoc[] args) {
195
196     }
197 }
198
199
Popular Tags