/*
* 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.enrich.ui;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.axiom.om.util.AXIOMUtil;
import org.apache.synapse.config.xml.SynapseXPathFactory;
import org.apache.synapse.config.xml.SynapseXPathSerializer;
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;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.util.Iterator;
public class EnrichMediator extends AbstractMediator {
private final String SOURCE = "source";
private final String TARGET = "target";
private final String CLONE = "clone";
private final String ACTION = "action";
private final String TYPE = "type";
private final String XPATH = "xpath";
private final String PROPERTY = "property";
private final String DEFAULT_SOURCE_TYPE = "custom";
private final String DEFAULT_TARGET_TYPE = "custom";
private final String DEFAULT_TARGET_ACTION_TYPE = "replace";
private String sourceClone = "false";
private String sourceType = DEFAULT_SOURCE_TYPE;
private SynapseXPath sourceExpression = null;
private String sourceProperty = "";
private final String INLINE = "inline";
private final String INLINE_REG_KEY = "key";
private String targetAction = "replace";
private String targetType = DEFAULT_TARGET_TYPE;
private String sourceInlineXML = "";
private String inlineSourceRegKey = "";
private SynapseXPath targetExpression = null;
private String targetProperty = "";
public String getSourceType() {
return sourceType;
}
public void setSourceType(String sourceType) {
this.sourceType = sourceType;
}
public String getSourceClone() {
return sourceClone;
}
public void setSourceClone(String sourceClone) {
this.sourceClone = sourceClone;
}
public SynapseXPath getSourceExpression() {
return sourceExpression;
}
public void setSourceExpression(SynapseXPath sourceExpression) {
this.sourceExpression = sourceExpression;
}
public String getSourceProperty() {
return sourceProperty;
}
public void setSourceProperty(String sourceProperty) {
this.sourceProperty = sourceProperty;
}
public String getSourceInlineXML() {
return sourceInlineXML;
}
public void setSourceInlineXML(String sourceInlineXML) {
this.sourceInlineXML = sourceInlineXML;
}
public String getTargetAction() {
return targetAction;
}
public void setTargetAction(String targetAction) {
this.targetAction = targetAction;
}
public String getTargetType() {
return targetType;
}
public void setTargetType(String targetType) {
this.targetType = targetType;
}
public SynapseXPath getTargetExpression() {
return targetExpression;
}
public void setTargetExpression(SynapseXPath targetExpression) {
this.targetExpression = targetExpression;
}
public String getTargetProperty() {
return targetProperty;
}
public void setTargetProperty(String targetProperty) {
this.targetProperty = targetProperty;
}
public String getTagLocalName() {
return "enrich";
}
public String getInlineSourceRegKey() {
return inlineSourceRegKey;
}
public void setInlineSourceRegKey(String inlineSourceRegKey) {
this.inlineSourceRegKey = inlineSourceRegKey;
}
public OMElement serialize(OMElement parent) {
OMElement enrichElem = fac.createOMElement("enrich", synNS);
OMElement sourceElem = fac.createOMElement(SOURCE, synNS);
saveTracingState(enrichElem, this);
sourceElem.addAttribute(CLONE, sourceClone, nullNS);
sourceElem.addAttribute(TYPE, sourceType, nullNS);
if (null != sourceExpression) {
SynapseXPathSerializer.serializeXPath(sourceExpression, sourceElem, XPATH);
}
if (sourceProperty != null && !sourceProperty.equals("")) {
sourceElem.addAttribute(PROPERTY, sourceProperty, nullNS);
}
if (sourceType.equals(INLINE)) {
/*XMLStreamReader parser = XMLInputFactory.newInstance().createXMLStreamReader("sfsdf");
//create the builder
StAXOMBuilder builder = new StAXOMBuilder(parser);
//get the root element of the XML
OMElement documentElement = builder.getDocumentElement();*/
if (sourceInlineXML != null && !sourceInlineXML.equals("")) {
OMElement inlineXMLElement;
try {
inlineXMLElement = AXIOMUtil.stringToOM(sourceInlineXML);
if (inlineXMLElement != null) {
sourceElem.addChild(inlineXMLElement);
}
} catch (XMLStreamException e) {
e.printStackTrace();
}
} else if (inlineSourceRegKey != null && !inlineSourceRegKey.equals("")) {
sourceElem.addAttribute(INLINE_REG_KEY, inlineSourceRegKey, null);
}
}
OMElement targetElem = fac.createOMElement(TARGET, synNS);
targetElem.addAttribute(ACTION, targetAction, nullNS);
targetElem.addAttribute(TYPE, targetType, nullNS);
if (null != targetExpression) {
SynapseXPathSerializer.serializeXPath(targetExpression, targetElem, XPATH);
}
if (targetProperty != null && !targetProperty.equals("")) {
targetElem.addAttribute(PROPERTY, targetProperty, nullNS);
}
enrichElem.addChild(sourceElem);
enrichElem.addChild(targetElem);
if (null != parent) {
parent.addChild(enrichElem);
}
return enrichElem;
}
public void build(OMElement elem) {
for (Iterator it = elem.getChildElements(); it.hasNext();) {
OMElement childElem = (OMElement) it.next();
if (childElem.getLocalName().equals(SOURCE)) {
OMAttribute cloneAttr = childElem.getAttribute(new QName(CLONE));
if (cloneAttr != null && cloneAttr.getAttributeValue() != null) {
sourceClone = cloneAttr.getAttributeValue();
}
OMAttribute sourceTypeAttr = childElem.getAttribute(new QName(TYPE));
if (sourceTypeAttr != null && sourceTypeAttr.getAttributeValue() != null) {
sourceType = sourceTypeAttr.getAttributeValue();
} else {
sourceType = DEFAULT_SOURCE_TYPE;
}
OMAttribute sourceXpathAttr = childElem.getAttribute(new QName(XPATH));
if (sourceXpathAttr != null
&& sourceXpathAttr.getAttributeValue() != null
&& !sourceXpathAttr.getAttributeValue().equals("")) {
try {
sourceExpression = SynapseXPathFactory.getSynapseXPath(childElem, new QName(XPATH));
} catch (JaxenException e) {
String msg = "Invalid XPath expression for 'source' attribute 'xpath' : " + sourceXpathAttr.getAttributeValue();
throw new MediatorException(msg);
}
}
OMAttribute sourcePropertyAttr = childElem.getAttribute(new QName(PROPERTY));
if (sourcePropertyAttr != null && sourcePropertyAttr.getAttributeValue() != null) {
sourceProperty = sourcePropertyAttr.getAttributeValue();
}
OMElement inlineXMLElement = childElem.getFirstElement();
if (inlineXMLElement != null) {
sourceInlineXML = inlineXMLElement.toString();
} else if (childElem.getAttributeValue(new QName(null, INLINE_REG_KEY)) != null) {
inlineSourceRegKey = childElem.getAttributeValue(new QName(null, INLINE_REG_KEY));
}
}
if (childElem.getLocalName().equals(TARGET)) {
OMAttribute actionAttr = childElem.getAttribute(new QName(ACTION));
if (actionAttr != null && actionAttr.getAttributeValue() != null) {
targetAction = actionAttr.getAttributeValue();
} else {
targetAction = DEFAULT_TARGET_ACTION_TYPE;
}
OMAttribute targetTypeAttr = childElem.getAttribute(new QName(TYPE));
if (targetTypeAttr != null && targetTypeAttr.getAttributeValue() != null) {
targetType = targetTypeAttr.getAttributeValue();
} else {
targetType = DEFAULT_TARGET_TYPE;
}
OMAttribute targetXpathAttr = childElem.getAttribute(new QName(XPATH));
if (targetXpathAttr != null
&& targetXpathAttr.getAttributeValue() != null
&& !targetXpathAttr.getAttributeValue().equals("")) {
try {
targetExpression = SynapseXPathFactory.getSynapseXPath(childElem, new QName(XPATH));
} catch (JaxenException e) {
String msg = "Invalid XPath expression for 'target' attribute 'xpath' : " + targetXpathAttr.getAttributeValue();
throw new MediatorException(msg);
}
}
OMAttribute targetPropertyAttr = childElem.getAttribute(new QName(PROPERTY));
if (targetPropertyAttr != null && targetPropertyAttr.getAttributeValue() != null) {
targetProperty = targetPropertyAttr.getAttributeValue();
}
}
}
}
}