It is possible to use component-plugin elements
        in order to dynamically change a PortalContainerDefinition. In the
        example below, we add the dependency foo to the default
        portal container and to the portal containers called
        foo1 and foo2:
<external-component-plugins>
<!-- The full qualified name of the PortalContainerConfig -->
<target-component>org.exoplatform.container.definition.PortalContainerConfig</target-component>
<component-plugin>
<!-- The name of the plugin -->
<name>Change PortalContainer Definitions</name>
<!-- The name of the method to call on the PortalContainerConfig in order to register the changes on the PortalContainerDefinitions -->
<set-method>registerChangePlugin</set-method>
<!-- The full qualified name of the PortalContainerDefinitionChangePlugin -->
<type>org.exoplatform.container.definition.PortalContainerDefinitionChangePlugin</type>
<init-params>
<value-param>
<name>apply.default</name>
<value>true</value>
</value-param>
<values-param>
<name>apply.specific</name>
<value>foo1</value>
<value>foo2</value>
</values-param>
<object-param>
<name>change</name>
<object type="org.exoplatform.container.definition.PortalContainerDefinitionChange$AddDependencies">
<!-- The list of name of the dependencies to add -->
<field name="dependencies">
<collection type="java.util.ArrayList">
<value>
<string>foo</string>
</value>
</collection>
</field>
</object>
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
| apply.all (*) | Indicates whether the changes have to be applied to all
                the portal containers or not. The default value of this field
                is false. This field is aValueParamand is not mandatory. | 
| apply.default (*) | Indicates whether the changes have to be applied to the
                default portal container or not. The default value of this
                field is false. This field is aValueParamand is not mandatory. | 
| apply.specific (*) | A set of specific portal container names to which we
                want to apply the changes. This field is a ValuesParamand is not mandatory. | 
| Other parameters | Other paramaters are ObjectParamof typePortalContainerDefinitionChange. Those
                parameters are in fact the list of changes that we want to
                apply to one or several portal containers. If the list of
                changes is empty, the component plugin will be ignored. The
                supported implementations of PortalContainerDefinitionChange
                are described later in this section. | 
All the value of the parameters marked with a (*) can be set via System properties and also via variables loaded by the PropertyConfigurator. For example in GateIn by default, it would be all the variables defined in the file configuration.properties.
To identify the portal containers to which the changes have to be applied, we use the follwing algorithm:
If the parameter apply.all is 
            true, the corresponding changes will be applied to
            all the portal containers and the other parameters will be
            ignored. Otherwise, go to next step.
If the parameter apply.default is 
            true and the parameter
            apply.specific is null, the
            corresponding changes will be applied to the default portal
            container only.
If the parameter apply.default is
            true and the parameter
            apply.specific is not null, the
            corresponding changes will be applied to the default portal
            container and the given list of specific portal containers.
If the parameter apply.default is
            false or is not set and the parameter
            apply.specific is null, the
            corresponding changes will be applied to the default portal
            container only.
If the parameter apply.default is
            false or is not set and the parameter
            apply.specific is not null, the
            corresponding changes will be applied to the given list of
            specific portal containers.
The modifications that can be applied to a
          PortalContainerDefinition must be a class of type
          PortalContainerDefinitionChange. eXo Platform proposes
          out of the box some implementations that we describe in the next sub
          sections.
This modification adds a list of dependencies at the end of
            the list of dependencies defined into the
            PortalContainerDefinition. The full qualified name
            is
            org.exoplatform.container.definition.PortalContainerDefinitionChange$AddDependencies.
| dependencies | A list of String corresponding to the list of name of the dependencies to add. If the value of this field is empty, the change will be ignored. | 
See an example below, that will add foo at
            the end of the dependency list of the default portal
            container:
<external-component-plugins>
<!-- The full qualified name of the PortalContainerConfig -->
<target-component>org.exoplatform.container.definition.PortalContainerConfig</target-component>
<component-plugin>
<!-- The name of the plugin -->
<name>Change PortalContainer Definitions</name>
<!-- The name of the method to call on the PortalContainerConfig in order to register the changes on the PortalContainerDefinitions -->
<set-method>registerChangePlugin</set-method>
<!-- The full qualified name of the PortalContainerDefinitionChangePlugin -->
<type>org.exoplatform.container.definition.PortalContainerDefinitionChangePlugin</type>
<init-params>
<value-param>
<name>apply.default</name>
<value>true</value>
</value-param>
<object-param>
<name>change</name>
<object type="org.exoplatform.container.definition.PortalContainerDefinitionChange$AddDependencies">
<!-- The list of name of the dependencies to add -->
<field name="dependencies">
<collection type="java.util.ArrayList">
<value>
<string>foo</string>
</value>
</collection>
</field>
</object>
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
This modification adds a list of dependencies before a given
            target dependency in the list of dependencies of the
            PortalContainerDefinition. The full qualified name
            is
            org.exoplatform.container.definition.PortalContainerDefinitionChange$AddDependenciesBefore.
| dependencies | A list of String corresponding to the list of name of the dependencies to add. If the value of this field is empty, the change will be ignored. | 
| target | The name of the dependency before which we would
                    like to add the new dependencies. If this field is nullor the target dependency cannot be
                    found, the new
                    dependencies will be added in first position of the
                    list. | 
See an example below, that will add foo
            before foo2 in the dependency list of the default
            portal container:
<external-component-plugins>
<!-- The full qualified name of the PortalContainerConfig -->
<target-component>org.exoplatform.container.definition.PortalContainerConfig</target-component>
<component-plugin>
<!-- The name of the plugin -->
<name>Change PortalContainer Definitions</name>
<!-- The name of the method to call on the PortalContainerConfig in order to register the changes on the PortalContainerDefinitions -->
<set-method>registerChangePlugin</set-method>
<!-- The full qualified name of the PortalContainerDefinitionChangePlugin -->
<type>org.exoplatform.container.definition.PortalContainerDefinitionChangePlugin</type>
<init-params>
<value-param>
<name>apply.default</name>
<value>true</value>
</value-param>
<object-param>
<name>change</name>
<object type="org.exoplatform.container.definition.PortalContainerDefinitionChange$AddDependenciesBefore">
<!-- The list of name of the dependencies to add -->
<field name="dependencies">
<collection type="java.util.ArrayList">
<value>
<string>foo</string>
</value>
</collection>
</field>
<!-- The name of the target dependency -->
<field name="target">
<string>foo2</string>
</field>
</object>
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
This modification adds a list of dependencies after a given
            target dependency in the list of dependencies of the
            PortalContainerDefinition. The full qualified name
            is
            org.exoplatform.container.definition.PortalContainerDefinitionChange$AddDependenciesAfter.
| dependencies | A list of String corresponding to the list of name of the dependencies to add. If the value of this field is empty, the change will be ignored. | 
| target | The name of the dependency after which we would
                    like to add the new dependencies. If this field is nullor the target dependency cannot be
                    found, the new
                    dependencies will be added in last position of the
                    list. | 
See an example below, that will add foo after
            foo2 in the dependency list of the default portal
            container:
<external-component-plugins>
<!-- The full qualified name of the PortalContainerConfig -->
<target-component>org.exoplatform.container.definition.PortalContainerConfig</target-component>
<component-plugin>
<!-- The name of the plugin -->
<name>Change PortalContainer Definitions</name>
<!-- The name of the method to call on the PortalContainerConfig in order to register the changes on the PortalContainerDefinitions -->
<set-method>registerChangePlugin</set-method>
<!-- The full qualified name of the PortalContainerDefinitionChangePlugin -->
<type>org.exoplatform.container.definition.PortalContainerDefinitionChangePlugin</type>
<init-params>
<value-param>
<name>apply.default</name>
<value>true</value>
</value-param>
<object-param>
<name>change</name>
<object type="org.exoplatform.container.definition.PortalContainerDefinitionChange$AddDependenciesAfter">
<!-- The list of name of the dependencies to add -->
<field name="dependencies">
<collection type="java.util.ArrayList">
<value>
<string>foo</string>
</value>
</collection>
</field>
<!-- The name of the target dependency -->
<field name="target">
<string>foo2</string>
</field>
</object>
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
This modification adds new settings to a
            PortalContainerDefinition. The full qualified name
            is
            org.exoplatform.container.definition.PortalContainerDefinitionChange$AddSettings.
| settings | A map of <String, Object> corresponding to the settings to add. If the value of this field is empty, the change will be ignored. | 
See an example below, that will add the settings
            string and stringX to the settings
            of the default portal container:
<external-component-plugins>
<!-- The full qualified name of the PortalContainerConfig -->
<target-component>org.exoplatform.container.definition.PortalContainerConfig</target-component>
<component-plugin>
<!-- The name of the plugin -->
<name>Change PortalContainer Definitions</name>
<!-- The name of the method to call on the PortalContainerConfig in order to register the changes on the PortalContainerDefinitions -->
<set-method>registerChangePlugin</set-method>
<!-- The full qualified name of the PortalContainerDefinitionChangePlugin -->
<type>org.exoplatform.container.definition.PortalContainerDefinitionChangePlugin</type>
<init-params>
<value-param>
<name>apply.default</name>
<value>true</value>
</value-param>
<object-param>
<name>change</name>
<object type="org.exoplatform.container.definition.PortalContainerDefinitionChange$AddSettings">
<!-- The settings to add to the to the portal containers -->
<field name="settings">
<map type="java.util.HashMap">
<entry>
<key>
<string>string</string>
</key>
<value>
<string>value1</string>
</value>
</entry>
<entry>
<key>
<string>stringX</string>
</key>
<value>
<string>value1</string>
</value>
</entry>
</map>
</field>
</object>
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>