summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Ducrohet <xav@android.com>2013-07-23 22:51:52 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2013-07-23 22:51:52 +0000
commit6a70a909a72e03abf759ea714b98b17dc8c36d67 (patch)
treea9f53dfb19db222cd53a1e216a17415339b087dc
parentf9c403698b488c36f1ed576782517f60266f39ee (diff)
parent61107c1bdcafc3f22e1c4e02a8ed0102a77c6351 (diff)
downloadbase-jb-mr1.1-dev-plus-aosp.tar.gz
Merge "Properly handle removed res items when writing incremental data blob."jb-mr1.1-dev-plus-aosp
-rw-r--r--sdk-common/src/main/java/com/android/ide/common/res2/DataFile.java10
-rwxr-xr-xsdk-common/src/main/java/com/android/ide/common/res2/DataMerger.java12
-rwxr-xr-xsdk-common/src/main/java/com/android/ide/common/res2/DataSet.java8
-rwxr-xr-xsdk-common/src/test/java/com/android/ide/common/res2/ResourceMergerTest.java64
-rw-r--r--sdk-common/src/test/resources/testData/resources/removedFile/merger.xml9
-rw-r--r--sdk-common/src/test/resources/testData/resources/removedFile/out/drawable/icon.png0
-rw-r--r--sdk-common/src/test/resources/testData/resources/removedFile/out/drawable/removed.png0
-rw-r--r--sdk-common/src/test/resources/testData/resources/removedFile/res/drawable/icon.png0
8 files changed, 100 insertions, 3 deletions
diff --git a/sdk-common/src/main/java/com/android/ide/common/res2/DataFile.java b/sdk-common/src/main/java/com/android/ide/common/res2/DataFile.java
index 85fcac8f05..29f871574b 100644
--- a/sdk-common/src/main/java/com/android/ide/common/res2/DataFile.java
+++ b/sdk-common/src/main/java/com/android/ide/common/res2/DataFile.java
@@ -91,6 +91,16 @@ public abstract class DataFile<I extends DataItem> {
return mItems.values().iterator().next();
}
+ boolean hasNotRemovedItems() {
+ for (I item : mItems.values()) {
+ if (!item.isRemoved()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
@NonNull
public Collection<I> getItems() {
return mItems.values();
diff --git a/sdk-common/src/main/java/com/android/ide/common/res2/DataMerger.java b/sdk-common/src/main/java/com/android/ide/common/res2/DataMerger.java
index 9259682752..05a52fa22f 100755
--- a/sdk-common/src/main/java/com/android/ide/common/res2/DataMerger.java
+++ b/sdk-common/src/main/java/com/android/ide/common/res2/DataMerger.java
@@ -317,9 +317,10 @@ abstract class DataMerger<I extends DataItem<F>, F extends DataFile<I>, S extend
* @return true if the blob was loaded.
* @throws IOException
*
- * @see #writeBlobTo(File)
+ * @see #writeBlobTo(File, MergeConsumer)
*/
- public boolean loadFromBlob(File blobRootFolder, boolean incrementalState) throws IOException {
+ public boolean loadFromBlob(@NonNull File blobRootFolder, boolean incrementalState)
+ throws IOException {
File file = new File(blobRootFolder, FN_MERGER_XML);
if (!file.isFile()) {
return false;
@@ -382,6 +383,13 @@ abstract class DataMerger<I extends DataItem<F>, F extends DataFile<I>, S extend
}
}
+ public void cleanBlob(@NonNull File blobRootFolder) {
+ File file = new File(blobRootFolder, FN_MERGER_XML);
+ if (file.isFile()) {
+ file.delete();
+ }
+ }
+
/**
* Sets the post blob load state to WRITTEN.
*
diff --git a/sdk-common/src/main/java/com/android/ide/common/res2/DataSet.java b/sdk-common/src/main/java/com/android/ide/common/res2/DataSet.java
index d4b323a02d..63f704f751 100755
--- a/sdk-common/src/main/java/com/android/ide/common/res2/DataSet.java
+++ b/sdk-common/src/main/java/com/android/ide/common/res2/DataSet.java
@@ -266,6 +266,10 @@ abstract class DataSet<I extends DataItem<F>, F extends DataFile<I>> implements
Collection<F> dataFiles = mSourceFileToDataFilesMap.get(sourceFile);
for (F dataFile : dataFiles) {
+ if (!dataFile.hasNotRemovedItems()) {
+ continue;
+ }
+
// the node for the file and its path and qualifiers attribute
Node fileNode = document.createElement(NODE_FILE);
sourceNode.appendChild(fileNode);
@@ -275,7 +279,7 @@ abstract class DataSet<I extends DataItem<F>, F extends DataFile<I>> implements
if (dataFile.getType() == DataFile.FileType.MULTI) {
for (I item : dataFile.getItems()) {
- if (consumer.ignoreItemInMerge(item)) {
+ if (item.isRemoved()|| consumer.ignoreItemInMerge(item)) {
continue;
}
Node adoptedNode = item.getAdoptedNode(document);
@@ -284,6 +288,8 @@ abstract class DataSet<I extends DataItem<F>, F extends DataFile<I>> implements
}
}
} else {
+ // no need to check for isRemoved here since it's checked
+ // at the file level and there's only one item.
I dataItem = dataFile.getItem();
NodeUtils.addAttribute(document, fileNode, null, ATTR_NAME, dataItem.getName());
dataItem.addExtraAttributes(document, fileNode, null);
diff --git a/sdk-common/src/test/java/com/android/ide/common/res2/ResourceMergerTest.java b/sdk-common/src/test/java/com/android/ide/common/res2/ResourceMergerTest.java
index 3a7ff38028..eaff62e36f 100755
--- a/sdk-common/src/test/java/com/android/ide/common/res2/ResourceMergerTest.java
+++ b/sdk-common/src/test/java/com/android/ide/common/res2/ResourceMergerTest.java
@@ -812,6 +812,70 @@ public class ResourceMergerTest extends BaseTestCase {
assertEquals(FileValidity.FileStatus.IGNORED_FILE, fileValidity.status);
}
+ public void testIncDataForRemovedFile() throws Exception {
+ File root = TestUtils.getCanonicalRoot("resources", "removedFile");
+ File fakeBlobRoot = getMergedBlobFolder(root);
+
+ ResourceMerger resourceMerger = new ResourceMerger();
+ resourceMerger.loadFromBlob(fakeBlobRoot, true /*incrementalState*/);
+ checkSourceFolders(resourceMerger);
+
+ List<ResourceSet> sets = resourceMerger.getDataSets();
+ assertEquals(1, sets.size());
+
+ RecordingLogger logger = new RecordingLogger();
+
+ // ----------------
+ // Load the main set
+ ResourceSet mainSet = sets.get(0);
+ File resBase = new File(root, "res");
+ File resDrawable = new File(resBase, ResourceFolderType.DRAWABLE.getName());
+
+ // removed file
+ File resIconRemoved = new File(resDrawable, "removed.png");
+ mainSet.updateWith(resBase, resIconRemoved, FileStatus.REMOVED, logger);
+ checkLogger(logger);
+
+ // validate for duplicates
+ resourceMerger.validateDataSets();
+
+ // check the content.
+ ListMultimap<String, ResourceItem> mergedMap = resourceMerger.getDataMap();
+
+ // check layout/main is unchanged
+ List<ResourceItem> removedIcon = mergedMap.get("drawable/removed");
+ assertEquals(1, removedIcon.size());
+ assertTrue(removedIcon.get(0).isRemoved());
+ assertTrue(removedIcon.get(0).isWritten());
+ assertFalse(removedIcon.get(0).isTouched());
+
+ // write and check the result of writeResourceFolder
+ // copy the current resOut which serves as pre incremental update state.
+ File outFolder = getFolderCopy(new File(root, "out"));
+
+ // write the content of the resource merger.
+ MergedResourceWriter writer = new MergedResourceWriter(outFolder, null /*aaptRunner*/);
+ resourceMerger.mergeData(writer, false /*doCleanUp*/);
+
+ File outDrawableFolder = new File(outFolder, ResourceFolderType.DRAWABLE.getName());
+
+ // check the files are correct
+ assertFalse(new File(outDrawableFolder, "removed.png").isFile());
+ assertTrue(new File(outDrawableFolder, "icon.png").isFile());
+
+ // now write the blob
+ File outBlobFolder = Files.createTempDir();
+ resourceMerger.writeBlobTo(outBlobFolder, writer);
+
+ // check the removed icon is not present.
+ ResourceMerger resourceMerger2 = new ResourceMerger();
+ resourceMerger2.loadFromBlob(outBlobFolder, true /*incrementalState*/);
+
+ mergedMap = resourceMerger2.getDataMap();
+ removedIcon = mergedMap.get("drawable/removed");
+ assertTrue(removedIcon.isEmpty());
+ }
+
/**
* Creates a fake merge with given sets.
*
diff --git a/sdk-common/src/test/resources/testData/resources/removedFile/merger.xml b/sdk-common/src/test/resources/testData/resources/removedFile/merger.xml
new file mode 100644
index 0000000000..ce93563e00
--- /dev/null
+++ b/sdk-common/src/test/resources/testData/resources/removedFile/merger.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merger xmlns:ns1="urn:oasis:names:tc:xliff:document:1.2">
+ <dataSet config="main">
+ <source path="$TOP$$SEP$res">
+ <file name="icon" path="$TOP$$SEP$res$SEP$drawable$SEP$icon.png" qualifiers="" type="drawable"/>
+ <file name="removed" path="$TOP$$SEP$res$SEP$drawable$SEP$removed.png" qualifiers="" type="drawable"/>
+ </source>
+ </dataSet>
+</merger>
diff --git a/sdk-common/src/test/resources/testData/resources/removedFile/out/drawable/icon.png b/sdk-common/src/test/resources/testData/resources/removedFile/out/drawable/icon.png
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/sdk-common/src/test/resources/testData/resources/removedFile/out/drawable/icon.png
diff --git a/sdk-common/src/test/resources/testData/resources/removedFile/out/drawable/removed.png b/sdk-common/src/test/resources/testData/resources/removedFile/out/drawable/removed.png
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/sdk-common/src/test/resources/testData/resources/removedFile/out/drawable/removed.png
diff --git a/sdk-common/src/test/resources/testData/resources/removedFile/res/drawable/icon.png b/sdk-common/src/test/resources/testData/resources/removedFile/res/drawable/icon.png
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/sdk-common/src/test/resources/testData/resources/removedFile/res/drawable/icon.png