Hello everyone,
We are using Declarative Service for dependency injection in our
internal A5350 Alcatel-Lucent application server (which is now
running on Felix! :-) ).
... And most of the time, when we start from scratch writing a new
SCR service component, we generally fail to get our service activated
because of stupid syntax errors from our SCR.xml descriptors.
I know there is a maven SCR plugin which uses javadoc tags in order
to generate SCR.xml, but :
* We don't use maven at all (for now)
* For now, we don't wish to add a layer on top of Declarative
Service -> we just wish to rely on the SCR.xml (and webconsole for
inspecting component states using a web browser).
For example, last week, I came across the following (stupid) syntax
error in my SCR.xml file and it took me several hours in order to
find out why my components was not actually enabled by the
declarative service runtime:
Here is my erroneous SCR.xml, which contains two errors:
<components> *<!-- **ERROR: this element is not part of the SCR xml
schema -->*
<component name='SipContainer'>
<implementation
class="com.alcatel_lucent.as.sip.server.SipServerActivator"/>
<reference name="config"
interface="java.util.Dictionary"
bind="setConfig"
target="(service.pid=SipContainer)"/>
*<!-- ERROR: the following ref has the ame ref name as the
previous
one -->*
<reference name='config'
interface='com.alcatel.sip.stack.TransportService'
bind='bind'
unbind='unbind'/>
</component>
<component name="SipApplicationDeployer">
<implementation
class="com.alcatel_lucent.as.sip.server.SipApplicationDeployer"/>
...
</component>
</components> -> ERROR !
-> as you can notice, there are two mistakes in that file:
1. my two components are embedded in a root xml element "<components>
... </components>"
2. the component "SipContainer" contains two references with the SAME
name: "config" -> it's an error
So, what is really annoying is that even if I activate the ds logger:
"ds.loglevel=debug" -> the SCR don't logs any thing :-( , mainly
because my SCR.xml is well formed, and has a correct syntax ...
Now, after having removed the wrong "<components> </components>"
element, my components are started, but I still get an exception in
one of my component's activate method, because there are still the
second error (the two references in the "SipContainer" component do
have the same name: "config" !).
-> So, would it be possible to just
1. add some WARNING message in the SCR xml parser in order to fire an
exception or logs something
2. detect duplicated reference names for a given component
It think that this modification is not really a big deal ! for
instance, in
felix-trunk/scr/src/main/java/org/apache/felix/scr/impl/XmlHandler.java,
you could just add the following logs at the end of the startElement
method:
public void startElement( String uri, String localName, Properties
attrib ) throws ParseException {
....
if ( localName.equals( "component" ) ) {
...
} else if ( localName.equals( "implementation" ) ) {
...
} else { // -> Raise an exception (or just log a WARN) ->
throw new ParseException("Invalid xml element found in
Declarative Service descriptor: " + localName, new Exception());
}
}
These fix would be very appreciated !
Kind Regards
/Pierre