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