Class AbstractModulesRegistryImpl
java.lang.Object
com.sun.enterprise.module.common_impl.AbstractModulesRegistryImpl
- All Implemented Interfaces:
ModuleChangeListener
,ModulesRegistry
- Direct Known Subclasses:
ModulesRegistryImpl
The Modules Registry maintains the registry of all available module.
TODO: concurrency bug in the acess of the repositories field.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate Map
<ServiceLocator, String> (package private) Map
<Module, Map<ServiceLocator, List<ActiveDescriptor>>> protected final ConcurrentMap
<ModuleId, Module> protected final ModulesRegistry
ModulesRegistry
can form a tree structure by using this pointer.Service provider class names and which modules they are in.protected final Map
<Integer, Repository> private final ConcurrentMap
<Class<?>, CopyOnWriteArrayList<?>> -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected void
Add a new module to this registry.add
(ModuleDefinition info) Registers a new DefaultModuleDefinition in this registry.add
(ModuleDefinition info, boolean resolve) Registers a new DefaultModuleDefinition in this registry.void
addRepository
(Repository repository) Add a newRepository
to this registry.void
addRepository
(Repository repository, int weight) Add a newRepository
to this registry.void
Modules can notify their registry that they have changed (classes, resources,etc...).Creates the defaultServiceLocator
from all the modules in this registry Calling this method has the same effect of callinginvalid @link
{@link #createServiceLocator("default")
createServiceLocator
(String name) Creates aServiceLocator
from all the modules in this registry Cal;ling this method has the same effect of callingModulesRegistry.newServiceLocator()
followed byinvalid @link
{@link #populateServiceLocator(String, org.glassfish.hk2.api.ServiceLocator, java.util.List
createServiceLocator
(ServiceLocator parent, String name, List<PopulatorPostProcessor> postProcessors) Creates aServiceLocator
with the provided parent.void
dumpState
(PrintStream writer) protected Set
<ServiceLocator> Returns the list of shared Modules registered in this instance.getModules
(String moduleName) Returns the list of shared Modules registered in this instance whose name matches the given namegetModulesProvider
(Class serviceClass) Returns a collection of Module containing at least one implementation of the passed service interface class.getProvidersClass
(Class<T> serviceClass) getProvidingModule
(String providerClassName) Gets theModule
that provides the provider of the given name.getRepository
(String name) Get a repository from the list of attached repositories<T> List
<T> getRunningServices
(Class<T> serviceClass) Returns all running services implementation of the passed service interfaceprotected void
initializeServiceLocator
(ServiceLocator serviceLocator) protected Module
loadFromRepository
(String name, String version) makeModuleFor
(String packageName) Find and return a loaded Module that has the package name in its list of exported interfaces.makeModuleFor
(String name, String version) Returns theModule
instance giving a name and version constraints.makeModuleFor
(String name, String version, boolean resolve) Returns theModule
instance giving a name and version constraints.protected abstract Module
newModule
(ModuleDefinition moduleDef) Factory method for creating new instances of Module.Creates an uninitializedServiceLocator
newServiceLocator
(ServiceLocator parent) Create a new ServiceLocator optionally providing a parent Servicesprotected abstract List
<ActiveDescriptor> parseInhabitants
(Module module, String name, ServiceLocator serviceLocator, List<PopulatorPostProcessor> postProcessors) void
populateConfig
(ServiceLocator serviceLocator) void
populateServiceLocator
(String name, ServiceLocator serviceLocator, List<PopulatorPostProcessor> postProcessors) Creates aServiceLocator
from all the modules in this registryvoid
Print a Registry dump to the logger<T> void
registerRunningService
(Class<T> serviceClass, T provider) Registers a running service, this is useful when other components need to have access to a provider of a service without having to create a new instance and initialize it.void
Removes a module from the registry.void
removeRepository
(String name) Remove a repository from the list of attached repositories to this instances.private void
<T> boolean
unregisterRunningService
(Class<T> serviceClass, T provider) Removes a running service, this is useful when a service instance is no longer available as a provider of a service.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface com.sun.enterprise.module.ModulesRegistry
createChild, detachAll, find, getModulesClassLoader, getModulesClassLoader, getParentClassLoader, register, setParentClassLoader, shutdown, unregister
-
Field Details
-
parent
ModulesRegistry
can form a tree structure by using this pointer. It works in a way similar to the classloader tree. Modules defined in the parent are visible to children. -
modules
-
repositories
-
runningServices
-
providers
Service provider class names and which modules they are in.This is used for the classloader punch-in hack — to work nicely with classic service loader implementation, we need to be able to allow any modules to see these classes.
-
habitats
-
moduleDescriptors
Map<Module,Map<ServiceLocator, moduleDescriptorsList<ActiveDescriptor>>>
-
-
Constructor Details
-
AbstractModulesRegistryImpl
-
-
Method Details
-
newServiceLocator
Creates an uninitializedServiceLocator
- Specified by:
newServiceLocator
in interfaceModulesRegistry
- Throws:
MultiException
-
newServiceLocator
Create a new ServiceLocator optionally providing a parent Services- Specified by:
newServiceLocator
in interfaceModulesRegistry
- Throws:
MultiException
-
initializeServiceLocator
- Throws:
MultiException
-
populateServiceLocator
public void populateServiceLocator(String name, ServiceLocator serviceLocator, List<PopulatorPostProcessor> postProcessors) throws MultiException Creates aServiceLocator
from all the modules in this registry- Specified by:
populateServiceLocator
in interfaceModulesRegistry
- Parameters:
name
- Determines which descriptors are loaded.serviceLocator
- Habitat to initialize, null if it should be createdpostProcessors
-- Throws:
MultiException
-
populateConfig
- Specified by:
populateConfig
in interfaceModulesRegistry
-
createServiceLocator
public ServiceLocator createServiceLocator(ServiceLocator parent, String name, List<PopulatorPostProcessor> postProcessors) throws MultiException Description copied from interface:ModulesRegistry
Creates aServiceLocator
with the provided parent.- Specified by:
createServiceLocator
in interfaceModulesRegistry
- Parameters:
parent
-name
-postProcessors
-- Returns:
- Throws:
MultiException
-
createServiceLocator
Description copied from interface:ModulesRegistry
Creates aServiceLocator
from all the modules in this registry Cal;ling this method has the same effect of callingModulesRegistry.newServiceLocator()
followed byinvalid @link
{@link #populateServiceLocator(String, org.glassfish.hk2.api.ServiceLocator, java.util.List
- Specified by:
createServiceLocator
in interfaceModulesRegistry
- Parameters:
name
- Determines which inhabitants descriptors are loaded. (so that different parallel habitats can be created over the same modules registry.)- Throws:
MultiException
-
createServiceLocator
Description copied from interface:ModulesRegistry
Creates the defaultServiceLocator
from all the modules in this registry Calling this method has the same effect of callinginvalid @link
{@link #createServiceLocator("default")
- Specified by:
createServiceLocator
in interfaceModulesRegistry
- Throws:
MultiException
-
parseInhabitants
protected abstract List<ActiveDescriptor> parseInhabitants(Module module, String name, ServiceLocator serviceLocator, List<PopulatorPostProcessor> postProcessors) throws IOException, BootException - Throws:
IOException
BootException
-
addRepository
Add a newRepository
to this registry. From now on the repository will be used to procure requested module not yet registered in this registry instance. Repository can be searched in a particular order (to accomodate performance requirements like looking at local repositories first), a search order (1 to 100) can be specified when adding a repository to the registry (1 is highest priority).- Specified by:
addRepository
in interfaceModulesRegistry
- Parameters:
repository
- new repository to attach to this registryweight
- int value from 1 to 100 to specify the search order
-
addRepository
Add a newRepository
to this registry. From now on the repository will be used to procure requested nodule not registered in this instance.- Specified by:
addRepository
in interfaceModulesRegistry
- Parameters:
repository
- new repository to attach to this registry
-
removeRepository
Remove a repository from the list of attached repositories to this instances. After this call, theRepository
name will not be used to procure missing modules any longer- Specified by:
removeRepository
in interfaceModulesRegistry
- Parameters:
name
- name of the repository to remove
-
getRepository
Get a repository from the list of attached repositories- Specified by:
getRepository
in interfaceModulesRegistry
- Parameters:
name
- name of the repository to return- Returns:
- the repository or null if not found
-
makeModuleFor
Returns theModule
instance giving a name and version constraints.- Specified by:
makeModuleFor
in interfaceModulesRegistry
- Parameters:
name
- the module nameversion
- the module version.- Returns:
- the module instance or null if none can be found
- Throws:
ResolveError
- if the module dependencies cannot be resolved
-
makeModuleFor
Description copied from interface:ModulesRegistry
Returns theModule
instance giving a name and version constraints.- Specified by:
makeModuleFor
in interfaceModulesRegistry
- Parameters:
name
- the module nameversion
- the module version. Caller should specify a correct version.resolve
- should the module be resolved or not- Returns:
- the module instance or null if none can be found
- Throws:
ResolveError
- if the module dependencies cannot be resolved
-
makeModuleFor
Find and return a loaded Module that has the package name in its list of exported interfaces.- Specified by:
makeModuleFor
in interfaceModulesRegistry
- Parameters:
packageName
- the requested implementation package name.- Returns:
- the
Module
instance implementing the package name or null if not found. - Throws:
ResolveError
- if the module dependencies cannot be resolved
-
loadFromRepository
-
newModule
Factory method for creating new instances of Module.- Parameters:
moduleDef
- module definition of the new module to be created- Returns:
- a new Module instance
-
add
Add a new module to this registry. Once added, the module will be available through one of the getServiceImplementor methods.- Parameters:
newModule
- the new module
-
removeShutdownLocators
private void removeShutdownLocators() -
remove
Removes a module from the registry. The module will not be accessible from this registry after this method returns. -
getAllServiceLocators
-
getModules
Returns the list of shared Modules registered in this instance.The returned list will not include the modules defined in the ancestor
AbstractModulesRegistryImpl
s.- Specified by:
getModules
in interfaceModulesRegistry
- Returns:
- an umodifiable list of loaded modules
-
getModules
Description copied from interface:ModulesRegistry
Returns the list of shared Modules registered in this instance whose name matches the given nameThe returned list will not include the modules defined in the ancestor
ModulesRegistry
s.- Specified by:
getModules
in interfaceModulesRegistry
- Returns:
- an umodifiable list of loaded modules having names that match the given name
-
changed
Modules can notify their registry that they have changed (classes, resources,etc...). Registries are requested to take appropriate action to make the new module available.- Specified by:
changed
in interfaceModuleChangeListener
-
add
Registers a new DefaultModuleDefinition in this registry. Using this module definition, the registry will be capable of created shared and privateModule
instances.- Specified by:
add
in interfaceModulesRegistry
- Throws:
ResolveError
-
add
Description copied from interface:ModulesRegistry
Registers a new DefaultModuleDefinition in this registry. Using this module definition, the registry will be capable of created shared and privateModule
instances.- Specified by:
add
in interfaceModulesRegistry
- Parameters:
info
- ModuleDefinition representing the new module contentresolve
- should the new module be resolved or not- Throws:
ResolveError
-
print
Print a Registry dump to the logger- Specified by:
print
in interfaceModulesRegistry
- Parameters:
logger
- the logger to dump on
-
getProvidersClass
- Specified by:
getProvidersClass
in interfaceModulesRegistry
-
getModulesProvider
Returns a collection of Module containing at least one implementation of the passed service interface class.- Specified by:
getModulesProvider
in interfaceModulesRegistry
- Parameters:
serviceClass
- the service interface class- Returns:
- a collection of module
-
registerRunningService
Registers a running service, this is useful when other components need to have access to a provider of a service without having to create a new instance and initialize it.- Specified by:
registerRunningService
in interfaceModulesRegistry
- Parameters:
serviceClass
- the service interfaceprovider
- the provider of that service.
-
unregisterRunningService
Removes a running service, this is useful when a service instance is no longer available as a provider of a service.- Specified by:
unregisterRunningService
in interfaceModulesRegistry
-
getRunningServices
Returns all running services implementation of the passed service interface- Specified by:
getRunningServices
in interfaceModulesRegistry
- Parameters:
serviceClass
- the service interface- Returns:
- the list of providers of that service.
-
getProvidingModule
Description copied from interface:ModulesRegistry
Gets theModule
that provides the provider of the given name.- Specified by:
getProvidingModule
in interfaceModulesRegistry
-
dumpState
- Specified by:
dumpState
in interfaceModulesRegistry
-