package is.idega.tools;
import java.io.*;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import com.idega.xml.XMLDocument;
import com.idega.xml.XMLElement;
import com.idega.xml.XMLOutput;
import com.idega.xml.XMLParser;
/**
* Title: idegaclasses
* Description:
* Copyright: Copyright (c) 2001
* Company: idega
* @author <a href="tryggvi@idega.is">Tryggvi Larusson</a>
* @version 1.0
*/
public class EJBWizard {
protected boolean legacyIDO = false;
//protected String beanClassSuffix = "BMPBean";
private String className;
private File workingDirectory;
private String superInterface;
private boolean generatedeploymentdescriptors=false;
public EJBWizard(String className) {
setEntityClassName(className);
initialize();
}
public EJBWizard(Class entityClass) {
setEntityClass(entityClass);
initialize();
}
public void initialize() {
String currentDir = System.getProperty("user.dir");
File workingDir = new File(currentDir);
this.setWorkingDirectory(workingDir);
}
public static void main(String[] args) throws Exception {
try {
String className = args[0];
// file check:
if (className.endsWith(".java") || className.endsWith(".JAVA")) {
File javaFile = new File(className);
FileReader reader = new FileReader(javaFile);
LineNumberReader linereader = new LineNumberReader(new FileReader(javaFile));
String line;
String pack = "";
String clss = "";
int nr = 0;
while ((line = linereader.readLine()) != null) {
StringTokenizer tok = new StringTokenizer(line, " ;");
while (tok.hasMoreTokens()) {
String token = tok.nextToken();
if (token.equals("package")) {
if (tok.hasMoreTokens())
pack = tok.nextToken();
} else if (token.equals("class")) {
if (tok.hasMoreTokens())
clss = tok.nextToken();
break;
}
//System.out.println("line"+nr++);
}
}
className = pack + "." + clss;
//System.out.println(className);
EJBWizard instance = new EJBWizard(className);
instance.setWorkingDirectory(javaFile.getParentFile());
instance.doJavaFileCreate();
} else {
System.out.println("className is " + className);
String currentDir = System.getProperty("user.dir");
File workingDir = new File(currentDir);
EJBWizard instance = new EJBWizard(className);
instance.setWorkingDirectory(workingDir);
instance.doJavaFileCreate();
}
} catch (java.lang.ArrayIndexOutOfBoundsException e) {
System.out.println("EJBWizard: You have to supply a valid ClassName as an argument");
}
}
protected boolean getIfGenerateDeploymentDescriptors(){
return this.generatedeploymentdescriptors;
}
public void setLegacyIDO(boolean ifLegacy) {
this.legacyIDO = ifLegacy;
}
public String getBeanSuffix() {
return "BMPBean";
}
public void doJavaFileCreate() throws Exception {
EJBWizardClassCreator inst = new EJBWizardClassCreator(className, this);
if (this.superInterface != null) {
inst.setRemoteInterfaceSuperInterface(superInterface);
}
inst.setWorkingDirectory(getWorkingDirectory());
inst.setLegacyIDO(this.legacyIDO);
setClassCreatorProperties(inst);
inst.createAllFiles();
if(this.getIfGenerateDeploymentDescriptors()){
mergeAllDeploymentDescriptors();
createDeploymentDescriptor(inst);
}
}
public void setEntityClassName(String className) {
this.className = className;
}
public void setEntityClass(Class entityClass) {
this.setEntityClassName(entityClass.getName());
}
public void setWorkingDirectory(File directory) {
//System.out.println("Setting working dir=" + directory.getAbsolutePath());
this.workingDirectory = directory;
}
public File getWorkingDirectory() {
return this.workingDirectory;
}
public void setRemoteInterfaceSuperInterface(String interfaceClass) {
//System.out.println("EJBWizard - Setting RemoteSuperInterface: "+interfaceClass+" for "+this.className);
this.superInterface = interfaceClass;
}
/**
* Overrided in sublcasses
* @param inst
*/
protected void setClassCreatorProperties(EJBWizardClassCreator inst) {
inst.setToThrowRemoteExceptions(false);
inst.setFactorySuperClass("com.idega.data.IDOFactory");
inst.setHomeSuperInterface("com.idega.data.IDOHome");
}
public boolean finderMethodsAllowed() {
return true;
}
public String[] getInternalMethodImplementations(ClassIntrospector introspector) {
int length = 1;
String[] returningMethods = new String[length];
for (int i = 0; i < length; i++) {
String methodString = " protected Class getEntityInterfaceClass()";
methodString += "{\n";
methodString += " return " + introspector.getShortName() + ".class;";
methodString += "\n }\n\n";
returningMethods[i] = methodString;
}
return returningMethods;
}
public String[] getCreateMethodImplementations(ClassIntrospector introspector) {
String[] finderMethodStrings = introspector.getCreateMethods();
Method[] methods = introspector.getCreateMethodsArray();
int length = methods.length;
if (legacyIDO) {
length += 2;
} else {
length += 1;
}
String[] returningMethods = new String[length];
int i = 0;
for (i = 0; i < methods.length; i++) {
Method method = methods[i];
String methodString = finderMethodStrings[i] + "{\n";
methodString += "\tcom.idega.data.IDOEntity entity = this.idoCheckOutPooledEntity();\n";
methodString += "\tObject pk = (("
+ introspector.getEntityBeanName()
+ ")entity)."
+ method.getName()
+ "("
+ introspector.getParametersInForMethod(method)
+ ");\n";
methodString += "\t(("
+ introspector.getEntityBeanName()
+ ")entity)."
+ introspector.getPostCreateMethodName(method.getName())
+ "("
+ introspector.getParametersInForMethod(method)
+ ");\n";
methodString += "\tthis.idoCheckInPooledEntity(entity);\n";
methodString += "\ttry{\n\t\treturn this.findByPrimaryKey(pk);\n\t}\n";
methodString += "\tcatch(javax.ejb.FinderException fe){\n\t\tthrow new com.idega.data.IDOCreateException(fe);\n\t}\n";
methodString += "\tcatch(Exception e){\n\t\tthrow new com.idega.data.IDOCreateException(e);\n\t}\n";
methodString += "}\n";
returningMethods[i] = methodString;
}
String codeString = " public " + introspector.getShortName() + " create() throws javax.ejb.CreateException";
codeString += "{\n";
codeString += " return (" + introspector.getShortName() + ") super.createIDO();";
codeString += "\n }\n\n";
returningMethods[i] = codeString;
i++;
if (legacyIDO) {
codeString = " public " + introspector.getShortName() + " createLegacy()";
codeString += "{\n";
codeString += "\ttry{\n";
codeString += "\t\treturn create();\n";
codeString += "\t}\n";
codeString += "\tcatch(javax.ejb.CreateException ce){\n";
codeString += "\t\tthrow new RuntimeException(\"CreateException:\"+ce.getMessage());\n";
codeString += "\t}\n";
codeString += "\n }\n\n";
returningMethods[i] = codeString;
i++;
}
return returningMethods;
}
public String[] getFinderMethodImplementations(ClassIntrospector introspector) {
String[] finderMethodStrings = introspector.getFinderMethods();
Method[] methods = introspector.getFinderMethodsArray();
int length = methods.length;
if (legacyIDO) {
length += 3;
} else {
length += 1;
}
String[] returningMethods = new String[length];
int i = 0;
for (i = 0; i < methods.length; i++) {
Method method = methods[i];
String methodString = null;
if (method.getReturnType().equals(java.util.Collection.class)) {
methodString = finderMethodStrings[i] + "{\n";
methodString += "\tcom.idega.data.IDOEntity entity = this.idoCheckOutPooledEntity();\n";
methodString += "\tjava.util.Collection ids = (("
+ introspector.getEntityBeanName()
+ ")entity)."
+ method.getName()
+ "("
+ introspector.getParametersInForMethod(method)
+ ");\n";
methodString += "\tthis.idoCheckInPooledEntity(entity);\n";
methodString += "\treturn this.getEntityCollectionForPrimaryKeys(ids);\n";
methodString += "}\n";
} else if (method.getReturnType().equals(java.util.Set.class)) {
methodString = finderMethodStrings[i] + "{\n";
methodString += "\tcom.idega.data.IDOEntity entity = this.idoCheckOutPooledEntity();\n";
methodString += "\tjava.util.Set ids = (("
+ introspector.getEntityBeanName()
+ ")entity)."
+ method.getName()
+ "("
+ introspector.getParametersInForMethod(method)
+ ");\n";
methodString += "\tthis.idoCheckInPooledEntity(entity);\n";
methodString += "\treturn this.getEntitySetForPrimaryKeys(ids);\n";
methodString += "}\n";
} else {
methodString = finderMethodStrings[i] + "{\n";
methodString += "\tcom.idega.data.IDOEntity entity = this.idoCheckOutPooledEntity();\n";
methodString += "\tObject pk = (("
+ introspector.getEntityBeanName()
+ ")entity)."
+ method.getName()
+ "("
+ introspector.getParametersInForMethod(method)
+ ");\n";
methodString += "\tthis.idoCheckInPooledEntity(entity);\n";
methodString += "\treturn this.findByPrimaryKey(pk);\n";
methodString += "}\n";
}
returningMethods[i] = methodString;
}
String codeString = " public " + introspector.getShortName() + " findByPrimaryKey(Object pk) throws javax.ejb.FinderException";
codeString += "{\n";
codeString += " return (" + introspector.getShortName() + ") super.findByPrimaryKeyIDO(pk);";
codeString += "\n }\n\n";
returningMethods[i] = codeString;
i++;
if (legacyIDO) {
codeString = " public " + introspector.getShortName() + " findByPrimaryKey(int id) throws javax.ejb.FinderException";
codeString += "{\n";
codeString += " return (" + introspector.getShortName() + ") super.findByPrimaryKeyIDO(id);";
codeString += "\n }\n\n";
returningMethods[i] = codeString;
i++;
codeString = " public " + introspector.getShortName() + " findByPrimaryKeyLegacy(int id) throws java.sql.SQLException";
codeString += "{\n";
codeString += "\ttry{\n";
codeString += "\t\treturn findByPrimaryKey(id);\n";
codeString += "\t}\n";
codeString += "\tcatch(javax.ejb.FinderException fe){\n";
codeString += "\t\tthrow new java.sql.SQLException(fe.getMessage());\n";
codeString += "\t}\n";
codeString += "\n }\n\n";
returningMethods[i] = codeString;
i++;
}
return returningMethods;
}
public String[] getHomeMethodImplementations(ClassIntrospector introspector) {
String[] finderMethodStrings = introspector.getHomeMethods();
Method[] methods = introspector.getHomeMethodsArray();
int length = methods.length;
String[] returningMethods = new String[length];
for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
String returnType = introspector.getClassParameterToString(method.getReturnType());
String methodString = finderMethodStrings[i] + "{\n";
methodString += "\tcom.idega.data.IDOEntity entity = this.idoCheckOutPooledEntity();\n";
methodString += "\t"
+ returnType
+ " theReturn = (("
+ introspector.getEntityBeanName()
+ ")entity)."
+ method.getName()
+ "("
+ introspector.getParametersInForMethod(method)
+ ");\n";
methodString += "\tthis.idoCheckInPooledEntity(entity);\n";
methodString += "\treturn theReturn;\n";
methodString += "}\n";
returningMethods[i] = methodString;
}
return returningMethods;
}
protected void createDeploymentDescriptor(EJBWizardClassCreator classCreator) {
ClassIntrospector introspector = classCreator.getClassIntrospector();
String beanName = introspector.getEntityBeanName();
String beanNameWithPackage = introspector.getPackage() + "." + beanName;
String ejbName = beanNameWithPackage;
String fileName = beanName + "-ejb-jar.xml";
File file = new File(getWorkingDirectory(), fileName);
OutputStream stream = null;
try {
if (!file.exists()) {
file.createNewFile();
stream = new FileOutputStream(file);
//XMLParser parser = new XMLParser();
//XMLDocument doc = parser.parse(reader);
XMLElement ejbJarElement = new XMLElement("ejb-jar");
XMLElement enterpriseBeansElement = new XMLElement("enterprise-beans");
ejbJarElement.addContent(enterpriseBeansElement);
XMLElement entityElement = getBeanspecificElement(classCreator);
enterpriseBeansElement.addContent(entityElement);
XMLElement assemblyDescriptorElement = new XMLElement("assembly-descriptor");
ejbJarElement.addContent(assemblyDescriptorElement);
XMLElement containerTransactionElement = new XMLElement("container-transaction");
assemblyDescriptorElement.addContent(containerTransactionElement);
XMLElement methodElement = new XMLElement("method");
containerTransactionElement.addContent(methodElement);
XMLElement ejbNameElement2 = new XMLElement("ejb-name");
String ejbBeanName = ejbName;
ejbNameElement2.addContent(ejbBeanName);
methodElement.addContent(ejbNameElement2);
XMLElement methodNameElement = new XMLElement("method-name");
String methodsValue = "*";
methodNameElement.addContent(methodsValue);
methodElement.addContent(methodNameElement);
XMLElement transAttributeElement = new XMLElement("trans-attribute");
String transAttribute = "NotSupported";
transAttributeElement.addContent(transAttribute);
containerTransactionElement.addContent(transAttributeElement);
XMLDocument doc = saveRootElementToFile(ejbJarElement,fileName);
}
} catch (FileNotFoundException e) {
e.printStackTrace(System.err);
} catch (IOException e) {
e.printStackTrace(System.err);
}
}
protected XMLElement getBeanspecificElement(EJBWizardClassCreator classCreator){
ClassIntrospector introspector = classCreator.getClassIntrospector();
String beanName = introspector.getEntityBeanName();
String beanNameWithPackage = introspector.getPackage() + "." + beanName;
String ejbName = beanNameWithPackage;
String homeNameWithPackage = introspector.getPackage() + "." + classCreator.getHomeName();
String interfaceNameWithPackage = introspector.getPackage() + "." + introspector.getShortName();
XMLElement entityElement = new XMLElement("entity");
addBeanGeneralElements(entityElement,"",ejbName,beanNameWithPackage,homeNameWithPackage,interfaceNameWithPackage);
/*
XMLElement localHomeElement = new XMLElement("local-home");
localHomeElement.addContent(homeNameWithPackage);
entityElement.addContent(localHomeElement);
XMLElement localElement = new XMLElement("local");
localElement.addContent(interfaceNameWithPackage);
entityElement.addContent(localElement);
*/
XMLElement primKeyClassElement = new XMLElement("prim-key-class");
String primKeyClass = getBeanPrimaryKeyClass(classCreator).getName();
primKeyClassElement.addContent(primKeyClass);
entityElement.addContent(primKeyClassElement);
XMLElement persistanceTypeElement = new XMLElement("persistence-type");
String persistanceType = "Bean";
persistanceTypeElement.addContent(persistanceType);
entityElement.addContent(persistanceTypeElement);
/*
XMLElement transactionTypeElement = new XMLElement("transaction-type");
String transactionType = "Container";
transactionTypeElement.addContent(transactionType);
entityElement.addContent(transactionTypeElement);
*/
XMLElement reentrantElement = new XMLElement("reentrant");
boolean isReentrant = false;
reentrantElement.addContent(String.valueOf(isReentrant));
entityElement.addContent(reentrantElement);
return entityElement;
}
private Class getBeanPrimaryKeyClass(EJBWizardClassCreator classCreator){
try{
/**
*@todo: Revise implementation
**/
com.idega.data.EntityControl.setAutoCreationOfEntities(false);
Object instance = classCreator.getClassIntrospector().sourceClass.newInstance();
return ((com.idega.data.GenericEntity)instance).getPrimaryKeyClass();
}
catch(Exception e){
System.err.println("Error instanciating Data class. Message: "+e.getMessage());
e.printStackTrace();
}
return Integer.class;
}
protected void addBeanGeneralElements(XMLElement beanElement,String description, String ejbName,String ejbClassName,String remoteHomeClass,String remoteClass){
XMLElement descriptionElement = new XMLElement("description");
descriptionElement.addContent("");
beanElement.addContent(descriptionElement);
XMLElement ejbNameElement = new XMLElement("ejb-name");
ejbNameElement.addContent(ejbName);
beanElement.addContent(ejbNameElement);
XMLElement ejbClassElement = new XMLElement("ejb-class");
ejbClassElement.addContent(ejbClassName);
beanElement.addContent(ejbClassElement);
if(remoteHomeClass!=null){
XMLElement homeElement = new XMLElement("home");
homeElement.addContent(remoteHomeClass);
beanElement.addContent(homeElement);
}
if(remoteClass!=null){
XMLElement remoteElement = new XMLElement("remote");
remoteElement.addContent(remoteClass);
beanElement.addContent(remoteElement);
}
}
protected void mergeAllDeploymentDescriptors() throws IOException {
final String ejbjarxml = "-ejb-jar.xml";
XMLParser parser = new XMLParser();
XMLDocument doc = null;
//XMLDocument mainDocument = null;
XMLElement mainEjbJarElement = new XMLElement("ejb-jar");
XMLElement mainAssemblyDescriptorElement = new XMLElement("assembly-descriptor");
XMLElement mainEnterpriseBeansElement = new XMLElement("enterprise-beans");
mainEjbJarElement.addContent(mainEnterpriseBeansElement);
mainEjbJarElement.addContent(mainAssemblyDescriptorElement);
//mainDocument.setRootElement(mainEjbJarElement);
//System.out.println("here0");
File[] files = getWorkingDirectory().listFiles();
for (int i = 0; i < files.length; i++) {
try {
//System.out.println("here1");
File file = files[i];
if(file.getName().endsWith(ejbjarxml)){
doc = parser.parse(file);
XMLElement ejbJarElement = doc.getRootElement();
XMLElement enterpriseBeansElement = ejbJarElement.getChild("enterprise-beans");
List entities = enterpriseBeansElement.getChildren();
if (entities != null) {
Iterator iter = entities.iterator();
while(iter.hasNext()){
//System.out.println("here2");
XMLElement elem = (XMLElement)iter.next();
mainEnterpriseBeansElement.addContent((XMLElement)elem.clone());
}
}
XMLElement assemblyDescriptorElement = ejbJarElement.getChild("assembly-descriptor");
entities = assemblyDescriptorElement.getChildren();
if (entities != null) {
Iterator iter = entities.iterator();
while(iter.hasNext()){
XMLElement elem = (XMLElement)iter.next();
mainAssemblyDescriptorElement.addContent((XMLElement)elem.clone());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
String fileName = "ejb-jar.xml";
saveRootElementToFile(mainEjbJarElement,fileName);
}
protected XMLDocument saveRootElementToFile(XMLElement rootElement,String fileName)throws IOException{
XMLDocument doc = new XMLDocument(rootElement);
//_rootElement = doc.getRootElement();
//_xmlDocument.setRootElement(_rootElement);
//this.setXMLDocument(doc);
XMLOutput output = new XMLOutput(" ", true);
output.setLineSeparator(System.getProperty("line.separator"));
output.setTextNormalize(true);
File file = new File(getWorkingDirectory(),fileName);
FileOutputStream stream = new FileOutputStream(file);
output.output(doc, stream);
stream.close();
return doc;
}
}