You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ma...@apache.org on 2010/08/09 15:37:03 UTC

svn commit: r983639 - in /felix/trunk/dependencymanager: core/ core/src/main/java/org/apache/felix/dm/ core/src/main/java/org/apache/felix/dm/impl/ core/src/main/java/org/apache/felix/dm/impl/dependencies/ test/src/test/java/org/apache/felix/dm/test/

Author: marrs
Date: Mon Aug  9 13:37:02 2010
New Revision: 983639

URL: http://svn.apache.org/viewvc?rev=983639&view=rev
Log:
Several smaller bugfixes and performance updates for resources. Added a test that demonstrates how to create a custom dependency (and did some refactorings to make that easier).

Added:
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivation.java
      - copied, changed from r960838, felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyActivation.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyService.java
      - copied, changed from r960838, felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyService.java
    felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/CustomDependencyTest.java
Removed:
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyActivation.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyService.java
Modified:
    felix/trunk/dependencymanager/core/pom.xml
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/Dependency.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceDependency.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceHandler.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceUtil.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/Service.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterServiceImpl.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FilterService.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/BundleDependencyImpl.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ConfigurationDependencyImpl.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyBase.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ResourceDependencyImpl.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/TemporalServiceDependencyImpl.java

Modified: felix/trunk/dependencymanager/core/pom.xml
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/pom.xml?rev=983639&r1=983638&r2=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/pom.xml (original)
+++ felix/trunk/dependencymanager/core/pom.xml Mon Aug  9 13:37:02 2010
@@ -55,9 +55,9 @@
             <Export-Package>org.apache.felix.dm;version="3.0.0"</Export-Package>
             <Import-Package>!org.apache.felix.dm,*</Import-Package>
 	        <Private-Package>org.apache.felix.dm.impl,org.apache.felix.dm.impl.dependencies,org.apache.felix.dm.impl.tracker,org.apache.felix.dm.impl.metatype</Private-Package>
-	        <!-- Uncomment this line to include source code in the bundle.
+	        <!-- Uncomment this line to include source code in the bundle.-->
             <Include-Resource>src/main/java</Include-Resource>
-            -->
+            <!-- -->
           </instructions>
         </configuration>
       </plugin>

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/Dependency.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/Dependency.java?rev=983639&r1=983638&r2=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/Dependency.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/Dependency.java Mon Aug  9 13:37:02 2010
@@ -20,7 +20,6 @@ package org.apache.felix.dm;
 
 import java.util.Dictionary;
 
-import org.apache.felix.dm.impl.dependencies.DependencyService;
 
 /**
  * Generic dependency for a service. A dependency can be required or not.

Copied: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivation.java (from r960838, felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyActivation.java)
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivation.java?p2=felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivation.java&p1=felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyActivation.java&r1=960838&r2=983639&rev=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyActivation.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyActivation.java Mon Aug  9 13:37:02 2010
@@ -1,4 +1,22 @@
-package org.apache.felix.dm.impl.dependencies;
+/*
+ * 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;
 
 public interface DependencyActivation {
   public void start(DependencyService service);

Copied: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyService.java (from r960838, felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyService.java)
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyService.java?p2=felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyService.java&p1=felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyService.java&r1=960838&r2=983639&rev=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyService.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/DependencyService.java Mon Aug  9 13:37:02 2010
@@ -16,10 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.dm.impl.dependencies;
+package org.apache.felix.dm;
 
-import org.apache.felix.dm.Dependency;
-import org.apache.felix.dm.Service;
 
 public interface DependencyService {
     /**

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceDependency.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceDependency.java?rev=983639&r1=983638&r2=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceDependency.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceDependency.java Mon Aug  9 13:37:02 2010
@@ -21,7 +21,7 @@ package org.apache.felix.dm;
 import java.net.URL;
 
 
-public interface ResourceDependency extends Dependency, ResourceHandler {
+public interface ResourceDependency extends Dependency, ServiceComponentDependency, ResourceHandler {
     /**
      * Sets the callbacks for this service. These callbacks can be used as hooks whenever a
      * dependency is added or removed. When you specify callbacks, the auto configuration 

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceHandler.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceHandler.java?rev=983639&r1=983638&r2=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceHandler.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceHandler.java Mon Aug  9 13:37:02 2010
@@ -26,6 +26,8 @@ import java.net.URL;
 public interface ResourceHandler {
     /** Name of the property that's used to describe the filter condition for a resource. */
     public static final String FILTER = "filter";
+    /** Exact URL that this handler is looking for. Can be used instead of a filter to be very explicit about the resource you're looking for. */
+    public static final String URL = "url";
     
     /** The host part of the URL. */
     public static final String HOST = "host";

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceUtil.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceUtil.java?rev=983639&r1=983638&r2=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceUtil.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/ResourceUtil.java Mon Aug  9 13:37:02 2010
@@ -1,3 +1,21 @@
+/*
+ * 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;
 
 import java.net.URL;

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/Service.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/Service.java?rev=983639&r1=983638&r2=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/Service.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/Service.java Mon Aug  9 13:37:02 2010
@@ -238,4 +238,39 @@ public interface Service {
 	 * Returns the dependency manager associated with this service.
 	 */
 	public DependencyManager getDependencyManager();
+
+	/**
+	 * Configures auto configuration of injected classes in the service instance.
+	 * The following injections are currently performed, unless you explicitly
+	 * turn them off:
+	 * <dl>
+	 * <dt>BundleContext</dt><dd>the bundle context of the bundle</dd>
+     * <dt>ServiceRegistration</dt><dd>the service registration used to register your service</dd>
+     * <dt>DependencyManager</dt><dd>the dependency manager instance</dd>
+     * <dt>Service</dt><dd>the service instance of the dependency manager</dd>
+	 * </dl>
+	 * 
+	 * @param clazz the class (from the list above)
+	 * @param autoConfig <code>false</code> to turn off auto configuration
+	 */
+    public Service setAutoConfig(Class clazz, boolean autoConfig);
+    
+    /**
+     * Configures auto configuration of injected classes in the service instance.
+     * 
+     * @param clazz the class (from the list above)
+     * @param instanceName the name of the instance to inject the class into
+     * @see setAutoConfig(Class, boolean)
+     */
+    public Service setAutoConfig(Class clazz, String instanceName);
+
+    /**
+     * Returns the status of auto configuration of the specified class.
+     */
+    public boolean getAutoConfig(Class clazz);
+    
+    /**
+     * Returns the instance variable name of auto configuration of the specified class.
+     */
+    public String getAutoConfigInstance(Class clazz);
 }

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java?rev=983639&r1=983638&r2=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AbstractDecorator.java Mon Aug  9 13:37:02 2010
@@ -30,7 +30,9 @@ import org.apache.felix.dm.DependencyMan
 import org.apache.felix.dm.Service;
 import org.apache.felix.dm.ServiceStateListener;
 import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.cm.ConfigurationException;
 
 public abstract class AbstractDecorator  {
@@ -233,4 +235,21 @@ public abstract class AbstractDecorator 
         }
         m_services.clear();
     }    
+    
+    public void configureAutoConfigState(Service target, Service source) {
+        configureAutoConfigState(target, source, BundleContext.class);
+        configureAutoConfigState(target, source, ServiceRegistration.class);
+        configureAutoConfigState(target, source, DependencyManager.class);
+        configureAutoConfigState(target, source, Service.class);
+    }
+
+    private void configureAutoConfigState(Service target, Service source, Class clazz) {
+        String name = source.getAutoConfigInstance(clazz);
+        if (name != null) {
+            target.setAutoConfig(clazz, name);
+        }
+        else {
+            target.setAutoConfig(clazz, source.getAutoConfig(clazz));
+        }
+    }
 }

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterServiceImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterServiceImpl.java?rev=983639&r1=983638&r2=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterServiceImpl.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AdapterServiceImpl.java Mon Aug  9 13:37:02 2010
@@ -85,6 +85,8 @@ public class AdapterServiceImpl extends 
                      .setService(m_adapteeInterface, ref)
                      .setRequired(true));
             
+            configureAutoConfigState(service, m_service);
+            
             for (int i = 0; i < dependencies.size(); i++) {
                 service.add(((Dependency) dependencies.get(i)).createCopy());
             }

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java?rev=983639&r1=983638&r2=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/AspectServiceImpl.java Mon Aug  9 13:37:02 2010
@@ -88,6 +88,8 @@ public class AspectServiceImpl extends F
                 .setCallbacks(m_callbackObject, m_init, m_start, m_stop, m_destroy) // if not set, no effect
                 .add(getAspectDependency());
             
+            configureAutoConfigState(service, m_service);
+            
             for (int i = 0; i < dependencies.size(); i++) {
                 service.add(((Dependency) dependencies.get(i)).createCopy());
             }

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FilterService.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FilterService.java?rev=983639&r1=983638&r2=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FilterService.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FilterService.java Mon Aug  9 13:37:02 2010
@@ -260,4 +260,22 @@ public class FilterService implements Se
     public DependencyManager getDependencyManager() {
         return m_service.getDependencyManager();
     }
+
+    public Service setAutoConfig(Class clazz, boolean autoConfig) {
+        m_service.setAutoConfig(clazz, autoConfig);
+        return this;
+    }
+
+    public Service setAutoConfig(Class clazz, String instanceName) {
+        m_service.setAutoConfig(clazz, instanceName);
+        return this;
+    }
+    
+    public boolean getAutoConfig(Class clazz) {
+        return m_service.getAutoConfig(clazz);
+    }
+    
+    public String getAutoConfigInstance(Class clazz) {
+        return m_service.getAutoConfigInstance(clazz);
+    };
 }
\ No newline at end of file

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java?rev=983639&r1=983638&r2=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/ServiceImpl.java Mon Aug  9 13:37:02 2010
@@ -33,13 +33,13 @@ import java.util.Map;
 import java.util.Properties;
 
 import org.apache.felix.dm.Dependency;
+import org.apache.felix.dm.DependencyActivation;
 import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.DependencyService;
 import org.apache.felix.dm.Service;
 import org.apache.felix.dm.ServiceComponent;
 import org.apache.felix.dm.ServiceComponentDependency;
 import org.apache.felix.dm.ServiceStateListener;
-import org.apache.felix.dm.impl.dependencies.DependencyActivation;
-import org.apache.felix.dm.impl.dependencies.DependencyService;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 
@@ -768,13 +768,24 @@ public class ServiceImpl implements Serv
     	}
     }
 
-    public void setAutoConfig(Class clazz, boolean autoConfig) {
+    public synchronized Service setAutoConfig(Class clazz, boolean autoConfig) {
         m_autoConfig.put(clazz, Boolean.valueOf(autoConfig));
+        return this;
     }
     
-    public void setAutoConfig(Class clazz, String instanceName) {
+    public synchronized Service setAutoConfig(Class clazz, String instanceName) {
         m_autoConfig.put(clazz, Boolean.valueOf(instanceName != null));
         m_autoConfigInstance.put(clazz, instanceName);
+        return this;
+    }
+    
+    public boolean getAutoConfig(Class clazz) {
+        Boolean result = (Boolean) m_autoConfig.get(clazz);
+        return (result != null && result.booleanValue());
+    }
+    
+    public String getAutoConfigInstance(Class clazz) {
+        return (String) m_autoConfigInstance.get(clazz);
     }
     
     private void configureService(State state) {

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/BundleDependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/BundleDependencyImpl.java?rev=983639&r1=983638&r2=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/BundleDependencyImpl.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/BundleDependencyImpl.java Mon Aug  9 13:37:02 2010
@@ -26,6 +26,7 @@ import java.util.List;
 
 import org.apache.felix.dm.BundleDependency;
 import org.apache.felix.dm.Dependency;
+import org.apache.felix.dm.DependencyService;
 import org.apache.felix.dm.ServiceComponentDependency;
 import org.apache.felix.dm.impl.DefaultNullObject;
 import org.apache.felix.dm.impl.InvocationUtil;

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ConfigurationDependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ConfigurationDependencyImpl.java?rev=983639&r1=983638&r2=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ConfigurationDependencyImpl.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ConfigurationDependencyImpl.java Mon Aug  9 13:37:02 2010
@@ -28,6 +28,8 @@ import java.util.Set;
 
 import org.apache.felix.dm.ConfigurationDependency;
 import org.apache.felix.dm.Dependency;
+import org.apache.felix.dm.DependencyActivation;
+import org.apache.felix.dm.DependencyService;
 import org.apache.felix.dm.PropertyMetaData;
 import org.apache.felix.dm.ServiceComponentDependency;
 import org.apache.felix.dm.impl.InvocationUtil;

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyBase.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyBase.java?rev=983639&r1=983638&r2=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyBase.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/DependencyBase.java Mon Aug  9 13:37:02 2010
@@ -1,6 +1,7 @@
 package org.apache.felix.dm.impl.dependencies;
 
 import org.apache.felix.dm.Dependency;
+import org.apache.felix.dm.DependencyActivation;
 import org.apache.felix.dm.impl.Logger;
 
 public abstract class DependencyBase implements Dependency, DependencyActivation {

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ResourceDependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ResourceDependencyImpl.java?rev=983639&r1=983638&r2=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ResourceDependencyImpl.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ResourceDependencyImpl.java Mon Aug  9 13:37:02 2010
@@ -26,6 +26,8 @@ import java.util.List;
 import java.util.Properties;
 
 import org.apache.felix.dm.Dependency;
+import org.apache.felix.dm.DependencyActivation;
+import org.apache.felix.dm.DependencyService;
 import org.apache.felix.dm.ResourceDependency;
 import org.apache.felix.dm.ResourceHandler;
 import org.apache.felix.dm.Service;
@@ -95,10 +97,14 @@ public class ResourceDependencyImpl exte
 	        }
 	    }
 	    if (needsStarting) {
-	        Properties props = null;
-	        if (m_resourceFilter != null) {
+	        Dictionary props = null;
+	        if (m_trackedResource != null) {
+                props = new Properties();
+                props.put(ResourceHandler.URL, m_trackedResource);
+	        }
+	        else if (m_resourceFilter != null) {
 	            props = new Properties();
-	            props.setProperty(ResourceHandler.FILTER, m_resourceFilter);
+	            props.put(ResourceHandler.FILTER, m_resourceFilter);
 	        }
 	        m_registration = m_context.registerService(ResourceHandler.class.getName(), this, props);
 	    }

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java?rev=983639&r1=983638&r2=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/ServiceDependencyImpl.java Mon Aug  9 13:37:02 2010
@@ -32,6 +32,7 @@ import java.util.Properties;
 import java.util.Set;
 
 import org.apache.felix.dm.Dependency;
+import org.apache.felix.dm.DependencyService;
 import org.apache.felix.dm.ServiceComponentDependency;
 import org.apache.felix.dm.ServiceDependency;
 import org.apache.felix.dm.impl.DefaultNullObject;

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/TemporalServiceDependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/TemporalServiceDependencyImpl.java?rev=983639&r1=983638&r2=983639&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/TemporalServiceDependencyImpl.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/dependencies/TemporalServiceDependencyImpl.java Mon Aug  9 13:37:02 2010
@@ -16,6 +16,7 @@ import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 
 import org.apache.felix.dm.DependencyActivatorBase;
+import org.apache.felix.dm.DependencyService;
 import org.apache.felix.dm.TemporalServiceDependency;
 import org.apache.felix.dm.impl.Logger;
 import org.osgi.framework.BundleContext;

Added: felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/CustomDependencyTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/CustomDependencyTest.java?rev=983639&view=auto
==============================================================================
--- felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/CustomDependencyTest.java (added)
+++ felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/CustomDependencyTest.java Mon Aug  9 13:37:02 2010
@@ -0,0 +1,202 @@
+package org.apache.felix.dm.test;
+
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.provision;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.List;
+
+import org.apache.felix.dm.Dependency;
+import org.apache.felix.dm.DependencyActivation;
+import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.DependencyService;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.Configuration;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.osgi.framework.BundleContext;
+
+
+@RunWith(JUnit4TestRunner.class)
+public class CustomDependencyTest extends Base {
+    @Configuration
+    public static Option[] configuration() {
+        return options(
+            provision(
+                mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version("4.1.0"),
+                mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
+            )
+        );
+    }    
+
+    @Test
+    public void testCustomDependency(BundleContext context) {
+        Ensure e = new Ensure();
+        DependencyManager dm = new DependencyManager(context);
+        
+        // create a toggle that can be used to turn on/off our custom dependency
+        Toggle toggle = new Toggle();
+        
+        // create a service that has our custom dependency as its only dependency
+        dm.add(dm.createService()
+            .setImplementation(new ServiceImpl(e))
+            .add(new CustomDependency(toggle))
+            );
+        
+        // make the toggle, therefore the dependency, therefore the service available
+        toggle.setAvailable(true);
+        e.waitForStep(1, 1000);
+        
+        // make the toggle unavailable again
+        toggle.setAvailable(false);
+        e.waitForStep(2, 1000);
+    }
+    
+    /** A toggle implementation that invokes a callback on every change. */
+    public static class Toggle {
+        private boolean m_isAvailable;
+        private Runnable m_runnable;
+        
+        public boolean isAvailable() {
+            return m_isAvailable;
+        }
+        public void setAvailable(boolean isAvailable) {
+            boolean changed = m_isAvailable != isAvailable;
+            m_isAvailable = isAvailable;
+            Runnable r = m_runnable;
+            if (r != null && changed) {
+                r.run();
+            }
+        }
+        public void setRunnable(Runnable runnable) {
+            m_runnable = runnable;
+        }
+    }
+    
+    /** Our custom dependency, which is less configurable than most, but that's okay for this test. */
+    public static class CustomDependency implements Dependency, DependencyActivation, Runnable {
+        private final Toggle m_toggle;
+        private final List m_services = new ArrayList();
+
+        public CustomDependency(Toggle toggle) {
+            m_toggle = toggle;
+        }
+        
+        public Dependency createCopy() {
+            return new CustomDependency(m_toggle);
+        }
+
+        public Object getAutoConfigInstance() {
+            return "" + m_toggle.isAvailable();
+        }
+
+        public String getAutoConfigName() {
+            return null;
+        }
+
+        public Class getAutoConfigType() {
+            return String.class;
+        }
+
+        public Dictionary getProperties() {
+            return null;
+        }
+        
+        public void run() {
+            // invoked on every change
+            if (m_toggle.isAvailable()) {
+                Object[] services = m_services.toArray();
+                for (int i = 0; i < services.length; i++) {
+                    DependencyService ds = (DependencyService) services[i];
+                    ds.dependencyAvailable(this);
+                    if (!isRequired()) {
+                        invokeAdded(ds);
+                    }
+                }
+            }
+            else {
+                Object[] services = m_services.toArray();
+                for (int i = 0; i < services.length; i++) {
+                    DependencyService ds = (DependencyService) services[i];
+                    ds.dependencyUnavailable(this);
+                    if (!isRequired()) {
+                        invokeRemoved(ds);
+                    }
+                }
+            }
+        }
+
+        public void invokeAdded(DependencyService service) {
+            invoke(service, "added");
+        }
+
+        public void invokeRemoved(DependencyService service) {
+            invoke(service, "removed");
+        }
+        
+        public void invoke(DependencyService dependencyService, String name) {
+            if (name != null) {
+                dependencyService.invokeCallbackMethod(getCallbackInstances(dependencyService), name,
+                  new Class[][] {{String.class}, {Object.class}, {}},
+                  new Object[][] {{getAutoConfigInstance()}, {getAutoConfigInstance()}, {}}
+                );
+            }
+        }
+        
+        private synchronized Object[] getCallbackInstances(DependencyService dependencyService) {
+            return dependencyService.getCompositionInstances();
+        }
+
+        public boolean isAutoConfig() {
+            return true;
+        }
+
+        public boolean isAvailable() {
+            return m_toggle.isAvailable();
+        }
+
+        public boolean isInstanceBound() {
+            return false;
+        }
+
+        public boolean isPropagated() {
+            return false;
+        }
+
+        public boolean isRequired() {
+            return true;
+        }
+
+        public void start(DependencyService service) {
+            synchronized (this) {
+                m_services.add(service);
+            }
+            m_toggle.setRunnable(this);
+        }
+
+        public void stop(DependencyService service) {
+            synchronized (this) {
+                m_services.remove(service);
+            }
+            m_toggle.setRunnable(null);
+        }
+    }
+    
+    public static class ServiceImpl {
+        private final Ensure m_e;
+        public ServiceImpl(Ensure e) {
+            m_e = e;
+        }
+        public void init() {
+            System.out.println("init");
+            m_e.step(1);
+        }
+        public void destroy() {
+            System.out.println("destroy");
+            m_e.step(2);
+        }
+    }
+}