I ran into this too. I found that if you reference a module in a
service, it gets added to the phase for *all* services. I found this
explanation:
https://issues.apache.org/jira/browse/AXIS2C-575
This is a "feature" in Axis2 architecture. If you engage the module in a
service to a globle phase, then that module gets engaged globally.
Modules can use axis2_svc_is_module_engaged method to check if the
service being used has engaged a given module and act accordingly.
I don't think that makes any sense. What's the point of configuring it
at the service level then? Why should every module have to check
whether it's supposed to be invoked or not -- isn't that why you define
it (or not) in the service.xml file?
In kernel/src/org/apache/axis2/engine/Phase.java, here's where it
invokes all of the modules:
311 while (currentIndex < handlersSize) {
312 Handler handler = (Handler)
handlers.get(currentIndex);
313
314 if (isDebugEnabled) {
315 log.debug(msgctx.getLogIDString() + "
Invoking Handler '" + handler.getName() +
316 "' in Phase '" + phaseName + "'");
317 }
318 pi = handler.invoke(msgctx);
If I add this before line 318:
boolean engagedService =
msgctx.getAxisService().isEngaged(handler.getName());
HashMap modules =
msgctx.getConfigurationContext().getAxisConfiguration().getModules();
boolean engagedGlobal = false;
if (modules != null)
engagedGlobal = modules.containsKey(handler.getName());
msgctx.getConfigurationContext().getAxisConfiguration().getModules()
returns the modules engaged for all services, but not the modules
engaged in the global config file. I don't know how to get those.
If a module is engaged globally (in axis2.xml, such as
RequestURIBasedDispatcher), both engagedService and engagedGlobal are
false.
If a module is engaged for the current service, engagedService is true
and engagedGlobal is false.
If the module is not engaged for the current service, engagedService is
false and engagedGlobal is false.
I am going to update my local copy of Phase.java to invoke modules as
they were configured. If anyone is interested in the changes, let me
know. According to the JIRA, it appears that this won't get fixed in
Axis2 anytime soon.
Kimberly Nicholls
When I call Axis2Service my module is invoked and works perfectly.
But when I call Axis2ServiceNoSec the module is invoked too !
So when a module is defined for a service, it is invoked for all other
services !!!! It's not what we expect....