You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by gl...@locus.apache.org on 2000/11/07 21:19:54 UTC

cvs commit: jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/ide VAJExport.java VAJImport.java VAJLoadProjects.java VAJUtil.java VAJWorkspaceScanner.java

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 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/>.
   */
  
  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 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/>.
   */
  
  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 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/>.
   */
  
  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 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/>.
   */
  
  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 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/>.
   */
  
  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);
  		}
  	}
  }