You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

SourceFileScanner.java 6.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /*
  2. * The Apache Software License, Version 1.1
  3. *
  4. * Copyright (c) 2000 The Apache Software Foundation. All rights
  5. * reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. *
  11. * 1. Redistributions of source code must retain the above copyright
  12. * notice, this list of conditions and the following disclaimer.
  13. *
  14. * 2. Redistributions in binary form must reproduce the above copyright
  15. * notice, this list of conditions and the following disclaimer in
  16. * the documentation and/or other materials provided with the
  17. * distribution.
  18. *
  19. * 3. The end-user documentation included with the redistribution, if
  20. * any, must include the following acknowlegement:
  21. * "This product includes software developed by the
  22. * Apache Software Foundation (http://www.apache.org/)."
  23. * Alternately, this acknowlegement may appear in the software itself,
  24. * if and wherever such third-party acknowlegements normally appear.
  25. *
  26. * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
  27. * Foundation" must not be used to endorse or promote products derived
  28. * from this software without prior written permission. For written
  29. * permission, please contact apache@apache.org.
  30. *
  31. * 5. Products derived from this software may not be called "Apache"
  32. * nor may "Apache" appear in their names without prior written
  33. * permission of the Apache Group.
  34. *
  35. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38. * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42. * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45. * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46. * SUCH DAMAGE.
  47. * ====================================================================
  48. *
  49. * This software consists of voluntary contributions made by many
  50. * individuals on behalf of the Apache Software Foundation. For more
  51. * information on the Apache Software Foundation, please see
  52. * <http://www.apache.org/>.
  53. */
  54. package org.apache.tools.ant.util;
  55. import org.apache.tools.ant.Project;
  56. import org.apache.tools.ant.Task;
  57. import java.io.File;
  58. import java.util.Vector;
  59. /**
  60. * Utility class that collects the functionality of the various
  61. * scanDir methods that have been scattered in several tasks before.
  62. *
  63. * <p>The only method returns an array of source files. The array is a
  64. * subset of the files given as a parameter and holds only those that
  65. * are newer than their corresponding target files.</p>
  66. *
  67. * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
  68. */
  69. public class SourceFileScanner {
  70. protected Task task;
  71. /**
  72. * @param task The task we should log messages through
  73. */
  74. public SourceFileScanner(Task task) {
  75. this.task = task;
  76. }
  77. /**
  78. * Restrict the given set of files to those that are newer than
  79. * their corresponding target files.
  80. *
  81. * @param files the original set of files
  82. * @param srcDir all files are relative to this directory
  83. * @param destDir target files live here
  84. * @param mapper knows how to construct a target file names from
  85. * source file names.
  86. */
  87. public String[] restrict(String[] files, File srcDir, File destDir,
  88. FileNameMapper mapper) {
  89. long now = (new java.util.Date()).getTime();
  90. StringBuffer targetList = new StringBuffer();
  91. Vector v = new Vector();
  92. for (int i=0; i< files.length; i++) {
  93. String[] targets = mapper.mapFileName(files[i]);
  94. if (targets == null || targets.length == 0) {
  95. task.log(files[i]+" skipped - don\'t know how to handle it",
  96. Project.MSG_VERBOSE);
  97. continue;
  98. }
  99. File src = new File(srcDir, files[i]);
  100. if (src.lastModified() > now) {
  101. task.log("Warning: "+files[i]+" modified in the future.",
  102. Project.MSG_WARN);
  103. }
  104. boolean added = false;
  105. targetList.setLength(0);
  106. for (int j=0; !added && j<targets.length; j++) {
  107. File dest = new File(destDir, targets[j]);
  108. if (!dest.exists()) {
  109. task.log(files[i]+" added as "+dest.getAbsolutePath()+" doesn\'t exist.",
  110. Project.MSG_VERBOSE);
  111. v.addElement(files[i]);
  112. added = true;
  113. } else if (src.lastModified() > dest.lastModified()) {
  114. task.log(files[i]+" added as "+dest.getAbsolutePath()+" is outdated.",
  115. Project.MSG_VERBOSE);
  116. v.addElement(files[i]);
  117. added = true;
  118. } else {
  119. if (targetList.length() > 0) {
  120. targetList.append(", ");
  121. }
  122. targetList.append(dest.getAbsolutePath());
  123. }
  124. }
  125. if (!added) {
  126. task.log(files[i]+" omitted as "+targetList.toString()
  127. + (targets.length == 1 ? " is" : " are ")
  128. + " up to date.", Project.MSG_VERBOSE);
  129. }
  130. }
  131. String[] result = new String[v.size()];
  132. v.copyInto(result);
  133. return result;
  134. }
  135. /**
  136. * Convinience layer on top of restrict that returns the source
  137. * files as File objects (containing absolute paths if srcDir is
  138. * absolute).
  139. */
  140. public File[] restrictAsFiles(String[] files, File srcDir, File destDir,
  141. FileNameMapper mapper) {
  142. String[] res = restrict(files, srcDir, destDir, mapper);
  143. File[] result = new File[res.length];
  144. for (int i=0; i<res.length; i++) {
  145. result[i] = new File(srcDir, res[i]);
  146. }
  147. return result;
  148. }
  149. }