public abstract class AbstractComponentManager<S> extends java.lang.Object implements SimpleLogger, ComponentManager<S>
Modifier and Type | Class and Description |
---|---|
protected static class |
AbstractComponentManager.State |
Modifier and Type | Field and Description |
---|---|
protected java.util.concurrent.locks.ReentrantReadWriteLock |
m_activationLock |
private int |
m_ceiling |
private long |
m_componentId |
private ComponentMethods |
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_DISABLED, STATE_DISPOSED, STATE_SATISFIED, STATE_UNSATISFIED_CONFIGURATION, STATE_UNSATISFIED_REFERENCE
Modifier | Constructor and Description |
---|---|
protected |
AbstractComponentManager(ComponentContainer<S> container,
ComponentMethods componentMethods)
The constructor receives both the activator and the metadata
|
protected |
AbstractComponentManager(ComponentContainer<S> container,
ComponentMethods componentMethods,
boolean factoryInstance) |
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 |
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 |
long |
getId() |
(package private) long |
getLockTimeout() |
protected java.lang.String |
getName() |
abstract java.util.Map<java.lang.String,java.lang.Object> |
getProperties() |
protected java.lang.String[] |
getProvidedServices() |
java.util.List<? extends ReferenceManager<S,?>> |
getReferenceManagers() |
(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.
|
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() |
(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
|
(package private) boolean |
isActivatorActive() |
boolean |
isFactory() |
protected boolean |
isImmediate() |
boolean |
isLogEnabled(int level)
Returns
true if logging for the given level is enabled. |
(package private) boolean |
isStateLocked() |
private java.util.List<DependencyManager<S,?>> |
loadDependencyManagers(ComponentMetadata metadata) |
void |
log(int level,
java.lang.String message,
java.lang.Object[] arguments,
java.lang.Throwable ex) |
void |
log(int level,
java.lang.String message,
java.lang.Throwable ex) |
(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() |
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 long m_componentId
private final ComponentMethods 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 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 static final java.util.concurrent.atomic.AtomicLong taskCounter
final RegistrationManager<org.osgi.framework.ServiceRegistration<S>> registrationManager
protected AbstractComponentManager(ComponentContainer<S> container, ComponentMethods componentMethods)
container
- componentMethods
- protected AbstractComponentManager(ComponentContainer<S> container, ComponentMethods componentMethods, boolean factoryInstance)
final 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>
protected java.lang.String getName()
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 getComponentMethods()
protected java.lang.String[] getProvidedServices()
protected boolean registerService()
protected boolean unregisterService()
java.util.concurrent.atomic.AtomicInteger getTrackingCount()
private void initDependencyManagers()
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()
boolean isActivatorActive()
void clear()
public boolean isLogEnabled(int level)
true
if logging for the given level is enabled.isLogEnabled
in interface SimpleLogger
public void log(int level, java.lang.String message, java.lang.Throwable ex)
log
in interface SimpleLogger
public void log(int level, java.lang.String message, java.lang.Object[] arguments, java.lang.Throwable ex)
log
in interface SimpleLogger
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()
void 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)