From 7f8661c6d83fee5174b6be35ae3c06671f8f0eea Mon Sep 17 00:00:00 2001 From: Conor MacNeill Date: Wed, 5 Jul 2000 15:36:14 +0000 Subject: [PATCH] Tasks for EJB development under Weblogic Server 4.51 This consists of four tasks - (documentation is coming) ddcreator - converts deployment descriptors form text description to .ser files ejbc - wrapper around weblogic ejbc compiler wlrun - a task to run a weblogic server wlstop - a task to stop a weblogic server The last two tasks are most useful when they can be run asynchronously (also coming). git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@267736 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 9 +- .../tools/ant/taskdefs/defaults.properties | 4 + .../ant/taskdefs/optional/ejb/DDCreator.java | 162 ++++++++++ .../optional/ejb/DDCreatorHelper.java | 149 ++++++++++ .../tools/ant/taskdefs/optional/ejb/Ejbc.java | 200 +++++++++++++ .../ant/taskdefs/optional/ejb/EjbcHelper.java | 278 ++++++++++++++++++ .../ant/taskdefs/optional/ejb/WLRun.java | 224 ++++++++++++++ .../ant/taskdefs/optional/ejb/WLStop.java | 168 +++++++++++ 8 files changed, 1193 insertions(+), 1 deletion(-) create mode 100644 src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreator.java create mode 100644 src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreatorHelper.java create mode 100644 src/main/org/apache/tools/ant/taskdefs/optional/ejb/Ejbc.java create mode 100644 src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbcHelper.java create mode 100644 src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLRun.java create mode 100644 src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLStop.java diff --git a/build.xml b/build.xml index 3f93b5e2e..6f6dfbdf4 100644 --- a/build.xml +++ b/build.xml @@ -41,6 +41,9 @@ classname="com.kvisco.xsl.XSLProcessor" /> + + + @@ -64,11 +67,15 @@ deprecation="off" optimize="on" > + - + + + + diff --git a/src/main/org/apache/tools/ant/taskdefs/defaults.properties b/src/main/org/apache/tools/ant/taskdefs/defaults.properties index 6fb1354f5..28e33270b 100644 --- a/src/main/org/apache/tools/ant/taskdefs/defaults.properties +++ b/src/main/org/apache/tools/ant/taskdefs/defaults.properties @@ -38,6 +38,10 @@ touch=org.apache.tools.ant.taskdefs.Touch script=org.apache.tools.ant.taskdefs.optional.Script netrexxc=org.apache.tools.ant.taskdefs.optional.NetRexxC renameext=org.apache.tools.ant.taskdefs.optional.RenameExtensions +ejbc=org.apache.tools.ant.taskdefs.optional.ejb.Ejbc +ddcreator=org.apache.tools.ant.taskdefs.optional.ejb.DDCreator +wlrun=org.apache.tools.ant.taskdefs.optional.ejb.WLRun +wlstop=org.apache.tools.ant.taskdefs.optional.ejb.WLStop # deprecated ant tasks (kept for back compatibility) javadoc2=org.apache.tools.ant.taskdefs.Javadoc diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreator.java b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreator.java new file mode 100644 index 000000000..7d54b8f87 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreator.java @@ -0,0 +1,162 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.taskdefs.optional.ejb; + +import org.apache.tools.ant.*; +import org.apache.tools.ant.taskdefs.*; + +import java.io.File; + +/** + * Build a serialised deployment descriptor given a text file description of the + * descriptor in the format supported by WebLogic. + * + * This ant task is a front end for the weblogic DDCreator tool. + * + * @author Conor MacNeill, Cortex ebusiness Pty Limited + */ +public class DDCreator extends MatchingTask { + /** + * The root directory of the tree containing the textual deployment desciptors. The actual + * deployment descriptor files are selected using include and exclude constructs + * on the EJBC task, as supported by the MatchingTask superclass. + */ + private File descriptorDirectory; + + /** + * The directory where generated serialised deployment descriptors are placed. + */ + private File generatedFilesDirectory; + + /** + * The classpath to be used in the weblogic ejbc calls. It must contain the weblogic + * classes necessary fro DDCreator and the implementation classes of the + * home and remote interfaces. + */ + private String classpath; + + /** + * Do the work. + * + * The work is actually done by creating a helper task. This approach allows + * the classpath of the helper task to be set. Since the weblogic tools require + * the class files of the project's home and remote interfaces to be available in + * the classpath, this also avoids having to start ant with the class path of the + * project it is building. + * + * @exception BuildException if someting goes wrong with the build + */ + public void execute() throws BuildException { + if (!descriptorDirectory.isDirectory()) { + throw new BuildException("descriptors directory " + descriptorDirectory.getPath() + + " is not valid"); + } + if (!generatedFilesDirectory.isDirectory()) { + throw new BuildException("dest directory " + generatedFilesDirectory.getPath() + + " is not valid"); + } + + String args = descriptorDirectory + " " + generatedFilesDirectory; + + // get all the files in the descriptor directory + DirectoryScanner ds = super.getDirectoryScanner(descriptorDirectory); + + String[] files = ds.getIncludedFiles(); + + for (int i = 0; i < files.length; ++i) { + args += " " + files[i]; + } + + String systemClassPath = System.getProperty("java.class.path"); + String execClassPath = project.translatePath(systemClassPath + ":" + classpath); + Java ddCreatorTask = (Java)project.createTask("java"); + ddCreatorTask.setFork("yes"); + ddCreatorTask.setClassname("org.apache.tools.ant.taskdefs.optional.ejb.DDCreatorHelper"); + ddCreatorTask.setArgs(args); + ddCreatorTask.setClasspath(execClassPath); + if (ddCreatorTask.executeJava() != 0) { + throw new BuildException("Execution of ddcreator helper failed"); + } + } + + /** + * Set the directory from where the text descriptions of the deployment descriptors are + * to be read. + * + * @param dirName the name of the directory containing the text deployment descriptor files. + */ + public void setDescriptors(String dirName) { + descriptorDirectory = new File(dirName); + } + + /** + * Set the directory into which the serialised deployment descriptors are to + * be written. + * + * @param dirName the name of the directory into which the serialised deployment + * descriptors are written. + */ + public void setDest(String dirName) { + generatedFilesDirectory = new File(dirName); + } + + /** + * Set the classpath to be used for this compilation. + * + * @param s the classpath to use for the ddcreator tool. + */ + public void setClasspath(String s) { + this.classpath = project.translatePath(s); + } +} diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreatorHelper.java b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreatorHelper.java new file mode 100644 index 000000000..5cbb736ca --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DDCreatorHelper.java @@ -0,0 +1,149 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.taskdefs.optional.ejb; + +import java.io.File; + +/** + * A helper class which performs the actual work of the ddcreator task. + * + * This class is run with a classpath which includes the weblogic tools and the home and remote + * interface class files referenced in the deployment descriptors being built. + * + * @author Conor MacNeill, Cortex ebusiness Pty Limited + */ +public class DDCreatorHelper { + /** + * The root directory of the tree containing the textual deployment desciptors. + */ + private File descriptorDirectory; + + /** + * The directory where generated serialised desployment descriptors are written. + */ + private File generatedFilesDirectory; + + /** + * The descriptor text files for which a serialised descriptor is to be created. + */ + String[] descriptors; + + /** + * The main method. + * + * The main method creates an instance of the DDCreatorHelper, passing it the + * args which it then processes. + */ + public static void main(String[] args) throws Exception { + DDCreatorHelper helper = new DDCreatorHelper(args); + helper.process(); + } + + /** + * Initialise the helper with the command arguments. + * + */ + private DDCreatorHelper(String[] args) { + int index = 0; + descriptorDirectory = new File(args[index++]); + generatedFilesDirectory = new File(args[index++]); + + descriptors = new String[args.length - index]; + for (int i = 0; index < args.length; ++i) { + descriptors[i] = args[index++]; + } + } + + /** + * Do the actual work. + * + * The work proceeds by examining each descriptor given. If the serialised + * file does not exist or is older than the text description, the weblogic + * DDCreator tool is invoked directly to build the serialised descriptor. + */ + private void process() throws Exception { + for (int i = 0; i < descriptors.length; ++i) { + String descriptorName = descriptors[i]; + File descriptorFile = new File(descriptorDirectory, descriptorName); + int extIndex = descriptorName.lastIndexOf("."); + String serName = null; + if (extIndex != -1) { + serName = descriptorName.substring(0, extIndex) + ".ser"; + } + else { + serName = descriptorName + ".ser"; + } + File serFile = new File(generatedFilesDirectory, serName); + + // do we need to regenerate the file + if (!serFile.exists() || serFile.lastModified() < descriptorFile.lastModified()) { + + String[] args = {"-noexit", + "-d", generatedFilesDirectory.getPath(), + "-outputfile", serFile.getName(), + descriptorFile.getPath()}; + try { + weblogic.ejb.utils.DDCreator.main(args); + } + catch (Exception e) { + // there was an exception - run with no exit to get proper error + String[] newArgs = {"-d", generatedFilesDirectory.getPath(), + "-outputfile", serFile.getName(), + descriptorFile.getPath()}; + weblogic.ejb.utils.DDCreator.main(newArgs); + } + } + } + } +} 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 new file mode 100644 index 000000000..483d6fe72 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/Ejbc.java @@ -0,0 +1,200 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.taskdefs.optional.ejb; + + +import org.apache.tools.ant.*; +import org.apache.tools.ant.taskdefs.*; + +import java.io.File; + +/** + * Build EJB support classes using Weblogic's ejbc tool from a directory containing + * a set of deployment descriptors. + + * + * @author Conor MacNeill, Cortex ebusiness Pty Limited + */ +public class Ejbc extends MatchingTask { + /** + * The root directory of the tree containing the serialised deployment desciptors. The actual + * deployment descriptor files are selected using include and exclude constructs + * on the ejbc task provided by the MatchingTask superclass. + */ + private File descriptorDirectory; + + /** + * The directory where generated files are placed. + */ + private File generatedFilesDirectory; + + /** + * The name of the manifest file generated for the EJB jar. + */ + private File generatedManifestFile; + + /** + * 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 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; + + /** + * Do the work. + * + * The work is actually done by creating a separate JVM to run a helper task. + * This approach allows the classpath of the helper task to be set. Since the + * weblogic tools require the class files of the project's home and remote + * interfaces to be available in the classpath, this also avoids having to + * start ant with the class path of the project it is building. + * + * @exception BuildException if someting goes wrong with the build + */ + public void execute() throws BuildException { + if (!descriptorDirectory.isDirectory()) { + throw new BuildException("descriptors directory " + descriptorDirectory.getPath() + + " is not valid"); + } + if (!generatedFilesDirectory.isDirectory()) { + throw new BuildException("dest directory " + generatedFilesDirectory.getPath() + + " is not valid"); + } + + if (!sourceDirectory.isDirectory()) { + throw new BuildException("src directory " + sourceDirectory.getPath() + + " is not valid"); + } + + String systemClassPath = System.getProperty("java.class.path"); + String execClassPath = project.translatePath(systemClassPath + ":" + classpath + + ":" + generatedFilesDirectory); + // get all the files in the descriptor directory + DirectoryScanner ds = super.getDirectoryScanner(descriptorDirectory); + + String[] files = ds.getIncludedFiles(); + + Java helperTask = (Java)project.createTask("java"); + helperTask.setFork("yes"); + 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]; + } + + helperTask.setArgs(args); + helperTask.setClasspath(execClassPath); + if (helperTask.executeJava() != 0) { + throw new BuildException("Execution of ejbc helper failed"); + } + } + + /** + * Set the directory from where the serialised deployment descriptors are + * to be read. + * + * @param dirName the name of the directory containing the serialised deployment descriptors. + */ + 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 dirName the name of the directory into which code is generated + */ + public void setDest(String dirName) { + generatedFilesDirectory = new File(dirName); + } + + /** + * 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 name of the manifest file to be generated. + */ + public void setManifest(String manifestFilename) { + generatedManifestFile = new File(manifestFilename); + } + + /** + * Set the classpath to be used for this compilation. + */ + 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 dirName the directory containg the source tree for the EJB's interface classes. + */ + 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 new file mode 100644 index 000000000..262ff887a --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbcHelper.java @@ -0,0 +1,278 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.taskdefs.optional.ejb; + +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; + + +/** + * A helper class which performs the actual work of the ejbc task. + * + * This class is run with a classpath which includes the weblogic tools and the home and remote + * interface class files referenced in the deployment descriptors being processed. + * + * @author Conor MacNeill, Cortex ebusiness Pty Limited + */ +public class EjbcHelper { + /** + * The root directory of the tree containing the serialised deployment desciptors. + */ + private File descriptorDirectory; + + /** + * The directory where generated files are placed. + */ + private File generatedFilesDirectory; + + /** + * The name of the manifest file generated for the EJB jar. + */ + private File manifestFile; + + /** + * 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 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 names of the serialised deployment descriptors + */ + String[] descriptors; + + /** + * Command line interface for the ejbc helper task. + */ + public static void main(String[] args) throws Exception { + EjbcHelper helper = new EjbcHelper(args); + helper.process(); + } + + /** + * 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. + * + * This process attempts to determine if the support classes need to be + * rebuilt. It does this by examining only some of the support classes + * which are typically generated. If the ejbc task is interrupted generating + * the support classes for a bean, all of the support classes should be removed + * to force regeneration of the support classes. + * + * @param descriptorFile the serialised deployment descriptor + * + * @return true if the support classes need to be regenerated. + * + * @throws IOException if the descriptor file cannot be closed. + */ + private boolean isRegenRequired(File descriptorFile) throws IOException { + // read in the descriptor. Under weblogic, the descriptor is a weblogic + // specific subclass which has references to the implementation classes. + // These classes must, therefore, be in the classpath when the deployment + // descriptor is loaded from the .ser file + FileInputStream fis = null; + try { + fis = new FileInputStream(descriptorFile); + ObjectInputStream ois = new ObjectInputStream(fis); + DeploymentDescriptor dd = (DeploymentDescriptor)ois.readObject(); + fis.close(); + + String homeInterfacePath = dd.getHomeInterfaceClassName().replace('.', '/') + ".java"; + String remoteInterfacePath = dd.getRemoteInterfaceClassName().replace('.', '/') + ".java"; + String primaryKeyClassPath = null; + if (dd instanceof EntityDescriptor) { + primaryKeyClassPath = ((EntityDescriptor)dd).getPrimaryKeyClassName().replace('.', '/') + ".java";; + } + + File homeInterfaceSource = new File(sourceDirectory, homeInterfacePath); + File remoteInterfaceSource = new File(sourceDirectory, remoteInterfacePath); + File primaryKeyClassSource = null; + if (primaryKeyClassPath != null) { + primaryKeyClassSource = new File(sourceDirectory, remoteInterfacePath); + } + + // are any of the above out of date. + // we find the implementation classes and see if they are older than any + // of the above or the .ser file itself. + String beanClassBase = dd.getEnterpriseBeanClassName().replace('.', '/'); + File ejbImplentationClass + = new File(generatedFilesDirectory, beanClassBase + "EOImpl.class"); + File homeImplementationClass + = new File(generatedFilesDirectory, beanClassBase + "HomeImpl.class"); + File beanStubClass + = new File(generatedFilesDirectory, beanClassBase + "EOImpl_WLStub.class"); + + // if the implementation classes don;t exist regenerate + if (!ejbImplentationClass.exists() || !homeImplementationClass.exists() || + !beanStubClass.exists()) { + return true; + } + + // Is the ser file or any of the source files newer then the class files. + // firstly find the oldest of the two class files. + long classModificationTime = ejbImplentationClass.lastModified(); + if (homeImplementationClass.lastModified() < classModificationTime) { + classModificationTime = homeImplementationClass.lastModified(); + } + if (beanStubClass.lastModified() < classModificationTime) { + classModificationTime = beanStubClass.lastModified(); + } + + if (descriptorFile.lastModified() > classModificationTime || + homeInterfaceSource.lastModified() > classModificationTime || + remoteInterfaceSource.lastModified() > classModificationTime) { + return true; + } + + if (primaryKeyClassSource != null && + primaryKeyClassSource.lastModified() > classModificationTime) { + return true; + } + } + catch (Throwable descriptorLoadException) { + System.out.println("Exception occurred reading " + descriptorFile.getName() + " - continuing"); + // any problems - just regenerate + return true; + } + finally { + if (fis != null) { + fis.close(); + } + } + + 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) throws Exception { + // create a Java task to do the rebuild + + String[] args = {"-noexit", + "-keepgenerated", + "-d", generatedFilesDirectory.getPath(), + descriptorFile.getPath()}; + + try { + weblogic.ejbc.main(args); + } + catch (Exception e) { + // run with no exit for better reporting + String[] newArgs = {"-keepgenerated", + "-d", generatedFilesDirectory.getPath(), + descriptorFile.getPath()}; + weblogic.ejbc.main(newArgs); + } + } +} diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLRun.java b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLRun.java new file mode 100644 index 000000000..d4522e142 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLRun.java @@ -0,0 +1,224 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.taskdefs.optional.ejb; + + +import org.apache.tools.ant.*; +import org.apache.tools.ant.taskdefs.*; + +import java.io.File; + +/** + * Execute a Weblogic server. + + * + * @author Conor MacNeill, Cortex ebusiness Pty Limited + */ +public class WLRun extends Task { + static private final String defaultPolicyFile = "weblogic.policy"; + + /** + * 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 String classpath; + + /** + * The weblogic classpath to the be used when running weblogic. + */ + private String weblogicClasspath = ""; + + /** + * The security policy to use when running the weblogic server + */ + private String securityPolicy; + + /** + * The weblogic system home directory + */ + private File weblogicSystemHome; + + /** + * The name of the weblogic server - used to select the server's directory in the + * weblogic home directory. + */ + private String weblogicSystemName = "myserver"; + + /** + * The file containing the weblogic properties for this server. + */ + private String weblogicPropertiesFile = "weblogic.properties"; + + /** + * Do the work. + * + * The work is actually done by creating a separate JVM to run a helper task. + * This approach allows the classpath of the helper task to be set. Since the + * weblogic tools require the class files of the project's home and remote + * interfaces to be available in the classpath, this also avoids having to + * start ant with the class path of the project it is building. + * + * @exception BuildException if someting goes wrong with the build + */ + public void execute() throws BuildException { + if (weblogicSystemHome == null) { + throw new BuildException("weblogic home must be set"); + } + if (!weblogicSystemHome.isDirectory()) { + throw new BuildException("weblogic home directory " + weblogicSystemHome.getPath() + + " is not valid"); + } + + File propertiesFile = new File(weblogicSystemHome, weblogicPropertiesFile); + + if (!propertiesFile.exists()) { + throw new BuildException("Properties file " + weblogicPropertiesFile + + " not found in weblogic home " + weblogicSystemHome); + } + + File securityPolicyFile = null; + if (securityPolicy == null) { + securityPolicyFile = new File(weblogicSystemHome, defaultPolicyFile); + } + else { + securityPolicyFile = new File(weblogicSystemHome, securityPolicy); + } + + if (!securityPolicyFile.exists()) { + throw new BuildException("Security policy " + securityPolicyFile + + " was not found."); + } + + String execClassPath = project.translatePath(classpath); + + Java weblogicServer = (Java)project.createTask("java"); + weblogicServer.setFork("yes"); + weblogicServer.setClassname("weblogic.Server"); + String jvmArgs = ""; + if (weblogicClasspath != null) { + jvmArgs += "-Dweblogic.class.path=" + project.translatePath(weblogicClasspath); + } + + jvmArgs += " -Djava.security.manager -Djava.security.policy==" + securityPolicyFile; + jvmArgs += " -Dweblogic.system.home=" + weblogicSystemHome; + jvmArgs += " -Dweblogic.system.name=" + weblogicSystemName; + jvmArgs += " -Dweblogic.system.propertiesFile=" + weblogicPropertiesFile; + + weblogicServer.setJvmargs(jvmArgs); + weblogicServer.setClasspath(execClassPath); + if (weblogicServer.executeJava() != 0) { + throw new BuildException("Execution of weblogic server failed"); + } + } + + + /** + * Set the classpath to be used for this compilation. + * + * @param s the classpath to use when executing the weblogic task. + */ + public void setClasspath(String s) { + this.classpath = project.translatePath(s); + } + + /** + * Set the weblogic classpath. + * + * The weblogic classpath is used by weblogic to support dynamic class loading. + * + * @param weblogicClasspath the weblogic classpath + */ + public void setWlclasspath(String weblogicClasspath) { + this.weblogicClasspath = weblogicClasspath; + } + + /** + * Set the security policy for this invocation of weblogic. + * + * @param securityPolicy the security policy to use. + */ + public void setPolicy(String securityPolicy) { + this.securityPolicy = securityPolicy; + } + + /** + * The location where weblogic lives. + * + * @param weblogicHome the home directory of weblogic. + * + */ + public void setHome(String weblogicHome) { + weblogicSystemHome = new File(weblogicHome); + } + + /** + * Set the name of the server to run + * + * @param systemName the name of the server. + */ + public void setName(String serverName) { + this.weblogicSystemName = serverName; + } + + /** + * Set the properties file to use. + * + * The location of the properties file is relative to the weblogi system home + * + * @param propertiesFilename the properties file name + */ + public void setProperties(String propertiesFilename) { + this.weblogicPropertiesFile = propertiesFilename; + } +} diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLStop.java b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLStop.java new file mode 100644 index 000000000..a9f3b88cd --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WLStop.java @@ -0,0 +1,168 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.taskdefs.optional.ejb; + + +import org.apache.tools.ant.*; +import org.apache.tools.ant.taskdefs.*; + +import java.io.File; + +/** + * Shutdown a Weblogic server. + + * + * @author Conor MacNeill, Cortex ebusiness Pty Limited + */ +public class WLStop extends Task { + /** + * The classpath to be used. It must contains the weblogic.Admin class. + */ + private String classpath; + + /** + * The weblogic username to use to request the shutdown. + */ + private String username; + + /** + * The password to use to shutdown the weblogic server. + */ + private String password; + + /** + * The URL which the weblogic server is listening on. + */ + private String serverURL; + + /** + * The delay (in seconds) to wait before shutting down. + */ + private int delay = 0; + + /** + * Do the work. + * + * The work is actually done by creating a separate JVM to run the weblogic admin task + * This approach allows the classpath of the helper task to be set. + * + * @exception BuildException if someting goes wrong with the build + */ + public void execute() throws BuildException { + if (username == null || password == null) { + throw new BuildException("weblogic username and password must both be set"); + } + + if (serverURL == null) { + throw new BuildException("The url of the weblogic server must be provided."); + } + + String execClassPath = project.translatePath(classpath); + + Java weblogicAdmin = (Java)project.createTask("java"); + weblogicAdmin.setFork("yes"); + weblogicAdmin.setClassname("weblogic.Admin"); + String args = serverURL + " SHUTDOWN " + username + " " + password + " " + delay; + + weblogicAdmin.setArgs(args); + weblogicAdmin.setClasspath(execClassPath); + weblogicAdmin.execute(); + } + + /** + * Set the classpath to be used for this compilation. + * + * @param s the classpath to use when executing the weblogic admin task. + */ + public void setClasspath(String s) { + this.classpath = project.translatePath(s); + } + + /** + * Set the username to use to request shutdown of the server. + * + * @param s the username. + */ + public void setUser(String s) { + this.username = s; + } + + /** + * Set the password to use to request shutdown of the server. + * + * @param s the password. + */ + public void setPassword(String s) { + this.password = s; + } + + /** + * Set the URL to which the weblogic server is listening. + * + * @param s the url. + */ + public void setUrl(String s) { + this.serverURL = s; + } + + + /** + * Set the delay (in seconds) before shutting down the server. + * + * @param s the selay. + */ + public void setDelay(String s) { + delay = Integer.parseInt(s); + } +}