glennm      00/11/07 12:19:50

  Added:       src/main/org/apache/tools/ant/taskdefs/optional/ide
                        VAJExport.java VAJImport.java VAJLoadProjects.java
                        VAJUtil.java VAJWorkspaceScanner.java
  Log:
  A very nice set of VisualAge for Java integration tasks,
  originally written by Wolf Siberski.  A similar set of tasks was
  contributed by Peter Kelly, and they formed the inspiration
  for adding the VAJImport task.
  
  They only work in the IDE, or as a part of a Tool extension.
  
  Created by:       Wolf Siberski
                           Glenn McAllister
  
  Revision  Changes    Path
  1.1                  
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJExport.java
  
  Index: VAJExport.java
  ===================================================================
  package org.apache.tools.ant.taskdefs.optional.ide;
  
  /*
   * 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 [EMAIL PROTECTED]
   *
   * 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/>.
   */
  
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.Project;
  import org.apache.tools.ant.Task;
  import org.apache.tools.ant.types.PatternSet;
  
  import com.ibm.ivj.util.base.ExportCodeSpec;
  import com.ibm.ivj.util.base.IvjException;
  import com.ibm.ivj.util.base.Package;
  
  import java.io.File;
  import java.util.Vector;
  import java.util.Enumeration;
  
  /**
   * Export packages from the Visual Age for Java workspace. 
   * The packages are specified similar to all other MatchingTasks. 
   * Since the VA Workspace is not file based, this task is simulating 
   * a directory hierarchy for the workspace:
   * The 'root' contains all project 'dir's, and the projects contain 
   * their respective package 'dir's.
   * Example:  
   * <blockquote> 
   * &lt;vajexport destdir="C:/builddir/source">
   * &nbsp;&lt;include name="/MyVAProject/org/foo/subsystem1/**" />
   * &nbsp;&lt;exclude name="/MyVAProject/org/foo/subsystem1/test/**"/>
   * &lt;/vajexport>
   * </blockquote>
   * exports all packages in the project MyVAProject which start with
   * 'org.foo.subsystem1' except of these starting with 
   * 'org.foo.subsystem1.test'.
   *
   * There are flags to choose which items to export:
   * exportSources:   export Java sources
   * exportResources: export project resources
   * exportClasses:   export class files
   * exportDebugInfo: export class files with debug info (use with 
exportClasses)
   * default is exporting Java files and resources.
   *
   * @author Wolf Siberski, TUI Infotec GmbH
   */
  
  public class VAJExport extends Task {
        protected File destDir;
        protected boolean exportSources = true;
        protected boolean exportResources = true;
        protected boolean exportClasses = false;
        protected boolean exportDebugInfo = false;
        protected boolean useDefaultExcludes = true;
  
        protected PatternSet patternSet = new PatternSet();
  
        /**
         * add a name entry on the exclude list
         */
        public PatternSet.NameEntry createExclude() {
                return patternSet.createExclude();
        }
  
        /**
         * add a name entry on the include list
         */
        public PatternSet.NameEntry createInclude() {
                return patternSet.createInclude();
        }
  
        /**
         * do the export
         */
        public void execute() throws BuildException {
                // first off, make sure that we've got a destdir
                if (destDir == null) {
                        throw new BuildException("destdir attribute must be 
set!");
                }
  
                VAJWorkspaceScanner ds = this.getWorkspaceScanner();
  
                Package[] packages = ds.getIncludedPackages();
  
                export(packages);
        }
  
        /**
         * export the array of Packages
         */
        public void export(Package[] packages) {
                try {
                        String dest = destDir.getAbsolutePath();
  
                        log("Exporting " + packages.length + " package(s) to " 
+ dest);
                        for (int i = 0; i < packages.length; i++) {
                                log("    " + packages[i].getName(), 
Project.MSG_VERBOSE);
                        }
  
                        ExportCodeSpec exportSpec = new ExportCodeSpec();
  
                        exportSpec.setPackages(packages);
                        exportSpec.includeJava(exportSources);
                        exportSpec.includeClass(exportClasses);
                        exportSpec.includeResources(exportResources);
                        exportSpec.includeClassDebugInfo(exportDebugInfo);
                        exportSpec.useSubdirectories(true);
                        exportSpec.overwriteFiles(true);
                        exportSpec.setExportDirectory(dest);
                        VAJUtil.getWorkspace().exportData(exportSpec);
                } catch (IvjException ex) {
                        throw VAJUtil.createBuildException("Exporting failed!", 
ex);
                }
        }
  
        /**
         * Returns the directory scanner needed to access the files to process.
         */
        protected VAJWorkspaceScanner getWorkspaceScanner() {
                VAJWorkspaceScanner scanner = new VAJWorkspaceScanner();
                
scanner.setIncludes(patternSet.getIncludePatterns(getProject()));
                
scanner.setExcludes(patternSet.getExcludePatterns(getProject()));
                if (useDefaultExcludes)
                        scanner.addDefaultExcludes();
                scanner.scan();
                return scanner;
        }
  
        /**
         * Sets whether default exclusions should be used or not.
         *
         * @param useDefaultExcludes "true"|"on"|"yes" when default exclusions 
         *                           should be used, "false"|"off"|"no" when 
they
         *                           shouldn't be used.
         */
        public void setDefaultexcludes(boolean useDefaultExcludes) {
                this.useDefaultExcludes = useDefaultExcludes;
        }
  
        /**
         * Set the destination directory into which the Java source
         * files should be compiled.
         */
        public void setDestdir(File destDir) {
                this.destDir = destDir;
        }
  
        /**
         * Sets the set of exclude patterns. Patterns may be separated by a 
comma
         * or a space.
         *
         * @param excludes the string containing the exclude patterns
         */
        public void setExcludes(String excludes) {
                patternSet.setExcludes(excludes);
        }
  
        /**
         */
        public void setExportClasses(boolean doExport) {
                exportClasses = doExport;
        }
  
        /**
         */
        public void setExportDebugInfo(boolean doExport) {
                exportDebugInfo = doExport;
        }
  
        /**
         */
        public void setExportResources(boolean doExport) {
                exportResources = doExport;
        }
  
        /**
         */
        public void setExportSources(boolean doExport) {
                exportSources = doExport;
        }
        /**
         * Sets the set of include patterns. Patterns may be separated by a 
comma
         * or a space.
         *
         * @param includes the string containing the include patterns
         */
        public void setIncludes(String includes) {
                patternSet.setIncludes(includes);
        }
  }
  
  
  1.1                  
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJImport.java
  
  Index: VAJImport.java
  ===================================================================
  package org.apache.tools.ant.taskdefs.optional.ide;
  
  /*
   * 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 [EMAIL PROTECTED]
   *
   * 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/>.
   */
  
  import org.apache.tools.ant.Task;
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.DirectoryScanner;
  import org.apache.tools.ant.types.FileSet;
  
  import com.ibm.ivj.util.base.ImportCodeSpec;
  import com.ibm.ivj.util.base.IvjException;
  import com.ibm.ivj.util.base.Project;
  import com.ibm.ivj.util.base.ProjectEdition;
  import com.ibm.ivj.util.base.Type;
  
  import java.io.File;
  import java.util.Vector;
  import java.util.Enumeration;
  
  /**
   * Import source, class files, and resources to the Visual Age for Java 
   * workspace using FileSets.
   * <p>
   * Example:  
   * <pre> 
   * &lt;vajimport project="MyVAProject"&gt;
   *   &lt;fileset dir="src"&gt;
   *     &lt;include name="org/foo/subsystem1/**" /&gt;
   *     &lt;exclude name="/org/foo/subsystem1/test/**" /&gt;
   *  &lt;/fileset&gt;
   * &lt;/vajexport&gt;
   * </pre>
   * import all source and resource files from the "src" directory
   * which start with 'org.foo.subsystem1', except of these starting with 
   * 'org.foo.subsystem1.test' into the project MyVAProject.
   * </p>
   * <p>If MyVAProject isn't loaded into the Workspace, a new edition is
   * created in the repository and automatically loaded into the Workspace.
   * There has to be at least one nested FileSet element.
   * </p>
   * <p>There are attributes to choose which items to export:
   * <table border="1" cellpadding="2" cellspacing="0">
   * <tr>
   *   <td valign="top"><b>Attribute</b></td>
   *   <td valign="top"><b>Description</b></td>
   *   <td align="center" valign="top"><b>Required</b></td>
   * </tr>
   * <tr>
   *   <td valign="top">project</td>
   *   <td valign="top">the name of the Project to import to</td>
   *   <td align="center" valign="top">Yes</td>
   * </tr>
   * <tr>
   *   <td valign="top">importSources</td>
   *   <td valign="top">import Java sources, defaults to "yes"</td>
   *   <td align="center" valign="top">No</td>
   * </tr>
   * <tr>
   *   <td valign="top">importResources</td>
   *   <td valign="top">import resource files (anything that doesn't
   *                    end with .java or .class), defaults to "yes"</td>
   *   <td align="center" valign="top">No</td>
   * </tr>
   * <tr>
   *   <td valign="top">importClasses</td>
   *   <td valign="top">import class files, defaults to "no"</td>
   *   <td align="center" valign="top">No</td>
   * </tr>
   * </table>
   *
   * @author: Glenn McAllister, inspired by a similar task written by Peter 
Kelley
   */
  public class VAJImport extends Task {
        protected Vector filesets = new Vector();
        protected boolean importSources = true;
        protected boolean importResources = true;
        protected boolean importClasses = false;
        protected String importProject = null;
        protected Project vajproject = null;
  
        /**
         * The VisualAge for Java Project name to import into.
         */
        public void setProject(String projectName) {
                this.importProject = projectName;
        }
  
        /**
         * Adds a set of files (nested fileset attribute).
         */
        public void addFileset(FileSet set) {
                filesets.addElement(set);
        }
  
        /**
         * Import .class files.
         */
        public void setImportClasses(boolean importClasses) {
                this.importClasses = importClasses;
        }
  
        /**
         * Import resource files (anything that doesn't end in
         * .class or .java)
         */
        public void setImportResources(boolean importResources) {
                this.importResources = importResources;
        }
  
        /**
         * Import .java files
         */
        public void setImportSources(boolean importSources) {
                this.importSources = importSources;
        }
  
        /**
         * Do the import.
         */
        public void execute() throws BuildException {
                if (filesets.size() == 0) {
                        throw new BuildException("At least one fileset is 
required!");
                }
  
                if (importProject == null || "".equals(importProject)) {
                        throw new BuildException("The VisualAge for Java 
Project name is required!");
                }
  
                vajproject = getVAJProject();
                if (vajproject == null) {
                        try {
                                vajproject = 
VAJUtil.getWorkspace().createProject(this.importProject, true);
                        } catch (IvjException e) {
                                throw VAJUtil.createBuildException(
                                        "Error while creating Project " + 
importProject + ": ", 
                                        e); 
                        }
                }
  
                for (Enumeration e = filesets.elements(); e.hasMoreElements();) 
{
                        importFileset((FileSet) e.nextElement());
                }
        }
  
        /**
         * Try to get the project we want from the Workspace.
         */
        protected Project getVAJProject() {
                Project found = null;
                Project[] currentProjects = 
VAJUtil.getWorkspace().getProjects();
  
                for (int i = 0; i < currentProjects.length; i++) {
                        Project p = currentProjects[i];
                        if (p.getName().equals(this.importProject)) {
                                found = p;
                                break;
                        }
                }
  
                return found;
        }
  
        /**
         * Import all files from the fileset into the Project in the
         * Workspace.
         */
        protected void importFileset(FileSet fileset) {
                DirectoryScanner ds = fileset.getDirectoryScanner(this.project);
                if (ds.getIncludedFiles().length == 0) {
                        return;
                }
  
                Vector classes = new Vector();
                Vector sources = new Vector();
                Vector resources = new Vector();
  
                String[] classesArr = null;
                String[] sourcesArr = null;
                String[] resourcesArr = null;
  
                StringBuffer msg = new StringBuffer();
                msg.append("Importing ");
                String connector = "";
  
                ImportCodeSpec importSpec = new ImportCodeSpec();
                importSpec.setDefaultProject(vajproject);
  
                scan(
                        fileset.getDir(this.project), 
                        ds.getIncludedFiles(), 
                        classes, 
                        sources, 
                        resources); 
  
                if (importClasses) {
                        classesArr = new String[classes.size()];
                        classes.copyInto(classesArr);
                        importSpec.setClassFiles(classesArr);
                        if (classesArr.length > 0) {
                                msg.append( classesArr.length );
                                msg.append( " class " );
                                msg.append( classesArr.length > 1 ? "files" : 
"file" );
                                connector = ", ";
                        }
                }
  
                if (importSources) {
                        sourcesArr = new String[sources.size()];
                        sources.copyInto(sourcesArr);
                        importSpec.setJavaFiles(sourcesArr);
                        if (sourcesArr.length > 0) {
                                msg.append( connector );
                                msg.append( sourcesArr.length );
                                msg.append( " source " );
                                msg.append( sourcesArr.length > 1 ? "files" : 
"file" );
                                connector = ", ";
                        }
                }
  
                if (importResources) {
                        resourcesArr = new String[resources.size()];
                        resources.copyInto(resourcesArr);
                        
importSpec.setResourcePath(fileset.getDir(this.project).getAbsolutePath());
                        importSpec.setResourceFiles(resourcesArr);
                        if (resourcesArr.length > 0) {
                                msg.append( connector );
                                msg.append( resourcesArr.length );
                                msg.append( " resource " );
                                msg.append( resourcesArr.length > 1 ? "files" : 
"file" );
                        }
                }
  
                msg.append( " into the " );
                msg.append( importProject );
                msg.append( " project." );
  
                log(msg.toString());
                
                try {
                        Type[] importedTypes = 
VAJUtil.getWorkspace().importData(importSpec);
                        if (importedTypes == null) {
                                throw new BuildException("Unable to import into 
Workspace!");
                        }
                } catch (IvjException ivje) {
                        VAJUtil.createBuildException("Error while importing 
into Workspace: ", ivje);
                }
        }
  
        /**
         * Sort the files into classes, sources, and resources.
         */
        protected void scan(
                File dir, 
                String[] files, 
                Vector classes, 
                Vector sources, 
                Vector resources) {
                for (int i = 0; i < files.length; i++) {
                        String file = (new File(dir, 
files[i])).getAbsolutePath();
                        if (file.endsWith(".source") || 
file.endsWith(".SOURCE")) {
                                sources.addElement(file);
                        } else
                                if (file.endsWith(".class") || 
file.endsWith(".CLASS")) {
                                        classes.addElement(file);
                                } else {
                                        resources.addElement(file);
                                }
                }
        }
  }
  
  
  1.1                  
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJLoadProjects.java
  
  Index: VAJLoadProjects.java
  ===================================================================
  package org.apache.tools.ant.taskdefs.optional.ide;
  
  /*
   * 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 [EMAIL PROTECTED]
   *
   * 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/>.
   */
  
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.Project;
  import org.apache.tools.ant.Task;
  
  import com.ibm.ivj.util.base.IvjException;
  import com.ibm.ivj.util.base.ProjectEdition;
  
  import java.util.Vector;
  import java.util.Enumeration;
  
  /**
   * Load specific project versions into the Visual Age for Java workspace.
   * Each project and version name has to be specified completely.
   * Example:  
   * <blockquote> 
   * &lt;vajload>
   * &nbsp;&lt;project name="MyVAProject" version="2.1"/>
   * &nbsp;&lt;project name="Apache Xerces" version="1.2.0"/>
   * &lt;/vajload>
   * </blockquote>
   *
   * @author Wolf Siberski, TUI Infotec GmbH
   */
  
  public class VAJLoadProjects extends Task {
        Vector projectDescriptions = new Vector();
        Vector expandedProjectDescriptions = new Vector();
  
        /**
         * Class to maintain VisualAge for Java Workspace Project descriptions.
         */
        public class VAJProjectDescription {
                private String name;
                private String version;
                private boolean projectFound;
  
                public VAJProjectDescription() {
                }
  
                public VAJProjectDescription(String n, String v) {
                        name = n;
                        version = v;
                }
  
                public String getName() {
                        return name;
                }
  
                public String getVersion() {
                        return version;
                }
  
                public boolean projectFound() {
                        return projectFound;
                }
  
                public void setName(String newName) {
                        if (newName == null || newName.equals("")) {
                                throw new BuildException("name attribute must 
be set");
                        }
                        name = newName;
                }
  
                public void setVersion(String newVersion) {
                        if (newVersion == null || newVersion.equals("")) {
                                throw new BuildException("version attribute 
must be set");
                        }
                        version = newVersion;
                }
  
                public void setProjectFound() {
                        projectFound = true;
                }
        }
      
        /**
         * Add a project description entry on the project list.
         */
        public VAJProjectDescription createProject() {
                VAJProjectDescription d = new VAJProjectDescription();
                projectDescriptions.addElement(d);
                return d;
        }
        /**
         * Load specified projects.
         */
        public void execute() {
                expandDescriptions();
                log(
                        "Loading " + expandedProjectDescriptions.size() + " 
project(s) into workspace"); 
                for (Enumeration e = expandedProjectDescriptions.elements(); 
                        e.hasMoreElements(); 
                        ) {
                        VAJProjectDescription d = (VAJProjectDescription) 
e.nextElement();
  
                        ProjectEdition pe = findProjectEdition(d.getName(), 
d.getVersion());
                        try {
                                log(
                                        "Loading " + d.getName() + ", Version " 
+ d.getVersion() + ", into Workspace", 
                                        Project.MSG_VERBOSE); 
                                pe.loadIntoWorkspace();
                        } catch (IvjException ex) {
                                throw VAJUtil.createBuildException(
                                        "Project " + d.getName() + " could not 
be loaded.", 
                                        ex); 
                        }
                }
        }
  
        /**
         */
        public void expandDescriptions() {
                String[] projectNames;
                try {
                        projectNames = 
VAJUtil.getWorkspace().getRepository().getProjectNames();
                } catch (IvjException e) {
                        throw VAJUtil.createBuildException("VA Exception 
occured: ", e);
                }
  
                for (int i = 0; i < projectNames.length; i++) {
                        for (Enumeration e = projectDescriptions.elements(); 
e.hasMoreElements();) {
                                VAJProjectDescription d = 
(VAJProjectDescription) e.nextElement();
                                String pattern = d.getName();
                                if (VAJWorkspaceScanner.match(pattern, 
projectNames[i])) {
                                        d.setProjectFound();
                                        expandedProjectDescriptions.addElement(
                                                new 
VAJProjectDescription(projectNames[i], d.getVersion())); 
                                        break;
                                }
                        }
                }
  
                for (Enumeration e = projectDescriptions.elements(); 
e.hasMoreElements();) {
                        VAJProjectDescription d = (VAJProjectDescription) 
e.nextElement();
                        if (!d.projectFound()) {
                                log("No Projects match the name " + 
d.getName(), Project.MSG_WARN);
                        }
                }
        }
  
        /**
         */
        public static Vector findMatchingProjects(String pattern) {
                String[] projectNames;
                try {
                        projectNames = 
VAJUtil.getWorkspace().getRepository().getProjectNames();
                } catch (IvjException e) {
                        throw VAJUtil.createBuildException("VA Exception 
occured: ", e);
                }
  
                Vector matchingProjects = new Vector();
                for (int i = 0; i < projectNames.length; i++) {
                        if (VAJWorkspaceScanner.match(pattern, 
projectNames[i])) {
                                matchingProjects.addElement(projectNames[i]);
                        }
                }
  
                return matchingProjects;
        }
  
        /**
         * Finds a specific project edition in the repository.
         *
         * @param name project name
         * @param versionName project version name
         * @return com.ibm.ivj.util.base.ProjectEdition
         */
        public static ProjectEdition findProjectEdition(
                String name, 
                String versionName) {
                try {
                        ProjectEdition[] editions = null;
                        editions = 
VAJUtil.getWorkspace().getRepository().getProjectEditions(name);
  
                        if (editions == null) {
                                throw new BuildException("Project " + name + " 
doesn't exist");
                        }
  
                        ProjectEdition pe = null;
  
                        for (int i = 0; i < editions.length && pe == null; i++) 
{
                                if 
(versionName.equals(editions[i].getVersionName())) {
                                        pe = editions[i];
                                }
                        }
                        if (pe == null) {
                                throw new BuildException(
                                        "Version " + versionName + " of Project 
" + name + " doesn't exist"); 
                        }
                        return pe;
  
                } catch (IvjException e) {
                        throw VAJUtil.createBuildException("VA Exception 
occured: ", e);
                }
  
        }
  }
  
  
  1.1                  
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJUtil.java
  
  Index: VAJUtil.java
  ===================================================================
  package org.apache.tools.ant.taskdefs.optional.ide;
  
  /*
   * 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 [EMAIL PROTECTED]
   *
   * 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/>.
   */
  
  import com.ibm.ivj.util.base.Workspace;
  import com.ibm.ivj.util.base.ToolEnv;
  import com.ibm.ivj.util.base.IvjException;
  import org.apache.tools.ant.BuildException;
  
  /**
   * Helper class for VAJ tasks. Holds Workspace singleton and
   * wraps IvjExceptions into BuildExceptions
   *
   * @author Wolf Siberski, TUI Infotec GmbH
   */
  class VAJUtil {
        static private Workspace workspace;
        
        /**
         * Wraps IvjException into a BuildException
         *
         * @return org.apache.tools.ant.BuildException
         * @param errMsg Additional error message
         * @param e IvjException which is wrapped
         */
        public static BuildException createBuildException(
                String errMsg, 
                IvjException e) {
                errMsg = errMsg + "\n" + e.getMessage();
                String[] errors = e.getErrors();
                if (errors != null) {
                        for (int i = 0; i < errors.length; i++) {
                                errMsg = errMsg + "\n" + errors[i];
                        }
                }
                return new BuildException(errMsg);
        }
        
        /**
         * Insert the method's description here.
         * Creation date: (19.09.2000 13:41:21)
         * @return com.ibm.ivj.util.base.Workspace
         */
        public static Workspace getWorkspace() {
                if (workspace == null) {
                        workspace = ToolEnv.connectToWorkspace();
                        if (workspace == null) {
                                throw new BuildException(
                                        "Unable to connect to Workspace! "
                                                + "Make sure you are running in 
VisualAge for Java."); 
                        }
                }
  
                return workspace;
        }
  }
  
  
  1.1                  
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJWorkspaceScanner.java
  
  Index: VAJWorkspaceScanner.java
  ===================================================================
  package org.apache.tools.ant.taskdefs.optional.ide;
  
  /*
   * 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 [EMAIL PROTECTED]
   *
   * 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/>.
   */
  
  import org.apache.tools.ant.DirectoryScanner;
  import com.ibm.ivj.util.base.IvjException;
  import com.ibm.ivj.util.base.Package;
  import com.ibm.ivj.util.base.Project;
  import java.util.Enumeration;
  import java.util.Vector;
  import java.util.StringTokenizer;
  import java.io.File;
  
  /**
   * Class for scanning a Visual Age for Java workspace for packages matching
   * a certain criteria.
   * <p>
   * These criteria consist of a set of include and exclude patterns. With these
   * patterns, you can select which packages you want to have included, and 
which
   * packages you want to have excluded.  You can add patterns to be excluded by
   * default with the addDefaultExcludes method.  The patters that are excluded
   * by default include
   * <ul>
   *   <li>IBM*\**</li>
   *   <li>Java class libraries\**</li>
   *   <li>Sun class libraries*\**</li>
   *   <li>JSP Page Compile Generated Code\**</li>
   *   <li>VisualAge*\**</li>
   * </ul>
   * <p>
   * This class works like DirectoryScanner. 
   *
   * @see org.apache.tools.ant.DirectoryScanner
   *
   * @author Wolf Siberski, TUI Infotec (based on Arnout J. Kuipers 
DirectoryScanner)
   */
  public class VAJWorkspaceScanner extends DirectoryScanner {
  
        /**
         * Patterns that should be excluded by default.
         *
         * @see #addDefaultExcludes()
         */
        private final static String[] DEFAULTEXCLUDES = 
                {
                        "IBM*/**", 
                        "Java class libraries/**", 
                        "Sun class libraries*/**", 
                        "JSP Page Compile Generated Code/**", 
                        "VisualAge*/**", 
                        }; 
  
        /**
         * The packages that where found and matched at least one includes, and
         * matched no excludes.
         */
        private Vector packagesIncluded = new Vector();
     
        /**
         * Adds the array with default exclusions to the current exclusions set.
         */
        public void addDefaultExcludes() {
                int excludesLength = excludes == null ? 0 : excludes.length;
                String[] newExcludes;
                newExcludes = new String[excludesLength + 
DEFAULTEXCLUDES.length];
                if (excludesLength > 0) {
                        System.arraycopy(excludes, 0, newExcludes, 0, 
excludesLength);
                }
                for (int i = 0; i < DEFAULTEXCLUDES.length; i++) {
                        newExcludes[i + excludesLength] = 
                                DEFAULTEXCLUDES[i].replace('/', 
File.separatorChar).replace(
                                        '\\', 
                                        File.separatorChar); 
                }
                excludes = newExcludes;
        }
        
        /**
         * Finds all Projects specified in include patterns.
         *
         * @return the projects
         */
        public Vector findMatchingProjects() {
                Project[] projects = VAJUtil.getWorkspace().getProjects();
  
                Vector matchingProjects = new Vector();
  
                boolean allProjectsMatch = false;
                for (int i = 0; i < projects.length; i++) {
                        Project project = projects[i];
                        for (int j = 0; j < includes.length && 
!allProjectsMatch; j++) {
                                StringTokenizer tok = new 
StringTokenizer(includes[j], File.separator);
                                String projectNamePattern = tok.nextToken();
                                if (projectNamePattern.equals("**")) {
                                        // if an include pattern starts with 
'**', 
                                        // all projects match
                                        allProjectsMatch = true;
                                } else
                                        if (match(projectNamePattern, 
project.getName())) {
                                                
matchingProjects.addElement(project);
                                                break;
                                        }
                        }
                }
  
                if (allProjectsMatch) {
                        matchingProjects = new Vector();
                        for (int i = 0; i < projects.length; i++) {
                                matchingProjects.addElement(projects[i]);
                        }
                }
  
                return matchingProjects;
        }
        
        /**
         * Get the names of the packages that matched at least one of the 
include
         * patterns, and didn't match one of the exclude patterns.
         *
         * @return the matching packages
         */
        public Package[] getIncludedPackages() {
                int count = packagesIncluded.size();
                Package[] packages = new Package[count];
                for (int i = 0; i < count; i++) {
                        packages[i] = (Package) packagesIncluded.elementAt(i);
                }
                return packages;
        }
        
        /**
         * Matches a string against a pattern. The pattern contains two special
         * characters:
         * '*' which means zero or more characters,
         * '?' which means one and only one character.
         *
         * @param pattern the (non-null) pattern to match against
         * @param str     the (non-null) string that must be matched against the
         *                pattern
         *
         * @return <code>true</code> when the string matches against the 
pattern,
         *         <code>false</code> otherwise.
         */
        protected static boolean match(String pattern, String str) {
                return DirectoryScanner.match(pattern, str);
        }
        /**
         * Scans the workspace for packages that match at least one include
         * pattern, and don't match any exclude patterns.
         *
         */
        public void scan() {
                if (includes == null) {
                        // No includes supplied, so set it to 'matches all'
                        includes = new String[1];
                        includes[0] = "**";
                }
                if (excludes == null) {
                        excludes = new String[0];
                }
  
                // only scan projects which are included in at least one 
include pattern
                Vector matchingProjects = findMatchingProjects();
                for (Enumeration e = matchingProjects.elements(); 
e.hasMoreElements();) {
                        Project project = (Project) e.nextElement();
                        scanProject(project);
                }
        }
        
        /**
         * Scans a project for packages that match at least one include
         * pattern, and don't match any exclude patterns.
         *
         */
        public void scanProject(Project project) {
                try {
                        Package[] packages = project.getPackages();
                        if (packages != null) {
                                for (int i = 0; i < packages.length; i++) {
                                        Package item = packages[i];
                                        // replace '.' by file seperator 
because the patterns are
                                        // using file seperator syntax (and we 
can use the match
                                        // methods this way).
                                        String name = 
                                                project.getName()
                                                        + File.separator
                                                        + 
item.getName().replace('.', File.separatorChar); 
                                        if (isIncluded(name) && 
!isExcluded(name)) {
                                                
packagesIncluded.addElement(item);
                                        }
                                }
                        }
                } catch (IvjException e) {
                        throw VAJUtil.createBuildException("VA Exception 
occured: ", e);
                }
        }
  }
  
  

Reply via email to