felix-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From pde...@apache.org
Subject svn commit: r947624 - in /felix/trunk/dependencymanager: core/src/main/java/org/apache/felix/dm/ core/src/main/java/org/apache/felix/dm/impl/ runtime/src/main/java/org/apache/felix/dm/runtime/ test/src/test/java/org/apache/felix/dm/test/
Date Mon, 24 May 2010 12:43:44 GMT
Author: pderop
Date: Mon May 24 12:43:44 2010
New Revision: 947624

URL: http://svn.apache.org/viewvc?rev=947624&view=rev
Log:
reworked FactoryConfigurationAdapter API

Added:
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java
Removed:
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterImpl.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterMetaTypeImpl.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/FactoryConfigurationAdapterServiceBuilder.java
    felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FactoryConfigurationAdapterTest.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=947624&r1=947623&r2=947624&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
Mon May 24 12:43:44 2010
@@ -173,74 +173,14 @@ public abstract class DependencyActivato
         return m_manager.createBundleAdapterService(bundleStateMask, bundleFilter, propagate);
     }
 
-    /**
-     * Creates a new Managed Service Factory Configuration Adapter. For each new Config Admin
factory configuration matching
-     * the factoryPid, an adapter will be created based on the adapter implementation class.
-     * The adapter will be registered with the specified interface, and with the specified
adapter service properties.
-     * Depending on the <code>propagate</code> parameter, every public factory
configuration properties 
-     * (which don't start with ".") will be propagated along with the adapter service properties.

-     * It will also inherit all dependencies.
-     * 
-     * @param factoryPid the pid matching the factory configuration
-     * @param update the adapter method name that will be notified when the factory configuration
is created/updated.
-     * @param adapterInterface the interface to use when registering adapters (can be either
a String, String array) 
-     * @param adapterImplementation the implementation of the adapter (can be a Class or
an Object instance)
-     * @param adapterProperties additional properties to use with the service registration
-     * @param propagate true if public factory configuration should be propagated to the
adapter service properties
-     * @return a service that acts as a factory for generating the managed service factory
configuration adapter
-     */
-    public Service createFactoryConfigurationAdapterService(String factoryPid, String update,
Object adapterImplementation, String adapterInterface, Dictionary adapterProperties, boolean
propagate) {
-        return m_manager.createFactoryConfigurationAdapterService(factoryPid, update, adapterImplementation,
adapterInterface, adapterProperties, propagate);
+    public Service createFactoryConfigurationAdapterService(String factoryPid, String update,
boolean propagate) {
+        return m_manager.createFactoryConfigurationAdapterService(factoryPid, update, propagate);
     }
     
-    /**
-     * Creates a new Managed Service Factory Configuration Adapter. For each new Config Admin
factory configuration matching
-     * the factoryPid, an adapter will be created based on the adapter implementation class.
-     * The adapter will be registered with the specified interface, and with the specified
adapter service properties.
-     * Depending on the <code>propagate</code> parameter, every public factory
configuration properties 
-     * (which don't start with ".") will be propagated along with the adapter service properties.

-     * It will also inherit all dependencies.
-     * 
-     * @param factoryPid the pid matching the factory configuration
-     * @param update the adapter method name that will be notified when the factory configuration
is created/updated.
-     * @param adapterInterfaces the interfaces to use when registering adapters (can be either
a String, String array) 
-     * @param adapterImplementation the implementation of the adapter (can be a Class or
an Object instance)
-     * @param adapterProperties additional properties to use with the service registration
-     * @param propagate true if public factory configuration should be propagated to the
adapter service properties
-     * @return a service that acts as a factory for generating the managed service factory
configuration adapter
-     */
-   public Service createFactoryConfigurationAdapterService(String factoryPid, String update,
Object adapterImplementation, String[] adapterInterfaces, Dictionary adapterProperties, boolean
propagate) {
-        return m_manager.createFactoryConfigurationAdapterService(factoryPid, update, adapterImplementation,
adapterInterfaces, adapterProperties, propagate);
-    }
-
-   /**
-    * Creates a new Managed Service Factory Configuration Adapter with meta type support.
For each new Config Admin factory configuration matching
-    * the factoryPid, an adapter will be created based on the adapter implementation class.
-    * The adapter will be registered with the specified interface, and with the specified
adapter service properties.
-    * Depending on the <code>propagate</code> parameter, every public factory
configuration properties 
-    * (which don't start with ".") will be propagated along with the adapter service properties.

-    * It will also inherit all dependencies.
-    * 
-    * @param factoryPid the pid matching the factory configuration
-    * @param update the adapter method name that will be notified when the factory configuration
is created/updated.
-    * @param adapterInterfaces the interfaces to use when registering adapters (can be either
a String, String array) 
-    * @param adapterImplementation the implementation of the adapter (can be a Class or an
Object instance)
-    * @param adapterProperties additional properties to use with the service registration
-    * @param propagate true if public factory configuration should be propagated to the adapter
service properties
-    * @param heading The label used to display the tab name (or section) where the properties
are displayed. Example: "Printer Service"
-    * @param desc A human readable description of the factory PID this configuration is associated
with. Example: "Configuration for the PrinterService bundle"
-    * @param localization Points to the basename of the Properties file that can localize
the Meta Type informations.
-    *        The default localization base name for the properties is OSGI-INF/l10n/bundle,
but can
-    *        be overridden by the manifest Bundle-Localization header (see core specification,
in section Localization on page 68).
-    *        You can specify a specific localization basename file using this parameter (e.g.
<code>"person"</code> 
-    *        will match person_du_NL.properties in the root bundle directory).
-    * @param propertiesMetaData Array of MetaData regarding configuration properties
-    * @return a service that acts as a factory for generating the managed service factory
configuration adapter
-    */
-   public Service createFactoryConfigurationAdapterService(String factoryPid, String update,
Object adapterImplementation, String[] adapterInterfaces, Dictionary adapterProperties, boolean
propagate, 
+   public Service createFactoryConfigurationAdapterService(String factoryPid, String update,
boolean propagate, 
        String heading, String desc, String localization, PropertyMetaData[] propertiesMetaData)

    {
-       return m_manager.createFactoryConfigurationAdapterService(factoryPid, update, adapterImplementation,
adapterInterfaces, adapterProperties, propagate,
+       return m_manager.createFactoryConfigurationAdapterService(factoryPid, update, propagate,
            heading, desc, localization, propertiesMetaData);
    }
 

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=947624&r1=947623&r2=947624&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
Mon May 24 12:43:44 2010
@@ -20,8 +20,6 @@ package org.apache.felix.dm;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Dictionary;
-import java.util.Hashtable;
 import java.util.List;
 
 import org.apache.felix.dm.dependencies.BundleDependency;
@@ -33,8 +31,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.BundleAdapterServiceImpl;
-import org.apache.felix.dm.impl.FactoryConfigurationAdapterImpl;
-import org.apache.felix.dm.impl.FactoryConfigurationAdapterMetaTypeImpl;
+import org.apache.felix.dm.impl.FactoryConfigurationAdapterServiceImpl;
 import org.apache.felix.dm.impl.Logger;
 import org.apache.felix.dm.impl.ResourceAdapterServiceImpl;
 import org.apache.felix.dm.impl.ServiceImpl;
@@ -47,8 +44,6 @@ import org.apache.felix.dm.impl.metatype
 import org.apache.felix.dm.resources.Resource;
 import org.apache.felix.dm.service.Service;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.service.cm.ManagedServiceFactory;
 
 /**
  * The dependency manager manages all services and their dependencies. Using 
@@ -303,81 +298,55 @@ public class DependencyManager {
      * (which don't start with ".") will be propagated along with the adapter service properties.

      * It will also inherit all dependencies.
      * 
-     * @param factoryPid the pid matching the factory configuration
-     * @param update the adapter method name that will be notified when the factory configuration
is created/updated.
-     * @param adapterInterface the interface to use when registering adapters (can be either
a String, String array) 
-     * @param adapterImplementation the implementation of the adapter (can be a Class or
an Object instance)
-     * @param adapterProperties additional properties to use with the service registration
-     * @param propagate true if public factory configuration should be propagated to the
adapter service properties
-     * @return a service that acts as a factory for generating the managed service factory
configuration adapter
-     */
-    public Service createFactoryConfigurationAdapterService(String factoryPid, String update,
Object adapterImplementation, String adapterInterface, Dictionary adapterProperties, boolean
propagate) {
-        Hashtable props = new Hashtable();
-        props.put(Constants.SERVICE_PID, factoryPid);
-        return createService()
-            .setInterface(ManagedServiceFactory.class.getName(), props)
-            .setImplementation(new FactoryConfigurationAdapterImpl(factoryPid, update, adapterImplementation,
adapterInterface, adapterProperties, propagate));
-    }
-    
-    /**
-     * Creates a new Managed Service Factory Configuration Adapter. For each new Config Admin
factory configuration matching
-     * the factoryPid, an adapter will be created based on the adapter implementation class.
-     * The adapter will be registered with the specified interface, and with the specified
adapter service properties.
-     * Depending on the <code>propagate</code> parameter, every public factory
configuration properties 
-     * (which don't start with ".") will be propagated along with the adapter service properties.

-     * It will also inherit all dependencies.
+     * <h3>Usage Example</h3>
      * 
+     * <blockquote>
+     *  manager.createFactoryConfigurationAdapterService("MyFactoryPid",  "update", true)
+     *         // The interface to use when registering adapter
+     *         .setInterface(AdapterService.class, new Hashtable() {{ put("foo", "bar");
}})
+     *         // the implementation of the adapter
+     *         .setImplementation(AdapterServiceImpl.class);
+     * <pre>
+     * </pre>
+     * </blockquote>
      * @param factoryPid the pid matching the factory configuration
      * @param update the adapter method name that will be notified when the factory configuration
is created/updated.
-     * @param adapterInterfaces the interfaces to use when registering adapters (can be either
a String, String array) 
-     * @param adapterImplementation the implementation of the adapter (can be a Class or
an Object instance)
-     * @param adapterProperties additional properties to use with the service registration
      * @param propagate true if public factory configuration should be propagated to the
adapter service properties
      * @return a service that acts as a factory for generating the managed service factory
configuration adapter
      */
-    public Service createFactoryConfigurationAdapterService(String factoryPid, String update,
Object adapterImplementation, String[] adapterInterfaces, Dictionary adapterProperties, boolean
propagate) {
-        Hashtable props = new Hashtable();
-        props.put(Constants.SERVICE_PID, factoryPid);
-        return createService()
-            .setInterface(ManagedServiceFactory.class.getName(), props)
-            .setImplementation(new FactoryConfigurationAdapterImpl(factoryPid, update, adapterImplementation,
adapterInterfaces, adapterProperties, propagate));
+    public Service createFactoryConfigurationAdapterService(String factoryPid, String update,
boolean propagate) {
+        return new FactoryConfigurationAdapterServiceImpl(this, factoryPid, update, propagate);
     }
-
+    
     /**
-     * Creates a new Managed Service Factory Configuration Adapter with meta type support.
For each new Config Admin factory configuration matching
-     * the factoryPid, an adapter will be created based on the adapter implementation class.
-     * The adapter will be registered with the specified interface, and with the specified
adapter service properties.
-     * Depending on the <code>propagate</code> parameter, every public factory
configuration properties 
+     * Creates a new Managed Service Factory Configuration Adapter with meta type support.
For each new Config Admin 
+     * factory configuration matching the factoryPid, an adapter will be created based on
the adapter implementation 
+     * class. The adapter will be registered with the specified interface, and with the specified
adapter service 
+     * properties. Depending on the <code>propagate</code> parameter, every public
factory configuration properties 
      * (which don't start with ".") will be propagated along with the adapter service properties.

      * It will also inherit all dependencies.
      * 
      * @param factoryPid the pid matching the factory configuration
      * @param update the adapter method name that will be notified when the factory configuration
is created/updated.
-     * @param adapterInterfaces the interfaces to use when registering adapters (can be either
a String, String array) 
-     * @param adapterImplementation the implementation of the adapter (can be a Class or
an Object instance)
-     * @param adapterProperties additional properties to use with the service registration
      * @param propagate true if public factory configuration should be propagated to the
adapter service properties
-     * @param heading The label used to display the tab name (or section) where the properties
are displayed. Example: "Printer Service"
-     * @param desc A human readable description of the factory PID this configuration is
associated with. Example: "Configuration for the PrinterService bundle"
+     * @param heading The label used to display the tab name (or section) where the properties
are displayed. 
+     *        Example: "Printer Service"
+     * @param desc A human readable description of the factory PID this configuration is
associated with. 
+     *        Example: "Configuration for the PrinterService bundle"
      * @param localization Points to the basename of the Properties file that can localize
the Meta Type informations.
      *        The default localization base name for the properties is OSGI-INF/l10n/bundle,
but can
-     *        be overridden by the manifest Bundle-Localization header (see core specification,
in section Localization on page 68).
-     *        You can specify a specific localization basename file using this parameter
(e.g. <code>"person"</code> 
-     *        will match person_du_NL.properties in the root bundle directory).
+     *        be overridden by the manifest Bundle-Localization header (see core specification,
in section Localization 
+     *        on page 68). You can specify a specific localization basename file using this
parameter 
+     *        (e.g. <code>"person"</code> will match person_du_NL.properties
in the root bundle directory).
      * @param propertiesMetaData Array of MetaData regarding configuration properties
      * @return a service that acts as a factory for generating the managed service factory
configuration adapter
      */
-    public Service createFactoryConfigurationAdapterService(String factoryPid, String update,
Object adapterImplementation, String[] adapterInterfaces, Dictionary adapterProperties, boolean
propagate, 
-                                                            String heading, String desc,
String localization, PropertyMetaData[] propertiesMetaData) 
+    public Service createFactoryConfigurationAdapterService(String factoryPid, String update,
boolean propagate, 
+                                                            String heading, String desc,
String localization,
+                                                            PropertyMetaData[] propertiesMetaData)

     {
-        Hashtable props = new Hashtable();
-        props.put(Constants.SERVICE_PID, factoryPid);
-        FactoryConfigurationAdapterMetaTypeImpl impl = 
-            new FactoryConfigurationAdapterMetaTypeImpl(factoryPid, update, adapterImplementation,
adapterInterfaces, adapterProperties, propagate,
-                                                        m_context, m_logger, heading, desc,
localization, propertiesMetaData);
-        return createService()
-            .setInterface(ManagedServiceFactory.class.getName(), props)
-            .setImplementation(impl);
+        return new FactoryConfigurationAdapterServiceImpl(this, factoryPid, update, propagate,
m_context, m_logger, 
+                                                          heading, desc, localization, propertiesMetaData);
       
     }
 
     /**

Added: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java?rev=947624&view=auto
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java
(added)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java
Mon May 24 12:43:44 2010
@@ -0,0 +1,296 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.felix.dm.impl;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.List;
+
+import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.service.Service;
+import org.apache.felix.dm.service.ServiceStateListener;
+import org.osgi.framework.Constants;
+import org.osgi.service.cm.ManagedServiceFactory;
+import org.apache.felix.dm.dependencies.PropertyMetaData;
+import org.apache.felix.dm.impl.metatype.MetaTypeProviderImpl;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.metatype.MetaTypeProvider;
+import org.osgi.service.metatype.ObjectClassDefinition;
+
+/**
+ * Factory configuration adapter service implementation. This class extends the FilterService
in order to catch
+ * some Service methods for configuring actual adapter service implementation.
+ */
+public class FactoryConfigurationAdapterServiceImpl extends FilterService
+{
+    public FactoryConfigurationAdapterServiceImpl(DependencyManager dm, String factoryPid,
String update, boolean propagate)
+    {
+        super(dm.createService()); // This service will be filtered by our super class, allowing
us to take control.
+        Hashtable props = new Hashtable();
+        props.put(Constants.SERVICE_PID, factoryPid);
+        m_service
+            .setInterface(ManagedServiceFactory.class.getName(), props)
+            .setImplementation(new AdapterImpl(factoryPid, update, propagate));
+    }
+    
+    public FactoryConfigurationAdapterServiceImpl(DependencyManager dm, String factoryPid,
String update, boolean propagate,
+                                                  BundleContext bctx, Logger logger, String
heading, String description, String localization, PropertyMetaData[] properyMetaData)
+    {
+        super(dm.createService()); // This service will be filtered by our super class, allowing
us to take control.
+        Hashtable props = new Hashtable();
+        props.put(Constants.SERVICE_PID, factoryPid);
+        String[] interfaces = new String[] {
+            ManagedServiceFactory.class.getName(),
+            MetaTypeProvider.class.getName()                                
+        };
+        m_service
+            .setInterface(interfaces, props)
+            .setImplementation(new MetaTypeAdapterImpl(factoryPid, update, propagate,
+                                                       bctx, logger, heading, description,
+                                                       localization, properyMetaData));
+    }
+    
+    /**
+     * Creates, updates, or removes a service, when a ConfigAdmin factory configuration is
created/updated or deleted.
+     */
+    public class AdapterImpl extends AbstractDecorator implements ManagedServiceFactory
+    {
+        // Our injected dependency manager
+        protected volatile DependencyManager m_dm;
+        
+        // Our Managed Service Factory PID
+        protected String m_factoryPid;
+        
+        // The adapter "update" method used to provide the configuration
+        protected String m_update;
+
+        // Tells if the CM config must be propagated along with the adapter service properties
+        protected boolean m_propagate;
+
+        /**
+         * Creates a new CM factory configuration adapter.
+         * 
+         * @param factoryPid
+         * @param updateMethod
+         * @param adapterInterface
+         * @param adapterImplementation
+         * @param adapterProperties
+         * @param propagate
+         */
+        public AdapterImpl(String factoryPid, String updateMethod, boolean propagate)
+        {
+            m_factoryPid = factoryPid;
+            m_update = updateMethod;
+            m_propagate = propagate;
+        }
+
+        /**
+         * Returns the managed service factory name.
+         */
+        public String getName()
+        {
+            return m_factoryPid;
+        }
+      
+        /**
+         * Method called from our superclass, when we need to create a service.
+         */
+        public Service createService(Object[] properties) {
+            Dictionary settings = (Dictionary) properties[0];     
+            Service newService = m_dm.createService();        
+            Object impl = null;
+            
+            try {
+                if (m_serviceImpl != null) {
+                    impl = (m_serviceImpl instanceof Class) ? 
+                        ((Class) m_serviceImpl).newInstance() : m_serviceImpl;
+                } else {
+                    impl = instantiateFromFactory(m_factory, m_factoryCreateMethod);
+                }
+                InvocationUtil.invokeCallbackMethod(impl, m_update, 
+                    new Class[][] {{ Dictionary.class }, {}}, 
+                    new Object[][] {{ settings }, {}});
+            }
+            
+            catch (Throwable t)
+            {
+               handleException(t);
+            }
+
+            // Merge adapter service properties, with CM settings 
+            Dictionary serviceProperties = m_propagate ? mergeSettings(m_serviceProperties,
settings) : m_serviceProperties;
+            newService.setInterface(m_serviceInterfaces, serviceProperties);
+            newService.setImplementation(impl);
+            List dependencies = m_service.getDependencies();
+            newService.add(dependencies);
+            newService.setComposition(m_compositionInstance, m_compositionMethod); // if
not set, no effect
+            newService.setCallbacks(m_callbackObject, m_init, m_start, m_stop, m_destroy);
// if not set, no effect
+            for (int i = 0; i < m_stateListeners.size(); i ++) {
+                newService.addStateListener((ServiceStateListener) m_stateListeners.get(i));
+            }
+
+            return newService;
+        }
+
+        /**
+         * Method called from our superclass, when we need to update a Service, because 
+         * the configuration has changed.
+         */
+        public void updateService(Object[] properties) 
+        {
+            Dictionary settings = (Dictionary) properties[0];
+            Service service = (Service) properties[1];
+            Object impl = service.getService();
+           
+            try
+            {
+                InvocationUtil.invokeCallbackMethod(impl, m_update, 
+                    new Class[][] {{ Dictionary.class }, {}}, 
+                    new Object[][] {{ settings }, {}});
+                if (m_serviceInterfaces != null && m_propagate == true) {
+                    settings = mergeSettings(m_serviceProperties, settings);
+                    service.setServiceProperties(settings);
+                }
+            }
+            
+            catch (Throwable t)
+            {
+                handleException(t);
+            }
+        }   
+
+        /**
+         * Merge CM factory configuration setting with the adapter service properties. The
private CM factory configuration 
+         * settings are ignored. A CM factory configuration property is private if its name
starts with a dot (".").
+         * 
+         * @param adapterProperties
+         * @param settings
+         * @return
+         */
+        private Dictionary mergeSettings(Dictionary adapterProperties, Dictionary settings)
+        {
+            Dictionary props = new Hashtable();
+            
+            if (adapterProperties != null) {
+                Enumeration keys = adapterProperties.keys();
+                while (keys.hasMoreElements()) {
+                    Object key = keys.nextElement();
+                    Object val = adapterProperties.get(key);
+                    props.put(key, val);
+                }
+            }
+            
+            Enumeration keys = settings.keys();
+            while (keys.hasMoreElements()) {
+                Object key = keys.nextElement();
+                if (! key.toString().startsWith(".")) {
+                    // public properties are propagated
+                    Object val = settings.get(key);
+                    props.put(key, val);
+                }
+            }
+            return props;
+        }
+    
+        private Object instantiateFromFactory(Object mFactory, String mFactoryCreateMethod)
+        {
+            Object factory = null;
+            if (m_factory instanceof Class) {
+                try {
+                    factory = createInstance((Class) m_factory);
+                }
+                catch (Throwable t) {
+                    handleException(t);
+                }
+            }
+            else {
+                factory = m_factory;
+            }
+
+            try {
+                return InvocationUtil.invokeMethod(factory, factory.getClass(), m_factoryCreateMethod,
+                                                   new Class[][] {{}}, new Object[][] {{}},
false);
+            }
+            catch (Throwable t) {
+                handleException(t);
+                return null;
+            }
+        }
+
+        private Object createInstance(Class clazz) throws SecurityException, NoSuchMethodException,
InstantiationException, IllegalAccessException {
+            Constructor constructor = clazz.getConstructor(new Class[] {});
+            constructor.setAccessible(true);
+            return clazz.newInstance();
+        }
+    
+        private void handleException(Throwable t) {
+            if (t instanceof InvocationTargetException)
+            {
+                // Our super class will check if the target exception is itself a ConfigurationException.
+                // In this case, it will simply re-thrown.
+                throw new RuntimeException(((InvocationTargetException) t).getTargetException());
+            } else if (t instanceof RuntimeException) {
+                throw (RuntimeException) t;
+            } else {
+                throw new RuntimeException(t);
+            }
+        }
+    }
+
+    
+    /**
+     * Extends AdapterImpl for MetaType support.
+     */
+    class MetaTypeAdapterImpl extends AdapterImpl implements MetaTypeProvider {
+        // Our MetaType Provider for describing our properties metadata
+        private MetaTypeProviderImpl m_metaType;
+        
+        public MetaTypeAdapterImpl(String factoryPid, String updateMethod, boolean propagate,
+                                   BundleContext bctx, Logger logger, String heading, 
+                                   String description, String localization,
+                                   PropertyMetaData[] properyMetaData)
+        {
+            super(factoryPid, updateMethod, propagate);
+            m_metaType = new MetaTypeProviderImpl(m_factoryPid, bctx, logger, null, this);
+            m_metaType.setName(heading);
+            m_metaType.setDescription(description);
+            if (localization != null) 
+            {
+                m_metaType.setLocalization(localization);
+            }
+            for (int i = 0; i < properyMetaData.length; i ++) 
+            {
+                m_metaType.add(properyMetaData[i]);
+            }
+        }
+        
+        public String[] getLocales()
+        {
+            return m_metaType.getLocales();
+        }
+
+        public ObjectClassDefinition getObjectClassDefinition(String id, String locale)
+        {
+            return m_metaType.getObjectClassDefinition(id, locale);
+        }
+    }    
+}

Modified: felix/trunk/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/FactoryConfigurationAdapterServiceBuilder.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/FactoryConfigurationAdapterServiceBuilder.java?rev=947624&r1=947623&r2=947624&view=diff
==============================================================================
--- felix/trunk/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/FactoryConfigurationAdapterServiceBuilder.java
(original)
+++ felix/trunk/dependencymanager/runtime/src/main/java/org/apache/felix/dm/runtime/FactoryConfigurationAdapterServiceBuilder.java
Mon May 24 12:43:44 2010
@@ -47,7 +47,9 @@ public class FactoryConfigurationAdapter
         String[] services = 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.createFactoryConfigurationAdapterService(factoryPid, updated, impl,
services, properties, propagate);
+        Service srv = dm.createFactoryConfigurationAdapterService(factoryPid, updated, propagate)
+                        .setInterface(services, properties)
+                        .setImplementation(impl);
         setCommonServiceParams(srv, serviceMetaData);
         for (MetaData dependencyMetaData: serviceDependencies)
         {

Modified: felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FactoryConfigurationAdapterTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FactoryConfigurationAdapterTest.java?rev=947624&r1=947623&r2=947624&view=diff
==============================================================================
--- felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FactoryConfigurationAdapterTest.java
(original)
+++ felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/FactoryConfigurationAdapterTest.java
Mon May 24 12:43:44 2010
@@ -71,12 +71,10 @@ public class FactoryConfigurationAdapter
 
         // Create an Adapter that will be instantiated, once the configuration is created.
         // This Adapter provides an AdapterService, and depends on an AdapterExtraDependency
service.
-        Service s2 = m.createFactoryConfigurationAdapterService("MyFactoryPid", 
-                                                                 "updated", 
-                                                                 Adapter.class, 
-                                                                 AdapterService.class.getName(),

-                                                                 new Properties() {{ put("foo",
"bar"); }},
-                                                                 true /* propagate CM settings
*/);
+        Service s2 = m.createFactoryConfigurationAdapterService("MyFactoryPid", "updated",
true /* propagate CM settings */)
+                      .setInterface(AdapterService.class.getName(), new Properties() {{ put("foo",
"bar"); }})
+                      .setImplementation(Adapter.class);
+
         s2.add(m.createServiceDependency()
             .setService(AdapterExtraDependency.class)
             .setRequired(true)



Mime
View raw message