ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From co...@locus.apache.org
Subject cvs commit: jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/ejb DescriptorHandler.java EJBDeploymentTool.java GenericDeploymentTool.java WeblogicDeploymentTool.java EjbJar.java
Date Wed, 02 Aug 2000 14:30:59 GMT
conor       00/08/02 07:30:57

  Modified:    src/main/org/apache/tools/ant/taskdefs/optional/ejb
                        EjbJar.java
  Added:       src/main/org/apache/tools/ant/taskdefs/optional/ejb
                        DescriptorHandler.java EJBDeploymentTool.java
                        GenericDeploymentTool.java
                        WeblogicDeploymentTool.java
  Log:
  Change the ejbjar to separate out vendor specific processing into separate
  tool classes.
  
  Split the Descriptor handler to a separate class
  
  Allow local DTDs to be loaded to resolve the external entities
  
  Moved all Weblogic specific code into a separate deployment tool object.
  
  Usage for generic jars is now
  
  <ejbjar srcdir="${descriptor.dir}" destdir="${deploymentjar.dir}">
    <include name="**/*-ejb-jar.xml"/>
  </ejbjar>
  
  For a weblogic deployment you now add a nested element with the weblogic specific
  configs
  
  <ejbjar srcdir="${descriptor.dir}">
    <weblogic destdir="${deploymentjar.dir}"
              classpath="${descriptorbuild.classpath}"
              keepgeneric="false"
              suffix=".jar"/>
    <include name="**/*-ejb-jar.xml"/>
    <exclude name="**/*-weblogic-ejb-jar.xml"/>
  </ejbjar>
  
  Revision  Changes    Path
  1.4       +71 -484   jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbJar.java
  
  Index: EjbJar.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbJar.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- EjbJar.java	2000/07/31 12:09:29	1.3
  +++ EjbJar.java	2000/08/02 14:30:56	1.4
  @@ -1,7 +1,7 @@
   /*
    * The Apache Software License, Version 1.1
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights
  + * Copyright (c) 2000 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -55,37 +55,20 @@
   package org.apache.tools.ant.taskdefs.optional.ejb;
   
   // Standard java imports
  -import java.io.FileInputStream;
  -import java.io.FileOutputStream;
  -import java.io.PrintWriter;
  -import java.io.File;
  -import java.io.IOException;
  -import java.util.jar.*;
  -import java.util.zip.*;
  -import java.util.ArrayList;
  -import java.util.Hashtable;
  -import java.util.Iterator;
  +import java.io.*;
  +import java.util.*;
   
   // XML imports
   import javax.xml.parsers.SAXParser;
   import javax.xml.parsers.SAXParserFactory;
   import javax.xml.parsers.ParserConfigurationException;
  -import org.xml.sax.Parser;
  -import org.xml.sax.Locator;
  -import org.xml.sax.InputSource;
  -import org.xml.sax.AttributeList;
  -import org.xml.sax.DocumentHandler;
   import org.xml.sax.SAXException;
  -import org.xml.sax.SAXParseException;
  -import org.xml.sax.helpers.ParserFactory;
   
   // Apache/Ant imports
   import org.apache.tools.ant.BuildException;
  -import org.apache.tools.ant.Task;
   import org.apache.tools.ant.Project;
   import org.apache.tools.ant.DirectoryScanner;
   import org.apache.tools.ant.taskdefs.MatchingTask;
  -import org.apache.tools.ant.taskdefs.Java;
   
   /**
    * <p>Provides automated ejb jar file creation for ant.  Extends the MatchingTask
  @@ -104,146 +87,21 @@
    * 5.1 jars. The weblogic deployment descriptors, used in constructing the 
    * Weblogic jar, are located based on a simple naming convention. The name of the
    * standard deployment descriptor is taken upto the first instance of a String,
  - * specified by the attribute basenameterminator, and then the regular Weblogic
  - * descriptor name is appended. For example if basenameterminator is set to '-',
  + * specified by the attribute basenameTerminator, and then the regular Weblogic
  + * descriptor name is appended. For example if basenameTerminator is set to '-',
    * its default value, and a standard descriptor is called Foo-ejb-jar.xml then
    * the files Foo-weblogic-ejb-jar.xml and Foo-weblogic-cmp-rdbms-jar.xml will be
    * looked for, and if found, included in the jarfile.</p>
    *
    * <p>Attributes and setter methods are provided to support optional generation
    * of Weblogic5.1 jars, optional deletion of generic jar files, setting alternate
  - * values for basenameterminator, and setting the strings to append to the names
  + * values for basenameTerminator, and setting the strings to append to the names
    * of the generated jarfiles.</p>
    *
    * @author <a href="mailto:tfennell@sapient.com">Tim Fennell</a>
    */
   public class EjbJar extends MatchingTask {
   
  -    /**
  -     * Inner class used by EjbJar to facilitate the parsing of deployment
  -     * descriptors and the capture of appropriate information. Extends
  -     * HandlerBase so it only implements the methods needed. During parsing
  -     * creates a hashtable consisting of entries mapping the name it should be
  -     * inserted into an EJB jar as to a File representing the file on disk. This
  -     * list can then be accessed through the getFiles() method.
  -     */
  -    protected class DescriptorHandler extends org.xml.sax.HandlerBase {
  -        /**
  -         * Bunch of constants used for storing entries in a hashtable, and for
  -         * constructing the filenames of various parts of the ejb jar.
  -         */
  -        private static final String HOME_INTERFACE   = "home";
  -        private static final String REMOTE_INTERFACE = "remote";
  -        private static final String BEAN_CLASS       = "ejb-class";
  -        private static final String PK_CLASS         = "prim-key-class";
  -
  -        /**
  -         * Instance variable used to store the name of the current attribute being
  -         * processed by the SAX parser.  Accessed by the SAX parser call-back methods
  -         * startElement() and endElement().
  -         */
  -        private String currentAttribute = null;
  -
  -        /**
  -         * Instance variable that stores the names of the files as they will be
  -         * put into the jar file, mapped to File objects  Accessed by the SAX
  -         * parser call-back method characters().
  -         */
  -        private Hashtable ejbFiles = null;
  -
  -        /** Instance variable to store the source directory of the task */
  -    
  -
  -        /**
  -         * Getter method that returns the set of files to include in the EJB jar.
  -         */
  -        public Hashtable getFiles() {
  -            return (ejbFiles == null) ? new Hashtable() : ejbFiles;
  -        }
  -
  -
  -        /**
  -         * SAX parser call-back method that is used to initialize the values of some
  -         * instance variables to ensure safe operation.
  -         */
  -        public void startDocument() throws SAXException {
  -            this.ejbFiles         = new Hashtable(10, 1);
  -            this.currentAttribute = null;
  -        }
  -
  -
  -        /**
  -         * SAX parser call-back method that is invoked when a new element is entered
  -         * into.  Used to store the context (attribute name) in the currentAttribute
  -         * instance variable.
  -         * @param name The name of the element being entered.
  -         * @param attrs Attributes associated to the element.
  -         */
  -        public void startElement(String name, AttributeList attrs) 
  -            throws SAXException {
  -            this.currentAttribute = name;
  -        }
  -
  -
  -        /**
  -         * SAX parser call-back method that is invoked when an element is exited.
  -         * Used to blank out (set to the empty string, not nullify) the name of
  -         * the currentAttribute.  A better method would be to use a stack as an
  -         * instance variable, however since we are only interested in leaf-node
  -         * data this is a simpler and workable solution.
  -         * @param name The name of the attribute being exited. Ignored
  -         *        in this implementation.
  -         */
  -        public void endElement(String name) throws SAXException {
  -            this.currentAttribute = "";
  -        }
  -
  -        /**
  -         * SAX parser call-back method invoked whenever characters are located within
  -         * an element.  currentAttribute (modified by startElement and endElement)
  -         * tells us whether we are in an interesting element (one of the up to four
  -         * classes of an EJB).  If so then converts the classname from the format
  -         * org.apache.tools.ant.Parser to the convention for storing such a class,
  -         * org/apache/tools/ant/Parser.class.  This is then resolved into a file
  -         * object under the srcdir which is stored in a Hashtable.
  -         * @param ch A character array containing all the characters in
  -         *        the element, and maybe others that should be ignored.
  -         * @param start An integer marking the position in the char
  -         *        array to start reading from.
  -         * @param length An integer representing an offset into the
  -         *        char array where the current data terminates.
  -         */
  -        public void characters(char[] ch, int start, int length) 
  -            throws SAXException {
  -            if (currentAttribute.equals(DescriptorHandler.HOME_INTERFACE)   ||
  -                currentAttribute.equals(DescriptorHandler.REMOTE_INTERFACE) ||
  -                currentAttribute.equals(DescriptorHandler.BEAN_CLASS)       ||
  -                currentAttribute.equals(DescriptorHandler.PK_CLASS)) {
  -                
  -                // Get the filename into a String object
  -                File classFile = null;
  -                String className = new String(ch, start, length);
  -
  -                // If it's a primitive wrapper then we shouldn't try and put
  -                // it into the jar, so ignore it.
  -                if (!className.startsWith("java.lang")) {
  -                    // Translate periods into path separators, add .class to the
  -                    // name, create the File object and add it to the Hashtable.
  -                    className = className.replace('.', File.separatorChar);
  -                    className += ".class";
  -                    classFile = new File(srcdir, className);
  -                    ejbFiles.put(className, classFile);
  -                }
  -            }
  -        }
  -    } // End of DescriptorHandler
  -
  -    /** Private constants that are used when constructing the standard jarfile */
  -    private static final String META_DIR  = "META-INF/";
  -    private static final String EJB_DD    = "ejb-jar.xml";
  -    private static final String WL_DD     = "weblogic-ejb-jar.xml";
  -    private static final String WL_CMP_DD = "weblogic-cmp-rdbms-jar.xml";
  -
       /** Stores a handle to the directory under which to search for files */
       private File srcdir = null;
   
  @@ -255,47 +113,50 @@
        * of a flat directory as the destination for the jar files.
        */
       private boolean flatdestdir = false;
  -
  -    /** Instance variable that determines whether to generate weblogic jars. */
  -    private boolean generateweblogic = false;
  -
  -    /** Instance variable that determines whether generic ejb jars are kept. */
  -    private boolean keepgeneric = true;
       
       /** Instance variable that marks the end of the 'basename' */
  -    private String basenameterminator = "-";
  +    private String basenameTerminator = "-";
   
       /** Instance variable that stores the suffix for the generated jarfile. */
       private String genericjarsuffix = "-generic.jar";
  +
  +    /**
  +     * The list of deployment tools we are going to run.
  +     */
  +    private ArrayList deploymentTools = new ArrayList();
   
  -    /** Instance variable that stores the suffix for the weblogic jarfile. */
  -    private String weblogicjarsuffix = "-wl.jar";
  +    public EJBDeploymentTool createWeblogic() {
  +        EJBDeploymentTool tool = new WeblogicDeploymentTool();
  +        tool.setTask(this);
  +        deploymentTools.add(tool);
  +        return tool;
  +    }
   
       /**
        * Setter used to store the value of srcdir prior to execute() being called.
  -     * @param inDir The string indicating the source directory.
  +     * @param inDir the source directory.
        */
  -    public void setSrcdir(String inDir) {
  -        this.srcdir = this.project.resolveFile(inDir);
  +    public void setSrcdir(File inDir) {
  +        this.srcdir = inDir;
       }
   
       /**
        * Setter used to store the value of destination directory prior to execute()
        * being called.
  -     * @param inFile The string indicating the source directory.
  +     * @param inFile the destination directory.
        */
  -    public void setDestdir(String inDir) {
  -        this.destdir = this.project.resolveFile(inDir);
  +    public void setDestdir(File inDir) {
  +        this.destdir = inDir;
       }
   
       /**
        * Setter used to store the value of flatdestdir.
        * @param inValue a string, either 'true' or 'false'.
        */
  -    public void setFlatdestdir(String inValue) {
  -        this.flatdestdir = Boolean.valueOf(inValue).booleanValue();
  +    public void setFlatdestdir(boolean inValue) {
  +        this.flatdestdir = inValue;
       }
  -
  +     
       /**
        * Setter used to store the suffix for the generated jar file.
        * @param inString the string to use as the suffix.
  @@ -305,164 +166,13 @@
       }
   
       /**
  -     * Setter used to store the suffix for the generated weblogic jar file.
  -     * @param inString the string to use as the suffix.
  -     */
  -    public void setWeblogicjarsuffix(String inString) {
  -        this.weblogicjarsuffix = inString;
  -    }
  -
  -    /**
  -     * Setter used to store the value of generateweblogic.
  -     * @param inValue a string, either 'true' or 'false'.
  -     */
  -    public void setGenerateweblogic(String inValue) {
  -        this.generateweblogic = Boolean.valueOf(inValue).booleanValue();
  -    }
  -
  -    /**
  -     * Setter used to store the value of keepgeneric
  -     * @param inValue a string, either 'true' or 'false'.
  -     */
  -    public void setKeepgeneric(String inValue) {
  -        this.keepgeneric = Boolean.valueOf(inValue).booleanValue();
  -    }
  -    
  -    /**
  -     * Setter used to store the value of basenameterminator
  +     * Setter used to store the value of basenameTerminator
        * @param inValue a string which marks the end of the basename.
  -     */
  -    public void setBasenameterminator(String inValue) {
  -        if (inValue != null) this.basenameterminator = inValue;
  -    }
  -
  -    /**
  -     * Utility method that encapsulates the logic of adding a file entry to
  -     * a .jar file.  Used by execute() to add entries to the jar file as it is
  -     * constructed.
  -     * @param jStream A JarOutputStream into which to write the
  -     *        jar entry.
  -     * @param iStream A FileInputStream from which to read the
  -     *        contents the file being added.
  -     * @param filename A String representing the name, including
  -     *        all relevant path information, that should be stored for the entry
  -     *        being added.
  -     */
  -    protected void addFileToJar(JarOutputStream jStream,
  -                                FileInputStream iStream,
  -                                String          filename)
  -        throws BuildException {
  -        try {
  -            // Create the zip entry and add it to the jar file
  -            ZipEntry zipEntry = new ZipEntry(filename);
  -            jStream.putNextEntry(zipEntry);
  -            
  -            // Create the file input stream, and buffer everything over
  -            // to the jar output stream
  -            byte[] byteBuffer = new byte[2 * 1024];
  -            int count = 0;
  -            do {
  -                jStream.write(byteBuffer, 0, count);
  -                count = iStream.read(byteBuffer, 0, byteBuffer.length);
  -            } while (count != -1);
  -            
  -            // Close up the file input stream for the class file
  -            iStream.close();
  -        }
  -        catch (IOException ioe) {
  -            String msg = "IOException while adding entry "
  -                         + filename + "to jarfile."
  -                         + ioe.getMessage();
  -            throw new BuildException(msg, ioe);
  -        }
  -    }
  -
  -    /**
  -     * Method used to encapsulate the writing of the JAR file. Iterates over the
  -     * filenames/java.io.Files in the Hashtable stored on the instance variable
  -     * ejbFiles.
  -     */
  -    public void writeJar(File jarfile, Hashtable files) throws BuildException{
  -        JarOutputStream jarStream = null;
  -        Iterator entryIterator = null;
  -        String entryName = null;
  -        File entryFile = null;
  -
  -        try {
  -            /* If the jarfile already exists then whack it and recreate it.
  -             * Should probably think of a more elegant way to handle this
  -             * so that in case of errors we don't leave people worse off
  -             * than when we started =)
  -             */
  -            if (jarfile.exists()) jarfile.delete();
  -            jarfile.getParentFile().mkdirs();
  -            jarfile.createNewFile();
  -            
  -            // Create the streams necessary to write the jarfile
  -            jarStream = new JarOutputStream(new FileOutputStream(jarfile));
  -            jarStream.setMethod(JarOutputStream.DEFLATED);
  -            
  -            // Loop through all the class files found and add them to the jar
  -            entryIterator = files.keySet().iterator();
  -            while (entryIterator.hasNext()) {
  -                entryName = (String) entryIterator.next();
  -                entryFile = (File) files.get(entryName);
  -                
  -                this.log("adding file '" + entryName + "'",
  -                         Project.MSG_VERBOSE);
  -
  -                addFileToJar(jarStream,
  -                             new FileInputStream(entryFile),
  -                             entryName);
  -            }
  -            // All done.  Close the jar stream.
  -            jarStream.close();
  -        }
  -        catch(IOException ioe) {
  -            String msg = "IOException while processing ejb-jar file '"
  -                + jarfile.toString()
  -                + "'. Details: "
  -                + ioe.getMessage();
  -            throw new BuildException(msg, ioe);
  -        }
  -    } // end of writeJar
  -    
  -
  -    /**
  -     * Helper method invoked by execute() for each WebLogic jar to be built.
  -     * Encapsulates the logic of constructing a java task for calling
  -     * weblogic.ejbc and executing it.
  -     * @param sourceJar java.io.File representing the source (EJB1.1) jarfile.
  -     * @param destJar java.io.File representing the destination, WebLogic
  -     *        jarfile.
        */
  -    public void buildWeblogicJar(File sourceJar, File destJar) {
  -        org.apache.tools.ant.taskdefs.Java javaTask = null;
  -        
  -        try {
  -            // Unfortunately, because weblogic.ejbc calls system.exit(), we
  -            // cannot do it 'in-process'. If they ever fix this, we should
  -            // change this code - it would be much quicker!
  -            String args = "-noexit " + sourceJar + " " + destJar;
  -            
  -            javaTask = (Java) this.project.createTask("java");
  -            javaTask.setClassname("weblogic.ejbc");
  -            javaTask.setArgs(args);
  -            javaTask.setFork(false);
  -
  -            this.log("Calling weblogic.ejbc for " + sourceJar.toString(),
  -                     Project.MSG_INFO);
  -
  -            javaTask.execute();
  -        }
  -        catch (Exception e) {
  -            // Have to catch this because of the semantics of calling main()
  -            String msg = "Exception while calling ejbc. Details: " + e.toString();
  -            throw new BuildException(msg, e);
  -        }
  +    public void setBasenameTerminator(String inValue) {
  +        if (inValue != null) this.basenameTerminator = inValue;
       }
   
  -
       /**
        * Invoked by Ant after the task is prepared, when it is ready to execute
        * this task.  Parses the XML deployment descriptor to acquire the list of
  @@ -475,173 +185,51 @@
        *            that a major problem occurred within this task.
        */
       public void execute() throws BuildException {
  -        boolean          needBuild  = true;
  -        DirectoryScanner ds         = null;
  -        String[]         files      = null;
  -        int              index      = 0;
  -        File             weblogicDD = null;
  -        File             jarfile    = null;
  -        File             wlJarfile  = null;
  -        File             jarToCheck = null;
  -        DescriptorHandler handler   = null;
  -        Hashtable        ejbFiles   = null;
  -        String           baseName   = null;
  -
  -        // Lets do a little asserting to make sure we have all the
  -        // required attributes from the task processor
  -        StringBuffer sb = new StringBuffer();
  -        boolean die = false;
  -        sb.append("Processing ejbjar - the following attributes ");
  -        sb.append("must be specified: ");
  -        if (this.srcdir     == null) { sb.append("srcdir ");     die = true; }
  -        if (this.destdir    == null) { sb.append("destdir");     die = true; }
  -        if ( die ) throw new BuildException(sb.toString());
  +        if (srcdir == null) {
  +            throw new BuildException("The srcdir attribute must be specified");
  +        }
  +        
  +        if (deploymentTools.size() == 0) {
  +            GenericDeploymentTool genericTool = new GenericDeploymentTool();
  +            genericTool.setDestdir(destdir);
  +            genericTool.setTask(this);
  +            genericTool.setGenericjarsuffix(genericjarsuffix);
   
  +            deploymentTools.add(genericTool);
  +        }
  +        
  +        for (Iterator i = deploymentTools.iterator(); i.hasNext(); ) {
  +            EJBDeploymentTool tool = (EJBDeploymentTool)i.next();
  +            tool.configure(basenameTerminator, flatdestdir);
  +            tool.validateConfigured();
  +        }
  +        
           try {
               // Create the parser using whatever parser the system dictates
               SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
  -            saxParserFactory.setValidating(false);
  +            saxParserFactory.setValidating(true);
               SAXParser saxParser = saxParserFactory.newSAXParser();
  -
  -            ds = this.getDirectoryScanner(this.srcdir);
  +    
  +            DirectoryScanner ds = getDirectoryScanner(srcdir);
               ds.scan();
  -            files = ds.getIncludedFiles();
  -
  -            this.log(files.length + " deployment descriptors located.",
  -                     Project.MSG_VERBOSE);
  -
  +            String[] files = ds.getIncludedFiles();
  +    
  +            log(files.length + " deployment descriptors located.",
  +                Project.MSG_VERBOSE);
  +            
  +                            
               // Loop through the files. Each file represents one deployment
               // descriptor, and hence one bean in our model.
  -            for (index=0; index < files.length; ++index) {
  -
  -                // By default we assume we need to build.
  -                needBuild = true;
  -
  -                // Work out what the base name is
  -                int endBaseName = 
  -                    files[index].indexOf(basenameterminator,
  -                                         files[index].lastIndexOf(File.separator));
  -                baseName = files[index].substring(0, endBaseName);
  -
  -                /* Parse the ejb deployment descriptor.  While it may not
  -                 * look like much, we use a SAXParser and an inner class to
  -                 * get hold of all the classfile names for the descriptor.
  -                 */
  -                handler = new DescriptorHandler();
  -                saxParser.parse(new InputSource
  -                                (new FileInputStream
  -                                 (new File(this.srcdir, files[index]))),
  -                                handler);
  -
  -                ejbFiles = handler.getFiles();
  -        
  -                /* Now try to locate all of the deployment descriptors for the
  -                 * jar, and if they exist, add them to the list of files.
  -                 */
  -
  -                // First the regular deployment descriptor
  -                ejbFiles.put(EjbJar.META_DIR + EjbJar.EJB_DD,
  -                             new File(this.srcdir, files[index]));
  -
  -                // Then the weblogic deployment descriptor
  -                weblogicDD = new File(this.srcdir,
  -                                      baseName 
  -                                      + this.basenameterminator
  -                                      + EjbJar.WL_DD);
  -
  -                if (weblogicDD.exists()) {
  -                    ejbFiles.put(EjbJar.META_DIR + EjbJar.WL_DD,
  -                                 weblogicDD);
  +            for (int index = 0; index < files.length; ++index) {
  +                // process the deployment descriptor in each tool
  +                for (Iterator i = deploymentTools.iterator(); i.hasNext(); ) {
  +                    EJBDeploymentTool tool = (EJBDeploymentTool)i.next();
  +                    processDescriptor(files[index], saxParser, tool);
                   }
  -
  -                // The the weblogic cmp deployment descriptor
  -                weblogicDD = new File(this.srcdir,
  -                                      baseName
  -                                      + this.basenameterminator 
  -                                      + EjbJar.WL_CMP_DD);
  -
  -                if (weblogicDD.exists()) {
  -                    ejbFiles.put(EjbJar.META_DIR + EjbJar.WL_CMP_DD,
  -                                 weblogicDD);
  -                }
  -
  -                // Lastly create File object for the Jar files. If we are using
  -                // a flat destination dir, then we need to redefine baseName!
  -                if (this.flatdestdir) {
  -                    int startName = baseName.lastIndexOf(File.separator);
  -                    int endName   = baseName.length();
  -                    baseName = baseName.substring(startName, endName);
  -                }
  -
  -                jarfile = new File(this.destdir,
  -                                   baseName
  -                                   + this.genericjarsuffix);
  -                
  -                wlJarfile = new File(this.destdir,
  -                                     baseName
  -                                     + this.weblogicjarsuffix);
  -                
  -                /* Check to see if the jar file is already up to date. 
  -                 * Unfortunately we have to parse the descriptor just to do
  -                 * that, but it's still a saving over re-constructing the jar
  -                 * file each time. Tertiary is used to determine which jarfile
  -                 * we should check times against...think about it.
  -                 */
  -                jarToCheck = this.generateweblogic ? wlJarfile : jarfile;
  -                
  -                if (jarToCheck.exists()) {
  -                    long    lastBuild = jarToCheck.lastModified();
  -                    Iterator fileIter = ejbFiles.values().iterator();
  -                    File currentFile  = null;
  -                    
  -                    // Set the need build to false until we find out otherwise.
  -                    needBuild = false;
  -
  -                    // Loop through the files seeing if any has been touched
  -                    // more recently than the destination jar.
  -                    while( (needBuild == false) && (fileIter.hasNext()) ) {
  -                        currentFile = (File) fileIter.next();
  -                        needBuild = ( lastBuild < currentFile.lastModified() );
  -                    }
  -                }
  -                
  -                // Check to see if we need a build and start
  -                // doing the work!
  -                if (needBuild) {
  -                    // Log that we are going to build...
  -                    this.log( "building "
  -                              + jarfile.getName()
  -                              + " with "
  -                              + String.valueOf(ejbFiles.size())
  -                              + " total files",
  -                              Project.MSG_INFO);
  -
  -                    // Use helper method to write the jarfile
  -                    this.writeJar(jarfile, ejbFiles);
  -
  -                    // Generate weblogic jar if requested
  -                    if (this.generateweblogic) {
  -                        this.buildWeblogicJar(jarfile, wlJarfile);
  -                    }
  -
  -                    // Delete the original jar if we weren't asked to keep it.
  -                    if (!this.keepgeneric) {
  -                        this.log("deleting jar " + jarfile.toString(),
  -                                 Project.MSG_INFO);
  -                        jarfile.delete();
  -                    }
  -                }
  -                else {
  -                    // Log that the file is up to date...
  -                    this.log(jarfile.toString() + " is up to date.",
  -                             Project.MSG_INFO);
  -                }
  -            }
  +            }    
           }
           catch (SAXException se) {
  -            String msg = "SAXException while parsing '"
  -                + files[index].toString()
  -                + "'. This probably indicates badly-formed XML."
  +            String msg = "SAXException while creating parser."
                   + "  Details: "
                   + se.getMessage();
               throw new BuildException(msg, se);
  @@ -651,15 +239,14 @@
                          + "Details: " + pce.getMessage();
               throw new BuildException(msg, pce);
           }
  -        catch (IOException ioe) {
  -            String msg = "IOException while parsing'"
  -                + files[index].toString()
  -                + "'.  This probably indicates that the descriptor"
  -                + " doesn't exist. Details:"
  -                + ioe.getMessage();
  -            throw new BuildException(msg, ioe);
  -        }
       } // end of execute()
  +
  +    
  +    private void processDescriptor(String descriptorFilename, SAXParser saxParser,
  +                                   EJBDeploymentTool tool) {
  +
  +        tool.processDescriptor(srcdir, descriptorFilename, saxParser);
  +    }
   }
   
   
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DescriptorHandler.java
  
  Index: DescriptorHandler.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2000 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
   * <http://www.apache.org/>.
   */
  
  package org.apache.tools.ant.taskdefs.optional.ejb;
  
  import java.util.*;
  import java.io.*;
  
  import org.xml.sax.InputSource;
  import org.xml.sax.SAXException;
  import org.xml.sax.AttributeList;
  
  /**
   * Inner class used by EjbJar to facilitate the parsing of deployment
   * descriptors and the capture of appropriate information. Extends
   * HandlerBase so it only implements the methods needed. During parsing
   * creates a hashtable consisting of entries mapping the name it should be
   * inserted into an EJB jar as to a File representing the file on disk. This
   * list can then be accessed through the getFiles() method.
   */
  public class DescriptorHandler extends org.xml.sax.HandlerBase {
      /**
       * Bunch of constants used for storing entries in a hashtable, and for
       * constructing the filenames of various parts of the ejb jar.
       */
      private static final String HOME_INTERFACE   = "home";
      private static final String REMOTE_INTERFACE = "remote";
      private static final String BEAN_CLASS       = "ejb-class";
      private static final String PK_CLASS         = "prim-key-class";
  
      /**
       * Instance variable used to store the name of the current element being
       * processed by the SAX parser.  Accessed by the SAX parser call-back methods
       * startElement() and endElement().
       */
      private String currentElement = null;
  
      /**
       * The text of the current element
       */
      private String currentText = null;
  
      /**
       * Instance variable that stores the names of the files as they will be
       * put into the jar file, mapped to File objects  Accessed by the SAX
       * parser call-back method characters().
       */
      private Hashtable ejbFiles = null;
  
      private Hashtable fileDTDs = new Hashtable();
      
      private Hashtable resourceDTDs = new Hashtable();
  
      /**
       * The directory containing the bean classes and interfaces. This is 
       * used for performing dependency file lookups.
       */
      private File srcDir;
  
      public DescriptorHandler(File srcDir) {
          this.srcDir = srcDir;
      }
      
  
      public void registerFileDTD(String publicId, File dtdFile) {
          fileDTDs.put(publicId, dtdFile);
      }
      
      public void registerResourceDTD(String publicId, String resourceName) {
          resourceDTDs.put(publicId, resourceName);
      }
  
      public InputSource resolveEntity(String publicId, String systemId)
          throws SAXException
      {
          
          File dtdFile = (File) fileDTDs.get(publicId);
          if (dtdFile != null && dtdFile.exists()) {
              try {
                  return new InputSource(new FileInputStream(dtdFile));
              } catch( FileNotFoundException ex ) {
                  // ignore
              }
          }
  
          String dtdResourceName = (String)resourceDTDs.get(publicId); 
          if (dtdResourceName != null) {
              InputStream is = this.getClass().getResourceAsStream(dtdResourceName);
              if( is != null ) {
                  return new InputSource(is);
              }
          }
          
          return null;
      }
  
      /**
       * Getter method that returns the set of files to include in the EJB jar.
       */
      public Hashtable getFiles() {
          return (ejbFiles == null) ? new Hashtable() : ejbFiles;
      }
  
  
      /**
       * SAX parser call-back method that is used to initialize the values of some
       * instance variables to ensure safe operation.
       */
      public void startDocument() throws SAXException {
          this.ejbFiles         = new Hashtable(10, 1);
          this.currentElement = null;
      }
  
  
      /**
       * SAX parser call-back method that is invoked when a new element is entered
       * into.  Used to store the context (attribute name) in the currentAttribute
       * instance variable.
       * @param name The name of the element being entered.
       * @param attrs Attributes associated to the element.
       */
      public void startElement(String name, AttributeList attrs) 
          throws SAXException {
          this.currentElement = name;
          currentText = "";            
      }
  
  
      /**
       * SAX parser call-back method that is invoked when an element is exited.
       * Used to blank out (set to the empty string, not nullify) the name of
       * the currentAttribute.  A better method would be to use a stack as an
       * instance variable, however since we are only interested in leaf-node
       * data this is a simpler and workable solution.
       * @param name The name of the attribute being exited. Ignored
       *        in this implementation.
       */
      public void endElement(String name) throws SAXException {
          processElement();
          currentText = "";
          this.currentElement = "";
      }
  
      /**
       * SAX parser call-back method invoked whenever characters are located within
       * an element.  currentAttribute (modified by startElement and endElement)
       * tells us whether we are in an interesting element (one of the up to four
       * classes of an EJB).  If so then converts the classname from the format
       * org.apache.tools.ant.Parser to the convention for storing such a class,
       * org/apache/tools/ant/Parser.class.  This is then resolved into a file
       * object under the srcdir which is stored in a Hashtable.
       * @param ch A character array containing all the characters in
       *        the element, and maybe others that should be ignored.
       * @param start An integer marking the position in the char
       *        array to start reading from.
       * @param length An integer representing an offset into the
       *        char array where the current data terminates.
       */
      public void characters(char[] ch, int start, int length)
          throws SAXException {
  
          currentText += new String(ch, start, length);
      }
      
      
      private void processElement() {
          if (currentElement.equals(HOME_INTERFACE)   ||
              currentElement.equals(REMOTE_INTERFACE) ||
              currentElement.equals(BEAN_CLASS)       ||
              currentElement.equals(PK_CLASS)) {
              
              // Get the filename into a String object
              File classFile = null;
              String className = currentText;
  
              // If it's a primitive wrapper then we shouldn't try and put
              // it into the jar, so ignore it.
              if (!className.startsWith("java.lang")) {
                  // Translate periods into path separators, add .class to the
                  // name, create the File object and add it to the Hashtable.
                  className = className.replace('.', File.separatorChar);
                  className += ".class";
                  classFile = new File(srcDir, className);
                  ejbFiles.put(className, classFile);
              }
          }
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EJBDeploymentTool.java
  
  Index: EJBDeploymentTool.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2000 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
   * <http://www.apache.org/>.
   */
  
  package org.apache.tools.ant.taskdefs.optional.ejb;
  
  import java.io.*;
  
  import javax.xml.parsers.SAXParser;
  
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.Task;
  
  public interface EJBDeploymentTool {
      /**
       * Process a deployment descriptor, generating the necessary vendor specifi
       * deployment files.
       *
       * @param descriptorFilename the name of the deployment descriptor
       * @param saxParser a SAX parser which can be used to parse the deployment descriptor. 
       */
      public void processDescriptor(File srcDir, String descriptorFilename, SAXParser saxParser) 
          throws BuildException;
      
      /**
       * Called to validate that the tool parameters have been configured.
       *
       */
      public void validateConfigured() throws BuildException;
  
      /**
       * Set the task which owns this tool
       */
      public void setTask(Task task);
      
      /**
       * Configure this tool for use in the ejbjar task.
       */
      public void configure(String basenameTerminator, boolean flatDestDir);     
  }
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/ejb/GenericDeploymentTool.java
  
  Index: GenericDeploymentTool.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2000 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
   * <http://www.apache.org/>.
   */
  
  package org.apache.tools.ant.taskdefs.optional.ejb;
  
  import java.io.*;
  import java.util.*;
  import java.util.jar.*;
  import java.util.zip.*;
  
  import javax.xml.parsers.SAXParser;
  import org.xml.sax.InputSource;
  import org.xml.sax.SAXException;
  
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.Project;
  import org.apache.tools.ant.Task;
  
  public class GenericDeploymentTool implements EJBDeploymentTool {
      /** Private constants that are used when constructing the standard jarfile */
      protected static final String META_DIR  = "META-INF/";
      protected static final String EJB_DD    = "ejb-jar.xml";
  
      /** Stores a handle to the directory to put the Jar files in */
      private File destDir = null;
      
      /**
       * Instance variable that determines whether to use a package structure
       * of a flat directory as the destination for the jar files.
       */
      private boolean flatDestDir = false;
      
      /** Instance variable that marks the end of the 'basename' */
      private String basenameTerminator = "-";
  
      /** Instance variable that stores the suffix for the generated jarfile. */
      private String genericjarsuffix = "-generic.jar";
  
      /**
       * The task to which this tool belongs.
       */
      private Task task;
      
      /**
       * Setter used to store the value of destination directory prior to execute()
       * being called.
       * @param inDir the destination directory.
       */
      public void setDestdir(File inDir) {
          this.destDir = inDir;
      }
  
      /**
       * Get the desitination directory.
       */
      protected File getDestDir() {
          return destDir;
      }
      
  
      /**
       * Set the task which owns this tool
       */
      public void setTask(Task task) {
          this.task = task;
      }
         
      /**
       * Get the task for this tool.
       */
      protected Task getTask() {
          return task;
      }
  
      /**
       * Get the basename terminator.
       */
      protected String getBasenameTerminator() {
          return basenameTerminator;
      }
      
      /**
       * Setter used to store the suffix for the generated jar file.
       * @param inString the string to use as the suffix.
       */
      public void setGenericjarsuffix(String inString) {
          this.genericjarsuffix = inString;
      }
  
      /**
       * Configure this tool for use in the ejbjar task.
       */
      public void configure(String basenameTerminator, boolean flatDestDir) {
          this.basenameTerminator = basenameTerminator;
          this.flatDestDir = flatDestDir;
      }
  
      /**
       * Utility method that encapsulates the logic of adding a file entry to
       * a .jar file.  Used by execute() to add entries to the jar file as it is
       * constructed.
       * @param jStream A JarOutputStream into which to write the
       *        jar entry.
       * @param iStream A FileInputStream from which to read the
       *        contents the file being added.
       * @param filename A String representing the name, including
       *        all relevant path information, that should be stored for the entry
       *        being added.
       */
      protected void addFileToJar(JarOutputStream jStream,
                                  FileInputStream iStream,
                                  String          filename)
          throws BuildException {
          try {
              // Create the zip entry and add it to the jar file
              ZipEntry zipEntry = new ZipEntry(filename);
              jStream.putNextEntry(zipEntry);
              
              // Create the file input stream, and buffer everything over
              // to the jar output stream
              byte[] byteBuffer = new byte[2 * 1024];
              int count = 0;
              do {
                  jStream.write(byteBuffer, 0, count);
                  count = iStream.read(byteBuffer, 0, byteBuffer.length);
              } while (count != -1);
              
              // Close up the file input stream for the class file
              iStream.close();
          }
          catch (IOException ioe) {
              String msg = "IOException while adding entry "
                           + filename + "to jarfile."
                           + ioe.getMessage();
              throw new BuildException(msg, ioe);
          }
      }
  
      protected DescriptorHandler getDescriptorHandler(File srcDir) {
          return new DescriptorHandler(srcDir);
      }
      
      public void processDescriptor(File srcDir, String descriptorFilename, SAXParser saxParser) {
          try {
              DescriptorHandler handler = getDescriptorHandler(srcDir);
              
              /* Parse the ejb deployment descriptor.  While it may not
               * look like much, we use a SAXParser and an inner class to
               * get hold of all the classfile names for the descriptor.
               */
              saxParser.parse(new InputSource
                              (new FileInputStream
                               (new File(srcDir, descriptorFilename))),
                              handler);
                              
              Hashtable ejbFiles = handler.getFiles();
              
              String baseName = "";
              
              // Work out what the base name is
              int lastSeparatorIndex = descriptorFilename.lastIndexOf(File.separator);
              int endBaseName = -1;
              if (lastSeparatorIndex != -1) {
                  endBaseName = descriptorFilename.indexOf(basenameTerminator, 
                                                           lastSeparatorIndex);
              }
              else {
                  endBaseName = descriptorFilename.indexOf(basenameTerminator);
              }
              
              if (endBaseName != -1) {
                  baseName = descriptorFilename.substring(0, endBaseName);
              }
  
              // First the regular deployment descriptor
              ejbFiles.put(META_DIR + EJB_DD,
                           new File(srcDir, descriptorFilename));
                           
              addVendorFiles(ejbFiles, srcDir, baseName);
  
              // Lastly create File object for the Jar files. If we are using
              // a flat destination dir, then we need to redefine baseName!
              if (flatDestDir && baseName.length() != 0) {
                  int startName = baseName.lastIndexOf(File.separator);
                  int endName   = baseName.length();
                  baseName = baseName.substring(startName, endName);
              }
              
              File jarFile = getVendorOutputJarFile(baseName);
              
              // By default we assume we need to build.
              boolean needBuild = true;
  
              if (jarFile.exists()) {
                  long    lastBuild = jarFile.lastModified();
                  Iterator fileIter = ejbFiles.values().iterator();
                  // Set the need build to false until we find out otherwise.
                  needBuild = false;
  
                  // Loop through the files seeing if any has been touched
                  // more recently than the destination jar.
                  while( (needBuild == false) && (fileIter.hasNext()) ) {
                      File currentFile = (File) fileIter.next();
                      needBuild = ( lastBuild < currentFile.lastModified() );
                  }
              }
              
              // Check to see if we need a build and start
              // doing the work!
              if (needBuild) {
                  // Log that we are going to build...
                  getTask().log( "building "
                                + jarFile.getName()
                                + " with "
                                + String.valueOf(ejbFiles.size())
                                + " files",
                                Project.MSG_INFO);
      
                  // Use helper method to write the jarfile
                  writeJar(baseName, jarFile, ejbFiles);
  
              }
              else {
                  // Log that the file is up to date...
                  getTask().log(jarFile.toString() + " is up to date.",
                                Project.MSG_INFO);
              }
  
          }
          catch (SAXException se) {
              String msg = "SAXException while parsing '"
                  + descriptorFilename.toString()
                  + "'. This probably indicates badly-formed XML."
                  + "  Details: "
                  + se.getMessage();
              throw new BuildException(msg, se);
          }
          catch (IOException ioe) {
              String msg = "IOException while parsing'"
                  + descriptorFilename.toString()
                  + "'.  This probably indicates that the descriptor"
                  + " doesn't exist. Details:"
                  + ioe.getMessage();
              throw new BuildException(msg, ioe);
          }
      }
      
      /**
       * Add any vendor specific files which should be included in the 
       * EJB Jar.
       */
      protected void addVendorFiles(Hashtable ejbFiles, File srcDir, String baseName) {
      }
  
  
      /**
       * Get the vendor specific name of the Jar that will be output. The modification date
       * of this jar will be checked against the dependent bean classes.
       */
      File getVendorOutputJarFile(String baseName) {
          return new File(destDir, baseName + genericjarsuffix);
      }
  
      /**
       * Method used to encapsulate the writing of the JAR file. Iterates over the
       * filenames/java.io.Files in the Hashtable stored on the instance variable
       * ejbFiles.
       */
      protected void writeJar(String baseName, File jarfile, Hashtable files) throws BuildException{
          JarOutputStream jarStream = null;
          Iterator entryIterator = null;
          String entryName = null;
          File entryFile = null;
  
          try {
              /* If the jarfile already exists then whack it and recreate it.
               * Should probably think of a more elegant way to handle this
               * so that in case of errors we don't leave people worse off
               * than when we started =)
               */
              if (jarfile.exists()) {
                  jarfile.delete();
              }
              jarfile.getParentFile().mkdirs();
              jarfile.createNewFile();
              
              // Create the streams necessary to write the jarfile
              jarStream = new JarOutputStream(new FileOutputStream(jarfile));
              jarStream.setMethod(JarOutputStream.DEFLATED);
              
              // Loop through all the class files found and add them to the jar
              entryIterator = files.keySet().iterator();
              while (entryIterator.hasNext()) {
                  entryName = (String) entryIterator.next();
                  entryFile = (File) files.get(entryName);
                  
                  getTask().log("adding file '" + entryName + "'",
                                Project.MSG_VERBOSE);
  
                  addFileToJar(jarStream,
                               new FileInputStream(entryFile),
                               entryName);
              }
              // All done.  Close the jar stream.
              jarStream.close();
          }
          catch(IOException ioe) {
              String msg = "IOException while processing ejb-jar file '"
                  + jarfile.toString()
                  + "'. Details: "
                  + ioe.getMessage();
              throw new BuildException(msg, ioe);
          }
      } // end of writeJar
      
  
      /**
       * Called to validate that the tool parameters have been configured.
       *
       */
      public void validateConfigured() throws BuildException {
          if (destDir == null) {
              throw new BuildException("The destdir attribute must be specified");
          }
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WeblogicDeploymentTool.java
  
  Index: WeblogicDeploymentTool.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2000 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
   * <http://www.apache.org/>.
   */
  
  package org.apache.tools.ant.taskdefs.optional.ejb;
  
  import java.io.*;
  import java.util.*;
  
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.Project;
  import org.apache.tools.ant.Task;
  import org.apache.tools.ant.types.Path;
  import org.apache.tools.ant.taskdefs.Java;
  
  public class WeblogicDeploymentTool extends GenericDeploymentTool {
      protected static final String WL_DD     = "weblogic-ejb-jar.xml";
      protected static final String WL_CMP_DD = "weblogic-cmp-rdbms-jar.xml";
  
      /** Instance variable that stores the suffix for the weblogic jarfile. */
      private String jarSuffix = "-wl.jar";
  
      private Path classpath;
  
      /** Instance variable that determines whether generic ejb jars are kept. */
      private boolean keepgeneric = true;
      
      /**
       * Set the classpath to be used for this compilation.
       */
      public void setClasspath(Path classpath) {
          this.classpath = classpath;
      }
  
      /**
       * Setter used to store the suffix for the generated weblogic jar file.
       * @param inString the string to use as the suffix.
       */
      public void setSuffix(String inString) {
          this.jarSuffix = inString;
      }
  
      /**
       * Setter used to store the value of keepgeneric
       * @param inValue a string, either 'true' or 'false'.
       */
      public void setKeepgeneric(String inValue) {
          this.keepgeneric = Boolean.valueOf(inValue).booleanValue();
      }
      
      protected DescriptorHandler getDescriptorHandler(File srcDir) {
          DescriptorHandler handler = new DescriptorHandler(srcDir);
          handler.registerResourceDTD("-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN",
                                      "/weblogic/ejb/deployment/xml/ejb-jar.dtd");
          return handler;                                    
      }
  
      /**
       * Add any vendor specific files which should be included in the 
       * EJB Jar.
       */
      protected void addVendorFiles(Hashtable ejbFiles, File srcdir, String baseName) {
          // Then the weblogic deployment descriptor
          File weblogicDD = new File(srcdir,
                                baseName + getBasenameTerminator() + WL_DD);
  
          if (weblogicDD.exists()) {
              ejbFiles.put(META_DIR + WL_DD,
                           weblogicDD);
          }
  
          // The the weblogic cmp deployment descriptor
          File weblogicCMPDD = new File(srcdir,
                                baseName + getBasenameTerminator() + WL_CMP_DD);
  
          if (weblogicCMPDD.exists()) {
              ejbFiles.put(META_DIR + WL_CMP_DD,
                           weblogicCMPDD);
          }
      }
      
      /**
       * Get the vendor specific name of the Jar that will be output. The modification date
       * of this jar will be checked against the dependent bean classes.
       */
      File getVendorOutputJarFile(String baseName) {
          return new File(getDestDir(), baseName + jarSuffix);
      }
  
      /**
       * Helper method invoked by execute() for each WebLogic jar to be built.
       * Encapsulates the logic of constructing a java task for calling
       * weblogic.ejbc and executing it.
       * @param sourceJar java.io.File representing the source (EJB1.1) jarfile.
       * @param destJar java.io.File representing the destination, WebLogic
       *        jarfile.
       */
      private void buildWeblogicJar(File sourceJar, File destJar) {
          org.apache.tools.ant.taskdefs.Java javaTask = null;
          
          try {
              String args = "-noexit " + sourceJar.getPath().replace('\\', '/') + " " + destJar.getPath().replace('\\', '/');
              
              javaTask = (Java) getTask().getProject().createTask("java");
              javaTask.setClassname("weblogic.ejbc");
              javaTask.setArgs(args);
              if (classpath != null) {
                  javaTask.setClasspath(classpath);
                  javaTask.setFork(true);
              }
              else {
                  javaTask.setFork(false);
              }
              
  
              getTask().log("Calling weblogic.ejbc for " + sourceJar.toString(),
                            Project.MSG_VERBOSE);
  
              javaTask.execute();
          }
          catch (Exception e) {
              // Have to catch this because of the semantics of calling main()
              String msg = "Exception while calling ejbc. Details: " + e.toString();
              throw new BuildException(msg, e);
          }
      }
  
      /**
       * Method used to encapsulate the writing of the JAR file. Iterates over the
       * filenames/java.io.Files in the Hashtable stored on the instance variable
       * ejbFiles.
       */
      protected void writeJar(String baseName, File jarFile, Hashtable files) throws BuildException {
          // need to create a generic jar first.
          File genericJarFile = super.getVendorOutputJarFile(baseName);
          super.writeJar(baseName, genericJarFile, files);
          
          buildWeblogicJar(genericJarFile, jarFile);
          if (!keepgeneric) {
               getTask().log("deleting generic jar " + genericJarFile.toString(),
                             Project.MSG_VERBOSE);
               genericJarFile.delete();
          }
      }
  
      /**
       * Called to validate that the tool parameters have been configured.
       *
       */
      public void validateConfigured() throws BuildException {
          super.validateConfigured();
      }
  }
  
  
  

Mime
View raw message