You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by bo...@apache.org on 2009/09/11 13:28:33 UTC
svn commit: r813779 -
/ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
Author: bodewig
Date: Fri Sep 11 11:28:31 2009
New Revision: 813779
URL: http://svn.apache.org/viewvc?rev=813779&view=rev
Log:
prepare for replace and update modes by copying target archive, tiny extract method refactoring
Modified:
ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
Modified: ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
URL: http://svn.apache.org/viewvc/ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java?rev=813779&r1=813778&r2=813779&view=diff
==============================================================================
--- ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java (original)
+++ ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java Fri Sep 11 11:28:31 2009
@@ -87,6 +87,8 @@
private static final String NO_SOURCES_MSG = "No sources, nothing to do.";
+ private static final FileUtils FILE_UTILS = FileUtils.getFileUtils();
+
protected ArchiveBase() {}
protected final void setFactory(ArchiveStreamFactory factory) {
@@ -251,7 +253,8 @@
public void execute() {
validate();
- if (!getDest().isExists()) {
+ final Resource targetArchive = getDest();
+ if (!targetArchive.isExists()) {
// force create mode
mode = new Mode();
mode.setValue(Mode.FORCE_CREATE);
@@ -269,20 +272,24 @@
throw new BuildException(NO_SOURCES_MSG);
}
} else {
+ File copyOfDest = maybeCopyTarget();
+ Resource destOrCopy = copyOfDest == null
+ ? targetArchive
+ : new FileResource(copyOfDest);
try {
- if (!Mode.FORCE_CREATE.equals(mode.getValue())
- && !Mode.FORCE_REPLACE.equals(mode.getValue())
- && isUpToDate(toAdd, getDest())) {
- log(getDest() + " is up-to-date, nothing to do.");
+
+ if (checkAndLogUpToDate(toAdd, destOrCopy)) {
return;
}
- } catch (IOException ioex) {
- throw new BuildException("Failed to read target archive", ioex);
- }
- try {
- writeArchive(toAdd);
- } catch (IOException ioex) {
- throw new BuildException("Failed to write archive", ioex);
+ try {
+ writeArchive(toAdd);
+ } catch (IOException ioex) {
+ throw new BuildException("Failed to write archive", ioex);
+ }
+ } finally {
+ if (copyOfDest != null) {
+ FILE_UTILS.tryHardToDelete(copyOfDest);
+ }
}
}
}
@@ -346,6 +353,21 @@
return (ResourceWithFlags[]) l.toArray(new ResourceWithFlags[l.size()]);
}
+ private boolean checkAndLogUpToDate(ResourceWithFlags[] src,
+ Resource targetArchive) {
+ try {
+ if (!Mode.FORCE_CREATE.equals(mode.getValue())
+ && !Mode.FORCE_REPLACE.equals(mode.getValue())
+ && isUpToDate(src, targetArchive)) {
+ log(targetArchive + " is up-to-date, nothing to do.");
+ return true;
+ }
+ } catch (IOException ioex) {
+ throw new BuildException("Failed to read target archive", ioex);
+ }
+ return false;
+ }
+
/**
* Checks whether the target is more recent than the resources
* that shall be added to it.
@@ -378,7 +400,6 @@
*/
protected void writeArchive(ResourceWithFlags[] src)
throws IOException {
- FileUtils fu = FileUtils.getFileUtils();
ArchiveOutputStream out = null;
Set addedDirectories = new HashSet();
try {
@@ -401,7 +422,7 @@
in = src[i].getResource().getInputStream();
IOUtils.copy(in, out);
} finally {
- fu.close(in);
+ FILE_UTILS.close(in);
}
} else {
addedDirectories.add(src[i].getName());
@@ -410,7 +431,7 @@
}
} finally {
- fu.close(out);
+ FILE_UTILS.close(out);
}
}
@@ -656,6 +677,29 @@
}
/**
+ * Creates a copy of the target archive in update or recreate mode
+ * because some entries may later be read and archived from it.
+ */
+ private File maybeCopyTarget() {
+ File copyOfDest = null;
+ try {
+ if (!Mode.FORCE_CREATE.equals(mode.getValue())
+ && !Mode.CREATE.equals(mode.getValue())) {
+ copyOfDest = FILE_UTILS.createTempFile(getTaskName(), ".tmp",
+ null, true, false);
+ ResourceUtils.copyResource(getDest(),
+ new FileResource(copyOfDest));
+ }
+ } catch (IOException ioex) {
+ if (copyOfDest != null && copyOfDest.exists()) {
+ FILE_UTILS.tryHardToDelete(copyOfDest);
+ }
+ throw new BuildException("Failed to copy target archive", ioex);
+ }
+ return copyOfDest;
+ }
+
+ /**
* Valid Modes for create/update/replace.
*/
public static final class Mode extends EnumeratedAttribute {