You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by ge...@apache.org on 2011/04/11 11:59:10 UTC

svn commit: r1090998 - in /karaf/trunk/features/obr/src: main/java/org/apache/karaf/features/obr/internal/ObrResolver.java main/resources/OSGI-INF/blueprint/features-obr.xml test/java/org/apache/karaf/features/obr/internal/ObrResolverTest.java

Author: gertv
Date: Mon Apr 11 09:59:10 2011
New Revision: 1090998

URL: http://svn.apache.org/viewvc?rev=1090998&view=rev
Log:
KARAF-564: Allow features OBR resolver to resolve optional imports as well

Modified:
    karaf/trunk/features/obr/src/main/java/org/apache/karaf/features/obr/internal/ObrResolver.java
    karaf/trunk/features/obr/src/main/resources/OSGI-INF/blueprint/features-obr.xml
    karaf/trunk/features/obr/src/test/java/org/apache/karaf/features/obr/internal/ObrResolverTest.java

Modified: karaf/trunk/features/obr/src/main/java/org/apache/karaf/features/obr/internal/ObrResolver.java
URL: http://svn.apache.org/viewvc/karaf/trunk/features/obr/src/main/java/org/apache/karaf/features/obr/internal/ObrResolver.java?rev=1090998&r1=1090997&r2=1090998&view=diff
==============================================================================
--- karaf/trunk/features/obr/src/main/java/org/apache/karaf/features/obr/internal/ObrResolver.java (original)
+++ karaf/trunk/features/obr/src/main/java/org/apache/karaf/features/obr/internal/ObrResolver.java Mon Apr 11 09:59:10 2011
@@ -40,6 +40,7 @@ import org.osgi.framework.InvalidSyntaxE
 public class ObrResolver implements Resolver {
 
     private RepositoryAdmin repositoryAdmin;
+    private boolean resolveOptionalImports;
 
     public RepositoryAdmin getRepositoryAdmin() {
         return repositoryAdmin;
@@ -49,6 +50,20 @@ public class ObrResolver implements Reso
         this.repositoryAdmin = repositoryAdmin;
     }
 
+    public boolean isResolveOptionalImports() {
+        return resolveOptionalImports;
+    }
+
+    /**
+     * When set to <code>true</code>, the OBR resolver will try to resolve optional imports as well.
+     * Defaults to <code>false</code>
+     *
+     * @param resolveOptionalImports
+     */
+    public void setResolveOptionalImports(boolean resolveOptionalImports) {
+        this.resolveOptionalImports = resolveOptionalImports;
+    }
+
     public List<BundleInfo> resolve(Feature feature) throws Exception {
         List<Requirement> reqs = new ArrayList<Requirement>();
         List<Resource> ress = new ArrayList<Resource>();
@@ -84,7 +99,7 @@ public class ObrResolver implements Reso
             resolver.add(req);
         }
 
-        if (!resolver.resolve(org.apache.felix.bundlerepository.Resolver.NO_OPTIONAL_RESOURCES)) {
+        if (!doResolve(resolver)) {
             StringWriter w = new StringWriter();
             PrintWriter out = new PrintWriter(w);
             Reason[] failedReqs = resolver.getUnsatisfiedRequirements();
@@ -105,6 +120,9 @@ public class ObrResolver implements Reso
         List<BundleInfo> bundles = new ArrayList<BundleInfo>();
         Collections.addAll(deploy, resolver.getAddedResources());
         Collections.addAll(deploy, resolver.getRequiredResources());
+        if (resolveOptionalImports) {
+            Collections.addAll(deploy, resolver.getOptionalResources());
+        }
         for (Resource res : deploy) {
             BundleInfo info = infos.get(res);
             if (info == null) {
@@ -126,6 +144,14 @@ public class ObrResolver implements Reso
         return bundles;
     }
 
+    private boolean doResolve(org.apache.felix.bundlerepository.Resolver resolver) {
+        if (resolveOptionalImports) {
+            return resolver.resolve();
+        } else {
+            return resolver.resolve(org.apache.felix.bundlerepository.Resolver.NO_OPTIONAL_RESOURCES);
+        }
+    }
+
     protected void printUnderline(PrintWriter out, int length) {
         for (int i = 0; i < length; i++) {
             out.print('-');
@@ -155,5 +181,4 @@ public class ObrResolver implements Reso
         }
         return repositoryAdmin.getHelper().requirement(name, filter);
     }
-
 }

Modified: karaf/trunk/features/obr/src/main/resources/OSGI-INF/blueprint/features-obr.xml
URL: http://svn.apache.org/viewvc/karaf/trunk/features/obr/src/main/resources/OSGI-INF/blueprint/features-obr.xml?rev=1090998&r1=1090997&r2=1090998&view=diff
==============================================================================
--- karaf/trunk/features/obr/src/main/resources/OSGI-INF/blueprint/features-obr.xml (original)
+++ karaf/trunk/features/obr/src/main/resources/OSGI-INF/blueprint/features-obr.xml Mon Apr 11 09:59:10 2011
@@ -17,10 +17,22 @@
     limitations under the License.
 
 -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
+           default-activation="lazy">
+
+    <ext:property-placeholder placeholder-prefix="$(" placeholder-suffix=")"/>
+
+    <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]" ignore-missing-locations="true">
+        <ext:default-properties>
+            <ext:property name="resolveOptionalImports" value="false"/>
+        </ext:default-properties>
+        <ext:location>file:$(karaf.base)/etc/org.apache.karaf.features.obr.cfg</ext:location>
+    </ext:property-placeholder>
 
     <bean id="obrResolver" class="org.apache.karaf.features.obr.internal.ObrResolver">
         <property name="repositoryAdmin" ref="repositoryAdmin" />
+        <property name="resolveOptionalImports" value="$[resolveOptionalImports]" />
     </bean>
 
     <reference id="repositoryAdmin" interface="org.apache.felix.bundlerepository.RepositoryAdmin" />

Modified: karaf/trunk/features/obr/src/test/java/org/apache/karaf/features/obr/internal/ObrResolverTest.java
URL: http://svn.apache.org/viewvc/karaf/trunk/features/obr/src/test/java/org/apache/karaf/features/obr/internal/ObrResolverTest.java?rev=1090998&r1=1090997&r2=1090998&view=diff
==============================================================================
--- karaf/trunk/features/obr/src/test/java/org/apache/karaf/features/obr/internal/ObrResolverTest.java (original)
+++ karaf/trunk/features/obr/src/test/java/org/apache/karaf/features/obr/internal/ObrResolverTest.java Mon Apr 11 09:59:10 2011
@@ -81,4 +81,53 @@ public class ObrResolverTest {
         verify(admin, resolver, resource);
     }
 
+    @Test
+    public void testResolverWithOptionalImports() throws Exception {
+        final String requirement = "bundle:(&(symbolicname=org.apache.camel.camel-blueprint)(version>=2.4.0)(version<2.4.1))";
+
+        final org.apache.karaf.features.internal.model.Feature f = new org.apache.karaf.features.internal.model.Feature("f1", "1.0");
+        f.setResolver("obr");
+        f.getBundle().add(new Bundle(requirement));
+        final RepositoryAdmin admin = createMock(RepositoryAdmin.class);
+        final Resolver resolver = createMock(Resolver.class);
+        final Resource resource = createMock(Resource.class);
+        final Resource optionalResource = createMock(Resource.class);
+        final ObrResolver obrResolver = new ObrResolver();
+        obrResolver.setRepositoryAdmin(admin);
+        obrResolver.setResolveOptionalImports(true);
+
+        final Capture<Requirement> captureReq = new Capture<Requirement>();
+
+        expect(admin.getHelper()).andReturn(new DataModelHelperImpl()).anyTimes();
+        expect(admin.getSystemRepository()).andReturn(createMock(org.apache.felix.bundlerepository.Repository.class));
+        expect(admin.getLocalRepository()).andReturn(createMock(org.apache.felix.bundlerepository.Repository.class));
+        expect(admin.listRepositories()).andReturn(new org.apache.felix.bundlerepository.Repository[0]);
+        expect(admin.resolver(EasyMock.<org.apache.felix.bundlerepository.Repository[]>anyObject())).andReturn(resolver);
+        resolver.add(EasyMock.capture(captureReq));
+        expect(resolver.resolve()).andReturn(true);
+        expect(resolver.getAddedResources()).andReturn(new Resource[] { });
+        expect(resolver.getRequiredResources()).andReturn(new Resource[] { resource });
+        expect(resolver.getOptionalResources()).andReturn(new Resource[] { optionalResource});
+        expect(resolver.getReason(resource)).andAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                return new Reason[] { new ReasonImpl( resource, captureReq.getValue()) };
+            }
+        });
+        expect(resolver.getReason(optionalResource)).andAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                return new Reason[] { new ReasonImpl( optionalResource, captureReq.getValue()) };
+            }
+        });
+        expect(resource.getURI()).andReturn("foo:bar");
+        expect(optionalResource.getURI()).andReturn("foo:optional:baz");
+        replay(admin, resolver, resource, optionalResource);
+
+        List<BundleInfo> bundles = obrResolver.resolve(f);
+        assertNotNull(bundles);
+        assertEquals(2, bundles.size());
+        assertEquals("foo:bar", bundles.get(0).getLocation());
+        assertEquals("foo:optional:baz", bundles.get(1).getLocation());
+        assertEquals(obrResolver.parseRequirement(requirement).toString(), captureReq.getValue().toString());
+        verify(admin, resolver, resource);
+    }
 }