You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by mb...@apache.org on 2005/09/29 23:09:55 UTC
svn commit: r292553 - in /ant/core/trunk/src:
main/org/apache/tools/ant/types/resources/comparators/
main/org/apache/tools/ant/types/selectors/modifiedselector/
main/org/apache/tools/ant/util/ testcases/org/apache/tools/ant/types/
Author: mbenson
Date: Thu Sep 29 14:09:44 2005
New Revision: 292553
URL: http://svn.apache.org/viewcvs?rev=292553&view=rev
Log:
Move Resource-based utility methods in FileUtils to ResourceUtils (static).
Modified:
ant/core/trunk/src/main/org/apache/tools/ant/types/resources/comparators/Content.java
ant/core/trunk/src/main/org/apache/tools/ant/types/selectors/modifiedselector/ModifiedSelector.java
ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java
ant/core/trunk/src/main/org/apache/tools/ant/util/ResourceUtils.java
ant/core/trunk/src/testcases/org/apache/tools/ant/types/ResourceOutputTest.java
Modified: ant/core/trunk/src/main/org/apache/tools/ant/types/resources/comparators/Content.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/types/resources/comparators/Content.java?rev=292553&r1=292552&r2=292553&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/types/resources/comparators/Content.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/types/resources/comparators/Content.java Thu Sep 29 14:09:44 2005
@@ -20,7 +20,7 @@
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.Resource;
-import org.apache.tools.ant.util.FileUtils;
+import org.apache.tools.ant.util.ResourceUtils;
/**
* Compares Resources by content.
@@ -60,7 +60,7 @@
*/
protected int resourceCompare(Resource foo, Resource bar) {
try {
- return FileUtils.getFileUtils().compareContent(foo, bar, !binary);
+ return ResourceUtils.compareContent(foo, bar, !binary);
} catch (IOException e) {
throw new BuildException(e);
}
Modified: ant/core/trunk/src/main/org/apache/tools/ant/types/selectors/modifiedselector/ModifiedSelector.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/types/selectors/modifiedselector/ModifiedSelector.java?rev=292553&r1=292552&r2=292553&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/types/selectors/modifiedselector/ModifiedSelector.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/types/selectors/modifiedselector/ModifiedSelector.java Thu Sep 29 14:09:44 2005
@@ -38,6 +38,7 @@
import org.apache.tools.ant.types.resources.selectors.ResourceSelector;
import org.apache.tools.ant.types.selectors.BaseExtendSelector;
import org.apache.tools.ant.util.FileUtils;
+import org.apache.tools.ant.util.ResourceUtils;
/**
@@ -540,7 +541,7 @@
FileUtils fu = FileUtils.getFileUtils();
File tmpFile = fu.createTempFile("modified-", ".tmp", null);
Resource tmpResource = new FileResource(tmpFile);
- fu.copyResource(resource, tmpResource);
+ ResourceUtils.copyResource(resource, tmpResource);
boolean isSelected = isSelected(tmpFile.getParentFile(),
tmpFile.getName(),
resource.toLongString());
Modified: ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java?rev=292553&r1=292552&r2=292553&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/util/FileUtils.java Thu Sep 29 14:09:44 2005
@@ -41,9 +41,7 @@
import org.apache.tools.ant.Project;
import org.apache.tools.ant.filters.util.ChainReaderHelper;
import org.apache.tools.ant.taskdefs.condition.Os;
-import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.FilterSetCollection;
-import org.apache.tools.ant.types.resources.Touchable;
import org.apache.tools.ant.types.resources.FileResource;
import org.apache.tools.ant.launch.Locator;
@@ -54,7 +52,6 @@
* their last modification time.
*
*/
-
public class FileUtils {
private static final FileUtils PRIMARY_INSTANCE = new FileUtils();
@@ -68,7 +65,7 @@
private static boolean onWin9x = Os.isFamily("win9x");
private static boolean onWindows = Os.isFamily("windows");
- private static final int BUF_SIZE = 8192;
+ static final int BUF_SIZE = 8192;
// for toURI
private static boolean[] isSpecial = new boolean[256];
@@ -520,207 +517,13 @@
String inputEncoding, String outputEncoding,
Project project)
throws IOException {
- copyResource(new FileResource(sourceFile), new FileResource(destFile),
+ ResourceUtils.copyResource(
+ new FileResource(sourceFile), new FileResource(destFile),
filters, filterChains, overwrite, preserveLastModified,
inputEncoding, outputEncoding, project);
}
/**
- * Convenience method to copy content from one Resource to another.
- * No filtering is performed.
- *
- * @param source the Resource to copy from.
- * Must not be <code>null</code>.
- * @param dest the Resource to copy to.
- * Must not be <code>null</code>.
- *
- * @throws IOException if the copying fails.
- *
- * @since Ant 1.7
- */
- public void copyResource(Resource source, Resource dest) throws IOException {
- copyResource(source, dest, null);
- }
-
- /**
- * Convenience method to copy content from one Resource to another.
- * No filtering is performed.
- *
- * @param source the Resource to copy from.
- * Must not be <code>null</code>.
- * @param dest the Resource to copy to.
- * Must not be <code>null</code>.
- * @param project the project instance.
- *
- * @throws IOException if the copying fails.
- *
- * @since Ant 1.7
- */
- public void copyResource(Resource source, Resource dest, Project project)
- throws IOException {
- copyResource(source, dest, null, null, false,
- false, null, null, project);
- }
-
- /**
- * Convenience method to copy content from one Resource to another
- * specifying whether token filtering must be used, whether filter chains
- * must be used, whether newer destination files may be overwritten and
- * whether the last modified time of <code>dest</code> file should be made
- * equal to the last modified time of <code>source</code>.
- *
- * @param source the Resource to copy from.
- * Must not be <code>null</code>.
- * @param dest the Resource to copy to.
- * Must not be <code>null</code>.
- * @param filters the collection of filters to apply to this copy.
- * @param filterChains filterChains to apply during the copy.
- * @param overwrite Whether or not the destination Resource should be
- * overwritten if it already exists.
- * @param preserveLastModified Whether or not the last modified time of
- * the destination Resource should be set to that
- * of the source.
- * @param inputEncoding the encoding used to read the files.
- * @param outputEncoding the encoding used to write the files.
- * @param project the project instance.
- *
- * @throws IOException if the copying fails.
- *
- * @since Ant 1.7
- */
- public void copyResource(Resource source, Resource dest,
- FilterSetCollection filters, Vector filterChains,
- boolean overwrite, boolean preserveLastModified,
- String inputEncoding, String outputEncoding,
- Project project)
- throws IOException {
- if (!overwrite) {
- long slm = source.getLastModified();
- if (dest.isExists() && slm != 0
- && dest.getLastModified() > slm) {
- return;
- }
- }
- final boolean filterSetsAvailable = (filters != null
- && filters.hasFilters());
- final boolean filterChainsAvailable = (filterChains != null
- && filterChains.size() > 0);
- if (filterSetsAvailable) {
- BufferedReader in = null;
- BufferedWriter out = null;
- try {
- InputStreamReader isr = null;
- if (inputEncoding == null) {
- isr = new InputStreamReader(source.getInputStream());
- } else {
- isr = new InputStreamReader(source.getInputStream(),
- inputEncoding);
- }
- in = new BufferedReader(isr);
- OutputStreamWriter osw = null;
- if (outputEncoding == null) {
- osw = new OutputStreamWriter(dest.getOutputStream());
- } else {
- osw = new OutputStreamWriter(dest.getOutputStream(),
- outputEncoding);
- }
- out = new BufferedWriter(osw);
- if (filterChainsAvailable) {
- ChainReaderHelper crh = new ChainReaderHelper();
- crh.setBufferSize(BUF_SIZE);
- crh.setPrimaryReader(in);
- crh.setFilterChains(filterChains);
- crh.setProject(project);
- Reader rdr = crh.getAssembledReader();
- in = new BufferedReader(rdr);
- }
- LineTokenizer lineTokenizer = new LineTokenizer();
- lineTokenizer.setIncludeDelims(true);
- String newline = null;
- String line = lineTokenizer.getToken(in);
- while (line != null) {
- if (line.length() == 0) {
- // this should not happen, because the lines are
- // returned with the end of line delimiter
- out.newLine();
- } else {
- newline = filters.replaceTokens(line);
- out.write(newline);
- }
- line = lineTokenizer.getToken(in);
- }
- } finally {
- close(out);
- close(in);
- }
- } else if (filterChainsAvailable
- || (inputEncoding != null
- && !inputEncoding.equals(outputEncoding))
- || (inputEncoding == null && outputEncoding != null)) {
- BufferedReader in = null;
- BufferedWriter out = null;
- try {
- InputStreamReader isr = null;
- if (inputEncoding == null) {
- isr = new InputStreamReader(source.getInputStream());
- } else {
- isr = new InputStreamReader(source.getInputStream(),
- inputEncoding);
- }
- in = new BufferedReader(isr);
- OutputStreamWriter osw = null;
- if (outputEncoding == null) {
- osw = new OutputStreamWriter(dest.getOutputStream());
- } else {
- osw = new OutputStreamWriter(dest.getOutputStream(),
- outputEncoding);
- }
- out = new BufferedWriter(osw);
- if (filterChainsAvailable) {
- ChainReaderHelper crh = new ChainReaderHelper();
- crh.setBufferSize(BUF_SIZE);
- crh.setPrimaryReader(in);
- crh.setFilterChains(filterChains);
- crh.setProject(project);
- Reader rdr = crh.getAssembledReader();
- in = new BufferedReader(rdr);
- }
- char[] buffer = new char[BUF_SIZE];
- while (true) {
- int nRead = in.read(buffer, 0, buffer.length);
- if (nRead == -1) {
- break;
- }
- out.write(buffer, 0, nRead);
- }
- } finally {
- close(out);
- close(in);
- }
- } else {
- InputStream in = null;
- OutputStream out = null;
- try {
- in = source.getInputStream();
- out = dest.getOutputStream();
-
- byte[] buffer = new byte[BUF_SIZE];
- int count = 0;
- do {
- out.write(buffer, 0, count);
- count = in.read(buffer, 0, buffer.length);
- } while (count != -1);
- } finally {
- close(out);
- close(in);
- }
- }
- if (preserveLastModified && dest instanceof Touchable) {
- setLastModified((Touchable) dest, source.getLastModified());
- }
- }
-
- /**
* Calls File.setLastModified(long time). Originally written to
* to dynamically bind to that call on Java1.2+.
*
@@ -729,19 +532,7 @@
* if this is -1, the current time is used.
*/
public void setFileLastModified(File file, long time) {
- setLastModified(new FileResource(file), time);
- }
-
- /**
- * Set the last modified time of an object implementing
- * org.apache.tools.ant.types.resources.Touchable .
- *
- * @param t the Touchable whose modified time is to be set.
- * @param time the time to which the last modified time is to be set.
- * if this is -1, the current time is used.
- */
- public void setLastModified(Touchable t, long time) {
- t.touch((time < 0) ? System.currentTimeMillis() : time);
+ ResourceUtils.setLastModified(new FileResource(file), time);
}
/**
@@ -897,6 +688,7 @@
* @param path the path to dissect.
* @return String[] {root, remaining path}.
* @throws java.lang.NullPointerException if path is null.
+ * @since Ant 1.7
*/
public String[] dissect(String path) {
char sep = File.separatorChar;
@@ -1063,143 +855,8 @@
* @since Ant 1.6.3
*/
public boolean contentEquals(File f1, File f2, boolean textfile) throws IOException {
- return contentEquals(new FileResource(f1), new FileResource(f2), textfile);
- }
-
- /**
- * Compares the contents of two Resources.
- *
- * @param r1 the Resource whose content is to be compared.
- * @param r2 the other Resource whose content is to be compared.
- * @param text true if the content is to be treated as text and
- * differences in kind of line break are to be ignored.
- *
- * @return true if the content of the Resources is the same.
- *
- * @throws IOException if the Resources cannot be read.
- * @since Ant 1.6.3
- */
- public boolean contentEquals(Resource r1, Resource r2, boolean text) throws IOException {
- if (r1.isExists() != r2.isExists()) {
- return false;
- }
- if (!r1.isExists()) {
- // two not existing files are equal
- return true;
- }
- // should the following two be switched? If r1 and r2 refer to the same file,
- // isn't their content equal regardless of whether that file is a directory?
- if (r1.isDirectory() || r2.isDirectory()) {
- // don't want to compare directory contents for now
- return false;
- }
- if (r1.equals(r2)) {
- return true;
- }
- if (!text && r1.getSize() != r2.getSize()) {
- return false;
- }
- return compareContent(r1, r2, text) == 0;
- }
-
- /**
- * Compare the content of two Resources. A nonexistent Resource's
- * content is "less than" that of an existing Resource; a directory-type
- * Resource's content is "less than" that of a file-type Resource.
- * @param r1 the Resource whose content is to be compared.
- * @param r2 the other Resource whose content is to be compared.
- * @param text true if the content is to be treated as text and
- * differences in kind of line break are to be ignored.
- * @return a negative integer, zero, or a positive integer as the first
- * argument is less than, equal to, or greater than the second.
- * @throws IOException if the Resources cannot be read.
- */
- public int compareContent(Resource r1, Resource r2, boolean text) throws IOException {
- if (r1.equals(r2)) {
- return 0;
- }
- boolean e1 = r1.isExists();
- boolean e2 = r2.isExists();
- if (!(e1 || e2)) {
- return 0;
- }
- if (e1 != e2) {
- return e1 ? 1 : -1;
- }
- boolean d1 = r1.isDirectory();
- boolean d2 = r2.isDirectory();
- if (d1 && d2) {
- return 0;
- }
- if (d1 || d2) {
- return d1 ? -1 : 1;
- }
- return text ? textCompare(r1, r2) : binaryCompare(r1, r2);
- }
-
- /**
- * Binary compares the contents of two Resources.
- * <p>
- * simple but sub-optimal comparision algorithm. written for working
- * rather than fast. Better would be a block read into buffers followed
- * by long comparisions apart from the final 1-7 bytes.
- * </p>
- *
- * @param r1 the Resource whose content is to be compared.
- * @param r2 the other Resource whose content is to be compared.
- * @return a negative integer, zero, or a positive integer as the first
- * argument is less than, equal to, or greater than the second.
- * @throws IOException if the Resources cannot be read.
- */
- private int binaryCompare(Resource r1, Resource r2) throws IOException {
- InputStream in1 = null;
- InputStream in2 = null;
- try {
- in1 = new BufferedInputStream(r1.getInputStream());
- in2 = new BufferedInputStream(r2.getInputStream());
-
- for (int b1 = in1.read(); b1 != -1; b1 = in1.read()) {
- int b2 = in2.read();
- if (b1 != b2) {
- return b1 > b2 ? 1 : -1;
- }
- }
- return in2.read() == -1 ? 0 : -1;
- } finally {
- close(in1);
- close(in2);
- }
- }
-
- /**
- * Text compares the contents of two Resources.
- * Ignores different kinds of line endings.
- * @param r1 the Resource whose content is to be compared.
- * @param r2 the other Resource whose content is to be compared.
- * @return a negative integer, zero, or a positive integer as the first
- * argument is less than, equal to, or greater than the second.
- * @throws IOException if the Resources cannot be read.
- */
- private int textCompare(Resource r1, Resource r2) throws IOException {
- BufferedReader in1 = null;
- BufferedReader in2 = null;
- try {
- in1 = new BufferedReader(new InputStreamReader(r1.getInputStream()));
- in2 = new BufferedReader(new InputStreamReader(r2.getInputStream()));
-
- String expected = in1.readLine();
- while (expected != null) {
- String actual = in2.readLine();
- if (!expected.equals(actual)) {
- return expected.compareTo(actual);
- }
- expected = in1.readLine();
- }
- return in2.readLine() == null ? 0 : -1;
- } finally {
- close(in1);
- close(in2);
- }
+ return ResourceUtils.contentEquals(
+ new FileResource(f1), new FileResource(f2), textfile);
}
/**
Modified: ant/core/trunk/src/main/org/apache/tools/ant/util/ResourceUtils.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/util/ResourceUtils.java?rev=292553&r1=292552&r2=292553&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/util/ResourceUtils.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/util/ResourceUtils.java Thu Sep 29 14:09:44 2005
@@ -17,18 +17,31 @@
package org.apache.tools.ant.util;
import java.io.File;
+import java.io.Reader;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.BufferedInputStream;
import java.util.Arrays;
+import java.util.Vector;
import java.util.Iterator;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.ProjectComponent;
+import org.apache.tools.ant.filters.util.ChainReaderHelper;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.TimeComparison;
import org.apache.tools.ant.types.ResourceFactory;
import org.apache.tools.ant.types.ResourceCollection;
+import org.apache.tools.ant.types.FilterSetCollection;
import org.apache.tools.ant.types.resources.Union;
import org.apache.tools.ant.types.resources.Restrict;
import org.apache.tools.ant.types.resources.Resources;
+import org.apache.tools.ant.types.resources.Touchable;
import org.apache.tools.ant.types.resources.selectors.Or;
import org.apache.tools.ant.types.resources.selectors.And;
import org.apache.tools.ant.types.resources.selectors.Not;
@@ -175,6 +188,360 @@
return result;
}
+ /**
+ * Convenience method to copy content from one Resource to another.
+ * No filtering is performed.
+ *
+ * @param source the Resource to copy from.
+ * Must not be <code>null</code>.
+ * @param dest the Resource to copy to.
+ * Must not be <code>null</code>.
+ *
+ * @throws IOException if the copying fails.
+ *
+ * @since Ant 1.7
+ */
+ public static void copyResource(Resource source, Resource dest) throws IOException {
+ copyResource(source, dest, null);
+ }
+
+ /**
+ * Convenience method to copy content from one Resource to another.
+ * No filtering is performed.
+ *
+ * @param source the Resource to copy from.
+ * Must not be <code>null</code>.
+ * @param dest the Resource to copy to.
+ * Must not be <code>null</code>.
+ * @param project the project instance.
+ *
+ * @throws IOException if the copying fails.
+ *
+ * @since Ant 1.7
+ */
+ public static void copyResource(Resource source, Resource dest, Project project)
+ throws IOException {
+ copyResource(source, dest, null, null, false,
+ false, null, null, project);
+ }
+
+ /**
+ * Convenience method to copy content from one Resource to another
+ * specifying whether token filtering must be used, whether filter chains
+ * must be used, whether newer destination files may be overwritten and
+ * whether the last modified time of <code>dest</code> file should be made
+ * equal to the last modified time of <code>source</code>.
+ *
+ * @param source the Resource to copy from.
+ * Must not be <code>null</code>.
+ * @param dest the Resource to copy to.
+ * Must not be <code>null</code>.
+ * @param filters the collection of filters to apply to this copy.
+ * @param filterChains filterChains to apply during the copy.
+ * @param overwrite Whether or not the destination Resource should be
+ * overwritten if it already exists.
+ * @param preserveLastModified Whether or not the last modified time of
+ * the destination Resource should be set to that
+ * of the source.
+ * @param inputEncoding the encoding used to read the files.
+ * @param outputEncoding the encoding used to write the files.
+ * @param project the project instance.
+ *
+ * @throws IOException if the copying fails.
+ *
+ * @since Ant 1.7
+ */
+ public static void copyResource(Resource source, Resource dest,
+ FilterSetCollection filters, Vector filterChains,
+ boolean overwrite, boolean preserveLastModified,
+ String inputEncoding, String outputEncoding,
+ Project project)
+ throws IOException {
+ if (!overwrite) {
+ long slm = source.getLastModified();
+ if (dest.isExists() && slm != 0
+ && dest.getLastModified() > slm) {
+ return;
+ }
+ }
+ final boolean filterSetsAvailable = (filters != null
+ && filters.hasFilters());
+ final boolean filterChainsAvailable = (filterChains != null
+ && filterChains.size() > 0);
+ if (filterSetsAvailable) {
+ BufferedReader in = null;
+ BufferedWriter out = null;
+ try {
+ InputStreamReader isr = null;
+ if (inputEncoding == null) {
+ isr = new InputStreamReader(source.getInputStream());
+ } else {
+ isr = new InputStreamReader(source.getInputStream(),
+ inputEncoding);
+ }
+ in = new BufferedReader(isr);
+ OutputStreamWriter osw = null;
+ if (outputEncoding == null) {
+ osw = new OutputStreamWriter(dest.getOutputStream());
+ } else {
+ osw = new OutputStreamWriter(dest.getOutputStream(),
+ outputEncoding);
+ }
+ out = new BufferedWriter(osw);
+ if (filterChainsAvailable) {
+ ChainReaderHelper crh = new ChainReaderHelper();
+ crh.setBufferSize(FileUtils.BUF_SIZE);
+ crh.setPrimaryReader(in);
+ crh.setFilterChains(filterChains);
+ crh.setProject(project);
+ Reader rdr = crh.getAssembledReader();
+ in = new BufferedReader(rdr);
+ }
+ LineTokenizer lineTokenizer = new LineTokenizer();
+ lineTokenizer.setIncludeDelims(true);
+ String newline = null;
+ String line = lineTokenizer.getToken(in);
+ while (line != null) {
+ if (line.length() == 0) {
+ // this should not happen, because the lines are
+ // returned with the end of line delimiter
+ out.newLine();
+ } else {
+ newline = filters.replaceTokens(line);
+ out.write(newline);
+ }
+ line = lineTokenizer.getToken(in);
+ }
+ } finally {
+ FileUtils.close(out);
+ FileUtils.close(in);
+ }
+ } else if (filterChainsAvailable
+ || (inputEncoding != null
+ && !inputEncoding.equals(outputEncoding))
+ || (inputEncoding == null && outputEncoding != null)) {
+ BufferedReader in = null;
+ BufferedWriter out = null;
+ try {
+ InputStreamReader isr = null;
+ if (inputEncoding == null) {
+ isr = new InputStreamReader(source.getInputStream());
+ } else {
+ isr = new InputStreamReader(source.getInputStream(),
+ inputEncoding);
+ }
+ in = new BufferedReader(isr);
+ OutputStreamWriter osw = null;
+ if (outputEncoding == null) {
+ osw = new OutputStreamWriter(dest.getOutputStream());
+ } else {
+ osw = new OutputStreamWriter(dest.getOutputStream(),
+ outputEncoding);
+ }
+ out = new BufferedWriter(osw);
+ if (filterChainsAvailable) {
+ ChainReaderHelper crh = new ChainReaderHelper();
+ crh.setBufferSize(FileUtils.BUF_SIZE);
+ crh.setPrimaryReader(in);
+ crh.setFilterChains(filterChains);
+ crh.setProject(project);
+ Reader rdr = crh.getAssembledReader();
+ in = new BufferedReader(rdr);
+ }
+ char[] buffer = new char[FileUtils.BUF_SIZE];
+ while (true) {
+ int nRead = in.read(buffer, 0, buffer.length);
+ if (nRead == -1) {
+ break;
+ }
+ out.write(buffer, 0, nRead);
+ }
+ } finally {
+ FileUtils.close(out);
+ FileUtils.close(in);
+ }
+ } else {
+ InputStream in = null;
+ OutputStream out = null;
+ try {
+ in = source.getInputStream();
+ out = dest.getOutputStream();
+
+ byte[] buffer = new byte[FileUtils.BUF_SIZE];
+ int count = 0;
+ do {
+ out.write(buffer, 0, count);
+ count = in.read(buffer, 0, buffer.length);
+ } while (count != -1);
+ } finally {
+ FileUtils.close(out);
+ FileUtils.close(in);
+ }
+ }
+ if (preserveLastModified && dest instanceof Touchable) {
+ setLastModified((Touchable) dest, source.getLastModified());
+ }
+ }
+
+ /**
+ * Set the last modified time of an object implementing
+ * org.apache.tools.ant.types.resources.Touchable .
+ *
+ * @param t the Touchable whose modified time is to be set.
+ * @param time the time to which the last modified time is to be set.
+ * if this is -1, the current time is used.
+ * @since Ant 1.7
+ */
+ public static void setLastModified(Touchable t, long time) {
+ t.touch((time < 0) ? System.currentTimeMillis() : time);
+ }
+
+ /**
+ * Compares the contents of two Resources.
+ *
+ * @param r1 the Resource whose content is to be compared.
+ * @param r2 the other Resource whose content is to be compared.
+ * @param text true if the content is to be treated as text and
+ * differences in kind of line break are to be ignored.
+ *
+ * @return true if the content of the Resources is the same.
+ *
+ * @throws IOException if the Resources cannot be read.
+ * @since Ant 1.7
+ */
+ public static boolean contentEquals(Resource r1, Resource r2, boolean text) throws IOException {
+ if (r1.isExists() != r2.isExists()) {
+ return false;
+ }
+ if (!r1.isExists()) {
+ // two not existing files are equal
+ return true;
+ }
+ // should the following two be switched? If r1 and r2 refer to the same file,
+ // isn't their content equal regardless of whether that file is a directory?
+ if (r1.isDirectory() || r2.isDirectory()) {
+ // don't want to compare directory contents for now
+ return false;
+ }
+ if (r1.equals(r2)) {
+ return true;
+ }
+ if (!text && r1.getSize() != r2.getSize()) {
+ return false;
+ }
+ return compareContent(r1, r2, text) == 0;
+ }
+
+ /**
+ * Compare the content of two Resources. A nonexistent Resource's
+ * content is "less than" that of an existing Resource; a directory-type
+ * Resource's content is "less than" that of a file-type Resource.
+ * @param r1 the Resource whose content is to be compared.
+ * @param r2 the other Resource whose content is to be compared.
+ * @param text true if the content is to be treated as text and
+ * differences in kind of line break are to be ignored.
+ * @return a negative integer, zero, or a positive integer as the first
+ * argument is less than, equal to, or greater than the second.
+ * @throws IOException if the Resources cannot be read.
+ * @since Ant 1.7
+ */
+ public static int compareContent(Resource r1, Resource r2, boolean text) throws IOException {
+ if (r1.equals(r2)) {
+ return 0;
+ }
+ boolean e1 = r1.isExists();
+ boolean e2 = r2.isExists();
+ if (!(e1 || e2)) {
+ return 0;
+ }
+ if (e1 != e2) {
+ return e1 ? 1 : -1;
+ }
+ boolean d1 = r1.isDirectory();
+ boolean d2 = r2.isDirectory();
+ if (d1 && d2) {
+ return 0;
+ }
+ if (d1 || d2) {
+ return d1 ? -1 : 1;
+ }
+ return text ? textCompare(r1, r2) : binaryCompare(r1, r2);
+ }
+
+ /**
+ * Binary compares the contents of two Resources.
+ * <p>
+ * simple but sub-optimal comparision algorithm. written for working
+ * rather than fast. Better would be a block read into buffers followed
+ * by long comparisions apart from the final 1-7 bytes.
+ * </p>
+ *
+ * @param r1 the Resource whose content is to be compared.
+ * @param r2 the other Resource whose content is to be compared.
+ * @return a negative integer, zero, or a positive integer as the first
+ * argument is less than, equal to, or greater than the second.
+ * @throws IOException if the Resources cannot be read.
+ * @since Ant 1.7
+ */
+ private static int binaryCompare(Resource r1, Resource r2) throws IOException {
+ InputStream in1 = null;
+ InputStream in2 = null;
+ try {
+ in1 = new BufferedInputStream(r1.getInputStream());
+ in2 = new BufferedInputStream(r2.getInputStream());
+
+ for (int b1 = in1.read(); b1 != -1; b1 = in1.read()) {
+ int b2 = in2.read();
+ if (b1 != b2) {
+ return b1 > b2 ? 1 : -1;
+ }
+ }
+ return in2.read() == -1 ? 0 : -1;
+ } finally {
+ FileUtils.close(in1);
+ FileUtils.close(in2);
+ }
+ }
+
+ /**
+ * Text compares the contents of two Resources.
+ * Ignores different kinds of line endings.
+ * @param r1 the Resource whose content is to be compared.
+ * @param r2 the other Resource whose content is to be compared.
+ * @return a negative integer, zero, or a positive integer as the first
+ * argument is less than, equal to, or greater than the second.
+ * @throws IOException if the Resources cannot be read.
+ * @since Ant 1.7
+ */
+ private static int textCompare(Resource r1, Resource r2) throws IOException {
+ BufferedReader in1 = null;
+ BufferedReader in2 = null;
+ try {
+ in1 = new BufferedReader(new InputStreamReader(r1.getInputStream()));
+ in2 = new BufferedReader(new InputStreamReader(r2.getInputStream()));
+
+ String expected = in1.readLine();
+ while (expected != null) {
+ String actual = in2.readLine();
+ if (!expected.equals(actual)) {
+ return expected.compareTo(actual);
+ }
+ expected = in1.readLine();
+ }
+ return in2.readLine() == null ? 0 : -1;
+ } finally {
+ FileUtils.close(in1);
+ FileUtils.close(in2);
+ }
+ }
+
+ /**
+ * Log which Resources (if any) have been modified in the future.
+ * @param logTo the ProjectComponent to do the logging.
+ * @param rc the collection of Resources to check.
+ * @param long the timestamp granularity to use.
+ * @since Ant 1.7
+ */
private static void logFuture(ProjectComponent logTo,
ResourceCollection rc, long granularity) {
long now = System.currentTimeMillis() + granularity;
Modified: ant/core/trunk/src/testcases/org/apache/tools/ant/types/ResourceOutputTest.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/testcases/org/apache/tools/ant/types/ResourceOutputTest.java?rev=292553&r1=292552&r2=292553&view=diff
==============================================================================
--- ant/core/trunk/src/testcases/org/apache/tools/ant/types/ResourceOutputTest.java (original)
+++ ant/core/trunk/src/testcases/org/apache/tools/ant/types/ResourceOutputTest.java Thu Sep 29 14:09:44 2005
@@ -34,6 +34,7 @@
import org.apache.tools.ant.types.resources.PropertyResource;
import org.apache.tools.ant.types.resources.ImmutableResourceException;
import org.apache.tools.ant.util.FileUtils;
+import org.apache.tools.ant.util.ResourceUtils;
public class ResourceOutputTest extends BuildFileTest {
@@ -147,7 +148,7 @@
}
private void testoutput(Resource dest) throws IOException {
- FILE_UTILS.copyResource(new StringResource("foo"), dest, null);
+ ResourceUtils.copyResource(new StringResource("foo"), dest, null);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org