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 2010/01/07 16:33:18 UTC
svn commit: r896903 - in /sling/trunk/bundles/commons/osgi/src:
main/java/org/apache/sling/commons/osgi/bundleversion/
test/java/org/apache/sling/commons/osgi/bundleversion/
Author: bdelacretaz
Date: Thu Jan 7 15:29:28 2010
New Revision: 896903
URL: http://svn.apache.org/viewvc?rev=896903&view=rev
Log:
SLING-1278 - make BundleVersionInfo abstract and Comparable
Added:
sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparisonTest.java
- copied, changed from r896880, sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparatorTest.java
Removed:
sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparator.java
sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparatorTest.java
Modified:
sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleBundleVersionInfo.java
sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionInfo.java
sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/FileBundleVersionInfo.java
sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/MockBundleVersionInfo.java
Modified: sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleBundleVersionInfo.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleBundleVersionInfo.java?rev=896903&r1=896902&r2=896903&view=diff
==============================================================================
--- sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleBundleVersionInfo.java (original)
+++ sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleBundleVersionInfo.java Thu Jan 7 15:29:28 2010
@@ -23,7 +23,7 @@
import org.osgi.framework.Version;
/** BundleVersionInfo based on a Bundle object */
-public class BundleBundleVersionInfo implements BundleVersionInfo<Bundle> {
+public class BundleBundleVersionInfo extends BundleVersionInfo<Bundle> {
private Bundle source;
private final long lastModified;
Modified: sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionInfo.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionInfo.java?rev=896903&r1=896902&r2=896903&view=diff
==============================================================================
--- sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionInfo.java (original)
+++ sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionInfo.java Thu Jan 7 15:29:28 2010
@@ -23,36 +23,98 @@
/** Provides bundle version information, which can be
* extracted from bundle files or Bundle objects.
*/
-public interface BundleVersionInfo<T> {
+public abstract class BundleVersionInfo<T> implements Comparable<BundleVersionInfo<?>> {
+
+ private static final int A_GREATER = 1;
+ private static final int B_GREATER = -1;
+ private static final int EQUAL = 0;
+
/** Marker used by Maven to identify snapshots */
- String SNAPSHOT_MARKER = "SNAPSHOT";
+ public static final String SNAPSHOT_MARKER = "SNAPSHOT";
/** Name of the BND attribute that provides the bundle's last modified timestamp */
- String BND_LAST_MODIFIED = "Bnd-LastModified";
+ public static final String BND_LAST_MODIFIED = "Bnd-LastModified";
/** Value for {@link #getBundleLastModified} if corresponding header
* is not present
*/
- long BND_LAST_MODIFIED_MISSING = -1L;
+ public static final long BND_LAST_MODIFIED_MISSING = -1L;
/** Return the source of information: underlying File or Bundle */
- T getSource();
+ public abstract T getSource();
/** True if the provided data is a valid bundle */
- boolean isBundle();
+ public abstract boolean isBundle();
/** Return the bundle symbolic name, null if not available */
- String getBundleSymbolicName();
+ public abstract String getBundleSymbolicName();
/** Return the bundle version, null if not available */
- Version getVersion();
+ public abstract Version getVersion();
/** True if the bundle version indicates a snapshot */
- boolean isSnapshot();
+ public abstract boolean isSnapshot();
/** Return the bundle last modification time, based on the BND_LAST_MODIFIED
* manifest header, if available. This is *not* the Bundle.getLastModified()
* value, which refers to actions in the OSGi framework.
* @return BND_LAST_MODIFIED_MISSING if header not supplied */
- long getBundleLastModified();
+ public abstract long getBundleLastModified();
+
+
+ /** Compare based on bundle version info, and for snapshots
+ * based on {@link #getBundleLastModified}
+ */
+ public int compareTo(BundleVersionInfo<?> other) {
+ // Handle null values
+ if(other == null) {
+ throw new IllegalArgumentException("b is null, cannot compare");
+ }
+
+ // Handle non-bundles: we don't want them!
+ if(!isBundle()) {
+ throw new IllegalArgumentException("Not a bundle, cannot compare: " + this);
+ }
+ if(!other.isBundle()) {
+ throw new IllegalArgumentException("Not a bundle, cannot compare:" + other);
+ }
+
+ // First compare symbolic names
+ int result = getBundleSymbolicName().compareTo(other.getBundleSymbolicName());
+
+ // Then compare versions
+ if(result == EQUAL) {
+ final Version va = getVersion();
+ final Version vb = other.getVersion();
+ if(va == null && vb == null) {
+ // result = EQUAL
+ } else if(vb == null) {
+ result = A_GREATER;
+ } else if(va == null) {
+ result = B_GREATER;
+ } else {
+ result = va.compareTo(vb);
+ }
+
+ // more recent ones must come before older ones
+ result = -result;
+ }
+
+ // Then, if snapshots, compare modification times, more recent comes first
+ if(result == EQUAL && isSnapshot()) {
+ final long ma = getBundleLastModified();
+ final long mb = other.getBundleLastModified();
+ if(ma > mb) {
+ result = A_GREATER;
+ } else if(mb > ma) {
+ result = B_GREATER;
+ }
+
+ // more recent ones must come before older ones
+ result = -result;
+ }
+
+ return result;
+ }
+
}
Modified: sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/FileBundleVersionInfo.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/FileBundleVersionInfo.java?rev=896903&r1=896902&r2=896903&view=diff
==============================================================================
--- sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/FileBundleVersionInfo.java (original)
+++ sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/FileBundleVersionInfo.java Thu Jan 7 15:29:28 2010
@@ -27,7 +27,7 @@
import org.osgi.framework.Version;
/** BundleVersionInfo based on a bundle jar file */
-public class FileBundleVersionInfo implements BundleVersionInfo<File> {
+public class FileBundleVersionInfo extends BundleVersionInfo<File> {
private final String symbolicName;
private final Version version;
Copied: sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparisonTest.java (from r896880, sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparatorTest.java)
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparisonTest.java?p2=sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparisonTest.java&p1=sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparatorTest.java&r1=896880&r2=896903&rev=896903&view=diff
==============================================================================
--- sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparatorTest.java (original)
+++ sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparisonTest.java Thu Jan 7 15:29:28 2010
@@ -28,7 +28,7 @@
import org.junit.Test;
-public class BundleVersionComparatorTest {
+public class BundleVersionComparisonTest {
@Test
public void testSortBundles() {
@@ -52,7 +52,7 @@
}
final String firstBeforeSort = list.get(0).toString();
- Collections.sort(list, new BundleVersionComparator());
+ Collections.sort(list);
final String newFirstItem = list.get(0).toString();
assertFalse("First item (" + newFirstItem + ") must have changed during sort", firstBeforeSort.equals(newFirstItem));
@@ -67,28 +67,14 @@
public void testEqual() {
final MockBundleVersionInfo a = new MockBundleVersionInfo("a", "1.0", 2);
final MockBundleVersionInfo b = new MockBundleVersionInfo("a", "1.0", 1);
- final BundleVersionComparator c = new BundleVersionComparator();
- assertEquals("Last-modified must not be relevant for non-snapshot bundles", 0, c.compare(a, b));
+ assertEquals("Last-modified must not be relevant for non-snapshot bundles", 0, a.compareTo(b));
}
public void testExceptionsOnNull() {
final MockBundleVersionInfo a = new MockBundleVersionInfo("a", "1.0", 2);
- final BundleVersionComparator c = new BundleVersionComparator();
try {
- c.compare(a, null);
- fail("Expected an IllegalArgumentException");
- } catch(IllegalArgumentException asExpected) {
- }
-
- try {
- c.compare(null, a);
- fail("Expected an IllegalArgumentException");
- } catch(IllegalArgumentException asExpected) {
- }
-
- try {
- c.compare(null, null);
+ a.compareTo(null);
fail("Expected an IllegalArgumentException");
} catch(IllegalArgumentException asExpected) {
}
@@ -97,16 +83,15 @@
public void testExceptionOnNonBundle() {
final MockBundleVersionInfo a = new MockBundleVersionInfo("a", "1.0", 2);
final MockBundleVersionInfo nonBundle = new MockBundleVersionInfo();
- final BundleVersionComparator c = new BundleVersionComparator();
try {
- c.compare(a, nonBundle);
+ a.compareTo(nonBundle);
fail("Expected an IllegalArgumentException");
} catch(IllegalArgumentException asExpected) {
}
try {
- c.compare(nonBundle, a);
+ nonBundle.compareTo(a);
fail("Expected an IllegalArgumentException");
} catch(IllegalArgumentException asExpected) {
}
Modified: sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/MockBundleVersionInfo.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/MockBundleVersionInfo.java?rev=896903&r1=896902&r2=896903&view=diff
==============================================================================
--- sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/MockBundleVersionInfo.java (original)
+++ sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/MockBundleVersionInfo.java Thu Jan 7 15:29:28 2010
@@ -20,7 +20,7 @@
import org.osgi.framework.Version;
-class MockBundleVersionInfo implements BundleVersionInfo<String> {
+class MockBundleVersionInfo extends BundleVersionInfo<String> {
private final String source;
private final String symbolicName;