blob: 13579767c674075aae3563dd67c04a81c3d1e9d0 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.axis2.phaseresolver;
import org.apache.axis2.description.AxisMessage;
import org.apache.axis2.description.AxisModule;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.description.Flow;
import org.apache.axis2.description.HandlerDescription;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.engine.Phase;
import org.apache.axis2.wsdl.WSDLConstants;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Class PhaseResolver
*/
public class PhaseResolver {
private static final int IN_FLOW = 1;
private static final int OUT_FAULT_FLOW = 5;
/**
* Field axisConfig
*/
private AxisConfiguration axisConfig;
/**
* Field phaseHolder
*/
private PhaseHolder phaseHolder;
/**
* default constructor , to obuild chains for GlobalDescription
*
* @param axisconfig
*/
public PhaseResolver(AxisConfiguration axisconfig) {
this.axisConfig = axisconfig;
}
private void engageModuleToFlow(Flow flow, List handlerChain) throws PhaseException {
phaseHolder = new PhaseHolder(handlerChain);
if (flow != null) {
for (int j = 0; j < flow.getHandlerCount(); j++) {
HandlerDescription metadata = flow.getHandler(j);
phaseHolder.addHandler(metadata);
}
}
}
private void engageModuleToOperation(AxisOperation axisOperation,
AxisModule axisModule,
int flowType) throws PhaseException {
List phases = new ArrayList();
Flow flow = null;
switch (flowType) {
case PhaseMetadata.IN_FLOW : {
phases.addAll(axisConfig.getInFlowPhases());
phases.addAll(axisOperation.getRemainingPhasesInFlow());
flow = axisModule.getInFlow();
break;
}
case PhaseMetadata.OUT_FLOW : {
phases.addAll(axisOperation.getPhasesOutFlow());
phases.addAll(axisConfig.getOutFlowPhases());
flow = axisModule.getOutFlow();
break;
}
case PhaseMetadata.FAULT_OUT_FLOW : {
phases.addAll(axisOperation.getPhasesOutFaultFlow());
phases.addAll(axisConfig.getOutFaultFlowPhases());
flow = axisModule.getFaultOutFlow();
break;
}
case PhaseMetadata.FAULT_IN_FLOW : {
phases.addAll(axisOperation.getPhasesInFaultFlow());
phases.addAll(axisConfig.getInFaultFlowPhases());
flow = axisModule.getFaultInFlow();
break;
}
}
engageModuleToFlow(flow, phases);
}
public void engageModuleToOperation(AxisOperation axisOperation, AxisModule module)
throws PhaseException {
for (int type = IN_FLOW; type < OUT_FAULT_FLOW; type++) {
engageModuleToOperation(axisOperation, module, type);
}
}
/**
* To remove handlers from global chians this method can be used , first it take inflow
* of the module and then take handler one by one and then remove those handlers from
* global inchain ,
* the same procedure will be carry out for all the other flows as well.
*
* @param module
*/
public void disengageModuleFromGlobalChains(AxisModule module) {
//INFLOW
Flow flow = module.getInFlow();
if (flow != null) {
for (int j = 0; j < flow.getHandlerCount(); j++) {
HandlerDescription handler = flow.getHandler(j);
removeHandlerfromaPhase(handler, axisConfig.getInFlowPhases());
}
}
//OUTFLOW
flow = module.getOutFlow();
if (flow != null) {
for (int j = 0; j < flow.getHandlerCount(); j++) {
HandlerDescription handler = flow.getHandler(j);
removeHandlerfromaPhase(handler, axisConfig.getOutFlowPhases());
}
}
//INFAULTFLOW
flow = module.getFaultInFlow();
if (flow != null) {
for (int j = 0; j < flow.getHandlerCount(); j++) {
HandlerDescription handler = flow.getHandler(j);
removeHandlerfromaPhase(handler, axisConfig.getInFaultFlowPhases());
}
}
//OUTFAULTFLOW
flow = module.getFaultOutFlow();
if (flow != null) {
for (int j = 0; j < flow.getHandlerCount(); j++) {
HandlerDescription handler = flow.getHandler(j);
removeHandlerfromaPhase(handler, axisConfig.getOutFaultFlowPhases());
}
}
}
/**
* To remove handlers from operations chians this method can be used , first it take inflow
* of the module and then take handler one by one and then remove those handlers from
* global inchain ,
* the same procedure will be carry out for all the other flows as well.
*
* @param module
*/
public void disengageModuleFromOperationChain(AxisModule module, AxisOperation operation) {
//INFLOW
Flow flow = module.getInFlow();
if (flow != null) {
for (int j = 0; j < flow.getHandlerCount(); j++) {
HandlerDescription handler = flow.getHandler(j);
removeHandlerfromaPhase(handler, operation.getRemainingPhasesInFlow());
}
}
//OUTFLOW
flow = module.getOutFlow();
if (flow != null) {
for (int j = 0; j < flow.getHandlerCount(); j++) {
HandlerDescription handler = flow.getHandler(j);
removeHandlerfromaPhase(handler, operation.getPhasesOutFlow());
}
}
//INFAULTFLOW
flow = module.getFaultInFlow();
if (flow != null) {
for (int j = 0; j < flow.getHandlerCount(); j++) {
HandlerDescription handler = flow.getHandler(j);
removeHandlerfromaPhase(handler, operation.getPhasesInFaultFlow());
}
}
//OUTFAULTFLOW
flow = module.getFaultOutFlow();
if (flow != null) {
for (int j = 0; j < flow.getHandlerCount(); j++) {
HandlerDescription handler = flow.getHandler(j);
removeHandlerfromaPhase(handler, operation.getPhasesOutFaultFlow());
}
}
}
/**
* To remove a single handler from a given list of phases
*
* @param handler
* @param phaseList
*/
private void removeHandlerfromaPhase(HandlerDescription handler, List<Phase> phaseList) {
String phaseName = handler.getRules().getPhaseName();
Iterator<Phase> phaseItr = phaseList.iterator();
while (phaseItr.hasNext()) {
Phase phase = (Phase) phaseItr.next();
if (phase.getPhaseName().equals(phaseName)) {
phase.removeHandler(handler);
break;
}
}
}
public void engageModuleToMessage(AxisMessage axisMessage, AxisModule axisModule)
throws PhaseException {
String direction = axisMessage.getDirection();
AxisOperation axisOperation = axisMessage.getAxisOperation();
if (WSDLConstants.MESSAGE_LABEL_OUT_VALUE.equalsIgnoreCase(direction)) {
engageModuleToOperation(axisOperation, axisModule, PhaseMetadata.OUT_FLOW);
} else if (WSDLConstants.MESSAGE_LABEL_IN_VALUE.equalsIgnoreCase(direction)) {
engageModuleToOperation(axisOperation, axisModule, PhaseMetadata.IN_FLOW);
} else if (WSDLConstants.MESSAGE_LABEL_FAULT_VALUE.equals(direction)) {
//TODO : Need to handle fault correctly
}
}
}