Author: gnodet
Date: Tue Apr 15 11:04:40 2014
New Revision: 1587513

URL: http://svn.apache.org/r1587513
Log:
[ARIES-1172] Make subsystems independent of application modeller

Added:
    
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ApplicationServiceModeller.java
    
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ServiceModeller.java
Modified:
    aries/trunk/subsystem/subsystem-bundle/pom.xml
    aries/trunk/subsystem/subsystem-core/pom.xml
    
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/BundleResource.java
    
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BundleRevisionResource.java
    
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/InstallAction.java
    
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RawSubsystemResource.java
    
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java
    
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemUri.java
    
aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/archive/BundleRequiredExecutionEnvironmentHeaderTest.java

Modified: aries/trunk/subsystem/subsystem-bundle/pom.xml
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-bundle/pom.xml?rev=1587513&r1=1587512&r2=1587513&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-bundle/pom.xml (original)
+++ aries/trunk/subsystem/subsystem-bundle/pom.xml Tue Apr 15 11:04:40 2014
@@ -45,6 +45,7 @@
        <aries.osgi.import>
                org.osgi.service.repository;version="[1.0,2)",
                org.osgi.service.subsystem;version="[1.0,2)",
+            org.apache.aries.application.*;resolution:=optional,
                *
        </aries.osgi.import>
         <aries.osgi.export.pkg>
@@ -66,7 +67,7 @@
         <dependency>
             <groupId>org.apache.aries.subsystem</groupId>
             <artifactId>org.apache.aries.subsystem.core</artifactId>
-            <version>1.0.0</version>
+            <version>1.0.1-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.apache.aries</groupId>

Modified: aries/trunk/subsystem/subsystem-core/pom.xml
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/pom.xml?rev=1587513&r1=1587512&r2=1587513&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/pom.xml (original)
+++ aries/trunk/subsystem/subsystem-core/pom.xml Tue Apr 15 11:04:40 2014
@@ -46,6 +46,7 @@
                org.osgi.service.repository;version="[1.0,2)",
                org.osgi.service.subsystem;version="[1.0,2)",
                org.apache.aries.subsystem;version="[1.0,2)",
+            org.apache.aries.application.*;resolution:=optional,
                *
        </aries.osgi.import>
         <aries.osgi.export.pkg />

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=1587513&r1=1587512&r2=1587513&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
 Tue Apr 15 11:04:40 2014
@@ -13,16 +13,12 @@
  */
 package org.apache.aries.subsystem.core.internal;
 
-import static org.apache.aries.application.utils.AppConstants.LOG_ENTRY;
-import static org.apache.aries.application.utils.AppConstants.LOG_EXIT;
-
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Dictionary;
 import java.util.HashSet;
 import java.util.Hashtable;
 
-import org.apache.aries.application.modelling.ModelledResourceManager;
 import org.apache.aries.util.filesystem.IDirectoryFinder;
 import org.eclipse.equinox.region.RegionDigraph;
 import org.osgi.framework.BundleActivator;
@@ -47,9 +43,13 @@ import org.slf4j.LoggerFactory;
  * activator will create and register the SubsystemAdmin service.
  */
 public class Activator implements BundleActivator, 
ServiceTrackerCustomizer<Object, Object> {
-       private static final Logger logger = 
LoggerFactory.getLogger(Activator.class);
-       
-       private static Activator instance;
+    private static final Logger logger = 
LoggerFactory.getLogger(Activator.class);
+    public static final String MODELLED_RESOURCE_MANAGER = 
"org.apache.aries.application.modelling.ModelledResourceManager";
+
+    public static final String LOG_ENTRY = "Method entry: {}, args {}";
+    public static final String LOG_EXIT = "Method exit: {}, returning {}";
+
+    private static Activator instance;
        
        public static synchronized Activator getInstance() {
                logger.debug(LOG_ENTRY, "getInstance");
@@ -69,7 +69,8 @@ public class Activator implements Bundle
        private BundleEventHook bundleEventHook;
        private volatile BundleContext bundleContext;
        private volatile Coordinator coordinator;
-       private volatile ModelledResourceManager modelledResourceManager;
+    private volatile Object modelledResourceManager;
+    private volatile ServiceModeller serviceModeller;
        private volatile SubsystemServiceRegistrar registrar;
        private volatile RegionDigraph regionDigraph;
        private volatile Resolver resolver;
@@ -89,11 +90,11 @@ public class Activator implements Bundle
                return coordinator;
        }
        
-       public ModelledResourceManager getModelledResourceManager() {
-               return modelledResourceManager;
-       }
-       
-       public RegionDigraph getRegionDigraph() {
+    public ServiceModeller getServiceModeller() {
+        return serviceModeller;
+    }
+
+    public RegionDigraph getRegionDigraph() {
                return regionDigraph;
        }
        
@@ -176,13 +177,13 @@ public class Activator implements Bundle
                }
        }
        
-       private Object findAlternateServiceFor(Object service) {
+       private <T> T findAlternateServiceFor(Class<T> service) {
                Object[] services = serviceTracker.getServices();
                if (services == null)
                        return null;
                for (Object alternate : services)
-                       if (alternate.getClass().equals(service.getClass()))
-                                       return alternate;
+                       if (service.isInstance(alternate))
+                                       return service.cast(alternate);
                return null;
        }
        
@@ -201,7 +202,7 @@ public class Activator implements Bundle
                                
.append(org.osgi.framework.Constants.OBJECTCLASS).append('=')
                                .append(Repository.class.getName()).append(")(")
                                
.append(org.osgi.framework.Constants.OBJECTCLASS).append('=')
-                               
.append(ModelledResourceManager.class.getName()).append(")(")
+                               .append(MODELLED_RESOURCE_MANAGER).append(")(")
                                
.append(org.osgi.framework.Constants.OBJECTCLASS).append('=')
                                
.append(IDirectoryFinder.class.getName()).append("))").toString();
        }
@@ -242,8 +243,19 @@ public class Activator implements Bundle
                        regionDigraph = (RegionDigraph) service;
                else if (service instanceof Resolver && resolver == null)
                        resolver = (Resolver) service;
-               else if (service instanceof ModelledResourceManager && 
modelledResourceManager == null)
-                       modelledResourceManager = (ModelledResourceManager) 
service;
+               else {
+            try {
+                Class clazz = 
getClass().getClassLoader().loadClass(MODELLED_RESOURCE_MANAGER);
+                if (clazz.isInstance(service) && serviceModeller == null) {
+                    modelledResourceManager = service;
+                    serviceModeller = new ApplicationServiceModeller(service);
+                }
+            } catch (ClassNotFoundException e) {
+                // ignore
+            } catch (NoClassDefFoundError e) {
+                // ignore
+            }
+        }
                // Activation is harmless if already active or all required 
services
                // have not yet been found.
                activate();
@@ -260,7 +272,7 @@ public class Activator implements Bundle
        public synchronized void removedService(ServiceReference<Object> 
reference, Object service) {
                if (service instanceof Coordinator) {
                        if (service.equals(coordinator)) {
-                               Coordinator coordinator = 
(Coordinator)findAlternateServiceFor(this.coordinator);
+                               Coordinator coordinator = 
findAlternateServiceFor(Coordinator.class);
                                if (coordinator == null)
                                        deactivate();
                                this.coordinator = coordinator;
@@ -268,7 +280,7 @@ public class Activator implements Bundle
                }
                else if (service instanceof RegionDigraph) {
                        if (service.equals(regionDigraph)) {
-                               RegionDigraph regionDigraph = 
(RegionDigraph)findAlternateServiceFor(this.regionDigraph);
+                               RegionDigraph regionDigraph = 
findAlternateServiceFor(RegionDigraph.class);
                                if (regionDigraph == null)
                                        deactivate();
                                this.regionDigraph = regionDigraph;
@@ -276,24 +288,35 @@ public class Activator implements Bundle
                }
                else if (service instanceof Resolver) {
                        if (service.equals(resolver)) {
-                               Resolver resolver = 
(Resolver)findAlternateServiceFor(this.resolver);
+                               Resolver resolver = 
findAlternateServiceFor(Resolver.class);
                                if (resolver == null)
                                        deactivate();
                                this.resolver = resolver;
                        }
                }
-               else if (service instanceof ModelledResourceManager) {
-                       if (service.equals(modelledResourceManager)) {
-                               ModelledResourceManager modelledResourceManager 
= 
(ModelledResourceManager)findAlternateServiceFor(this.modelledResourceManager);
-                               if (modelledResourceManager == null)
-                                       deactivate();
-                               this.modelledResourceManager = 
modelledResourceManager;
-                       }
-               }
                else if (service instanceof IDirectoryFinder)
                        finders.remove(service);
-               else
+               else if (service instanceof Repository)
                        repositories.remove(service);
+        else {
+            if (service.equals(modelledResourceManager)) {
+                try {
+                    Class clazz = 
getClass().getClassLoader().loadClass(MODELLED_RESOURCE_MANAGER);
+                    Object manager = findAlternateServiceFor(clazz);
+                    if (manager == null) {
+                        modelledResourceManager = null;
+                        serviceModeller = null;
+                    } else {
+                        modelledResourceManager = service;
+                        serviceModeller = new 
ApplicationServiceModeller(service);
+                    }
+                } catch (ClassNotFoundException e) {
+                    // ignore
+                } catch (NoClassDefFoundError e) {
+                    // ignore
+                }
+            }
+        }
        }
        
        /* End ServiceTrackerCustomizer methods */

Added: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ApplicationServiceModeller.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ApplicationServiceModeller.java?rev=1587513&view=auto
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ApplicationServiceModeller.java
 (added)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ApplicationServiceModeller.java
 Tue Apr 15 11:04:40 2014
@@ -0,0 +1,95 @@
+/*
+ * 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.ArrayList;
+import java.util.List;
+
+import org.apache.aries.application.modelling.ExportedService;
+import org.apache.aries.application.modelling.ImportedService;
+import org.apache.aries.application.modelling.ModelledResourceManager;
+import org.apache.aries.application.modelling.ModellerException;
+import org.apache.aries.application.modelling.ParsedServiceElements;
+import org.apache.aries.util.filesystem.IDirectory;
+import org.osgi.namespace.service.ServiceNamespace;
+import org.osgi.resource.Capability;
+import org.osgi.resource.Namespace;
+import org.osgi.resource.Requirement;
+import org.osgi.resource.Resource;
+import org.osgi.service.subsystem.SubsystemException;
+
+public class ApplicationServiceModeller implements ServiceModeller {
+
+    private final ModelledResourceManager manager;
+
+    public ApplicationServiceModeller(Object manager) {
+        this.manager = (ModelledResourceManager) manager;
+    }
+
+    @Override
+    public ServiceModel computeRequirementsAndCapabilities(Resource resource, 
IDirectory directory) throws SubsystemException {
+        try {
+            ServiceModelImpl model = new ServiceModelImpl();
+            ParsedServiceElements elements = 
manager.getServiceElements(directory);
+            for (ExportedService service : elements.getServices()) {
+                model.capabilities.add(new BasicCapability.Builder()
+                        .namespace(ServiceNamespace.SERVICE_NAMESPACE)
+                        
.attribute(ServiceNamespace.CAPABILITY_OBJECTCLASS_ATTRIBUTE, new 
ArrayList<String>(service.getInterfaces()))
+                        .attributes(service.getServiceProperties())
+                        .resource(resource)
+                        .build());
+            }
+            for (ImportedService service : elements.getReferences()) {
+                StringBuilder builder = new StringBuilder("(&(")
+                        
.append(ServiceNamespace.CAPABILITY_OBJECTCLASS_ATTRIBUTE)
+                        .append('=')
+                        .append(service.getInterface())
+                        .append(')');
+                String filter = service.getFilter();
+                if (filter != null)
+                    builder.append(filter);
+                builder.append(')');
+                model.requirements.add(new BasicRequirement.Builder()
+                        .namespace(ServiceNamespace.SERVICE_NAMESPACE)
+                        .directive(Namespace.REQUIREMENT_FILTER_DIRECTIVE, 
builder.toString())
+                        .directive(
+                                Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE,
+                                service.isOptional() ? 
Namespace.RESOLUTION_OPTIONAL : Namespace.RESOLUTION_MANDATORY)
+                        .directive(
+                                Namespace.REQUIREMENT_CARDINALITY_DIRECTIVE,
+                                service.isMultiple() ? 
Namespace.CARDINALITY_MULTIPLE : Namespace.CARDINALITY_SINGLE)
+                        .resource(resource)
+                        .build());
+            }
+            return model;
+        } catch (ModellerException e) {
+            throw new SubsystemException(e);
+        }
+    }
+
+    static class ServiceModelImpl implements ServiceModel {
+        final List<Requirement> requirements = new ArrayList<Requirement>();
+        final List<Capability> capabilities = new ArrayList<Capability>();
+        @Override
+        public List<Requirement> getServiceRequirements() {
+            return requirements;
+        }
+
+        @Override
+        public List<Capability> getServiceCapabilities() {
+            return capabilities;
+        }
+    }
+
+}

Modified: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BundleResource.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BundleResource.java?rev=1587513&r1=1587512&r2=1587513&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BundleResource.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BundleResource.java
 Tue Apr 15 11:04:40 2014
@@ -19,17 +19,11 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.jar.JarEntry;
 import java.util.jar.JarOutputStream;
 
-import org.apache.aries.application.modelling.ExportedService;
-import org.apache.aries.application.modelling.ImportedService;
-import org.apache.aries.application.modelling.ModelledResourceManager;
-import org.apache.aries.application.modelling.ModellerException;
-import org.apache.aries.application.modelling.ParsedServiceElements;
 import org.apache.aries.subsystem.core.archive.BundleManifest;
 import 
org.apache.aries.subsystem.core.archive.BundleRequiredExecutionEnvironmentHeader;
 import org.apache.aries.subsystem.core.archive.BundleSymbolicNameHeader;
@@ -67,7 +61,7 @@ public class BundleResource implements R
        private final BundleManifest manifest;
        private final List<Requirement> requirements = new 
ArrayList<Requirement>();
        
-       public BundleResource(IFile content) throws ModellerException {
+       public BundleResource(IFile content) {
                this.content = content;
                IDirectory dir = content.isDirectory() ? content.convert() : 
content.convertNested();
                manifest = computeManifest(dir);
@@ -164,41 +158,6 @@ public class BundleResource implements R
                capabilities.add(new OsgiIdentityCapability(this, manifest));
        }
        
-       private void computeOsgiServiceCapabilities(Collection<ExportedService> 
services) {
-               for (ExportedService service : services)
-                       capabilities.add(new BasicCapability.Builder()
-                                       
.namespace(ServiceNamespace.SERVICE_NAMESPACE)
-                                       
.attribute(ServiceNamespace.CAPABILITY_OBJECTCLASS_ATTRIBUTE, new 
ArrayList<String>(service.getInterfaces()))
-                                       
.attributes(service.getServiceProperties())
-                                       .resource(this)
-                                       .build());
-       }
-       
-       private void computeOsgiServiceRequirements(Collection<ImportedService> 
services) {
-               for (ImportedService service : services) {
-                       StringBuilder builder = new StringBuilder("(&(")
-                                       
.append(ServiceNamespace.CAPABILITY_OBJECTCLASS_ATTRIBUTE)
-                                       .append('=')
-                                       .append(service.getInterface())
-                                       .append(')');
-                       String filter = service.getFilter();
-                       if (filter != null)
-                               builder.append(filter);
-                       builder.append(')');
-                       requirements.add(new BasicRequirement.Builder()
-                                       
.namespace(ServiceNamespace.SERVICE_NAMESPACE)
-                                       
.directive(Namespace.REQUIREMENT_FILTER_DIRECTIVE, builder.toString())
-                                       .directive(
-                                                       
Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE, 
-                                                       service.isOptional() ? 
Namespace.RESOLUTION_OPTIONAL : Namespace.RESOLUTION_MANDATORY)
-                                       .directive(
-                                                       
Namespace.REQUIREMENT_CARDINALITY_DIRECTIVE, 
-                                                       service.isMultiple() ? 
Namespace.CARDINALITY_MULTIPLE : Namespace.CARDINALITY_SINGLE)
-                                       .resource(this)
-                                       .build());
-               }
-       }
-       
        private void computeOsgiWiringBundleCapability() {
                // TODO The osgi.wiring.bundle capability should not be 
provided for fragments. Nor should the host capability.
                BundleSymbolicNameHeader bsnh = 
(BundleSymbolicNameHeader)manifest.getHeader(BundleSymbolicNameHeader.NAME);
@@ -225,19 +184,19 @@ public class BundleResource implements R
                        requirements.addAll(iph.toRequirements(this));
        }
        
-       private void computeRequirementsAndCapabilities(IDirectory directory) 
throws ModellerException {
+       private void computeRequirementsAndCapabilities(IDirectory directory) {
                // Compute all requirements and capabilities other than those 
related
                // to services.
                computeRequirementsOtherThanService();
                computeCapabilitiesOtherThanService();
                // Compute service requirements and capabilities if the optional
                // ModelledResourceManager service is present.
-               ModelledResourceManager manager = getModelledResourceManager();
-               if (manager == null)
+               ServiceModeller modeller = getServiceModeller();
+               if (modeller == null)
                        return;
-               ParsedServiceElements elements = 
manager.getServiceElements(directory);
-               computeOsgiServiceRequirements(elements.getReferences());
-               computeOsgiServiceCapabilities(elements.getServices());
+        ServiceModeller.ServiceModel model = 
modeller.computeRequirementsAndCapabilities(this, directory);
+        capabilities.addAll(model.getServiceCapabilities());
+        requirements.addAll(model.getServiceRequirements());
        }
        
        private void computeRequirementsOtherThanService() {
@@ -266,8 +225,8 @@ public class BundleResource implements R
                return name.substring(index + 1);
        }
 
-       private ModelledResourceManager getModelledResourceManager() {
-               return Activator.getInstance().getModelledResourceManager();
+       private ServiceModeller getServiceModeller() {
+               return Activator.getInstance().getServiceModeller();
        }
 
        private void jar(JarOutputStream out, String prefix, IDirectory 
directory) throws IOException {

Modified: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BundleRevisionResource.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BundleRevisionResource.java?rev=1587513&r1=1587512&r2=1587513&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BundleRevisionResource.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BundleRevisionResource.java
 Tue Apr 15 11:04:40 2014
@@ -14,28 +14,18 @@
 package org.apache.aries.subsystem.core.internal;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 
-import org.apache.aries.application.modelling.ExportedService;
-import org.apache.aries.application.modelling.ImportedService;
-import org.apache.aries.application.modelling.ModelledResourceManager;
-import org.apache.aries.application.modelling.ModellerException;
-import org.apache.aries.application.modelling.ParsedServiceElements;
 import org.osgi.framework.wiring.BundleRevision;
 import org.osgi.namespace.service.ServiceNamespace;
 import org.osgi.resource.Capability;
-import org.osgi.resource.Namespace;
 import org.osgi.resource.Requirement;
 import org.osgi.resource.Resource;
-import org.osgi.service.subsystem.SubsystemException;
 
 public class BundleRevisionResource implements Resource {
        private final BundleRevision revision;
        
-       private volatile ParsedServiceElements elements;
-       
        public BundleRevisionResource(BundleRevision revision) {
                if (revision == null)
                        throw new NullPointerException();
@@ -72,77 +62,24 @@ public class BundleRevisionResource impl
                return revision.getRequirements(namespace);
        }
        
-       private ParsedServiceElements computeParsedServiceElements() {
-               Activator activator = Activator.getInstance();
-               ModelledResourceManager manager = 
activator.getModelledResourceManager();
-               if (manager == null)
-                       return null;
-               BundleDirectory directory = new 
BundleDirectory(revision.getBundle());
-               try {
-                       return manager.getServiceElements(directory);
-               }
-               catch (ModellerException e) {
-                       throw new SubsystemException(e);
-               }
-       }
-       
        private List<Capability> computeServiceCapabilities() {
-               ParsedServiceElements elements = getParsedServiceElements();
-               if (elements == null)
-                       return Collections.emptyList();
-               Collection<? extends ExportedService> services = 
elements.getServices();
-               if (services.isEmpty())
-                       return Collections.emptyList();
-               List<Capability> result = new 
ArrayList<Capability>(services.size());
-               for (ExportedService service : services)
-                       result.add(new BasicCapability.Builder()
-                                       
.namespace(ServiceNamespace.SERVICE_NAMESPACE)
-                                       
.attribute(ServiceNamespace.CAPABILITY_OBJECTCLASS_ATTRIBUTE, new 
ArrayList<String>(service.getInterfaces()))
-                                       
.attributes(service.getServiceProperties())
-                                       .resource(this)
-                                       .build());
-               return result;
+        Activator activator = Activator.getInstance();
+        ServiceModeller modeller = activator.getServiceModeller();
+        if (modeller == null)
+            return null;
+        ServiceModeller.ServiceModel model =
+                modeller.computeRequirementsAndCapabilities(this, new 
BundleDirectory(revision.getBundle()));
+        return model.getServiceCapabilities();
        }
        
        private List<Requirement> computeServiceRequirements() {
-               ParsedServiceElements elements = getParsedServiceElements();
-               if (elements == null)
-                       return Collections.emptyList();
-               Collection<? extends ImportedService> services = 
elements.getReferences();
-               if (services.isEmpty())
-                       return Collections.emptyList();
-               List<Requirement> result = new 
ArrayList<Requirement>(services.size());
-               for (ImportedService service : services) {
-                       StringBuilder builder = new StringBuilder("(&(")
-                                       
.append(ServiceNamespace.CAPABILITY_OBJECTCLASS_ATTRIBUTE)
-                                       .append('=')
-                                       .append(service.getInterface())
-                                       .append(')');
-                       String filter = service.getFilter();
-                       if (filter != null)
-                               builder.append('(').append(filter).append(')');
-                       builder.append(')');
-                       result.add(new BasicRequirement.Builder()
-                                       
.namespace(ServiceNamespace.SERVICE_NAMESPACE)
-                                       
.directive(Namespace.REQUIREMENT_FILTER_DIRECTIVE, builder.toString())
-                                       .directive(
-                                                       
Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE, 
-                                                       service.isOptional() ? 
Namespace.RESOLUTION_OPTIONAL : Namespace.RESOLUTION_MANDATORY)
-                                       .resource(this)
-                                       .build());
-               }
-               return result;
+        Activator activator = Activator.getInstance();
+        ServiceModeller modeller = activator.getServiceModeller();
+        if (modeller == null)
+            return null;
+        ServiceModeller.ServiceModel model =
+                modeller.computeRequirementsAndCapabilities(this, new 
BundleDirectory(revision.getBundle()));
+        return model.getServiceRequirements();
        }
 
-       private ParsedServiceElements getParsedServiceElements() {
-               ParsedServiceElements result = elements;
-               if (result == null) {
-                       synchronized (this) {
-                               result = elements;
-                               if (result == null)
-                                       elements = result = 
computeParsedServiceElements();
-                       }
-               }
-               return result;
-       }
 }

Modified: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/InstallAction.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/InstallAction.java?rev=1587513&r1=1587512&r2=1587513&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/InstallAction.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/InstallAction.java
 Tue Apr 15 11:04:40 2014
@@ -19,7 +19,6 @@ import java.security.AccessControlContex
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 
-import org.apache.aries.application.modelling.ModellerException;
 import org.apache.aries.util.filesystem.IDirectory;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.InvalidSyntaxException;
@@ -110,7 +109,7 @@ public class InstallAction implements Pr
                
        }
        
-       private SubsystemResource createSubsystemResource(String location, 
IDirectory content, BasicSubsystem parent) throws URISyntaxException, 
IOException, ResolutionException, BundleException, InvalidSyntaxException, 
ModellerException {
+       private SubsystemResource createSubsystemResource(String location, 
IDirectory content, BasicSubsystem parent) throws URISyntaxException, 
IOException, ResolutionException, BundleException, InvalidSyntaxException {
                final SubsystemResource result = new 
SubsystemResource(location, content, parent);
                return result;
        }

Modified: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RawSubsystemResource.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RawSubsystemResource.java?rev=1587513&r1=1587512&r2=1587513&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RawSubsystemResource.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RawSubsystemResource.java
 Tue Apr 15 11:04:40 2014
@@ -29,7 +29,6 @@ import java.util.jar.Manifest;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import org.apache.aries.application.modelling.ModellerException;
 import org.apache.aries.subsystem.core.archive.DeploymentManifest;
 import org.apache.aries.subsystem.core.archive.Header;
 import org.apache.aries.subsystem.core.archive.ImportPackageHeader;
@@ -113,7 +112,7 @@ public class RawSubsystemResource implem
        private final Resource fakeImportServiceResource;
        private final SubsystemManifest subsystemManifest;
        
-       public RawSubsystemResource(String location, IDirectory content) throws 
URISyntaxException, IOException, ResolutionException, ModellerException {
+       public RawSubsystemResource(String location, IDirectory content) throws 
URISyntaxException, IOException, ResolutionException {
                id = SubsystemIdentifier.getNextId();
                this.location = new Location(location);
                if (content == null)
@@ -389,7 +388,7 @@ public class RawSubsystemResource implem
                return new 
DependencyCalculator(resources).calculateDependencies();
        }
        
-       private Collection<Resource> computeResources(IDirectory directory) 
throws IOException, URISyntaxException, ResolutionException, ModellerException {
+       private Collection<Resource> computeResources(IDirectory directory) 
throws IOException, URISyntaxException, ResolutionException {
                List<IFile> files = directory.listFiles();
                if (files.isEmpty())
                        return Collections.emptyList();

Added: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ServiceModeller.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ServiceModeller.java?rev=1587513&view=auto
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ServiceModeller.java
 (added)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ServiceModeller.java
 Tue Apr 15 11:04:40 2014
@@ -0,0 +1,33 @@
+/*
+ * 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.List;
+
+import org.apache.aries.util.filesystem.IDirectory;
+import org.osgi.resource.Capability;
+import org.osgi.resource.Requirement;
+import org.osgi.resource.Resource;
+import org.osgi.service.subsystem.SubsystemException;
+
+public interface ServiceModeller {
+
+    public static interface ServiceModel {
+        List<Requirement> getServiceRequirements();
+        List<Capability> getServiceCapabilities();
+    }
+
+    ServiceModel computeRequirementsAndCapabilities(Resource resource, 
IDirectory directory) throws SubsystemException;
+
+}

Modified: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java?rev=1587513&r1=1587512&r2=1587513&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java
 Tue Apr 15 11:04:40 2014
@@ -24,7 +24,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.aries.application.modelling.ModellerException;
 import org.apache.aries.subsystem.core.archive.Attribute;
 import org.apache.aries.subsystem.core.archive.DeployedContentHeader;
 import org.apache.aries.subsystem.core.archive.DeploymentManifest;
@@ -88,7 +87,7 @@ public class SubsystemResource implement
        private final Collection<Resource> sharedContent = new 
HashSet<Resource>();
        private final Collection<Resource> sharedDependencies = new 
HashSet<Resource>();
        
-       public SubsystemResource(String location, IDirectory content, 
BasicSubsystem parent) throws URISyntaxException, IOException, 
ResolutionException, BundleException, InvalidSyntaxException, ModellerException 
{
+       public SubsystemResource(String location, IDirectory content, 
BasicSubsystem parent) throws URISyntaxException, IOException, 
ResolutionException, BundleException, InvalidSyntaxException {
                this(new RawSubsystemResource(location, content), parent);
        }
        

Modified: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemUri.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemUri.java?rev=1587513&r1=1587512&r2=1587513&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemUri.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemUri.java
 Tue Apr 15 11:04:40 2014
@@ -80,7 +80,8 @@ public class SubsystemUri {
        public Version getVersion() {
                return version;
        }
-       
+
+    @SuppressWarnings("deprecation")
        public String toString() {
                StringBuilder builder = new StringBuilder("subsystem://");
                if (url != null) {

Modified: 
aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/archive/BundleRequiredExecutionEnvironmentHeaderTest.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/archive/BundleRequiredExecutionEnvironmentHeaderTest.java?rev=1587513&r1=1587512&r2=1587513&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/archive/BundleRequiredExecutionEnvironmentHeaderTest.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/test/java/org/apache/aries/subsystem/core/archive/BundleRequiredExecutionEnvironmentHeaderTest.java
 Tue Apr 15 11:04:40 2014
@@ -73,6 +73,7 @@ public class BundleRequiredExecutionEnvi
        }
        
        @Test
+    @SuppressWarnings("deprecation")
        public void testHeaderWithMultipleClauses() {
                String value = 
"CDC-1.0/Foundation-1.0,OSGi/Minimum-1.2,J2SE-1.4,JavaSE-1.6,AA/BB-1.7,V1-1.5/V2-1.6,MyEE-badVersion";
                String filter = "(|" +


Reply via email to