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 2014/03/18 22:42:10 UTC
svn commit: r1579060 -
/felix/sandbox/pderop/dependencymanager-prototype/dm/src/dm/impl/DependencyImpl.java
Author: pderop
Date: Tue Mar 18 21:42:09 2014
New Revision: 1579060
URL: http://svn.apache.org/r1579060
Log:
Using Generic in order to put some commont methods in DependencyImpl class
Modified:
felix/sandbox/pderop/dependencymanager-prototype/dm/src/dm/impl/DependencyImpl.java
Modified: felix/sandbox/pderop/dependencymanager-prototype/dm/src/dm/impl/DependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/dm/src/dm/impl/DependencyImpl.java?rev=1579060&r1=1579059&r2=1579060&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/dm/src/dm/impl/DependencyImpl.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/dm/src/dm/impl/DependencyImpl.java Tue Mar 18 21:42:09 2014
@@ -1,17 +1,16 @@
package dm.impl;
import java.util.Dictionary;
-import java.util.Iterator;
-import java.util.concurrent.ConcurrentSkipListSet;
import dm.Dependency;
+import dm.ServiceDependency;
import dm.admin.ComponentDependencyDeclaration;
import dm.context.ComponentContext;
import dm.context.DependencyContext;
import dm.context.Event;
-public class DependencyImpl implements Dependency, DependencyContext {
- protected ComponentContext m_component;
+public class DependencyImpl<T extends Dependency> implements Dependency, DependencyContext {
+ protected volatile ComponentContext m_component;
protected volatile boolean m_available; // volatile because accessed by getState method
protected boolean m_instanceBound;
protected volatile boolean m_required; // volatile because accessed by getState method
@@ -23,12 +22,10 @@ public class DependencyImpl implements D
protected boolean m_autoConfigInvoked;
private volatile boolean m_isStarted; // volatile because accessed by getState method
private Object m_callbackInstance;
-
- // TODO when we start injecting the "highest" one, this needs to be sorted at
- // some point in time (note that we could choose to only do that if the dependency is
- // actually injected (auto config is on for it)
- protected final ConcurrentSkipListSet<Event> m_dependencies = new ConcurrentSkipListSet();
-
+ protected volatile boolean m_propagate;
+ protected volatile Object m_propagateCallbackInstance;
+ protected volatile String m_propagateCallbackMethod;
+
public DependencyImpl() {
this(true);
}
@@ -37,7 +34,7 @@ public class DependencyImpl implements D
m_autoConfig = autoConfig;
}
- public DependencyImpl(DependencyImpl prototype) {
+ public DependencyImpl(DependencyImpl<T> prototype) {
m_component = prototype.m_component;
m_available = prototype.m_available;
m_instanceBound = prototype.m_instanceBound;
@@ -49,6 +46,9 @@ public class DependencyImpl implements D
m_autoConfigInstance = prototype.m_autoConfigInstance;
m_autoConfigInvoked = prototype.m_autoConfigInvoked;
m_callbackInstance = prototype.m_callbackInstance;
+ m_propagate = prototype.m_propagate;
+ m_propagateCallbackInstance = prototype.m_propagateCallbackInstance;
+ m_propagateCallbackMethod = prototype.m_propagateCallbackMethod;
}
public void add(final Event e) {
@@ -58,7 +58,7 @@ public class DependencyImpl implements D
m_component.getExecutor().execute(new Runnable() {
@Override
public void run() {
- addDependency(e);
+ m_component.handleAdded(DependencyImpl.this, e);
}
});
}
@@ -69,10 +69,11 @@ public class DependencyImpl implements D
m_component.getExecutor().execute(new Runnable() {
@Override
public void run() {
- changeDependency(e);
+ m_component.handleChanged(DependencyImpl.this, e);
}
});
}
+
public void remove(final Event e) {
// since this method can be invoked by anyone from any thread, we need to
// pass on the event to a runnable that we execute using the component's
@@ -80,89 +81,13 @@ public class DependencyImpl implements D
m_component.getExecutor().execute(new Runnable() {
@Override
public void run() {
- removeDependency(e);
+ m_component.handleRemoved(DependencyImpl.this, e);
}
});
}
- protected void addDependency(Event e) {
- m_dependencies.add(e);
- m_available = true;
-
- switch (m_component.getComponentState()) {
- case WAITING_FOR_REQUIRED:
- if (isRequired()) {
- m_component.handleChange();
- }
- break;
- case INSTANTIATED_AND_WAITING_FOR_REQUIRED:
- if (isRequired()) {
- if (! isInstanceBound()) {
- if (m_add != null) {
- invoke(m_add, e);
- }
- m_component.updateInstance(this);
- } else {
- m_component.handleChange();
- }
- }
- break;
- case TRACKING_OPTIONAL:
- if (m_add != null) {
- invoke(m_add, e);
- }
- m_component.updateInstance(this);
- break;
- default:
- }
- }
-
- protected void changeDependency(Event e) {
- m_dependencies.remove(e);
- m_dependencies.add(e);
- switch (m_component.getComponentState()) {
- case INSTANTIATED_AND_WAITING_FOR_REQUIRED:
- if (m_change != null && isRequired() && !isInstanceBound()) {
- invoke(m_change, e);
- }
- m_component.updateInstance(this);
- break;
- case TRACKING_OPTIONAL:
- if (m_change != null) {
- invoke(m_change, e);
- }
- m_component.updateInstance(this);
- break;
- default:
- }
- }
-
- protected void removeDependency(Event e) {
- m_available = !(m_dependencies.contains(e) && m_dependencies.size() == 1);
- m_component.handleChange();
- m_dependencies.remove(e);
-
- switch (m_component.getComponentState()) {
- case INSTANTIATED_AND_WAITING_FOR_REQUIRED:
- if (isRequired() && ! isInstanceBound()) {
- if (m_remove != null) {
- invoke(m_remove, e);
- }
- m_component.updateInstance(this);
- }
- break;
- case TRACKING_OPTIONAL:
- if (m_remove != null) {
- invoke(m_remove, e);
- }
- m_component.updateInstance(this);
- break;
- default:
- }
- }
-
@Override
- public synchronized void add(ComponentContext component) {
+ public void add(ComponentContext component) {
m_component = component;
}
@@ -188,30 +113,50 @@ public class DependencyImpl implements D
return m_available;
}
+ public T setPropagate(boolean propagate) {
+ ensureNotActive();
+ m_propagate = propagate;
+ return (T) this;
+ }
+
+ public T setPropagate(Object instance, String method) {
+ setPropagate(instance != null && method != null);
+ m_propagateCallbackInstance = instance;
+ m_propagateCallbackMethod = method;
+ return (T) this;
+ }
+
+ @Override
+ public void setAvailable(boolean available) {
+ m_available = available;
+ }
+
@Override
public boolean isRequired() {
return m_required;
}
+
public boolean isInstanceBound() {
return m_instanceBound;
}
+
public void setInstanceBound(boolean instanceBound) {
m_instanceBound = instanceBound;
}
- public Dependency setCallbacks(String add, String remove) {
+ public T setCallbacks(String add, String remove) {
return setCallbacks(add, null, remove);
}
- public Dependency setCallbacks(String add, String change, String remove) {
+ public T setCallbacks(String add, String change, String remove) {
return setCallbacks(null, add, change, remove);
}
- public Dependency setCallbacks(Object instance, String add, String remove) {
+ public T setCallbacks(Object instance, String add, String remove) {
return setCallbacks(instance, add, null, remove);
}
- public Dependency setCallbacks(Object instance, String add, String change, String remove) {
+ public T setCallbacks(Object instance, String add, String change, String remove) {
if ((add != null || change != null || remove != null) && !m_autoConfigInvoked) {
setAutoConfig(false);
}
@@ -219,30 +164,27 @@ public class DependencyImpl implements D
m_add = add;
m_change = change;
m_remove = remove;
- return this;
+ return (T) this;
}
- public void invokeAdd() {
+ @Override
+ public void invokeAdd(Event e) {
if (m_add != null) {
- for (Event e : m_dependencies) {
- invoke(m_add, e);
- }
+ invoke(m_add, e);
}
}
- public void invokeChange() {
+ @Override
+ public void invokeChange(Event e) {
if (m_change != null) {
- for (Event e : m_dependencies) {
- invoke(m_change, e);
- }
+ invoke(m_change, e);
}
}
- public void invokeRemove() {
+ @Override
+ public void invokeRemove(Event e) {
if (m_remove != null) {
- for (Event e : m_dependencies) {
- invoke(m_remove, e);
- }
+ invoke(m_remove, e);
}
}
@@ -260,9 +202,9 @@ public class DependencyImpl implements D
}
@Override
- public Dependency setRequired(boolean required) {
+ public T setRequired(boolean required) {
m_required = required;
- return this;
+ return (T) this;
}
@Override
@@ -271,7 +213,7 @@ public class DependencyImpl implements D
}
@Override
- public Class getAutoConfigType() {
+ public Class<?> getAutoConfigType() {
return null; // must be implemented by subclasses
}
@@ -291,18 +233,18 @@ public class DependencyImpl implements D
}
@Override
- public Dependency setAutoConfig(boolean autoConfig) {
+ public T setAutoConfig(boolean autoConfig) {
m_autoConfig = autoConfig;
m_autoConfigInvoked = true;
- return this;
+ return (T) this;
}
@Override
- public Dependency setAutoConfig(String instanceName) {
+ public T setAutoConfig(String instanceName) {
m_autoConfig = (instanceName != null);
m_autoConfigInstance = instanceName;
m_autoConfigInvoked = true;
- return this;
+ return (T) this;
}
@Override
@@ -330,8 +272,7 @@ public class DependencyImpl implements D
@Override
public boolean isPropagated() {
- // specific for this type of dependency
- return false;
+ return m_propagate;
}
@Override
@@ -339,4 +280,10 @@ public class DependencyImpl implements D
// specific for this type of dependency
return null;
}
+
+ protected void ensureNotActive() {
+ if (isStarted()) {
+ throw new IllegalStateException("Cannot modify state while active.");
+ }
+ }
}