blob: 1668ab9c919183654f0da49c3a682b56eb108e79 [file] [log] [blame]
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001-2002 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", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.optional.ide;
import java.util.Vector;
import java.util.Enumeration;
import java.io.File;
import com.ibm.ivj.util.base.Package;
import com.ibm.ivj.util.base.IvjException;
import com.ibm.ivj.util.base.Workspace;
import com.ibm.ivj.util.base.ToolEnv;
import com.ibm.ivj.util.base.ExportCodeSpec;
import com.ibm.ivj.util.base.ProjectEdition;
import com.ibm.ivj.util.base.ImportCodeSpec;
import com.ibm.ivj.util.base.Type;
import com.ibm.ivj.util.base.Project;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
/**
* Helper class for VAJ tasks. Holds Workspace singleton and
* wraps IvjExceptions into BuildExceptions
*
* @author Wolf Siberski, TUI Infotec GmbH
*/
abstract class VAJLocalUtil implements VAJUtil{
// singleton containing the VAJ workspace
private static Workspace workspace;
/**
* Wraps IvjException into a BuildException
*
* @return org.apache.tools.ant.BuildException
* @param errMsg Additional error message
* @param e IvjException which is wrapped
*/
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, e);
}
/**
* returns the current VAJ workspace.
* @return com.ibm.ivj.util.base.Workspace
*/
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;
}
//-----------------------------------------------------------
// export
//-----------------------------------------------------------
/**
* export packages
*/
public void exportPackages(
File dest,
String[] includePatterns, String[] excludePatterns,
boolean exportClasses, boolean exportDebugInfo,
boolean exportResources, boolean exportSources,
boolean useDefaultExcludes, boolean overwrite) {
if (includePatterns == null || includePatterns.length == 0) {
log("You must specify at least one include attribute. "
+ "Not exporting", MSG_ERR);
} else {
try {
VAJWorkspaceScanner scanner = new VAJWorkspaceScanner();
scanner.setIncludes(includePatterns);
scanner.setExcludes(excludePatterns);
if (useDefaultExcludes) {
scanner.addDefaultExcludes();
}
scanner.scan();
Package[] packages = scanner.getIncludedPackages();
log("Exporting " + packages.length + " package(s) to "
+ dest, MSG_INFO);
for (int i = 0; i < packages.length; i++) {
log(" " + packages[i].getName(), 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(overwrite);
exportSpec.setExportDirectory(dest.getAbsolutePath());
getWorkspace().exportData(exportSpec);
} catch (IvjException ex) {
throw createBuildException("Exporting failed!", ex);
}
}
}
//-----------------------------------------------------------
// load
//-----------------------------------------------------------
/**
* Load specified projects.
*/
public void loadProjects(Vector projectDescriptions) {
Vector expandedDescs = getExpandedDescriptions(projectDescriptions);
// output warnings for projects not found
for (Enumeration e = projectDescriptions.elements(); e.hasMoreElements();) {
VAJProjectDescription d = (VAJProjectDescription) e.nextElement();
if (!d.projectFound()) {
log("No Projects match the name " + d.getName(), MSG_WARN);
}
}
log("Loading " + expandedDescs.size()
+ " project(s) into workspace", MSG_INFO);
for (Enumeration e = expandedDescs.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", MSG_VERBOSE);
pe.loadIntoWorkspace();
} catch (IvjException ex) {
throw createBuildException("Project '" + d.getName()
+ "' could not be loaded.", ex);
}
}
}
/**
* returns a list of project names matching the given pattern
*/
private Vector findMatchingProjects(String pattern) {
String[] projectNames;
try {
projectNames = getWorkspace().getRepository().getProjectNames();
} catch (IvjException e) {
throw 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;
}
/**
* return project descriptions containing full project names instead
* of patterns with wildcards.
*/
private Vector getExpandedDescriptions(Vector projectDescs) {
Vector expandedDescs = new Vector(projectDescs.size());
try {
String[] projectNames =
getWorkspace().getRepository().getProjectNames();
for (int i = 0; i < projectNames.length; i++) {
for (Enumeration e = projectDescs.elements();
e.hasMoreElements();) {
VAJProjectDescription d = (VAJProjectDescription) e.nextElement();
String pattern = d.getName();
if (VAJWorkspaceScanner.match(pattern, projectNames[i])) {
d.setProjectFound();
expandedDescs.addElement(new VAJProjectDescription(
projectNames[i], d.getVersion()));
break;
}
}
}
} catch (IvjException e) {
throw createBuildException("VA Exception occured: ", e);
}
return expandedDescs;
}
/**
* Finds a specific project edition in the repository.
*
* @param name project name
* @param versionName project version name
* @return com.ibm.ivj.util.base.ProjectEdition the specified edition
*/
private ProjectEdition findProjectEdition(
String name, String versionName) {
try {
ProjectEdition[] editions = null;
editions = 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 createBuildException("VA Exception occured: ", e);
}
}
//-----------------------------------------------------------
// import
//-----------------------------------------------------------
/**
* Do the import.
*/
public void importFiles(
String importProject, File srcDir,
String[] includePatterns, String[] excludePatterns,
boolean importClasses, boolean importResources,
boolean importSources, boolean useDefaultExcludes)
throws BuildException {
if (importProject == null || "".equals(importProject)) {
throw new BuildException("The VisualAge for Java project "
+ "name is required!");
}
ImportCodeSpec importSpec = new ImportCodeSpec();
importSpec.setDefaultProject(getVAJProject(importProject));
DirectoryScanner ds = new DirectoryScanner();
ds.setBasedir(srcDir);
ds.setIncludes(includePatterns);
ds.setExcludes(excludePatterns);
if (useDefaultExcludes) {
ds.addDefaultExcludes();
}
ds.scan();
Vector classes = new Vector();
Vector sources = new Vector();
Vector resources = new Vector();
scanForImport(srcDir, ds.getIncludedFiles(), classes, sources, resources);
StringBuffer summaryLog = new StringBuffer("Importing ");
addFilesToImport(importSpec, importClasses, classes, "Class", summaryLog);
addFilesToImport(importSpec, importSources, sources, "Java", summaryLog);
addFilesToImport(importSpec, importResources, resources, "Resource", summaryLog);
importSpec.setResourcePath(srcDir.getAbsolutePath());
summaryLog.append(" into the project '");
summaryLog.append(importProject);
summaryLog.append("'.");
log(summaryLog.toString(), MSG_INFO);
try {
Type[] importedTypes = getWorkspace().importData(importSpec);
if (importedTypes == null) {
throw new BuildException("Unable to import into Workspace!");
} else {
log(importedTypes.length + " types imported", MSG_DEBUG);
for (int i = 0; i < importedTypes.length; i++) {
log(importedTypes[i].getPackage().getName()
+ "." + importedTypes[i].getName()
+ " into " + importedTypes[i].getProject().getName(),
MSG_DEBUG);
}
}
} catch (IvjException ivje) {
throw createBuildException("Error while importing into workspace: ",
ivje);
}
}
/**
* get a project from the Workspace.
*/
static Project getVAJProject(String importProject) {
Project found = null;
Project[] currentProjects = getWorkspace().getProjects();
for (int i = 0; i < currentProjects.length; i++) {
Project p = currentProjects[i];
if (p.getName().equals(importProject)) {
found = p;
break;
}
}
if (found == null) {
try {
found = getWorkspace().createProject(importProject, true);
} catch (IvjException e) {
throw createBuildException("Error while creating Project "
+ importProject + ": ", e);
}
}
return found;
}
/**
* Sort the files into classes, sources, and resources.
*/
private void scanForImport(
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(".java") || file.endsWith(".JAVA")) {
sources.addElement(file);
} else
if (file.endsWith(".class") || file.endsWith(".CLASS")) {
classes.addElement(file);
} else {
// for resources VA expects the path relative to the resource path
resources.addElement(files[i]);
}
}
}
/**
* Adds files to an import specification. Helper method
* for importFiles()
*
* @param spec import specification
* @param doImport only add files if doImport is true
* @param files the files to add
* @param fileType type of files (Source/Class/Resource)
* @param summaryLog buffer for logging
*/
private void addFilesToImport(ImportCodeSpec spec, boolean doImport,
Vector files, String fileType,
StringBuffer summaryLog) {
if (doImport) {
String[] fileArr = new String[files.size()];
files.copyInto(fileArr);
try {
// here it is assumed that fileType is one of the
// following strings: // "Java", "Class", "Resource"
String methodName = "set" + fileType + "Files";
Class[] methodParams = new Class[]{fileArr.getClass()};
java.lang.reflect.Method method =
spec.getClass().getDeclaredMethod(methodName, methodParams);
method.invoke(spec, new Object[]{fileArr});
} catch (Exception e) {
throw new BuildException(e);
}
if (files.size() > 0) {
logFiles(files, fileType);
summaryLog.append(files.size());
summaryLog.append(" " + fileType.toLowerCase() + " file");
summaryLog.append(files.size() > 1 ? "s, " : ", ");
}
}
}
/**
* Logs a list of file names to the message log
* @param fileNames java.util.Vector file names to be logged
* @param type java.lang.String file type
*/
private void logFiles(Vector fileNames, String fileType) {
log(fileType + " files found for import:", MSG_VERBOSE);
for (Enumeration e = fileNames.elements(); e.hasMoreElements();) {
log(" " + e.nextElement(), MSG_VERBOSE);
}
}
}