blob: a8f65d12cd6bb6a66b3503e9760c1520e3ae3593 [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.deployment.util;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.deployment.DeploymentErrorMsgs;
import org.apache.axis2.deployment.DeploymentException;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.description.HandlerDescription;
import org.apache.axis2.engine.Handler;
import org.apache.axis2.engine.Phase;
import org.apache.axis2.i18n.Messages;
import org.apache.axis2.phaseresolver.PhaseException;
import org.apache.axis2.phaseresolver.PhaseMetadata;
public class PhasesInfo {
private List<Phase> INPhases;
private List<Phase> IN_FaultPhases;
private List<Phase> OUTPhases;
private List<Phase> OUT_FaultPhases;
public PhasesInfo() {
INPhases = new ArrayList<Phase>();
IN_FaultPhases = new ArrayList<Phase>();
OUTPhases = new ArrayList<Phase>();
OUT_FaultPhases = new ArrayList<Phase>();
}
/**
* To copy phase information from one to another
*
* @param phase
*/
private Phase copyPhase(Phase phase) throws DeploymentException {
Phase newPhase = new Phase(phase.getPhaseName());
Iterator<Handler> handlers = phase.getHandlers().iterator();
while (handlers.hasNext()) {
try {
Handler handlerDescription = (Handler) handlers.next();
newPhase.addHandler(handlerDescription.getHandlerDesc());
} catch (PhaseException e) {
throw new DeploymentException(e);
}
}
return newPhase;
}
HandlerDescription makeHandler(OMElement handlerElement) {
String name = handlerElement.getAttributeValue(new QName("name"));
QName qname = handlerElement.resolveQName(name);
HandlerDescription desc = new HandlerDescription(qname.getLocalPart());
String className = handlerElement.getAttributeValue(new QName("class"));
desc.setClassName(className);
return desc;
}
public Phase makePhase(OMElement phaseElement) throws PhaseException {
String phaseName = phaseElement.getAttributeValue(new QName("name"));
Phase phase = new Phase(phaseName);
Iterator children = phaseElement.getChildElements();
while (children.hasNext()) {
OMElement handlerElement = (OMElement) children.next();
HandlerDescription handlerDesc = makeHandler(handlerElement);
phase.addHandler(handlerDesc);
}
return phase;
}
public List<Phase> getGlobalInflow() throws DeploymentException {
ArrayList<Phase> globalphase = new ArrayList<Phase>();
boolean foundDispatchPhase = false;
for (int i = 0; i < INPhases.size(); i++) {
Phase phase = (Phase) INPhases.get(i);
String phaseName = phase.getPhaseName();
if (!foundDispatchPhase) {
if (PhaseMetadata.PHASE_DISPATCH.equals(phaseName)) {
foundDispatchPhase = true;
}
globalphase.add(phase);
}
}
if (!foundDispatchPhase) {
throw new DeploymentException(
Messages.getMessage(DeploymentErrorMsgs.DISPATCH_PHASE_NOT_FOUND));
}
return globalphase;
}
public List<Phase> getGlobalOutPhaseList() throws DeploymentException {
/**
* I have assumed that PolicyDetermination and MessageProcessing are global out phase
*/
ArrayList<Phase> globalPhaseList = new ArrayList<Phase>();
boolean messageOut = false;
for (int i = 0; i < OUTPhases.size(); i++) {
Phase phase = (Phase) OUTPhases.get(i);
String phaseName = phase.getPhaseName();
if (!messageOut) {
if (PhaseMetadata.PHASE_MESSAGE_OUT.equals(phaseName)) {
messageOut = true;
globalPhaseList.add(copyPhase(phase));
}
} else {
globalPhaseList.add(copyPhase(phase));
}
}
return globalPhaseList;
}
public List<Phase> getINPhases() {
return INPhases;
}
public List<Phase> getIN_FaultPhases() {
return IN_FaultPhases;
}
public List<Phase> getOUTPhases() {
return OUTPhases;
}
public List<Phase> getOutFaultPhaseList(){
return OUT_FaultPhases;
}
public List<Phase> getOUT_FaultPhases() throws DeploymentException {
ArrayList<Phase> globalPhaseList = new ArrayList<Phase>();
boolean messageOut = false;
for (int i = 0; i < OUT_FaultPhases.size(); i++) {
Phase phase = (Phase) OUT_FaultPhases.get(i);
String phaseName = phase.getPhaseName();
if (!messageOut) {
if (PhaseMetadata.PHASE_MESSAGE_OUT.equals(phaseName)) {
messageOut = true;
globalPhaseList.add(copyPhase(phase));
}
} else {
globalPhaseList.add(copyPhase(phase));
}
}
return globalPhaseList;
}
public List<Phase> getOperationInFaultPhases() throws DeploymentException {
ArrayList<Phase> operationINPhases = new ArrayList<Phase>();
boolean foundDispathPhase = false;
for (int i = 0; i < IN_FaultPhases.size(); i++) {
Phase phase = (Phase) IN_FaultPhases.get(i);
String phaseName = phase.getPhaseName();
if (foundDispathPhase) {
operationINPhases.add(copyPhase(phase));
}
if (PhaseMetadata.PHASE_DISPATCH.equals(phaseName)) {
foundDispathPhase = true;
}
}
return operationINPhases;
}
public List<Phase> getGlobalInFaultPhases() throws DeploymentException {
ArrayList<Phase> globalInfaultphase = new ArrayList<Phase>();
boolean foundDispatchPhase = false;
for (int i = 0; i < IN_FaultPhases.size(); i++) {
Phase phase = (Phase) IN_FaultPhases.get(i);
String phaseName = phase.getPhaseName();
if (!foundDispatchPhase) {
if (PhaseMetadata.PHASE_DISPATCH.equals(phaseName)) {
foundDispatchPhase = true;
}
globalInfaultphase.add(phase);
}
}
if (!foundDispatchPhase) {
throw new DeploymentException(
Messages.getMessage(DeploymentErrorMsgs.DISPATCH_PHASE_NOT_FOUND));
}
return globalInfaultphase;
}
public ArrayList<Phase> getOperationInPhases() throws DeploymentException {
ArrayList<Phase> operationINPhases = new ArrayList<Phase>();
boolean foundDispathPhase = false;
for (int i = 0; i < INPhases.size(); i++) {
Phase phase = (Phase) INPhases.get(i);
String phaseName = phase.getPhaseName();
if (foundDispathPhase) {
operationINPhases.add(copyPhase(phase));
}
if (PhaseMetadata.PHASE_DISPATCH.equals(phaseName)) {
foundDispathPhase = true;
}
}
return operationINPhases;
}
public ArrayList<Phase> getOperationOutFaultPhases() throws DeploymentException {
ArrayList<Phase> operationFaultOutPhases = new ArrayList<Phase>();
for (int i = 0; i < OUT_FaultPhases.size(); i++) {
Phase phase = (Phase) OUT_FaultPhases.get(i);
String phaseName = phase.getPhaseName();
if (PhaseMetadata.PHASE_MESSAGE_OUT.equals(phaseName)) {
break;
}
operationFaultOutPhases.add(copyPhase(phase));
}
return operationFaultOutPhases;
}
public ArrayList<Phase> getOperationOutPhases() throws DeploymentException {
ArrayList<Phase> oprationOUTPhases = new ArrayList<Phase>();
for (int i = 0; i < OUTPhases.size(); i++) {
Phase phase = (Phase) OUTPhases.get(i);
String phaseName = phase.getPhaseName();
if (PhaseMetadata.PHASE_MESSAGE_OUT.equals(phaseName)) {
break;
}
oprationOUTPhases.add(copyPhase(phase));
}
return oprationOUTPhases;
}
public void setINPhases(List<Phase> INPhases) {
this.INPhases = INPhases;
}
public void setIN_FaultPhases(List<Phase> IN_FaultPhases) {
this.IN_FaultPhases = IN_FaultPhases;
}
public void setOUTPhases(List<Phase> OUTPhases) {
this.OUTPhases = OUTPhases;
}
public void setOUT_FaultPhases(List<Phase> OUT_FaultPhases) {
this.OUT_FaultPhases = OUT_FaultPhases;
}
public void setOperationPhases(AxisOperation axisOperation) throws AxisFault {
if (axisOperation != null) {
try {
axisOperation.setRemainingPhasesInFlow(getOperationInPhases());
axisOperation.setPhasesOutFlow(getOperationOutPhases());
axisOperation.setPhasesInFaultFlow(new ArrayList(getOperationInFaultPhases()));
axisOperation.setPhasesOutFaultFlow(getOperationOutFaultPhases());
} catch (DeploymentException e) {
throw AxisFault.makeFault(e);
}
}
}
}