You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by st...@apache.org on 2005/08/22 18:49:44 UTC

cvs commit: ant/src/testcases/org/apache/tools/ant/taskdefs MakeUrlTest.java

stevel      2005/08/22 09:49:44

  Modified:    src/main/org/apache/tools/ant/taskdefs defaults.properties
  Added:       src/main/org/apache/tools/ant/taskdefs MakeUrl.java
               src/etc/testcases/taskdefs makeurl.xml
               src/testcases/org/apache/tools/ant/taskdefs MakeUrlTest.java
  Log:
  This is an official contrib of the smartfrog tourl task to the apache codebase; its aim has been to set up rmic classpaths, but it turns out to use maven2 its kind of convenient to be able to turn any location into a file: url. That is only, what, 3 lines of code, but what this task does is bulk conversion and a set of unit tests that work.
  Docs are to be xdoc generated
  
  Revision  Changes    Path
  1.174     +1 -0      ant/src/main/org/apache/tools/ant/taskdefs/defaults.properties
  
  Index: defaults.properties
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/defaults.properties,v
  retrieving revision 1.173
  retrieving revision 1.174
  diff -u -r1.173 -r1.174
  --- defaults.properties	9 Aug 2005 15:26:49 -0000	1.173
  +++ defaults.properties	22 Aug 2005 16:49:44 -0000	1.174
  @@ -208,6 +208,7 @@
   verifyjar=org.apache.tools.ant.taskdefs.VerifyJar
   resourcecount=org.apache.tools.ant.taskdefs.ResourceCount
   echoxml=org.apache.tools.ant.taskdefs.EchoXML
  +makeurl=org.apache.tools.ant.taskdefs.MakeUrl
   
   # deprecated ant tasks (kept for back compatibility)
   starteam=org.apache.tools.ant.taskdefs.optional.scm.AntStarTeamCheckOut
  
  
  
  1.1                  ant/src/main/org/apache/tools/ant/taskdefs/MakeUrl.java
  
  Index: MakeUrl.java
  ===================================================================
  /*
   * 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 org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.Project;
  import org.apache.tools.ant.Task;
  import org.apache.tools.ant.DirectoryScanner;
  import org.apache.tools.ant.types.FileSet;
  import org.apache.tools.ant.types.Path;
  
  import java.io.File;
  import java.net.MalformedURLException;
  import java.util.List;
  import java.util.LinkedList;
  import java.util.ListIterator;
  
  /**
   * This task takes file and turns them into a URL, which it then assigns
   * to a property. Use when for setting up RMI codebases.
   * <p/>
   * nested filesets are supported; if present, these are turned into the
   * url with the given separator between them (default = " ").
   *
   * @ant.task category="core" name="tourl"
   */
  
  public class MakeUrl extends Task {
  
      /**
       * name of the property to set
       */
      private String property;
  
      /**
       * name of a file to turn into a URL
       */
      private File file;
  
      /**
       * separator char
       */
      private String separator = " ";
  
      /**
       * filesets of nested files to add to this url
       */
      private List filesets = new LinkedList();
  
      /**
       * paths to add
       */
      private List paths = new LinkedList();
  
      /**
       * validation flag
       */
      private boolean validate = true;
  
      /**
       * error message
       */
      public static final String ERROR_MISSING_FILE = "A source file is missing :";
      public static final String ERROR_NO_PROPERTY = "No property defined";
      public static final String ERROR_NO_FILES = "No files defined";
  
      /**
       * set the name of a property to fill with the URL
       *
       * @param property
       */
      public void setProperty(String property) {
          this.property = property;
      }
  
      /**
       * the name of a file to be converted into a URL
       *
       * @param file
       */
      public void setFile(File file) {
          this.file = file;
      }
  
      /**
       * a fileset of jar files to include in the URL, each
       * separated by the separator
       *
       * @param fileset
       */
      public void addFileSet(FileSet fileset) {
          filesets.add(fileset);
      }
  
      /**
       * set the separator for the multi-url option.
       *
       * @param separator
       */
      public void setSeparator(String separator) {
          this.separator = separator;
      }
  
      /**
       * set this flag to trigger validation that every named file exists.
       * Optional: default=true
       *
       * @param validate
       */
      public void setValidate(boolean validate) {
          this.validate = validate;
      }
  
      /**
       * add a path to the URL. All elements in the path
       * will be converted to individual URL entries
       *
       * @param path
       */
      public void addPath(Path path) {
          paths.add(path);
      }
  
      /**
       * convert the filesets to urls.
       *
       * @return null for no files
       */
      private String filesetsToURL() {
          if (filesets.isEmpty()) {
              return "";
          }
          int count = 0;
          StringBuffer urls = new StringBuffer();
          ListIterator list = filesets.listIterator();
          while (list.hasNext()) {
              FileSet set = (FileSet) list.next();
              DirectoryScanner scanner = set.getDirectoryScanner(getProject());
              String[] files = scanner.getIncludedFiles();
              for (int i = 0; i < files.length; i++) {
                  File f = new File(scanner.getBasedir(), files[i]);
                  validateFile(f);
                  String asUrl = toURL(f);
                  urls.append(asUrl);
                  log(asUrl, Project.MSG_DEBUG);
                  urls.append(separator);
                  count++;
              }
          }
          //at this point there is one trailing space to remove, if the list is not empty.
          return stripTrailingSeparator(urls, count);
      }
  
      /**
       * convert the string buffer to a string, potentially stripping
       * out any trailing separator
       *
       * @param urls  URL buffer
       * @param count number of URL entries
       * @return trimmed string, or empty string
       */
      private String stripTrailingSeparator(StringBuffer urls,
                                            int count) {
          if (count > 0) {
              urls.delete(urls.length() - separator.length(), urls.length());
              return new String(urls);
          } else {
              return "";
          }
      }
  
  
      /**
       * convert all paths to URLs
       *
       * @return the paths as a separated list of URLs
       */
      private String pathsToURL() {
          if (paths.isEmpty()) {
              return "";
          }
          int count = 0;
          StringBuffer urls = new StringBuffer();
          ListIterator list = paths.listIterator();
          while (list.hasNext()) {
              Path path = (Path) list.next();
              String[] elements = path.list();
              for (int i = 0; i < elements.length; i++) {
                  File f = new File(elements[i]);
                  validateFile(f);
                  String asUrl = toURL(f);
                  urls.append(asUrl);
                  log(asUrl, Project.MSG_DEBUG);
                  urls.append(separator);
                  count++;
              }
          }
          //at this point there is one trailing space to remove, if the list is not empty.
          return stripTrailingSeparator(urls, count);
      }
  
      /**
       * verify that the file exists, if {@link #validate} is set
       *
       * @param fileToCheck file that may need to exist
       * @throws BuildException with text beginning {@link #ERROR_MISSING_FILE}
       */
      private void validateFile(File fileToCheck) {
          if (validate && !fileToCheck.exists()) {
              throw new BuildException(ERROR_MISSING_FILE + fileToCheck.toString());
          }
      }
  
      /**
       * Create the url
       *
       * @throws org.apache.tools.ant.BuildException
       *          if something goes wrong with the build
       */
      public void execute() throws BuildException {
          validate();
          //now exit here if the property is already set
          if (getProject().getProperty(property) != null) {
              return;
          }
          String url;
          String filesetURL = filesetsToURL();
          if (file != null) {
              validateFile(file);
              url = toURL(file);
              //and add any files if also defined
              if (filesetURL.length() > 0) {
                  url = url + separator + filesetURL;
              }
          } else {
              url = filesetURL;
          }
          //add path URLs
          String pathURL = pathsToURL();
          if (pathURL.length() > 0) {
              if (url.length() > 0) {
                  url = url + separator + pathURL;
              } else {
                  url = pathURL;
              }
          }
          log("Setting " + property + " to URL " + url, Project.MSG_VERBOSE);
          getProject().setNewProperty(property, url);
      }
  
      private void validate() {
          //validation
          if (property == null) {
              throw new BuildException(ERROR_NO_PROPERTY);
          }
          if (file == null && filesets.isEmpty() && paths.isEmpty()) {
              throw new BuildException(ERROR_NO_FILES);
          }
      }
  
      /**
       * convert a file to a URL;
       *
       * @param fileToConvert
       * @return the file converted to a URL
       * @throws BuildException if the file would not convert
       */
      private String toURL(File fileToConvert) {
          String url;
          try {
              //create the URL
              url = fileToConvert.toURI().toURL().toExternalForm();
              //set the property
          } catch (MalformedURLException e) {
              throw new BuildException("Could not convert " + fileToConvert, e);
          }
          return url;
      }
  
  }
  
  
  
  1.1                  ant/src/etc/testcases/taskdefs/makeurl.xml
  
  Index: makeurl.xml
  ===================================================================
  <?xml version="1.0"?>
  <project name="to-url" >
  
  
    <target name="testEmpty">
      <makeurl/>
    </target>
  
    <target name="testNoProperty">
      <makeurl file="foo"/>
    </target>
  
    <target name="testNoFile">
      <makeurl property="foo"/>
    </target>
      
    <target name="testWorks">
      <makeurl property="testWorks" file="foo" validate="false"/>
      <fail unless="testWorks" />
    </target>
  
    <target name="testIllegalChars">
      <makeurl property="testIllegalChars" file="fo o%" validate="false"/>
    </target>
    
    <target name="testRoundTrip">
      <makeurl property="testRoundTrip" file="${ant.file}"/>
    </target>
  
    <target name="testIllegalCombinations">
      <makeurl property="testIllegalCombinations" file="foo" validate="false">
        <fileset dir="." includes="*.xml" />
      </makeurl>
    </target>
    
    
    <target name="testFileset">
      <makeurl property="testFileset">
        <fileset dir="." includes="*.xml" />
      </makeurl>
    </target>
    
    <target name="testFilesetSeparator">
      <makeurl property="testFilesetSeparator" separator='","'>
        <fileset dir="." includes="*.xml" />
      </makeurl>
    </target>
  
    <target name="testValidation">
      <makeurl property="testValidation" file="absent" validate="true"/>
    </target>
  
    <target name="testPath">
      <path id="test.path">
        <pathelement location="." />
        <fileset dir="." includes="*.xml"/>
      </path>
      <makeurl property="testPath">
        <path refid="test.path" />
      </makeurl>
    </target>
  
  </project>
  
  
  
  1.1                  ant/src/testcases/org/apache/tools/ant/taskdefs/MakeUrlTest.java
  
  Index: MakeUrlTest.java
  ===================================================================
  /*
   * 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 org.apache.tools.ant.BuildFileTest;
  
  import java.io.InputStream;
  import java.io.IOException;
  import java.net.URL;
  
  
  public class MakeUrlTest extends BuildFileTest {
  
      public MakeUrlTest(String s) {
          super(s);
      }
  
      public void setUp() {
          configureProject("src/etc/testcases/taskdefs/makeurl.xml");
      }
  
      public void testEmpty() {
          expectBuildExceptionContaining("testEmpty", "missing property", "property");
      }
  
      public void testNoProperty() {
          expectBuildExceptionContaining("testNoProperty", "missing property", "property");
      }
  
      public void testNoFile() {
          expectBuildExceptionContaining("testNoFile", "missing file", "file");
      }
  
      public void testValidation() {
          expectBuildExceptionContaining("testValidation", MakeUrl.ERROR_MISSING_FILE, "file");
      }
  
      public void testWorks() {
          executeTarget("testWorks");
          assertPropertyContains("testWorks", "file:");
          assertPropertyContains("testWorks", "/foo");
      }
  
      public void testIllegalChars() {
          executeTarget("testIllegalChars");
          assertPropertyContains("testIllegalChars", "file:");
          assertPropertyContains("testIllegalChars", "fo%20o%25");
      }
  
      /**
       * test that we can round trip by opening a url that exists
       *
       * @throws IOException
       */
      public void testRoundTrip() throws IOException {
          executeTarget("testRoundTrip");
          assertPropertyContains("testRoundTrip", "file:");
          String property = getProperty("testRoundTrip");
          URL url = new URL(property);
          InputStream instream = url.openStream();
          instream.close();
      }
  
      public void testIllegalCombinations() {
          executeTarget("testIllegalCombinations");
          assertPropertyContains("testIllegalCombinations", "/foo");
          assertPropertyContains("testIllegalCombinations", ".xml");
      }
  
      public void testFileset() {
          executeTarget("testFileset");
          assertPropertyContains("testFileset", ".xml ");
          String result = getProperty("testFileset");
          assertPropertyEndsWith("testFileset", ".xml");
      }
  
      public void testFilesetSeparator() {
          executeTarget("testFilesetSeparator");
          assertPropertyContains("testFilesetSeparator", ".xml\",\"");
          assertPropertyEndsWith("testFilesetSeparator", ".xml");
      }
  
      public void testPath() {
          executeTarget("testPath");
          assertPropertyContains("testPath", "to-url.xml");
      }
  
      /**
       * assert that a property ends with
       *
       * @param property
       * @param ending
       */
      private void assertPropertyEndsWith(String property, String ending) {
          String result = getProperty(property);
          String substring = result.substring(result.length() - ending.length());
          assertEquals(ending, substring);
      }
  
      /**
       * assert that a property contains a string
       *
       * @param property name of property to look for
       * @param contains what to search for in the string
       */
      protected void assertPropertyContains(String property, String contains) {
          String result = getProperty(property);
  
          assertTrue("expected " + contains + " in " + result,
                  result != null && result.indexOf(contains) >= 0);
      }
  
      /**
       * get a property from the project
       *
       * @param property
       * @return
       */
      protected String getProperty(String property) {
          return project.getProperty(property);
      }
  }
  
  
  

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


Re: cvs commit: ant/src/testcases/org/apache/tools/ant/taskdefs MakeUrlTest.java

Posted by Steve Loughran <st...@apache.org>.
Stefan Bodewig wrote:
> On 22 Aug 2005, <st...@apache.org> wrote:
> 
> 
>>              url = fileToConvert.toURI().toURL().toExternalForm();
> 
> 
> I think File.toURI is JDK 1.4+.
> 
> What is wrong with FileUtils.toURL()?  Shouldn't we improve FileUtils
> and use that from the task if anything is wrong?

will switch to it.

The existing codebase probably didnt bother because it was 1.4+ only.

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


Re: cvs commit: ant/src/testcases/org/apache/tools/ant/taskdefs MakeUrlTest.java

Posted by Stefan Bodewig <bo...@apache.org>.
On 22 Aug 2005, <st...@apache.org> wrote:

>               url = fileToConvert.toURI().toURL().toExternalForm();

I think File.toURI is JDK 1.4+.

What is wrong with FileUtils.toURL()?  Shouldn't we improve FileUtils
and use that from the task if anything is wrong?

Stefan

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