aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/JonasDeploymentTool.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/JonasDeploymentTool.java')
-rw-r--r--framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/JonasDeploymentTool.java835
1 files changed, 835 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/JonasDeploymentTool.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/JonasDeploymentTool.java
new file mode 100644
index 00000000..81fe8059
--- /dev/null
+++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/JonasDeploymentTool.java
@@ -0,0 +1,835 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.tools.ant.taskdefs.optional.ejb;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Hashtable;
+
+import javax.xml.parsers.SAXParser;
+
+import org.apache.tools.ant.AntClassLoader;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.Java;
+import org.apache.tools.ant.types.Path;
+
+/**
+ * The deployment tool to add the jonas specific deployment descriptors to the
+ * ejb JAR file. JONAS only requires one additional file jonas-ejb-jar.xml.
+ *
+ * @version 1.0
+ * @see EjbJar#createJonas
+ */
+public class JonasDeploymentTool extends GenericDeploymentTool {
+
+ /** Public Id of the standard deployment descriptor DTD. */
+ protected static final String EJB_JAR_1_1_PUBLIC_ID
+ = "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN";
+ protected static final String EJB_JAR_2_0_PUBLIC_ID
+ = "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN";
+
+ /** Public Id of the JOnAS-specific deployment descriptor DTD. */
+ protected static final String JONAS_EJB_JAR_2_4_PUBLIC_ID
+ = "-//ObjectWeb//DTD JOnAS 2.4//EN";
+ protected static final String JONAS_EJB_JAR_2_5_PUBLIC_ID
+ = "-//ObjectWeb//DTD JOnAS 2.5//EN";
+
+ /** RMI ORB. */
+ protected static final String RMI_ORB = "RMI";
+
+ /** JEREMIE ORB. */
+ protected static final String JEREMIE_ORB = "JEREMIE";
+
+ /** DAVID ORB. */
+ protected static final String DAVID_ORB = "DAVID";
+
+ /**
+ * Name of the standard deployment descriptor DTD (these files are stored in
+ * the ${JONAS_ROOT}/xml directory).
+ */
+ protected static final String EJB_JAR_1_1_DTD = "ejb-jar_1_1.dtd";
+ protected static final String EJB_JAR_2_0_DTD = "ejb-jar_2_0.dtd";
+
+ /**
+ * Name of the JOnAS-specific deployment descriptor DTD (these files are
+ * stored in the ${JONAS_ROOT}/xml directory).
+ */
+ protected static final String JONAS_EJB_JAR_2_4_DTD
+ = "jonas-ejb-jar_2_4.dtd";
+ protected static final String JONAS_EJB_JAR_2_5_DTD
+ = "jonas-ejb-jar_2_5.dtd";
+
+ /** Default JOnAS deployment descriptor name. */
+ protected static final String JONAS_DD = "jonas-ejb-jar.xml";
+
+ /** GenIC class name (JOnAS 2.5) */
+ protected static final String GENIC_CLASS =
+ "org.objectweb.jonas_ejb.genic.GenIC";
+
+ /** Old GenIC class name (JOnAS 2.4.x). */
+ protected static final String OLD_GENIC_CLASS_1 =
+ "org.objectweb.jonas_ejb.tools.GenWholeIC";
+
+ /** Old GenIC class name. */
+ protected static final String OLD_GENIC_CLASS_2 =
+ "org.objectweb.jonas_ejb.tools.GenIC";
+
+ /**
+ * Filename of the standard EJB descriptor (which is passed to this class
+ * from the parent "ejbjar" task). This file is relative to the directory
+ * specified by the "srcdir" attribute in the ejbjar task.
+ */
+ private String descriptorName;
+
+ /**
+ * Filename of the JOnAS-specific EJB descriptor (which is passed to this
+ * class from the parent "ejbjar" task). This file is relative to the
+ * directory specified by the "srcdir" attribute in the ejbjar task.
+ */
+ private String jonasDescriptorName;
+
+ /* ------------- */
+ /* GenIC options */
+ /* ------------- */
+
+ /**
+ * Temporary output directory used by GenIC.
+ */
+ private File outputdir;
+
+ /**
+ * <code>true</code> if the intermediate Java source files generated by
+ * GenIC must be deleted or not. The default is <code>false</code>
+ */
+ private boolean keepgenerated = false;
+
+ /**
+ * <code>true</code> if the generated source files must not be compiled via
+ * the java and rmi compilers. The default is <code>false</code>.
+ */
+ private boolean nocompil = false;
+
+ /**
+ * <code>true</code> if the XML deployment descriptors must be parsed
+ * without validation. The default is <code>false</code>.
+ */
+ private boolean novalidation = false;
+
+ /**
+ * Java compiler to use. The default is the value of
+ * <code>build.compiler</code> property.
+ */
+ private String javac;
+
+ /** Options to pass to the java compiler. */
+ private String javacopts;
+
+ /** Options to pass to the rmi compiler. */
+ private String rmicopts;
+
+ /**
+ * Whether or not the RMI skeleton and stub must be modified to
+ * implement the implicit propagation of the security context (the
+ * transactional context is always provided). The default is
+ * <code>false</code>.
+ */
+ private boolean secpropag = false;
+
+ /**
+ * <code>true</code> if the GenIC call must be verbose. The default
+ * is <code>false</code>.
+ */
+ private boolean verbose = false;
+
+ /** Additional args to send to GenIC. */
+ private String additionalargs;
+
+ /* ------------- */
+ /* other options */
+ /* ------------- */
+
+ /** JOnAS root directory. */
+ private File jonasroot;
+
+ /**
+ * <code>true</code> if the generic JAR file used as input to GenIC must be
+ * retained. The default is <code>false</code>.
+ */
+ private boolean keepgeneric = false;
+
+ /** Stores the suffix for the JOnAS JAR file. The default is '.jar'. */
+ private String suffix = ".jar";
+
+ /**
+ * ORB to use (RMI, JEREMIE or DAVID). If omitted, it defaults to the one
+ * present in classpath. If specified, the corresponding JOnAS JAR is
+ * automatically added to the classpath.
+ */
+ private String orb;
+
+ /**
+ * <code>true</code> if GenIC must not be run on the EJB JAR.
+ * The default is <code>false</code>.
+ */
+ private boolean nogenic = false;
+
+ /* -------------------- */
+ /* GenIC options setter */
+ /* -------------------- */
+
+ /**
+ * Sets the <code>keepgenerated</code> flag.
+ *
+ * @param aBoolean <code>true</code> if the flag must be set.
+ */
+ public void setKeepgenerated(boolean aBoolean) {
+ keepgenerated = aBoolean;
+ }
+
+ /**
+ * Sets the additional arguments.
+ *
+ * @param aString additional args.
+ */
+ public void setAdditionalargs(String aString) {
+ additionalargs = aString;
+ }
+
+ /**
+ * Sets the <code>nocompil</code> flag.
+ *
+ * @param aBoolean <code>true</code> if the flag must be set.
+ */
+ public void setNocompil(boolean aBoolean) {
+ nocompil = aBoolean;
+ }
+
+ /**
+ * Sets the <code>novalidation</code> flag.
+ *
+ * @param aBoolean <code>true</code> if the flag must be set.
+ */
+ public void setNovalidation(boolean aBoolean) {
+ novalidation = aBoolean;
+ }
+
+ /**
+ * Sets the java compiler to use.
+ *
+ * @param aString the java compiler.
+ */
+ public void setJavac(String aString) {
+ javac = aString;
+ }
+
+ /**
+ * Set the options to pass to the java compiler.
+ *
+ * @param aString the options.
+ */
+ public void setJavacopts(String aString) {
+ javacopts = aString;
+ }
+
+ /**
+ * Set the options to pass to the rmi compiler.
+ *
+ * @param aString the options.
+ */
+ public void setRmicopts(String aString) {
+ rmicopts = aString;
+ }
+
+ /**
+ * Sets the <code>secpropag</code> flag.
+ *
+ * @param aBoolean <code>true</code> if the flag must be set.
+ */
+ public void setSecpropag(boolean aBoolean) {
+ secpropag = aBoolean;
+ }
+
+ /**
+ * Sets the <code>verbose</code> flag.
+ *
+ * @param aBoolean <code>true</code> if the flag must be set.
+ */
+ public void setVerbose(boolean aBoolean) {
+ verbose = aBoolean;
+ }
+
+ /* -------------------- */
+ /* other options setter */
+ /* -------------------- */
+
+ /**
+ * Set the JOnAS root directory.
+ *
+ * @param aFile the JOnAS root directory.
+ */
+ public void setJonasroot(File aFile) {
+ jonasroot = aFile;
+ }
+
+ /**
+ * Sets the <code>keepgeneric</code> flag.
+ *
+ * @param aBoolean <code>true</code> if the flag must be set.
+ */
+ public void setKeepgeneric(boolean aBoolean) {
+ keepgeneric = aBoolean;
+ }
+
+ /**
+ * Sets the jar suffix.
+ *
+ * @param aString the string to use as the suffix.
+ */
+ public void setJarsuffix(String aString) {
+ suffix = aString;
+ }
+
+ /**
+ * Sets the <code>orb</code> to construct classpath.
+ *
+ * @param aString 'RMI', 'JEREMIE', or 'DAVID'.
+ */
+ public void setOrb(String aString) {
+ orb = aString;
+ }
+
+ /**
+ * Sets the <code>nogenic</code> flag.
+ *
+ * @param aBoolean <code>true</code> if the flag must be set.
+ */
+ public void setNogenic(boolean aBoolean) {
+ nogenic = aBoolean;
+ }
+
+ /* ------------- */
+ /* other methods */
+ /* ------------- */
+
+ /** {@inheritDoc}. */
+ public void processDescriptor(String aDescriptorName, SAXParser saxParser) {
+
+ descriptorName = aDescriptorName;
+
+ log("JOnAS Deployment Tool processing: " + descriptorName,
+ Project.MSG_VERBOSE);
+
+ super.processDescriptor(descriptorName, saxParser);
+
+ if (outputdir != null) {
+ // the method deleteOnExit() do not work because the directory is not empty
+ log("Deleting temp output directory '" + outputdir + "'.", Project.MSG_VERBOSE);
+ deleteAllFiles(outputdir);
+ }
+ }
+
+ /** {@inheritDoc}. */
+ protected void writeJar(String baseName, File jarfile, Hashtable ejbFiles, String publicId)
+ throws BuildException {
+
+ // create the generic jar first
+ File genericJarFile = super.getVendorOutputJarFile(baseName);
+ super.writeJar(baseName, genericJarFile, ejbFiles, publicId);
+
+ // GenIC call on generic jar
+ addGenICGeneratedFiles(genericJarFile, ejbFiles);
+
+ // create the real jar
+ super.writeJar(baseName, getVendorOutputJarFile(baseName), ejbFiles, publicId);
+
+ if (!keepgeneric) {
+ log("Deleting generic JAR " + genericJarFile.toString(), Project.MSG_VERBOSE);
+ genericJarFile.delete();
+ }
+ }
+
+ /** {@inheritDoc}. */
+ protected void addVendorFiles(Hashtable ejbFiles, String ddPrefix) {
+
+ // JOnAS-specific descriptor deployment
+ jonasDescriptorName = getJonasDescriptorName();
+ File jonasDD = new File(getConfig().descriptorDir, jonasDescriptorName);
+
+ if (jonasDD.exists()) {
+ ejbFiles.put(META_DIR + JONAS_DD, jonasDD);
+ } else {
+ log("Unable to locate the JOnAS deployment descriptor. It was expected to be in: "
+ + jonasDD.getPath() + ".", Project.MSG_WARN);
+ }
+ }
+
+ /** {@inheritDoc}. */
+ protected File getVendorOutputJarFile(String baseName) {
+ return new File(getDestDir(), baseName + suffix);
+ }
+
+ /**
+ * Determines the name of the JOnAS-specific EJB descriptor using the
+ * specified standard EJB descriptor name. In general, the standard
+ * descriptor will be named "[basename]-ejb-jar.xml", and this method will
+ * return "[basename]-jonas-ejb-jar.xml" or "jonas-[basename].xml"
+ *
+ * @return The name of the JOnAS-specific EJB descriptor file.
+ */
+ private String getJonasDescriptorName() {
+
+ // descriptorName = <path><basename><basenameterminator><remainder>
+ // examples = /org/objectweb/fooAppli/foo/Foo-ejb-jar.xml
+ // examples = /org/objectweb/fooAppli/foo/Foo.xml (JOnAS convention)
+
+ String jonasDN; // JOnAS-specific DD
+ boolean jonasConvention = false; // true if the JOnAS convention is used for the DD
+ String path; // Directory path of the EJB descriptor
+ String fileName; // EJB descriptor file name
+ String baseName; // Filename appearing before name terminator
+ String remainder; // Filename appearing after the name terminator
+
+ int startOfFileName = descriptorName.lastIndexOf(File.separatorChar);
+ if (startOfFileName != -1) {
+ // extract path info
+ path = descriptorName.substring(0, startOfFileName + 1);
+ fileName = descriptorName.substring(startOfFileName + 1);
+ } else {
+ // descriptorName is just a file without path
+ path = "";
+ fileName = descriptorName;
+ }
+
+ if (fileName.startsWith(EJB_DD)) {
+ return path + JONAS_DD;
+ }
+
+ int endOfBaseName = descriptorName.indexOf(getConfig().baseNameTerminator, startOfFileName);
+
+ /*
+ * Check for the odd case where the terminator and/or filename
+ * extension aren't found. These will ensure "jonas-" appears at the
+ * end of the name and before the '.' (if present).
+ */
+ if (endOfBaseName < 0) {
+ // baseNameTerminator not found: the descriptor use the
+ // JOnAS naming convention, ie [Foo.xml,jonas-Foo.xml] and
+ // not [Foo<baseNameTerminator>-ejb-jar.xml,
+ // Foo<baseNameTerminator>-jonas-ejb-jar.xml].
+ endOfBaseName = descriptorName.lastIndexOf('.') - 1;
+ if (endOfBaseName < 0) {
+ // no . found
+ endOfBaseName = descriptorName.length() - 1;
+ }
+
+ jonasConvention = true;
+ }
+
+ baseName = descriptorName.substring(startOfFileName + 1, endOfBaseName + 1);
+ remainder = descriptorName.substring(endOfBaseName + 1);
+
+ if (jonasConvention) {
+ jonasDN = path + "jonas-" + baseName + ".xml";
+ } else {
+ jonasDN = path + baseName + "jonas-" + remainder;
+ }
+
+ log("Standard EJB descriptor name: " + descriptorName, Project.MSG_VERBOSE);
+ log("JOnAS-specific descriptor name: " + jonasDN, Project.MSG_VERBOSE);
+
+ return jonasDN;
+ }
+
+ /** {@inheritDoc}. */
+ protected String getJarBaseName(String descriptorFileName) {
+
+ String baseName = null;
+
+ if (getConfig().namingScheme.getValue().equals(EjbJar.NamingScheme.DESCRIPTOR)) {
+
+ // try to find JOnAS specific convention name
+ if (descriptorFileName.indexOf(getConfig().baseNameTerminator) == -1) {
+
+ // baseNameTerminator not found: the descriptor use the
+ // JOnAS naming convention, ie [Foo.xml,jonas-Foo.xml] and
+ // not [Foo<baseNameTerminator>-ejb-jar.xml,
+ // Foo<baseNameTerminator>-jonas-ejb-jar.xml].
+
+ String aCanonicalDescriptor = descriptorFileName.replace('\\', '/');
+ int lastSeparatorIndex = aCanonicalDescriptor.lastIndexOf('/');
+ int endOfBaseName;
+
+ if (lastSeparatorIndex != -1) {
+ endOfBaseName = descriptorFileName.indexOf(".xml", lastSeparatorIndex);
+ } else {
+ endOfBaseName = descriptorFileName.indexOf(".xml");
+ }
+
+ if (endOfBaseName != -1) {
+ baseName = descriptorFileName.substring(0, endOfBaseName);
+ }
+ }
+ }
+
+ if (baseName == null) {
+ // else get standard baseName
+ baseName = super.getJarBaseName(descriptorFileName);
+ }
+
+ log("JAR base name: " + baseName, Project.MSG_VERBOSE);
+
+ return baseName;
+ }
+
+ /** {@inheritDoc}. */
+ protected void registerKnownDTDs(DescriptorHandler handler) {
+ handler.registerDTD(EJB_JAR_1_1_PUBLIC_ID,
+ jonasroot + File.separator + "xml" + File.separator + EJB_JAR_1_1_DTD);
+ handler.registerDTD(EJB_JAR_2_0_PUBLIC_ID,
+ jonasroot + File.separator + "xml" + File.separator + EJB_JAR_2_0_DTD);
+
+ handler.registerDTD(JONAS_EJB_JAR_2_4_PUBLIC_ID,
+ jonasroot + File.separator + "xml" + File.separator + JONAS_EJB_JAR_2_4_DTD);
+ handler.registerDTD(JONAS_EJB_JAR_2_5_PUBLIC_ID,
+ jonasroot + File.separator + "xml" + File.separator + JONAS_EJB_JAR_2_5_DTD);
+ }
+
+ /**
+ * Add to the given hashtable all the file generated by GenIC.
+ *
+ * @param genericJarFile jar file.
+ * @param ejbFiles the hashtable.
+ */
+ private void addGenICGeneratedFiles(
+ File genericJarFile, Hashtable ejbFiles) {
+ Java genicTask = null; // GenIC task
+ String genicClass = null; // GenIC class (3 are supported for various
+ // versions
+ if (nogenic) {
+ return;
+ }
+
+ genicTask = new Java(getTask());
+ genicTask.setTaskName("genic");
+ genicTask.setFork(true);
+
+ // jonasroot
+ genicTask.createJvmarg().setValue("-Dinstall.root=" + jonasroot);
+
+ // java policy file
+ String jonasConfigDir = jonasroot + File.separator + "config";
+ File javaPolicyFile = new File(jonasConfigDir, "java.policy");
+ if (javaPolicyFile.exists()) {
+ genicTask.createJvmarg().setValue("-Djava.security.policy="
+ + javaPolicyFile.toString());
+ }
+
+ // outputdir
+ try {
+ outputdir = createTempDir();
+ } catch (IOException aIOException) {
+ String msg = "Cannot create temp dir: " + aIOException.getMessage();
+ throw new BuildException(msg, aIOException);
+ }
+ log("Using temporary output directory: " + outputdir, Project.MSG_VERBOSE);
+
+ genicTask.createArg().setValue("-d");
+ genicTask.createArg().setFile(outputdir);
+
+ // work around a bug of GenIC 2.5
+ String key;
+ File f;
+ Enumeration keys = ejbFiles.keys();
+ while (keys.hasMoreElements()) {
+ key = (String) keys.nextElement();
+ f = new File(outputdir + File.separator + key);
+ f.getParentFile().mkdirs();
+ }
+ log("Worked around a bug of GenIC 2.5.", Project.MSG_VERBOSE);
+
+ // classpath
+ Path classpath = getCombinedClasspath();
+ if (classpath == null) {
+ classpath = new Path(getTask().getProject());
+ }
+ classpath.append(new Path(classpath.getProject(), jonasConfigDir));
+ classpath.append(new Path(classpath.getProject(), outputdir.toString()));
+
+ // try to create the classpath for the correct ORB
+ if (orb != null) {
+ String orbJar = jonasroot + File.separator + "lib"
+ + File.separator + orb + "_jonas.jar";
+ classpath.append(new Path(classpath.getProject(), orbJar));
+ }
+ log("Using classpath: " + classpath.toString(), Project.MSG_VERBOSE);
+ genicTask.setClasspath(classpath);
+
+ // class name (search in the classpath provided for the ejbjar element)
+ genicClass = getGenicClassName(classpath);
+ if (genicClass == null) {
+ log("Cannot find GenIC class in classpath.", Project.MSG_ERR);
+ throw new BuildException("GenIC class not found, please check the classpath.");
+ } else {
+ log("Using '" + genicClass + "' GenIC class." , Project.MSG_VERBOSE);
+ genicTask.setClassname(genicClass);
+ }
+
+ // keepgenerated
+ if (keepgenerated) {
+ genicTask.createArg().setValue("-keepgenerated");
+ }
+
+ // nocompil
+ if (nocompil) {
+ genicTask.createArg().setValue("-nocompil");
+ }
+
+ // novalidation
+ if (novalidation) {
+ genicTask.createArg().setValue("-novalidation");
+ }
+
+ // javac
+ if (javac != null) {
+ genicTask.createArg().setValue("-javac");
+ genicTask.createArg().setLine(javac);
+ }
+
+ // javacopts
+ if (javacopts != null && !javacopts.equals("")) {
+ genicTask.createArg().setValue("-javacopts");
+ genicTask.createArg().setLine(javacopts);
+ }
+
+ // rmicopts
+ if (rmicopts != null && !rmicopts.equals("")) {
+ genicTask.createArg().setValue("-rmicopts");
+ genicTask.createArg().setLine(rmicopts);
+ }
+
+ // secpropag
+ if (secpropag) {
+ genicTask.createArg().setValue("-secpropag");
+ }
+
+ // verbose
+ if (verbose) {
+ genicTask.createArg().setValue("-verbose");
+ }
+
+ // additionalargs
+ if (additionalargs != null) {
+ genicTask.createArg().setValue(additionalargs);
+ }
+
+ // the generated classes must not be added in the generic JAR!
+ // is that buggy on old JOnAS (2.4) ??
+ genicTask.createArg().setValue("-noaddinjar");
+
+ // input file to process by GenIC
+ genicTask.createArg().setValue(genericJarFile.getPath());
+
+ // calling GenIC task
+ log("Calling " + genicClass + " for " + getConfig().descriptorDir
+ + File.separator + descriptorName + ".", Project.MSG_VERBOSE);
+
+ if (genicTask.executeJava() != 0) {
+
+ // the method deleteOnExit() do not work because the directory is not empty
+ log("Deleting temp output directory '" + outputdir + "'.", Project.MSG_VERBOSE);
+ deleteAllFiles(outputdir);
+
+ if (!keepgeneric) {
+ log("Deleting generic JAR " + genericJarFile.toString(),
+ Project.MSG_VERBOSE);
+ genericJarFile.delete();
+ }
+
+ throw new BuildException("GenIC reported an error.");
+ }
+
+ // add the generated files to the ejbFiles
+ addAllFiles(outputdir, "", ejbFiles);
+ }
+
+ /**
+ * Get the GenIC class name to use in the given classpath.
+ *
+ * @param classpath classpath where the GenIC class must be searched.
+ * @return the GenIC class name. Return <code>null</code> if the class name
+ * cannot be found.
+ */
+ String getGenicClassName(Path classpath) {
+
+ log("Looking for GenIC class in classpath: "
+ + classpath.toString(), Project.MSG_VERBOSE);
+
+ AntClassLoader cl = null;
+
+ try {
+ cl = classpath.getProject().createClassLoader(classpath);
+
+ try {
+ cl.loadClass(JonasDeploymentTool.GENIC_CLASS);
+ log("Found GenIC class '" + JonasDeploymentTool.GENIC_CLASS
+ + "' in classpath.", Project.MSG_VERBOSE);
+ return JonasDeploymentTool.GENIC_CLASS;
+
+ } catch (ClassNotFoundException cnf1) {
+ log("GenIC class '" + JonasDeploymentTool.GENIC_CLASS
+ + "' not found in classpath.",
+ Project.MSG_VERBOSE);
+ }
+
+ try {
+ cl.loadClass(JonasDeploymentTool.OLD_GENIC_CLASS_1);
+ log("Found GenIC class '"
+ + JonasDeploymentTool.OLD_GENIC_CLASS_1
+ + "' in classpath.", Project.MSG_VERBOSE);
+ return JonasDeploymentTool.OLD_GENIC_CLASS_1;
+
+ } catch (ClassNotFoundException cnf2) {
+ log("GenIC class '" + JonasDeploymentTool.OLD_GENIC_CLASS_1
+ + "' not found in classpath.",
+ Project.MSG_VERBOSE);
+ }
+
+ try {
+ cl.loadClass(JonasDeploymentTool.OLD_GENIC_CLASS_2);
+ log("Found GenIC class '"
+ + JonasDeploymentTool.OLD_GENIC_CLASS_2
+ + "' in classpath.", Project.MSG_VERBOSE);
+ return JonasDeploymentTool.OLD_GENIC_CLASS_2;
+
+ } catch (ClassNotFoundException cnf3) {
+ log("GenIC class '" + JonasDeploymentTool.OLD_GENIC_CLASS_2
+ + "' not found in classpath.",
+ Project.MSG_VERBOSE);
+ }
+ } finally {
+ if (cl != null) {
+ cl.cleanup();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Verify the configuration.
+ * @param descriptorFileName the name of the descriptor file.
+ * @param saxParser not used.
+ * @throws BuildException if there is an error.
+ */
+ protected void checkConfiguration(String descriptorFileName,
+ SAXParser saxParser) throws BuildException {
+
+ // jonasroot
+ if (jonasroot == null) {
+ throw new BuildException("The jonasroot attribut is not set.");
+ } else if (!jonasroot.isDirectory()) {
+ throw new BuildException("The jonasroot attribut '" + jonasroot
+ + "' is not a valid directory.");
+ }
+
+ // orb
+ if (orb != null && !orb.equals(RMI_ORB) && !orb.equals(JEREMIE_ORB)
+ && !orb.equals(DAVID_ORB)) {
+ throw new BuildException("The orb attribut '" + orb
+ + "' is not valid (must be either "
+ + RMI_ORB + ", " + JEREMIE_ORB + " or " + DAVID_ORB + ").");
+ }
+
+ // additionalargs
+ if (additionalargs != null && additionalargs.equals("")) {
+ throw new BuildException("Empty additionalargs attribut.");
+ }
+
+ // javac
+ if (javac != null && javac.equals("")) {
+ throw new BuildException("Empty javac attribut.");
+ }
+ }
+
+ /* ----------------------------------------------------------------------------------- */
+ /* utilitary methods */
+ /* ----------------------------------------------------------------------------------- */
+
+ /**
+ * Create a temporary directory for GenIC output.
+ *
+ * @return the temp directory.
+ * @throws BuildException if a temp directory cannot be created.
+ */
+ private File createTempDir() throws IOException {
+ File tmpDir = File.createTempFile("genic", null, null);
+ tmpDir.delete();
+ if (!tmpDir.mkdir()) {
+ throw new IOException("Cannot create the temporary directory '" + tmpDir + "'.");
+ }
+ return tmpDir;
+ }
+
+ /**
+ * Delete a file. If the file is a directory, delete recursivly all the
+ * files inside.
+ *
+ * @param aFile file to delete.
+ */
+ private void deleteAllFiles(File aFile) {
+ if (aFile.isDirectory()) {
+ File[] someFiles = aFile.listFiles();
+
+ for (int i = 0; i < someFiles.length; i++) {
+ deleteAllFiles(someFiles[i]);
+ }
+ }
+ aFile.delete();
+ }
+
+ /**
+ * Add a file to the a given hashtable. If the file is a directory, add
+ * recursivly all the files inside to the hashtable.
+ *
+ * @param file the file to add.
+ * @param rootDir the current sub-directory to scan.
+ * @param hashtable the hashtable where to add the files.
+ */
+ private void addAllFiles(File file, String rootDir, Hashtable hashtable) {
+
+ if (!file.exists()) {
+ throw new IllegalArgumentException();
+ }
+
+ String newRootDir;
+ if (file.isDirectory()) {
+ File[] files = file.listFiles();
+ for (int i = 0; i < files.length; i++) {
+ if (rootDir.length() > 0) {
+ newRootDir = rootDir + File.separator + files[i].getName();
+ } else {
+ newRootDir = files[i].getName();
+ }
+ addAllFiles(files[i], newRootDir, hashtable);
+ }
+ } else {
+ hashtable.put(rootDir, file);
+ }
+ }
+}