Author: jwross
Date: Fri Sep 16 20:20:16 2011
New Revision: 1171761

URL: http://svn.apache.org/viewvc?rev=1171761&view=rev
Log:
ARIES-748: Update subsystems to use Equinox impl of 
org.osgi.service.resolver.Resolver

The initial API and implementation of the Equinox org.osgi.service.resolver 
(RFC 112) is available in the master branches of the rt.equinox.bundles and 
rt.equinox.framework git repositories. I updated subsystems to make use of it. 
Previously, a quick and dirty Resolver adaptor wrapped around the existing 
Felix OBR implementation was used. Note the subsystems impl uses a registered 
Resolver service, so making use of the Equinox resolver simply meant adding the 
bundle to the itests project. When Felix releases their implementation of 
org.osgi.service.resolver, the two will (hopefully) be interchangeable. 

Using the Equinox resolver highlighted some shortcomings in the subsystems 
implementation, which were fixed and are listed below. 

(1) Updated subsystem-itests to bring in the Equinox resolver. 
(2) Updated SubsystemEnvironment to return all capabilities that match a 
requirement, even those from the root subsystem (i.e. from the system bundle 
and any other already installed bundles). Previously, Felix OBR had been 
automatically providing these via the Resolver adaptor since Felix OBR has a 
built-in system repository. However, for the RFC 112 resolver, the expectation 
is the Environment will provide everything. 
(3) Fixed an issue where the resource -> subsystem relationship was not being 
established for resources in the root subsystem causing an NPE. 
(4) The FelixRequirementAdaptor must strip out the "mandatory:<*" clause from 
the filter or InvalidSyntaxException occurs. 
(5) OsgiIdentityRequirement now includes the filter directive. 
(6) Added namespace translations to FelixResourceAdaptor.

Modified:
    
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/Activator.java
    
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/AriesSubsystem.java
    
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/OsgiIdentityRequirement.java
    
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/SubsystemEnvironment.java
    
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/FelixCapabilityAdapter.java
    
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/FelixRequirementAdapter.java
    
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/FelixResourceAdapter.java
    
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/OsgiCapabilityAdapter.java
    aries/trunk/subsystem/subsystem-itests/pom.xml
    
aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemTest.java

Modified: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/Activator.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/Activator.java?rev=1171761&r1=1171760&r2=1171761&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/Activator.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/Activator.java
 Fri Sep 16 20:20:16 2011
@@ -116,7 +116,19 @@ public class Activator implements Bundle
         * A naive implementation serving as a placeholder until a real 
Resolver comes along.
         */
        public static Resolver getResolver() {
-               return new SubsystemResolver();
+//             return new SubsystemResolver();
+               ServiceTracker st = new ServiceTracker(context, 
Resolver.class.getName(), null);
+               try {
+                       st.open();
+                       return (Resolver)st.waitForService(5000);
+               }
+               catch (InterruptedException e) {
+                       Thread.currentThread().interrupt();
+                       return null;
+               }
+               finally {
+                       st.close();
+               }
        }
        
        private final BundleListener bundleListener = new 
SubsystemSynchronousBundleListener();

Modified: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/AriesSubsystem.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/AriesSubsystem.java?rev=1171761&r1=1171760&r2=1171761&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/AriesSubsystem.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/AriesSubsystem.java
 Fri Sep 16 20:20:16 2011
@@ -700,6 +700,7 @@ public class AriesSubsystem implements S
                                }
                        }
                        catch (Exception e) {
+                               // TODO Log this exception? If not, who's 
responsible for logging it?
                                coordination.fail(e);
                        }
                        finally {
@@ -713,7 +714,15 @@ public class AriesSubsystem implements S
                Bundle bundle;
                synchronized (resourceToSubsystems) {
                        if (resource instanceof BundleRevision) {
-                               resourceToSubsystems.get(resource).add(this);
+                               // This means the resource is a bundle that's 
already been installed, but we still need to establish the resource->subsystem 
relationship.
+                               // TODO The null check is necessary for when 
the bundle is in the root subsystem. Currently, the root subsystem is not 
initialized with
+                               // these relationships. Need to decide if that 
would be better.
+                               Set<Subsystem> subsystems = 
resourceToSubsystems.get(resource);
+                               if (subsystems == null) {
+                                       subsystems = new HashSet<Subsystem>();
+                                       resourceToSubsystems.put(resource, 
subsystems);
+                               }
+                               subsystems.add(this);
                                return;
                        }
                        provisionTo = getProvisionTo(resource, transitive);

Modified: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/OsgiIdentityRequirement.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/OsgiIdentityRequirement.java?rev=1171761&r1=1171760&r2=1171761&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/OsgiIdentityRequirement.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/OsgiIdentityRequirement.java
 Fri Sep 16 20:20:16 2011
@@ -102,6 +102,7 @@ public class OsgiIdentityRequirement imp
                this.filter = filter;
                this.resource = resource;
                this.transitive = transitive;
+               directives.put(Constants.FILTER_DIRECTIVE, filter.toString());
                directives.put(ResourceConstants.IDENTITY_SINGLETON_DIRECTIVE, 
Boolean.FALSE.toString());
                directives.put(Constants.EFFECTIVE_DIRECTIVE, 
Constants.EFFECTIVE_RESOLVE);
        }

Modified: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/SubsystemEnvironment.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/SubsystemEnvironment.java?rev=1171761&r1=1171760&r2=1171761&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/SubsystemEnvironment.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/SubsystemEnvironment.java
 Fri Sep 16 20:20:16 2011
@@ -69,6 +69,8 @@ public class SubsystemEnvironment implem
                // This means we're looking for capabilities satisfying a 
requirement within a content resource or transitive dependency.
                findArchiveProviders(capabilities, requirement, false);
                findRepositoryServiceProviders(capabilities, requirement, 
false);
+               // TODO The following is a quick fix to ensure this environment 
always returns capabilities provided by the system bundle. Needs some more 
thought.
+               findConstituentProviders(requirement, capabilities);
                return capabilities;
        }
        
@@ -89,11 +91,8 @@ public class SubsystemEnvironment implem
 
        @Override
        public Map<Resource, List<Wire>> getWiring() {
-               Map<Resource, List<Wire>> wiring = new HashMap<Resource, 
List<Wire>>();
-               for (Resource resource : resourceToRepository.keySet()) {
-                       wiring.put(resource, Collections.EMPTY_LIST);
-               }
-               return wiring;
+               // TODO When will this ever return an existing wiring?
+               return Collections.EMPTY_MAP;
        }
        
        public boolean isContentResource(Resource resource) {

Modified: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/FelixCapabilityAdapter.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/FelixCapabilityAdapter.java?rev=1171761&r1=1171760&r2=1171761&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/FelixCapabilityAdapter.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/FelixCapabilityAdapter.java
 Fri Sep 16 20:20:16 2011
@@ -34,7 +34,9 @@ public class FelixCapabilityAdapter impl
        }
 
        public Map<String, Object> getAttributes() {
-               return capability.getPropertiesAsMap();
+               Map<String, Object> result = capability.getPropertiesAsMap();
+               result.put(getNamespace(), result.get(capability.getName()));
+               return result;
        }
 
        public Map<String, String> getDirectives() {

Modified: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/FelixRequirementAdapter.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/FelixRequirementAdapter.java?rev=1171761&r1=1171760&r2=1171761&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/FelixRequirementAdapter.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/FelixRequirementAdapter.java
 Fri Sep 16 20:20:16 2011
@@ -42,7 +42,12 @@ public class FelixRequirementAdapter imp
 
        public Map<String, String> getDirectives() {
                Map<String, String> result = new HashMap<String, String>(1);
-               result.put(Constants.FILTER_DIRECTIVE, requirement.getFilter());
+               /* (1) The Felix OBR specific "mandatory:<*" syntax must be 
stripped out of the filter.
+                * (2) The namespace must be translated.
+                */
+               result.put(Constants.FILTER_DIRECTIVE, requirement.getFilter()
+                               .replaceAll("\\(mandatory\\:\\<\\*[^\\)]*\\)", 
"")
+                               .replaceAll(requirement.getName() + '=', 
getNamespace() + '='));
                return result;
        }
 

Modified: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/FelixResourceAdapter.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/FelixResourceAdapter.java?rev=1171761&r1=1171760&r2=1171761&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/FelixResourceAdapter.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/FelixResourceAdapter.java
 Fri Sep 16 20:20:16 2011
@@ -23,8 +23,19 @@ import org.osgi.framework.resource.Capab
 import org.osgi.framework.resource.Requirement;
 import org.osgi.framework.resource.Resource;
 import org.osgi.framework.resource.ResourceConstants;
+import org.osgi.framework.wiring.BundleRevision;
 
 public class FelixResourceAdapter implements Resource {
+       private static String toFelixNamespace(String namespace) {
+               if (BundleRevision.BUNDLE_NAMESPACE.equals(namespace))
+                       return 
org.apache.felix.bundlerepository.Capability.BUNDLE;
+               if (BundleRevision.HOST_NAMESPACE.equals(namespace))
+                       return 
org.apache.felix.bundlerepository.Capability.FRAGMENT;
+               if (BundleRevision.PACKAGE_NAMESPACE.equals(namespace))
+                       return 
org.apache.felix.bundlerepository.Capability.PACKAGE;
+               return namespace;
+       }
+       
        private final org.apache.felix.bundlerepository.Resource resource;
        
        public FelixResourceAdapter(final 
org.apache.felix.bundlerepository.Resource resource) {
@@ -55,6 +66,7 @@ public class FelixResourceAdapter implem
        }
        
        public List<Capability> getCapabilities(String namespace) {
+               namespace = toFelixNamespace(namespace);
                org.apache.felix.bundlerepository.Capability[] capabilities = 
resource.getCapabilities();
                ArrayList<Capability> result = new 
ArrayList<Capability>(capabilities.length);
                if (namespace == null || 
namespace.equals(ResourceConstants.IDENTITY_NAMESPACE)) {
@@ -81,6 +93,7 @@ public class FelixResourceAdapter implem
        }
 
        public List<Requirement> getRequirements(String namespace) {
+               namespace = toFelixNamespace(namespace);
                org.apache.felix.bundlerepository.Requirement[] requirements = 
resource.getRequirements();
                ArrayList<Requirement> result = new 
ArrayList<Requirement>(requirements.length);
                for (final org.apache.felix.bundlerepository.Requirement 
requirement : requirements) {

Modified: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/OsgiCapabilityAdapter.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/OsgiCapabilityAdapter.java?rev=1171761&r1=1171760&r2=1171761&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/OsgiCapabilityAdapter.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/felix/OsgiCapabilityAdapter.java
 Fri Sep 16 20:20:16 2011
@@ -15,6 +15,7 @@ package org.apache.aries.subsystem.core.
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.felix.bundlerepository.Capability;
@@ -44,13 +45,20 @@ public class OsgiCapabilityAdapter imple
        public Property[] getProperties() {
                Map<String, Object> attributes = capability.getAttributes();
                Collection<Property> result = new 
ArrayList<Property>(attributes.size());
-               for (final Map.Entry<String, Object> entry : 
capability.getAttributes().entrySet())
+               for (final Map.Entry<String, Object> entry : 
capability.getAttributes().entrySet()) {
+                       if (entry.getKey().equals(capability.getNamespace())) {
+                               result.add(new FelixProperty(getName(), 
entry.getValue()));
+                               continue;
+                       }
                        result.add(new FelixProperty(entry));
+               }
                return result.toArray(new Property[result.size()]);
        }
 
        @SuppressWarnings("rawtypes")
        public Map getPropertiesAsMap() {
-               return capability.getAttributes();
+               Map<String, Object> result = new HashMap<String, 
Object>(capability.getAttributes());
+               result.put(getName(), result.get(capability.getNamespace()));
+               return result;
        }
 }

Modified: aries/trunk/subsystem/subsystem-itests/pom.xml
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/pom.xml?rev=1171761&r1=1171760&r2=1171761&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-itests/pom.xml (original)
+++ aries/trunk/subsystem/subsystem-itests/pom.xml Fri Sep 16 20:20:16 2011
@@ -41,6 +41,11 @@
         </dependency>
         <dependency>
             <groupId>org.eclipse.equinox</groupId>
+            <artifactId>org.eclipse.equinox.resolver</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.equinox</groupId>
             <artifactId>org.eclipse.equinox.event</artifactId>
             <version>1.2.100</version>
         </dependency>

Modified: 
aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemTest.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemTest.java?rev=1171761&r1=1171760&r2=1171761&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemTest.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-itests/src/test/java/org/apache/aries/subsystem/itests/SubsystemTest.java
 Fri Sep 16 20:20:16 2011
@@ -125,6 +125,7 @@ public abstract class SubsystemTest exte
                                // Bundles
                                mavenBundle("org.eclipse.osgi", 
"services").version("3.3.0-v20110523"),
                                mavenBundle("org.eclipse.equinox", 
"region").version("1.0.0.v20110518"),
+                               mavenBundle("org.eclipse.equinox", 
"org.eclipse.equinox.resolver").version("1.0.0-SNAPSHOT"),
                                mavenBundle("org.apache.aries.testsupport", 
"org.apache.aries.testsupport.unit"),
                                mavenBundle("org.apache.aries.application", 
"org.apache.aries.application.api"),
                                mavenBundle("org.apache.aries", 
"org.apache.aries.util"),


Reply via email to