1 6 package org.jfox.deployment.ejb; 7 8 import java.util.ArrayList ; 9 import java.util.HashMap ; 10 import java.util.List ; 11 import java.util.Map ; 12 import javax.ejb.EJBHome ; 13 import javax.ejb.EJBMetaData ; 14 import javax.ejb.EJBObject ; 15 import javax.ejb.EnterpriseBean ; 16 import javax.jms.MessageListener ; 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 36 37 public class EJBDeployer extends AbstractComponent implements Deployer { 38 private EJBContainerImpl container; 39 private Logger logger = Logger.getLogger(getClass().getName()); 40 41 private Map deployedEjbs = new HashMap (); 43 44 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 if(deployedEjbs.containsKey(ejbModule)) { 57 undeploy(ejbModule); 58 } 59 60 ClassLoader 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 deploy(loader, ejbDescriptor); 70 addDeployedEjb(ejbModule, ejbDescriptor); 71 } 72 catch(Exception e) { 73 logger.warn(e); 74 } 75 } 76 } 77 78 protected void doInit() throws Exception { 79 } 80 81 protected void doDestroy() throws Exception { 82 } 83 84 private void addDeployedEjb(EJBModule ejbModule, EJBDescriptor ejbDescriptor) { 85 if(!deployedEjbs.containsKey(ejbModule)) { 86 List ejbDesriptors = new ArrayList (); 87 ejbDesriptors.add(ejbDescriptor); 88 deployedEjbs.put(ejbModule, ejbDesriptors); 89 } 90 else { 91 List ejbDescriptors = (List ) deployedEjbs.get(ejbModule); 92 ejbDescriptors.add(ejbDescriptor); 93 } 94 } 95 96 private void deploy(ClassLoader 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 loader, SessionDescriptor sessionDescriptor) throws DeployException { 110 111 try { 112 Class homeClass = loader.loadClass(sessionDescriptor.getHomeClassName()); 113 loader.loadClass("javax.ejb.EJBHome"); 114 if(!testHomeClass(homeClass)) { 115 logger.warn("Home Class: " + homeClass + " not extends " + EJBHome .class.getName()); 116 } 117 118 Class remoteClass = loader.loadClass(sessionDescriptor.getRemoteClassName()); 119 if(!testRemoteClass(remoteClass)) { 120 logger.warn("Bean Interface Class: " + remoteClass + " not extends " + EJBObject .class.getName()); 121 } 122 123 Class beanClass = loader.loadClass(sessionDescriptor.getEjbClassName()); 124 if(!testBeanClass(beanClass)) { 125 logger.warn("Bean Class: " + beanClass + " not extends " + EnterpriseBean .class.getName()); 126 } 127 128 EJBMetaData ejbMetaData = null; 129 if(sessionDescriptor.getType().equals(EJBDescriptor.SESSION_BEAN)) { ejbMetaData = new EJBMetaDataImpl(homeClass, remoteClass, true, ((SessionDescriptor) sessionDescriptor).isStateless()); 131 } 132 else { ejbMetaData = new EJBMetaDataImpl(homeClass, remoteClass, true, false); 134 } 135 BucketMeta bucketMeta = new BucketMetaImpl(ejbMetaData, sessionDescriptor, beanClass); 137 container.createBucket(bucketMeta); 138 logger.info("deploy SessionBean " + beanClass.getName() + " successful"); 139 } 140 catch(Exception e) { 141 e.printStackTrace(); 142 throw new DeployException("deploy ejb " + sessionDescriptor.getEjbName() + " failed.", e); 143 } 144 } 145 146 private void deployMDB(ClassLoader loader, MDBDescriptor mdbDescriptor) throws DeployException{ 147 try { 148 Class beanClass = loader.loadClass(mdbDescriptor.getEjbClassName()); 149 if(!testMDBBeanClass(beanClass)){ 150 logger.warn("MDB Bean Class " + beanClass.getName() + " is invalid, maybe not implements " + EnterpriseBean .class.getName() + " and " + MessageListener .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 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 ejbDescriptors = (List ) deployedEjbs.get(ejbModule); 165 for(int i = 0; i < ejbDescriptors.size(); i++) { 166 String ejbName = ((EJBDescriptor) ejbDescriptors.get(i)).getEjbName(); 167 try { 168 container.dropBucket(ejbName); 169 logger.debug("undeploy " + ejbName + " successful."); 170 } 171 catch(Exception e) { 172 logger.warn("undeploy " + ejbName + " failed.", e); 173 } 174 } 175 } 176 deployedEjbs.remove(ejbModule); 177 } 178 179 private boolean testHomeClass(Class homeClass) { 180 return EJBHome .class.isAssignableFrom(homeClass); 181 } 182 183 private boolean testRemoteClass(Class remoteClass) { 184 return EJBObject .class.isAssignableFrom(remoteClass); 185 } 186 187 private boolean testBeanClass(Class beanClass) { 188 return EnterpriseBean .class.isAssignableFrom(beanClass); 189 } 190 191 private boolean testMDBBeanClass(Class beanClass){ 192 return (EnterpriseBean .class.isAssignableFrom(beanClass) && MessageListener .class.isAssignableFrom(beanClass)); 193 } 194 public static void main(String [] args) { 195 196 } 197 } 198 199 | Popular Tags |