com.sun.enterprise.module.common_impl
Class AbstractModulesRegistryImpl

java.lang.Object
  extended by com.sun.enterprise.module.common_impl.AbstractModulesRegistryImpl
All Implemented Interfaces:
ModuleChangeListener, ModulesRegistry, org.jvnet.hk2.component.HabitatFactory, org.jvnet.hk2.component.InhabitantsParserFactory
Direct Known Subclasses:
ModulesRegistryImpl

public abstract class AbstractModulesRegistryImpl
extends java.lang.Object
implements ModulesRegistry, org.jvnet.hk2.component.InhabitantsParserFactory

The Modules Registry maintains the registry of all available module. TODO: concurrency bug in the acess of the repositories field.

Author:
Jerome Dochez, Sanjeeb.Sahoo@Sun.COM

Field Summary
protected  java.util.concurrent.ConcurrentMap<ModuleId,Module> modules
           
protected  AbstractModulesRegistryImpl parent
          ModulesRegistry can form a tree structure by using this pointer.
protected  java.util.Map<java.lang.String,Module> providers
          Service provider class names and which modules they are in.
protected  java.util.Map<java.lang.Integer,Repository> repositories
           
 
Constructor Summary
protected AbstractModulesRegistryImpl(AbstractModulesRegistryImpl parent)
           
 
Method Summary
protected  void add(Module newModule)
          Add a new module to this registry.
 Module add(ModuleDefinition info)
          Registers a new DefaultModuleDefinition in this registry.
 Module add(ModuleDefinition info, boolean resolve)
          Registers a new DefaultModuleDefinition in this registry.
 void addRepository(Repository repository)
          Add a new Repository to this registry.
 void addRepository(Repository repository, int weight)
          Add a new Repository to this registry.
 void changed(Module service)
          Modules can notify their registry that they have changed (classes, resources,etc...).
 org.jvnet.hk2.component.Habitat createHabitat(java.lang.String name)
          Creates a Habitat from all the modules in this registry
 org.jvnet.hk2.component.Habitat createHabitat(java.lang.String name, org.jvnet.hk2.component.Habitat h)
          Creates a Habitat from all the modules in this registry.
 org.jvnet.hk2.component.Habitat createHabitat(java.lang.String name, com.sun.hk2.component.InhabitantsParser parser)
          Creates a Habitat from all the modules in this registry, by using the given InhabitantsParser.
 com.sun.hk2.component.InhabitantsParser createInhabitantsParser(org.jvnet.hk2.component.Habitat h)
           
 void dumpState(java.io.PrintStream writer)
           
 java.util.Collection<Module> getModules()
          Returns the list of shared Modules registered in this instance.
 java.util.Collection<Module> getModules(java.lang.String moduleName)
          Returns the list of shared Modules registered in this instance whose name matches the given name
 java.lang.Iterable<Module> getModulesProvider(java.lang.Class serviceClass)
          Returns a collection of Module containing at least one implementation of the passed service interface class.
<T> java.lang.Iterable<java.lang.Class<? extends T>>
getProvidersClass(java.lang.Class<T> serviceClass)
           
 Module getProvidingModule(java.lang.String providerClassName)
          Gets the Module that provides the provider of the given name.
 Repository getRepository(java.lang.String name)
          Get a repository from the list of attached repositories
<T> java.util.List<T>
getRunningServices(java.lang.Class<T> serviceClass)
          Returns all running services implementation of the passed service interface
protected  void initializeHabitat(org.jvnet.hk2.component.Habitat h)
           
protected  Module loadFromRepository(java.lang.String name, java.lang.String version)
           
 Module makeModuleFor(java.lang.String packageName)
          Find and return a loaded Module that has the package name in its list of exported interfaces.
 Module makeModuleFor(java.lang.String name, java.lang.String version)
          Returns the Module instance giving a name and version constraints.
 Module makeModuleFor(java.lang.String name, java.lang.String version, boolean resolve)
          Returns the Module instance giving a name and version constraints.
 org.jvnet.hk2.component.Habitat newHabitat()
          Creates an uninitialized Habitat
protected abstract  Module newModule(ModuleDefinition moduleDef)
          Factory method for creating new instances of Module.
abstract  void parseInhabitants(Module module, java.lang.String name, com.sun.hk2.component.InhabitantsParser inhabitantsParser)
           
protected  void populateConfig(org.jvnet.hk2.component.Habitat habitat)
           
 void print(java.util.logging.Logger logger)
          Print a Registry dump to the logger
<T> void
registerRunningService(java.lang.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 remove(Module module)
          Removes a module from the registry.
 void removeRepository(java.lang.String name)
          Remove a repository from the list of attached repositories to this instances.
<T> boolean
unregisterRunningService(java.lang.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 Detail

parent

protected final AbstractModulesRegistryImpl 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

protected final java.util.concurrent.ConcurrentMap<ModuleId,Module> modules

repositories

protected final java.util.Map<java.lang.Integer,Repository> repositories

providers

protected final java.util.Map<java.lang.String,Module> 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.

Constructor Detail

AbstractModulesRegistryImpl

protected AbstractModulesRegistryImpl(AbstractModulesRegistryImpl parent)
Method Detail

newHabitat

public org.jvnet.hk2.component.Habitat newHabitat()
                                           throws org.jvnet.hk2.component.ComponentException
Creates an uninitialized Habitat

Specified by:
newHabitat in interface ModulesRegistry
Specified by:
newHabitat in interface org.jvnet.hk2.component.HabitatFactory
Throws:
org.jvnet.hk2.component.ComponentException

initializeHabitat

protected void initializeHabitat(org.jvnet.hk2.component.Habitat h)
                          throws org.jvnet.hk2.component.ComponentException
Throws:
org.jvnet.hk2.component.ComponentException

createHabitat

public org.jvnet.hk2.component.Habitat createHabitat(java.lang.String name)
                                              throws org.jvnet.hk2.component.ComponentException
Creates a Habitat from all the modules in this registry

Specified by:
createHabitat in interface ModulesRegistry
Parameters:
name - Determines which inhabitants descriptors are loaded. (so that different parallel habitats can be created over the same modules registry.)
Throws:
org.jvnet.hk2.component.ComponentException

createHabitat

public org.jvnet.hk2.component.Habitat createHabitat(java.lang.String name,
                                                     org.jvnet.hk2.component.Habitat h)
                                              throws org.jvnet.hk2.component.ComponentException
Description copied from interface: ModulesRegistry
Creates a Habitat from all the modules in this registry.

Default InhabitantsParser is used.

Specified by:
createHabitat in interface ModulesRegistry
Parameters:
name - Determines which inhabitants descriptors are loaded. (so that different parallel habitats can be created over the same modules registry.)
h - Habitat to initialize, null if it should be created
Returns:
initialized Habitat
Throws:
org.jvnet.hk2.component.ComponentException

createHabitat

public org.jvnet.hk2.component.Habitat createHabitat(java.lang.String name,
                                                     com.sun.hk2.component.InhabitantsParser parser)
                                              throws org.jvnet.hk2.component.ComponentException
Description copied from interface: ModulesRegistry
Creates a Habitat from all the modules in this registry, by using the given InhabitantsParser.

Specified by:
createHabitat in interface ModulesRegistry
Parameters:
name - Determines which inhabitants descriptors are loaded. (so that different parallel habitats can be created over the same modules registry.)
parser - Parser to load inhabitants file. Sub types can be used to customize the parsing behavior, like ignoring some inhabitants deliberately.
Returns:
initialized Habitat
Throws:
org.jvnet.hk2.component.ComponentException

populateConfig

protected void populateConfig(org.jvnet.hk2.component.Habitat habitat)
                       throws BootException
Throws:
BootException

parseInhabitants

public abstract void parseInhabitants(Module module,
                                      java.lang.String name,
                                      com.sun.hk2.component.InhabitantsParser inhabitantsParser)
                               throws java.io.IOException
Throws:
java.io.IOException

addRepository

public void addRepository(Repository repository,
                          int weight)
Add a new Repository 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 interface ModulesRegistry
Parameters:
repository - new repository to attach to this registry
weight - int value from 1 to 100 to specify the search order

addRepository

public void addRepository(Repository repository)
Add a new Repository to this registry. From now on the repository will be used to procure requested nodule not registered in this instance.

Specified by:
addRepository in interface ModulesRegistry
Parameters:
repository - new repository to attach to this registry

removeRepository

public void removeRepository(java.lang.String name)
Remove a repository from the list of attached repositories to this instances. After this call, the Repository name will not be used to procure missing modules any longer

Specified by:
removeRepository in interface ModulesRegistry
Parameters:
name - name of the repository to remove

getRepository

public Repository getRepository(java.lang.String name)
Get a repository from the list of attached repositories

Specified by:
getRepository in interface ModulesRegistry
Parameters:
name - name of the repository to return
Returns:
the repository or null if not found

makeModuleFor

public Module makeModuleFor(java.lang.String name,
                            java.lang.String version)
                     throws ResolveError
Returns the Module instance giving a name and version constraints.

Specified by:
makeModuleFor in interface ModulesRegistry
Parameters:
name - the module name
version - the module version.
Returns:
the module instance or null if none can be found
Throws:
ResolveError - if the module dependencies cannot be resolved

makeModuleFor

public Module makeModuleFor(java.lang.String name,
                            java.lang.String version,
                            boolean resolve)
                     throws ResolveError
Description copied from interface: ModulesRegistry
Returns the Module instance giving a name and version constraints.

Specified by:
makeModuleFor in interface ModulesRegistry
Parameters:
name - the module name
version - 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

public Module makeModuleFor(java.lang.String packageName)
                     throws ResolveError
Find and return a loaded Module that has the package name in its list of exported interfaces.

Specified by:
makeModuleFor in interface ModulesRegistry
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

protected Module loadFromRepository(java.lang.String name,
                                    java.lang.String version)

newModule

protected abstract Module newModule(ModuleDefinition moduleDef)
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

protected void add(Module newModule)
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

createInhabitantsParser

public com.sun.hk2.component.InhabitantsParser createInhabitantsParser(org.jvnet.hk2.component.Habitat h)
Specified by:
createInhabitantsParser in interface org.jvnet.hk2.component.InhabitantsParserFactory

remove

public void remove(Module module)
Removes a module from the registry. The module will not be accessible from this registry after this method returns.


getModules

public java.util.Collection<Module> getModules()
Returns the list of shared Modules registered in this instance.

The returned list will not include the modules defined in the ancestor AbstractModulesRegistryImpls.

Specified by:
getModules in interface ModulesRegistry
Returns:
an umodifiable list of loaded modules

getModules

public java.util.Collection<Module> getModules(java.lang.String moduleName)
Description copied from interface: ModulesRegistry
Returns the list of shared Modules registered in this instance whose name matches the given name

The returned list will not include the modules defined in the ancestor ModulesRegistrys.

Specified by:
getModules in interface ModulesRegistry
Returns:
an umodifiable list of loaded modules having names that match the given name

changed

public void changed(Module service)
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 interface ModuleChangeListener

add

public Module add(ModuleDefinition info)
           throws ResolveError
Registers a new DefaultModuleDefinition in this registry. Using this module definition, the registry will be capable of created shared and private Module instances.

Specified by:
add in interface ModulesRegistry
Throws:
ResolveError

add

public Module add(ModuleDefinition info,
                  boolean resolve)
           throws ResolveError
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 private Module instances.

Specified by:
add in interface ModulesRegistry
Parameters:
info - ModuleDefinition representing the new module content
resolve - should the new module be resolved or not
Throws:
ResolveError

print

public void print(java.util.logging.Logger logger)
Print a Registry dump to the logger

Specified by:
print in interface ModulesRegistry
Parameters:
logger - the logger to dump on

getProvidersClass

public <T> java.lang.Iterable<java.lang.Class<? extends T>> getProvidersClass(java.lang.Class<T> serviceClass)
Specified by:
getProvidersClass in interface ModulesRegistry

getModulesProvider

public java.lang.Iterable<Module> getModulesProvider(java.lang.Class serviceClass)
Returns a collection of Module containing at least one implementation of the passed service interface class.

Specified by:
getModulesProvider in interface ModulesRegistry
Parameters:
serviceClass - the service interface class
Returns:
a collection of module

registerRunningService

public <T> void registerRunningService(java.lang.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.

Specified by:
registerRunningService in interface ModulesRegistry
Parameters:
serviceClass - the service interface
provider - the provider of that service.

unregisterRunningService

public <T> boolean unregisterRunningService(java.lang.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.

Specified by:
unregisterRunningService in interface ModulesRegistry

getRunningServices

public <T> java.util.List<T> getRunningServices(java.lang.Class<T> serviceClass)
Returns all running services implementation of the passed service interface

Specified by:
getRunningServices in interface ModulesRegistry
Parameters:
serviceClass - the service interface
Returns:
the list of providers of that service.

getProvidingModule

public Module getProvidingModule(java.lang.String providerClassName)
Gets the Module that provides the provider of the given name.


dumpState

public void dumpState(java.io.PrintStream writer)
Specified by:
dumpState in interface ModulesRegistry


Copyright © 2011 Oracle Corporation. All Rights Reserved.