code factorization: merged setServiceComposition/setServiceCallbacks methods into setCommonServiceParams method. Added factory/factoryMethod attributes in AspectService annotation

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@918881 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ComponentManager.java b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ComponentManager.java
index d324513..deaf0c0 100644
--- a/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ComponentManager.java
+++ b/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/ComponentManager.java
@@ -277,10 +277,7 @@
         }
 
         // Set service callbacks
-        setServiceCallbacks(service, parser);
-        
-        // Set composition
-        setServiceComposition(service, parser);
+        setCommonServiceParams(service, parser);
         
         // Set service interface with associated service properties
         Dictionary<String, String> serviceProperties = parser.getDictionary(
@@ -295,26 +292,17 @@
     }
 
     /**
-     * Set Service callbacks, if provided from our Component descriptor
+     * Set common Service parameters, if provided from our Component descriptor
      * @param service
      * @param parser
      */
-    private void setServiceCallbacks(Service service, DescriptorParser parser)
+    private void setCommonServiceParams(Service service, DescriptorParser parser)
     {
         String init = parser.getString(DescriptorParam.init, null);
         String start = parser.getString(DescriptorParam.start, null);
         String stop = parser.getString(DescriptorParam.stop, null);
         String destroy = parser.getString(DescriptorParam.destroy, null);
         service.setCallbacks(init, start, stop, destroy);
-    }
-
-    /**
-     * Sets Service Composition, if provided from our Component descriptor.
-     * @param service
-     * @param parser
-     */
-    private void setServiceComposition(Service service, DescriptorParser parser)
-    {
         String composition = parser.getString(DescriptorParam.composition, null);
         if (composition != null)
         {
@@ -332,14 +320,26 @@
     private Service createAspectService(Bundle b, DependencyManager dm, DescriptorParser parser)
         throws ClassNotFoundException
     {
+        Service service = null;
+
         Class<?> serviceInterface = b.loadClass(parser.getString(DescriptorParam.service));
         String serviceFilter = parser.getString(DescriptorParam.filter, null);
-        Class<?> aspectImplementation = b.loadClass(parser.getString(DescriptorParam.impl));
         Dictionary<String, String> aspectProperties = parser.getDictionary(DescriptorParam.properties, null);
-        int ranking = parser.getInt(DescriptorParam.ranking, 1);
-        Service service = dm.createAspectService(serviceInterface, serviceFilter, ranking, aspectImplementation, aspectProperties);
-        setServiceCallbacks(service, parser);
-        setServiceComposition(service, parser);
+        int ranking = parser.getInt(DescriptorParam.ranking, 1);          
+        String factory = parser.getString(DescriptorParam.factory, null);
+        if (factory == null)
+        {
+            String implClass = parser.getString(DescriptorParam.impl);
+            Object impl = b.loadClass(implClass);
+            service = dm.createAspectService(serviceInterface, serviceFilter, ranking, impl, aspectProperties);
+        }
+        else
+        {
+            String factoryMethod = parser.getString(DescriptorParam.factoryMethod, "create");
+            Class<?> factoryClass = b.loadClass(factory);
+            service = dm.createAspectService(serviceInterface, serviceFilter, ranking, factoryClass, factoryMethod, aspectProperties);
+        }               
+        setCommonServiceParams(service, parser);
         return service;
     }
 
@@ -360,8 +360,7 @@
         String adapteeFilter = parser.getString(DescriptorParam.adapteeFilter, null);
      
         Service service = dm.createAdapterService(adapteeService, adapteeFilter, adapterService, adapterImpl, adapterProperties);
-        setServiceCallbacks(service, parser);
-        setServiceComposition(service, parser);
+        setCommonServiceParams(service, parser);
         return service;
     }
 
@@ -382,8 +381,7 @@
         Dictionary<String, String> properties = parser.getDictionary(DescriptorParam.properties, null);
         boolean propagate = "true".equals(parser.getString(DescriptorParam.propagate, "false"));
         Service srv = dm.createBundleAdapterService(stateMask, filter, adapterImpl, service, properties, propagate);  
-        setServiceCallbacks(srv, parser);
-        setServiceComposition(srv, parser);
+        setCommonServiceParams(srv, parser);
         return srv;
     }