package org.jfox.ejb.deploy;
import org.jfox.ejb.Container;
import org.jfox.ejb.ContainerImpl;
import org.jfox.ejb.EJBMetaDataImpl;
import org.jfox.ejb.BulkMetaData;
import org.jfox.ejb.BulkMetaDataImpl;
import org.jfox.ejb.meta.EJBDescriptionException;
import org.jfox.ejb.meta.EJBDescriptor;
import org.jfox.ejb.meta.EJBMeta;
import org.jfox.ejb.meta.EJBBundle;
import org.jfox.ejb.meta.SessionBeanDescriptor;
import javax.ejb.EJBHome;
import javax.ejb.EJBObject;
import javax.ejb.EnterpriseBean;
import javax.ejb.EJBMetaData;
import java.net.URL;
import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
public class EJBDeployer extends DeployerSupport {
private Container container = null;
protected synchronized EJBDescriptor[] doDeploy(URL url) throws IOException,EJBDescriptionException {
EJBBundle enterpriseMeta = getEnterpriseMetaInfo(url);
EJBDescriptor[] ejbMetas = (EJBDescriptor[])enterpriseMeta.getEjbs().toArray(new EJBDescriptor[0]);
List metaInfos = new ArrayList(); EJBClassLoader loader = new EJBClassLoader(url,Thread.currentThread().getContextClassLoader());
for(int i=0; i<ejbMetas.length; i++){
EJBDescriptor metaInfo = deploy(loader,ejbMetas[i]);
if(metaInfo != null){
metaInfos.add(metaInfo);
}
}
return (EJBDescriptor[])metaInfos.toArray(new EJBDescriptor[0]);
}
protected void doUndeploy(EJBDescriptor[] deployments) throws IOException {
for(int i=0; i<deployments.length; i++){
try {
container.dropBulk(deployments[i].getHomeClassName());
logger.debug("undeploy " + deployments[i].getEjbClassName() + " successful.");
}
catch(Exception e){
logger.warn("undeploy " + deployments[i].getEjbClassName() + " failed.",e);
}
}
}
protected void doInit() throws Exception {
container = ContainerImpl.getInstance();
}
protected void doDestroy() throws Exception {
container = null;
}
private EJBDescriptor deploy(ClassLoader loader, EJBDescriptor ejbDescriptor){
try {
Class homeClass = loader.loadClass(ejbDescriptor.getHomeClassName());
if(!testHomeClass(homeClass)){
logger.warn("Home Class: " + homeClass + " not extends " + EJBHome.class.getName());
return null;
}
Class remoteClass = loader.loadClass(ejbDescriptor.getRemoteClassName());
if(!testRemoteClass(remoteClass)){
logger.warn("Bean Interface Class: " + remoteClass + " not extends " + EJBObject.class.getName());
return null;
}
Class beanClass = loader.loadClass(ejbDescriptor.getEjbClassName());
if(!testBeanClass(beanClass)){
logger.warn("Bean Class: " + beanClass + " not extends " + EnterpriseBean.class.getName());
return null;
}
try {
Class metaClass = loader.loadClass(ejbDescriptor.getRemoteClassName()+"Meta");
if(testMetaClass(metaClass)){
EJBMeta ejbMeta = (EJBMeta)metaClass.newInstance();
ejbDescriptor.setJndiName(ejbMeta.getJndiName());
ejbDescriptor.setRemoteProtocol(ejbMeta.getRemoteProtocol());
ejbDescriptor.setLocalProtocol(ejbMeta.getLocalProtocol());
logger.warn("EJBMeta " + ejbMeta.getRemoteProtocol());
}
else {
logger.warn("Meta Interface Class: " + metaClass + " not extends " + EJBMeta.class.getName());
}
}
catch(ClassNotFoundException ignore){ }
EJBMetaData ejbMetaData = null;
if(ejbDescriptor.getType().equals(EJBDescriptor.SESSION_BEAN)) { ejbMetaData = new EJBMetaDataImpl(homeClass,remoteClass,true, ((SessionBeanDescriptor)ejbDescriptor).isStateless());
}
else { ejbMetaData = new EJBMetaDataImpl(homeClass,remoteClass,true, false);
}
BulkMetaData bulkMeta = new BulkMetaDataImpl(ejbMetaData, ejbDescriptor, beanClass);
container.createBulk(bulkMeta);
logger.info("deploy bean [ " + beanClass.getName() + " ] successful");
return ejbDescriptor;
}
catch(Exception e){
logger.error("deploy " + ejbDescriptor.getEjbClassName() + " failed! ",e);
return null;
}
}
private boolean testHomeClass(Class homeClass){
return EJBHome.class.isAssignableFrom(homeClass);
}
private boolean testRemoteClass(Class remoteClass){
return EJBObject.class.isAssignableFrom(remoteClass);
}
private boolean testBeanClass(Class beanClass) {
return EnterpriseBean.class.isAssignableFrom(beanClass);
}
private boolean testMetaClass(Class metaClass) {
return EJBMeta.class.isAssignableFrom(metaClass);
}
private EJBBundle getEnterpriseMetaInfo(URL url) throws EJBDescriptionException {
return new EJBBundle(url);
}
}