You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by jw...@apache.org on 2011/08/15 15:42:58 UTC

svn commit: r1157844 - in /aries/trunk/subsystem/subsystem-core: ./ src/main/java/org/apache/aries/subsystem/core/ src/main/java/org/apache/aries/subsystem/core/internal/ src/main/java/org/apache/aries/subsystem/core/obr/ src/main/java/org/eclipse/equi...

Author: jwross
Date: Mon Aug 15 13:42:57 2011
New Revision: 1157844

URL: http://svn.apache.org/viewvc?rev=1157844&view=rev
Log:
ARIES-728: Check in initial baseline for subsystems implementation based on latest RFCs.

org.apache.aries.subsystem.core

Removed:
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BundleResourceProcessor.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/DictionaryAsMap.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/DictionaryBuilder.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/FileUtils.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/NoOpResolver.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResourceImpl.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RootSubsystem.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemEventDispatcher.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemImpl.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResourceProcessor.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/BundleInfoImpl.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/ContentImpl.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/Manve2Repository.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/obr/RepositoryDescriptorGenerator.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/eclipse/equinox/
Modified:
    aries/trunk/subsystem/subsystem-core/pom.xml
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/ResourceConverter.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/ResourceResolver.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/SubsystemEvent.java
    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/ResourceResolverImpl.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemServiceFactory.java
    aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/ResourceResolverTest.java

Modified: aries/trunk/subsystem/subsystem-core/pom.xml
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/pom.xml?rev=1157844&r1=1157843&r2=1157844&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/pom.xml (original)
+++ aries/trunk/subsystem/subsystem-core/pom.xml Mon Aug 15 13:42:57 2011
@@ -55,23 +55,9 @@
 
     <dependencies>
     	<dependency>
-    		<groupId>org.eclipse.equinox</groupId>
-    		<artifactId>coordinator</artifactId>
-    		<version>1.0.0.v20110314</version>
-    	</dependency>
-        <dependency>
             <groupId>org.apache.aries.subsystem</groupId>
             <artifactId>org.apache.aries.subsystem.api</artifactId>
             <version>0.1-SNAPSHOT</version>
-        </dependency>
-       <dependency>
-            <groupId>org.eclipse.equinox</groupId>
-            <artifactId>region</artifactId>
-            <version>1.0.0.v20110506</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.aries.application</groupId>
-            <artifactId>org.apache.aries.application.api</artifactId>
             <exclusions>
             	<exclusion>
             		<groupId>org.osgi</groupId>
@@ -80,8 +66,9 @@
             </exclusions>
         </dependency>
         <dependency>
-            <groupId>org.apache.aries.application</groupId>
-            <artifactId>org.apache.aries.application.utils</artifactId>
+            <groupId>org.apache.aries</groupId>
+            <artifactId>org.apache.aries.util</artifactId>
+            <version>0.4-SNAPSHOT</version>
             <exclusions>
             	<exclusion>
             		<groupId>org.osgi</groupId>
@@ -90,9 +77,9 @@
             </exclusions>
         </dependency>
         <dependency>
-            <groupId>org.apache.aries.testsupport</groupId>
-            <artifactId>org.apache.aries.testsupport.unit</artifactId>
-            <scope>test</scope>
+            <groupId>org.apache.aries.application</groupId>
+            <artifactId>org.apache.aries.application.api</artifactId>
+            <version>0.3.1-SNAPSHOT</version>
             <exclusions>
             	<exclusion>
             		<groupId>org.osgi</groupId>
@@ -100,21 +87,21 @@
             	</exclusion>
             </exclusions>
         </dependency>
-        <dependency>
+    	<dependency>
             <groupId>org.eclipse</groupId>
             <artifactId>osgi</artifactId>
-            <version>3.7.0.v20110221</version>
+            <version>3.8.0-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-simple</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-            <scope>provided</scope>
+    	<dependency>
+    		<groupId>org.eclipse.equinox</groupId>
+    		<artifactId>coordinator</artifactId>
+    		<version>1.0.0.v20110314</version>
+    	</dependency>
+    	<dependency>
+            <groupId>org.eclipse.equinox</groupId>
+            <artifactId>region</artifactId>
+            <version>1.0.0.v20110506</version>
         </dependency>
         <dependency>
             <groupId>org.apache.felix</groupId>
@@ -128,16 +115,6 @@
             </exclusions>
         </dependency>
         <dependency>
-            <groupId>org.apache.aries.application</groupId>
-            <artifactId>org.apache.aries.application.api</artifactId>
-            <version>0.3</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.aries.application</groupId>
-            <artifactId>org.apache.aries.application.utils</artifactId>
-            <version>0.3</version>
-        </dependency>
-        <dependency>
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.bundlerepository</artifactId>
             <version>1.6.4</version>
@@ -149,15 +126,30 @@
             </exclusions>
         </dependency>
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
+            <groupId>org.apache.aries.testsupport</groupId>
+            <artifactId>org.apache.aries.testsupport.unit</artifactId>
+            <version>0.4-SNAPSHOT</version>
+            <scope>test</scope>
+            <exclusions>
+            	<exclusion>
+            		<groupId>org.osgi</groupId>
+            		<artifactId>org.osgi.core</artifactId>
+            	</exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.aries.testsupport</groupId>
-            <artifactId>org.apache.aries.testsupport.unit</artifactId>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
             <scope>test</scope>
-            <version>0.3</version>
         </dependency>
     </dependencies>
 

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/ResourceConverter.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/ResourceConverter.java?rev=1157844&r1=1157843&r2=1157844&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/ResourceConverter.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/ResourceConverter.java Mon Aug 15 13:42:57 2011
@@ -13,8 +13,8 @@
  */
 package org.apache.aries.subsystem.core;
 
-import org.apache.aries.subsystem.SubsystemException;
-import org.apache.aries.subsystem.spi.Resource;
+import org.osgi.framework.wiring.Resource;
+import org.osgi.service.subsystem.SubsystemException;
 
 /**
  * ResourceConverters are used to transform resources into another kind of

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/ResourceResolver.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/ResourceResolver.java?rev=1157844&r1=1157843&r2=1157844&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/ResourceResolver.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/ResourceResolver.java Mon Aug 15 13:42:57 2011
@@ -15,8 +15,8 @@ package org.apache.aries.subsystem.core;
 
 import java.util.List;
 
-import org.apache.aries.subsystem.SubsystemException;
-import org.apache.aries.subsystem.spi.Resource;
+import org.osgi.framework.wiring.Resource;
+import org.osgi.service.subsystem.SubsystemException;
 
 /**
  * The ResourceResolver object is used by the SubsystemAdmin to locate

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/SubsystemEvent.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/SubsystemEvent.java?rev=1157844&r1=1157843&r2=1157844&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/SubsystemEvent.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/SubsystemEvent.java Mon Aug 15 13:42:57 2011
@@ -13,7 +13,7 @@
  */
 package org.apache.aries.subsystem.core;
 
-import org.apache.aries.subsystem.Subsystem;
+import org.osgi.service.subsystem.Subsystem;
 
 /**
  * Event sent to listeners when an operation has been performed on a subsystem.
@@ -31,6 +31,7 @@ public class SubsystemEvent {
          * Event type used to indicate a subsystem has been installed.
          */
         INSTALLED,
+        INSTALLING,
 
         /**
          * Event type used to indicate a subsystem has been started.

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=1157844&r1=1157843&r2=1157844&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 Mon Aug 15 13:42:57 2011
@@ -14,119 +14,198 @@
 package org.apache.aries.subsystem.core.internal;
 
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executor;
 
-import org.apache.aries.subsystem.Subsystem;
-import org.apache.aries.subsystem.SubsystemConstants;
-import org.apache.aries.subsystem.core.ResourceResolver;
-import org.apache.aries.subsystem.spi.ResourceProcessor;
+import org.apache.aries.subsystem.core.obr.felix.FelixResourceAdapter;
+import org.apache.aries.subsystem.core.obr.felix.OsgiResourceAdapter;
+import org.apache.felix.bundlerepository.Reason;
+import org.apache.felix.bundlerepository.RepositoryAdmin;
 import org.eclipse.equinox.region.RegionDigraph;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.hooks.resolver.ResolverHookFactory;
+import org.osgi.framework.wiring.Capability;
+import org.osgi.framework.wiring.FrameworkWiring;
+import org.osgi.framework.wiring.Requirement;
+import org.osgi.framework.wiring.Resource;
+import org.osgi.framework.wiring.Wire;
 import org.osgi.service.coordinator.Coordinator;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.osgi.service.repository.Repository;
+import org.osgi.service.resolver.Environment;
+import org.osgi.service.resolver.ResolutionException;
+import org.osgi.service.resolver.Resolver;
+import org.osgi.service.subsystem.Subsystem;
+import org.osgi.service.subsystem.SubsystemException;
 import org.osgi.util.tracker.ServiceTracker;
-import org.osgi.util.tracker.ServiceTrackerCustomizer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * The bundle activator for the this bundle.
- * When the bundle is starting, this activator will create
- * and register the SubsystemAdmin service.
+ * The bundle activator for the this bundle. When the bundle is starting, this
+ * activator will create and register the SubsystemAdmin service.
  */
 public class Activator implements BundleActivator {
-    private static final Logger LOGGER = LoggerFactory.getLogger(Activator.class);
-    
-    static Coordinator getCoordinator() {
-    	return context.getService(context.getServiceReference(Coordinator.class));
-    }
-    
-    private static BundleContext context;
-    private List<ServiceRegistration> registrations = new ArrayList<ServiceRegistration>();
-    private static SubsystemEventDispatcher eventDispatcher;
-    
-    private ServiceTracker scopeServiceTracker;
-    
-    public void start(final BundleContext context) throws Exception {
-        if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug("subsystem activator starting");
-        }
-        Activator.context = context;
-        Activator.eventDispatcher = new SubsystemEventDispatcher(context);   
-        register(ResourceResolver.class,
-                 new NoOpResolver(),
-                 DictionaryBuilder.build(Constants.SERVICE_RANKING, Integer.MIN_VALUE));
-        register(ResourceResolver.class,
-                new ResourceResolverImpl(context),
-                DictionaryBuilder.build(Constants.SERVICE_RANKING, 0));
-        register(ResourceProcessor.class,
-                new BundleResourceProcessor(context),
-                DictionaryBuilder.build(SubsystemConstants.SERVICE_RESOURCE_TYPE, SubsystemConstants.RESOURCE_TYPE_BUNDLE));
-        register(ResourceProcessor.class,
-                new SubsystemResourceProcessor(context),
-                DictionaryBuilder.build(SubsystemConstants.SERVICE_RESOURCE_TYPE, SubsystemConstants.RESOURCE_TYPE_SUBSYSTEM));
-        scopeServiceTracker = new ServiceTracker(
-        		context,
-        		RegionDigraph.class.getName(),
-        		new ServiceTrackerCustomizer() {
-        			private ServiceReference<?> scopeRef;
-        			private ServiceRegistration<?> subsystemReg;
-        			
-					public synchronized Object addingService(ServiceReference reference) {
-						if (subsystemReg != null) return null;
-						RegionDigraph digraph = (RegionDigraph)context.getService(reference);
-						if (digraph == null) return null;
-						subsystemReg = context.registerService(Subsystem.class.getName(), new SubsystemServiceFactory(digraph.getRegion(context.getBundle())), null);
-						return digraph;
-					}
-
-					public void modifiedService(ServiceReference reference, Object service) {
-						// Do nothing.
-					}
-
-					public synchronized void removedService(ServiceReference reference, Object service) {
-						if (reference != scopeRef) return;
-						subsystemReg.unregister();
-						subsystemReg = null;
-						// TODO Look for another service?
-					}
-        		});
-        scopeServiceTracker.open();
-    }
-
-    protected <T> void register(Class<T> clazz, T service, Dictionary props) {
-         registrations.add(context.registerService(clazz.getName(), service, props));
-    }
-
-    protected <T> void register(Class<T> clazz, ServiceFactory factory, Dictionary props) {
-         registrations.add(context.registerService(clazz.getName(), factory, props));
-    }
-
-    public void stop(BundleContext context) throws Exception {
-        if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug("subsystem activator stopping");
-        }
-        scopeServiceTracker.close();
-        for (ServiceRegistration<?> r : registrations) {
-            try {
-                r.unregister();
-            } catch (Exception e) {
-                LOGGER.warn("Subsystem Activator shut down", e);
-            }
-        }
-        eventDispatcher.destroy();
-    }
-    
-    public static BundleContext getBundleContext() {
-        return context;
-    }
-    
-    public static SubsystemEventDispatcher getEventDispatcher() {
-        return eventDispatcher;
-    }
+	private static final Logger LOGGER = LoggerFactory.getLogger(Activator.class);
+
+	private static BundleContext context;
+	private static SubsystemManager subsystemManager = new SubsystemManager();
+	
+	public static BundleContext getBundleContext() {
+		return context;
+	}
+	
+	public static Coordinator getCoordinator() {
+		return context.getService(context.getServiceReference(Coordinator.class));
+	}
+	
+	public static EventAdmin getEventAdmin() {
+		ServiceReference<EventAdmin> ref = context.getServiceReference(EventAdmin.class);
+		if (ref == null) return null;
+		return context.getService(ref);
+	}
+	
+	public static Executor getExecutor() {
+		return context.getService(context.getServiceReference(Executor.class));
+	}
+	
+	public static FrameworkWiring getFrameworkWiring() {
+		return context.getBundle(0).adapt(FrameworkWiring.class);
+	}
+	
+	public static RegionDigraph getRegionDigraph() {
+		return context.getService(context.getServiceReference(RegionDigraph.class));
+	}
+	
+	public static Collection<Repository> getRepositories() {
+		Collection<ServiceReference<Repository>> references;
+		try {
+			references = context.getServiceReferences(Repository.class, null);
+		}
+		catch (InvalidSyntaxException e) {
+			// This should never happen, but I don't want to cover it up. Nor do I want to force clients to handle it.
+			throw new RuntimeException(e);
+		}
+		ArrayList<Repository> repositories = new ArrayList<Repository>(references.size());
+		for (ServiceReference<Repository> reference : references) {
+			Repository repository = context.getService(reference);
+			if (repository != null)
+				repositories.add(repository);
+		}
+		repositories.trimToSize();
+		return repositories;
+	}
+	
+	public static RepositoryAdmin getRepositoryAdmin() {
+		ServiceTracker st = new ServiceTracker(context, RepositoryAdmin.class.getName(), null);
+		try {
+			st.open();
+			return (RepositoryAdmin)st.waitForService(5000);
+		}
+		catch (InterruptedException e) {
+			Thread.currentThread().interrupt();
+			return null;
+		}
+		finally {
+			st.close();
+		}
+	}
+	
+	/*
+	 * TODO
+	 * A naive implementation serving as a placeholder until a real Resolver comes along.
+	 */
+	public static Resolver getResolver() {
+		return new Resolver() {
+			@Override
+			public Map<Resource, List<Wire>> resolve(Environment environment, Requirement... requirements) throws ResolutionException {
+				Collection<Capability> capabilities = new ArrayList<Capability>();
+				for (Requirement requirement : requirements)
+					capabilities.addAll(environment.findProviders(requirement));
+				List<Resource> resources = new ArrayList<Resource>(capabilities.size());
+				for (Capability capability : capabilities)
+					resources.add(capability.getResource());
+				org.apache.felix.bundlerepository.Resolver resolver = getRepositoryAdmin().resolver();
+		        for (Resource resource : resources)
+		            resolver.add(new OsgiResourceAdapter(resource));
+		        if (resolver.resolve()) {
+		        	for (org.apache.felix.bundlerepository.Resource resource : resolver.getRequiredResources())
+		            	resources.add(new FelixResourceAdapter(resource));
+		        	for (org.apache.felix.bundlerepository.Resource resource : resolver.getOptionalResources())
+		        		resources.add(new FelixResourceAdapter(resource));
+		        }
+		        else {
+		            Reason[] reasons = resolver.getUnsatisfiedRequirements();
+		            StringBuilder builder = new StringBuilder("Failed to resolve subsystem").append(System.getProperty("line.separator"));
+		            for (Reason reason : reasons)
+		                builder
+		                	.append("resource = ")
+		                	.append(reason.getResource().getSymbolicName())
+		                	.append(", requirement = ")
+		                	.append(reason.getRequirement().getName())
+		                	.append(System.getProperty("line.separator"));
+		            throw new SubsystemException(builder.toString());
+		        }
+		        Map<Resource, List<Wire>> result = new HashMap<Resource, List<Wire>>(resources.size());
+				for (Resource resource : resources)
+					result.put(resource, Collections.EMPTY_LIST);
+				return result;
+			}
+		};
+	}
+	
+	public static SubsystemManager getSubsystemManager() {
+		return subsystemManager;
+	}
+	
+	private final BundleListener bundleListener = new SubsystemSynchronousBundleListener();
+	private final List<ServiceRegistration<?>> registrations = new ArrayList<ServiceRegistration<?>>();
+	
+	public void start(final BundleContext context) throws Exception {
+		if (LOGGER.isDebugEnabled()) {
+			LOGGER.debug("subsystem activator starting");
+		}
+		Activator.context = context;
+		register(Subsystem.class.getName(), new SubsystemServiceFactory(), null);
+		register(ResolverHookFactory.class, new SubsystemResolverHookFactory(), null);
+		context.getBundle(0).getBundleContext().addBundleListener(bundleListener);
+		Dictionary<String, Object> properties = new Hashtable<String, Object>();
+		properties.put(EventConstants.EVENT_TOPIC, new String[]{"org/osgi/framework/BundleEvent/*"});
+		register(EventHandler.class, new BundleEventHandler(), properties);
+	}
+
+	public void stop(BundleContext context) throws Exception {
+		if (LOGGER.isDebugEnabled()) {
+			LOGGER.debug("subsystem activator stopping");
+		}
+		context.getBundle(0).getBundleContext().removeBundleListener(bundleListener);
+		for (ServiceRegistration<?> r : registrations) {
+			try {
+				r.unregister();
+			} catch (Exception e) {
+				LOGGER.warn("Subsystem Activator shut down", e);
+			}
+		}
+	}
+
+	private <T> void register(Class<T> clazz, T service, Dictionary<String, ?> props) {
+		registrations.add(context.registerService(clazz.getName(), service, props));
+	}
+	
+	private <T> void register(String clazz, T service, Dictionary<String, ?> props) {
+		registrations.add(context.registerService(clazz, service, props));
+	}
 }

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResourceResolverImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResourceResolverImpl.java?rev=1157844&r1=1157843&r2=1157844&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResourceResolverImpl.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResourceResolverImpl.java Mon Aug 15 13:42:57 2011
@@ -11,12 +11,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.aries.subsystem.core.internal;
 
 import java.io.File;
 import java.io.FileOutputStream;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -29,21 +30,26 @@ import javax.xml.transform.stream.Stream
 
 import org.apache.aries.application.Content;
 import org.apache.aries.application.management.BundleInfo;
-import org.apache.aries.subsystem.SubsystemConstants;
-import org.apache.aries.subsystem.SubsystemException;
+import org.apache.aries.subsystem.core.BundleInfoImpl;
+import org.apache.aries.subsystem.core.ContentImpl;
+import org.apache.aries.subsystem.core.Manve2Repository;
+import org.apache.aries.subsystem.core.RepositoryDescriptorGenerator;
 import org.apache.aries.subsystem.core.ResourceResolver;
-import org.apache.aries.subsystem.core.obr.BundleInfoImpl;
-import org.apache.aries.subsystem.core.obr.ContentImpl;
-import org.apache.aries.subsystem.core.obr.Manve2Repository;
-import org.apache.aries.subsystem.core.obr.RepositoryDescriptorGenerator;
-import org.apache.aries.subsystem.spi.Resource;
+import org.apache.aries.subsystem.core.obr.felix.FelixResourceAdapter;
+import org.apache.aries.subsystem.core.obr.felix.OsgiResourceAdapter;
+import org.apache.felix.bundlerepository.Capability;
+import org.apache.felix.bundlerepository.Property;
 import org.apache.felix.bundlerepository.Reason;
 import org.apache.felix.bundlerepository.Repository;
 import org.apache.felix.bundlerepository.RepositoryAdmin;
+import org.apache.felix.bundlerepository.Requirement;
 import org.apache.felix.bundlerepository.Resolver;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.Version;
+import org.osgi.framework.wiring.Resource;
+import org.osgi.service.subsystem.SubsystemConstants;
+import org.osgi.service.subsystem.SubsystemException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
@@ -177,12 +183,14 @@ public class ResourceResolverImpl implem
                 if (resources[i].getSymbolicName().equals(symbolicName)) {
                     if (resources[i].getVersion().compareTo(new Version(version)) == 0) {
                         res = resources[i];
+                        break;
                     }
                 }
             }
         }
         if (res == null) {
-            throw new SubsystemException("unable to find the resource " + resource);
+//            throw new SubsystemException("unable to find the resource " + resource);
+        	return null;
         }
         
         Map props = res.getProperties();
@@ -190,16 +198,16 @@ public class ResourceResolverImpl implem
 
         Object type = props.get(SubsystemConstants.RESOURCE_TYPE_ATTRIBUTE);
 
-        return new ResourceImpl(symbolicName, res.getVersion(), type == null ? SubsystemConstants.RESOURCE_TYPE_BUNDLE : (String)type, res.getURI() , props);
+        return new FelixResourceAdapter(res);
     }
     
     /**
      * 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.apache.felix.bundlerepository.Resource findOBRResource(Resource resource) throws SubsystemException {
-        String symbolicName = String.valueOf(resource.getAttributes().get(Resource.SYMBOLIC_NAME_ATTRIBUTE));
+        String symbolicName = ResourceHelper.getSymbolicNameAttribute(resource);
         // this version could possibly be a range
-        Version version = (Version)resource.getAttributes().get(Resource.VERSION_ATTRIBUTE);
+        Version version = ResourceHelper.getVersionAttribute(resource);
 
         //org.apache.felix.bundlerepository.Resource[] res = this.repositoryAdmin.discoverResources(filterString.toString());
         Repository[] repos = this.repositoryAdmin.listRepositories();
@@ -230,7 +238,7 @@ public class ResourceResolverImpl implem
 
         Object type = props.get(SubsystemConstants.RESOURCE_TYPE_ATTRIBUTE);
 
-        return new ResourceImpl(resource.getSymbolicName(), resource.getVersion(), type == null ? SubsystemConstants.RESOURCE_TYPE_BUNDLE : (String)type, resource.getURI() , props);
+        return new FelixResourceAdapter(resource);
     }
     
     public List<Resource> resolve(List<Resource> subsystemContent,
@@ -243,38 +251,116 @@ public class ResourceResolverImpl implem
         
         // add subsystem content to the resolver
         for (Resource res : subsystemContent) {
-            org.apache.felix.bundlerepository.Resource obrRes = findOBRResource(res);
-            obrResolver.add(obrRes);
+//            org.apache.felix.bundlerepository.Resource obrRes = findOBRResource(res);
+//            obrResolver.add(obrRes);
+            obrResolver.add(new OsgiResourceAdapter(res));
         }
         
         // add subsystem resource to the resolver
         for (Resource res : subsystemResources) {
-            org.apache.felix.bundlerepository.Resource obrRes = findOBRResource(res);
-            obrResolver.add(obrRes);
+//            org.apache.felix.bundlerepository.Resource obrRes = findOBRResource(res);
+//            obrResolver.add(obrRes);
+        	obrResolver.add(new OsgiResourceAdapter(res));
         }
         
         // 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.apache.felix.bundlerepository.Resource res : obrResolver.getRequiredResources()) {
-                resources.add(toResource(res));
+//                resources.add(toResource(res));
+            	resources.add(new FelixResourceAdapter(res));
             }
             
             // Question: should we handle optional resource differently?
             for (org.apache.felix.bundlerepository.Resource res : obrResolver.getOptionalResources()) {
-                resources.add(toResource(res));
+//                resources.add(toResource(res));
+            	resources.add(new FelixResourceAdapter(res));
             }
         } else {
             // log the unsatisfied requirement
             Reason[] reasons = obrResolver.getUnsatisfiedRequirements();
+            StringBuilder builder = new StringBuilder("Failed to resolve subsystem").append(System.getProperty("line.separator"));
             for (Reason reason : reasons) {
                 LOGGER.warn("Unable to resolve subsystem content {} subsystem resource {} because of unsatisfied requirement {}", 
                         new Object[] {subsystemContent.toString(), subsystemResources.toString(), reason.getRequirement().getName()});
+                builder
+                	.append("resource = ")
+                	.append(reason.getResource().getSymbolicName())
+                	.append(", requirement = ")
+                	.append(reason.getRequirement().getName())
+                	.append(System.getProperty("line.separator"));
             }
-
+            throw new SubsystemException(builder.toString());
         }
-        
         return resources;
     }
+    
+    private org.apache.felix.bundlerepository.Resource convert(final Resource resource) {
+    	return new org.apache.felix.bundlerepository.Resource() {
+			public Capability[] getCapabilities() {
+				Collection<Capability> result = new ArrayList<Capability>(resource.getCapabilities(null).size());
+				for (org.osgi.framework.wiring.Capability capability : resource.getCapabilities(null)) {
+					result.add(new Capability() {
+						public String getName() {
+							// TODO Auto-generated method stub
+							return null;
+						}
+
+						public Property[] getProperties() {
+							// TODO Auto-generated method stub
+							return null;
+						}
+
+						public Map getPropertiesAsMap() {
+							// TODO Auto-generated method stub
+							return null;
+						}
+					});
+				}
+				return null;
+			}
+
+			public String[] getCategories() {
+				return new String[0];
+			}
+
+			public String getId() {
+				return getSymbolicName() + ";version=" + getVersion();
+			}
+
+			public String getPresentationName() {
+				return getSymbolicName();
+			}
+
+			public Map getProperties() {
+				return Collections.EMPTY_MAP;
+			}
+
+			public Requirement[] getRequirements() {
+				// TODO Auto-generated method stub
+				return null;
+			}
+
+			public Long getSize() {
+				return 0L;
+			}
+
+			public String getSymbolicName() {
+				return ResourceHelper.getSymbolicNameAttribute(resource);
+			}
+
+			public String getURI() {
+				return ResourceHelper.getContentAttribute(resource);
+			}
+
+			public Version getVersion() {
+				return ResourceHelper.getVersionAttribute(resource);
+			}
+
+			public boolean isLocal() {
+				return false;
+			}
+    	};
+    }
 
 }

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemServiceFactory.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemServiceFactory.java?rev=1157844&r1=1157843&r2=1157844&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemServiceFactory.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemServiceFactory.java Mon Aug 15 13:42:57 2011
@@ -1,32 +1,53 @@
-package org.apache.aries.subsystem.core.internal;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.aries.subsystem.Subsystem;
-import org.eclipse.equinox.region.Region;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.ServiceFactory;
-import org.osgi.framework.ServiceRegistration;
-
-public class SubsystemServiceFactory implements ServiceFactory<Subsystem> {
-	private final Map<Bundle, Subsystem> bundlesToSubsystems = new HashMap<Bundle, Subsystem>();
-	private final Subsystem rootSubsystem;
-	
-	public SubsystemServiceFactory(Region region) {
-		rootSubsystem = new RootSubsystem(region);
-	}
-	
-	public Subsystem getService(Bundle bundle, ServiceRegistration<Subsystem> registration) {
-		Subsystem result = bundlesToSubsystems.get(bundle);
-		if (result == null) {
-			result = rootSubsystem;
-			bundlesToSubsystems.put(bundle, result);
-		}
-		return result;
-	}
-
-	public void ungetService(Bundle bundle, ServiceRegistration<Subsystem> registration, Subsystem service) {
-		bundlesToSubsystems.remove(bundle);
-	}
-}
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.aries.subsystem.core.internal;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.equinox.region.RegionDigraph;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.subsystem.Subsystem;
+
+public class SubsystemServiceFactory implements ServiceFactory<Subsystem> {
+	private final Map<Region, Subsystem> regionsToSubsystems = new HashMap<Region, Subsystem>();
+	
+	private final AriesSubsystem rootSubsystem;
+	
+	public SubsystemServiceFactory() throws Exception {
+		rootSubsystem = new AriesSubsystem();
+		Region region = Activator.getRegionDigraph().getRegion(Activator.getBundleContext().getBundle());
+		regionsToSubsystems.put(region, rootSubsystem);
+	}
+	
+	public Subsystem getService(Bundle bundle, ServiceRegistration<Subsystem> registration) {
+		RegionDigraph digraph = Activator.getRegionDigraph();
+		Region region = digraph.getRegion(bundle);
+		Subsystem subsystem = regionsToSubsystems.get(region);
+		if (subsystem == null) {
+			subsystem = rootSubsystem;
+			regionsToSubsystems.put(region, subsystem);
+		}
+		return subsystem;
+	}
+
+	public void ungetService(Bundle bundle, ServiceRegistration<Subsystem> registration, Subsystem service) {
+		RegionDigraph digraph = Activator.getRegionDigraph();
+		Region region = digraph.getRegion(bundle);
+		regionsToSubsystems.remove(region);
+	}
+}

Modified: aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/ResourceResolverTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/ResourceResolverTest.java?rev=1157844&r1=1157843&r2=1157844&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/ResourceResolverTest.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/ResourceResolverTest.java Mon Aug 15 13:42:57 2011
@@ -20,10 +20,10 @@ import java.io.File;
 import org.apache.aries.mocks.BundleContextMock;
 import org.apache.aries.subsystem.core.internal.ResourceResolverImpl;
 import org.apache.aries.unittest.mocks.Skeleton;
+import org.apache.felix.bundlerepository.RepositoryAdmin;
 import org.junit.Before;
 import org.junit.Test;
 import org.osgi.framework.BundleContext;
-import org.apache.felix.bundlerepository.RepositoryAdmin;
 
 public class ResourceResolverTest {