public abstract class AbstractComponentManager<S> extends java.lang.Object implements ComponentManager<S>
Modifier and Type | Class and Description |
---|---|
protected static class |
AbstractComponentManager.State |
Modifier and Type | Field and Description |
---|---|
private java.lang.String |
failureReason |
protected java.util.concurrent.locks.ReentrantReadWriteLock |
m_activationLock |
private int |
m_ceiling |
private long |
m_componentId |
private ComponentMethods<S> |
m_componentMethods |
protected ComponentContainer<S> |
m_container |
private java.util.List<DependencyManager<S,?>> |
m_dependencyManagers |
private boolean |
m_dependencyManagersInitialized |
private java.util.concurrent.atomic.AtomicReference<org.osgi.util.promise.Deferred<java.lang.Void>> |
m_enabledLatchRef
This latch prevents concurrent enable, disable, and reconfigure.
|
protected boolean |
m_factoryInstance |
private int |
m_floor |
private java.util.Set<java.lang.Integer> |
m_missing |
private java.util.concurrent.locks.Condition |
m_missingCondition |
private java.util.concurrent.locks.Lock |
m_missingLock |
private java.util.concurrent.locks.ReentrantLock |
m_stateLock |
private java.util.concurrent.atomic.AtomicInteger |
m_trackingCount |
(package private) static java.lang.String[] |
REASONS |
(package private) RegistrationManager<org.osgi.framework.ServiceRegistration<S>> |
registrationManager |
private java.util.concurrent.atomic.AtomicReference<AbstractComponentManager.State> |
state |
private static java.util.concurrent.atomic.AtomicLong |
taskCounter |
STATE_ACTIVE, STATE_DISPOSED, STATE_SATISFIED, STATE_UNSATISFIED_CONFIGURATION, STATE_UNSATISFIED_REFERENCE
Modifier | Constructor and Description |
---|---|
protected |
AbstractComponentManager(ComponentContainer<S> container,
ComponentMethods<S> componentMethods)
The constructor receives both the container and the methods.
|
protected |
AbstractComponentManager(ComponentContainer<S> container,
ComponentMethods<S> componentMethods,
boolean factoryInstance)
The constructor receives both the container and the methods.
|
Modifier and Type | Method and Description |
---|---|
(package private) void |
activateInternal() |
(package private) void |
clear() |
protected boolean |
collectDependencies(ComponentContextImpl<S> componentContext)
Collect and store in m_dependencies_map all the services for dependencies, outside of any locks.
|
protected static java.util.Dictionary<java.lang.String,java.lang.Object> |
copyTo(java.util.Dictionary<java.lang.String,java.lang.Object> target,
java.util.Map<java.lang.String,?> source,
boolean allProps)
Copies the properties from the
source Dictionary
into the target Dictionary except for private
properties (whose name has a leading dot) which are only copied if the
allProps parameter is true . |
protected static java.util.Dictionary<java.lang.String,java.lang.Object> |
copyToDictionary(java.util.Dictionary<java.lang.String,?> source,
boolean allProps) |
protected static java.util.Map<java.lang.String,java.lang.Object> |
copyToMap(java.util.Dictionary<java.lang.String,?> source,
boolean allProps)
Copies the properties from the
source Dictionary
into the target Dictionary except for private
properties (whose name has a leading dot) which are only copied if the
allProps parameter is true . |
private void |
deactivateDependencyManagers() |
(package private) void |
deactivateInternal(int reason,
boolean disable,
boolean dispose)
Handles deactivating, disabling, and disposing a component manager.
|
protected abstract void |
deleteComponent(int reason) |
org.osgi.util.promise.Promise<java.lang.Void> |
disable(boolean async) |
private void |
disableDependencyManagers() |
(package private) void |
disableInternal() |
(package private) void |
dispose() |
void |
dispose(int reason)
Disposes off this component deactivating and disabling it first as
required.
|
private void |
doDeactivate(int reason,
boolean disable) |
private boolean |
doMissingWait() |
(package private) void |
dumpThreads() |
org.osgi.util.promise.Promise<java.lang.Void> |
enable(boolean async) |
(package private) void |
enableInternal() |
(package private) org.osgi.util.promise.Deferred<java.lang.Void> |
enableLatchWait()
Use a CountDownLatch as a non-reentrant "lock" that can be passed between threads.
|
ComponentActivator |
getActivator() |
org.osgi.framework.Bundle |
getBundle()
Returns the
Bundle providing this component. |
(package private) org.osgi.framework.BundleContext |
getBundleContext() |
abstract void |
getComponentManagers(java.util.List<AbstractComponentManager<S>> cms) |
ComponentMetadata |
getComponentMetadata() |
(package private) ComponentMethods<S> |
getComponentMethods() |
(package private) DependencyManager<S,?> |
getDependencyManager(java.lang.String name) |
(package private) java.util.List<DependencyManager<S,?>> |
getDependencyManagers()
Returns an iterator over the
DependencyManager objects
representing the declared references in declaration order |
java.lang.String |
getFailureReason() |
long |
getId() |
(package private) long |
getLockTimeout() |
ComponentLogger |
getLogger() |
abstract java.util.Map<java.lang.String,java.lang.Object> |
getProperties() |
protected java.lang.String[] |
getProvidedServices() |
java.util.List<? extends ReferenceManager<S,?>> |
getReferenceManagers() |
org.osgi.framework.ServiceReference<S> |
getRegisteredServiceReference() |
(package private) java.util.List<DependencyManager<S,?>> |
getReversedDependencyManagers()
Returns an iterator over the
DependencyManager objects
representing the declared references in reversed declaration order |
private java.lang.Object |
getService()
All ComponentManagers are ServiceFactory instances
|
(package private) boolean |
getServiceInternal(org.osgi.framework.ServiceRegistration<S> serviceRegistration) |
java.util.Dictionary<java.lang.String,java.lang.Object> |
getServiceProperties()
Returns the subset of component properties to be used as service
properties.
|
protected org.osgi.framework.ServiceRegistration<S> |
getServiceRegistration() |
int |
getSpecState() |
(package private) AbstractComponentManager.State |
getState() |
(package private) java.util.concurrent.atomic.AtomicInteger |
getTrackingCount() |
(package private) abstract boolean |
hasInstance() |
private boolean |
hasServiceRegistrationPermissions() |
private void |
initDependencyManagers(ComponentContextImpl<S> componentContext) |
(package private) abstract <T> void |
invokeBindMethod(DependencyManager<S,T> dependencyManager,
RefPair<S,T> refPair,
int trackingCount) |
(package private) abstract <T> void |
invokeUnbindMethod(DependencyManager<S,T> dependencyManager,
RefPair<S,T> oldRefPair,
int trackingCount) |
(package private) abstract <T> boolean |
invokeUpdatedMethod(DependencyManager<S,T> dependencyManager,
RefPair<S,T> refPair,
int trackingCount)
Invoke updated method
|
boolean |
isFactory() |
protected boolean |
isImmediate() |
(package private) boolean |
isStateLocked() |
private java.util.List<DependencyManager<S,?>> |
loadDependencyManagers(ComponentMetadata metadata) |
(package private) void |
notifyWaiters() |
(package private) void |
obtainActivationReadLock() |
(package private) void |
obtainActivationWriteLock() |
private void |
obtainLock(java.util.concurrent.locks.Lock lock) |
(package private) void |
obtainStateLock() |
(package private) abstract void |
postRegister() |
(package private) abstract void |
preDeregister() |
abstract void |
reconfigure(java.util.Map<java.lang.String,java.lang.Object> configuration,
boolean configurationDeleted,
TargetedPID factoryPid) |
(package private) void |
registerComponentId() |
(package private) <T> void |
registerMissingDependency(DependencyManager<S,T> dm,
org.osgi.framework.ServiceReference<T> ref,
int trackingCount) |
protected boolean |
registerService()
Registers the service on behalf of the component.
|
(package private) void |
releaseActivationReadLock() |
(package private) void |
releaseActivationWriteeLock() |
(package private) void |
releaseStateLock() |
void |
setFailureReason(java.lang.Throwable e)
Set the activation failure reason
|
abstract void |
setServiceProperties(java.util.Dictionary<java.lang.String,?> serviceProperties) |
void |
setServiceProperties(MethodResult methodResult,
java.lang.Integer trackingCount) |
(package private) void |
setState(AbstractComponentManager.State previousState,
AbstractComponentManager.State newState) |
java.lang.String |
toString() |
(package private) void |
tracked(int trackingCount) |
(package private) void |
unregisterComponentId() |
protected boolean |
unregisterService() |
(package private) void |
updateTargets(java.util.Map<java.lang.String,java.lang.Object> properties) |
protected boolean |
verifyDependencyManagers() |
(package private) void |
waitForTracked(int trackingCount)
We effectively maintain the set of completely processed service event tracking counts.
|
static final java.lang.String[] REASONS
protected final ComponentContainer<S> m_container
protected final boolean m_factoryInstance
private volatile long m_componentId
private final ComponentMethods<S> m_componentMethods
private final java.util.List<DependencyManager<S,?>> m_dependencyManagers
private volatile boolean m_dependencyManagersInitialized
private final java.util.concurrent.atomic.AtomicInteger m_trackingCount
private final java.util.concurrent.locks.ReentrantLock m_stateLock
private final java.util.concurrent.atomic.AtomicReference<org.osgi.util.promise.Deferred<java.lang.Void>> m_enabledLatchRef
private final java.util.concurrent.atomic.AtomicReference<AbstractComponentManager.State> state
private volatile int m_floor
private volatile int m_ceiling
private final java.util.concurrent.locks.Lock m_missingLock
private final java.util.concurrent.locks.Condition m_missingCondition
private final java.util.Set<java.lang.Integer> m_missing
protected final java.util.concurrent.locks.ReentrantReadWriteLock m_activationLock
private volatile java.lang.String failureReason
private static final java.util.concurrent.atomic.AtomicLong taskCounter
final RegistrationManager<org.osgi.framework.ServiceRegistration<S>> registrationManager
protected AbstractComponentManager(ComponentContainer<S> container, ComponentMethods<S> componentMethods)
container
- The component containercomponentMethods
- The component methodsprotected AbstractComponentManager(ComponentContainer<S> container, ComponentMethods<S> componentMethods, boolean factoryInstance)
container
- The component containercomponentMethods
- The component methodsfactoryInstance
- Flag whether this is a factory instancefinal long getLockTimeout()
private void obtainLock(java.util.concurrent.locks.Lock lock)
final void obtainActivationReadLock()
final void releaseActivationReadLock()
final void obtainActivationWriteLock()
final void releaseActivationWriteeLock()
final void obtainStateLock()
final void releaseStateLock()
final boolean isStateLocked()
final void dumpThreads()
void tracked(int trackingCount)
void waitForTracked(int trackingCount)
trackingCount
- private boolean doMissingWait() throws java.lang.InterruptedException
java.lang.InterruptedException
void registerComponentId()
void unregisterComponentId()
public final org.osgi.util.promise.Promise<java.lang.Void> enable(boolean async)
org.osgi.util.promise.Deferred<java.lang.Void> enableLatchWait()
java.lang.InterruptedException
public final org.osgi.util.promise.Promise<java.lang.Void> disable(boolean async)
void dispose()
public void dispose(int reason)
This method unlike the other state change methods immediately takes action and disposes the component. The reason for this is, that this method has to actually complete before other actions like bundle stopping may continue.
<T> void registerMissingDependency(DependencyManager<S,T> dm, org.osgi.framework.ServiceReference<T> ref, int trackingCount)
public long getId()
getId
in interface ComponentManager<S>
public org.osgi.framework.Bundle getBundle()
Bundle
providing this component. If the
component as already been disposed off, this method returns
null
.org.osgi.framework.BundleContext getBundleContext()
protected boolean isImmediate()
public boolean isFactory()
final void enableInternal()
final void activateInternal()
final void deactivateInternal(int reason, boolean disable, boolean dispose)
reason
- reason for actiondisable
- whether to also disable the managerdispose
- whether to also dispose of the managerprivate void doDeactivate(int reason, boolean disable)
final void disableInternal()
protected abstract void deleteComponent(int reason)
boolean getServiceInternal(org.osgi.framework.ServiceRegistration<S> serviceRegistration)
private java.lang.Object getService()
ComponentMethods<S> getComponentMethods()
protected java.lang.String[] getProvidedServices()
protected boolean registerService()
protected boolean unregisterService()
protected org.osgi.framework.ServiceRegistration<S> getServiceRegistration()
java.util.concurrent.atomic.AtomicInteger getTrackingCount()
private void initDependencyManagers(ComponentContextImpl<S> componentContext)
protected boolean collectDependencies(ComponentContextImpl<S> componentContext)
componentContext
- possible instance key for prototype scope referencesabstract <T> boolean invokeUpdatedMethod(DependencyManager<S,T> dependencyManager, RefPair<S,T> refPair, int trackingCount)
true
if the component needs reactivation, false
otherwise.abstract <T> void invokeBindMethod(DependencyManager<S,T> dependencyManager, RefPair<S,T> refPair, int trackingCount)
abstract <T> void invokeUnbindMethod(DependencyManager<S,T> dependencyManager, RefPair<S,T> oldRefPair, int trackingCount)
void notifyWaiters()
public ComponentActivator getActivator()
void clear()
public ComponentLogger getLogger()
public java.lang.String toString()
toString
in class java.lang.Object
private boolean hasServiceRegistrationPermissions()
private java.util.List<DependencyManager<S,?>> loadDependencyManagers(ComponentMetadata metadata)
final void updateTargets(java.util.Map<java.lang.String,java.lang.Object> properties)
protected boolean verifyDependencyManagers()
java.util.List<DependencyManager<S,?>> getDependencyManagers()
DependencyManager
objects
representing the declared references in declaration orderpublic java.util.List<? extends ReferenceManager<S,?>> getReferenceManagers()
getReferenceManagers
in interface ComponentManager<S>
java.util.List<DependencyManager<S,?>> getReversedDependencyManagers()
DependencyManager
objects
representing the declared references in reversed declaration orderDependencyManager<S,?> getDependencyManager(java.lang.String name)
private void deactivateDependencyManagers()
private void disableDependencyManagers()
public abstract java.util.Map<java.lang.String,java.lang.Object> getProperties()
getProperties
in interface ComponentManager<S>
public abstract void setServiceProperties(java.util.Dictionary<java.lang.String,?> serviceProperties)
public java.util.Dictionary<java.lang.String,java.lang.Object> getServiceProperties()
protected static java.util.Dictionary<java.lang.String,java.lang.Object> copyTo(java.util.Dictionary<java.lang.String,java.lang.Object> target, java.util.Map<java.lang.String,?> source, boolean allProps)
source
Dictionary
into the target
Dictionary
except for private
properties (whose name has a leading dot) which are only copied if the
allProps
parameter is true
.target
- The Dictionary
into which to copy the
properties. If null
a new Hashtable
is
created.source
- The Dictionary
providing the properties to
copy. If null
or empty, nothing is copied.allProps
- Whether all properties (true
) or only the
public properties (false
) are to be copied.target
is returned, which may be empty if
source
is null
or empty and
target
was null
or all properties are
private and had not to be copiedprotected static java.util.Map<java.lang.String,java.lang.Object> copyToMap(java.util.Dictionary<java.lang.String,?> source, boolean allProps)
source
Dictionary
into the target
Dictionary
except for private
properties (whose name has a leading dot) which are only copied if the
allProps
parameter is true
.source
- The Dictionary
providing the properties to
copy. If null
or empty, nothing is copied.allProps
- Whether all properties (true
) or only the
public properties (false
) are to be copied.target
is returned, which may be empty if
source
is null
or empty and
target
was null
or all properties are
private and had not to be copiedprotected static java.util.Dictionary<java.lang.String,java.lang.Object> copyToDictionary(java.util.Dictionary<java.lang.String,?> source, boolean allProps)
public ComponentMetadata getComponentMetadata()
public int getSpecState()
getSpecState
in interface ComponentManager<S>
AbstractComponentManager.State getState()
public java.lang.String getFailureReason()
getFailureReason
in interface ComponentManager<S>
public void setFailureReason(java.lang.Throwable e)
e
- The exception which caused the activation to failvoid setState(AbstractComponentManager.State previousState, AbstractComponentManager.State newState)
abstract boolean hasInstance()
public void setServiceProperties(MethodResult methodResult, java.lang.Integer trackingCount)
abstract void postRegister()
abstract void preDeregister()
public abstract void reconfigure(java.util.Map<java.lang.String,java.lang.Object> configuration, boolean configurationDeleted, TargetedPID factoryPid)
public abstract void getComponentManagers(java.util.List<AbstractComponentManager<S>> cms)
public final org.osgi.framework.ServiceReference<S> getRegisteredServiceReference()
getRegisteredServiceReference
in interface ComponentManager<S>