/* * Copyright (c) 2005-2011, 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.urlrewrite; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.xml.namespace.QName; import org.apache.axiom.om.OMAttribute; import org.apache.axiom.om.OMElement; import org.apache.synapse.config.xml.SynapseXPathFactory; 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; public class URLRewriteActions { private SynapseXPath xpath; private String value; private String fragment; private String regex; // Action types public static final String TYPE_APPEND = "append"; public static final String TYPE_PREPEND = "prepend"; public static final String TYPE_REPLACE = "replace"; public static final String TYPE_REMOVE = "remove"; public static final String TYPE_SET = "set"; // default action private String type = TYPE_SET; // URL fragment types public static final String FRAGMENT_PROTOCOL = "protocol"; public static final String FRAGMENT_HOST = "host"; public static final String FRAGMENT_PORT = "port"; public static final String FRAGMENT_PATH = "path"; public static final String FRAGMENT_QUERY = "query"; public static final String FRAGMENT_REF = "ref"; public static final String FRAGMENT_USER = "user"; public static final String FRAGMENT_FULL = "full"; // default URL fragment i s"full" private String url = FRAGMENT_FULL; public void setAction(String type) { this.type = type; } public String getAction() { return type; } public void setURL(String url) { this.url = url; } public String getURL() { return url; } public SynapseXPath getXpath() { // There is a duplicate namespace comes, remove that.(That namespace is // added at two seperate places(ie: when we serialize @ mediator ui+ // backend serialization) List<String> nsUriList = new ArrayList<String>(); if (xpath != null) { for (Object o : xpath.getNamespaces().keySet()) { int i = 0; String prefix = (String) o; String uri = xpath.getNamespaceContext().translateNamespacePrefixToUri(prefix); for (int j = 0; j <= i; j++) { if (nsUriList.size() > 0) { if (uri.equals(nsUriList.get(j).toString())) { xpath.getNamespaces().remove(prefix); } else { nsUriList.add(uri); } } else { nsUriList.add(uri); } } i++; } } return xpath; } public void setXpath(SynapseXPath xpath) { this.xpath = xpath; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } public String getFragment() { return fragment; } public void setFragment(String fragment) { this.fragment = fragment; } public String getRegex() { return regex; } public void setRegex(String regex) { this.regex = regex; } public static List<URLRewriteActions> getAllActions(OMElement elem) { QName VALUE_Q = new QName("value"); QName XPATH_Q = new QName("xpath"); QName REGEX_Q = new QName("regex"); QName FRAGMENT_Q = new QName("fragment"); QName TYPE_Q = new QName("type"); QName ACTION_Q = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "action"); List<URLRewriteActions> actionList = new ArrayList<URLRewriteActions>(); Iterator itr = elem.getChildrenWithName(ACTION_Q); while (itr.hasNext()) { OMElement actionEle = (OMElement) itr.next(); OMAttribute xpathAttr = actionEle.getAttribute(XPATH_Q); OMAttribute valueAttr = actionEle.getAttribute(VALUE_Q); OMAttribute regexAttr = actionEle.getAttribute(REGEX_Q); OMAttribute fragmentAttr = actionEle.getAttribute(FRAGMENT_Q); OMAttribute typeAttr = actionEle.getAttribute(TYPE_Q); URLRewriteActions urlRewriteActions = new URLRewriteActions(); if (("set".equals(typeAttr.getAttributeValue())) || ("append".equals(typeAttr.getAttributeValue())) || ("prepend".equals(typeAttr.getAttributeValue())) || ("replace".equals(typeAttr.getAttributeValue()))) { if (valueAttr == null && xpathAttr == null) { String msg = "The 'value'/'xpath' attribute is required for " + "the configuration for the 'set'/'append'" + "/'prepend' or repalce action"; throw new MediatorException(msg); } if (valueAttr != null && valueAttr.getAttributeValue() != null) { urlRewriteActions.setValue(valueAttr.getAttributeValue()); } if (xpathAttr != null && xpathAttr.getAttributeValue() != null) { try { urlRewriteActions.setXpath(SynapseXPathFactory.getSynapseXPath(actionEle, XPATH_Q)); } catch (JaxenException e) { throw new MediatorException("Could not construct the" + " xpath"); } } } if ("replace".equals(typeAttr.getAttributeValue())) { if (regexAttr == null) { String msg = "The 'regex' attribute is required for the " + "configuration for the 'replace' action"; throw new MediatorException(msg); } urlRewriteActions.setRegex(regexAttr.getAttributeValue()); } if (typeAttr.getAttributeValue() != null) { urlRewriteActions.setAction(typeAttr.getAttributeValue()); } if (fragmentAttr != null) { urlRewriteActions.setFragment(fragmentAttr.getAttributeValue()); } // if a value is specified, use it, else look for an expression if (valueAttr != null) { urlRewriteActions.setValue(valueAttr.getAttributeValue()); } else if (xpathAttr != null) { try { urlRewriteActions.setXpath(SynapseXPathFactory.getSynapseXPath(actionEle, XPATH_Q)); } catch (JaxenException e) { String msg = "Invalid XPapth expression : " + xpathAttr.getAttributeValue(); throw new MediatorException(msg); } } actionList.add(urlRewriteActions); } return actionList; } }