Hi Craig;
Here is a sample code showing how to configure a declarative service
component, using the ConfigurationAdmin service.
Hope this sample code will help you.
(But alternatively, you could have a look to the fileinstaller (made by
Peter Kriens) which is able to activate bundles and map associated
property files to the config admin service: see
http://www.aqute.biz/Code/FileInstall)
1/ First, here is a simple component which displays its configuration,
once activated:
public class MyComponent {
protected void activate(ComponentContext context) {
System.out.println("MyComponent activated");
System.out.println("properties:");
Enumeration e = context.getProperties().keys();
while (e.hasMoreElements()) {
String key = e.nextElement().toString();
System.out.println(key+"="+context.getProperties().get(key).toString());
}
}
}
-> the properties can be configured in SCR.xml, but also using the
ConfigurationAdmin service.
Here here the corresponding SCR.xml:
<component name="MyComponent">
<implementation class="configurable.MyComponent"/>
<property name="vendor" value="Alcatel-Lucent"/>
</component>
SCR will actually register a ManagedService on behald of the
"MyComponent" with a PID equals to the component name (that is:
name="MyComponent")
2/ Now, here is a sample code which relies on the ConfigurationAdmin
service in order to configure the MyComponent service:
public class Configurator {
private ConfigurationAdmin _cm;
protected void bind(ConfigurationAdmin cm) { // we need that service
in order to provide config ...
_cm = cm;
}
protected void activate(ComponentContext compctx) {
Runnable r = new Runnable() {
public void run() {
try {
Properties p = new Properties();
p.load(new FileInputStream("/tmp/MyComponent.properties")); //
you could load all properties found from a specific directory ...
Configuration configuration =
_cm.getConfiguration("MyComponent", null);
configuration.update(p);
Thread.sleep(2000);
p.setProperty("foo", "bar2");
configuration.update(p); // This update will actually restart
(REACTIVATE) the "MyComponent" service
} catch (Throwable t) {
t.printStackTrace();
}
}
};
Thread t = new Thread(r);
t.start(); // we must not block the SCR thread ...
}
}
and here is the corresponding SCR.xml:
<component name="Configurator">
<implementation class="configurator.Configurator"/>
<reference name="cm" interface="org.osgi.service.cm.ConfigurationAdmin"
bind="bind"/>
</component>
As you will see, when the Configurator updates the conf (after the short
2 seconds delay), the SCR reactivates the "MyComponent" !
If you would like more information about this, you can refer to
http://www.mail-archive.com/[EMAIL PROTECTED]/msg01120.html
Kind Regards
/Pierre