Nesting configuration elements

You can use metatype extensions to define configuration that can be expressed as nested XML elements in the server.xml file.

Examples

The following example shows how to support this user configuration in the server.xml file:
<family mother="jane" father="john">
  <child name="susie" age="8" />
  <child name="danny" age="5" />
</family>
The metatype XML uses ibm:type="pid" and ibm:reference as shown in following example:
<?xml version="1.0" encoding="UTF-8"?>
<metatype:MetaData
  xmlns:metatype="http://www.osgi.org/xmlns/metatype/v1.1.0"
  xmlns:ibm="http://www.ibm.com/xmlns/appservers/osgi/metatype/v1.0.0">

  <OCD id="family" name="family">
    <AD id="mother" name="mother" type="String" default="Ma" />
    <AD id="father" name="father" type="String" default="Pa" />
    <AD id="child" name="child" ibm:type="pid" ibm:reference="child-pid"
      required="false" type="String" cardinality="6" />       
  </OCD>

  <Designate pid="family">
    <Object ocdref="family" />
  </Designate>
    
  <OCD id="child" name="child" >
    <AD id="name" name="name" type="String" />
    <AD id="age" name="age" type="Integer" />
  </OCD>

  <Designate factoryPid="child-pid">
    <Object ocdref="child" />
  </Designate>
  
</metatype:MetaData>
The following example show how the code that receives the family properties uses the ConfigurationAdmin service to obtain the child property sets:
public void updated(Dictionary<String, ?> properties)
  throws ConfigurationException {

  Set<String> pids = new HashSet<String>();
  String mother = "null";
  String father = "null";

  try {
    if (properties != null) {
      mother = (String) properties.get("mother");
      father = (String) properties.get("father");
      String[] children = (String[]) properties.get("child");
      if (children == null || children.length == 0) {	
        return;
      }

      // Get the configuration admin service
      ConfigurationAdmin configAdmin = null;
      ServiceReference configurationAdminReference = 
        bundleContext.getServiceReference(ConfigurationAdmin.class.getName());
		                   
      if (configurationAdminReference != null) {
        configAdmin = (ConfigurationAdmin)
          bundleContext.getService(configurationAdminReference);
      }	

      for (String childPid : children) {
        pids.add(childPid);
        // Passing in null as the second argument to getConfiguraton prevents 
        // the configuraton object from being bound to the calling bundle
        Configuration config = configAdmin.getConfiguration(childPid, null);
        String name = (String) config.getProperties().get("name");
        Integer age = (Integer) config.getProperties().get("age");
      }
    }
  }

  catch (Exception e) {
    e.printStackTrace();
  }
}