You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by "Jeff Thomas (JIRA)" <ji...@apache.org> on 2017/07/20 11:25:00 UTC
[jira] [Updated] (AXIS2-5862) Handler / Phase Indexes incorrect?
[ https://issues.apache.org/jira/browse/AXIS2-5862?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jeff Thomas updated AXIS2-5862:
-------------------------------
Description:
I believe there is a problem or rather multiple problems in the Phase/Handler flow indexing..but I am not 100% sure.
In 'org.apache.axis2.engine.Phase':
1. During the Phase invocation:
While cycling through the handlers, I would expect 'msgctx.setHandlerIndex(i+1)' but instead the phase index is incremented.
{code:java}
int handlersSize = handlers.size();
for (int i= currentIndex; i < handlersSize; i++) {
Handler handler = (Handler) handlers.get(i);
InvocationResponse pi = invokeHandler(handler, msgctx);
if (!pi.equals(InvocationResponse.CONTINUE)) {
return pi;
}
// Set phase index to the next handler
msgctx.setCurrentPhaseIndex(i+1);
}
{code}
2. During the phase 'flowComplete':
I would expect here 'msgContext.getCurrenHandlerIndex()' and 'msgContext.setCurrentHandlerIndex(0)' instead.
{code:java}
// This will be non-zero if we failed during execution of one of the
// handlers in this phase
int currentHandlerIndex = msgContext.getCurrentPhaseIndex();
if (currentHandlerIndex == 0) {
currentHandlerIndex = handlers.size();
} else {
/*We need to set it to 0 so that any previous phases will execute all
* of their handlers.*/
msgContext.setCurrentPhaseIndex(0);
}
for (; currentHandlerIndex > 0; currentHandlerIndex--) {
Handler handler = (Handler) handlers.get(currentHandlerIndex - 1);
if (isDebugEnabled) {
log.debug(msgContext.getLogIDString() + " Invoking flowComplete() for Handler '" +
handler.getName() + "' in Phase '" + phaseName + "'");
}
handler.flowComplete(msgContext);
}
{code}
This is currrently causing errors in our installation because we are seeing a currentPhaseIndex == 1, which forces the "currentHandlerIndex == 1"; however the phase we are in has no handlers. This causes an OutOfBoundsException when it attempts to get the handler with index[0] (1-1).
{noformat}
java.lang.ArrayIndexOutOfBoundsException: 0
at java.util.concurrent.CopyOnWriteArrayList.get(CopyOnWriteArrayList.java:368)
at java.util.concurrent.CopyOnWriteArrayList.get(CopyOnWriteArrayList.java:377)
at org.apache.axis2.engine.Phase.flowComplete(Phase.java:361)
{noformat}
Unfortunately I am not sure if there even more locations where HandlerIndex instead of PhaseIndex probably should have been used.
was:
I believe there is a problem or rather multiple problems in the Phase/Handler flow indexing..but I am not 100% sure.
In 'org.apache.axis2.engine.Phase':
1. During the Phase invocation:
While cycling through the handlers, I would expect 'msgctx.setHandlerIndex(i+1)' but instead the phase index is incremented.
{code:java}
int handlersSize = handlers.size();
for (int i= currentIndex; i < handlersSize; i++) {
Handler handler = (Handler) handlers.get(i);
InvocationResponse pi = invokeHandler(handler, msgctx);
if (!pi.equals(InvocationResponse.CONTINUE)) {
return pi;
}
// Set phase index to the next handler
msgctx.setCurrentPhaseIndex(i+1);
}
{code}
2. During the phase 'flowComplete':
I would expect here 'msgContext.getCurrenHandlerIndex()' and 'msgContext.setCurrentHandlerIndex(0)' instead.
{code:java}
// This will be non-zero if we failed during execution of one of the
// handlers in this phase
int currentHandlerIndex = {color:red}*msgContext.getCurrentPhaseIndex()*{color};
if (currentHandlerIndex == 0) {
currentHandlerIndex = handlers.size();
} else {
/*We need to set it to 0 so that any previous phases will execute all
* of their handlers.*/
{color:red}*msgContext.setCurrentPhaseIndex(0)*{color};
}
for (; currentHandlerIndex > 0; currentHandlerIndex--) {
Handler handler = (Handler) handlers.get(currentHandlerIndex - 1);
if (isDebugEnabled) {
log.debug(msgContext.getLogIDString() + " Invoking flowComplete() for Handler '" +
handler.getName() + "' in Phase '" + phaseName + "'");
}
handler.flowComplete(msgContext);
}
{code}
This is currrently causing errors in our installation because we are seeing a currentPhaseIndex == 1, which forces the "currentHandlerIndex == 1"; however the phase we are in has no handlers. This causes an OutOfBoundsException when it attempts to get the handler with index[0] (1-1).
{noformat}
java.lang.ArrayIndexOutOfBoundsException: 0
at java.util.concurrent.CopyOnWriteArrayList.get(CopyOnWriteArrayList.java:368)
at java.util.concurrent.CopyOnWriteArrayList.get(CopyOnWriteArrayList.java:377)
at org.apache.axis2.engine.Phase.flowComplete(Phase.java:361)
{noformat}
Unfortunately I am not sure if there even more locations where HandlerIndex instead of PhaseIndex probably should have been used.
> Handler / Phase Indexes incorrect?
> ----------------------------------
>
> Key: AXIS2-5862
> URL: https://issues.apache.org/jira/browse/AXIS2-5862
> Project: Axis2
> Issue Type: Bug
> Components: kernel
> Affects Versions: 1.7.4
> Reporter: Jeff Thomas
> Fix For: 1.7.6
>
>
> I believe there is a problem or rather multiple problems in the Phase/Handler flow indexing..but I am not 100% sure.
> In 'org.apache.axis2.engine.Phase':
> 1. During the Phase invocation:
> While cycling through the handlers, I would expect 'msgctx.setHandlerIndex(i+1)' but instead the phase index is incremented.
> {code:java}
> int handlersSize = handlers.size();
>
> for (int i= currentIndex; i < handlersSize; i++) {
> Handler handler = (Handler) handlers.get(i);
> InvocationResponse pi = invokeHandler(handler, msgctx);
>
> if (!pi.equals(InvocationResponse.CONTINUE)) {
> return pi;
> }
>
> // Set phase index to the next handler
> msgctx.setCurrentPhaseIndex(i+1);
> }
> {code}
> 2. During the phase 'flowComplete':
> I would expect here 'msgContext.getCurrenHandlerIndex()' and 'msgContext.setCurrentHandlerIndex(0)' instead.
> {code:java}
> // This will be non-zero if we failed during execution of one of the
> // handlers in this phase
> int currentHandlerIndex = msgContext.getCurrentPhaseIndex();
> if (currentHandlerIndex == 0) {
> currentHandlerIndex = handlers.size();
> } else {
> /*We need to set it to 0 so that any previous phases will execute all
> * of their handlers.*/
> msgContext.setCurrentPhaseIndex(0);
> }
> for (; currentHandlerIndex > 0; currentHandlerIndex--) {
> Handler handler = (Handler) handlers.get(currentHandlerIndex - 1);
> if (isDebugEnabled) {
> log.debug(msgContext.getLogIDString() + " Invoking flowComplete() for Handler '" +
> handler.getName() + "' in Phase '" + phaseName + "'");
> }
> handler.flowComplete(msgContext);
> }
> {code}
> This is currrently causing errors in our installation because we are seeing a currentPhaseIndex == 1, which forces the "currentHandlerIndex == 1"; however the phase we are in has no handlers. This causes an OutOfBoundsException when it attempts to get the handler with index[0] (1-1).
> {noformat}
> java.lang.ArrayIndexOutOfBoundsException: 0
> at java.util.concurrent.CopyOnWriteArrayList.get(CopyOnWriteArrayList.java:368)
> at java.util.concurrent.CopyOnWriteArrayList.get(CopyOnWriteArrayList.java:377)
> at org.apache.axis2.engine.Phase.flowComplete(Phase.java:361)
> {noformat}
> Unfortunately I am not sure if there even more locations where HandlerIndex instead of PhaseIndex probably should have been used.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)
---------------------------------------------------------------------
To unsubscribe, e-mail: java-dev-unsubscribe@axis.apache.org
For additional commands, e-mail: java-dev-help@axis.apache.org