ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ste...@apache.org
Subject cvs commit: ant/src/main/org/apache/tools/ant/taskdefs CopyPath.java defaults.properties
Date Mon, 16 May 2005 14:58:47 GMT
stevel      2005/05/16 07:58:47

  Modified:    src/main/org/apache/tools/ant/taskdefs defaults.properties
  Added:       src/main/org/apache/tools/ant/taskdefs CopyPath.java
  Log:
  utterly without documents or tests, a utility task to extract a path to a dir, by way of
a mapper.
  
  Revision  Changes    Path
  1.168     +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.167
  retrieving revision 1.168
  diff -u -r1.167 -r1.168
  --- defaults.properties	28 Mar 2005 23:22:11 -0000	1.167
  +++ defaults.properties	16 May 2005 14:58:47 -0000	1.168
  @@ -82,6 +82,7 @@
   libraries=org.apache.tools.ant.taskdefs.repository.Libraries
   length=org.apache.tools.ant.taskdefs.Length
   clone=org.apache.tools.ant.taskdefs.Clone
  +copypath=org.apache.tools.ant.taskdefs.CopyPath
   
   # optional tasks
   image=org.apache.tools.ant.taskdefs.optional.image.Image
  
  
  
  1.1                  ant/src/main/org/apache/tools/ant/taskdefs/CopyPath.java
  
  Index: CopyPath.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.util.FileUtils;
  import org.apache.tools.ant.util.SourceFileScanner;
  import org.apache.tools.ant.util.FileNameMapper;
  import org.apache.tools.ant.types.Mapper;
  import org.apache.tools.ant.types.Path;
  import org.apache.tools.ant.types.Reference;
  import org.apache.tools.ant.types.FilterSetCollection;
  import org.apache.tools.ant.types.FilterSet;
  
  import java.io.File;
  import java.io.IOException;
  import java.util.Enumeration;
  import java.util.Vector;
  import java.util.Hashtable;
  
  /**
   * Copy the contents of a path to a destination, using the mapper of choice
   * @since Ant 1.7
   *
   * @ant.task category="filesystem"
   */
  
  public class CopyPath extends Task {
  
      private FileNameMapper mapper;
  
      private Path path;
  
      private File destDir;
      protected FileUtils fileUtils;
      private long granularity = 0;
      protected boolean preserveLastModified = false;
  
      public CopyPath() {
          fileUtils = FileUtils.getFileUtils();
          granularity = fileUtils.getFileTimestampGranularity();
      }
  
      public static final String ERROR_NO_DESTDIR = "No destDir specified";
      public static final String ERROR_NO_PATH = "No path specified";
      public static final String ERROR_NO_MAPPER = "No mapper specified";
  
      public void setDestDir(File destDir) {
          this.destDir = destDir;
      }
  
      /**
       * add a mapper
       * @param newmapper
       */
      public void add(FileNameMapper newmapper) {
          if(mapper!=null) {
              throw new BuildException("Only one mapper allowed");
          }
          mapper=newmapper;
      }
  
  
      /**
       * Set the path to be used when running the Java class.
       *
       * @param s an Ant Path object containing the path.
       */
      public void setPath(Path s) {
          createPath().append(s);
      }
  
      /**
       * Set the path to use by reference.
       *
       * @param r a reference to an existing path.
       */
      public void setPathRef(Reference r) {
          createPath().setRefid(r);
      }
  
      /**
       * Create a path.
       *
       * @return a path to be configured.
       */
      public Path createPath() {
          if (path == null) {
              path = new Path(getProject());
          }
          return path;
      }
  
      public void setGranularity(long granularity) {
          this.granularity = granularity;
      }
  
      public void setPreserveLastModified(boolean preserveLastModified) {
          this.preserveLastModified = preserveLastModified;
      }
  
      /**
       * Ensure we have a consistent and legal set of attributes, and set any
       * internal flags necessary based on different combinations of attributes.
       *
       * @throws BuildException if an error occurs.
       */
      protected void validateAttributes() throws BuildException {
          if(destDir==null) {
              throw new BuildException(ERROR_NO_DESTDIR);
          }
          if(mapper==null) {
              throw new BuildException(ERROR_NO_MAPPER);
          }
          if(path==null) {
              throw new BuildException(ERROR_NO_PATH);
          }
      }
  
      /**
       * This is a very minimal derivative of the nomal copy logic.
       *
       * @throws BuildException if something goes wrong with the build.
       */
      public void execute() throws BuildException {
          validateAttributes();
          String[] sourceFiles = path.list();
          if (sourceFiles.length == 0) {
              log("Path is empty", Project.MSG_VERBOSE);
              return;
          }
  
          for (int sources = 0; sources < sourceFiles.length; sources++) {
  
              String sourceFileName = sourceFiles[sources];
              File sourceFile=new File(sourceFileName);
              String[] toFiles = (String[]) mapper.mapFileName(sourceFileName);
  
              for (int i = 0; i < toFiles.length; i++) {
                  String destFileName = toFiles[i];
                  File destFile=new File(destDir,destFileName);
  
  
                  if (sourceFile.equals(destFile)) {
                      log("Skipping self-copy of " + sourceFileName,
                              Project.MSG_VERBOSE);
                      continue;
                  }
                  try {
                      log("Copying " + sourceFile + " to " + destFile,
                              Project.MSG_VERBOSE);
  
                      fileUtils.copyFile(sourceFile, destFile, null,
                              null, false,
                              preserveLastModified, null,
                              null, getProject());
                  } catch (IOException ioe) {
                      String msg = "Failed to copy " +
                              sourceFile +
                              " to " +
                              destFile
                              + " due to " + ioe.getMessage();
                      if (destFile.exists() && !destFile.delete()) {
                          msg += " and I couldn't delete the corrupt " + destFile;
                      }
                      throw new BuildException(msg, ioe, getLocation());
                  }
              }
  
          }
  
      }
  }
  
  
  

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


Mime
View raw message