in src/main/java/org/apache/xml/security/stax/impl/InputProcessorChainImpl.java [87:169]
public synchronized void addProcessor(InputProcessor newInputProcessor) {
int startPhaseIdx = 0;
int endPhaseIdx = inputProcessors.size();
XMLSecurityConstants.Phase targetPhase = newInputProcessor.getPhase();
for (int i = inputProcessors.size() - 1; i >= 0; i--) {
InputProcessor inputProcessor = inputProcessors.get(i);
if (inputProcessor.getPhase().ordinal() > targetPhase.ordinal()) {
startPhaseIdx = i + 1;
break;
}
}
for (int i = startPhaseIdx; i < inputProcessors.size(); i++) {
InputProcessor inputProcessor = inputProcessors.get(i);
if (inputProcessor.getPhase().ordinal() < targetPhase.ordinal()) {
endPhaseIdx = i;
break;
}
}
//just look for the correct phase and append as last
if (newInputProcessor.getBeforeProcessors().isEmpty()
&& newInputProcessor.getAfterProcessors().isEmpty()) {
inputProcessors.add(startPhaseIdx, newInputProcessor);
} else if (newInputProcessor.getBeforeProcessors().isEmpty()) {
int idxToInsert = startPhaseIdx;
for (int i = endPhaseIdx - 1; i >= startPhaseIdx; i--) {
InputProcessor inputProcessor = inputProcessors.get(i);
if (newInputProcessor.getAfterProcessors().contains(inputProcessor)
|| newInputProcessor.getAfterProcessors().contains(inputProcessor.getClass().getName())) {
idxToInsert = i;
break;
}
}
inputProcessors.add(idxToInsert, newInputProcessor);
} else if (newInputProcessor.getAfterProcessors().isEmpty()) {
int idxToInsert = endPhaseIdx;
for (int i = startPhaseIdx; i < endPhaseIdx; i++) {
InputProcessor inputProcessor = inputProcessors.get(i);
if (newInputProcessor.getBeforeProcessors().contains(inputProcessor)
|| newInputProcessor.getBeforeProcessors().contains(inputProcessor.getClass().getName())) {
idxToInsert = i + 1;
break;
}
}
inputProcessors.add(idxToInsert, newInputProcessor);
} else {
boolean found = false;
int idxToInsert = startPhaseIdx;
for (int i = endPhaseIdx - 1; i >= startPhaseIdx; i--) {
InputProcessor inputProcessor = inputProcessors.get(i);
if (newInputProcessor.getAfterProcessors().contains(inputProcessor)
|| newInputProcessor.getAfterProcessors().contains(inputProcessor.getClass().getName())) {
idxToInsert = i;
found = true;
break;
}
}
if (found) {
inputProcessors.add(idxToInsert, newInputProcessor);
} else {
for (int i = startPhaseIdx; i < endPhaseIdx; i++) {
InputProcessor inputProcessor = inputProcessors.get(i);
if (newInputProcessor.getBeforeProcessors().contains(inputProcessor)
|| newInputProcessor.getBeforeProcessors().contains(inputProcessor.getClass().getName())) {
idxToInsert = i + 1;
break;
}
}
inputProcessors.add(idxToInsert, newInputProcessor);
}
}
if (LOG.isLoggable(Level.DEBUG)) {
LOG.log(Level.DEBUG, "Added {0} to input chain: ", newInputProcessor.getClass().getName());
for (InputProcessor inputProcessor : inputProcessors) {
LOG.log(Level.DEBUG, "Name: {0} phase: {1}", inputProcessor.getClass().getName(), inputProcessor.getPhase());
}
}
}