You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2009/08/31 14:40:58 UTC
svn commit: r809559 - in /sling/trunk/installer:
jcr/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/impl/
osgi/installer/src/main/java/org/apache/sling/osgi/installer/
osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/ osgi/in...
Author: bdelacretaz
Date: Mon Aug 31 12:40:57 2009
New Revision: 809559
URL: http://svn.apache.org/viewvc?rev=809559&view=rev
Log:
SLING-1078 - resource digest ignored in RegisteredResource comparisons
Modified:
sling/trunk/installer/jcr/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/impl/WatchedFolder.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/InstallableResource.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResourceComparator.java
sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/DictionaryDigestTest.java
sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/RegisteredResourceComparatorTest.java
Modified: sling/trunk/installer/jcr/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/impl/WatchedFolder.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/jcr/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/impl/WatchedFolder.java?rev=809559&r1=809558&r2=809559&view=diff
==============================================================================
--- sling/trunk/installer/jcr/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/impl/WatchedFolder.java (original)
+++ sling/trunk/installer/jcr/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/impl/WatchedFolder.java Mon Aug 31 12:40:57 2009
@@ -143,7 +143,9 @@
if(r != null) {
resourcesSeen.add(r.getUrl());
final String oldDigest = digests.get(r.getUrl());
- if(!r.getDigest().equals(oldDigest)) {
+ if(r.getDigest().equals(oldDigest)) {
+ log.debug("Digest didn't change, ignoring " + r);
+ } else {
r.setPriority(priority);
result.toAdd.add(r);
}
Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/InstallableResource.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/InstallableResource.java?rev=809559&r1=809558&r2=809559&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/InstallableResource.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/InstallableResource.java Mon Aug 31 12:40:57 2009
@@ -26,6 +26,9 @@
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.SortedSet;
+import java.util.TreeSet;
/** A piece of data that can be installed by the OSGi controller.
* Wraps either a Dictionary or an InputStream.
@@ -159,13 +162,21 @@
return new String(bigInt.toString(16));
}
- /** Digest is needed to detect changes in data
- * @throws */
+ /** Digest is needed to detect changes in data, and must not depend on dictionary ordering */
public static String computeDigest(Dictionary<String, Object> data) throws IOException, NoSuchAlgorithmException {
final MessageDigest d = MessageDigest.getInstance(DIGEST_TYPE);
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
final ObjectOutputStream oos = new ObjectOutputStream(bos);
- oos.writeObject(data);
+
+ final SortedSet<String> sortedKeys = new TreeSet<String>();
+ for(Enumeration<String> e = data.keys(); e.hasMoreElements(); ) {
+ sortedKeys.add(e.nextElement());
+ }
+ for(String key : sortedKeys) {
+ oos.writeObject(key);
+ oos.writeObject(data.get(key));
+ }
+
bos.flush();
d.update(bos.toByteArray());
return digestToString(d);
Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResourceComparator.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResourceComparator.java?rev=809559&r1=809558&r2=809559&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResourceComparator.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/RegisteredResourceComparator.java Mon Aug 31 12:40:57 2009
@@ -66,18 +66,13 @@
}
}
- if(result == 0) {
- if(isSnapshot) {
- // For snapshots, compare serial numbers so that snapshots registered
- // later get priority
- if(a.getSerialNumber() < b.getSerialNumber()) {
- result = 1;
- } else if(a.getSerialNumber() > b.getSerialNumber()) {
- result = -1;
- }
- } else {
- // Non-snapshot: compare digests
- result = a.getDigest().compareTo(b.getDigest());
+ if(result == 0 && isSnapshot) {
+ // For snapshots, compare serial numbers so that snapshots registered
+ // later get priority
+ if(a.getSerialNumber() < b.getSerialNumber()) {
+ result = 1;
+ } else if(a.getSerialNumber() > b.getSerialNumber()) {
+ result = -1;
}
}
@@ -103,13 +98,6 @@
}
}
- // Then by digest
- if(result == 0) {
- if(a.getDigest() != null) {
- result = a.getDigest().compareTo(b.getDigest());
- }
- }
-
return result;
}
}
Modified: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/DictionaryDigestTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/DictionaryDigestTest.java?rev=809559&r1=809558&r2=809559&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/DictionaryDigestTest.java (original)
+++ sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/DictionaryDigestTest.java Mon Aug 31 12:40:57 2009
@@ -89,4 +89,21 @@
d.put("another", new String [] { "a", "b", "D"});
digest = testDigestChanged(d, digest, step, true);
}
-}
+
+ @org.junit.Test public void testDictionaryOrderDoesNotMatter() throws Exception {
+ final Dictionary<String, Object> a = new Hashtable<String, Object>();
+ a.put("one", "A");
+ a.put("two", "B");
+ a.put("three", "C");
+
+ final Dictionary<String, Object> b = new Hashtable<String, Object>();
+ b.put("two", "B");
+ b.put("one", "A");
+ b.put("three", "C");
+
+ assertEquals("Same data in different order must have same digest",
+ InstallableResource.computeDigest(a),
+ InstallableResource.computeDigest(b)
+ );
+ }
+}
\ No newline at end of file
Modified: sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/RegisteredResourceComparatorTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/RegisteredResourceComparatorTest.java?rev=809559&r1=809558&r2=809559&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/RegisteredResourceComparatorTest.java (original)
+++ sling/trunk/installer/osgi/installer/src/test/java/org/apache/sling/osgi/installer/impl/RegisteredResourceComparatorTest.java Mon Aug 31 12:40:57 2009
@@ -114,13 +114,11 @@
}
@Test
- public void testDigest() {
- final RegisteredResource [] inOrder = {
- new MockBundleResource("a", "1.2.0", 0, "digestA"),
- new MockBundleResource("a", "1.2.0", 0, "digestB"),
- new MockBundleResource("a", "1.2.0", 0, "digestC"),
- };
- assertOrder(inOrder);
+ public void testBundleDigests() {
+ final RegisteredResource a = new MockBundleResource("a", "1.2.0", 0, "digestA");
+ final RegisteredResource b = new MockBundleResource("a", "1.2.0", 0, "digestB");
+ final RegisteredResourceComparator c = new RegisteredResourceComparator();
+ assertEquals("Digests must not be included in bundles comparison", 0, c.compare(a, b));
}
@Test
@@ -143,15 +141,16 @@
}
@Test
- public void testConfigDigest() throws IOException {
- final Dictionary<String, Object> data = new Hashtable<String, Object>();
- final RegisteredResource [] inOrder = new RegisteredResource [2];
- data.put("three", "bar");
- inOrder[0] = getConfig("pid", data, 0);
- data.put("two", "bar");
- inOrder[1] = getConfig("pid", data, 0);
- assertOrder(inOrder);
-
+ /** Digests must not be included in comparisons: a and b might represent the same
+ * config even if their digests are different */
+ public void testConfigDigests() throws IOException {
+ final Dictionary<String, Object> data = new Hashtable<String, Object>();
+ data.put("foo", "bar");
+ final RegisteredResource a = getConfig("pid", data, 0);
+ data.put("foo", "changed");
+ final RegisteredResource b = getConfig("pid", data, 0);
+ final RegisteredResourceComparator c = new RegisteredResourceComparator();
+ assertEquals("Digests must not be included in configs comparison", 0, c.compare(a, b));
}
@Test