Hello,
It seems the only way to add handlers is to edit the IPojoConfiguration
class and compile them in.
Is there a way for a iPOJO bundle to submit a custom handler to the
componentManager at runtime?
In fact, this was true for the 2.5 version. But in the 2.6, handlers can
be deployed without changing the iPOJO core runtime.
An handler is a class implementing the Handler interface like the
following one (who is a very simple handler) :
package fr.imag.adele.escoffier.handler.log;
import org.apache.felix.ipojo.ComponentManager;
import org.apache.felix.ipojo.Handler;
import org.apache.felix.ipojo.metadata.Element;
public class LogHandler implements Handler {
public static final String NAMESPACE =
"fr.imag.adele.escoffier.handler.log.LogHandler";
private ComponentManager m_manager;
public void configure(ComponentManager arg0, Element arg1) {
m_manager = arg0;
Element log = arg1.getElements("log", NAMESPACE)[0];
if(log.getAttribute("enable", NAMESPACE).equals("true"))
{arg0.register(this);}
}
public Object getterCallback(String arg0, Object arg1) { return arg1; }
public boolean isValid() { return true; }
public void setterCallback(String arg0, Object arg1) { }
public void start() { System.out.println("[LogHandler] Start the LogHandler on
" + m_manager.getComponentMetatada().getClassName()); }
public void stateChanged(int arg0) {
String state;
if (arg0 == ComponentManager.INVALID) { state = "INVALID"; }
else { state = "VALID"; }
System.out.println("[LogHandler] State Changes to " + state + " of the
component " + m_manager.getComponentMetatada().getClassName());
}
public void stop() { System.out.println("[LogHandler] Stop the LogHandler on
" + m_manager.getComponentMetatada().getClassName()); }
}
Note that the configure method looks for element of a special namespace.
This namespace is the class name of your handler.
This class is packaged in a bundle exporting the package containing this
class.
Then when a component want use your new handler, the component's
description should be something like :
<iPOJO xmlns:log="fr.imag.adele.escoffier.handler.log.LogHandler">
<component className="fr.imag.adele.escoffier.hello.impl.HelloServiceImpl"
architecture="true">
<provides/>
<log:log log:enable="true"/>
</component>
</iPOJO>
This description declares a namespace (log) pointing on the namespace of
your handler (i.e. the handler's class name). Then, the description can
contains the log element of the log namespace.
In fact, at packaging, iPOJO look for the used namespace of your
component an import the corresponding packages. Then, at runtime, iPOJO
creates an new instance of the needed handler. This handler is managed
like the others handlers.
By using this method, you don't need to change the iPOJOConfiguration
class, declaring only "core" handler.
I am writing a more completed documentation about this new feature (the
actual documentation refers to the 2.5 version).
Clement