ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ddevie...@apache.org
Subject svn commit: r348500 - in /ant/core/trunk: ./ docs/manual/ docs/manual/CoreTasks/ src/etc/testcases/taskdefs/ src/main/org/apache/tools/ant/taskdefs/ src/testcases/org/apache/tools/ant/ src/testcases/org/apache/tools/ant/taskdefs/
Date Wed, 23 Nov 2005 17:42:00 GMT
Author: ddevienne
Date: Wed Nov 23 09:41:51 2005
New Revision: 348500

URL: http://svn.apache.org/viewcvs?rev=348500&view=rev
Log:
Add new manifestclasspath core task. Make BuildFileTest call tearDown target automatically
in build file test if one is defined.

Added:
    ant/core/trunk/docs/manual/CoreTasks/manifestclasspath.html
    ant/core/trunk/src/etc/testcases/taskdefs/manifestclasspath.xml
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ManifestClassPath.java
    ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/ManifestClassPathTest.java
Modified:
    ant/core/trunk/WHATSNEW
    ant/core/trunk/docs/manual/coretasklist.html
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties
    ant/core/trunk/src/testcases/org/apache/tools/ant/BuildFileTest.java

Modified: ant/core/trunk/WHATSNEW
URL: http://svn.apache.org/viewcvs/ant/core/trunk/WHATSNEW?rev=348500&r1=348499&r2=348500&view=diff
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Wed Nov 23 09:41:51 2005
@@ -163,6 +163,9 @@
 
 Other changes:
 --------------
+* New task <manifestclasspath> converts a path into a property
+  suitable as the value for a manifest's Class-Path attribute.
+
 * Fixed references to obsoleted CVS web site. Bugzilla Report 36854.
 
 * Log fine-grained events at verbose level from JUnit. Bugzilla report 31885.

Added: ant/core/trunk/docs/manual/CoreTasks/manifestclasspath.html
URL: http://svn.apache.org/viewcvs/ant/core/trunk/docs/manual/CoreTasks/manifestclasspath.html?rev=348500&view=auto
==============================================================================
--- ant/core/trunk/docs/manual/CoreTasks/manifestclasspath.html (added)
+++ ant/core/trunk/docs/manual/CoreTasks/manifestclasspath.html Wed Nov 23 09:41:51 2005
@@ -0,0 +1,98 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Language" content="en-us">
+<link rel="stylesheet" type="text/css" href="../stylesheets/style.css">
+<title>ManifestClassPath Task</title>
+</head>
+
+<body>
+
+<h2><a name="manifestclasspath">Manifestclasspath</a></h2>
+
+<h3>Description</h3>
+<p>Converts a <a href="../using.html#path">Path</a> into a property
+whose value is appropriate for a <a href="manifest.html">Manifest</a>'s
+<code>Class-Path</code> attribute.</p>
+
+<p>This task is often used to work around command line limitations on Windows
+when using very long class paths when launching an application. The long class
+path normally specified on the command line is replaced by a single (possibly
+empty) jar file which an in-manifest Class-Path attribute whose value lists
+all the jar and zip files the class path should contain. The files referenced
+from this attribute must be found relatively to the jar file itself, usually
+in the same directory. The Java VM automically uses all file entries listed
+in the Class-Path attributes of a jar to locate/load classes. Note though that
+it silently ignores entries for which it cannot find any corresponding file.</p>
+
+<p>Note that the property value created may be longer than a manifest's maximum
+72 characters per line, but will be properly wrapped as per the Jar
+specification by the <code>&lt;manifest&gt;</code> element, where the
+defined property is re-referenced.</p>
+
+<p><em>since Ant 1.7</em></p>
+
+<h3>Parameters</h3>
+<table border="1" cellpadding="2" cellspacing="0">
+  <tr>
+    <td valign="top"><b>Attribute</b></td>
+    <td valign="top"><b>Description</b></td>
+    <td align="center" valign="top"><b>Required</b></td>
+  </tr>
+  <tr>
+    <td valign="top">property</td>
+    <td valign="top">the name of the property to set. This property must
+                     not already be set.</td>
+    <td valign="top" align="center">Yes</td>
+  </tr>
+  <tr>
+    <td valign="top">jarfile</td>
+    <td valign="top">
+      the filename for the Jar which will contain the manifest that will
+      use the property this task will set. This file need not exist yet,
+      but its parent directory must exist.
+    </td>
+    <td valign="top" align="center">Yes</td>
+  </tr>
+  <tr>
+    <td valign="top">maxParentLevels</td>
+    <td valign="top">
+      The maximum number of parent directories one is allowed to traverse
+      to navigate from the jar file to the path entry. Put differently, the
+      maximum number of .. which is allowed in the relative path from the
+      jar file to a given class path enty. Specify 0 to enforce a path
+      entry to be in the same directory (or one of its sub-directories)
+      as the jar file itself.  Defaults to 2 levels.</td>
+    <td valign="top" align="center">No</td>
+  </tr>
+</table>
+
+<h3>Parameters specified as nested elements</h3>
+<h4>classpath</h4>
+<p>A <a href="../using#path.html">Path-like</a> element, which can be
+defined in-place, or refer to a path defined elsewhere using the
+<code>&lt;classpath refid="<em>pathid</em>" /&gt;</code>
syntax.
+This classpath must not be empty, and is required.</p>
+
+<h3>Examples</h3>
+<div id="example1">
+  <blockquote><pre>
+    &lt;manifestclasspath property="jar.classpath"
+                       jarfile="build/acme.jar"&gt;
+      &lt;classpath refid="classpath" /&gt;
+    &lt;/manifestclasspath&gt;
+  </pre></blockquote>
+  <p>Assuming a path of id "classpath" was already defined, convert this
+  path relatively to the build/ directory that will contain acme.jar, which
+  can later be created with <code>&lt;jar&gt;</code> with a nested 
+  <code>&lt;manifest&gt;</code> element that lists an
+  <code>&lt;attribute name="Class-Path" value="${jar.classpath}" /&gt;</code>.
+  </p>
+</div>
+
+<hr>
+<p align="center">Copyright &copy; 2005 The Apache Software Foundation. 
+All rights Reserved.</p>
+
+</body>
+</html>

Modified: ant/core/trunk/docs/manual/coretasklist.html
URL: http://svn.apache.org/viewcvs/ant/core/trunk/docs/manual/coretasklist.html?rev=348500&r1=348499&r2=348500&view=diff
==============================================================================
--- ant/core/trunk/docs/manual/coretasklist.html (original)
+++ ant/core/trunk/docs/manual/coretasklist.html Wed Nov 23 09:41:51 2005
@@ -69,6 +69,7 @@
 <a href="CoreTasks/mail.html">Mail</a><br>
 <a href="CoreTasks/macrodef.html">MacroDef</a><br>
 <a href="CoreTasks/manifest.html">Manifest</a><br>
+<a href="CoreTasks/manifestclasspath.html">ManifestClassPath</a><br>
 <a href="CoreTasks/mkdir.html">Mkdir</a><br>
 <a href="CoreTasks/move.html">Move</a><br>
 <a href="CoreTasks/nice.html">Nice</a><br>

Added: ant/core/trunk/src/etc/testcases/taskdefs/manifestclasspath.xml
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/etc/testcases/taskdefs/manifestclasspath.xml?rev=348500&view=auto
==============================================================================
--- ant/core/trunk/src/etc/testcases/taskdefs/manifestclasspath.xml (added)
+++ ant/core/trunk/src/etc/testcases/taskdefs/manifestclasspath.xml Wed Nov 23 09:41:51 2005
@@ -0,0 +1,164 @@
+<?xml version="1.0"?>
+
+<project name="manifestclasspath" default="tearDown">
+
+  <target name="setUp">
+    <property name="tmp" location="${basedir}/${ant.project.name}.tmp" />
+    <mkdir dir="${tmp}" />
+  </target>
+
+  <target name="fullSetUp" depends="setUp">
+    <mkdir dir="${tmp}/lib" />
+    <touch file="${tmp}/lib/acme-core.jar" />
+    <touch file="${tmp}/lib/acme-pres.jar" />
+
+    <mkdir dir="${tmp}/classes/dsp-core/com/lgc/infra/core" />
+    <mkdir dir="${tmp}/classes/dsp-pres/com/lgc/infra/pres" />
+    <mkdir dir="${tmp}/classes/dsp-void" />
+    <mkdir dir="${tmp}/generated/dsp-core/com/lgc/infra/core/generated" />
+    <mkdir dir="${tmp}/generated/dsp-pres" />
+    <mkdir dir="${tmp}/generated/dsp-void" />
+    <mkdir dir="${tmp}/resources/dsp-core/com/lgc/infra/core" />
+    <mkdir dir="${tmp}/resources/dsp-pres/com/lgc/infra/pres" />
+    <mkdir dir="${tmp}/resources/dsp-void" />
+  </target>
+
+  <target name="tearDown">
+    <delete dir="${tmp}" />
+  </target>
+
+  <target name="test-bad-directory">
+    <manifestclasspath property="jar.classpath"
+                       jarfile="${tmp}/classpath.jar">
+      <classpath />
+    </manifestclasspath>
+  </target>
+
+  <target name="test-bad-no-property" depends="setUp">
+    <manifestclasspath jarfile="${tmp}/classpath.jar">
+      <classpath />
+    </manifestclasspath>
+  </target>
+
+  <target name="test-bad-property-exists" depends="setUp">
+    <property name="jar.classpath" value="exists" />
+    <manifestclasspath property="jar.classpath"
+                       jarfile="${tmp}/classpath.jar">
+      <classpath />
+    </manifestclasspath>
+  </target>
+
+  <target name="test-bad-no-jarfile" depends="setUp">
+    <manifestclasspath property="jar.classpath">
+      <classpath />
+    </manifestclasspath>
+  </target>
+
+  <target name="test-bad-no-classpath" depends="setUp">
+    <manifestclasspath property="jar.classpath"
+                       jarfile="${tmp}/classpath.jar" />
+  </target>
+
+  <target name="test-pseudo-tahoe-refid" depends="fullSetUp">
+    <path id="classpath">
+      <!-- All the classes/ directories -->
+      <dirset dir="${tmp}/classes"   includes="dsp-*" />
+
+      <!-- All the JAXB generated/ directories -->
+      <dirset dir="${tmp}/generated" includes="dsp-*">
+        <!-- Add only non-empty directories to the classpath -->
+        <present targetdir="${tmp}/generated" present="both">
+          <mapper type="regexp" from="(.*)" to="\1/com" />
+        </present>
+      </dirset>
+
+      <!-- All the resources/ directories -->
+      <dirset dir="${tmp}/resources" includes="dsp-*">
+        <!-- Add only non-empty directories to the classpath -->
+        <present targetdir="${tmp}/resources" present="both">
+          <mapper type="regexp" from="(.*)" to="\1/com" />
+        </present>
+      </dirset>
+    </path>
+
+    <manifestclasspath property="jar.classpath"
+                       jarfile="${tmp}/classpath.jar">
+      <classpath refid="classpath" />
+    </manifestclasspath>
+  </target>
+
+  <target name="test-pseudo-tahoe-nested" depends="fullSetUp">
+    <manifestclasspath property="jar.classpath"
+                       jarfile="${tmp}/classpath.jar">
+      <classpath>
+        <!-- All the classes/ directories -->
+        <dirset dir="${tmp}/classes"   includes="dsp-*" />
+
+        <!-- All the JAXB generated/ directories -->
+        <dirset dir="${tmp}/generated" includes="dsp-*">
+          <!-- Add only non-empty directories to the classpath -->
+          <present targetdir="${tmp}/generated" present="both">
+            <mapper type="regexp" from="(.*)" to="\1/com" />
+          </present>
+        </dirset>
+
+        <!-- All the resources/ directories -->
+        <dirset dir="${tmp}/resources" includes="dsp-*">
+          <!-- Add only non-empty directories to the classpath -->
+          <present targetdir="${tmp}/resources" present="both">
+            <mapper type="regexp" from="(.*)" to="\1/com" />
+          </present>
+        </dirset>
+      </classpath>
+    </manifestclasspath>
+  </target>
+
+  <target name="test-parent-level1" depends="fullSetUp">
+    <manifestclasspath property="jar.classpath"
+                       jarfile="${tmp}/classes/classpath.jar">
+      <classpath>
+        <dirset dir="${tmp}/classes"   includes="dsp-*" />
+        <dirset dir="${tmp}/generated" includes="dsp-*" />
+        <dirset dir="${tmp}/resources" includes="dsp-*" />
+      </classpath>
+    </manifestclasspath>
+  </target>
+
+  <target name="test-parent-level2" depends="fullSetUp">
+    <mkdir dir="${tmp}/classes/level2" />
+    <manifestclasspath property="jar.classpath"
+                       jarfile="${tmp}/classes/level2/classpath.jar">
+      <classpath>
+        <dirset dir="${tmp}/classes"   includes="dsp-*" />
+        <dirset dir="${tmp}/generated" includes="dsp-*" />
+        <dirset dir="${tmp}/resources" includes="dsp-*" />
+      </classpath>
+    </manifestclasspath>
+  </target>
+
+  <target name="test-parent-level2-too-deep" depends="fullSetUp">
+    <mkdir dir="${tmp}/classes/level2" />
+    <manifestclasspath property="jar.classpath" maxParentLevels="1"
+                       jarfile="${tmp}/classes/level2/classpath.jar">
+      <classpath>
+        <dirset dir="${tmp}/classes"   includes="dsp-*" />
+        <dirset dir="${tmp}/generated" includes="dsp-*" />
+        <dirset dir="${tmp}/resources" includes="dsp-*" />
+      </classpath>
+    </manifestclasspath>
+  </target>
+
+  <target name="test-parent-level2-with-jars" depends="fullSetUp">
+    <mkdir dir="${tmp}/classes/level2" />
+    <manifestclasspath property="jar.classpath"
+                       jarfile="${tmp}/classes/level2/classpath.jar">
+      <classpath>
+        <fileset dir="${tmp}/lib" includes="*.jar" />
+        <dirset dir="${tmp}/classes"   includes="dsp-*" />
+        <dirset dir="${tmp}/generated" includes="dsp-*" />
+        <dirset dir="${tmp}/resources" includes="dsp-*" />
+      </classpath>
+    </manifestclasspath>
+  </target>
+
+</project>

Added: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ManifestClassPath.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ManifestClassPath.java?rev=348500&view=auto
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ManifestClassPath.java (added)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ManifestClassPath.java Wed Nov 23
09:41:51 2005
@@ -0,0 +1,184 @@
+/*
+ * Copyright  2005 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.tools.ant.taskdefs;
+
+import java.io.File;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.util.FileUtils;
+
+/**
+ * Converts a Path into a property suitable as a Manifest classpath.
+ *
+ * @since Ant 1.7
+ *
+ * @ant.task category="property"
+ */
+public class ManifestClassPath
+             extends Task {
+
+    /** The property name to hold the classpath value. */
+    private String _name;
+
+    /** The directory the classpath will be relative from. */
+    private File _dir;
+
+    /** The maximum parent directory level to traverse. */
+    private int _maxParentLevels = 2;
+
+    /** The classpath to convert. */
+    private Path _path;
+
+    /**
+     * Sets a property, which must not already exists, with a space
+     * separated list of files and directories relative to the jar
+     * file's parent directory.
+     */
+    public void execute() {
+        if (_name == null) {
+          throw new BuildException("Missing 'property' attribute!");
+        }
+        if (_dir == null) {
+          throw new BuildException("Missing 'jarfile' attribute!");
+        }
+        if (getProject().getProperty(_name) != null) {
+          throw new BuildException("Property '" + _name + "' already set!");
+        }
+        if (_path == null) {
+            throw new BuildException("Missing nested <classpath>!");
+        }
+
+        // Normalize the reference directory (containing the jar)
+        final FileUtils fileUtils = FileUtils.getFileUtils();
+        _dir = fileUtils.normalize(_dir.getAbsolutePath());
+
+        // Create as many directory prefixes as parent levels to traverse,
+        // in addition to the reference directory itself
+        File currDir = _dir;
+        String[] dirs = new String[_maxParentLevels + 1];
+        for (int i = 0; i < _maxParentLevels + 1; ++i) {
+            dirs[i] = currDir.getAbsolutePath() + File.separatorChar;
+            currDir = currDir.getParentFile();
+            if (currDir == null) {
+                _maxParentLevels = i + 1;
+                break;
+            }
+        }
+
+        String[] elements = _path.list();
+        StringBuffer buffer = new StringBuffer();
+        StringBuffer element = new StringBuffer();
+        for (int i = 0; i < elements.length; ++i) {
+            // Normalize the current file
+            File pathEntry = new File(elements[i]);
+            pathEntry = fileUtils.normalize(pathEntry.getAbsolutePath());
+            String fullPath = pathEntry.getAbsolutePath();
+
+            // Find the longest prefix shared by the current file
+            // and the reference directory.
+            String relPath = null;
+            for (int j = 0; j <= _maxParentLevels; ++j) {
+                String dir = dirs[j];
+                if (!fullPath.startsWith(dir)) {
+                    continue;
+                }
+
+                // We have a match! Add as many ../ as parent
+                // directory traversed to get the relative path
+                element.setLength(0);
+                for (int k = 0; k < j; ++k) {
+                    element.append("..");
+                    element.append(File.separatorChar);
+                }
+                element.append(fullPath.substring(dir.length()));
+                relPath = element.toString();
+                break;
+            }
+
+            // No match, so bail out!
+            if (relPath == null) {
+                throw new BuildException("No suitable relative path from " +
+                                         _dir + " to " + fullPath);
+            }
+
+            // Manifest's ClassPath: attribute always uses forward
+            // slashes '/', and is space-separated. Ant will properly
+            // format it on 72 columns with proper line continuation
+            if (File.separatorChar != '/') {
+                relPath = relPath.replace(File.separatorChar, '/');
+            }
+            buffer.append(relPath);
+            if (pathEntry.isDirectory()) {
+                buffer.append('/');
+            }
+            buffer.append(' ');
+        }
+        
+        // Get rid of trailing space, if any
+        if (buffer.length() > 0) {
+            buffer.setLength(buffer.length() - 1);
+        }
+
+        // Finally assign the property with the manifest classpath
+        getProject().setNewProperty(_name, buffer.toString());
+    }
+
+    /**
+     * Sets the property name to hold the classpath value.
+     *
+     * @param  name the property name
+     */
+    public void setProperty(String name) {
+        _name = name;
+    }
+
+    /**
+     * The JAR file to contain the classpath attribute in its manifest.
+     * 
+     * @param  jarfile the JAR file. Need not exist yet, but its parent
+     *         directory must exist on the other hand.
+     */
+    public void setJarFile(File jarfile) {
+        File parent = jarfile.getParentFile();
+        if (!parent.isDirectory()) {
+            throw new BuildException("Jar's directory not found: " + parent);
+        }
+        _dir = parent;
+    }
+
+    /**
+     * Sets the maximum parent directory levels allowed when computing
+     * a relative path.
+     *
+     * @param  levels the max level. Defaults to 2.
+     */
+    public void setMaxParentLevels(int levels) {
+        _maxParentLevels = levels;
+    }
+
+    /**
+     * Adds the classpath to convert.
+     *
+     * @param  path the classpath to convert.
+     */
+    public void addClassPath(Path path) {
+        _path = path;
+    }
+
+}

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties?rev=348500&r1=348499&r2=348500&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties Wed Nov 23 09:41:51
2005
@@ -47,6 +47,7 @@
 macrodef=org.apache.tools.ant.taskdefs.MacroDef
 mail=org.apache.tools.ant.taskdefs.email.EmailTask
 manifest=org.apache.tools.ant.taskdefs.ManifestTask
+manifestclasspath=org.apache.tools.ant.taskdefs.ManifestClassPath
 mkdir=org.apache.tools.ant.taskdefs.Mkdir
 move=org.apache.tools.ant.taskdefs.Move
 nice=org.apache.tools.ant.taskdefs.Nice
@@ -221,4 +222,4 @@
 renameext=org.apache.tools.ant.taskdefs.optional.RenameExtensions
 starteam=org.apache.tools.ant.taskdefs.optional.scm.AntStarTeamCheckOut
 style=org.apache.tools.ant.taskdefs.XSLTProcess
-WsdlToDotnet=org.apache.tools.ant.taskdefs.optional.dotnet.WsdlToDotnet
\ No newline at end of file
+WsdlToDotnet=org.apache.tools.ant.taskdefs.optional.dotnet.WsdlToDotnet

Modified: ant/core/trunk/src/testcases/org/apache/tools/ant/BuildFileTest.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/testcases/org/apache/tools/ant/BuildFileTest.java?rev=348500&r1=348499&r2=348500&view=diff
==============================================================================
--- ant/core/trunk/src/testcases/org/apache/tools/ant/BuildFileTest.java (original)
+++ ant/core/trunk/src/testcases/org/apache/tools/ant/BuildFileTest.java Wed Nov 23 09:41:51
2005
@@ -42,19 +42,42 @@
     private BuildException buildException;
 
     /**
-     *  Constructor for the BuildFileTest object
+     * Default constructor for the BuildFileTest object.
+     */
+    public BuildFileTest() {
+        super();
+    }
+
+    /**
+     * Constructor for the BuildFileTest object.
      *
-     *@param  name string to pass up to TestCase constructor
+     * @param  name string to pass up to TestCase constructor
      */
     public BuildFileTest(String name) {
         super(name);
     }
 
     /**
-     *  run a target, expect for any build exception
+     * Automatically calls the target called "tearDown"
+     * from the build file tested if it exits.
      *
-     *@param  target target to run
-     *@param  cause  information string to reader of report
+     * This allows to use Ant tasks directly in the build file
+     * to clean up after each test. Note that no "setUp" target
+     * is automatically called, since it's trivial to have a
+     * test target depend on it.
+     */
+    protected void tearDown() throws Exception {
+        final String tearDown = "tearDown";
+        if (project.getTargets().containsKey(tearDown)) {
+            project.executeTarget(tearDown);
+        }
+    }
+
+    /**
+     * run a target, expect for any build exception
+     *
+     * @param  target target to run
+     * @param  cause  information string to reader of report
      */
     protected void expectBuildException(String target, String cause) {
         expectSpecificBuildException(target, cause, null);
@@ -71,9 +94,8 @@
     }
 
     /**
-     * Assert that the given substring is in the log messages
+     * Assert that the given substring is in the log messages.
      */
-
     protected void assertLogContaining(String substring) {
         String realLog = getLog();
         assertTrue("expecting log to contain \"" + substring + "\" log was \""
@@ -82,16 +104,16 @@
     }
 
     /**
-     * Assert that the given substring is in the output messages
+     * Assert that the given substring is in the output messages.
      * @since Ant1.7
      */
-
     protected void assertOutputContaining(String substring) {
         String realOutput = getOutput();
-        assertTrue("expecting output to contain \"" + substring + "\" output was \""
-                + realOutput + "\"",
-                realOutput.indexOf(substring) >= 0);
+        assertTrue("expecting output to contain \"" + substring
+                   + "\" output was \"" + realOutput + "\"",
+                   realOutput.indexOf(substring) >= 0);
     }
+
     /**
      * Assert that the given message has been logged with a priority
      * &lt;= INFO when running the given target.
@@ -102,9 +124,9 @@
     }
 
     /**
-     *  Gets the log the BuildFileTest object.
-     *  only valid if configureProject() has
-     *  been called.
+     * Gets the log the BuildFileTest object.
+     * Only valid if configureProject() has been called.
+     *
      * @pre logBuffer!=null
      * @return    The log value
      */
@@ -123,9 +145,8 @@
     }
 
     /**
-     * Assert that the given substring is in the log messages
+     * Assert that the given substring is in the log messages.
      */
-
     protected void assertDebuglogContaining(String substring) {
         String realLog = getFullLog();
         assertTrue("expecting debug log to contain \"" + substring 
@@ -135,9 +156,10 @@
     }
 
     /**
-     *  Gets the log the BuildFileTest object.
-     *  only valid if configureProject() has
-     *  been called.
+     * Gets the log the BuildFileTest object.
+     *
+     * Only valid if configureProject() has been called.
+     *
      * @pre fullLogBuffer!=null
      * @return    The log value
      */
@@ -146,12 +168,11 @@
     }
 
     /**
-     *  execute the target, verify output matches expectations
+     * execute the target, verify output matches expectations
      *
-     *@param  target  target to execute
-     *@param  output  output to look for
+     * @param  target  target to execute
+     * @param  output  output to look for
      */
-
     protected void expectOutput(String target, String output) {
         executeTarget(target);
         String realOutput = getOutput();
@@ -159,13 +180,13 @@
     }
 
     /**
-     *  execute the target, verify output matches expectations
-     *  and that we got the named error at the end
-     *@param  target  target to execute
-     *@param  output  output to look for
-     *@param  error   Description of Parameter
+     * Executes the target, verify output matches expectations
+     * and that we got the named error at the end
+     *
+     * @param  target  target to execute
+     * @param  output  output to look for
+     * @param  error   Description of Parameter
      */
-
     protected void expectOutputAndError(String target, String output, String error) {
         executeTarget(target);
         String realOutput = getOutput();
@@ -206,7 +227,7 @@
     }
 
     /**
-     *  set up to run the named project
+     * Sets up to run the named project
      *
      * @param  filename name of project file to run
      */
@@ -215,7 +236,7 @@
     }
 
     /**
-     *  set up to run the named project
+     * Sets up to run the named project
      *
      * @param  filename name of project file to run
      */
@@ -232,7 +253,8 @@
     }
 
     /**
-     *  execute a target we have set up
+     * Executes a target we have set up
+     *
      * @pre configureProject has been called
      * @param  targetName  target to run
      */
@@ -269,7 +291,8 @@
     }
 
     /**
-     * get the directory of the project
+     * Gets the directory of the project.
+     *
      * @return the base dir of the project
      */
     protected File getProjectDir() {
@@ -277,12 +300,12 @@
     }
 
     /**
-     *  run a target, wait for a build exception
+     * Runs a target, wait for a build exception.
      *
-     *@param  target target to run
-     *@param  cause  information string to reader of report
-     *@param  msg    the message value of the build exception we are waiting for
-              set to null for any build exception to be valid
+     * @param  target target to run
+     * @param  cause  information string to reader of report
+     * @param  msg    the message value of the build exception we are waiting
+     *         for set to null for any build exception to be valid
      */
     protected void expectSpecificBuildException(String target, String cause, String msg)
{
         try {
@@ -300,12 +323,12 @@
     }
 
     /**
-     *  run a target, expect an exception string
-     *  containing the substring we look for (case sensitive match)
+     * run a target, expect an exception string
+     * containing the substring we look for (case sensitive match)
      *
-     *@param  target target to run
-     *@param  cause  information string to reader of report
-     *@param  contains  substring of the build exception to look for
+     * @param  target target to run
+     * @param  cause  information string to reader of report
+     * @param  contains  substring of the build exception to look for
      */
     protected void expectBuildExceptionContaining(String target, String cause, String contains)
{
         try {
@@ -320,7 +343,6 @@
         fail("Should throw BuildException because: " + cause);
     }
 
-
     /**
      * call a target, verify property is as expected
      *
@@ -328,7 +350,6 @@
      * @param property property name
      * @param value expected value
      */
-
     protected void expectPropertySet(String target, String property, String value) {
         executeTarget(target);
         assertPropertyEquals(property, value);
@@ -336,6 +357,7 @@
 
     /**
      * assert that a property equals a value; comparison is case sensitive.
+     *
      * @param property property name
      * @param value expected value
      */
@@ -345,7 +367,8 @@
     }
 
     /**
-     * assert that a property equals &quot;true&quot;
+     * assert that a property equals "true".
+     *
      * @param property property name
      */
     protected void assertPropertySet(String property) {
@@ -353,14 +376,14 @@
     }
 
     /**
-     * assert that a property is null
+     * assert that a property is null.
+     *
      * @param property property name
      */
     protected void assertPropertyUnset(String property) {
         assertPropertyEquals(property, null);
     }
 
-
     /**
      * call a target, verify named property is "true".
      *
@@ -371,9 +394,9 @@
         expectPropertySet(target, property, "true");
     }
 
-
     /**
-     * call a target, verify property is null
+     * Call a target, verify property is null.
+     *
      * @param target build file target
      * @param property property name
      */
@@ -385,6 +408,7 @@
      * Retrieve a resource from the caller classloader to avoid
      * assuming a vm working directory. The resource path must be
      * relative to the package name or absolute from the root path.
+     *
      * @param resource the resource to retrieve its url.
      * @throws AssertionFailureException if resource is not found.
      */
@@ -410,77 +434,77 @@
     }
 
     /**
-     * our own personal build listener
+     * Our own personal build listener.
      */
     private class AntTestListener implements BuildListener {
         private int logLevel;
 
         /**
          * Constructs a test listener which will ignore log events
-         * above the given level
+         * above the given level.
          */
         public AntTestListener(int logLevel) {
             this.logLevel = logLevel;
         }
 
         /**
-         *  Fired before any targets are started.
+         * Fired before any targets are started.
          */
         public void buildStarted(BuildEvent event) {
         }
 
         /**
-         *  Fired after the last target has finished. This event
-         *  will still be thrown if an error occurred during the build.
+         * Fired after the last target has finished. This event
+         * will still be thrown if an error occurred during the build.
          *
-         *  @see BuildEvent#getException()
+         * @see BuildEvent#getException()
          */
         public void buildFinished(BuildEvent event) {
         }
 
         /**
-         *  Fired when a target is started.
+         * Fired when a target is started.
          *
-         *  @see BuildEvent#getTarget()
+         * @see BuildEvent#getTarget()
          */
         public void targetStarted(BuildEvent event) {
             //System.out.println("targetStarted " + event.getTarget().getName());
         }
 
         /**
-         *  Fired when a target has finished. This event will
-         *  still be thrown if an error occurred during the build.
+         * Fired when a target has finished. This event will
+         * still be thrown if an error occurred during the build.
          *
-         *  @see BuildEvent#getException()
+         * @see BuildEvent#getException()
          */
         public void targetFinished(BuildEvent event) {
             //System.out.println("targetFinished " + event.getTarget().getName());
         }
 
         /**
-         *  Fired when a task is started.
+         * Fired when a task is started.
          *
-         *  @see BuildEvent#getTask()
+         * @see BuildEvent#getTask()
          */
         public void taskStarted(BuildEvent event) {
             //System.out.println("taskStarted " + event.getTask().getTaskName());
         }
 
         /**
-         *  Fired when a task has finished. This event will still
-         *  be throw if an error occurred during the build.
+         * Fired when a task has finished. This event will still
+         * be throw if an error occurred during the build.
          *
-         *  @see BuildEvent#getException()
+         * @see BuildEvent#getException()
          */
         public void taskFinished(BuildEvent event) {
             //System.out.println("taskFinished " + event.getTask().getTaskName());
         }
 
         /**
-         *  Fired whenever a message is logged.
+         * Fired whenever a message is logged.
          *
-         *  @see BuildEvent#getMessage()
-         *  @see BuildEvent#getPriority()
+         * @see BuildEvent#getMessage()
+         * @see BuildEvent#getPriority()
          */
         public void messageLogged(BuildEvent event) {
             if (event.getPriority() > logLevel) {
@@ -494,9 +518,7 @@
                 logBuffer.append(event.getMessage());
             }
             fullLogBuffer.append(event.getMessage());
-
         }
     }
-
 
 }

Added: ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/ManifestClassPathTest.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/ManifestClassPathTest.java?rev=348500&view=auto
==============================================================================
--- ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/ManifestClassPathTest.java
(added)
+++ ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/ManifestClassPathTest.java
Wed Nov 23 09:41:51 2005
@@ -0,0 +1,139 @@
+/*
+ * Copyright  2000-2005 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.tools.ant.taskdefs;
+
+import java.io.File;
+
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.tools.ant.BuildFileTest;
+
+/**
+ * Tests &lt;bm:manifestclasspath&gt;.
+ */
+public class ManifestClassPathTest
+             extends BuildFileTest {
+
+    public void setUp() {
+        configureProject("src/etc/testcases/taskdefs/manifestclasspath.xml");
+    }
+
+    public void testBadDirectory() {
+        expectBuildExceptionContaining("test-bad-directory", "bad-jar-dir",
+                                       "Jar's directory not found:");
+        assertPropertyUnset("jar.classpath");
+    }
+
+    public void testBadNoProperty() {
+        expectBuildExceptionContaining("test-bad-no-property", "no-property",
+                                       "Missing 'property' attribute!");
+        assertPropertyUnset("jar.classpath");
+    }
+
+    public void testBadPropertyExists() {
+        expectBuildExceptionContaining("test-bad-property-exists",
+            "property-exits", "Property 'jar.classpath' already set!");
+        assertPropertyEquals("jar.classpath", "exists");
+    }
+
+    public void testBadNoJarfile() {
+        expectBuildExceptionContaining("test-bad-no-jarfile", "no-jarfile",
+                                       "Missing 'jarfile' attribute!");
+        assertPropertyUnset("jar.classpath");
+    }
+
+    public void testBadNoClassPath() {
+        expectBuildExceptionContaining("test-bad-no-classpath", "no-classpath",
+                                       "Missing nested <classpath>!");
+        assertPropertyUnset("jar.classpath");
+    }
+
+    public void testParentLevel1() {
+        executeTarget("test-parent-level1");
+
+        assertPropertyEquals("jar.classpath", "dsp-core/ " +
+                                              "dsp-pres/ " +
+                                              "dsp-void/ " +
+                                              "../generated/dsp-core/ " +
+                                              "../generated/dsp-pres/ " +
+                                              "../generated/dsp-void/ " +
+                                              "../resources/dsp-core/ " +
+                                              "../resources/dsp-pres/ " +
+                                              "../resources/dsp-void/");
+    }
+
+    public void testParentLevel2() {
+        executeTarget("test-parent-level2");
+
+        assertPropertyEquals("jar.classpath", "../dsp-core/ " +
+                                              "../dsp-pres/ " +
+                                              "../dsp-void/ " +
+                                              "../../generated/dsp-core/ " +
+                                              "../../generated/dsp-pres/ " +
+                                              "../../generated/dsp-void/ " +
+                                              "../../resources/dsp-core/ " +
+                                              "../../resources/dsp-pres/ " +
+                                              "../../resources/dsp-void/");
+    }
+
+    public void testParentLevel2TooDeep() {
+        expectBuildExceptionContaining("test-parent-level2-too-deep", "nopath",
+                                       "No suitable relative path from ");
+        assertPropertyUnset("jar.classpath");
+    }
+
+    public void testPseudoTahoeRefid() {
+        executeTarget("test-pseudo-tahoe-refid");
+
+        assertPropertyEquals("jar.classpath", "classes/dsp-core/ " +
+                                              "classes/dsp-pres/ " +
+                                              "classes/dsp-void/ " +
+                                              "generated/dsp-core/ " +
+                                              "resources/dsp-core/ " +
+                                              "resources/dsp-pres/");
+    }
+
+    public void testPseudoTahoeNested() {
+        executeTarget("test-pseudo-tahoe-nested");
+
+        assertPropertyEquals("jar.classpath", "classes/dsp-core/ " +
+                                              "classes/dsp-pres/ " +
+                                              "classes/dsp-void/ " +
+                                              "generated/dsp-core/ " +
+                                              "resources/dsp-core/ " +
+                                              "resources/dsp-pres/");
+    }
+
+    public void testParentLevel2WithJars() {
+        executeTarget("test-parent-level2-with-jars");
+
+        assertPropertyEquals("jar.classpath", "../../lib/acme-core.jar " +
+                                              "../../lib/acme-pres.jar " +
+                                              "../dsp-core/ " +
+                                              "../dsp-pres/ " +
+                                              "../dsp-void/ " +
+                                              "../../generated/dsp-core/ " +
+                                              "../../generated/dsp-pres/ " +
+                                              "../../generated/dsp-void/ " +
+                                              "../../resources/dsp-core/ " +
+                                              "../../resources/dsp-pres/ " +
+                                              "../../resources/dsp-void/");
+    }
+
+} // END class ManifestClassPathTest
+



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Mime
View raw message