You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by li...@apache.org on 2010/04/14 21:22:53 UTC

svn commit: r934137 - in /incubator/aries/trunk/subsystem: subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResourceResolverImpl.java subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemAdminTest.java

Author: linsun
Date: Wed Apr 14 19:22:52 2010
New Revision: 934137

URL: http://svn.apache.org/viewvc?rev=934137&view=rev
Log:
ARIES-283 - implement the ResourceResolver.resolve method

Modified:
    incubator/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResourceResolverImpl.java
    incubator/aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemAdminTest.java

Modified: incubator/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResourceResolverImpl.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResourceResolverImpl.java?rev=934137&r1=934136&r2=934137&view=diff
==============================================================================
--- incubator/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResourceResolverImpl.java (original)
+++ incubator/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResourceResolverImpl.java Wed Apr 14 19:22:52 2010
@@ -16,6 +16,9 @@ package org.apache.aries.subsystem.core.
 
 import java.io.File;
 import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -41,6 +44,8 @@ import org.osgi.framework.ServiceReferen
 import org.osgi.framework.Version;
 import org.osgi.service.obr.Repository;
 import org.osgi.service.obr.RepositoryAdmin;
+import org.osgi.service.obr.Requirement;
+import org.osgi.service.obr.Resolver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
@@ -182,14 +187,89 @@ public class ResourceResolverImpl implem
 
         return new ResourceImpl(symbolicName, res.getVersion(), type == null ? SubsystemConstants.RESOURCE_TYPE_BUNDLE : (String)type, res.getURL().toExternalForm() , props);
     }
+    
+    /**
+     * the format of resource is like bundlesymbolicname;version=1.0.0, for example com.ibm.ws.eba.example.blog.api;version=1.0.0,
+     */
+    private org.osgi.service.obr.Resource findOBRResource(Resource resource) throws SubsystemException {
+        String symbolicName = resource.getSymbolicName();
+        // this version could possibly be a range
+        Version version = resource.getVersion();
 
+        //org.osgi.service.obr.Resource[] res = this.repositoryAdmin.discoverResources(filterString.toString());
+        Repository[] repos = this.repositoryAdmin.listRepositories();
+        org.osgi.service.obr.Resource res = null;
+        for (Repository repo : repos) {
+            org.osgi.service.obr.Resource[] resources = repo.getResources();
+            for (int i = 0; i < resources.length; i++) {
+                if (resources[i].getSymbolicName().equals(symbolicName)) {
+                    if (resources[i].getVersion().compareTo(version) == 0) {
+                        res = resources[i];
+                    }
+                }
+            }
+        }
+        return res;
+    }
+
+    /**
+     * convert to the resource from the obr resource
+     */
+    private Resource toResource(org.osgi.service.obr.Resource resource) throws SubsystemException {
+        if (resource == null) {
+            throw new SubsystemException("unable to find the resource " + resource);
+        }
+        
+        Map props = resource.getProperties();
+        
+
+        Object type = props.get(SubsystemConstants.RESOURCE_TYPE_ATTRIBUTE);
+
+        return new ResourceImpl(resource.getSymbolicName(), resource.getVersion(), type == null ? SubsystemConstants.RESOURCE_TYPE_BUNDLE : (String)type, resource.getURL().toExternalForm() , props);
+    }
+    
     public List<Resource> resolve(List<Resource> subsystemContent,
             List<Resource> subsystemResources) throws SubsystemException {
         generateOBR();
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("Attempt to resolve subsystem content {} subsystem resource {}", subsystemContent.toString(), subsystemResources.toString());
+        }
+        Resolver obrResolver = this.repositoryAdmin.resolver();
         
+        // add subsystem content to the resolver
+        for (Resource res : subsystemContent) {
+            org.osgi.service.obr.Resource obrRes = findOBRResource(res);
+            obrResolver.add(obrRes);
+        }
+        
+        // add subsystem resource to the resolver
+        for (Resource res : subsystemResources) {
+            org.osgi.service.obr.Resource obrRes = findOBRResource(res);
+            obrResolver.add(obrRes);
+        }
         
+        // Question: do we need to create the repository.xml for the subsystem and add the repo to RepoAdmin?
+        List<Resource> resources = new ArrayList<Resource>();
+        if (obrResolver.resolve()) {
+            for (org.osgi.service.obr.Resource res : obrResolver.getRequiredResources()) {
+                resources.add(toResource(res));
+            }
+            
+            // Question: should we handle optional resource differently?
+            for (org.osgi.service.obr.Resource res : obrResolver.getOptionalResources()) {
+                resources.add(toResource(res));
+            }
+        } else {
+            // log the unsatisfied requirement
+            Requirement[] reqs = obrResolver.getUnsatisfiedRequirements();
+            for (Requirement req : reqs) {
+                LOGGER.warn("Unable to resolve subsystem content {} subsystem resource {} because of unsatisfied requirement {}", 
+                        new Object[] {subsystemContent.toString(), subsystemResources.toString(), req.getName()});
+            }
 
-        return subsystemResources;
+        }
+        
+        return resources;
     }
 
 }

Modified: incubator/aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemAdminTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemAdminTest.java?rev=934137&r1=934136&r2=934137&view=diff
==============================================================================
--- incubator/aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemAdminTest.java (original)
+++ incubator/aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemAdminTest.java Wed Apr 14 19:22:52 2010
@@ -97,6 +97,8 @@ public class SubsystemAdminTest extends 
         System.out.println("able to get subsytem admin service");
         
         File f = new File("test.eba");
+        // capture initial bundle size
+        int init = bundleContext.getBundles().length;
         Subsystem subsystem = sa.install(f.toURI().toURL().toExternalForm());
         assertNotNull("subsystem should not be null", subsystem);
         
@@ -106,7 +108,11 @@ public class SubsystemAdminTest extends 
         assertEquals("2.0.8", subsystem.getVersion().toString());
         Collection<Bundle> constituents = subsystem.getConstituents();
         assertEquals("check constituents' size", 1, constituents.size());
-
+        // recapture bundle size
+        int later = bundleContext.getBundles().length;
+        // we expect the number would increase 4, one is composite bundle, three are the required resources of the subsystem content
+        assertEquals(4, later - init);
+        subsystem.start();
     }
 
     @org.ops4j.pax.exam.junit.Configuration