Class JvmContext
java.lang.Object
org.djutils.event.LocalEventProducer
nl.tudelft.simulation.naming.context.JvmContext
- All Implemented Interfaces:
Serializable
,Remote
,ContextInterface
,org.djutils.event.EventProducer
- Direct Known Subclasses:
FileContext
The JvmContext is an in-memory, thread-safe context implementation of the ContextInterface.
Copyright (c) 2020-2024 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights reserved. See for project information https://simulation.tudelft.nl. The DSOL project is distributed under a three-clause BSD-style license, which can be found at https://https://simulation.tudelft.nl/dsol/docs/latest/license.html.
- Author:
- Alexander Verbraeck
- See Also:
-
Nested Class Summary
Modifier and TypeClassDescriptionstatic class
Record with Context and Name combination. -
Field Summary
Fields inherited from interface nl.tudelft.simulation.naming.context.ContextInterface
OBJECT_ADDED_EVENT, OBJECT_CHANGED_EVENT, OBJECT_REMOVED_EVENT, REPLACE_SEPARATOR, ROOT, SEPARATOR
Fields inherited from interface org.djutils.event.EventProducer
FIRST_POSITION, LAST_POSITION
-
Constructor Summary
ConstructorDescriptionJvmContext
(String atomicName) constructs a new root JvmContext.JvmContext
(ContextInterface parent, String atomicName) Constructs a new JvmContext. -
Method Summary
Modifier and TypeMethodDescriptionvoid
Binds an object into the Context using the name.bindings()
Returns a (raw) map of bindings in the current context, mapping the name on the registered objects.void
bindObject
(Object object) Binds an object into the Context using the toString() method of the object as the key.void
bindObject
(String key, Object object) Binds an object into this Context using the key.void
checkCircular
(Object newObject) Check whether a circular reference would occur when the object would be inserted into the current context.void
close()
Closes the context and removes all content from the context.createSubcontext
(String name) Creates and binds a new context into the current Context using the name.protected void
destroy
(ContextInterface context) Recursively unbind and destroy all keys and subcontexts from the given context, leaving it empty.void
destroySubcontext
(String name) Removes the binding for an existing, empty subcontext with the given name, and recursively unbinds all objects and contexts in the context indicated by the name.boolean
Indicates whether an object with the given name has been registered in the Context.void
Fire an OBJECT_CHANGED_EVENT for an object with the given key in the current context.void
fireObjectChangedEventValue
(Object object) Fire an OBJECT_CHANGED_EVENT for an object within the current context.Retrieves the named object from the Context.Returns the absolute path for this context, or an empty string when this is the root context.Retrieves the atomic name of this context.Retrieves the named object from the Context.Retrieves the parent context for this context, or null when this is the root context.Retrieves the root context for this context, or the current context when this is the root context.boolean
Indicates whether the key has been registered in the current Context.boolean
Indicates whether the object has been registered (once or more) in the current Context.boolean
isEmpty()
Indicates whether the current context is empty.keySet()
Returns a set of registered keys in the current context.protected JvmContext.ContextName
Take a (compound) name such as "sub1/sub2/key" or "key" or "/sub/key" and lookup the final sub-context of the path, and store it in the ContextName.protected ContextInterface
lookupAndBuild
(String name) Take a (compound) name such as "sub1/sub2/key" or "key" or "/sub/key" and lookup and/or create all intermediate contexts as well as the final sub-context of the path.void
Replaces an object in the Context with the given name, or registers the object when a registration with the name does not exist yet.void
rebindObject
(String key, Object object) Replaces an object in this Context with the given key, or registers the object when a registration with the key does not exist yet.void
Replaces the name under which an object has been registered in the Context.toString()
toString
(boolean verbose) Return a String with the hierarchical content of the Context in case verbose is true; otherwise return the atomic name.void
Removes the binding for an object in the Context with the given name.void
unbindObject
(String key) Removes the binding for an object in this Context with the given key.values()
Returns a (raw) collection of registered values in the current context.Methods inherited from class org.djutils.event.LocalEventProducer
addListener, addListener, addListener, addListener, fireEvent, fireEvent, fireEvent, fireTimedEvent, fireTimedEvent, fireTimedEvent, fireUnverifiedEvent, fireUnverifiedEvent, fireUnverifiedTimedEvent, fireUnverifiedTimedEvent, getEventListenerMap, getEventTypesWithListeners, getListenerReferences, hasListeners, numberOfListeners, removeAllListeners, removeAllListeners, removeListener
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
Methods inherited from interface org.djutils.event.EventProducer
addListener, addListener, addListener, addListener, fireEvent, fireEvent, fireEvent, fireTimedEvent, fireTimedEvent, fireTimedEvent, fireUnverifiedEvent, fireUnverifiedEvent, fireUnverifiedTimedEvent, fireUnverifiedTimedEvent, getEventListenerMap, getEventTypesWithListeners, getListenerReferences, hasListeners, numberOfListeners, removeAllListeners, removeAllListeners, removeListener
-
Field Details
-
parent
the parent context. -
elements
the children.
-
-
Constructor Details
-
JvmContext
constructs a new root JvmContext.- Parameters:
atomicName
- String; the name under which the root context will be registered
-
JvmContext
Constructs a new JvmContext.- Parameters:
parent
- Context; the parent contextatomicName
- String; the name under which the context will be registered
-
-
Method Details
-
getAtomicName
Retrieves the atomic name of this context.- Specified by:
getAtomicName
in interfaceContextInterface
- Returns:
- String; the atomic name of this context
- Throws:
RemoteException
- on a network error when the Context is used over RMI
-
getParent
Retrieves the parent context for this context, or null when this is the root context.- Specified by:
getParent
in interfaceContextInterface
- Returns:
- ContextInterface; parent context for this context, or null when this is the root context
- Throws:
RemoteException
- on a network error when the Context is used over RMI
-
getRootContext
Retrieves the root context for this context, or the current context when this is the root context.- Specified by:
getRootContext
in interfaceContextInterface
- Returns:
- ContextInterface; the root context for this context
- Throws:
RemoteException
- on a network error when the Context is used over RMI
-
getAbsolutePath
Returns the absolute path for this context, or an empty string when this is the root context.- Specified by:
getAbsolutePath
in interfaceContextInterface
- Returns:
- String; the absolute path for this context, or an empty string when this is the root context
- Throws:
RemoteException
- on a network error when the Context is used over RMI
-
getObject
Retrieves the named object from the Context. The key is not compound. Key cannot be empty or contain "/".- Specified by:
getObject
in interfaceContextInterface
- Parameters:
key
- String; the name of the object to look up; NOT a compound name- Returns:
- Object; the Context or Object indicated by the key
- Throws:
NamingException
- when key is the empty string or when key contains "/"NameNotFoundException
- if the key does not exist in the current contextRemoteException
- on a network error when the Context is used over RMI
-
get
Retrieves the named object from the Context. The name may be a compound name where parts are separated by separation strings indicating subcontexts. All intermediate subcontexts must exist. When name is the empty String or "/", the current Context is returned.- Specified by:
get
in interfaceContextInterface
- Parameters:
name
- String; the name of the object to look up; may be a compound name- Returns:
- Object; the Context or Object indicated by the name
- Throws:
NamingException
- as a placeholder overarching exceptionNameNotFoundException
- if an intermediate context or the reference does not existRemoteException
- on a network error when the Context is used over RMI
-
exists
Indicates whether an object with the given name has been registered in the Context. The name may be a compound name where parts are separated by separation strings indicating subcontexts. All intermediate subcontexts must exist. When name is the empty String or "/", the method returns true.- Specified by:
exists
in interfaceContextInterface
- Parameters:
name
- String; the name of the object to look up; may be a compound name- Returns:
- boolean; whether an object with the given name has been registered
- Throws:
NamingException
- as a placeholder overarching exceptionNameNotFoundException
- when an intermediate context does not existRemoteException
- on a network error when the Context is used over RMI
-
hasKey
Indicates whether the key has been registered in the current Context. The name is not compound. When name is the empty String or "/", the method returns an exception.- Specified by:
hasKey
in interfaceContextInterface
- Parameters:
key
- String; the name of the object to look up; NOT compound- Returns:
- boolean; whether an object with the given key has been registered in the current context
- Throws:
NamingException
- when key is the empty string or when key contains "/"RemoteException
- on a network error when the Context is used over RMI
-
hasObject
Indicates whether the object has been registered (once or more) in the current Context. The object may be null.- Specified by:
hasObject
in interfaceContextInterface
- Parameters:
object
- Object; the object to look up; mey be null- Returns:
- boolean; whether an object with the given key has been registered once or more in the current context
- Throws:
RemoteException
- on a network error when the Context is used over RMI
-
isEmpty
Indicates whether the current context is empty.- Specified by:
isEmpty
in interfaceContextInterface
- Returns:
- boolean; whether the current context is empty
- Throws:
RemoteException
- on a network error when the Context is used over RMI
-
bindObject
Binds an object into this Context using the key. The key is not compound. The key cannot be empty or "/". An OBJECT_ADDED_EVENT is fired containing an object array with a pointer to the context, the relative key, and the object when a new binding has taken place.- Specified by:
bindObject
in interfaceContextInterface
- Parameters:
key
- String; the key under which the object will be stored; NOT a compound nameobject
- Object; the Context or Object to be stored into this Context using the given name; a null object is allowed- Throws:
NamingException
- when key is the empty string or when key contains "/"NameAlreadyBoundException
- if key is already bound to an objectRemoteException
- on a network error when the Context is used over RMI
-
bindObject
Binds an object into the Context using the toString() method of the object as the key. All "/" characters in the toString() result will be replaced by "#" characters. An OBJECT_ADDED_EVENT is fired containing an object array with a pointer to the context, the relative key, and the object when a new binding has taken place.- Specified by:
bindObject
in interfaceContextInterface
- Parameters:
object
- Object; the Context or Object to be stored into this Context using the toString() result as the key; a null object is not allowed- Throws:
NamingException
- when the toString() of the object results in an empty stringNameAlreadyBoundException
- if key is already bound to an objectRemoteException
- on a network error when the Context is used over RMI
-
bind
Binds an object into the Context using the name. The name may be a compound name where parts are separated by separation strings indicating subcontexts. All intermediate subcontexts must already exist. The object will be registered using the terminal atomic reference in the deepest subcontext provided. Name cannot be empty or "/". An OBJECT_ADDED_EVENT is fired containing an object array with a pointer to the context, the relative key, and the object when a new binding has taken place.- Specified by:
bind
in interfaceContextInterface
- Parameters:
name
- String; the name under which the object will be stored; may be a compound name with the terminal reference indicating the key under which the object will be storedobject
- Object; the Context or Object to be stored into the given context; a null object is allowed- Throws:
NamingException
- when the reference is "/" or emptyNameAlreadyBoundException
- if name is already bound to an objectNameNotFoundException
- when an intermediate context does not existRemoteException
- on a network error when the Context is used over RMI
-
unbindObject
Removes the binding for an object in this Context with the given key. The key is not compound. The key cannot be empty or "/". It is not a problem when there is no object registered with the given key. An OBJECT_REMOVED_EVENT is fired containing an object array with a pointer to the context, the relative key, and the removed object when a binding has been removed.- Specified by:
unbindObject
in interfaceContextInterface
- Parameters:
key
- String; the key of the object that has to be removed; NOT a compound name- Throws:
NamingException
- when key is the empty string or when key contains "/"RemoteException
- on a network error when the Context is used over RMI
-
unbind
Removes the binding for an object in the Context with the given name. The name may be a compound name where parts are separated by separation strings indicating subcontexts. Name cannot be empty or "/". It is not a problem when there is no object registered with the given name. An OBJECT_REMOVED_EVENT is fired containing an object array with a pointer to the context, the relative key, and the removed object when a binding has been removed.- Specified by:
unbind
in interfaceContextInterface
- Parameters:
name
- String; the name of the object that has to be removed; may be a compound name with the terminal reference indicating the key under which the object is stored- Throws:
NamingException
- when the reference is "/" or emptyNameNotFoundException
- when an intermediate context does not existRemoteException
- on a network error when the Context is used over RMI
-
rebindObject
Replaces an object in this Context with the given key, or registers the object when a registration with the key does not exist yet. The key is not a compound name. Name cannot be empty or "/". An OBJECT_REMOVED_EVENT is fired containing an object array with a pointer to the context, the relative key, and the removed object when a binding had to be removed, followed by an OBJECT_ADDED_EVENT containing an object array with a pointer to the context, the key, and the new object when a new binding has taken place.- Specified by:
rebindObject
in interfaceContextInterface
- Parameters:
key
- String; the key of the object to be replaced, or under which the object will be stored; NOT a compound nameobject
- Object; the Context or Object to be replaced or stored into this Context using the given name; a null object is allowed- Throws:
NamingException
- when key is the empty string or when key contains "/"RemoteException
- on a network error when the Context is used over RMI
-
rebind
Replaces an object in the Context with the given name, or registers the object when a registration with the name does not exist yet. The name may be a compound name where parts are separated by separation strings indicating subcontexts. All intermediate subcontexts must already exist. The object will be (re)registered using the terminal atomic reference in the deepest subcontext provided. Name cannot be empty or "/". An OBJECT_REMOVED_EVENT is fired containing an object array with a pointer to the context, the relative key, and the removed object when a binding had to be removed, followed by an OBJECT_ADDED_EVENT containing an object array with a pointer to the context, the key, and the new object when a new binding has taken place.- Specified by:
rebind
in interfaceContextInterface
- Parameters:
name
- String; the name of the object to be replaced, or under which the object will be stored; may be a compound name with the terminal reference indicating the key under which the object will be storedobject
- Object; the Context or Object to be replaced or stored into this Context using the given name; a null object is allowed- Throws:
NamingException
- when the reference is "/" or emptyNameNotFoundException
- when an intermediate context does not existRemoteException
- on a network error when the Context is used over RMI
-
rename
Replaces the name under which an object has been registered in the Context. Both names are relative to the current Context, and may be compound names where parts are separated by separation strings indicating subcontexts. All intermediate subcontexts of the new name must already exist. The object will be deregistered under the old name, and reregistered using the terminal atomic reference in the deepest subcontext of the newName. Nether the oldName, nor the newName can be empty or "/". An OBJECT_REMOVED_EVENT is fired containing an object array with a pointer to the old context, the old relative key, and the object when a binding had to be removed, followed by an OBJECT_ADDED_EVENT containing an object array with a pointer to the new context, the new relative key, and the object when a new binding has taken place. When the new name is illegal or occupied, the object will not be renamed.- Specified by:
rename
in interfaceContextInterface
- Parameters:
oldName
- String; the (compound) name of the object to be moved to a new locationnewName
- String; the (compound) name with the terminal reference indicating where the object will be stored- Throws:
NamingException
- when the reference of oldName or newName is "/" or emptyNameNotFoundException
- when an intermediate context of oldName or newName does not exist, or when there is no registration at the oldName referenceNameAlreadyBoundException
- if newName is already bound to an objectRemoteException
- on a network error when the Context is used over RMI
-
createSubcontext
Creates and binds a new context into the current Context using the name. The name may be a compound name where parts are separated by separation strings indicating subcontexts. All intermediate subcontexts that do not yet exist, will be created. The new context will be registered using the terminal atomic reference in the deepest subcontext provided. Name cannot be empty or "/". On success, OBJECT_ADDED_EVENTs are fired for the created context and each new intermediate context, containing an object array with an object array with a pointer to the embedding context, the local key in the embedding context, and the newly created (intermediate) context.- Specified by:
createSubcontext
in interfaceContextInterface
- Parameters:
name
- String; the name under which the new context will be stored; may be a compound name with the terminal reference indicating the key under which the new context will be stored- Returns:
- ContextInterface; a pointer to the newly created subcontext
- Throws:
NamingException
- when the terminal reference is "/" or emptyNameNotFoundException
- when an intermediate context does not existNameAlreadyBoundException
- if name is already bound to an object or contextRemoteException
- on a network error when the Context is used over RMI
-
destroySubcontext
Removes the binding for an existing, empty subcontext with the given name, and recursively unbinds all objects and contexts in the context indicated by the name. The name may be a compound name where parts are separated by separation strings indicating subcontexts. Name cannot be empty or "/". A context has to be registered with the given name. For all removed objects and contexts, OBJECT_REMOVED_EVENT events are fired containing an object array with a pointer to the context from which content has been removed, the key of the binding that has been removed, and the removed object. The OBJECT_REMOVED_EVENT events are fired in depth-first order.- Specified by:
destroySubcontext
in interfaceContextInterface
- Parameters:
name
- String; the name of the object that has to be removed; may be a compound name with the terminal reference indicating the key under which the object is stored- Throws:
NamingException
- when the reference is "/" or emptyNotContextException
- if the name is bound but does not name a contextNameNotFoundException
- when an intermediate context does not exist, or when no object is registered with the terminating atomic referenceRemoteException
- on a network error when the Context is used over RMI
-
lookupAndBuild
Take a (compound) name such as "sub1/sub2/key" or "key" or "/sub/key" and lookup and/or create all intermediate contexts as well as the final sub-context of the path.- Parameters:
name
- the (possibly compound) name- Returns:
- the context, possibly built new
- Throws:
NamingException
- as a placeholder overarching exceptionRemoteException
- when the JVM context is used over a network and a network error occursNameNotFoundException
- when an intermediate context does not existNullPointerException
- when name is null
-
destroy
Recursively unbind and destroy all keys and subcontexts from the given context, leaving it empty. All removals will fire an OBJECT_REMOVED event, depth first.- Parameters:
context
- the context to empty- Throws:
NamingException
- on tree inconsistenciesRemoteException
- on RMI error
-
keySet
Returns a set of registered keys in the current context.- Specified by:
keySet
in interfaceContextInterface
- Returns:
- Set<String>; a set of registered keys in the current context
- Throws:
RemoteException
- on a network error when the Context is used over RMI
-
values
Returns a (raw) collection of registered values in the current context.- Specified by:
values
in interfaceContextInterface
- Returns:
- Collection<Object>; a raw set of registered objects in the current context
- Throws:
RemoteException
- on a network error when the Context is used over RMI
-
bindings
Returns a (raw) map of bindings in the current context, mapping the name on the registered objects. Both regular objects and subcontexts are returned. Mappings to null objects can exist.- Specified by:
bindings
in interfaceContextInterface
- Returns:
- Map<String, Object>; a map of registered names and their bound (possibly null) object in the current context
- Throws:
RemoteException
- on a network error when the Context is used over RMI
-
fireObjectChangedEventValue
public void fireObjectChangedEventValue(Object object) throws NameNotFoundException, NullPointerException, NamingException, RemoteException Fire an OBJECT_CHANGED_EVENT for an object within the current context. Look up if the the object exists using the toString() method of the object as the key. All "/" characters in the toString() result will be replaced by "#" characters. When the object does not exist directly in the context, a NameNotFoundException is thrown.- Specified by:
fireObjectChangedEventValue
in interfaceContextInterface
- Parameters:
object
- Object; the object that has changed and for which an event should be fired- Throws:
NameNotFoundException
- when no object is registered with object.toString() as the keyNullPointerException
- when object is nullNamingException
- on general error in the method, e.g., a problem with remote connectionsRemoteException
- on a network error when the Context is used over RMI
-
fireObjectChangedEventKey
public void fireObjectChangedEventKey(String key) throws NameNotFoundException, NullPointerException, NamingException, RemoteException Fire an OBJECT_CHANGED_EVENT for an object with the given key in the current context. If the the key does not exist directly in the context, a NameNotFoundException is thrown. The key should not be the empty String or contain "/" characters.- Specified by:
fireObjectChangedEventKey
in interfaceContextInterface
- Parameters:
key
- String; the key within the context of the object that has changed and for which an event should be fired- Throws:
NameNotFoundException
- when no object is registered with the key in the given contextNullPointerException
- when key is nullNamingException
- when key is the empty string or when key contains "/", or on a general error in the method, e.g., a problem with remote connectionsRemoteException
- on a network error when the Context is used over RMI
-
checkCircular
Check whether a circular reference would occur when the object would be inserted into the current context. Insertion potentially causes a problem when the object to be inserted is a Context.- Specified by:
checkCircular
in interfaceContextInterface
- Parameters:
newObject
- the object to be inserted- Throws:
NamingException
- when a circular reference would occurRemoteException
- on a network error when the Context is used over RMI
-
close
Closes the context and removes all content from the context. No events will be fired that the content of the context has been removed. Some contexts, such as the FileContext could have to be really closed as well.- Specified by:
close
in interfaceContextInterface
- Throws:
NamingException
- when a problem occurs during closing (e.g., of a FileContext)RemoteException
- on a network error when the Context is used over RMI
-
toString
-
toString
Return a String with the hierarchical content of the Context in case verbose is true; otherwise return the atomic name.- Specified by:
toString
in interfaceContextInterface
- Parameters:
verbose
- boolean; whether the information is exhaustive or very brief- Returns:
- String; formatted content of the context when verbose is true; otherwise the atomic name
- Throws:
RemoteException
- on a network error when the Context is used over RMI
-
lookup
Take a (compound) name such as "sub1/sub2/key" or "key" or "/sub/key" and lookup the final sub-context of the path, and store it in the ContextName. Store the key String in the ContextName without checking whether it exists.- Parameters:
name
- the (possibly compound) name- Returns:
- a ContextName combination string the subcontext and final reference name
- Throws:
NamingException
- as a placeholder overarching exceptionNameNotFoundException
- when an intermediate context does not existRemoteException
- when the JVM context is used over a network and a network error occursNullPointerException
- when name is null
-