You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pd...@apache.org on 2018/09/26 16:45:39 UTC

svn commit: r1842034 [11/11] - in /felix/trunk/dependencymanager: ./ .gradle-wrapper/ cnf/ cnf/buildrepo/ cnf/ext/ cnf/localrepo/ cnf/localrepo/org.apache.felix.gogo.command/ cnf/localrepo/org.apache.felix.gogo.jline/ cnf/localrepo/org.apache.felix.gog...

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/InvocationUtil.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/InvocationUtil.java?rev=1842034&r1=1842033&r2=1842034&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/InvocationUtil.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/InvocationUtil.java Wed Sep 26 16:45:35 2018
@@ -18,6 +18,7 @@
  */
 package org.apache.felix.dm.impl;
 
+import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
@@ -39,6 +40,11 @@ import org.osgi.service.cm.Configuration
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
 public class InvocationUtil {
+	/**
+	 * Constant Used to get empty constructor by reflection. 
+	 */
+    private static final Class<?>[] VOID = new Class[] {};
+    
     private static final Map<Key, Method> m_methodCache;
     static {
         int size = 4096;
@@ -61,6 +67,31 @@ public class InvocationUtil {
     }
     
     /**
+     * Represents a component instance
+     */
+    public static final class ComponentInstance {
+    	/**
+    	 * The component instance
+    	 */
+    	public final Object m_instance;
+    	
+    	/**
+    	 * The index of the consutror used when creating the component instance
+    	 */
+    	public final int m_ctorIndex;
+    	
+    	/**
+    	 * creates a component instance
+    	 * @param instance the component instance
+    	 * @param ctorIndex the index of the CallbackTypeDef used when creating the component instance
+    	 */
+    	public ComponentInstance(Object instance, int ctorIndex) {
+    		m_instance = instance;
+    		m_ctorIndex = ctorIndex;
+    	}
+    }
+    
+    /**
      * Invokes a callback method on an instance. The code will search for a callback method with
      * the supplied name and any of the supplied signatures in order, invoking the first one it finds.
      * 
@@ -224,6 +255,27 @@ public class InvocationUtil {
     }
 
     /**
+     * Gets a callback method on a class. The code will search for a callback method with
+     * the supplied name and any of the supplied signatures in order, get the first one it finds.
+     * 
+     * @param instance the instance to invoke the method on
+     * @param methodName the name of the method
+     * @param signatures the ordered list of signatures to look for
+     * @return the method found, or null
+     */
+    public static Method getCallbackMethod(Class<?> type, String methodName, Class<?>[][] signatures) {
+        Class<?> currentClazz = type;
+        while (currentClazz != null && currentClazz != Object.class) {
+        	Method m = getMethod(currentClazz, methodName, signatures, false);
+        	if (m != null) {
+        		return m;
+        	}
+            currentClazz = currentClazz.getSuperclass();
+        }
+        return null;
+    }
+
+    /**
      * Get a method on an instance.
      * TODO: rework this class to avoid code duplication with invokeMethod !
      * 
@@ -249,6 +301,25 @@ public class InvocationUtil {
             clazz = object.getClass();
         }
         
+        return getMethod(clazz, name, signatures, isSuper);
+    }
+    
+    /**
+     * Get a method on an instance.
+     * TODO: rework this class to avoid code duplication with invokeMethod !
+     * 
+     * @param object the instance to invoke the method on
+     * @param clazz the class of the instance
+     * @param name the name of the method
+     * @param signatures the signatures to look for in order
+     * @param isSuper <code>true</code> if this is a superclass and we should therefore not look for private methods
+     * @return the found method, or null if not found
+     */
+    private static Method getMethod(Class<?> clazz, String name, Class<?>[][] signatures, boolean isSuper) {
+        if (clazz == null) {
+            throw new IllegalArgumentException("Class cannot be null");
+        }
+                
         Method m = null;
         for (int i = 0; i < signatures.length; i++) {
             Class<?>[] signature = signatures[i];
@@ -259,6 +330,58 @@ public class InvocationUtil {
         }
         return m;
     }
+
+    public static ComponentInstance createInstance(Class<?> clazz, CallbackTypeDef ctorArgs) throws Exception {    			
+    	Constructor<?>[] ctors = clazz.getConstructors(); 
+    	for (int index = 0; index < ctorArgs.m_sigs.length; index ++) {
+    		Class<?>[] sigs = ctorArgs.m_sigs[index];    		
+    		for (Constructor<?> ctor : ctors) {    	
+    			Class<?>[] ctorParamTypes = ctor.getParameterTypes(); 
+    			if (Arrays.equals(sigs, ctorParamTypes)) {
+    				ctor.setAccessible(true);
+    				Object instance = ctor.newInstance(ctorArgs.m_args[index]);
+    				return new ComponentInstance(instance, index);
+    			}
+    		}
+    	}
+    	throw new InstantiationException("No suitable constructor found for class " + clazz.getName());    	
+    }
+    
+    /**
+     * Instantiates a component. The first public constructor which contains any of the specified arguments is used.
+     * @param clazz the class name used to instantiate the component
+     * @param ctorArgs constructor arguments. An empty map means the first public constructor is used.
+     * @return the component instance
+     */
+    public static Object createInstance(Class<?> clazz, Map<Class<?>, Object> ctorArgs) throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {    			
+    	if (ctorArgs.size() == 0) {
+    		Constructor<?> ctor = clazz.getConstructor(VOID);
+    		ctor.setAccessible(true);
+			return ctor.newInstance();
+    	}
+    	
+    	Constructor<?>[] ctors = clazz.getConstructors(); 
+    	for (Constructor<?> ctor : ctors) {
+			Class<?>[] ctorParamTypes = ctor.getParameterTypes();
+			boolean match = true;
+			for (Class<?> ctopParamType : ctorParamTypes) {
+				if (ctorArgs.get(ctopParamType) == null) {
+					match = false;
+					break;
+				}
+			}
+			if (match) {
+				Object[] paramValues = new Object[ctorParamTypes.length];
+				int index = 0;
+				for (Class<?> ctorParamType : ctorParamTypes) {
+					paramValues[index ++] = ctorArgs.get(ctorParamType);
+				}
+				ctor.setAccessible(true);
+				return ctor.newInstance(paramValues);
+			}
+    	}
+    	throw new InstantiationException("No suitable constructor found for class " + clazz.getName());    	
+    }
     
     private static Method getDeclaredMethod(Class<?> clazz, String name, Class<?>[] signature, boolean isSuper) {
         // first check our cache
@@ -387,4 +510,5 @@ public class InvocationUtil {
             }
         }
     }
+
 }

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceAdapterImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceAdapterImpl.java?rev=1842034&r1=1842033&r2=1842034&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceAdapterImpl.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ResourceAdapterImpl.java Wed Sep 26 16:45:35 2018
@@ -23,9 +23,11 @@ import java.util.Enumeration;
 import java.util.Hashtable;
 import java.util.List;
 
+import org.apache.felix.dm.BundleComponent;
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.ComponentStateListener;
 import org.apache.felix.dm.DependencyManager;
+import org.apache.felix.dm.ResourceComponent;
 import org.apache.felix.dm.ResourceDependency;
 import org.apache.felix.dm.context.DependencyContext;
 
@@ -35,67 +37,63 @@ import org.apache.felix.dm.context.Depen
  * 
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public class ResourceAdapterImpl extends FilterComponent {
-    private final Object m_callbackInstance;
-    private final String m_callbackChanged;
-    private final String m_callbackAdded;
-    private final String m_resourceFilter;
-    
-    /**
-     * Creates a new Resource Adapter Service implementation.
-     * @param dm the dependency manager used to create our internal adapter service
-     */
-    public ResourceAdapterImpl(DependencyManager dm, String resourceFilter, boolean propagate, Object callbackInstance, String callbackSet, String callbackChanged) {
+public class ResourceAdapterImpl extends FilterComponent<ResourceComponent> implements ResourceComponent {
+    private volatile Object m_callbackInstance;
+    private volatile String m_callbackChanged;
+    private volatile String m_callbackAdded;
+    private volatile String m_resourceFilter;
+    private volatile boolean m_propagate = true;
+    private volatile Object m_propagateCallbackInstance;
+    private volatile String m_propagateCallbackMethod;
+
+    public ResourceAdapterImpl(DependencyManager dm) {
         super(dm.createComponent()); // This service will be filtered by our super class, allowing us to take control.
-        m_callbackInstance = callbackInstance;
-        m_callbackAdded = callbackSet;
-        m_callbackChanged = callbackChanged;
-        m_resourceFilter = resourceFilter;
-        m_component.setImplementation(new ResourceAdapterDecorator(propagate))
-            .add(dm.createResourceDependency()
-                 .setFilter(resourceFilter)
-                 .setAutoConfig(false)
-                 .setCallbacks("added", "removed"))
-            .setCallbacks("init", null, "stop", null);
     }
-    
-    public ResourceAdapterImpl(DependencyManager dm, String resourceFilter, Object propagateCallbackInstance, String propagateCallbackMethod, Object callbackInstance, String callbackSet, String callbackChanged) {
-        super(dm.createComponent()); // This service will be filtered by our super class, allowing us to take control.
-        m_callbackInstance = callbackInstance;
-        m_callbackAdded = callbackSet;
-        m_callbackChanged = callbackChanged;
-        m_resourceFilter = resourceFilter;
-        m_component.setImplementation(new ResourceAdapterDecorator(propagateCallbackInstance, propagateCallbackMethod))
-            .add(dm.createResourceDependency()
-                 .setFilter(resourceFilter)
-                 .setAutoConfig(false)
-                 .setCallbacks("added", "removed"))
-            .setCallbacks("init", null, "stop", null);
-    }   
-    
+
+	public ResourceComponent setResourceFilter(String filter) {
+		m_resourceFilter = filter;
+		return this;
+	}
+            
+	public ResourceComponent setPropagate(boolean propagate) {
+		m_propagate = propagate;
+		return this;
+	}
+	
+	public ResourceComponent setPropagate(Object propagateCbInstance, String propagateCbMethod) {
+		m_propagateCallbackInstance = propagateCbInstance;
+		m_propagateCallbackMethod = propagateCbMethod;
+		return this;
+	}
+
+	public ResourceComponent setBundleCallbacks(String add, String change) {
+		m_callbackAdded = add;
+		m_callbackChanged = change;
+		return this;
+	}
+
+	public ResourceComponent setBundleCallbackInstance(Object callbackInstance) {
+		m_callbackInstance = callbackInstance;
+		return this;
+	}
+
+    @Override
+    protected void startInitial() {
+        DependencyManager dm = getDependencyManager();
+        m_component.setImplementation(new ResourceAdapterDecorator())
+        .add(dm.createResourceDependency()
+             .setFilter(m_resourceFilter)
+             .setAutoConfig(false)
+             .setCallbacks("added", "removed"))
+        .setCallbacks("init", null, "stop", null);
+    }
+        
     public String getName() {
         return "Resource Adapter" + ((m_resourceFilter != null) ? " with filter " + m_resourceFilter : "");
     }
 
     public class ResourceAdapterDecorator extends AbstractDecorator {
-        private final boolean m_propagate;
-        private final Object m_propagateCallbackInstance;
-        private final String m_propagateCallbackMethod;
-
-        public ResourceAdapterDecorator(boolean propagate) {
-            this(propagate, null, null);
-        }
-
-        public ResourceAdapterDecorator(Object propagateCallbackInstance, String propagateCallbackMethod) {
-            this(true, propagateCallbackInstance, propagateCallbackMethod);
-        }
         
-        private ResourceAdapterDecorator(boolean propagate, Object propagateCallbackInstance, String propagateCallbackMethod) {
-            m_propagate = propagate;
-            m_propagateCallbackInstance = propagateCallbackInstance;
-            m_propagateCallbackMethod = propagateCallbackMethod;
-        }
-
         public Component createService(Object[] properties) {
             URL resource = (URL) properties[0]; 
             Hashtable<String, Object> props = new Hashtable<>();
@@ -120,12 +118,13 @@ public class ResourceAdapterImpl extends
             } else {
                 resourceDependency.setPropagate(m_propagate);
             }
-            Component service = m_manager.createComponent()
+            Component<?> service = m_manager.createComponent()
                 .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
+                .setScope(m_scope)
                 .add(resourceDependency);
             
             configureAutoConfigState(service, m_component);

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java?rev=1842034&r1=1842033&r2=1842034&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceDependencyImpl.java Wed Sep 26 16:45:35 2018
@@ -41,6 +41,7 @@ import org.apache.felix.dm.tracker.Servi
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceObjects;
 import org.osgi.framework.ServiceReference;
 
 /**
@@ -530,6 +531,7 @@ public class ServiceDependencyImpl exten
                 {m_trackedServiceName, Dictionary.class}, 
                 {Dictionary.class, m_trackedServiceName}, 
                 {Object.class},
+                {ServiceObjects.class},
                 {}},
             
             new Supplier[][]{
@@ -549,6 +551,7 @@ public class ServiceDependencyImpl exten
                 new Supplier<?>[] {() -> se.getEvent(), () -> properties.get()},
                 new Supplier<?>[] {() -> properties.get(), () -> se.getEvent()},
                 new Supplier<?>[] {() -> se.getEvent()},
+                new Supplier<?>[] {() -> se.getServiceObjects()},
                 {}},
             true // log if method is not found
         );
@@ -571,6 +574,8 @@ public class ServiceDependencyImpl exten
             		{Component.class, ServiceReference.class, Object.class, ServiceReference.class, Object.class},
             		{ServiceReference.class, ServiceReference.class},
             		{Component.class, ServiceReference.class, ServiceReference.class},
+            		{ServiceObjects.class, ServiceObjects.class},
+            		{Component.class, ServiceObjects.class, ServiceObjects.class},
             	}, 
 	            
 	            new Supplier[][]{
@@ -583,7 +588,9 @@ public class ServiceDependencyImpl exten
             		new Supplier<?>[] {() -> m_component, () -> previous.getReference(), () -> previous.getEvent(), () -> current.getReference(), () -> current.getEvent()}, 
             		new Supplier<?>[] {() -> m_component, () -> previous.getReference(), () -> previous.getEvent(), () -> current.getReference(), () -> current.getEvent()}, 
             		new Supplier<?>[] {() -> previous.getReference(), () -> current.getReference()}, 
-            		new Supplier<?>[] {() -> m_component, () -> previous.getReference(), () -> current.getReference()}
+            		new Supplier<?>[] {() -> m_component, () -> previous.getReference(), () -> current.getReference()},
+            		new Supplier<?>[] {() -> previous.getServiceObjects(), () -> current.getServiceObjects()}, 
+            		new Supplier<?>[] {() -> m_component, () -> previous.getServiceObjects(), () -> current.getServiceObjects()}            		
             	},
             		
             	true); // log if not found

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceEventImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceEventImpl.java?rev=1842034&r1=1842033&r2=1842034&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceEventImpl.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ServiceEventImpl.java Wed Sep 26 16:45:35 2018
@@ -27,6 +27,8 @@ import org.apache.felix.dm.context.Compo
 import org.apache.felix.dm.context.Event;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceObjects;
 import org.osgi.framework.ServiceReference;
 
 /**
@@ -45,6 +47,11 @@ public class ServiceEventImpl extends Ev
      */
 	private final BundleContext m_bundleContext;
 	
+	/**
+	 * The Bundle Context ServiceObjects
+	 */
+	private final ServiceObjects m_serviceObjects;
+
     /**
      * The bundle which has created the service dependency.
      */
@@ -70,6 +77,7 @@ public class ServiceEventImpl extends Ev
 		m_service = service;
 	    m_bundle = ctx.getBundle();
 	    m_bundleContext = ctx.getBundleContext();
+		m_serviceObjects = (m_bundleContext != null) ? m_bundleContext.getServiceObjects(reference) : null;
 		m_reference = reference;
 		m_logger = ctx.getLogger();
     }
@@ -83,7 +91,14 @@ public class ServiceEventImpl extends Ev
     public <T> T getEvent() {
         if (m_service == null) {
         	try {
-    		    m_service = m_bundleContext.getService(m_reference);
+    		    Object scope = m_reference.getProperty(Constants.SERVICE_SCOPE);
+    		    if (Constants.SCOPE_PROTOTYPE.equals(scope)) {
+    		    	if (m_serviceObjects != null) { 
+    		    		m_service = m_serviceObjects.getService();
+    		    	}
+    		    } else {
+    		    	m_service = m_bundleContext.getService(m_reference);
+    		    }
     		    if (m_service == null) {
             		debug(() -> "Service " + m_reference + " unavailable");
     		    }
@@ -114,6 +129,13 @@ public class ServiceEventImpl extends Ev
 	public ServiceReference<?> getReference() {
 		return m_reference;
 	}
+	
+	/**
+	 * Returns the reference service object.
+	 */
+	public ServiceObjects getServiceObjects() {
+		return m_serviceObjects;
+	}
 		    
     @SuppressWarnings("unchecked")
 	@Override
@@ -149,7 +171,12 @@ public class ServiceEventImpl extends Ev
         if (m_closed.compareAndSet(false, true)) {
         	if (m_service != null) {
         		try {
-            		m_bundleContext.ungetService(m_reference);
+            		Object scope = m_reference.getProperty(Constants.SERVICE_SCOPE);
+            		if (Constants.SCOPE_PROTOTYPE.equals(scope) && m_serviceObjects != null) {
+            			m_serviceObjects.ungetService(m_service);
+            		} else {
+            			m_bundleContext.ungetService(m_reference);
+            		}
         		} catch (IllegalStateException e) {}
         	}
         }

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/packageinfo
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/packageinfo?rev=1842034&r1=1842033&r2=1842034&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/packageinfo (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager/src/org/apache/felix/dm/packageinfo Wed Sep 26 16:45:35 2018
@@ -1 +1 @@
-version 4.4.0
\ No newline at end of file
+version 4.5.0
\ No newline at end of file

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager/test/org/apache/felix/dm/impl/ConfigurableTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/test/org/apache/felix/dm/impl/ConfigurableTest.java?rev=1842034&r1=1842033&r2=1842034&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager/test/org/apache/felix/dm/impl/ConfigurableTest.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager/test/org/apache/felix/dm/impl/ConfigurableTest.java Wed Sep 26 16:45:35 2018
@@ -18,13 +18,25 @@
  */
 package org.apache.felix.dm.impl;
 
-import static org.apache.felix.dm.impl.Configurable.*;
-import static org.junit.Assert.*;
+import static org.apache.felix.dm.impl.Configurable.create;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 
-import org.apache.felix.dm.impl.Configurable;
-import org.junit.Test;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.Stack;
+import java.util.TreeMap;
 
-import java.util.*;
+import org.junit.Test;
 
 /**
  * Test cases for {@link Configurable}.

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager/test/org/apache/felix/dm/tracker/TrackedTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/test/org/apache/felix/dm/tracker/TrackedTest.java?rev=1842034&r1=1842033&r2=1842034&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager/test/org/apache/felix/dm/tracker/TrackedTest.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager/test/org/apache/felix/dm/tracker/TrackedTest.java Wed Sep 26 16:45:35 2018
@@ -18,7 +18,7 @@
  */
 package org.apache.felix.dm.tracker;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertArrayEquals;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -27,8 +27,6 @@ import java.util.List;
 import java.util.Properties;
 
 import org.apache.felix.dm.DependencyManager;
-import org.apache.felix.dm.tracker.ServiceTracker;
-import org.apache.felix.dm.tracker.ServiceTrackerCustomizer;
 import org.apache.felix.dm.tracker.ServiceTracker.Tracked;
 import org.junit.Test;
 import org.osgi.framework.Bundle;

Modified: felix/trunk/dependencymanager/org.apache.felix.dependencymanager/test/test/ComponentTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/org.apache.felix.dependencymanager/test/test/ComponentTest.java?rev=1842034&r1=1842033&r2=1842034&view=diff
==============================================================================
--- felix/trunk/dependencymanager/org.apache.felix.dependencymanager/test/test/ComponentTest.java (original)
+++ felix/trunk/dependencymanager/org.apache.felix.dependencymanager/test/test/ComponentTest.java Wed Sep 26 16:45:35 2018
@@ -21,8 +21,6 @@ package test;
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.ComponentState;
 import org.apache.felix.dm.ComponentStateListener;
-import org.apache.felix.dm.Dependency;
-import org.apache.felix.dm.context.AbstractDependency;
 import org.apache.felix.dm.impl.ComponentImpl;
 import org.junit.Assert;
 import org.junit.Test;

Modified: felix/trunk/dependencymanager/release/README.release
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/release/README.release?rev=1842034&r1=1842033&r2=1842034&view=diff
==============================================================================
--- felix/trunk/dependencymanager/release/README.release (original)
+++ felix/trunk/dependencymanager/release/README.release Wed Sep 26 16:45:35 2018
@@ -72,7 +72,9 @@ $ ./gradlew makeStaging (this will creat
 
 Then you sign archives by invoking the following task:
 
-$ ./gradlew signStaging
+$ ./gradlew signStaging --no-daemon
+
+(you will be asked to enter your PGP key password; don't forget the --no-daemon option, else stdin won't be read)
 
 You can upload the archives and the signatures to our development area, which we use to stage this release candidate. This development area can be found at 
 https://dist.apache.org/repos/dist/dev/felix and adding files to it can be done using "svnpubsub" which is taken care of by the following target:

Modified: felix/trunk/dependencymanager/release/build.gradle
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/release/build.gradle?rev=1842034&r1=1842033&r2=1842034&view=diff
==============================================================================
--- felix/trunk/dependencymanager/release/build.gradle (original)
+++ felix/trunk/dependencymanager/release/build.gradle Wed Sep 26 16:45:35 2018
@@ -22,8 +22,18 @@
  */
 import aQute.bnd.build.Workspace
 
+buildscript {
+  repositories {
+    mavenCentral()
+  }
+
+  dependencies {
+    classpath bnd_plugin
+  }
+}
+
 // Our release number, which has to be monotonically incremented each time we make a new release.
-ext.dmRelease = "r11"
+ext.dmRelease = "r12"
 
 // Our Apache svn Staging repo
 ext.svnStagingPath = "https://dist.apache.org/repos/dist/dev/felix"
@@ -74,37 +84,30 @@ rat {
 Workspace workspace
 workspace = Workspace.getWorkspace(".")
 
-task makeStaging << {
+task makeStaging {
+    doLast {
     description = 'Packages the source and binary distributions.'
 
     // Package source and source bin dependencies distributions.
     logger.lifecycle("    Packaging source distributions.")
     def topdir="org.apache.felix.dependencymanager-" + dmRelease
     ant.zip(destfile: "staging/"+topdir+'-src.zip') {
-		zipfileset(dir: '../cnf', prefix: topdir+"-src/cnf", includes: ".project,.classpath,src/**,*.bnd,ext/**")
+		zipfileset(dir: '../cnf', prefix: topdir+"-src/cnf", includes: ".project,.classpath,src/**,*.bnd,*.mvn,ext/**")
 		zipfileset(dir: '..', prefix: topdir+"-src", includes: '*.gradle,*.properties')
 		zipfileset(dir: 'resources/src', prefix: topdir+"-src", includes: '*')
+		ant.zipfileset(dir: '..', prefix: topdir+"-src", includes: 'gradlew')
+    		ant.zipfileset(dir: '../.gradle-wrapper', prefix: topdir+"-src/.gradle-wrapper", includes: 'gradle-wrapper.properties')
 		new File('.').eachFile { 
-	    	if(new File(it, 'bnd.bnd').exists()) {	    		
+	    	    if(new File(it, 'bnd.bnd').exists()) {	    		
     			def bndProject = workspace.getProject(it.name)
     			if (! bndProject.isNoBundles() && ! bndProject.getName().endsWith(".benchmark")) {
-    		    	zipfileset(dir: "../${bndProject.name}", prefix: topdir+"-src/${bndProject.name}",
-    			       		   includes: "*.gradle,.project,.classpath,.settings/**,src/**,test/**,*.bnd,*.bndrun,run-*/conf/**,resources/**,README*")
+    		    	    zipfileset(dir: "../${bndProject.name}", prefix: topdir+"-src/${bndProject.name}",
+    			    	       includes: "*.gradle,.project,.classpath,.settings/**,src/**,test/**,*.bnd,*.bndrun,run-*/conf/**,resources/**,README*")
     			}
-	   		}
+	   	    }
 		}
     }
 
-    // Package binary dependencies, needed to build the source distributions.
-    logger.lifecycle("    Packaging binary dependencies.")    
-    ant.zip(destfile: "staging/"+topdir+"-deps.zip") {
-    	ant.zipfileset(dir: '..', prefix: topdir+"-src", includes: 'gradlew')
-    	ant.zipfileset(dir: '../gradle', prefix: topdir+"-src/gradle", includes: '**')    	
-		ant.zipfileset(dir: 'resources/deps', prefix: topdir+"-src", includes: '*')
-		ant.zipfileset(dir: '../cnf', prefix: topdir+"-src/cnf",
-		    		   includes: 'buildrepo/**,localrepo/**,releaserepo/**,nonosgi-repo/**,plugins/**,gradle/**')
-    }
-
     // Package binaries as a simple collection of bundles. We use same license files as for src distrib.
     logger.lifecycle("    Packaging binary distribution.")
 
@@ -120,7 +123,7 @@ task makeStaging << {
     }
 
     // Before adding all latest released bundles in the binary distribution, check if they contain proper license files.
-	logger.lifecycle("    Checking META-INF mandatory files.")
+    logger.lifecycle("    Checking META-INF mandatory files.")
     released.each { jarfile -> 
     	if (jarfile.isFile()) {
        		new ByteArrayOutputStream().withStream { os ->
@@ -161,48 +164,69 @@ task makeStaging << {
             }
         }
     }
+    }
 }
 
-// Sign staging directory 
-task signStaging << {
-    description = 'Signs the local staging distribution.'
+
+ 
+
+// Sign staging directory (you must use "--no-daemon" gradle option)
+task signStaging {
+  doLast {
+    	ant.input(message: 'Enter PGP password:', addproperty: 'pass')
+
+        description = 'Signs the local staging distribution.'
 	fileTree("staging").visit { FileVisitDetails details -> 
 		logger.lifecycle("    Signing " + details.file.path)
-		ant.exec(executable: 'gpg', dir: 'staging') { 
-	    	ant.arg(line: '--armor')
-	    	ant.arg(line: '--output')
-	    	ant.arg(line: details.file.name + ".asc")
-	    	ant.arg(line: "--detach-sig")
-	    	ant.arg(line: details.file.name)
+		ant.exec(executable: 'gpg', dir: 'staging') {
+			ant.arg(line: '--batch')
+			ant.arg(line: '--passphrase')
+			ant.arg(line: ant.properties.pass)
+	    		ant.arg(line: '--armor')
+	    		ant.arg(line: '--output')
+	    		ant.arg(line: details.file.name + ".asc")
+	    		ant.arg(line: "--detach-sig")
+	    		ant.arg(line: details.file.name)
 		}
 
 		ant.exec(executable: 'gpg', dir: 'staging', output: "staging/" + details.file.name + ".md5") { 
-	    	ant.arg(line: '--print-md')
-	    	ant.arg(line: 'MD5')
-	    	ant.arg(line: details.file.name)
+	    		ant.arg(line: '--print-md')
+	    		ant.arg(line: 'MD5')
+	    		ant.arg(line: details.file.name)
+		}
+
+		ant.exec(executable: 'gpg', dir: 'staging', output: "staging/" + details.file.name + ".sha1") {
+	    		ant.arg(line: '--print-md')
+	    		ant.arg(line: 'SHA1')
+	    		ant.arg(line: details.file.name)
 		}
 
-		ant.exec(executable: 'gpg', dir: 'staging', output: "staging/" + details.file.name + ".sha") {
-	    	ant.arg(line: '--print-md')
-	    	ant.arg(line: 'SHA512')
-	    	ant.arg(line: details.file.name)
+		ant.exec(executable: 'gpg', dir: 'staging', output: "staging/" + details.file.name + ".sha512") {
+	    		ant.arg(line: '--print-md')
+	    		ant.arg(line: 'SHA512')
+	    		ant.arg(line: details.file.name)
 		}
+	}
     }
 }
 
 
+
 // Moves the source and binary distributions to staging.
-task commitToStaging << {
+task commitToStaging {
+  doLast {
     description = 'Commits the local staging to the Apache svn staging repository.'
     getProject().exec { 
     	commandLine 'svn', 
 		'import', 'staging', svnStagingPath + "/org.apache.felix.dependencymanager-" + dmRelease + "/", 
 		'-m', "Staging Apache Felix Dependency Manager release " + dmRelease + "."
     }
+  }
 }
 
 // Promotes the staged distributions to release
-task promoteToRelease << {
+task promoteToRelease {
+  doLast {
     description = 'Moves the staging repository to the Apache release repository.'
 
     // Move all artifacts from the staging repo to the release repo
@@ -231,27 +255,33 @@ task promoteToRelease << {
 		'rm', svnStagingPath+"/org.apache.felix.dependencymanager-" + dmRelease, "-m", 
 		"Releasing Apache Felix Dependency Manager release " + dmRelease + "."
     }
+  }
 }
 
 // Removes the staged distributions from staging
-task deleteFromStaging << {
+task deleteFromStaging {
+  doLast {
     description = 'Cancels the staged distribution from the Apache staging repository.'
     getProject().exec { 
     	commandLine 'svn',
 		'delete', svnStagingPath+"/org.apache.felix.dependencymanager-" + dmRelease + "/",
 		"-m", "Removing Apache Felix Dependency Manager release " + dmRelease + " from staging."
     }
+  }
 }
 
 // Clean staging directory
-task clean(overwrite: true) << { 
+
+clean.doLast {
     new File("release/staging").deleteDir()
     new File("rat-report.xml").delete()
 }
 
 // Only clean the staging directory
-task cleanStaging << {
+task cleanStaging {
+  doLast {
     description = 'Clean the local staging directory.'
     new File("release/staging").deleteDir()
     new File("release/staging-copy").deleteDir()
+  }
 }

Modified: felix/trunk/dependencymanager/release/check_staged_release.sh
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/release/check_staged_release.sh?rev=1842034&r1=1842033&r2=1842034&view=diff
==============================================================================
--- felix/trunk/dependencymanager/release/check_staged_release.sh (original)
+++ felix/trunk/dependencymanager/release/check_staged_release.sh Wed Sep 26 16:45:35 2018
@@ -102,15 +102,17 @@ echo "                          CHECK SI
 echo "################################################################################"
 
 cd ${tmpDir}/org.apache.felix.dependencymanager-${version}
-for f in `find . -type f | grep -v '\.\(asc\|sha\?\|md5\)$'`; do
+for f in `find . -type f | grep -v '\.\(asc\|sha1\|sha512\|md5\)$'`; do
     echo "checking $f" 
 
     echo -e "    ASC: \c"
     checkSig $f
     echo -e "    MD5: \c"
     checkSum $f "$f.md5" MD5
-    echo -e "    SHA: \c"
-    checkSum $f "$f.sha" SHA512
+    echo -e "    SHA1: \c"
+    checkSum $f "$f.sha1" SHA1
+    echo -e "    SHA512: \c"
+    checkSum $f "$f.sha512" SHA512
     echo ""
 done
 

Modified: felix/trunk/dependencymanager/release/resources/src/README.src
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/release/resources/src/README.src?rev=1842034&r1=1842033&r2=1842034&view=diff
==============================================================================
--- felix/trunk/dependencymanager/release/resources/src/README.src (original)
+++ felix/trunk/dependencymanager/release/resources/src/README.src Wed Sep 26 16:45:35 2018
@@ -32,11 +32,9 @@ Building and testing Apache Felix Depend
 - If necessary, configure your https proxy settings:
 
   export GRADLE_OPTS="-Dhttps.proxyHost=www.somehost.org -Dhttps.proxyPort=8080"
+  export http_proxy=www.somehost.org:8080
+  export https_proxy=www.somehost.org:8080
   
-- If you are building a released org.apache.felix.dependencymanager-r<n>-src.zip artifact, then 
-  you also have to unfold the org.apache.felix.dependencymanager-r<n>-deps.zip on the same directory where you have unfolded the source archive.
-  (no need to do this if you have checked out from the felix-trunk).
-
 - Install a recent java8 JDK (the software has been built and tested using java version 1.8.0_74)
 
 - Compile Dependendency Manager annotations bndtools plugin:

Modified: felix/trunk/dependencymanager/settings.gradle
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/settings.gradle?rev=1842034&r1=1842033&r2=1842034&view=diff
==============================================================================
--- felix/trunk/dependencymanager/settings.gradle (original)
+++ felix/trunk/dependencymanager/settings.gradle Wed Sep 26 16:45:35 2018
@@ -17,114 +17,9 @@
  * under the License.
  */
 
-/*
- * Master Gradle initialization script
- *
- * Depends on bnd_* values from gradle.properties.
- */
-
-import aQute.bnd.build.Workspace
-import aQute.bnd.osgi.Constants
-
-/* Add bnd gradle plugin as a script dependency */
 buildscript {
-  repositories {
-    jcenter()
-  }
-  dependencies {
-    classpath bnd_plugin
-  }
-  /* Pass bnd gradle plugin classpath to rootProject once created */
-  def bndPlugin = files(configurations.classpath.files)
-  gradle.rootProject { rootProject ->
-    rootProject.ext.bndPlugin = bndPlugin
-  }
-}
-
-/* Initialize the bnd workspace */
-Workspace.setDriver(Constants.BNDDRIVER_GRADLE)
-Workspace.addGestalt(Constants.GESTALT_BATCH, null)
-def workspace = new Workspace(rootDir, bnd_cnf)
-if (workspace == null) {
-  throw new GradleException("Unable to load workspace ${rootDir}/${bnd_cnf}")
-}
-
-/* Add cnf project to the graph */
-include bnd_cnf
-
-/* Start with the declared build project name */
-def defaultProjectName = bnd_build
-
-/* If in a subproject, use the subproject name */
-for (def currentDir = startParameter.currentDir; currentDir != rootDir; currentDir = currentDir.parentFile) {
-  defaultProjectName = currentDir.name
+	repositories { mavenCentral() }
+	dependencies { classpath "biz.aQute.bnd:biz.aQute.bnd.gradle:${bnd_version}" }
 }
 
-/* Build a set of project names we need to include from the specified tasks */
-def projectNames = startParameter.taskNames.collect { taskName ->
-  def elements = taskName.split(':')
-  switch (elements.length) {
-    case 1:
-      return defaultProjectName
-    case 2:
-      return elements[0].empty ? bnd_build : elements[0]
-    default:
-      return elements[0].empty ? elements[1] : elements[0]
-  }
-}.toSet()
-
-/* Include the default project name if in a subproject or no tasks specified */
-if ((startParameter.currentDir != rootDir) || projectNames.empty) {
-  projectNames += defaultProjectName
-}
-
-/* If bnd_build used but declared empty, add all non-private folders of rootDir */
-if (projectNames.remove('')) {
-  rootDir.eachDir {
-    def projectName = it.name
-    if (!projectName.startsWith('.')) {
-      projectNames += projectName
-    }
-  }
-}
-
-/* Add each project and its dependencies to the graph */
-projectNames.each { projectName ->
-  include projectName
-  def project = getBndProject(workspace, projectName)
-  project?.getDependson()*.getName().each {
-    include it
-  }
-}
-
-/* Get the bnd project for the specified project name */
-def getBndProject(Workspace workspace, String projectName) {
-  def project = workspace.getProject(projectName)
-  if (project == null) {
-    return null
-  }
-  project.prepare()
-  if (project.isValid()) {
-    return project
-  }
-
-  project.getInfo(workspace, "${rootDir} :")
-  def errorCount = 0
-  project.getWarnings().each {
-    println "Warning: ${it}"
-  }
-  project.getErrors().each {
-    println "Error  : ${it}"
-    errorCount++
-  }
-  if (!project.isOk()) {
-    def str = 'even though no errors were reported'
-    if (errorCount == 1) {
-      str = 'one error was reported'
-    } else if (errorCount > 1) {
-      str = "${errorCount} errors were reported"
-    }
-    throw new GradleException("Project ${rootDir}/${projectName} is invalid, ${str}")
-  }
-  throw new GradleException("Project ${rootDir}/${projectName} is not a valid bnd project")
-}
+apply plugin: 'biz.aQute.bnd.workspace'