You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@sling.apache.org by Felix Meschberger <fm...@gmail.com> on 2010/01/07 15:10:50 UTC

Re: 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/

Hi,

Cool.

How about making BundleVersionInfo abstract and Comparable ? Thus the
comparator would not be needed and use would probably be simpler and easier.

Regards
Felix

On 07.01.2010 14:52, bdelacretaz@apache.org wrote:
> 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
> 
> 
> 

Re: 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/

Posted by Bertrand Delacretaz <bd...@apache.org>.
On Thu, Jan 7, 2010 at 3:10 PM, Felix Meschberger <fm...@gmail.com> wrote:
> ...How about making BundleVersionInfo abstract and Comparable ? Thus the
> comparator would not be needed and use would probably be simpler and easier....

Good idea, I'll do that!
-Bertrand