Author: marrs
Date: Thu Nov 26 17:12:12 2009
New Revision: 884649

URL: http://svn.apache.org/viewvc?rev=884649&view=rev
Log:
factoring out some common methods

Added:
    
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/AbstractDependency.java
Modified:
    
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/BundleDependency.java
    
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/ConfigurationDependency.java
    
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/ServiceDependency.java

Added: 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/AbstractDependency.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/AbstractDependency.java?rev=884649&view=auto
==============================================================================
--- 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/AbstractDependency.java
 (added)
+++ 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/AbstractDependency.java
 Thu Nov 26 17:12:12 2009
@@ -0,0 +1,79 @@
+package org.apache.felix.dependencymanager.dependencies;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
+import org.apache.felix.dependencymanager.Dependency;
+import org.apache.felix.dependencymanager.impl.Logger;
+
+public abstract class AbstractDependency implements Dependency {
+    private boolean m_isRequired;
+    protected final Logger m_logger;
+
+    public AbstractDependency(Logger logger) {
+        m_logger = logger;
+    }
+
+    public synchronized boolean isRequired() {
+        return m_isRequired;
+    }
+    
+    protected synchronized void setIsRequired(boolean isRequired) {
+        m_isRequired = isRequired;
+    }
+    
+    protected void invokeCallbackMethod(Object[] instances, String methodName, 
Class[][] signatures, Object[][] parameters) {
+        for (int i = 0; i < instances.length; i++) {
+            try {
+                invokeCallbackMethod(instances[i], methodName, signatures, 
parameters);
+            }
+            catch (NoSuchMethodException e) {
+                m_logger.log(Logger.LOG_DEBUG, "Method '" + methodName + "' 
does not exist on " + instances[i] + ". Callback skipped.");
+            }
+        }
+    }
+
+    protected void invokeCallbackMethod(Object instance, String methodName, 
Class[][] signatures, Object[][] parameters) throws NoSuchMethodException {
+        Class currentClazz = instance.getClass();
+        boolean done = false;
+        while (!done && currentClazz != null) {
+            done = invokeMethod(instance, currentClazz, methodName, 
signatures, parameters, false);
+            if (!done) {
+                currentClazz = currentClazz.getSuperclass();
+            }
+        }
+        if (!done && currentClazz == null) {
+            throw new NoSuchMethodException(methodName);
+        }
+    }
+
+    protected boolean invokeMethod(Object object, Class clazz, String name, 
Class[][] signatures, Object[][] parameters, boolean isSuper) {
+        Method m = null;
+        for (int i = 0; i < signatures.length; i++) {
+            Class[] signature = signatures[i];
+            try {
+                m = clazz.getDeclaredMethod(name, signature);
+                if (!(isSuper && Modifier.isPrivate(m.getModifiers()))) {
+                    m.setAccessible(true);
+                    try {
+                        m.invoke(object, parameters[i]);
+                    }
+                    catch (InvocationTargetException e) {
+                        m_logger.log(Logger.LOG_ERROR, "Exception while 
invoking method " + m + ".", e);
+                    }
+                    // we did find and invoke the method, so we return true
+                    return true;
+                }
+            }
+            catch (NoSuchMethodException e) {
+                // ignore this and keep looking
+            }
+            catch (Exception e) {
+                // could not even try to invoke the method
+                m_logger.log(Logger.LOG_ERROR, "Exception while trying to 
invoke method " + m + ".", e);
+            }
+        }
+        return false;
+    }
+}

Modified: 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/BundleDependency.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/BundleDependency.java?rev=884649&r1=884648&r2=884649&view=diff
==============================================================================
--- 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/BundleDependency.java
 (original)
+++ 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/BundleDependency.java
 Thu Nov 26 17:12:12 2009
@@ -18,9 +18,6 @@
  */
 package org.apache.felix.dependencymanager.dependencies;
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
 import java.util.Dictionary;
 
 import org.apache.felix.dependencymanager.Dependency;
@@ -36,15 +33,13 @@
 import org.osgi.framework.Filter;
 import org.osgi.framework.InvalidSyntaxException;
 
-public class BundleDependency implements Dependency, BundleTrackerCustomizer, 
ServiceComponentDependency {
+public class BundleDependency extends AbstractDependency implements 
Dependency, BundleTrackerCustomizer, ServiceComponentDependency {
        private final BundleContext m_context;
-       private final Logger m_logger;
        private boolean m_isStarted;
        private BundleTracker m_tracker;
        private int m_stateMask = Bundle.INSTALLED | Bundle.RESOLVED | 
Bundle.ACTIVE;
-       private boolean m_isAvailable;
-       private boolean m_isRequired;
        private DependencyService m_service;
+       private boolean m_isAvailable;
        
     private Object m_callbackInstance;
     private String m_callbackAdded;
@@ -54,27 +49,23 @@
        private Bundle m_bundleInstance;
        private Filter m_filter;
        private long m_bundleId = -1;
-
-
-       public BundleDependency(BundleContext context, Logger logger) {
+    
+    public BundleDependency(BundleContext context, Logger logger) {
+        super(logger);
                m_context = context;
-               m_logger = logger;
                m_autoConfig = true;
        }
 
-       public boolean isAvailable() {
-               return m_isAvailable;
-       }
-
-       public boolean isRequired() {
-               return m_isRequired;
-       }
-       
        public boolean isInstanceBound() {
                return false; // TODO for now we are never bound to the service 
implementation instance
        }
 
-       public void start(DependencyService service) {
+       public synchronized boolean isAvailable() {
+        return m_isAvailable;
+    }
+
+
+    public void start(DependencyService service) {
                synchronized (this) {
                        if (m_isStarted) {
                                throw new IllegalStateException("Dependency was 
already started." + getName());
@@ -169,7 +160,7 @@
        }
        
     private synchronized boolean makeAvailable() {
-        if (!m_isAvailable) {
+        if (!isAvailable()) {
             m_isAvailable = true;
             return true;
         }
@@ -177,8 +168,9 @@
     }
     
     private synchronized boolean makeUnavailable() {
-        if ((m_isAvailable) && (m_tracker.getTrackingCount() == 0)) {
+        if ((isAvailable()) && (m_tracker.getTrackingCount() == 0)) {
             m_isAvailable = false;
+
             return true;
         }
         return false;
@@ -188,17 +180,23 @@
         invokeAdded(m_bundleInstance);
     }
     
-    public void invokeAdded(Bundle serviceInstance) {
+    public void invokeAdded(Bundle service) {
         Object[] callbackInstances = getCallbackInstances();
         if ((callbackInstances != null) && (m_callbackAdded != null)) {
-            invokeCallbackMethod(callbackInstances, m_callbackAdded, 
serviceInstance);
+            invokeCallbackMethod(callbackInstances, m_callbackAdded, 
+                new Class[][] {{Bundle.class}, {Object.class}, {}},
+                new Object[][] {{service}, {service}, {}}
+            );
         }
     }
 
-    public void invokeChanged(Bundle serviceInstance) {
+    public void invokeChanged(Bundle service) {
         Object[] callbackInstances = getCallbackInstances();
         if ((callbackInstances != null) && (m_callbackChanged != null)) {
-            invokeCallbackMethod(callbackInstances, m_callbackChanged, 
serviceInstance);
+            invokeCallbackMethod(callbackInstances, m_callbackChanged, 
+                new Class[][] {{Bundle.class}, {Object.class}, {}},
+                new Object[][] {{service}, {service}, {}}
+            );
         }
     }
     
@@ -206,70 +204,16 @@
         invokeRemoved(m_bundleInstance);
     }
     
-    public void invokeRemoved(Bundle serviceInstance) {
+    public void invokeRemoved(Bundle service) {
         Object[] callbackInstances = getCallbackInstances();
         if ((callbackInstances != null) && (m_callbackRemoved != null)) {
-            invokeCallbackMethod(callbackInstances, m_callbackRemoved, 
serviceInstance);
+            invokeCallbackMethod(callbackInstances, m_callbackRemoved,
+              new Class[][] {{Bundle.class}, {Object.class}, {}},
+              new Object[][] {{service}, {service}, {}}
+            );
         }
     }
     
-    private void invokeCallbackMethod(Object[] instances, String methodName, 
Object service) {
-        for (int i = 0; i < instances.length; i++) {
-            try {
-                invokeCallbackMethod(instances[i], methodName, service);
-            }
-            catch (NoSuchMethodException e) {
-                m_logger.log(Logger.LOG_DEBUG, "Method '" + methodName + "' 
does not exist on " + instances[i] + ". Callback skipped.");
-            }
-        }
-    }
-
-    private void invokeCallbackMethod(Object instance, String methodName, 
Object service) throws NoSuchMethodException {
-        Class currentClazz = instance.getClass();
-        boolean done = false;
-        while (!done && currentClazz != null) {
-            done = invokeMethod(instance, currentClazz, methodName,
-                new Class[][] {{Bundle.class}, {Object.class}, {}},
-                new Object[][] {{service}, {service}, {}},
-                false);
-            if (!done) {
-                currentClazz = currentClazz.getSuperclass();
-            }
-        }
-        if (!done && currentClazz == null) {
-            throw new NoSuchMethodException(methodName);
-        }
-    }
-    
-    private boolean invokeMethod(Object object, Class clazz, String name, 
Class[][] signatures, Object[][] parameters, boolean isSuper) {
-        Method m = null;
-        for (int i = 0; i < signatures.length; i++) {
-            Class[] signature = signatures[i];
-            try {
-                m = clazz.getDeclaredMethod(name, signature);
-                if (!(isSuper && Modifier.isPrivate(m.getModifiers()))) {
-                    m.setAccessible(true);
-                    try {
-                        m.invoke(object, parameters[i]);
-                    }
-                    catch (InvocationTargetException e) {
-                        m_logger.log(Logger.LOG_ERROR, "Exception while 
invoking method " + m + ".", e);
-                    }
-                    // we did find and invoke the method, so we return true
-                    return true;
-                }
-            }
-            catch (NoSuchMethodException e) {
-                // ignore this and keep looking
-            }
-            catch (Exception e) {
-                // could not even try to invoke the method
-                m_logger.log(Logger.LOG_ERROR, "Exception while trying to 
invoke method " + m + ".", e);
-            }
-        }
-        return false;
-    }
-    
     private synchronized Object[] getCallbackInstances() {
         Object[] callbackInstances = ((ServiceImpl) 
m_service).getCompositionInstances();
         if (m_callbackInstance == null) {
@@ -362,7 +306,7 @@
     
     public synchronized BundleDependency setRequired(boolean required) {
         ensureNotActive();
-        m_isRequired = required;
+        setIsRequired(required);
         return this;
     }
 

Modified: 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/ConfigurationDependency.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/ConfigurationDependency.java?rev=884649&r1=884648&r2=884649&view=diff
==============================================================================
--- 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/ConfigurationDependency.java
 (original)
+++ 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/ConfigurationDependency.java
 Thu Nov 26 17:12:12 2009
@@ -118,7 +118,7 @@
        public void updated(Dictionary settings) throws ConfigurationException {
                // if non-null settings come in, we have to instantiate the 
service and
                // apply these settings
-               m_service.initService(); /// <<< CHANGES THE STATE, WHEN IT 
SHOULD NOT (YET) DO THAT (we should not use m_serviceInstance to determine the 
state but use a flag var instead)
+               m_service.initService();
                Object service = m_service.getService();
                                
                Dictionary oldSettings = null; 

Modified: 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/ServiceDependency.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/ServiceDependency.java?rev=884649&r1=884648&r2=884649&view=diff
==============================================================================
--- 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/ServiceDependency.java
 (original)
+++ 
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dependencymanager/dependencies/ServiceDependency.java
 Thu Nov 26 17:12:12 2009
@@ -18,9 +18,6 @@
  */
 package org.apache.felix.dependencymanager.dependencies;
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
 import java.lang.reflect.Proxy;
 import java.util.AbstractMap;
 import java.util.ArrayList;
@@ -48,12 +45,10 @@
  * 
  * @author <a href="mailto:[email protected]";>Felix Project Team</a>
  */
-public class ServiceDependency implements Dependency, 
ServiceTrackerCustomizer, ServiceComponentDependency {
-    private boolean m_isRequired;
+public class ServiceDependency extends AbstractDependency implements 
Dependency, ServiceTrackerCustomizer, ServiceComponentDependency {
     protected List m_services = new ArrayList();
     protected volatile ServiceTracker m_tracker;
     protected BundleContext m_context;
-    private boolean m_isAvailable;
     protected volatile Class m_trackedServiceName;
     private Object m_nullObject;
     private volatile String m_trackedServiceFilter;
@@ -67,12 +62,12 @@
     private boolean m_autoConfig;
     protected ServiceReference m_reference;
     protected Object m_serviceInstance;
-    private final Logger m_logger;
     private String m_autoConfigInstance;
     private boolean m_autoConfigInvoked;
     private Object m_defaultImplementation;
     private Object m_defaultImplementationInstance;
     private boolean m_isInstanceBound;
+    private boolean m_isAvailable;
     
     private static final Comparator COMPARATOR = new Comparator() {
         public int getRank(ServiceReference ref) {
@@ -179,23 +174,19 @@
      * @param logger the logger
      */
     public ServiceDependency(BundleContext context, Logger logger) {
+        super(logger);
         m_context = context;
-        m_logger = logger;
         m_autoConfig = true;
     }
-
-    public synchronized boolean isRequired() {
-        return m_isRequired;
-    }
-
-    public synchronized boolean isAvailable() {
-        return m_isAvailable;
-    }
     
     public synchronized boolean isAutoConfig() {
         return m_autoConfig;
     }
     
+    public synchronized boolean isAvailable() {
+        return m_isAvailable;
+    }
+
     public boolean isInstanceBound() {
         return m_isInstanceBound;
     }
@@ -414,10 +405,13 @@
         }
     }
 
-    public void invokeAdded(DependencyService dependencyService, 
ServiceReference reference, Object serviceInstance) {
+    public void invokeAdded(DependencyService dependencyService, 
ServiceReference reference, Object service) {
         Object[] callbackInstances = getCallbackInstances(dependencyService);
         if ((callbackInstances != null) && (m_callbackAdded != null)) {
-            invokeCallbackMethod(callbackInstances, m_callbackAdded, 
reference, serviceInstance);
+            invokeCallbackMethod(callbackInstances, m_callbackAdded, 
+                new Class[][] {{ServiceReference.class, m_trackedServiceName}, 
{ServiceReference.class, Object.class}, {ServiceReference.class}, 
{m_trackedServiceName}, {Object.class}, {}, {Map.class, m_trackedServiceName}},
+                new Object[][] {{reference, service}, {reference, service}, 
{reference}, {service}, {service}, {}, {new ServicePropertiesMap(reference), 
service}}    
+            );
         }
     }
 
@@ -435,10 +429,13 @@
         }
     }
 
-    public void invokeChanged(DependencyService dependencyService, 
ServiceReference reference, Object serviceInstance) {
+    public void invokeChanged(DependencyService dependencyService, 
ServiceReference reference, Object service) {
         Object[] callbackInstances = getCallbackInstances(dependencyService);
         if ((callbackInstances != null) && (m_callbackChanged != null)) {
-            invokeCallbackMethod(callbackInstances, m_callbackChanged, 
reference, serviceInstance);
+            invokeCallbackMethod(callbackInstances, m_callbackChanged, 
+                new Class[][] {{ServiceReference.class, m_trackedServiceName}, 
{ServiceReference.class, Object.class}, {ServiceReference.class}, 
{m_trackedServiceName}, {Object.class}, {}, {Map.class, m_trackedServiceName}},
+                new Object[][] {{reference, service}, {reference, service}, 
{reference}, {service}, {service}, {}, {new ServicePropertiesMap(reference), 
service}}    
+            );
         }
     }
 
@@ -464,15 +461,18 @@
 
     }
 
-    public void invokeRemoved(DependencyService dependencyService, 
ServiceReference reference, Object serviceInstance) {
+    public void invokeRemoved(DependencyService dependencyService, 
ServiceReference reference, Object service) {
         Object[] callbackInstances = getCallbackInstances(dependencyService);
         if ((callbackInstances != null) && (m_callbackRemoved != null)) {
-            invokeCallbackMethod(callbackInstances, m_callbackRemoved, 
reference, serviceInstance);
+            invokeCallbackMethod(callbackInstances, m_callbackRemoved, 
+                new Class[][] {{ServiceReference.class, m_trackedServiceName}, 
{ServiceReference.class, Object.class}, {ServiceReference.class}, 
{m_trackedServiceName}, {Object.class}, {}, {Map.class, m_trackedServiceName}},
+                new Object[][] {{reference, service}, {reference, service}, 
{reference}, {service}, {service}, {}, {new ServicePropertiesMap(reference), 
service}}    
+            );
         }
     }
 
     protected synchronized boolean makeAvailable() {
-        if (!m_isAvailable) {
+        if (!isAvailable()) {
             m_isAvailable = true;
             return true;
         }
@@ -480,7 +480,7 @@
     }
     
     private synchronized boolean makeUnavailable() {
-        if ((m_isAvailable) && (m_tracker.getServiceReference() == null)) {
+        if ((isAvailable()) && (m_tracker.getServiceReference() == null)) {
             m_isAvailable = false;
             return true;
         }
@@ -495,67 +495,6 @@
             return new Object[] { m_callbackInstance };
         }
     }
-
-    private void invokeCallbackMethod(Object[] instances, String methodName, 
ServiceReference reference, Object service) {
-        for (int i = 0; i < instances.length; i++) {
-            try {
-                invokeCallbackMethod(instances[i], methodName, reference, 
service);
-            }
-            catch (NoSuchMethodException e) {
-                m_logger.log(Logger.LOG_DEBUG, "Method '" + methodName + "' 
does not exist on " + instances[i] + ". Callback skipped.");
-            }
-        }
-    }
-
-    private void invokeCallbackMethod(Object instance, String methodName, 
ServiceReference reference, Object service) throws NoSuchMethodException {
-        Class currentClazz = instance.getClass();
-        boolean done = false;
-        while (!done && currentClazz != null) {
-            Class trackedServiceName;
-            synchronized (this) {
-                trackedServiceName = m_trackedServiceName;
-            }
-            done = invokeMethod(instance, currentClazz, methodName,
-                new Class[][] {{ServiceReference.class, trackedServiceName}, 
{ServiceReference.class, Object.class}, {ServiceReference.class}, 
{trackedServiceName}, {Object.class}, {}, {Map.class, trackedServiceName}},
-                new Object[][] {{reference, service}, {reference, service}, 
{reference}, {service}, {service}, {}, {new ServicePropertiesMap(reference), 
service}},
-                false);
-            if (!done) {
-                currentClazz = currentClazz.getSuperclass();
-            }
-        }
-        if (!done && currentClazz == null) {
-            throw new NoSuchMethodException(methodName);
-        }
-    }
-
-    private boolean invokeMethod(Object object, Class clazz, String name, 
Class[][] signatures, Object[][] parameters, boolean isSuper) {
-        Method m = null;
-        for (int i = 0; i < signatures.length; i++) {
-            Class[] signature = signatures[i];
-            try {
-                m = clazz.getDeclaredMethod(name, signature);
-                if (!(isSuper && Modifier.isPrivate(m.getModifiers()))) {
-                    m.setAccessible(true);
-                    try {
-                        m.invoke(object, parameters[i]);
-                    }
-                    catch (InvocationTargetException e) {
-                        m_logger.log(Logger.LOG_ERROR, "Exception while 
invoking method " + m + ".", e);
-                    }
-                    // we did find and invoke the method, so we return true
-                    return true;
-                }
-            }
-            catch (NoSuchMethodException e) {
-                // ignore this and keep looking
-            }
-            catch (Exception e) {
-                // could not even try to invoke the method
-                m_logger.log(Logger.LOG_ERROR, "Exception while trying to 
invoke method " + m + ".", e);
-            }
-        }
-        return false;
-    }
     
     // ----- CREATION
 
@@ -651,7 +590,7 @@
      */
     public synchronized ServiceDependency setRequired(boolean required) {
         ensureNotActive();
-        m_isRequired = required;
+        setIsRequired(required);
         return this;
     }
     


Reply via email to