Browse Source

"Finally I managed to finish a new version of the VAJ tasks. The most

important new feature is the ability to execute VAJ tasks from the
command line by exploiting the Remote Tool Access feature of VAJ."

Submitted by:	wolf.siberski@tui.de

Some patches look a lot larger as I had to remove stray CRs, I also
killed TABs wherever I stumbled over them.


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269819 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 23 years ago
parent
commit
fcd6548344
22 changed files with 4196 additions and 2722 deletions
  1. +13
    -9
      WHATSNEW
  2. +6
    -0
      build.xml
  3. +453
    -514
      docs/manual/Integration/VAJAntTool.html
  4. BIN
      docs/manual/Integration/anttool1.gif
  5. BIN
      docs/manual/Integration/remacc.gif
  6. +81
    -61
      src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJAntTool.java
  7. +1270
    -1252
      src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJAntToolGUI.java
  8. +440
    -263
      src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJBuildInfo.java
  9. +123
    -152
      src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJExport.java
  10. +172
    -0
      src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJExportServlet.java
  11. +117
    -224
      src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJImport.java
  12. +102
    -0
      src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJImportServlet.java
  13. +92
    -0
      src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJLoad.java
  14. +17
    -183
      src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJLoadProjects.java
  15. +106
    -0
      src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJLoadServlet.java
  16. +465
    -0
      src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJLocalUtil.java
  17. +105
    -0
      src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJProjectDescription.java
  18. +250
    -0
      src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJRemoteUtil.java
  19. +103
    -0
      src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJTask.java
  20. +226
    -0
      src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJToolsServlet.java
  21. +40
    -46
      src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJUtil.java
  22. +15
    -18
      src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJWorkspaceScanner.java

+ 13
- 9
WHATSNEW View File

@@ -4,6 +4,16 @@ Changes from Ant 1.4.1 to current CVS version
Changes that could break older environments:
--------------------------------------------

Fixed bugs:
-----------

* Fixed bug where ant would not copy system properties into new Project
in ant/antcall tasks when inheritall="false" is set.

* <propertyfile> would not close the original property file.

* <ant> will no longer override a subbuilds basedir with inheritall="true".

Other changes:
--------------

@@ -23,15 +33,9 @@ Other changes:
* <taskdef> and <typedef> will now emit a warning if a task/type of
the given name already exists.

Fixed bugs:
-----------

* Fixed bug where ant would not copy system properties into new Project
in ant/antcall tasks when inheritall="false" is set.

* <propertyfile> would not close the original property file.

* <ant> will no longer override a subbuilds basedir with inheritall="true".
* A new revision of VAJ tasks: The most important new feature
is the ability to execute VAJ tasks from the command line by
exploiting the Remote Tool Access feature of VAJ.

Changes from Ant 1.4 to Ant 1.4.1
===========================================


+ 6
- 0
build.xml View File

@@ -161,6 +161,10 @@
<available property="xalan.envcheck"
classname="org.apache.xalan.xslt.EnvironmentCheck"
classpathref="classpath" />

<available property="servlet.present"
classname="javax.servlet.Servlet"
classpathref="classpath"/>
<condition property="javamail.complete">
<and>
@@ -238,6 +242,8 @@
<exclude name="${optional.package}/scm/AntStarTeam*.java" unless="starteam.present" />
<exclude name="${optional.package}/ANTLR.java" unless="antlr.present" />
<exclude name="${optional.package}/ide/VAJ*.java" unless="vaj.present" />
<exclude name="${optional.package}/ide/VAJ*Servlet.java"
unless="servlet.present" />
<exclude name="${optional.package}/perforce/*.java" unless="jakarta.oro.present" />
<exclude name="${optional.package}/sound/*.java" unless="jmf.present" />
<exclude name="${optional.package}/junit/XMLResultAggregator.java"


+ 453
- 514
docs/manual/Integration/VAJAntTool.html
File diff suppressed because it is too large
View File


BIN
docs/manual/Integration/anttool1.gif View File

Before After
Width: 389  |  Height: 222  |  Size: 7.1 KiB Width: 389  |  Height: 241  |  Size: 4.1 KiB

BIN
docs/manual/Integration/remacc.gif View File

Before After
Width: 587  |  Height: 645  |  Size: 11 KiB

+ 81
- 61
src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJAntTool.java View File

@@ -1,5 +1,3 @@
package org.apache.tools.ant.taskdefs.optional.ide;

/*
* The Apache Software License, Version 1.1
*
@@ -53,11 +51,16 @@ package org.apache.tools.ant.taskdefs.optional.ide;
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/

package org.apache.tools.ant.taskdefs.optional.ide;


import com.ibm.ivj.util.base.Project;
import com.ibm.ivj.util.base.ToolData;
import com.ibm.ivj.util.base.IvjException;
import org.apache.tools.ant.BuildException;


/**
* This class is the equivalent to org.apache.tools.ant.Main for the
* VAJ tool environment. It's main is called when the user selects
@@ -68,64 +71,81 @@ import org.apache.tools.ant.BuildException;
* @author: Wolf Siberski
*/
public class VAJAntTool {
private static final String TOOL_DATA_KEY = "AntTool";
/**
* Loads the BuildInfo for the specified VAJ project from the
* tool data for this project.
* If there is no build info stored for that project, a new
* default BuildInfo is returned
*
* @return BuildInfo buildInfo build info for the specified project
* @param projectName String project name
*/
public static VAJBuildInfo loadBuildData(String projectName) {
VAJBuildInfo result = null;
try {
Project project = VAJUtil.getWorkspace().loadedProjectNamed( projectName );
if ( project.testToolRepositoryData(TOOL_DATA_KEY) ) {
ToolData td = project.getToolRepositoryData(TOOL_DATA_KEY);
String data = (String)td.getData();
result = VAJBuildInfo.parse( data );
} else {
result = new VAJBuildInfo();
}
result.setVAJProjectName( projectName );
} catch (Throwable t) {
System.out.println("BuildInfo for Project " + projectName +
" could not be loaded" + t);
throw new BuildException(t);
}
return result;
}
/**
* Starts the application.
* @param args an array of command-line arguments
*/
public static void main(java.lang.String[] args) {
VAJBuildInfo info;
if ( args.length >= 2 && args[1] instanceof String ) {
String projectName = (String)args[1];
info = loadBuildData( projectName );
}
else {
info = new VAJBuildInfo();
}
private static final String TOOL_DATA_KEY = "AntTool";

VAJAntToolGUI mainFrame = new VAJAntToolGUI( info );
mainFrame.show();
}
/**
* Saves the BuildInfo for a project in the VAJ repository.
* @param info BuildInfo build info to save
*/
public static void saveBuildData(VAJBuildInfo info) {
String data = info.asDataString();
try {
ToolData td = new ToolData( TOOL_DATA_KEY, data );
VAJUtil.getWorkspace().loadedProjectNamed( info.getVAJProjectName() ).setToolRepositoryData( td );
} catch (Throwable t) {
throw new BuildException("BuildInfo for Project " + info.getVAJProjectName() +
" could not be saved", t);
}
}
/**
* Loads the BuildInfo for the specified VAJ project from the
* tool data for this project.
* If there is no build info stored for that project, a new
* default BuildInfo is returned
*
* @return BuildInfo buildInfo build info for the specified project
* @param projectName String project name
*/
public static VAJBuildInfo loadBuildData(String projectName) {
VAJBuildInfo result = null;
try {
Project project =
VAJLocalUtil.getWorkspace().loadedProjectNamed( projectName );
if ( project.testToolRepositoryData(TOOL_DATA_KEY) ) {
ToolData td = project.getToolRepositoryData(TOOL_DATA_KEY);
String data = (String)td.getData();
result = VAJBuildInfo.parse( data );
} else {
result = new VAJBuildInfo();
}
result.setVAJProjectName( projectName );
} catch (Throwable t) {
throw new BuildException("BuildInfo for Project "
+ projectName + " could not be loaded" + t);
}
return result;
}


/**
* Starts the application.
*
* @param args an array of command-line arguments. VAJ puts the
* VAJ project name into args[1] when starting the
* tool from the project context menu
*/
public static void main(java.lang.String[] args) {
try {
VAJBuildInfo info;
if ( args.length >= 2 && args[1] instanceof String ) {
String projectName = (String)args[1];
info = loadBuildData( projectName );
}
else {
info = new VAJBuildInfo();
}
VAJAntToolGUI mainFrame = new VAJAntToolGUI( info );
mainFrame.show();
} catch ( Throwable t ) {
// if all error handling fails, output at least
// something on the console
t.printStackTrace();
}
}


/**
* Saves the BuildInfo for a project in the VAJ repository.
*
* @param info BuildInfo build info to save
*/
public static void saveBuildData(VAJBuildInfo info) {
String data = info.asDataString();
try {
ToolData td = new ToolData( TOOL_DATA_KEY, data );
VAJLocalUtil.getWorkspace().loadedProjectNamed(
info.getVAJProjectName() ).setToolRepositoryData( td );
} catch (Throwable t) {
throw new BuildException("BuildInfo for Project "
+ info.getVAJProjectName() + " could not be saved", t);
}
}
}

+ 1270
- 1252
src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJAntToolGUI.java
File diff suppressed because it is too large
View File


+ 440
- 263
src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJBuildInfo.java View File

@@ -1,5 +1,3 @@
package org.apache.tools.ant.taskdefs.optional.ide;

/*
* The Apache Software License, Version 1.1
*
@@ -53,11 +51,23 @@ package org.apache.tools.ant.taskdefs.optional.ide;
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
import java.util.Hashtable;

package org.apache.tools.ant.taskdefs.optional.ide;

import java.util.Vector;
import java.util.Enumeration;
import org.apache.tools.ant.*;
import java.util.StringTokenizer;
import java.io.File;
import java.beans.PropertyChangeSupport;
import java.beans.PropertyChangeListener;

import org.apache.tools.ant.Project;
import org.apache.tools.ant.ProjectHelper;
import org.apache.tools.ant.Target;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.BuildListener;
import org.apache.tools.ant.BuildEvent;

/**
* This class wraps the Ant project information needed to
@@ -68,276 +78,443 @@ import java.io.File;
* as ToolData in the VA repository)
* - wraps Project functions for the GUI (get target list,
* execute target)
* - manages a seperate thread for Ant project execution
* this allows interrupting a running build from a GUI
*
* @author Wolf Siberski, TUI Infotec GmbH
*/

public class VAJBuildInfo {
// name of the VA project this BuildInfo belongs to
private String vajProjectName = "";
class VAJBuildInfo implements Runnable {
/**
* This exception is thrown when a build is interrupted
*/
static public class BuildInterruptedException extends BuildException {
public String toString() {
return "BUILD INTERRUPTED";
}
}

/**
* BuildListener which checks for interruption and throws Exception
* if build process is interrupted. This class is a wrapper around
* a 'real' listener.
*/
private class InterruptedChecker implements BuildListener {
// the real listener
BuildListener wrappedListener;
/**
* Can only be constructed as wrapper around a real listener
* @param listener the real listener
*/
public InterruptedChecker( BuildListener listener) {
super();
wrappedListener = listener;
}

/**
* checks if the thread was interrupted. When an
* interrupt occured, throw an Exception to stop
* the execution.
*/
protected void checkInterrupted() {
if ( buildThread.isInterrupted() ) {
throw new BuildInterruptedException();
}
}

/**
* Fired after the last target has finished. This event
* will still be thrown if an error occured during the build.
*/
public void buildFinished(BuildEvent event) {
wrappedListener.buildFinished( event );
checkInterrupted();
}

/**
* Fired before any targets are started.
*/
public void buildStarted(BuildEvent event) {
wrappedListener.buildStarted( event );
checkInterrupted();
}

/**
* Fired whenever a message is logged.
*/
public void messageLogged(BuildEvent event) {
wrappedListener.messageLogged( event );
checkInterrupted();
}

/**
* Fired when a target has finished. This event will
* still be thrown if an error occured during the build.
*/
public void targetFinished(BuildEvent event) {
wrappedListener.targetFinished( event );
checkInterrupted();
}

/**
* Fired when a target is started.
*/
public void targetStarted(BuildEvent event) {
wrappedListener.targetStarted( event );
checkInterrupted();
}

/**
* Fired when a task has finished. This event will still
* be throw if an error occured during the build.
*/
public void taskFinished(BuildEvent event) {
wrappedListener.taskFinished( event );
checkInterrupted();
}

/**
* Fired when a task is started.
*/
public void taskStarted(BuildEvent event) {
wrappedListener.taskStarted( event );
checkInterrupted();
}
}
// name of the Ant build file
private String buildFileName = "";
// name of the VA project this BuildInfo belongs to
private String vajProjectName = "";
// name of the Ant build file
private String buildFileName = "";

// main targets found in the build file
private Vector projectTargets = new Vector();
// main targets found in the build file
private Vector projectTargets = new Vector();

// target selected for execution
private java.lang.String target = "";
// target selected for execution
private java.lang.String target = "";

// log level
private int outputMessageLevel = Project.MSG_INFO;
// log level
private int outputMessageLevel = Project.MSG_INFO;

// Ant Project created from build file
private transient Project project;
// Ant Project created from build file
private transient Project project;

// is true if Project initialization was successful
private transient boolean projectInitialized = false;
// is true if Project initialization was successful
private transient boolean projectInitialized = false;

// Support for bound properties
protected transient java.beans.PropertyChangeSupport propertyChange;
/**
* The addPropertyChangeListener method was generated to support the propertyChange field.
*/
public synchronized void addPropertyChangeListener(java.beans.PropertyChangeListener listener) {
getPropertyChange().addPropertyChangeListener(listener);
}
/**
* Returns the BuildInfo information as String. The BuildInfo can
* be rebuilt from that String by calling parse().
* @return java.lang.String
*/
public String asDataString() {
String result = getOutputMessageLevel() + "|" + getBuildFileName() + "|" + getTarget();
for ( Enumeration e = getProjectTargets().elements(); e.hasMoreElements(); ) {
result = result + "|" + e.nextElement();
}
// Support for bound properties
protected transient PropertyChangeSupport propertyChange;

// thread for Ant build execution
private Thread buildThread;

// the listener used to log output.
private BuildListener projectLogger;

return result;
}
/**
* Executes the target set by setTarget().
* @param listener BuildListener for the output of the build
*/
public void executeProject( BuildListener listener ) {
Throwable error = null;
try {
if (!isProjectInitialized()) {
project = new Project();
}
project.addBuildListener( listener );
// Chris: HACK: replace when Ant-Refactoring is finished!
// project.fireBuildStarted();
if (!isProjectInitialized()) {
initProject();
}
project.executeTarget(target);
} catch (RuntimeException exc) {
error = exc;
throw exc;
} catch (Error err) {
error = err;
throw err;
} finally {
// Chris: HACK: replace when Ant-Refactoring is finished!
// project.fireBuildFinished(error);
project.removeBuildListener( listener );
}
}
/**
* Search for the insert position to keep names a sorted list of Strings
* This method has been copied from org.apache.tools.ant.Main
*/
private static int findTargetPosition(Vector names, String name) {
int res = names.size();
for (int i=0; i<names.size() && res == names.size(); i++) {
if (name.compareTo((String)names.elementAt(i)) < 0) {
res = i;
}
}
return res;
}
/**
* The firePropertyChange method was generated to support the propertyChange field.
*/
public void firePropertyChange(java.lang.String propertyName, java.lang.Object oldValue, java.lang.Object newValue) {
getPropertyChange().firePropertyChange(propertyName, oldValue, newValue);
}
/**
* Returns the build file name.
* @return build file name.
*/
public String getBuildFileName() {
return buildFileName;
}
/**
* Returns the log level
* @return log level.
*/
public int getOutputMessageLevel() {
return outputMessageLevel;
}
/**
* Returns the Ant project
* @return org.apache.tools.ant.Project
*/
private Project getProject() {
return project;
}
/**
* return a list of all targets in the current buildfile
*/
public Vector getProjectTargets() {
return projectTargets;
}
/**
* Accessor for the propertyChange field.
*/
protected java.beans.PropertyChangeSupport getPropertyChange() {
if (propertyChange == null) {
propertyChange = new java.beans.PropertyChangeSupport(this);
};
return propertyChange;
}
/**
* Insert the method's description here.
* Creation date: (07.11.2000 10:34:18)
* @return java.lang.String
*/
public java.lang.String getTarget() {
return target;
}
/**
* returns the VA project name
* @return The projectName property value.
*/
public String getVAJProjectName() {
return vajProjectName;
}
/**
* Initializes the Ant project. Assumes that the
* project attribute is already set.
*/
private void initProject() {
try {
project.init();
File buildFile = new File(getBuildFileName());
project.setUserProperty("ant.file", buildFile.getAbsolutePath());
ProjectHelper.configureProject(project, buildFile);
setProjectInitialized(true);
} catch (RuntimeException exc) {
setProjectInitialized(false);
throw exc;
} catch (Error err) {
setProjectInitialized(false);
throw err;
}
}
/**
* Returns true, if the Ant project is initialized
* (i.e. buildfile loaded)
*/
public boolean isProjectInitialized() {
return projectInitialized;
}
/**
* Creates a BuildInfo object from a String
* The String must be in the format
* outputMessageLevel'|'buildFileName'|'defaultTarget'|'(project target'|')*
*
* @return org.apache.tools.ant.taskdefs.optional.vaj.BuildInfo
* @param data java.lang.String
*/
public static VAJBuildInfo parse(String data) {
VAJBuildInfo result = new VAJBuildInfo();

try {
java.util.StringTokenizer tok = new java.util.StringTokenizer( data, "|" );
result.setOutputMessageLevel( tok.nextToken() );
result.setBuildFileName( tok.nextToken() );
result.setTarget( tok.nextToken() );
while( tok.hasMoreTokens() ) {
result.projectTargets.addElement( tok.nextToken() );
}
} catch ( Throwable t ) {
}
return result;
}
/**
* The removePropertyChangeListener method was generated to support the propertyChange field.
*/
public synchronized void removePropertyChangeListener(java.beans.PropertyChangeListener listener) {
getPropertyChange().removePropertyChangeListener(listener);
}
/**
* Sets the build file name
* @param buildFileName build file name
*/
public void setBuildFileName(String newBuildFileName) {
String oldValue = buildFileName;
buildFileName = newBuildFileName;
setProjectInitialized(false);
firePropertyChange("buildFileName", oldValue, buildFileName);
}
/**
* Sets the log level (value must be one of the constants in Project)
* @param outputMessageLevel log level.
*/
public void setOutputMessageLevel(int newOutputMessageLevel) {
int oldValue = outputMessageLevel;
outputMessageLevel = newOutputMessageLevel;
firePropertyChange("outputMessageLevel", new Integer(oldValue), new Integer(outputMessageLevel));
}
/**
* Sets the log level (value must be one of the constants in Project)
* @param outputMessageLevel log level as String.
*/
private void setOutputMessageLevel(String outputMessageLevel) {
int level = Integer.parseInt( outputMessageLevel );
setOutputMessageLevel( level );
}
/**
*/
private void setProjectInitialized(boolean initialized) {
Boolean oldValue = new Boolean(projectInitialized);
projectInitialized = initialized;
firePropertyChange("projectInitialized", oldValue, new Boolean(projectInitialized));
}
/**
* Sets the target to execute when executeBuild is called
* @param newTarget build target
*/
public void setTarget(String newTarget) {
String oldValue = target;
target = newTarget;
firePropertyChange("target", oldValue, target);
}
/**
* Sets the name of the Visual Age for Java project where
* this BuildInfo belongs to
* @param newProjectName VAJ project
*/
public void setVAJProjectName(String newVAJProjectName) {
String oldValue = vajProjectName;
vajProjectName = newVAJProjectName;
firePropertyChange("VAJProjectName", oldValue, vajProjectName);
}
/**
* reloads the build file and updates the target list
*/
public void updateTargetList() {
project = new Project();
initProject();
projectTargets.removeAllElements();
Enumeration ptargets = project.getTargets().elements();
while (ptargets.hasMoreElements()) {
Target currentTarget = (Target) ptargets.nextElement();
if ( currentTarget.getDescription() != null ) {
String targetName = currentTarget.getName();
int pos = findTargetPosition( projectTargets, targetName );
projectTargets.insertElementAt(targetName, pos);
}
}
}
/**
* The addPropertyChangeListener method was generated to support the
* propertyChange field.
*/
public synchronized void addPropertyChangeListener(PropertyChangeListener listener) {
getPropertyChange().addPropertyChangeListener(listener);
}
/**
* Returns the BuildInfo information as String. The BuildInfo can
* be rebuilt from that String by calling parse().
* @return java.lang.String
*/
public String asDataString() {
String result = getOutputMessageLevel() + "|" + getBuildFileName()
+ "|" + getTarget();
for ( Enumeration e = getProjectTargets().elements();
e.hasMoreElements(); ) {
result = result + "|" + e.nextElement();
}

return result;
}

/**
* Search for the insert position to keep names a sorted list of Strings
* This method has been copied from org.apache.tools.ant.Main
*/
private static int findTargetPosition(Vector names, String name) {
int res = names.size();
for (int i=0; i<names.size() && res == names.size(); i++) {
if (name.compareTo((String)names.elementAt(i)) < 0) {
res = i;
}
}
return res;
}

/**
* The firePropertyChange method was generated to support the propertyChange field.
*/
public void firePropertyChange(java.lang.String propertyName, java.lang.Object oldValue, java.lang.Object newValue) {
getPropertyChange().firePropertyChange(propertyName, oldValue, newValue);
}

/**
* Returns the build file name.
* @return build file name.
*/
public String getBuildFileName() {
return buildFileName;
}

/**
* Returns the log level
* @return log level.
*/
public int getOutputMessageLevel() {
return outputMessageLevel;
}

/**
* Returns the Ant project
* @return org.apache.tools.ant.Project
*/
private Project getProject() {
if ( project == null ) {
project = new Project();
}
return project;
}
/**
* return a list of all targets in the current buildfile
*/
public Vector getProjectTargets() {
return projectTargets;
}
/**
* Accessor for the propertyChange field.
*/
protected PropertyChangeSupport getPropertyChange() {
if (propertyChange == null) {
propertyChange = new PropertyChangeSupport(this);
}
return propertyChange;
}

/**
* returns the selected target.
*/
public java.lang.String getTarget() {
return target;
}

/**
* returns the VA project name
*/
public String getVAJProjectName() {
return vajProjectName;
}

/**
* Initializes the Ant project. Assumes that the
* project attribute is already set.
*/
private void initProject() {
try {
project.init();
File buildFile = new File(getBuildFileName());
project.setUserProperty("ant.file", buildFile.getAbsolutePath());
ProjectHelper.configureProject(project, buildFile);
setProjectInitialized(true);
} catch (RuntimeException exc) {
setProjectInitialized(false);
throw exc;
} catch (Error err) {
setProjectInitialized(false);
throw err;
}
}

/**
* Returns true, if the Ant project is initialized
* (i.e. buildfile loaded)
*/
public boolean isProjectInitialized() {
return projectInitialized;
}

/**
* Creates a BuildInfo object from a String
* The String must be in the format
* outputMessageLevel'|'buildFileName'|'defaultTarget'|'(project target'|')*
*
* @return org.apache.tools.ant.taskdefs.optional.vaj.BuildInfo
* @param data java.lang.String
*/
public static VAJBuildInfo parse(String data) {
VAJBuildInfo result = new VAJBuildInfo();

try {
StringTokenizer tok = new StringTokenizer( data, "|" );
result.setOutputMessageLevel( tok.nextToken() );
result.setBuildFileName( tok.nextToken() );
result.setTarget( tok.nextToken() );
while( tok.hasMoreTokens() ) {
result.projectTargets.addElement( tok.nextToken() );
}
} catch ( Throwable t ) {
// if parsing the info fails, just return
// an empty VAJBuildInfo
}
return result;
}

/**
* The removePropertyChangeListener method was generated
* to support the propertyChange field.
*/
public synchronized void removePropertyChangeListener(PropertyChangeListener listener) {
getPropertyChange().removePropertyChangeListener(listener);
}
/**
* Sets the build file name
* @param buildFileName build file name
*/
public void setBuildFileName(String newBuildFileName) {
String oldValue = buildFileName;
buildFileName = newBuildFileName;
setProjectInitialized(false);
firePropertyChange("buildFileName", oldValue, buildFileName);
}
/**
* Sets the log level (value must be one of the constants in Project)
* @param outputMessageLevel log level.
*/
public void setOutputMessageLevel(int newOutputMessageLevel) {
int oldValue = outputMessageLevel;
outputMessageLevel = newOutputMessageLevel;
firePropertyChange("outputMessageLevel",
new Integer(oldValue), new Integer(outputMessageLevel));
}

/**
* Sets the log level (value must be one of the constants in Project)
* @param outputMessageLevel log level as String.
*/
private void setOutputMessageLevel(String outputMessageLevel) {
int level = Integer.parseInt( outputMessageLevel );
setOutputMessageLevel( level );
}
/**
* sets the initialized flag
*/
private void setProjectInitialized(boolean initialized) {
Boolean oldValue = new Boolean(projectInitialized);
projectInitialized = initialized;
firePropertyChange("projectInitialized", oldValue, new Boolean(projectInitialized));
}

/**
* Sets the target to execute when executeBuild is called
* @param newTarget build target
*/
public void setTarget(String newTarget) {
String oldValue = target;
target = newTarget;
firePropertyChange("target", oldValue, target);
}

/**
* Sets the name of the Visual Age for Java project where
* this BuildInfo belongs to
* @param newProjectName VAJ project
*/
public void setVAJProjectName(String newVAJProjectName) {
String oldValue = vajProjectName;
vajProjectName = newVAJProjectName;
firePropertyChange("VAJProjectName", oldValue, vajProjectName);
}

/**
* reloads the build file and updates the target list
*/
public void updateTargetList() {
project = new Project();
initProject();
projectTargets.removeAllElements();
Enumeration ptargets = project.getTargets().elements();
while (ptargets.hasMoreElements()) {
Target currentTarget = (Target) ptargets.nextElement();
if ( currentTarget.getDescription() != null ) {
String targetName = currentTarget.getName();
int pos = findTargetPosition( projectTargets, targetName );
projectTargets.insertElementAt(targetName, pos);
}
}
}


/**
* cancels a build.
*/
public void cancelBuild() {
buildThread.interrupt();
}

/**
* Executes the target set by setTarget().
* @param listener BuildListener for the output of the build
*/
public void executeProject( BuildListener logger ) {
Throwable error;
projectLogger = logger;
try {
buildThread = new Thread( this );
buildThread.setPriority(Thread.MIN_PRIORITY);
buildThread.start();
} catch (RuntimeException exc) {
error = exc;
throw exc;
} catch (Error err) {
error = err;
throw err;
}
}

/**
* Executes a build. This method is executed by
* the Ant execution thread
*/
public void run() {
try {
InterruptedChecker ic = new InterruptedChecker( projectLogger );
BuildEvent e = new BuildEvent( getProject() );
try {
ic.buildStarted(e);

if (!isProjectInitialized()) {
initProject();
}
project.addBuildListener( ic );
project.executeTarget(target);

ic.buildFinished( e );
} catch (Throwable t) {
e.setException( t );
ic.buildFinished( e );
} finally {
project.removeBuildListener( ic );
}
} catch ( Throwable t2 ) {
System.out.println("unexpected exception!");
t2.printStackTrace();
}
}
}

+ 123
- 152
src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJExport.java View File

@@ -55,17 +55,9 @@
package org.apache.tools.ant.taskdefs.optional.ide;




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.Enumeration;
import java.util.Vector;

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;

/**
@@ -96,146 +88,125 @@ import org.apache.tools.ant.types.PatternSet;
* @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);
}
}
public class VAJExport extends VAJTask {
//set set... method comments for description
protected File destDir;
protected boolean exportSources = true;
protected boolean exportResources = true;
protected boolean exportClasses = false;
protected boolean exportDebugInfo = false;
protected boolean useDefaultExcludes = true;
protected boolean overwrite = 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!");
}

// delegate the export to the VAJUtil object.
getUtil().exportPackages(destDir,
patternSet.getIncludePatterns(getProject()),
patternSet.getExcludePatterns(getProject()),
exportClasses, exportDebugInfo,
exportResources, exportSources,
useDefaultExcludes, overwrite);
}

/**
* 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 selected
* items should be exported
*/
public void setDestdir(File destDir) {
this.destDir = destDir;
}

/**
* Sets the set of exclude patterns. Patterns may be separated by a comma
* or a space. Currently only patterns denoting packages are
* supported
*
* @param excludes the string containing the exclude patterns
*/
public void setExcludes(String excludes) {
patternSet.setExcludes(excludes);
}

/**
* if exportClasses is set, class files are exported
*/
public void setExportClasses(boolean doExport) {
exportClasses = doExport;
}

/**
* if exportDebugInfo is set, the exported class files contain
* debug info
*/
public void setExportDebugInfo(boolean doExport) {
exportDebugInfo = doExport;
}

/**
* if exportResources is set, resource file will be exported
*/
public void setExportResources(boolean doExport) {
exportResources = doExport;
}

/**
* if exportSources is set, java files will be exported
*/
public void setExportSources(boolean doExport) {
exportSources = doExport;
}

/**
* Sets the set of include patterns. Patterns may be separated by a comma
* or a space.Currently only patterns denoting packages are
* supported
*
* @param includes the string containing the include patterns
*/
public void setIncludes(String includes) {
patternSet.setIncludes(includes);
}

/**
* if Overwrite is set, files will be overwritten during export
*/
public void setOverwrite(boolean doOverwrite) {
overwrite = doOverwrite;
}
}

+ 172
- 0
src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJExportServlet.java View File

@@ -0,0 +1,172 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/

package org.apache.tools.ant.taskdefs.optional.ide;


import java.io.File;

/**
* A Remote Access to Tools Servlet to extract package
* sets from the Workbench to the local file system.
* The following table describes the servlet parameters.
*
* <table border="1">
* <tr>
* <td><strong>Parameter</strong></td>
* <td><strong>Values</strong></td>
* <td><strong>Description</strong></td>
* </tr>
* <tr>
* <td>dir</td>
* <td>Any valid directory name on the server.</td>
* <td>The directory to export the files to on the machine
* where the servlet is being run. If the directory
* doesn't exist, it will be created.<p>
* Relative paths are relative to
* IBMVJava/ide/tools/com-ibm-ivj-toolserver,
* where IBMVJava is the VisualAge for Java installation
* directory.</td>
* </tr>
* <tr>
* <td>include</td>
* <td>See below.</td>
* <td>The pattern used to indicate which projects and
* packages to export.</td>
* </tr>
* <tr>
* <td>exclude</td>
* <td>See below</td>
* <td>The pattern used to indicate which projects and
* packages <em>not</em> to export.</td>
* </tr>
* <tr>
* <td>cls</td>
* <td>"yes" or "no" (without the quotes)</td>
* <td>Export class files. Defaults to "no".</td>
* </tr>
* <tr>
* <td>src</td>
* <td>"yes" or "no" (without the quotes)</td>
* <td>Export source files. Defaults to "yes".</td>
* </tr>
* <tr>
* <td>res</td>
* <td>"yes" or "no" (without the quotes)</td>
* <td>Export resource files associated with the included project(s).
* Defaults to "yes".</td>
* </tr>
* <tr>
* <td>dex</td>
* <td>"yes" or "no" (without the quotes)</td>
* <td>Use the default exclusion patterns. Defaults to "yes".
* See below for an explanation of default excludes.</td>
* </tr>
* <tr>
* <td>owr</td>
* <td>"yes" or "no" (without the quotes)</td>
* <td>Overwrite any existing files. Defaults to "yes".</td>
* </tr>
* </table>
*
* <p>The vajexport servlet uses include and exclude parameters to form
* the criteria for selecting packages to export. The parameter is
* broken up into ProjectName/packageNameSegments, where ProjectName
* is what you expect, and packageNameSegments is a partial (or complete)
* package name, separated by forward slashes, rather than periods.
* Each packageNameSegment can have wildcard characters.</p>
*
* <table border="1">
* <tr>
* <td><strong>Wildcard Characters</strong></td>
* <td><strong>Description</strong></td>
* </tr>
* <tr>
* <td>*</td>
* <td>Match zero or more characters in that segment.</td>
* </tr>
* <tr>
* <td>?</td>
* <td>Match one character in that segment.</td>
* </tr>
* <tr>
* <td>**</td>
* <td>Matches all characters in zero or more segments.</td>
* </tr>
* </table>
*
* @author Wolf Siberski, based on servlets written by Glenn McAllister
*/
public class VAJExportServlet extends VAJToolsServlet {
// constants for servlet param names
public static final String WITH_DEBUG_INFO = "deb";
public static final String OVERWRITE_PARAM = "owr";

/**
* Respond to a request to export packages from the Workbench.
*/
protected void executeRequest() {
getUtil().exportPackages(
new File(getFirstParamValueString(DIR_PARAM)),
getParamValues(INCLUDE_PARAM),
getParamValues(EXCLUDE_PARAM),
getBooleanParam(CLASSES_PARAM, false),
getBooleanParam(WITH_DEBUG_INFO, false),
getBooleanParam(RESOURCES_PARAM, true),
getBooleanParam(SOURCES_PARAM, true),
getBooleanParam(DEFAULT_EXCLUDES_PARAM, true),
getBooleanParam(OVERWRITE_PARAM, true)
);
}
}

+ 117
- 224
src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJImport.java View File

@@ -53,11 +53,6 @@
*/
package org.apache.tools.ant.taskdefs.optional.ide;

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.Enumeration;
import java.util.Vector;
@@ -66,6 +61,8 @@ import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.FileSet;

import java.lang.reflect.Field;

/**
* Import source, class files, and resources to the Visual Age for Java
* workspace using FileSets.
@@ -95,7 +92,7 @@ import org.apache.tools.ant.types.FileSet;
* <td align="center" valign="top"><b>Required</b></td>
* </tr>
* <tr>
* <td valign="top">vajproject</td>
* <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>
@@ -119,221 +116,117 @@ import org.apache.tools.ant.types.FileSet;
*
* @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 setVajproject(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) {
logFiles(classes, "class");
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) {
logFiles(sources, "source");
msg.append( connector );
msg.append( sourcesArr.length );
msg.append( " source " );
msg.append( sourcesArr.length > 1 ? "files" : "file" );
connector = ", ";
}
}

if (importResources) {
String resourcePath = fileset.getDir(this.project).getAbsolutePath();
resourcesArr = new String[resources.size()];
resources.copyInto(resourcesArr);
importSpec.setResourcePath(resourcePath);
importSpec.setResourceFiles(resourcesArr);
if (resourcesArr.length > 0) {
logFiles(resources, "resource");
log( " (relative to resource path '" + resourcePath + "')",
org.apache.tools.ant.Project.MSG_VERBOSE );

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) {
throw 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(".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]);
}
}
}
/**
* 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
*/
protected void logFiles(Vector fileNames, String fileType) {
log( fileType + " files found for import:", org.apache.tools.ant.Project.MSG_VERBOSE);
for ( Enumeration e = fileNames.elements(); e.hasMoreElements(); ) {
log( " " + e.nextElement(), org.apache.tools.ant.Project.MSG_VERBOSE );
}
}
}
public class VAJImport extends VAJTask {
protected Vector filesets = new Vector();
protected boolean importSources = true;
protected boolean importResources = true;
protected boolean importClasses = false;
protected String importProject = null;
protected boolean useDefaultExcludes = true;


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

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

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

for (Enumeration e = filesets.elements(); e.hasMoreElements();) {
importFileset((FileSet) e.nextElement());
}
}

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

String[] includes = null;
String[] excludes = null;

// Hack to get includes and excludes. We could also use getIncludedFiles,
// but that would result in very long HTTP-requests.
// Therefore we want to send the patterns only to the remote tool server
// and let him figure out the files.
try {
Class directoryScanner = ds.getClass();
Field includesField = directoryScanner.getDeclaredField("includes");
includesField.setAccessible(true);
includes = (String[]) includesField.get(ds);
Field excludesField = directoryScanner.getDeclaredField("excludes");
excludesField.setAccessible(true);
excludes = (String[]) excludesField.get(ds);
} catch (NoSuchFieldException nsfe) {
throw new BuildException(
"DirectoryScanner.includes or .excludes missing" + nsfe.getMessage());
} catch (IllegalAccessException iae) {
throw new BuildException(
"Access to DirectoryScanner.includes or .excludes not allowed");
}

getUtil().importFiles( importProject, ds.getBasedir(),
includes, excludes,
importClasses, importResources, importSources,
useDefaultExcludes);
}
}

+ 102
- 0
src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJImportServlet.java View File

@@ -0,0 +1,102 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/

package org.apache.tools.ant.taskdefs.optional.ide;

import java.io.File;


/**
* A Remote Access to Tools Servlet to import a Project
* from files into the Repository. The following
* table describes the servlet parameters.
*
* <table>
* <tr>
* <td>Parameter</td>
* <td>Description</td>
* </tr>
* <tr>
* <td>project</td>
* <td>The name of the project where you want the imported
* items to go.
* </td>
* </tr>
* <tr>
* <td>dir</td>
* <td>The directory you want to import from.</td>
* </tr>
* </table>
*
* @author Wolf Siberski, based on servlets written by Glenn McAllister
*/
public class VAJImportServlet extends VAJToolsServlet {
/**
* Respond to a request to import files to the Repository
*/
protected void executeRequest() {
getUtil().importFiles(
getFirstParamValueString(PROJECT_NAME_PARAM),
new File(getFirstParamValueString(DIR_PARAM)),
getParamValues(INCLUDE_PARAM),
getParamValues(EXCLUDE_PARAM),
getBooleanParam(CLASSES_PARAM, false),
getBooleanParam(RESOURCES_PARAM, true),
getBooleanParam(SOURCES_PARAM, true),
false // no default excludes, because they
// are already added on client side
// getBooleanParam(DEFAULT_EXCLUDES_PARAM, true)
);
}
}

+ 92
- 0
src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJLoad.java View File

@@ -0,0 +1,92 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 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;

/**
* 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 VAJLoad extends VAJTask {
Vector projectDescriptions = new Vector();

/**
* Load specified projects.
*/
public void execute() {
getUtil().loadProjects( projectDescriptions );
}

/**
* Add a project description entry on the project list.
*/
public VAJProjectDescription createVAJProject() {
VAJProjectDescription d = new VAJProjectDescription();
projectDescriptions.addElement(d);
return d;
}
}

+ 17
- 183
src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJLoadProjects.java View File

@@ -54,8 +54,8 @@
package org.apache.tools.ant.taskdefs.optional.ide;


import com.ibm.ivj.util.base.IvjException;
import com.ibm.ivj.util.base.ProjectEdition;
import java.util.Enumeration;
import java.util.Vector;
import org.apache.tools.ant.BuildException;
@@ -63,189 +63,23 @@ import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;

/**
* 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>
* This is only there for backward compatibility with the default task list
* and will be removed soon
*
* @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 createVAJProject() {
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);
}

}
public class VAJLoadProjects extends VAJLoad {
}












+ 106
- 0
src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJLoadServlet.java View File

@@ -0,0 +1,106 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/

package org.apache.tools.ant.taskdefs.optional.ide;

import java.util.Vector;

/**
* A Remote Access to Tools Servlet to load a Project
* from the Repository into the Workbench. The following
* table describes the servlet parameters.
*
* <table>
* <tr>
* <td>Parameter</td>
* <td>Description</td>
* </tr>
* <tr>
* <td>project</td>
* <td>The name of the Project you want to load into
* the Workbench.</td>
* </tr>
* <tr>
* <td>version</td>
* <td>The version of the package you want to load into
* the Workbench.</td>
* </tr>
* </table>
*
* @author Wolf Siberski, based on servlets written by Glenn McAllister
*/
public class VAJLoadServlet extends VAJToolsServlet {

// constants for servlet param names
public static final String VERSION_PARAM = "version";

/**
* Respond to a request to load a project from the Repository
* into the Workbench.
*/
protected void executeRequest() {
String[] projectNames = getParamValues(PROJECT_NAME_PARAM);
String[] versionNames = getParamValues(VERSION_PARAM);

Vector projectDescriptions = new Vector(projectNames.length);
for (int i = 0; i < projectNames.length && i < versionNames.length; i++) {
VAJProjectDescription desc = new VAJProjectDescription();
desc.setName(projectNames[i]);
desc.setVersion(versionNames[i]);
projectDescriptions.addElement(desc);
}

util.loadProjects(projectDescriptions);
}
}

+ 465
- 0
src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJLocalUtil.java View File

@@ -0,0 +1,465 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 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.*;
import com.ibm.ivj.util.base.Package;

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

+ 105
- 0
src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJProjectDescription.java View File

@@ -0,0 +1,105 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 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 org.apache.tools.ant.BuildException;

/**
* Type class. Holds information about a project edition.
* @author: Wolf Siberski
*/
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;
}
}

+ 250
- 0
src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJRemoteUtil.java View File

@@ -0,0 +1,250 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 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.net.URLConnection;
import java.net.HttpURLConnection;
import java.util.Enumeration;
import java.net.URL;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.File;

/**
* Helper class for VAJ tasks. Holds Workspace singleton and
* wraps IvjExceptions into BuildExceptions
*
* @author Wolf Siberski, TUI Infotec GmbH
*/
class VAJRemoteUtil implements VAJUtil{
// calling task
Task caller;

// VAJ remote tool server
String remoteServer;

public VAJRemoteUtil( Task caller, String remote ) {
this.caller = caller;
this.remoteServer = remote;
}

/**
* export the array of Packages
*/
public void exportPackages(File destDir,
String[] includePatterns, String[] excludePatterns,
boolean exportClasses, boolean exportDebugInfo, boolean exportResources,
boolean exportSources, boolean useDefaultExcludes, boolean overwrite ) {
try {
String request = "http://" + remoteServer + "/servlet/vajexport?"
+ VAJExportServlet.WITH_DEBUG_INFO + "=" + exportDebugInfo + "&"
+ VAJExportServlet.OVERWRITE_PARAM + "=" + overwrite + "&"
+ assembleImportExportParams( destDir,
includePatterns, excludePatterns,
exportClasses, exportResources,
exportSources, useDefaultExcludes );
sendRequest( request);
} catch (Exception ex) {
throw new BuildException(ex);
}
}

/**
* Do the import.
*/
public void importFiles(
String importProject, File srcDir,
String[] includePatterns, String[] excludePatterns,
boolean importClasses, boolean importResources,
boolean importSources, boolean useDefaultExcludes) {
try {
String request = "http://" + remoteServer + "/servlet/vajimport?"
+ VAJImportServlet.PROJECT_NAME_PARAM + "="
+ importProject + "&"
+ assembleImportExportParams( srcDir,
includePatterns, excludePatterns,
importClasses, importResources,
importSources, useDefaultExcludes );
sendRequest( request);
} catch (Exception ex) {
throw new BuildException(ex);
}
}

/**
* Assemble string for parameters common for import and export
* Helper method to remove double code.
*/
private String assembleImportExportParams(
File dir,
String[] includePatterns, String[] excludePatterns,
boolean includeClasses, boolean includeResources,
boolean includeSources, boolean useDefaultExcludes) {
String result =
VAJToolsServlet.DIR_PARAM + "="
+ dir.getAbsolutePath().replace('\\', '/') + "&"
+ VAJToolsServlet.CLASSES_PARAM + "=" + includeClasses + "&"
+ VAJToolsServlet.RESOURCES_PARAM + "=" + includeResources + "&"
+ VAJToolsServlet.SOURCES_PARAM + "=" + includeSources + "&"
+ VAJToolsServlet.DEFAULT_EXCLUDES_PARAM + "=" + useDefaultExcludes;

if ( includePatterns != null ) {
for ( int i = 0; i < includePatterns.length; i++ ){
result= result + "&" + VAJExportServlet.INCLUDE_PARAM + "="
+ includePatterns[i].replace(' ', '+').replace('\\', '/');
}
}
if ( excludePatterns != null ) {
for ( int i = 0; i < excludePatterns.length; i++ ){
result = result + "&" + VAJExportServlet.EXCLUDE_PARAM + "="
+ excludePatterns[i].replace(' ', '+').replace('\\', '/');
}
}

return result;
}
/**
* Load specified projects.
*/
public void loadProjects( Vector projectDescriptions) {
try {
String request = "http://" + remoteServer + "/servlet/vajload?";
String delimiter = "";
for ( Enumeration e = projectDescriptions.elements(); e.hasMoreElements(); ){
VAJProjectDescription pd = (VAJProjectDescription)e.nextElement();
request = request
+ delimiter + VAJLoadServlet.PROJECT_NAME_PARAM
+ "=" + pd.getName().replace(' ', '+')
+ "&" + VAJLoadServlet.VERSION_PARAM
+ "=" + pd.getVersion().replace(' ', '+');
//the first param needs no delimiter, but all other
delimiter = "&";
}
sendRequest( request);
} catch (Exception ex) {
throw new BuildException(ex);
}
}

/**
* logs a message.
*/
public void log(String msg, int level) {
caller.log( msg, level );
}

/**
* Sends a servlet request.
*/
private void sendRequest(String request) {
boolean requestFailed = false;
try {
log("Request: " + request, MSG_DEBUG);
//must be HTTP connection
URL requestUrl = new URL( request );
HttpURLConnection connection =
(HttpURLConnection) requestUrl.openConnection();

InputStream is = null;
// retry three times
for (int i = 0; i < 3; i++) {
try {
is = connection.getInputStream();
break;
} catch (IOException ex) {
}
}
if (is == null) {
log("Can't get " + request, MSG_ERR);
throw new BuildException("Couldn't execute " + request );
}

// log the response
BufferedReader br = new BufferedReader( new InputStreamReader( is ) );
String line = br.readLine();
while ( line != null ) {
int level = MSG_ERR;
try {
// the first char of each line contains the log level
level = Integer.parseInt( line.substring(0,1) );
if ( level == MSG_ERR ) {
requestFailed = true;
}
} catch ( Exception e ) {
log( "Response line doesn't contain log level!", MSG_ERR );
}
log( line.substring(2), level );
line = br.readLine();
}
} catch (IOException ex) {
log("Error sending tool request to VAJ" + ex, MSG_ERR);
throw new BuildException("Couldn't execute " + request );
}
if ( requestFailed ) {
throw new BuildException( "VAJ tool request failed" );
}
}
}

+ 103
- 0
src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJTask.java View File

@@ -0,0 +1,103 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 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;

/**
* Super class for all VAJ tasks. Contains common
* attributes (remoteServer) and util methods
*
* @author: Wolf Siberski
*/
import org.apache.tools.ant.Task;

public class VAJTask extends Task {
/**
* Adaption of VAJLocalUtil to Task context.
*/
class VAJLocalToolUtil extends VAJLocalUtil {
public void log(String msg, int level) {
VAJTask.this.log( msg, level );
}
}

// server name / port of VAJ remote tool api server
protected String remoteServer = null;

// holds the appropriate VAJUtil implementation
private VAJUtil util = null;

/**
* returns the VAJUtil implementation
*/
protected VAJUtil getUtil() {
if ( util == null ) {
if ( remoteServer == null ) {
util = new VAJLocalToolUtil();
} else {
util = new VAJRemoteUtil( this, remoteServer );
}
}
return util;
}
/**
* Set remote server attribute
*/
public void setRemote(String remoteServer) {
this.remoteServer = remoteServer;
}
}

+ 226
- 0
src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJToolsServlet.java View File

@@ -0,0 +1,226 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/

package org.apache.tools.ant.taskdefs.optional.ide;

import com.ibm.ivj.toolserver.servletclasses.servlet.*;
import com.ibm.ivj.toolserver.servletclasses.servlet.http.*;
import java.io.*;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;

import org.apache.tools.ant.BuildException;

/**
* Abstract base class to provide common services for the
* VAJ tool API servlets
*
* @author Wolf Siberski, based on servlets written by Glenn McAllister
*/
public abstract class VAJToolsServlet extends HttpServlet {
/**
* Adaptation of VAJUtil for servlet context.
*/
class VAJLocalServletUtil extends VAJLocalUtil {
public void log(String msg, int level) {
try {
if ( msg != null ) {
msg = msg.replace('\r', ' ');
int i = 0;
while ( i < msg.length() ) {
int nlPos = msg.indexOf('\n', i);
if ( nlPos == -1 ) {
nlPos = msg.length();
}
response.getWriter().println( Integer.toString(level)
+ " " + msg.substring( i, nlPos ));
i = nlPos + 1;
}
}
} catch( IOException e ) {
throw new BuildException( "logging failed. msg was: "
+ e.getMessage() );
}
}
}
// constants for servlet param names
public static final String DIR_PARAM = "dir";
public static final String INCLUDE_PARAM = "include";
public static final String EXCLUDE_PARAM = "exclude";
public static final String CLASSES_PARAM = "cls";
public static final String SOURCES_PARAM = "src";
public static final String RESOURCES_PARAM = "res";
public static final String DEFAULT_EXCLUDES_PARAM = "dex";
public static final String PROJECT_NAME_PARAM = "project";


// current request
HttpServletRequest request;

// response to current request
HttpServletResponse response;

// implementation of VAJUtil used by the servlet
VAJUtil util;


/**
* Execute the request by calling the appropriate
* VAJ tool API methods. This method must be implemented
* by the concrete servlets
*/
protected abstract void executeRequest();
/**
* Respond to a HTTP request. This method initializes
* the servlet and handles errors.
* The real work is done in the abstract method executeRequest()
*/
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
try {
response = res;
request = req;
initRequest();
executeRequest();
} catch( BuildException e ) {
util.log("Error occured: " + e.getMessage(), VAJUtil.MSG_ERR);
} catch( Exception e ) {
try {
if ( ! (e instanceof BuildException) ) {
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String trace = new String( sw.getBuffer() );
util.log("Program error in " + this.getClass().getName()
+ ":\n" + trace, VAJUtil.MSG_ERR);
}
} catch( Throwable t ) {
t.printStackTrace();
} finally {
if ( ! (e instanceof BuildException) )
{
throw new ServletException( e.getMessage() );
}
}
}
}

/**
* initialize the servlet.
*/
protected void initRequest() throws IOException {
response.setContentType("text/ascii");
if ( util == null ) {
util = new VAJLocalServletUtil();
}
}
/**
* Get the VAJUtil implementation
*/
VAJUtil getUtil() {
return util;
}

/**
* Get the boolean value of a parameter.
*/
protected boolean getBooleanParam(String param) {
return getBooleanParam(param, false);
}

/**
* Get the boolean value of a parameter, with a default value if
* the parameter hasn't been passed to the servlet.
*/
protected boolean getBooleanParam(String param, boolean defaultValue) {
String value = getFirstParamValueString(param);
if (value != null) {
return toBoolean(value);
} else {
return defaultValue;
}
}

/**
* Returns the first encountered value for a parameter.
*/
protected String getFirstParamValueString(String param) {
String[] paramValuesArray = request.getParameterValues(param);
if (paramValuesArray == null) {
return null;
}
return paramValuesArray[0];
}

/**
* Returns all values for a parameter.
*/
protected String[] getParamValues(String param) {
return request.getParameterValues(param);
}

/**
* A utility method to translate the strings "yes", "true", and "ok"
* to boolean true, and everything else to false.
*/
protected boolean toBoolean(String string) {
String lower = string.toLowerCase();
return (lower.equals("yes") || lower.equals("true") || lower.equals("ok"));
}
}

+ 40
- 46
src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJUtil.java View File

@@ -51,58 +51,52 @@
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.optional.ide;

package org.apache.tools.ant.taskdefs.optional.ide;

import com.ibm.ivj.util.base.IvjException;
import com.ibm.ivj.util.base.ToolEnv;
import com.ibm.ivj.util.base.Workspace;
import org.apache.tools.ant.BuildException;
import java.util.Vector;
import java.io.File;

/**
* Helper class for VAJ tasks. Holds Workspace singleton and
* wraps IvjExceptions into BuildExceptions
* Helper interface for VAJ tasks. Encapsulates
* the interface to the VAJ tool API.
*
* @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.");
}
}
interface VAJUtil {
// log levels
public static final int MSG_DEBUG = 4;
public static final int MSG_ERR = 0;
public static final int MSG_INFO = 2;
public static final int MSG_VERBOSE = 3;
public static final int MSG_WARN = 1;

/**
* export the array of Packages
*/
void exportPackages(
File dest,
String[] includePatterns, String[] excludePatterns,
boolean exportClasses, boolean exportDebugInfo,
boolean exportResources, boolean exportSources,
boolean useDefaultExcludes, boolean overwrite);

/**
* Do the import.
*/
void importFiles(
String importProject, File srcDir,
String[] includePatterns, String[] excludePatterns,
boolean importClasses, boolean importResources,
boolean importSources, boolean useDefaultExcludes);

/**
* Load specified projects.
*/
void loadProjects(Vector projectDescriptions);

return workspace;
}
/**
* Logs a message with the specified log level.
*/
void log(String msg, int level);
}

+ 15
- 18
src/main/org/apache/tools/ant/taskdefs/optional/ide/VAJWorkspaceScanner.java View File

@@ -85,13 +85,9 @@ import org.apache.tools.ant.DirectoryScanner;
*
* @author Wolf Siberski, TUI Infotec (based on Arnout J. Kuipers DirectoryScanner)
*/
public class VAJWorkspaceScanner extends DirectoryScanner {
class VAJWorkspaceScanner extends DirectoryScanner {

/**
* Patterns that should be excluded by default.
*
* @see #addDefaultExcludes()
*/
// Patterns that should be excluded by default.
private final static String[] DEFAULTEXCLUDES =
{
"IBM*/**",
@@ -101,10 +97,8 @@ public class VAJWorkspaceScanner extends DirectoryScanner {
"VisualAge*/**",
};

/**
* The packages that where found and matched at least one includes, and
* matched no excludes.
*/
// The packages that where found and matched at least
// one includes, and matched no excludes.
private Vector packagesIncluded = new Vector();
/**
@@ -119,18 +113,19 @@ public class VAJWorkspaceScanner extends DirectoryScanner {
}
for (int i = 0; i < DEFAULTEXCLUDES.length; i++) {
newExcludes[i + excludesLength] = DEFAULTEXCLUDES[i].
replace( '/', File.separatorChar ).replace( '\\', File.separatorChar );
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();
Project[] projects = VAJLocalUtil.getWorkspace().getProjects();

Vector matchingProjects = new Vector();

@@ -138,7 +133,8 @@ public class VAJWorkspaceScanner extends DirectoryScanner {
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);
StringTokenizer tok =
new StringTokenizer(includes[j], File.separator);
String projectNamePattern = tok.nextToken();
if (projectNamePattern.equals("**")) {
// if an include pattern starts with '**',
@@ -161,7 +157,7 @@ public class VAJWorkspaceScanner extends DirectoryScanner {

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.
@@ -176,7 +172,7 @@ public class VAJWorkspaceScanner extends DirectoryScanner {
}
return packages;
}
/**
* Matches a string against a pattern. The pattern contains two special
* characters:
@@ -193,6 +189,7 @@ public class VAJWorkspaceScanner extends DirectoryScanner {
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.
@@ -215,7 +212,7 @@ public class VAJWorkspaceScanner extends DirectoryScanner {
scanProject(project);
}
}
/**
* Scans a project for packages that match at least one include
* pattern, and don't match any exclude patterns.
@@ -240,7 +237,7 @@ public class VAJWorkspaceScanner extends DirectoryScanner {
}
}
} catch (IvjException e) {
throw VAJUtil.createBuildException("VA Exception occured: ", e);
throw VAJLocalUtil.createBuildException("VA Exception occured: ", e);
}
}
}

Loading…
Cancel
Save