/*
* Created on Mar 14, 2005
*
* The Open SLEE Project
*
* A SLEE for the People
*
* The source code contained in this file is in in the public domain.
* It can be used in any project or product without prior permission,
* license or royalty payments. There is no claim of correctness and
* NO WARRANTY OF ANY KIND provided with this code.
*/
package org.mobicents.slee.container.deployment;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javax.slee.resource.ResourceAdaptorTypeID;
import org.apache.log4j.Logger;
import org.mobicents.slee.container.SleeContainer;
import org.mobicents.slee.container.component.ResourceAdaptorTypeComponent;
import org.mobicents.slee.container.component.deployment.ClassPool;
import org.mobicents.slee.resource.AbstractActivityContextInterfaceFactory;
/**
* Generator for the concrete aci factory for an ra type
* @author martins
*/
public class ConcreteActivityContextInterfaceFactoryGenerator {
private static Logger logger= Logger.getLogger(ConcreteActivityContextInterfaceFactoryGenerator.class);
private final ResourceAdaptorTypeComponent component;
public ConcreteActivityContextInterfaceFactoryGenerator(ResourceAdaptorTypeComponent component) {
this.component = component;
}
/**
* Create a constructor. This method simply records the input parameters in
* appropriately named fields.
*
* @param
* @param classes
*/
private void createConstructor(CtClass concreteClass, CtClass sleeContainerClass, CtClass resourceAdaptorTypeIDClass)
throws Exception {
CtConstructor ctCons = new CtConstructor(new CtClass[]{sleeContainerClass,resourceAdaptorTypeIDClass}, concreteClass);
ctCons.setBody("{ super($1,$2); }");
concreteClass.addConstructor(ctCons);
}
public void generateClass() throws Exception {
if(component.getActivityContextInterfaceFactoryInterface() == null) {
return;
}
ClassPool classPool = component.getClassPool();
String interfaceName = component.getActivityContextInterfaceFactoryInterface().getName();
CtClass interfaceCtClass = classPool.get(interfaceName);
// make the class
String concreteClassName = interfaceName + "Impl";
if (logger.isDebugEnabled()) {
logger.debug("generating "+concreteClassName);
}
CtClass concreteCtClass = classPool.makeClass(concreteClassName);
// set interface
ConcreteClassGeneratorUtils.createInterfaceLinks(concreteCtClass,new CtClass[]{interfaceCtClass});
// set super class
CtClass superCtClass = classPool.get(AbstractActivityContextInterfaceFactory.class.getName());
concreteCtClass.setSuperclass(superCtClass);
// create constructor
this.createConstructor(concreteCtClass, classPool.get(SleeContainer.class
.getName()),classPool.get(ResourceAdaptorTypeID.class
.getName()));
// generate methods
for (CtMethod method : interfaceCtClass.getMethods()) {
if (method.getName().equals("getActivityContextInterface")) {
CtMethod concreteMethod = CtNewMethod.copy(method,concreteCtClass, null);
concreteMethod.setBody("{ return super.getACI($1); }");
concreteCtClass.addMethod(concreteMethod);
}
}
// write file
String deploymentPathStr = component.getDeploymentDir().getAbsolutePath();
concreteCtClass.writeFile(deploymentPathStr);
logger.debug("Writing file " + concreteClassName);
// load class into component
component.setActivityContextInterfaceFactoryConcreteClass(Thread.currentThread().getContextClassLoader().loadClass(concreteCtClass.getName()));
// and defrost in javassist pool
concreteCtClass.defrost();
}
}