Class SOContainer
- java.lang.Object
-
- org.eclipse.ecf.core.AbstractContainer
-
- org.eclipse.ecf.provider.generic.SOContainer
-
- All Implemented Interfaces:
org.eclipse.core.runtime.IAdaptable
,IContainer
,IIdentifiable
,IReliableContainer
,ISharedObjectContainer
- Direct Known Subclasses:
ClientSOContainer
,ServerSOContainer
public abstract class SOContainer extends AbstractContainer implements ISharedObjectContainer
-
-
Field Summary
Fields Modifier and Type Field Description protected ISharedObjectContainerConfig
config
static String
DEFAULT_OBJECT_ARG_KEY
static String
DEFAULT_OBJECT_ARGTYPES_KEY
protected org.eclipse.ecf.provider.generic.SOContainerGMM
groupManager
protected boolean
isClosing
protected ThreadGroup
loadingThreadGroup
protected ISharedObjectPolicy
policy
protected ISynchAsynchEventHandler
receiver
protected SOManager
sharedObjectManager
protected ISharedObjectMessageSerializer
sharedObjectMessageSerializer
protected ThreadGroup
sharedObjectThreadGroup
-
Constructor Summary
Constructors Constructor Description SOContainer(ISharedObjectContainerConfig config)
-
Method Summary
-
Methods inherited from class org.eclipse.ecf.core.AbstractContainer
addListener, fireContainerEvent, getPasswordFromConnectContext, removeListener
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.eclipse.ecf.core.IContainer
addListener, removeListener
-
-
-
-
Field Detail
-
DEFAULT_OBJECT_ARG_KEY
public static final String DEFAULT_OBJECT_ARG_KEY
-
DEFAULT_OBJECT_ARGTYPES_KEY
public static final String DEFAULT_OBJECT_ARGTYPES_KEY
-
config
protected ISharedObjectContainerConfig config
-
groupManager
protected org.eclipse.ecf.provider.generic.SOContainerGMM groupManager
-
isClosing
protected boolean isClosing
-
loadingThreadGroup
protected ThreadGroup loadingThreadGroup
-
sharedObjectManager
protected SOManager sharedObjectManager
-
policy
protected ISharedObjectPolicy policy
-
sharedObjectThreadGroup
protected ThreadGroup sharedObjectThreadGroup
-
sharedObjectMessageSerializer
protected ISharedObjectMessageSerializer sharedObjectMessageSerializer
- Since:
- 2.0
-
receiver
protected ISynchAsynchEventHandler receiver
-
-
Constructor Detail
-
SOContainer
public SOContainer(ISharedObjectContainerConfig config)
-
-
Method Detail
-
setSharedObjectMessageSerializer
public void setSharedObjectMessageSerializer(ISharedObjectMessageSerializer serializer)
Description copied from interface:ISharedObjectContainer
Set the shared object message serializer. The serializer should not be
null
.Note that users of this method should guarantee that their are not pending messages to be sent/received...typically by only calling this method prior to connecting/being connected to from remote containers.
Note also that the serializer must perform well when it's methods are called, to prevent negatively impacting overall container messaging performance.
- Specified by:
setSharedObjectMessageSerializer
in interfaceISharedObjectContainer
- Since:
- 2.0
-
getSharedObjectMessageSerializer
protected ISharedObjectMessageSerializer getSharedObjectMessageSerializer()
- Returns:
- ISharedObjectMessageSerializer the shared object message serializer
- Since:
- 2.0
-
getID
public ID getID()
Description copied from interface:IIdentifiable
Return the ID for this 'identifiable' object. The returned ID should be unique within its namespace. May returnnull
.- Specified by:
getID
in interfaceIIdentifiable
- Returns:
- the ID for this identifiable object. May return
null
.
-
connect
public abstract void connect(ID groupID, IConnectContext connectContext) throws ContainerConnectException
Description copied from interface:IContainer
Connect to a target remote process or process group. The target identified by the first parameter (targetID) is connected the implementation class. If authentication information is required, the required information is given via via the second parameter (connectContext). Callers note that depending upon the provider implementation this method may block. It is suggested that callers use a separate thread to call this method. This method provides an implementation independent way for container implementations to connect, authenticate, and communicate with a remote service or group of services. Providers are responsible for implementing this operation in a way appropriate to the given remote service (or group) via expected protocol.- Specified by:
connect
in interfaceIContainer
- Parameters:
groupID
- the ID of the remote server or group to connect to. SeeIContainer.getConnectNamespace()
for a explanation of the constraints upon this parameter.connectContext
- any required context to allow this container to authenticate. May benull
if underlying provider does not have any authentication requirements for connection.- Throws:
ContainerConnectException
- thrown if communication cannot be established with remote service. Causes can include network connection failure, authentication failure, server error, or if container is already connected.
-
getConnectedID
public abstract ID getConnectedID()
Description copied from interface:IContainer
Get the target ID that this container instance has connected to. Returns null if not connected.- Specified by:
getConnectedID
in interfaceIContainer
- Returns:
- ID of the target we are connected to. Returns
null
if container not connected.
-
disconnect
public abstract void disconnect()
Description copied from interface:IContainer
Disconnect. This operation will disconnect the local container instance from any previously joined target or group. Subsequent calls to getConnectedID() will returnnull
.- Specified by:
disconnect
in interfaceIContainer
-
getConnectNamespace
public Namespace getConnectNamespace()
Description copied from interface:IContainer
Get the Namespace for creating a targetID suitable for use as the first parameter in subsequent calls toIContainer.connect(ID, IConnectContext)
. If this method returnsnull
, then it means thatnull
is expected as a valid parameter in subsequent calls toIContainer.connect(ID, IConnectContext)
. If this method returns a non-null
Namespace, then thetargetID
parameter inIContainer.connect(ID, IConnectContext)
must be non-null
instance created of the returned Namespace.- Specified by:
getConnectNamespace
in interfaceIContainer
- Returns:
- Namespace the namespace associated with subsequent calls to
IContainer.connect(ID, IConnectContext)
. Ifnull
, then thetargetID
instances passed toIContainer.connect(ID, IConnectContext)
may benull
. If notnull
, thentargetID
instances passed toIContainer.connect(ID, IConnectContext)
must be instances of the returned Namespace.
-
dispose
public void dispose()
Description copied from interface:IContainer
Dispose this IContainer instance. The container instance will be made inactive after the completion of this method and will be unavailable for subsequent usage.- Specified by:
dispose
in interfaceIContainer
- Overrides:
dispose
in classAbstractContainer
-
getAdapter
public Object getAdapter(Class adapter)
Description copied from interface:IContainer
This specialization of IAdaptable.getAdapter() returns additional services supported by this container. A container that supports additional services over and above the methods onIContainer
should return them using this method. It is recommended that clients use this method rather than instanceof checks and downcasts to find out about the capabilities of a specific container.Typically, after obtaining an IContainer, a client would use this method as a means to obtain a more meaningful interface to the container. This interface may or may not extend IContainer. For example, a client could use the following code to obtain an instance of ISharedObjectContainer:
IContainer newContainer = ContainerFactory.createContainer(type); ISharedObjectContainer soContainer = (ISharedObjectContainer) newContainer .getAdapter(ISharedObjectContainer.class); if (soContainer == null) throw new ContainerCreateException(message);
Implementations of this method should delegate to
IAdapterManager.loadAdapter()
if the service cannot be provided directly to ensure extensibility by third-party plug-ins.- Specified by:
getAdapter
in interfaceorg.eclipse.core.runtime.IAdaptable
- Specified by:
getAdapter
in interfaceIContainer
- Overrides:
getAdapter
in classAbstractContainer
- Parameters:
adapter
- the service type to look up- Returns:
- the service instance castable to the given class, or
null
if this container does not support the given service
-
getSharedObjectManager
public ISharedObjectManager getSharedObjectManager()
Description copied from interface:ISharedObjectContainer
Get SharedObjectManager for this container- Specified by:
getSharedObjectManager
in interfaceISharedObjectContainer
- Returns:
- ISharedObjectManager for this container instance
-
getGroupMemberIDs
public ID[] getGroupMemberIDs()
Description copied from interface:IReliableContainer
Get the current membership of the joined group. This method will accurately report the current group membership of the connected group.- Specified by:
getGroupMemberIDs
in interfaceIReliableContainer
- Returns:
- ID[] the IDs of the current group membership
-
getConfig
public ISharedObjectContainerConfig getConfig()
-
isGroupManager
public abstract boolean isGroupManager()
- Specified by:
isGroupManager
in interfaceIReliableContainer
- Returns:
- true if this IReliableContainer instance is in the 'manager' role for the group, false otherwise.
-
setRemoteAddPolicy
protected void setRemoteAddPolicy(ISharedObjectPolicy policy)
-
addSharedObject0
protected ISharedObjectContainerTransaction addSharedObject0(ID id, ISharedObject s, Map props) throws Exception
- Throws:
Exception
-
addSharedObjectAndWait
protected void addSharedObjectAndWait(ID id, ISharedObject s, Map properties) throws Exception
- Throws:
Exception
-
addSharedObjectWrapper
protected ISharedObjectContainerTransaction addSharedObjectWrapper(SOWrapper wrapper) throws Exception
- Throws:
Exception
-
addToLoading
protected boolean addToLoading(org.eclipse.ecf.provider.generic.SOContainer.LoadingSharedObject lso)
-
checkRemoteCreate
protected Object checkRemoteCreate(ID fromID, ID toID, ReplicaSharedObjectDescription desc) throws Exception
Check remote creation of shared objects. This method is called by the remote shared object creation message handler, to verify that the shared object from container 'fromID' to container 'toID' with description 'desc' is to be allowed to be created within the current container. If this method throws, a failure (and exception will be sent back to caller If this method returns null, the create message is ignored. If this method returns a non-null object, the creation is allowed to proceed. The default implementation is to return a non-null object- Parameters:
fromID
- the ID of the container sending us this create requesttoID
- the ID (or null) of the container intended to receive this requestdesc
- the SharedObjectDescription that describes the shared object to be created- Returns:
- Object null if the create message is to be ignored, non-null if the creation should continue
- Throws:
Exception
- may throw any Exception to communicate back (via sendCreateResponse) to the sender that the creation has failed
-
debug
protected void debug(String msg)
-
destroySharedObject
protected boolean destroySharedObject(ID sharedObjectID)
-
forward
protected final void forward(ID fromID, ID toID, ContainerMessage data) throws IOException
- Throws:
IOException
-
forwardExcluding
protected abstract void forwardExcluding(ID from, ID excluding, ContainerMessage data) throws IOException
- Throws:
IOException
-
forwardToRemote
protected abstract void forwardToRemote(ID from, ID to, ContainerMessage data) throws IOException
- Throws:
IOException
-
getArgsFromProperties
protected Object[] getArgsFromProperties(SharedObjectDescription sd)
- Parameters:
sd
- shared object description- Returns:
- Object[] arguments from the shared object description properties
-
getArgTypesFromProperties
protected String[] getArgTypesFromProperties(SharedObjectDescription sd)
- Parameters:
sd
- shared object description- Returns:
- String[] arguments types from shared object description properties
-
serialize
public static byte[] serialize(Serializable obj) throws IOException
- Throws:
IOException
-
getClassLoaderForContainer
protected ClassLoader getClassLoaderForContainer()
-
getClassLoaderForSharedObject
protected ClassLoader getClassLoaderForSharedObject(SharedObjectDescription sd)
- Parameters:
sd
- shared object description- Returns:
- ClassLoader classloader to used for given shared object description
-
getGroupMembershipLock
protected Object getGroupMembershipLock()
-
getMaxGroupMembers
protected int getMaxGroupMembers()
-
getNewSharedObjectThread
protected Thread getNewSharedObjectThread(ID sharedObjectID, Runnable runnable)
-
getNextSequenceNumber
protected long getNextSequenceNumber()
-
deserializeContainerMessage
public static ContainerMessage deserializeContainerMessage(byte[] bytes) throws IOException
- Throws:
IOException
-
printToSystemError
protected static void printToSystemError(String message, Throwable t)
- Parameters:
message
- messaget
- exception to print to system error- Since:
- 2.0
-
getOtherMemberIDs
protected ID[] getOtherMemberIDs()
-
getReceiver
protected ISynchAsynchEventHandler getReceiver()
-
getMessageReceiver
public ISynchAsynchEventHandler getMessageReceiver()
- Returns:
- ISynchAsyncEventHandler message receiver
- Since:
- 4.7
-
getSharedObject
protected ISharedObject getSharedObject(ID id)
-
getSharedObjectIDs
protected ID[] getSharedObjectIDs()
-
handleAsynchIOException
protected void handleAsynchIOException(IOException except, AsynchEvent e)
-
handleCreateMessage
protected void handleCreateMessage(ContainerMessage mess) throws IOException
- Throws:
IOException
-
handleCreateResponseMessage
protected void handleCreateResponseMessage(ContainerMessage mess) throws IOException
- Throws:
IOException
-
handleLeaveGroupMessage
protected abstract void handleLeaveGroupMessage(ContainerMessage mess)
- Parameters:
mess
- leave group message
-
verifySharedObjectMessageTarget
protected boolean verifySharedObjectMessageTarget(ID containerID)
- Parameters:
containerID
- containerID- Returns:
- boolean true if verified, false otherwise
- Since:
- 4.0
-
handleSharedObjectDisposeMessage
protected void handleSharedObjectDisposeMessage(ContainerMessage mess) throws IOException
- Throws:
IOException
-
verifyToIDForSharedObjectMessage
protected boolean verifyToIDForSharedObjectMessage(ID toID)
-
handleSharedObjectMessage
protected void handleSharedObjectMessage(ContainerMessage mess) throws IOException
- Throws:
IOException
-
handleUndeliveredSharedObjectMessage
protected void handleUndeliveredSharedObjectMessage(ContainerMessage.SharedObjectMessage resp)
- Parameters:
resp
- response message- Since:
- 4.0
-
handleUnidentifiedMessage
protected void handleUnidentifiedMessage(ContainerMessage mess) throws IOException
- Parameters:
mess
- message- Throws:
IOException
- not thrown by this implementation.
-
handleViewChangeMessage
protected abstract void handleViewChangeMessage(ContainerMessage mess) throws IOException
- Throws:
IOException
-
isClosing
protected boolean isClosing()
-
disconnect
protected void disconnect(IConnection conn)
-
load
protected ISharedObject load(SharedObjectDescription sd) throws Exception
- Throws:
Exception
-
createSharedObjectConfig
protected SOConfig createSharedObjectConfig(ID id, ISharedObject obj, Map props) throws ECFException
- Parameters:
id
- idobj
- objprops
- props- Returns:
- SOConfig a non-
null
instance. - Throws:
ECFException
- not thrown by this implementation.
-
createRemoteSharedObjectConfig
protected SOConfig createRemoteSharedObjectConfig(ID fromID, ReplicaSharedObjectDescription sd, ISharedObject obj)
-
createSharedObjectContext
protected SOContext createSharedObjectContext(SOConfig soconfig, IQueueEnqueue queue)
-
createRemoteSharedObjectContext
protected SOContext createRemoteSharedObjectContext(SOConfig soconfig, IQueueEnqueue queue)
-
createSharedObjectWrapper
protected SOWrapper createSharedObjectWrapper(ID id, ISharedObject s, Map props) throws ECFException
- Throws:
ECFException
-
createRemoteSharedObjectWrapper
protected SOWrapper createRemoteSharedObjectWrapper(ID fromID, ReplicaSharedObjectDescription sd, ISharedObject s)
-
handleLeave
protected void handleLeave(ID leftID, IConnection conn)
-
moveFromLoadingToActive
protected void moveFromLoadingToActive(SOWrapper wrap)
-
notifySharedObjectActivated
protected void notifySharedObjectActivated(ID sharedObjectID)
-
notifySharedObjectDeactivated
protected void notifySharedObjectDeactivated(ID sharedObjectID)
-
validateContainerMessage
protected ContainerMessage validateContainerMessage(Object mess)
-
processAsynch
protected void processAsynch(AsynchEvent event) throws IOException
- Parameters:
event
- event- Throws:
IOException
- not thrown by this implementation.
-
getIDForConnection
protected abstract ID getIDForConnection(IAsynchConnection connection)
-
processDisconnect
protected abstract void processDisconnect(DisconnectEvent event)
-
processSynch
protected Serializable processSynch(SynchEvent e) throws IOException
- Throws:
IOException
-
queueContainerMessage
protected abstract void queueContainerMessage(ContainerMessage mess) throws IOException
- Throws:
IOException
-
removeFromLoading
protected void removeFromLoading(ID id)
-
removeRemoteMember
protected boolean removeRemoteMember(ID remoteMember)
-
removeSharedObject
protected ISharedObject removeSharedObject(ID id)
-
sendCreate
protected void sendCreate(ID sharedObjectID, ID toContainerID, SharedObjectDescription sd) throws IOException
- Throws:
IOException
-
sendCreateResponse
protected void sendCreateResponse(ID homeID, ID sharedObjectID, Throwable t, long identifier) throws IOException
- Throws:
IOException
-
sendCreateResponseSharedObjectMessage
protected void sendCreateResponseSharedObjectMessage(ID toContainerID, ID fromSharedObject, Throwable t, long ident) throws IOException
- Throws:
IOException
-
sendCreateSharedObjectMessage
protected ID[] sendCreateSharedObjectMessage(ID toContainerID, SharedObjectDescription sd) throws IOException
- Throws:
IOException
-
createContainerPropertiesForSharedObject
protected Map createContainerPropertiesForSharedObject(ID sharedObjectID)
-
sendDispose
protected void sendDispose(ID toContainerID, ID sharedObjectID) throws IOException
- Throws:
IOException
-
sendDisposeSharedObjectMessage
protected void sendDisposeSharedObjectMessage(ID toContainerID, ID fromSharedObject) throws IOException
- Throws:
IOException
-
sendMessage
protected void sendMessage(ContainerMessage data) throws IOException
- Throws:
IOException
-
serializeSharedObjectMessage
protected byte[] serializeSharedObjectMessage(ID sharedObjectID, Object message) throws IOException
- Throws:
IOException
-
defaultSerializeSharedObjectMessage
protected byte[] defaultSerializeSharedObjectMessage(ID sharedObjectID, Object message) throws IOException
- Parameters:
sharedObjectID
- shared object IDmessage
- message- Returns:
- byte[] serialized message
- Throws:
IOException
- if some problem serializing- Since:
- 2.0
-
defaultDeserializeSharedObjectMessage
protected Object defaultDeserializeSharedObjectMessage(byte[] bytes) throws IOException, ClassNotFoundException
- Parameters:
bytes
- data to deserialized- Returns:
- Object the deserialized shared object message
- Throws:
IOException
- if deserialization cannot be doneClassNotFoundException
- if deserialization cannot be done- Since:
- 2.0
-
deserializeSharedObjectMessage
protected Object deserializeSharedObjectMessage(byte[] bytes) throws IOException, ClassNotFoundException
- Throws:
IOException
ClassNotFoundException
-
sendMessage
protected void sendMessage(ID toContainerID, ID sharedObjectID, Object message) throws IOException
- Throws:
IOException
-
sendSharedObjectMessage
protected void sendSharedObjectMessage(ID toContainerID, ID fromSharedObject, Serializable data) throws IOException
- Throws:
IOException
-
setMaxGroupMembers
protected void setMaxGroupMembers(int max)
-
fireDelegateContainerEvent
protected void fireDelegateContainerEvent(IContainerEvent containerEvent)
- Parameters:
containerEvent
- container event
-
-