You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by pi...@apache.org on 2011/02/21 16:25:32 UTC

svn commit: r1073017 - in /karaf/trunk/features/core/src: main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java test/java/org/apache/karaf/features/FeaturesServiceTest.java

Author: pieber
Date: Mon Feb 21 15:25:31 2011
New Revision: 1073017

URL: http://svn.apache.org/viewvc?rev=1073017&view=rev
Log:
[KARAF-473] FeatureService#getFeatures handles version ranges

Modified:
    karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
    karaf/trunk/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java

Modified: karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
URL: http://svn.apache.org/viewvc/karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java?rev=1073017&r1=1073016&r2=1073017&view=diff
==============================================================================
--- karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java (original)
+++ karaf/trunk/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java Mon Feb 21 15:25:31 2011
@@ -16,12 +16,37 @@
  */
 package org.apache.karaf.features.internal;
 
-import java.io.*;
+import static java.lang.String.format;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.EnumSet;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.jar.JarInputStream;
 import java.util.jar.Manifest;
@@ -800,13 +825,25 @@ public class FeaturesServiceImpl impleme
             return null;
         } else {
             Feature feature = versions.get(version);
-            if (feature == null && FeatureImpl.DEFAULT_VERSION.equals(version)) {
-                Version latest = new Version(cleanupVersion(version));
-                for (String available : versions.keySet()) {
-                    Version availableVersion = new Version(cleanupVersion(available));
-                    if (availableVersion.compareTo(latest) > 0) {
-                        feature = versions.get(available);
-                        latest = availableVersion;
+            if (feature == null) {
+                if (FeatureImpl.DEFAULT_VERSION.equals(version)) {
+                    Version latest = new Version(cleanupVersion(version));
+                    for (String available : versions.keySet()) {
+                        Version availableVersion = new Version(cleanupVersion(available));
+                        if (availableVersion.compareTo(latest) > 0) {
+                            feature = versions.get(available);
+                            latest = availableVersion;
+                        }
+                    }
+                } else {
+                    Version latest = new Version(cleanupVersion(FeatureImpl.DEFAULT_VERSION));
+                    VersionRange versionRange = new VersionRange(version, true, true);
+                    for (String available : versions.keySet()) {
+                        Version availableVersion = new Version(cleanupVersion(available));
+                        if (availableVersion.compareTo(latest) > 0 && versionRange.contains(availableVersion)) {
+                            feature = versions.get(available);
+                            latest = availableVersion;
+                        }
                     }
                 }
             }

Modified: karaf/trunk/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
URL: http://svn.apache.org/viewvc/karaf/trunk/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java?rev=1073017&r1=1073016&r2=1073017&view=diff
==============================================================================
--- karaf/trunk/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java (original)
+++ karaf/trunk/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java Mon Feb 21 15:25:31 2011
@@ -16,6 +16,14 @@
  */
 package org.apache.karaf.features;
 
+import static org.easymock.EasyMock.aryEq;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
@@ -35,6 +43,7 @@ import java.util.concurrent.CopyOnWriteA
 import java.util.jar.JarInputStream;
 
 import junit.framework.TestCase;
+
 import org.apache.karaf.features.internal.FeatureImpl;
 import org.apache.karaf.features.internal.FeaturesServiceImpl;
 import org.easymock.EasyMock;
@@ -573,6 +582,46 @@ public class FeaturesServiceTest extends
         svc.uninstallFeature("f2", "0.1");
     }
 
+    public void testGetFeaturesShouldHandleDifferentVersionPatterns() throws Exception {
+
+        String name = getJarUrl(Bundle.class);
+
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features xmlns=\"http://karaf.apache.org/xmlns/features/v1.0.0\">");
+        pw.println("  <feature name=\"f1\" version=\"0.1\">");
+        pw.println("    <feature version=\"[0.1,0.3)\">f2</feature>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f2\" version=\"0.1\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f2\" version=\"0.2\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.addRepository(uri);
+
+        Feature feature = svc.getFeature("f2", "[0.1,0.3)");
+        assertEquals("f2", feature.getName());
+        assertEquals("0.2", feature.getVersion());
+
+        Feature feature2 = svc.getFeature("f2", "0.0.0");
+        assertEquals("f2", feature2.getName());
+        assertEquals("0.2", feature2.getVersion());
+
+        Feature feature3 = svc.getFeature("f2", "0.2");
+        assertEquals("f2", feature3.getName());
+        assertEquals("0.2", feature3.getVersion());
+
+        Feature feature4 = svc.getFeature("f2", "0.3");
+        assertNull(feature4);
+    }
+
     private BundleContext prepareBundleContextForInstallUninstall() throws Exception {
         BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
         Bundle installedBundle = EasyMock.createMock(Bundle.class);