incubator-sling-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bdelacre...@apache.org
Subject svn commit: r896880 - in /sling/trunk/bundles/commons/osgi: ./ src/main/java/org/apache/sling/commons/osgi/bundleversion/ src/test/java/org/apache/sling/commons/osgi/bundleversion/
Date Thu, 07 Jan 2010 13:52:59 GMT
Author: bdelacretaz
Date: Thu Jan  7 13:51:44 2010
New Revision: 896880

URL: http://svn.apache.org/viewvc?rev=896880&view=rev
Log:
SLING-1278 - Utilities for bundle version extraction and comparison

Added:
    sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/
    sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleBundleVersionInfo.java
  (with props)
    sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparator.java
  (with props)
    sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionInfo.java
  (with props)
    sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/FileBundleVersionInfo.java
  (with props)
    sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/
    sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleBundleVersionInfoTest.java
  (with props)
    sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparatorTest.java
  (with props)
    sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/FileBundleVersionInfoTest.java
  (with props)
    sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/MockBundleVersionInfo.java
  (with props)
Modified:
    sling/trunk/bundles/commons/osgi/pom.xml

Modified: sling/trunk/bundles/commons/osgi/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/osgi/pom.xml?rev=896880&r1=896879&r2=896880&view=diff
==============================================================================
--- sling/trunk/bundles/commons/osgi/pom.xml (original)
+++ sling/trunk/bundles/commons/osgi/pom.xml Thu Jan  7 13:51:44 2010
@@ -39,6 +39,10 @@
         <developerConnection>scm:svn:https://svn.apache.org/repos/asf/sling/trunk/bundles/commons/osgi</developerConnection>
         <url>http://svn.apache.org/viewvc/sling/trunk/bundles/commons/osgi</url>
     </scm>
+    
+    <properties>
+        <test.jars.folder>${project.build.directory}/testjars</test.jars.folder>
+    </properties>
 
     <build>
         <plugins>
@@ -54,6 +58,37 @@
                     </instructions>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-test-bundles</id>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <includeArtifactIds>org.apache.sling.api,jcr</includeArtifactIds>
+                            <excludeTransitive>true</excludeTransitive>
+                            <outputDirectory>${test.jars.folder}</outputDirectory>
+                            <overWriteReleases>true</overWriteReleases>
+                            <overWriteSnapshots>true</overWriteSnapshots>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <systemProperties>
+                        <property>
+                            <name>test.jars.folder</name>
+                            <value>${test.jars.folder}</value>
+                        </property>
+                    </systemProperties>
+                </configuration>
+            </plugin>                        
         </plugins>
     </build>
 
@@ -72,6 +107,24 @@
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.jmock</groupId>
+            <artifactId>jmock-junit4</artifactId>
+        </dependency>
+		<dependency>
+			<!-- Not used by our code, but need a non-bundle jar for unit tests -->
+			<groupId>javax.jcr</groupId>
+			<artifactId>jcr</artifactId>
+			<version>1.0</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<!-- Not used by our code, but need a bundle jar for unit tests -->
+			<groupId>org.apache.sling</groupId>
+			<artifactId>org.apache.sling.api</artifactId>
+			<version>2.0.6</version>
+			<scope>test</scope>
+		</dependency>
     </dependencies>
 
 </project>

Added: 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=896880&view=auto
==============================================================================
--- sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleBundleVersionInfo.java
(added)
+++ sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleBundleVersionInfo.java
Thu Jan  7 13:51:44 2010
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.commons.osgi.bundleversion;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+
+/** BundleVersionInfo based on a Bundle object */
+public class BundleBundleVersionInfo implements BundleVersionInfo<Bundle> {
+
+    private Bundle source;
+    private final long lastModified;
+    
+    public BundleBundleVersionInfo(Bundle b) {
+        source = b;
+        
+        long lastMod = BND_LAST_MODIFIED_MISSING;
+        final String mod = (String)source.getHeaders().get(BND_LAST_MODIFIED);
+        if(mod != null) {
+            try {
+                lastMod = Long.parseLong(mod);
+            } catch(NumberFormatException ignore) {
+            }
+        }
+        lastModified = lastMod;
+    }
+    
+    public long getBundleLastModified() {
+        return lastModified;
+    }
+
+    public String getBundleSymbolicName() {
+        return source.getSymbolicName();
+    }
+
+    public Bundle getSource() {
+        return source;
+    }
+
+    public Version getVersion() {
+        return (Version)source.getHeaders().get(Constants.BUNDLE_VERSION);
+    }
+
+    public boolean isBundle() {
+        return true;
+    }
+
+    public boolean isSnapshot() {
+        return getVersion().toString().contains(SNAPSHOT_MARKER);
+    }
+}

Propchange: sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleBundleVersionInfo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleBundleVersionInfo.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparator.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparator.java?rev=896880&view=auto
==============================================================================
--- sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparator.java
(added)
+++ sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparator.java
Thu Jan  7 13:51:44 2010
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.commons.osgi.bundleversion;
+
+import java.util.Comparator;
+
+import org.osgi.framework.Version;
+
+/** Compares BundleVersionInfo */
+public class BundleVersionComparator implements Comparator<BundleVersionInfo<?>>{
+
+    private static final int A_GREATER = 1; 
+    private static final int B_GREATER = -1;
+    private static final int EQUAL = 0;
+    
+    public int compare(BundleVersionInfo<?> a, BundleVersionInfo<?> b) {
+        
+        // Handle null values
+        if(a == null) {
+            throw new IllegalArgumentException("a is null, cannot compare");
+        }
+        if(b == null) {
+            throw new IllegalArgumentException("b is null, cannot compare");
+        }
+        
+        // Handle non-bundles: we don't want them!
+        if(!a.isBundle()) {
+            throw new IllegalArgumentException("Not a bundle, cannot compare:" + a);
+        }
+        if(!b.isBundle()) {
+            throw new IllegalArgumentException("Not a bundle, cannot compare:" + b);
+        }
+        
+        // First compare symbolic names
+        int result = a.getBundleSymbolicName().compareTo(b.getBundleSymbolicName());
+        
+        // Then compare versions
+        if(result == EQUAL) {
+            final Version va = a.getVersion();
+            final Version vb = b.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 && a.isSnapshot()) {
+            final long ma = a.getBundleLastModified();
+            final long mb = b.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;
+    }
+}

Propchange: sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparator.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: 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=896880&view=auto
==============================================================================
--- sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionInfo.java
(added)
+++ sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionInfo.java
Thu Jan  7 13:51:44 2010
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.commons.osgi.bundleversion;
+
+import org.osgi.framework.Version;
+
+/** Provides bundle version information, which can be
+ *  extracted from bundle files or Bundle objects.
+ */
+public interface BundleVersionInfo<T> {
+    /** Marker used by Maven to identify snapshots */
+    String SNAPSHOT_MARKER = "SNAPSHOT";
+    
+    /** Name of the BND attribute that provides the bundle's last modified timestamp */
+    String BND_LAST_MODIFIED = "Bnd-LastModified";
+    
+    /** Value for {@link #getBundleLastModified} if corresponding header
+     *  is not present
+     */
+    long BND_LAST_MODIFIED_MISSING = -1L;
+    
+    /** Return the source of information: underlying File or Bundle */
+    T getSource();
+    
+    /** True if the provided data is a valid bundle */
+    boolean isBundle();
+    
+    /** Return the bundle symbolic name, null if not available */
+    String getBundleSymbolicName();
+    
+    /** Return the bundle version, null if not available */
+    Version getVersion();
+    
+    /** True if the bundle version indicates a snapshot */
+    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();
+}

Propchange: sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionInfo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionInfo.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: 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=896880&view=auto
==============================================================================
--- sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/FileBundleVersionInfo.java
(added)
+++ sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/FileBundleVersionInfo.java
Thu Jan  7 13:51:44 2010
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.commons.osgi.bundleversion;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+
+/** BundleVersionInfo based on a bundle jar file */
+public class FileBundleVersionInfo implements BundleVersionInfo<File> {
+
+    private final String symbolicName;
+    private final Version version;
+    private final boolean isSnapshot;
+    private final long lastModified;
+    private final File source;
+    
+    public FileBundleVersionInfo(File bundle) throws IOException {
+        source = bundle;
+        final Manifest m = new JarFile(bundle).getManifest();
+        if(m == null) {
+            symbolicName = null;
+            version = null;
+            isSnapshot = false;
+            lastModified = BND_LAST_MODIFIED_MISSING;
+        } else {
+            symbolicName = m.getMainAttributes().getValue(Constants.BUNDLE_SYMBOLICNAME);
+            final String v = m.getMainAttributes().getValue(Constants.BUNDLE_VERSION);
+            version = v == null ? null : new Version(v);
+            isSnapshot = v != null && v.contains(SNAPSHOT_MARKER);
+            final String last = m.getMainAttributes().getValue(BND_LAST_MODIFIED);
+            long lastMod = BND_LAST_MODIFIED_MISSING;
+            if(last != null) {
+                try {
+                    lastMod = Long.parseLong(last);
+                } catch(NumberFormatException ignore) {
+                }
+            }
+            lastModified = lastMod;
+        }
+    }
+    
+    @Override
+    public String toString() {
+        return getClass().getSimpleName() + " " + source.getAbsolutePath();
+    }
+    
+    public boolean isBundle() {
+        return symbolicName != null;
+    }
+    
+    public long getBundleLastModified() {
+        return lastModified;
+    }
+
+    public String getBundleSymbolicName() {
+        return symbolicName;
+    }
+
+    public File getSource() {
+        return source;
+    }
+
+    public Version getVersion() {
+        return version;
+    }
+
+    public boolean isSnapshot() {
+        return isSnapshot;
+    }
+}

Propchange: sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/FileBundleVersionInfo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/bundles/commons/osgi/src/main/java/org/apache/sling/commons/osgi/bundleversion/FileBundleVersionInfo.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleBundleVersionInfoTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleBundleVersionInfoTest.java?rev=896880&view=auto
==============================================================================
--- sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleBundleVersionInfoTest.java
(added)
+++ sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleBundleVersionInfoTest.java
Thu Jan  7 13:51:44 2010
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.commons.osgi.bundleversion;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.jmock.Expectations;
+import org.jmock.Mockery;
+import org.jmock.integration.junit4.JUnit4Mockery;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+
+/** Test the BundleBundleVersionInfo class - not extremely
+ *  valid is we're testing with mock Bundles, but should
+ *  at least catch regressions.
+ */
+public class BundleBundleVersionInfoTest {
+    protected Mockery context;
+    
+    @Before
+    public void setUp() {
+        context = new JUnit4Mockery();
+    }
+
+    private Bundle getMockBundle(final String symbolicName, final Version v, final long lastModified)
{
+        final Dictionary<String, Object> h = new Hashtable<String, Object>();
+        h.put(Constants.BUNDLE_VERSION, v);
+        if(lastModified > 0) {
+            h.put(BundleVersionInfo.BND_LAST_MODIFIED, String.valueOf(lastModified));
+        }
+        
+        final Bundle b = context.mock(Bundle.class);
+        context.checking(new Expectations() {{
+            allowing(b).getHeaders();
+            will(returnValue(h));
+            allowing(b).getSymbolicName();
+            will(returnValue(symbolicName));
+            allowing(b).getLastModified();
+            will(returnValue(lastModified));
+        }});
+        return b;
+    }
+    
+    @Test
+    public void testVersionInfo() {
+        final String name = "some.bundle";
+        final Version version = new Version("1.0.4");
+        final long lastMod = 1234L;
+        final Bundle b = getMockBundle(name, version, lastMod); 
+        
+        BundleVersionInfo<?> vi = new BundleBundleVersionInfo(b);
+        assertEquals("Symbolic name matches", name, vi.getBundleSymbolicName());
+        assertEquals("Version matches", version, vi.getVersion());
+        assertTrue("isBundle", vi.isBundle());
+        assertFalse("Not a snapshot", vi.isSnapshot());
+        assertEquals("Last-Modified matches", lastMod, vi.getBundleLastModified());
+        assertTrue("Bundle is stored as source", vi.getSource() == b);
+    }
+    
+    @Test
+    public void testSnapshot() {
+        final String name = "some.bundle";
+        final Version version = new Version("1.0.4.SNAPSHOT");
+        final long lastMod = 0;
+        final Bundle b = getMockBundle(name, version, lastMod); 
+        
+        BundleVersionInfo<?> vi = new BundleBundleVersionInfo(b);
+        assertEquals("Symbolic name matches", name, vi.getBundleSymbolicName());
+        assertEquals("Version matches", version, vi.getVersion());
+        assertTrue("isBundle", vi.isBundle());
+        assertTrue("Bundle is a snapshot", vi.isSnapshot());
+        assertEquals("Last-Modified matches", BundleVersionInfo.BND_LAST_MODIFIED_MISSING,
vi.getBundleLastModified());
+        assertTrue("Bundle is stored as source", vi.getSource() == b);
+   }
+}
\ No newline at end of file

Propchange: sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleBundleVersionInfoTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleBundleVersionInfoTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: 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/BundleVersionComparatorTest.java?rev=896880&view=auto
==============================================================================
--- sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparatorTest.java
(added)
+++ sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparatorTest.java
Thu Jan  7 13:51:44 2010
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.commons.osgi.bundleversion;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.fail;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.Test;
+
+public class BundleVersionComparatorTest {
+    
+    @Test
+    public void testSortBundles() {
+        final MockBundleVersionInfo [] sorted = {
+                new MockBundleVersionInfo("a.name", "1.1", 1),
+                new MockBundleVersionInfo("a.name", "1.0", 1),
+                new MockBundleVersionInfo("b", "1.2.0.SNAPSHOT", 2),
+                new MockBundleVersionInfo("b", "1.2.0.SNAPSHOT", 1),
+                new MockBundleVersionInfo("b", "1.1", 1),
+                new MockBundleVersionInfo("b", "1.0.1.SNAPSHOT", 2),
+                new MockBundleVersionInfo("b", "1.0.1.SNAPSHOT", 1),
+                new MockBundleVersionInfo("b", "1.0", 1),
+                new MockBundleVersionInfo("b", "0.9", 1),
+                new MockBundleVersionInfo("b", "0.8.1", 1),
+                new MockBundleVersionInfo("b", "0.8.0", 1)
+        };
+        
+        final List<BundleVersionInfo<?>> list = new ArrayList<BundleVersionInfo<?>>();
+        for(int i = sorted.length - 1 ; i >= 0; i--) {
+            list.add(sorted[i]);
+        }
+        
+        final String firstBeforeSort = list.get(0).toString();
+        Collections.sort(list, new BundleVersionComparator());
+        final String newFirstItem = list.get(0).toString();
+        assertFalse("First item (" + newFirstItem + ") must have changed during sort", firstBeforeSort.equals(newFirstItem));
+        
+        int i = 0;
+        for(BundleVersionInfo<?> vi : list) {
+            assertEquals("Item sorted as expected at index " + i, sorted[i].toString(), vi.toString());
+            i++;
+        }
+    }
+    
+    @Test
+    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));
+    }
+    
+    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);
+            fail("Expected an IllegalArgumentException");
+        } catch(IllegalArgumentException asExpected) {
+        }
+    }
+    
+    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);
+            fail("Expected an IllegalArgumentException");
+        } catch(IllegalArgumentException asExpected) {
+        }
+        
+        try {
+            c.compare(nonBundle, a);
+            fail("Expected an IllegalArgumentException");
+        } catch(IllegalArgumentException asExpected) {
+        }
+    }
+}

Propchange: sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparatorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/BundleVersionComparatorTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/FileBundleVersionInfoTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/FileBundleVersionInfoTest.java?rev=896880&view=auto
==============================================================================
--- sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/FileBundleVersionInfoTest.java
(added)
+++ sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/FileBundleVersionInfoTest.java
Thu Jan  7 13:51:44 2010
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.commons.osgi.bundleversion;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+public class FileBundleVersionInfoTest {
+    
+    private File getTestJar(String namePrefix) {
+        final File testJarsFolder = new File(System.getProperty("test.jars.folder"));
+        for(String jar : testJarsFolder.list()) {
+            if(jar.startsWith(namePrefix)) {
+                return new File(testJarsFolder, jar);
+            }
+        }
+        fail("No test jar found with prefix " + namePrefix + " in " + testJarsFolder.getAbsolutePath());
+        return null;
+    }
+    
+    @Test
+    public void testSlingApiJar() throws IOException {
+        final File testJar = getTestJar("org.apache.sling.api");
+        final BundleVersionInfo<?> vi = new FileBundleVersionInfo(testJar);
+        assertEquals("org.apache.sling.api", vi.getBundleSymbolicName());
+        assertEquals(vi.getVersion(), new Version("2.0.6"));
+        assertFalse(vi.isSnapshot());
+        assertEquals(1250080966786L, vi.getBundleLastModified());
+        assertTrue(vi.isBundle());
+        final Object src = vi.getSource();
+        assertTrue(src instanceof File);
+        assertEquals(testJar.getAbsolutePath(), ((File)src).getAbsolutePath());
+    }
+    
+    @Test
+    public void testSlf4jJar() throws IOException {
+        final File testJar = getTestJar("jcr");
+        final BundleVersionInfo<?> vi = new FileBundleVersionInfo(testJar);
+        assertFalse(vi.isBundle());
+        assertNull(vi.getBundleSymbolicName());
+        assertNull(vi.getVersion());
+        assertEquals(BundleVersionInfo.BND_LAST_MODIFIED_MISSING, vi.getBundleLastModified());
+        final Object src = vi.getSource();
+        assertTrue(src instanceof File);
+        assertEquals(testJar.getAbsolutePath(), ((File)src).getAbsolutePath());
+    }
+}

Propchange: sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/FileBundleVersionInfoTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/FileBundleVersionInfoTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: 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=896880&view=auto
==============================================================================
--- sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/MockBundleVersionInfo.java
(added)
+++ sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/MockBundleVersionInfo.java
Thu Jan  7 13:51:44 2010
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.commons.osgi.bundleversion;
+
+import org.osgi.framework.Version;
+
+class MockBundleVersionInfo implements BundleVersionInfo<String> {
+
+    private final String source;
+    private final String symbolicName;
+    private final Version version;
+    private final long lastModified;
+    
+    MockBundleVersionInfo() {
+        source = null;
+        symbolicName = null;
+        version = null;
+        lastModified = BundleVersionInfo.BND_LAST_MODIFIED_MISSING;
+    }
+    
+    MockBundleVersionInfo(String symbolicName, String version, long lastModified) {
+        this.symbolicName = symbolicName;
+        this.version = new Version(version);
+        this.source = symbolicName + "." + version + "." + lastModified;
+        this.lastModified = lastModified;
+    }
+    
+    @Override
+    public String toString() {
+        return source;
+    }
+    
+    public long getBundleLastModified() {
+        return lastModified;
+    }
+
+    public String getBundleSymbolicName() {
+        return symbolicName;
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public Version getVersion() {
+        return version;
+    }
+
+    public boolean isBundle() {
+        return symbolicName != null;
+    }
+
+    public boolean isSnapshot() {
+        return version.toString().contains(SNAPSHOT_MARKER);
+    }
+}

Propchange: sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/MockBundleVersionInfo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/bundles/commons/osgi/src/test/java/org/apache/sling/commons/osgi/bundleversion/MockBundleVersionInfo.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL



Mime
View raw message