diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/Ejbc.java b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/Ejbc.java
index dfc34be11..2f6844d2c 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/Ejbc.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/Ejbc.java
@@ -54,7 +54,9 @@
package org.apache.tools.ant.taskdefs.optional.ejb;
-import org.apache.tools.ant.*;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.*;
import org.apache.tools.ant.types.Path;
@@ -68,19 +70,6 @@ import java.io.File;
* @author Conor MacNeill, Cortex ebusiness Pty Limited
*/
public class Ejbc extends MatchingTask {
- static public interface Helper {
- public void initialize(Ejbc ejbcTask);
- public void setDescriptorDir(File dir);
- public void setDest(File dir);
- public void setManifest(File manifestFile);
- public void setClasspath(Path classpath);
- public void setSrc(File dir);
- public void setDescriptors(String[] descriptors);
- public void execute();
- }
-
-
-
/**
* The root directory of the tree containing the serialised deployment desciptors. The actual
* deployment descriptor files are selected using include and exclude constructs
@@ -102,7 +91,7 @@ public class Ejbc extends MatchingTask {
* The classpath to be used in the weblogic ejbc calls. It must contain the weblogic
* classes and the implementation classes of the home and remote interfaces.
*/
- private Path classpath;
+ private String classpath;
/**
* The source directory for the home and remote interfaces. This is used to determine if
@@ -140,53 +129,49 @@ public class Ejbc extends MatchingTask {
}
String systemClassPath = System.getProperty("java.class.path");
- Path execClassPath = new Path(project, classpath + ":" + generatedFilesDirectory + ":" + systemClassPath);
-
+ String execClassPath = project.translatePath(systemClassPath + ":" + classpath +
+ ":" + generatedFilesDirectory);
// get all the files in the descriptor directory
DirectoryScanner ds = super.getDirectoryScanner(descriptorDirectory);
- String[] descriptorNames = ds.getIncludedFiles();
-
+ String[] files = ds.getIncludedFiles();
- // create an class loader
- AntClassLoader loader = new AntClassLoader(project, execClassPath, false);
- loader.addSystemPackageRoot("org.apache.tools.ant");
- loader.addSystemPackageRoot("javax");
- try {
- Helper helper = (Helper)(loader.forceLoadClass("org.apache.tools.ant.taskdefs.optional.ejb.EjbcHelper").newInstance());
- helper.initialize(this);
- helper.setDescriptorDir(descriptorDirectory);
- helper.setDest(generatedFilesDirectory);
- helper.setManifest(generatedManifestFile);
- helper.setSrc(sourceDirectory);
- helper.setDescriptors(descriptorNames);
- helper.setClasspath(execClassPath);
- helper.execute();
- helper = null;
+ Java helperTask = (Java)project.createTask("java");
+ helperTask.setFork(true);
+ helperTask.setClassname("org.apache.tools.ant.taskdefs.optional.ejb.EjbcHelper");
+ String args = "";
+ args += " " + descriptorDirectory;
+ args += " " + generatedFilesDirectory;
+ args += " " + sourceDirectory;
+ args += " " + generatedManifestFile;
+ for (int i = 0; i < files.length; ++i) {
+ args += " " + files[i];
}
- catch (Exception e) {
- throw new BuildException(e);
+
+ helperTask.setArgs(args);
+ helperTask.setClasspath(new Path(project, execClassPath));
+ if (helperTask.executeJava() != 0) {
+ throw new BuildException("Execution of ejbc helper failed");
}
- loader = null;
}
/**
* Set the directory from where the serialised deployment descriptors are
* to be read.
*
- * @param dir the directory containing the serialised deployment descriptors.
+ * @param dirName the name of the directory containing the serialised deployment descriptors.
*/
- public void setDescriptors(File dir) {
- descriptorDirectory = dir;
+ public void setDescriptors(String dirName) {
+ descriptorDirectory = new File(dirName);
}
/**
* Set the directory into which the support classes, RMI stubs, etc are to be written
*
- * @param dir the directory into which code is generated
+ * @param dirName the name of the directory into which code is generated
*/
- public void setDest(File dir) {
- generatedFilesDirectory = dir;
+ public void setDest(String dirName) {
+ generatedFilesDirectory = new File(dirName);
}
/**
@@ -195,27 +180,27 @@ public class Ejbc extends MatchingTask {
* For each EJB that is processed an entry is created in this file. This can then be used
* to create a jar file for dploying the beans.
*
- * @param manfestFilename the manifest file to be generated.
+ * @param manfestFilename the name of the manifest file to be generated.
*/
- public void setManifest(File manifestFile) {
- generatedManifestFile = manifestFile;
+ public void setManifest(String manifestFilename) {
+ generatedManifestFile = new File(manifestFilename);
}
/**
* Set the classpath to be used for this compilation.
*/
- public void setClasspath(Path classpath) {
- this.classpath = classpath;
+ public void setClasspath(String s) {
+ this.classpath = project.translatePath(s);
}
/**
* Set the directory containing the source code for the home interface, remote interface
* and public key class definitions.
*
- * @param dir the directory containg the source tree for the EJB's interface classes.
+ * @param dirName the directory containg the source tree for the EJB's interface classes.
*/
- public void setSrc(File dir) {
- sourceDirectory = dir;
+ public void setSrc(String dirName) {
+ sourceDirectory = new File(dirName);
}
}
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbcHelper.java b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbcHelper.java
index 87a167bad..262ff887a 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbcHelper.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbcHelper.java
@@ -53,13 +53,16 @@
*/
package org.apache.tools.ant.taskdefs.optional.ejb;
-import java.io.*;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.ObjectInputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.FileWriter;
import javax.ejb.deployment.EntityDescriptor;
import javax.ejb.deployment.DeploymentDescriptor;
-import org.apache.tools.ant.*;
-import org.apache.tools.ant.types.Path;
/**
* A helper class which performs the actual work of the ejbc task.
@@ -69,7 +72,7 @@ import org.apache.tools.ant.types.Path;
*
* @author Conor MacNeill, Cortex ebusiness Pty Limited
*/
-public class EjbcHelper implements Ejbc.Helper {
+public class EjbcHelper {
/**
* The root directory of the tree containing the serialised deployment desciptors.
*/
@@ -89,127 +92,43 @@ public class EjbcHelper implements Ejbc.Helper {
* The classpath to be used in the weblogic ejbc calls. It must contain the weblogic
* classes and the implementation classes of the home and remote interfaces.
*/
- private Path classpath;
+ private String classpath;
/**
* The source directory for the home and remote interfaces. This is used to determine if
* the generated deployment classes are out of date.
*/
private File sourceDirectory;
-
- /**
- * The array of descriptor filenames to be processed
- */
- private String[] files;
-
- /**
- * The Ejbc task that this helper is helping
- */
- private Ejbc ejbcTask;
/**
* The names of the serialised deployment descriptors
*/
String[] descriptors;
- public EjbcHelper() {
- }
-
- public void initialize(Ejbc ejbcTask) {
- this.ejbcTask = ejbcTask;
- }
-
- /**
- * Set the directory from where the serialised deployment descriptors are
- * to be read.
- *
- * @param dir the directory containing the serialised deployment descriptors.
- */
- public void setDescriptorDir(File dir) {
- descriptorDirectory = dir;
- }
-
- /**
- * Set the directory into which the support classes, RMI stubs, etc are to be written
- *
- * @param dir the directory into which code is generated
- */
- public void setDest(File dir) {
- generatedFilesDirectory = dir;
- }
-
- /**
- * Set the generated manifest file.
- *
- * For each EJB that is processed an entry is created in this file. This can then be used
- * to create a jar file for dploying the beans.
- *
- * @param manfestFilename the manifest file to be generated.
- */
- public void setManifest(File manifestFile) {
- this.manifestFile = manifestFile;
- }
-
- /**
- * Set the classpath to be used for this compilation.
- */
- public void setClasspath(Path classpath) {
- this.classpath = classpath;
- }
-
/**
- * Set the list of desciptors which ar eto be processed.
- *
- * @param descriptors an array of serialised deployment descriptor filenames to be processed.
- */
- public void setDescriptors(String[] descriptors) {
- this.descriptors = descriptors;
+ * Command line interface for the ejbc helper task.
+ */
+ public static void main(String[] args) throws Exception {
+ EjbcHelper helper = new EjbcHelper(args);
+ helper.process();
}
-
-
/**
- * Set the directory containing the source code for the home interface, remote interface
- * and public key class definitions.
- *
- * @param dir the directory containg the source tree for the EJB's interface classes.
- */
- public void setSrc(File dir) {
- sourceDirectory = dir;
- }
-
- /**
- * Perform the weblogic compiles.
- */
- public void execute() throws BuildException {
- try {
- String manifest = "Manifest-Version: 1.0\n\n";
- for (int i = 0; i < descriptors.length; ++i) {
- String descriptorName = descriptors[i];
- File descriptorFile = new File(descriptorDirectory, descriptorName);
-
- if (isRegenRequired(descriptorFile)) {
- ejbcTask.log("Running ejbc for " + descriptorFile.getName(), Project.MSG_INFO);
- regenerateSupportClasses(descriptorFile);
- }
- else {
- ejbcTask.log(descriptorFile.getName() + " is up to date", Project.MSG_VERBOSE);
- }
- manifest += "Name: " + descriptorFile.getName() + "\nEnterprise-Bean: True\n\n";
- }
-
- FileWriter fw = new FileWriter(manifestFile);
- PrintWriter pw = new PrintWriter(fw);
- pw.print(manifest);
- fw.flush();
- fw.close();
- }
- catch (IOException e) {
- throw new BuildException(e);
+ * Initialise the EjbcHelper by reading the command arguments.
+ */
+ private EjbcHelper(String[] args) {
+ int index = 0;
+ descriptorDirectory = new File(args[index++]);
+ generatedFilesDirectory = new File(args[index++]);
+ sourceDirectory = new File(args[index++]);
+ manifestFile = new File(args[index++]);
+
+ descriptors = new String[args.length - index];
+ for (int i = 0; index < args.length; ++i) {
+ descriptors[i] = args[index++];
}
}
-
/**
* Determine if the weblogic EJB support classes need to be regenerated
* for a given deployment descriptor.
@@ -291,8 +210,7 @@ public class EjbcHelper implements Ejbc.Helper {
}
}
catch (Throwable descriptorLoadException) {
- ejbcTask.log("Exception occurred reading " + descriptorFile.getName() + " - continuing",
- Project.MSG_WARN);
+ System.out.println("Exception occurred reading " + descriptorFile.getName() + " - continuing");
// any problems - just regenerate
return true;
}
@@ -305,57 +223,56 @@ public class EjbcHelper implements Ejbc.Helper {
return false;
}
+ /**
+ * Process the descriptors in turn generating support classes for each and a manifest
+ * file for all of the beans.
+ */
+ private void process() throws Exception {
+ String manifest = "Manifest-Version: 1.0\n\n";
+ for (int i = 0; i < descriptors.length; ++i) {
+ String descriptorName = descriptors[i];
+ File descriptorFile = new File(descriptorDirectory, descriptorName);
+
+ if (isRegenRequired(descriptorFile)) {
+ System.out.println("Running ejbc for " + descriptorFile.getName());
+ regenerateSupportClasses(descriptorFile);
+ }
+ else {
+ System.out.println(descriptorFile.getName() + " is up to date");
+ }
+ manifest += "Name: " + descriptorFile.getName() + "\nEnterprise-Bean: True\n\n";
+ }
+
+ FileWriter fw = new FileWriter(manifestFile);
+ PrintWriter pw = new PrintWriter(fw);
+ pw.print(manifest);
+ fw.flush();
+ fw.close();
+ }
+
/**
* Perform the weblogic.ejbc call to regenerate the support classes.
*
* Note that this method relies on an undocumented -noexit option to the
* ejbc tool to stop the ejbc tool exiting the VM altogether.
*/
- private void regenerateSupportClasses(File descriptorFile) {
- Project project = ejbcTask.getProject();
- String javaHome = System.getProperty("java.home");
+ private void regenerateSupportClasses(File descriptorFile) throws Exception {
+ // create a Java task to do the rebuild
- String compiler = project.getProperty("build.compiler");
- String[] args = null;
+ String[] args = {"-noexit",
+ "-keepgenerated",
+ "-d", generatedFilesDirectory.getPath(),
+ descriptorFile.getPath()};
- if (compiler != null && compiler.equalsIgnoreCase("jikes")) {
- Path execClassPath = new Path(project);
- if (Project.getJavaVersion() == Project.JAVA_1_1) {
- execClassPath.addExisting(new Path(project, System.getProperty("java.home")
- + "/lib/classes.zip"));
- } else {
- execClassPath.addExisting(new Path(project,
- System.getProperty("java.home")
- + "/lib/rt.jar"));
- // Just keep the old version as well and let addExisting
- // sort it out.
- execClassPath.addExisting(new Path(project,
- System.getProperty("java.home")
- + "/jre/lib/rt.jar"));
- }
- execClassPath.append(classpath);
-
- args = new String[] {"-noexit",
- "-keepgenerated",
- "-compiler", "Jikes",
- "-d", generatedFilesDirectory.getPath(),
- "-classpath", execClassPath.toString(),
- descriptorFile.getPath()};
- }
- else {
- args = new String[]{"-noexit",
- "-keepgenerated",
- "-d", generatedFilesDirectory.getPath(),
- "-classpath", classpath.toString(),
- descriptorFile.getPath()};
- }
-
try {
weblogic.ejbc.main(args);
}
catch (Exception e) {
- e.printStackTrace();
- throw new BuildException(e);
+ // run with no exit for better reporting
+ String[] newArgs = {"-keepgenerated",
+ "-d", generatedFilesDirectory.getPath(),
+ descriptorFile.getPath()};
+ weblogic.ejbc.main(newArgs);
}
}
}