org.alfresco.repo.management.subsystems
Class ChildApplicationContextFactory

java.lang.Object
  extended by org.alfresco.repo.management.subsystems.AbstractPropertyBackedBean
      extended by org.alfresco.repo.management.subsystems.ChildApplicationContextFactory
All Implemented Interfaces:
java.util.EventListener, ApplicationContextFactory, PropertyBackedBean, PropertyBackedBeanState, org.springframework.beans.factory.BeanNameAware, org.springframework.beans.factory.DisposableBean, org.springframework.beans.factory.InitializingBean, org.springframework.context.ApplicationContextAware, org.springframework.context.ApplicationListener
Direct Known Subclasses:
SolrChildApplicationContextFactory

public class ChildApplicationContextFactory
extends AbstractPropertyBackedBean
implements ApplicationContextFactory

A factory allowing initialization of an entire 'subsystem' in a child application context. As with other PropertyBackedBeans, can be stopped, reconfigured, started and tested. Each instance possesses a typeName property, that determines where the factory will look for default configuration for the application context. In addition, its id property will determine where the factory will look for override configuration in the extension classpath.

The factory will search for a Spring application context in the classpath using the following patterns in order:

The child application context may use ${} placeholders, and will be configured with a PropertyPlaceholderConfigurer initialized with properties files found in classpath matching the following patterns in order: This means that the extension classpath can be used to provide instance-specific overrides to product default settings. Of course, if you are using the Enterprise edition, you might want to use a JMX client such as JConsole to edit the settings instead!

For advanced purposes, the class also allows management of 'composite' properties, that is properties that can be populated with a sequence of zero or more objects, themselves registered as property-backed beans. Using the compositePropertyTypes property you can register a Map of property names to Java Bean classes. Each property named in this map will then be materialized as a 'composite' property.

Composite property settings are best controlled either through a JMX console (Enterprise edition only) or /alfresco-global.properties in the classpath (the replacement to /alfresco/extension/custom-repository.properties). For example, suppose "imap.server.mountPoints" was registered as a composite property of type RepositoryPathConfigBean. You can then use the property to configure a list of RepositoryPathConfigBeans. First you specify in the property's value a list of zero or more 'instance names'. Each name must be unique within the property.

imap.server.mountPoints=Repository_virtual,Repository_archive

Then, by magic you have two separate instances of RepositoryPathConfigBean whose properties you can address through an extended set of properties prefixed by "imap.server.mountPoints".

To set a property on one of the instances, you append ".value.<instance name>.<bean property name>" to the parent property name. For example:

imap.server.mountPoints.value.Repository_virtual.store=${spaces.store}
imap.server.mountPoints.value.Repository_virtual.path=/${spaces.company_home.childname}

To specify a default value for a property on all instances of the bean, you append ".default.<bean property name>" to the parent property name. For example:

imap.server.mountPoints.default.store=${spaces.store}
imap.server.mountPoints.default.path=/${spaces.company_home.childname}

Note that it's perfectly valid to use placeholders in property values that will be resolved from other global properties.

In order to actually utilize this configurable list of beans in your child application context, you simply need to declare a ListFactoryBean whose ID is the same name as the property. For example:

 <bean id="imap.server.mountPoints" class="org.springframework.beans.factory.config.ListFactoryBean">
 <property name="sourceList">
 <!-- Whatever you declare in here will get replaced by the property value list -->
 <!-- This property is not actually required at all -->
 </property>
 </bean>
 
Then, when the application context is started and before that bean is initialized, it will be given the current configured list of values for the composite property. Magic! This all sounds like a complex, yet primitive replacement for Spring, but it means you can do powerful things to reconfigure the system through an admin UI rather than editing XML.


Nested Class Summary
protected  class ChildApplicationContextFactory.ApplicationContextState
          The Class ApplicationContextState.
 
Nested classes/interfaces inherited from class org.alfresco.repo.management.subsystems.AbstractPropertyBackedBean
AbstractPropertyBackedBean.DefaultResolver
 
Field Summary
 
Fields inherited from class org.alfresco.repo.management.subsystems.AbstractPropertyBackedBean
DEFAULT_INSTANCE_NAME, lock
 
Constructor Summary
ChildApplicationContextFactory()
          Default constructor for container construction.
ChildApplicationContextFactory(org.springframework.context.ApplicationContext parent, PropertyBackedBeanRegistry registry, java.util.Properties propertyDefaults, java.lang.String category, java.lang.String typeName, java.util.List instancePath)
          Constructor for dynamically created instances, e.g.
 
Method Summary
 void afterPropertiesSet()
          
protected  void applyDefaultOverrides(PropertyBackedBeanState state)
          Applies default overrides to the initial state.
protected  PropertyBackedBeanState createInitialState()
          Creates the initial state.
protected  void destroy(boolean permanent)
          Releases any resources held by this component.
 org.springframework.context.ApplicationContext getApplicationContext()
          Gets the application context, configured according to the properties of the factory.
 java.lang.String getDescription(java.lang.String name)
          Gets a Human readable description of the property, e.g.
 java.lang.String getTypeName()
          Gets the type name.
 boolean isUpdateable(java.lang.String name)
          Checks if a property is updateable.
 void setCompositePropertyTypes(java.util.Map compositePropertyTypes)
          Registers a set of composite propertes and their types.
 void setTypeName(java.lang.String typeName)
          Sets the type name.
 
Methods inherited from class org.alfresco.repo.management.subsystems.AbstractPropertyBackedBean
destroy, doInit, getCategory, getId, getInstancePath, getParent, getProperty, getPropertyDefaults, getPropertyNames, getRegistry, getState, init, onApplicationEvent, resolveDefault, revert, setApplicationContext, setAutoStart, setBeanName, setCategory, setInstancePath, setProperties, setProperty, setPropertyDefaults, setRegistry, start, start, stop, stop
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface org.alfresco.repo.management.subsystems.PropertyBackedBean
getId, revert, setProperties
 
Methods inherited from interface org.alfresco.repo.management.subsystems.PropertyBackedBeanState
getProperty, getPropertyNames, setProperty, start, stop
 

Constructor Detail

ChildApplicationContextFactory

public ChildApplicationContextFactory()
Default constructor for container construction.


ChildApplicationContextFactory

public ChildApplicationContextFactory(org.springframework.context.ApplicationContext parent,
                                      PropertyBackedBeanRegistry registry,
                                      java.util.Properties propertyDefaults,
                                      java.lang.String category,
                                      java.lang.String typeName,
                                      java.util.List instancePath)
                               throws java.io.IOException
Constructor for dynamically created instances, e.g. through DefaultChildApplicationContextManager.

Parameters:
parent - the parent application context
registry - the registry of property backed beans
propertyDefaults - property defaults provided by the installer or System properties
category - the category
typeName - the type name
instancePath - the instance path within the category
Throws:
java.io.IOException - Signals that an I/O exception has occurred.
Method Detail

setTypeName

public void setTypeName(java.lang.String typeName)
Sets the type name.

Parameters:
typeName - the typeName to set

getTypeName

public java.lang.String getTypeName()
Gets the type name.

Returns:
the type name

setCompositePropertyTypes

public void setCompositePropertyTypes(java.util.Map compositePropertyTypes)
Registers a set of composite propertes and their types.

Parameters:
compositePropertyTypes - a map of property names to Java classes. The classes should follow standard Java Bean conventions. If the class implements BeanNameAware the instance name will be propagated to the beanName property automatically.

afterPropertiesSet

public void afterPropertiesSet()
                        throws java.lang.Exception
Description copied from class: AbstractPropertyBackedBean

Specified by:
afterPropertiesSet in interface org.springframework.beans.factory.InitializingBean
Overrides:
afterPropertiesSet in class AbstractPropertyBackedBean
Throws:
java.lang.Exception

createInitialState

protected PropertyBackedBeanState createInitialState()
                                              throws java.io.IOException
Description copied from class: AbstractPropertyBackedBean
Creates the initial state.

Specified by:
createInitialState in class AbstractPropertyBackedBean
Returns:
the property backed bean state
Throws:
java.io.IOException - Signals that an I/O exception has occurred.

applyDefaultOverrides

protected void applyDefaultOverrides(PropertyBackedBeanState state)
                              throws java.io.IOException
Description copied from class: AbstractPropertyBackedBean
Applies default overrides to the initial state.

Overrides:
applyDefaultOverrides in class AbstractPropertyBackedBean
Parameters:
state - the state
Throws:
java.io.IOException - Signals that an I/O exception has occurred.

isUpdateable

public boolean isUpdateable(java.lang.String name)
Description copied from class: AbstractPropertyBackedBean
Checks if a property is updateable.

Specified by:
isUpdateable in interface PropertyBackedBean
Overrides:
isUpdateable in class AbstractPropertyBackedBean
Parameters:
name - the property name
Returns:
true if the property is updateable

getDescription

public java.lang.String getDescription(java.lang.String name)
Description copied from class: AbstractPropertyBackedBean
Gets a Human readable description of the property, e.g. to provide via JMX.

Specified by:
getDescription in interface PropertyBackedBean
Overrides:
getDescription in class AbstractPropertyBackedBean
Parameters:
name - the name
Returns:
the description

destroy

protected void destroy(boolean permanent)
Description copied from class: AbstractPropertyBackedBean
Releases any resources held by this component.

Overrides:
destroy in class AbstractPropertyBackedBean
Parameters:
permanent - is the component being destroyed forever, i.e. should persisted values be removed? On server shutdown, this value would be false, whereas on the removal of a dynamically created instance, this value would be true.

getApplicationContext

public org.springframework.context.ApplicationContext getApplicationContext()
Description copied from interface: ApplicationContextFactory
Gets the application context, configured according to the properties of the factory.

Specified by:
getApplicationContext in interface ApplicationContextFactory
Returns:
the application context


Copyright © 2005 - 2010 Alfresco Software, Inc. All Rights Reserved.