/* * Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. 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.wso2.carbon.mediator.header; import org.apache.axiom.om.OMAttribute; import org.apache.axiom.om.OMElement; import org.apache.synapse.config.xml.OMElementUtils; import org.apache.synapse.config.xml.SynapseXPathFactory; import org.apache.synapse.config.xml.SynapseXPathSerializer; import org.apache.synapse.config.xml.XMLConfigConstants; import org.apache.synapse.util.xpath.SynapseXPath; import org.jaxen.JaxenException; import org.wso2.carbon.mediator.service.MediatorException; import org.wso2.carbon.mediator.service.ui.AbstractMediator; import javax.xml.namespace.QName; public class HeaderMediator extends AbstractMediator { public static final int ACTION_SET = 0; public static final int ACTION_REMOVE = 1; private static final QName ATT_ACTION = new QName("action"); private static final QName ATT_SCOPE = new QName("scope"); /** The qName of the header @see HeaderType */ private QName qName = null; /** The literal value to be set as the header (if one was specified) */ private String value = null; /** Set the header (ACTION_SET) or remove it (ACTION_REMOVE). Defaults to ACTION_SET */ private int action = ACTION_SET; private String scope = null; /** An expression which should be evaluated, and the result set as the header value */ private SynapseXPath expression = null; // An XML content as a complex header. private OMElement xml; public String getScope() { return scope; } public void setScope(String scope) { this.scope = scope; } public int getAction() { return action; } public void setAction(int action) { this.action = action; } public QName getQName() { return qName; } public void setQName(QName qName) { this.qName = qName; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } public SynapseXPath getExpression() { return expression; } public void setExpression(SynapseXPath expression) { this.expression = expression; } public void setXml(OMElement xml) { this.xml = xml; } public OMElement getXml() { return xml; } public String getTagLocalName() { return "header"; } public OMElement serialize(OMElement parent) { OMElement header = fac.createOMElement("header", synNS); saveTracingState(header, this); if (getXml() != null) { header.addChild(getXml()); } QName qName = getQName(); if (qName != null && getXml() ==null) { if (qName.getNamespaceURI() != null) { header.addAttribute(fac.createOMAttribute( "name", nullNS, (qName.getPrefix() != null && !"".equals(qName.getPrefix()) ? qName.getPrefix() + ":" : "") + qName.getLocalPart())); header.declareNamespace(qName.getNamespaceURI(), qName.getPrefix()); } else { header.addAttribute(fac.createOMAttribute( "name", nullNS, qName.getLocalPart())); } } if (scope != null) { // if we have already built a mediator with scope, scope should be valid, now save it header.addAttribute(fac.createOMAttribute("scope", nullNS, scope)); } if (getAction() == org.apache.synapse.mediators.transform.HeaderMediator.ACTION_REMOVE) { header.addAttribute(fac.createOMAttribute( "action", nullNS, "remove")); } else { if (getValue() != null) { header.addAttribute(fac.createOMAttribute( "value", nullNS, getValue())); } else if (getExpression() != null) { SynapseXPathSerializer.serializeXPath( getExpression(), header, "expression"); } else if (getXml() == null) { // todo: error } } if (parent != null) { parent.addChild(header); } return header; } public void build(OMElement elem) { // reset qName = null; value = null; expression = null; action = ACTION_SET; scope = null; OMAttribute name = elem.getAttribute(ATT_NAME); OMAttribute value = elem.getAttribute(ATT_VALUE); OMAttribute exprn = elem.getAttribute(ATT_EXPRN); OMAttribute action = elem.getAttribute(ATT_ACTION); OMAttribute scopeAttr = elem.getAttribute(ATT_SCOPE); OMElement childElem = elem.getFirstElement(); if (childElem != null) { setXml(childElem); } if (scopeAttr != null) { String valueStr = scopeAttr.getAttributeValue(); if (!XMLConfigConstants.SCOPE_TRANSPORT.equals(valueStr) && !XMLConfigConstants.SCOPE_DEFAULT.equals(valueStr)) { String msg = "Only '" + XMLConfigConstants.SCOPE_TRANSPORT + "' or '" + XMLConfigConstants.SCOPE_DEFAULT + "' values are allowed for attribute scope for a header mediator" + ", Unsupported scope " + valueStr; throw new MediatorException(msg); } this.scope = valueStr; } if ((name == null || name.getAttributeValue() == null) && childElem == null) { String msg = "A valid name attribute is required for the header mediator"; throw new MediatorException(msg); } else if (childElem == null) { String nameAtt = name.getAttributeValue(); int colonPos = nameAtt.indexOf(":"); if (colonPos != -1) { // has a NS prefix.. find it and the NS it maps into String prefix = nameAtt.substring(0, colonPos); String namespaceURI = OMElementUtils.getNameSpaceWithPrefix(prefix, elem); if (namespaceURI == null) { String msg = "Invalid namespace prefix '" + prefix + "' in name attribute"; throw new MediatorException(msg); } else { setQName(new QName(namespaceURI, nameAtt.substring(colonPos+1), prefix)); } } else { // no prefix setQName(new QName(nameAtt)); } } // after successfully creating the mediator // set its common attributes such as tracing etc processAuditStatus(this, elem); // The action attribute is optional, if provided and equals to 'remove' the // header mediator will act as a header remove mediator if (action != null && "remove".equals(action.getAttributeValue())) { setAction(ACTION_REMOVE); } if (getAction() == org.apache.synapse.mediators.transform.HeaderMediator.ACTION_SET && value == null && exprn == null && childElem == null) { // String msg = "A 'value' or 'expression' attribute is required for a [set] header mediator"; // TODO error } if (value != null && value.getAttributeValue() != null) { setValue(value.getAttributeValue()); } else if (exprn != null && exprn.getAttributeValue() != null) { try { setExpression(SynapseXPathFactory.getSynapseXPath(elem, ATT_EXPRN)); } catch (JaxenException je) { // TODO error } } } }