| /* |
| * 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.synapse.config.xml; |
| |
| import org.apache.axiom.om.OMAttribute; |
| import org.apache.axiom.om.OMElement; |
| import org.apache.synapse.Mediator; |
| import org.apache.synapse.mediators.transform.FaultMediator; |
| import org.jaxen.JaxenException; |
| |
| import javax.xml.namespace.QName; |
| import java.net.URI; |
| import java.net.URISyntaxException; |
| import java.util.Iterator; |
| import java.util.Properties; |
| |
| /** |
| * Factory for {@link FaultMediator} instances. |
| * <p> |
| * Configuration syntax: |
| * <pre> |
| * <makefault [version="soap11|soap12|pox"] [response="true|false"]> |
| * <code (value="literal" | expression="xpath")/> |
| * <reason (value="literal" | expression="xpath")/> |
| * <node>...</node>? |
| * <role>...</role>? |
| * (<detail expression="xpath"/> | <detail>...</detail>)? |
| * </makefault> |
| * </pre> |
| */ |
| public class FaultMediatorFactory extends AbstractMediatorFactory { |
| |
| private static final QName FAULT_Q |
| = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "makefault"); |
| |
| private static final QName ATT_VERSION_Q |
| = new QName(XMLConfigConstants.NULL_NAMESPACE, "version"); |
| private static final QName ATT_RESPONSE_Q |
| = new QName(XMLConfigConstants.NULL_NAMESPACE, "response"); |
| private static final QName CODE_Q |
| = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "code"); |
| private static final QName REASON_Q |
| = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "reason"); |
| private static final QName NODE_Q |
| = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "node"); |
| private static final QName ROLE_Q |
| = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "role"); |
| private static final QName DETAIL_Q |
| = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "detail"); |
| |
| private static final String SOAP11 = "soap11"; |
| private static final String SOAP12 = "soap12"; |
| private static final String POX = "pox"; |
| |
| public Mediator createSpecificMediator(OMElement elem, Properties properties) { |
| |
| FaultMediator faultMediator = new FaultMediator(); |
| |
| OMAttribute version = elem.getAttribute(ATT_VERSION_Q); |
| if (version != null) { |
| if (SOAP11.equals(version.getAttributeValue())) { |
| faultMediator.setSoapVersion(FaultMediator.SOAP11); |
| } else if (SOAP12.equals(version.getAttributeValue())) { |
| faultMediator.setSoapVersion(FaultMediator.SOAP12); |
| } else if (POX.equals(version.getAttributeValue())) { |
| faultMediator.setSoapVersion(FaultMediator.POX); |
| } else { |
| handleException("Invalid SOAP version"); |
| } |
| } |
| |
| OMAttribute response = elem.getAttribute(ATT_RESPONSE_Q); |
| if (response != null) { |
| if ("true".equals(response.getAttributeValue())) { |
| faultMediator.setMarkAsResponse(true); |
| } else if ("false".equals(response.getAttributeValue())) { |
| faultMediator.setMarkAsResponse(false); |
| } else { |
| handleException("Invalid value '" + response.getAttributeValue() |
| + "' passed as response. Expected 'true' or 'false'"); |
| } |
| faultMediator.setSerializeResponse(true); |
| } |
| |
| OMElement code = elem.getFirstChildWithName(CODE_Q); |
| if (code != null) { |
| OMAttribute value = code.getAttribute(ATT_VALUE); |
| OMAttribute expression = code.getAttribute(ATT_EXPRN); |
| |
| if (value != null) { |
| String strValue = value.getAttributeValue(); |
| QName qname = code.resolveQName(strValue); |
| if (qname == null) { |
| handleException("Invalid QName '" + strValue + "' in code attribute"); |
| } else if (qname.getNamespaceURI().isEmpty()) { |
| handleException("A QName is expected for fault code as prefix:name"); |
| } else { |
| faultMediator.setFaultCodeValue(qname); |
| } |
| } else if (expression != null) { |
| try { |
| faultMediator.setFaultCodeExpr( |
| SynapseXPathFactory.getSynapseXPath(code, ATT_EXPRN)); |
| } catch (JaxenException je) { |
| handleException("Invalid fault code expression : " + je.getMessage(), je); |
| } |
| } else { |
| handleException("A 'value' or 'expression' attribute must specify the fault code"); |
| } |
| |
| } else if (faultMediator.getSoapVersion() != FaultMediator.POX) { |
| handleException("The fault code is a required attribute for the " + |
| "makefault mediator unless it is a pox fault"); |
| } |
| |
| OMElement reason = elem.getFirstChildWithName(REASON_Q); |
| if (reason != null) { |
| OMAttribute value = reason.getAttribute(ATT_VALUE); |
| OMAttribute expression = reason.getAttribute(ATT_EXPRN); |
| |
| if (value != null) { |
| faultMediator.setFaultReasonValue(value.getAttributeValue()); |
| } else if (expression != null) { |
| try { |
| faultMediator.setFaultReasonExpr( |
| SynapseXPathFactory.getSynapseXPath(reason, ATT_EXPRN)); |
| } catch (JaxenException je) { |
| handleException("Invalid fault reason expression : " + je.getMessage(), je); |
| } |
| } else { |
| handleException("A 'value' or 'expression' attribute must specify the fault code"); |
| } |
| |
| } else if (faultMediator.getSoapVersion() != FaultMediator.POX) { |
| handleException("The fault reason is a required attribute for the " + |
| "makefault mediator unless it is a pox fault"); |
| } |
| |
| // after successfully creating the mediator |
| // set its common attributes such as tracing etc |
| processAuditStatus(faultMediator,elem); |
| |
| OMElement node = elem.getFirstChildWithName(NODE_Q); |
| if (node != null && node.getText() != null) { |
| try { |
| faultMediator.setFaultNode(new URI(node.getText())); |
| } catch (URISyntaxException e) { |
| handleException("Invalid URI specified for fault node : " + node.getText(), e); |
| } |
| } |
| |
| OMElement role = elem.getFirstChildWithName(ROLE_Q); |
| if (role != null && role.getText() != null) { |
| try { |
| faultMediator.setFaultRole(new URI(role.getText())); |
| } catch (URISyntaxException e) { |
| handleException("Invalid URI specified for fault role : " + role.getText(), e); |
| } |
| } |
| |
| OMElement detail = elem.getFirstChildWithName(DETAIL_Q); |
| if (detail != null) { |
| OMAttribute detailExpr = detail.getAttribute(ATT_EXPRN); |
| if (detailExpr != null && detailExpr.getAttributeValue() != null) { |
| try { |
| faultMediator.setFaultDetailExpr( |
| SynapseXPathFactory.getSynapseXPath(detail, ATT_EXPRN)); |
| } catch (JaxenException e) { |
| handleException("Unable to build the XPath for fault detail " + |
| "from the expression : " + detailExpr.getAttributeValue(), e); |
| } |
| } else if (detail.getChildElements().hasNext()) { |
| Iterator it = detail.getChildElements(); |
| while (it.hasNext()) { |
| OMElement child = (OMElement) it.next(); |
| if (child != null) { |
| faultMediator.addFaultDetailElement(child); |
| } |
| } |
| } else if (detail.getText() != null) { |
| faultMediator.setFaultDetail(detail.getText()); |
| } else { |
| // we have an empty detail element |
| faultMediator.setFaultDetail(""); |
| } |
| } |
| |
| return faultMediator; |
| } |
| |
| public QName getTagQName() { |
| return FAULT_Q; |
| } |
| } |