Author: pderop
Date: Sun May 23 21:58:28 2010
New Revision: 947502

URL: http://svn.apache.org/viewvc?rev=947502&view=rev
Log:
reworked BundleAdapter API in order to allow to provide adapter parameters by 
reusing the Service interface methods (setInterface, setImplementation, etc ...)

Added:
    
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterServiceImpl.java
      - copied, changed from r947379, 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterImpl.java
Removed:
    
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterImpl.java
Modified:
    
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivatorBase.java
    
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java
    
felix/trunk/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/BundleAdapterServiceBuilder.java

Modified: 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivatorBase.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivatorBase.java?rev=947502&r1=947501&r2=947502&view=diff
==============================================================================
--- 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivatorBase.java
 (original)
+++ 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivatorBase.java
 Sun May 23 21:58:28 2010
@@ -169,11 +169,8 @@ public abstract class DependencyActivato
         return m_manager.createResourceAdapterService(resourceFilter, 
propagate);
     }
     
-    public Service createBundleAdapterService(int bundleStateMask, String 
bundleFilter, Object adapterImplementation, String adapterInterface, Dictionary 
adapterProperties, boolean propagate) {
-        return m_manager.createBundleAdapterService(bundleStateMask, 
bundleFilter, adapterImplementation, adapterInterface, adapterProperties, 
propagate);
-    }
-    public Service createBundleAdapterService(int bundleStateMask, String 
bundleFilter, Object adapterImplementation, String[] adapterInterface, 
Dictionary adapterProperties, boolean propagate) {
-        return m_manager.createBundleAdapterService(bundleStateMask, 
bundleFilter, adapterImplementation, adapterInterface, adapterProperties, 
propagate);
+    public Service createBundleAdapterService(int bundleStateMask, String 
bundleFilter, boolean propagate) {
+        return m_manager.createBundleAdapterService(bundleStateMask, 
bundleFilter, propagate);
     }
 
     /**

Modified: 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java?rev=947502&r1=947501&r2=947502&view=diff
==============================================================================
--- 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java
 (original)
+++ 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyManager.java
 Sun May 23 21:58:28 2010
@@ -33,6 +33,7 @@ import org.apache.felix.dm.dependencies.
 import org.apache.felix.dm.impl.AdapterServiceImpl;
 import org.apache.felix.dm.impl.AspectServiceImpl;
 import org.apache.felix.dm.impl.BundleAdapterImpl;
+import org.apache.felix.dm.impl.BundleAdapterServiceImpl;
 import org.apache.felix.dm.impl.FactoryConfigurationAdapterImpl;
 import org.apache.felix.dm.impl.FactoryConfigurationAdapterMetaTypeImpl;
 import org.apache.felix.dm.impl.Logger;
@@ -46,6 +47,7 @@ import org.apache.felix.dm.impl.dependen
 import org.apache.felix.dm.impl.metatype.PropertyMetaDataImpl;
 import org.apache.felix.dm.resources.Resource;
 import org.apache.felix.dm.service.Service;
+import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.service.cm.ManagedServiceFactory;
@@ -270,31 +272,29 @@ public class DependencyManager {
      * It will also inherit all dependencies, and if you declare the original
      * service as a member it will be injected.
      * 
+     * <h3>Usage Example</h3>
+     * 
+     * <blockquote>
+     *  manager.createBundleAdapterService(Bundle.INSTALLED | Bundle.RESOLVED 
| Bundle.ACTIVE, 
+     *                                     
"(Bundle-SymbolicName=org.apache.felix.dependencymanager)",
+     *                                     true)
+     *         // The interface to use when registering adapter
+     *         .setInterface(AdapterService.class, new Hashtable() {{ 
put("foo", "bar"); }})
+     *         // the implementation of the adapter
+     *         .setImplementation(AdapterServiceImpl.class)
+     *         // The callback invoked on adapter lifecycle events
+     *         .setCallbacks(new Handler(), "init", "start", "stop", 
"destroy");
+     * <pre>
+     * </pre>
+     * </blockquote>
+     * 
      * @param bundleStateMask the bundle state mask to apply
      * @param bundleFilter the filter to apply to the bundle manifest
-     * @param adapterImplementation the implementation of the adapter
-     * @param adapterInterface the interface to use when registering adapters
-     * @param adapterProperties additional properties to use with the service 
registration
      * @param propagate <code>true</code> if properties from the bundle should 
be propagated to the service
      * @return a service that acts as a factory for generating bundle adapters
      */
-    public Service createBundleAdapterService(int bundleStateMask, String 
bundleFilter, Object adapterImplementation, String adapterInterface, Dictionary 
adapterProperties, boolean propagate) {
-        return createService()
-            .setImplementation(new BundleAdapterImpl(bundleStateMask, 
bundleFilter, adapterImplementation, adapterInterface, adapterProperties, 
propagate))
-            .add(createBundleDependency()
-                .setFilter(bundleFilter)
-                .setStateMask(bundleStateMask)
-                .setCallbacks("added", "removed")
-            );
-    }
-    public Service createBundleAdapterService(int bundleStateMask, String 
bundleFilter, Object adapterImplementation, String[] adapterInterface, 
Dictionary adapterProperties, boolean propagate) {
-        return createService()
-            .setImplementation(new BundleAdapterImpl(bundleStateMask, 
bundleFilter, adapterImplementation, adapterInterface, adapterProperties, 
propagate))
-            .add(createBundleDependency()
-                .setFilter(bundleFilter)
-                .setStateMask(bundleStateMask)
-                .setCallbacks("added", "removed")
-            );
+    public Service createBundleAdapterService(int bundleStateMask, String 
bundleFilter, boolean propagate) {
+        return new BundleAdapterServiceImpl(this, bundleStateMask, 
bundleFilter, propagate);
     }
 
     /**

Copied: 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterServiceImpl.java
 (from r947379, 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterImpl.java)
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterServiceImpl.java?p2=felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterServiceImpl.java&p1=felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterImpl.java&r1=947379&r2=947502&rev=947502&view=diff
==============================================================================
--- 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterImpl.java
 (original)
+++ 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/BundleAdapterServiceImpl.java
 Sun May 23 21:58:28 2010
@@ -18,80 +18,76 @@
  */
 package org.apache.felix.dm.impl;
 
-import java.util.Dictionary;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.Properties;
 
+import org.apache.felix.dm.DependencyManager;
 import org.apache.felix.dm.service.Service;
+import org.apache.felix.dm.service.ServiceStateListener;
 import org.osgi.framework.Bundle;
 
-public class BundleAdapterImpl extends AbstractDecorator {
-    private volatile Service m_service;
-    private final String m_resourceFilter;
-    private final Object m_adapterImplementation;
-    private final Object m_adapterInterface;
-    private final Dictionary m_adapterProperties;
-    private final boolean m_propagate;
-    private final int m_bundleStateMask;
-
-    public BundleAdapterImpl(int bundleStateMask, String bundleFilter, Object 
adapterImplementation, String adapterInterface, Dictionary adapterProperties, 
boolean propagate) {
-        m_bundleStateMask = bundleStateMask;
-        m_resourceFilter = bundleFilter;
-        m_adapterImplementation = adapterImplementation;
-        m_adapterInterface = adapterInterface;
-        m_adapterProperties = adapterProperties;
-        m_propagate = propagate;
+/**
+ * Bundle Adapter Service implementation. This class extends the FilterService 
in order to catch
+ * some Service methods for configuring actual adapter service implementation.
+ */
+public class BundleAdapterServiceImpl extends FilterService
+{
+    /**
+     * Creates a new Bundle Adapter Service implementation.
+     */
+    public BundleAdapterServiceImpl(DependencyManager dm, int bundleStateMask, 
String bundleFilter, boolean propagate)
+    {
+        super(dm.createService()); // This service will be filtered by our 
super class, allowing us to take control.
+        m_service.setImplementation(new BundleAdapterImpl(bundleStateMask, 
bundleFilter, propagate))
+                 .add(dm.createBundleDependency()
+                      .setFilter(bundleFilter)
+                      .setStateMask(bundleStateMask)
+                      .setCallbacks("added", "removed"));
     }
 
-    public BundleAdapterImpl(int bundleStateMask, String bundleFilter, Object 
adapterImplementation, String[] adapterInterfaces, Dictionary 
adapterProperties, boolean propagate) {
-        m_bundleStateMask = bundleStateMask;
-        m_resourceFilter = bundleFilter;
-        m_adapterImplementation = adapterImplementation;
-        m_adapterInterface = adapterInterfaces;
-        m_adapterProperties = adapterProperties;
-        m_propagate = propagate;
-    }       
-       
-       public Service createService(Object[] properties) {
-           Bundle bundle = (Bundle) properties[0];
-           Properties props = new Properties();
-        if (m_adapterProperties != null) {
-            Enumeration e = m_adapterProperties.keys();
-            while (e.hasMoreElements()) {
-                Object key = e.nextElement();
-                props.put(key, m_adapterProperties.get(key));
-            }
-        }
-        List dependencies = m_service.getDependencies();
-        // the first dependency is always the dependency on the bundle, which
-        // will be replaced with a more specific dependency below
-        dependencies.remove(0);
-        if (m_adapterInterface instanceof String) {
-            return m_manager.createService()
-                .setInterface((String) m_adapterInterface, props)
-                .setImplementation(m_adapterImplementation)
-                .add(dependencies)
-                .add(m_manager.createBundleDependency()
-                    .setBundle(bundle)
-                    .setPropagate(m_propagate)
-                    .setCallbacks(null, "changed", null)
-                    .setAutoConfig(true)
-                    .setRequired(true)
-                );
+    public class BundleAdapterImpl extends AbstractDecorator {
+        private final boolean m_propagate;
+        private final int m_bundleStateMask;
+        private final String m_bundleFilter;
+
+        public BundleAdapterImpl(int bundleStateMask, String bundleFilter, 
boolean propagate) {
+            m_bundleStateMask = bundleStateMask;
+            m_bundleFilter = bundleFilter;
+            m_propagate = propagate;
         }
-        else {
-            return m_manager.createService()
-                .setInterface((String[]) m_adapterInterface, props)
-                .setImplementation(m_adapterImplementation)
+        
+        public Service createService(Object[] properties) {
+            Bundle bundle = (Bundle) properties[0];
+            Properties props = new Properties();
+            if (m_serviceProperties != null) {
+                Enumeration e = m_serviceProperties.keys();
+                while (e.hasMoreElements()) {
+                    Object key = e.nextElement();
+                    props.put(key, m_serviceProperties.get(key));
+                }
+            }
+            List dependencies = m_service.getDependencies();
+            // the first dependency is always the dependency on the bundle, 
which
+            // will be replaced with a more specific dependency below
+            dependencies.remove(0);
+            Service service = m_manager.createService()
+                .setInterface(m_serviceInterfaces, props)
+                .setImplementation(m_serviceImpl)
+                .setFactory(m_factory, m_factoryCreateMethod) // if not set, 
no effect
+                .setComposition(m_compositionInstance, m_compositionMethod) // 
if not set, no effect
+                .setCallbacks(m_callbackObject, m_init, m_start, m_stop, 
m_destroy) // if not set, no effect
                 .add(dependencies)
                 .add(m_manager.createBundleDependency()
                     .setBundle(bundle)
                     .setPropagate(m_propagate)
                     .setCallbacks(null, "changed", null)
                     .setAutoConfig(true)
-                    .setRequired(true)
-                );
+                    .setRequired(true));
+            for (int i = 0; i < m_stateListeners.size(); i ++) {
+                service.addStateListener((ServiceStateListener) 
m_stateListeners.get(i));
+            }
+            return service;
         }
-       }
+    }
 }

Modified: 
felix/trunk/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/BundleAdapterServiceBuilder.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/BundleAdapterServiceBuilder.java?rev=947502&r1=947501&r2=947502&view=diff
==============================================================================
--- 
felix/trunk/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/BundleAdapterServiceBuilder.java
 (original)
+++ 
felix/trunk/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/BundleAdapterServiceBuilder.java
 Sun May 23 21:58:28 2010
@@ -47,7 +47,9 @@ public class BundleAdapterServiceBuilder
         String[] service = serviceMetaData.getStrings(Params.service, null);
         Dictionary<String, Object> properties = 
serviceMetaData.getDictionary(Params.properties, null);
         boolean propagate = 
"true".equals(serviceMetaData.getString(Params.propagate, "false"));
-        Service srv = dm.createBundleAdapterService(stateMask, filter, 
adapterImpl, service, properties, propagate);  
+        Service srv = dm.createBundleAdapterService(stateMask, filter, 
propagate)
+                        .setInterface(service, properties)
+                        .setImplementation(adapterImpl);
         setCommonServiceParams(srv, serviceMetaData);
         for (MetaData dependencyMetaData: serviceDependencies)
         {


Reply via email to