/*
* 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.mediators.xquery;
import net.sf.saxon.s9api.ItemType;
import net.sf.saxon.s9api.XdmNodeKind;
import org.apache.axiom.om.OMElement;
import org.apache.synapse.Mediator;
import org.apache.synapse.config.xml.AbstractMediatorSerializer;
import org.apache.synapse.config.xml.SynapseXPathSerializer;
import org.apache.synapse.config.xml.ValueSerializer;
import org.apache.synapse.config.xml.XMLConfigConstants;
import org.apache.synapse.mediators.MediatorProperty;
import org.apache.synapse.mediators.Value;
import org.apache.synapse.util.xpath.SourceXPathSupport;
import org.apache.synapse.util.xpath.SynapseXPath;
import javax.xml.namespace.QName;
import java.util.List;
/**
* Serialize the given XQuery mediator into a XML
* <p/>
* <pre>
* <xquery key="string" [target="xpath"]>
* <variable name="string" type="string" [key="string"] [expression="xpath"]
* [value="string"]/>?
* </xquery>
* </pre>
*/
public class XQueryMediatorSerializer extends AbstractMediatorSerializer {
public OMElement serializeSpecificMediator(Mediator m) {
if (!(m instanceof XQueryMediator)) {
handleException("Invalid Mediator has passed to serializer");
}
XQueryMediator queryMediator = (XQueryMediator) m;
OMElement xquery = fac.createOMElement("xquery", synNS);
Value key = queryMediator.getQueryKey();
if (key != null) {
// Serialize Key using KeySerializer
ValueSerializer keySerializer = new ValueSerializer();
keySerializer.serializeValue(key, XMLConfigConstants.KEY, xquery);
}
saveTracingState(xquery, queryMediator);
SynapseXPath targetXPath = queryMediator.getTarget();
if (targetXPath != null &&
!SourceXPathSupport.DEFAULT_XPATH.equals(targetXPath.toString())) {
SynapseXPathSerializer.serializeXPath(targetXPath, xquery, "target");
}
List<MediatorProperty> pros = queryMediator.getProcessorProperties();
if (pros != null && !pros.isEmpty()) {
OMElement dataSource = fac.createOMElement("dataSource", synNS);
serializeProperties(dataSource, pros);
xquery.addChild(dataSource);
}
List list = queryMediator.getVariables();
if (list != null && !list.isEmpty()) {
for (Object o : list) {
if (o instanceof MediatorBaseVariable) {
MediatorBaseVariable variable = (MediatorBaseVariable) o;
QName name = variable.getName();
Object value = variable.getValue();
if (name != null && value != null) {
OMElement baseElement = fac.createOMElement("variable", synNS);
baseElement.addAttribute(fac.createOMAttribute(
"name", nullNS, name.getLocalPart()));
baseElement.addAttribute(fac.createOMAttribute(
"value", nullNS, (String) value));
String type = null;
ItemType variableType = variable.getType();
XdmNodeKind nodeKind = variable.getNodeKind();
if (ItemType.INT == variableType) {
type = "INT";
} else if (ItemType.INTEGER == variableType) {
type = "INTEGER";
} else if (ItemType.BOOLEAN == variableType) {
type = "BOOLEAN";
} else if (ItemType.BYTE == variableType) {
type = "BYTE";
} else if (ItemType.DOUBLE == variableType) {
type = "DOUBLE";
} else if (ItemType.SHORT == variableType) {
type = "SHORT";
} else if (ItemType.LONG == variableType) {
type = "LONG";
} else if (ItemType.FLOAT == variableType) {
type = "FLOAT";
} else if (ItemType.STRING == variableType) {
type = "STRING";
} else if (XdmNodeKind.DOCUMENT == nodeKind) {
type = "DOCUMENT";
} else if (XdmNodeKind.ELEMENT == nodeKind) {
type = "ELEMENT";
} else {
handleException("Unknown Type " + variableType);
}
if (type != null) {
baseElement.addAttribute(fac.createOMAttribute(
"type", nullNS, type));
}
xquery.addChild(baseElement);
}
} else if (o instanceof MediatorCustomVariable) {
MediatorCustomVariable variable = (MediatorCustomVariable) o;
QName name = variable.getName();
if (name != null) {
OMElement customElement = fac.createOMElement("variable", synNS);
customElement.addAttribute(fac.createOMAttribute(
"name", nullNS, name.getLocalPart()));
String regkey = variable.getRegKey();
if (regkey != null) {
customElement.addAttribute(fac.createOMAttribute(
"key", nullNS, regkey));
}
SynapseXPath expression = variable.getExpression();
if (expression != null &&
!SourceXPathSupport.DEFAULT_XPATH.equals(expression.toString())) {
SynapseXPathSerializer.serializeXPath(expression,
customElement, "expression");
}
String type = null;
ItemType variableType = variable.getType();
XdmNodeKind nodeKind = variable.getNodeKind();
if (XdmNodeKind.DOCUMENT == nodeKind) {
type = "DOCUMENT";
} else if (XdmNodeKind.ELEMENT == nodeKind) {
type = "ELEMENT";
} else if (ItemType.INT == variableType) {
type = "INT";
} else if (ItemType.INTEGER == variableType) {
type = "INTEGER";
} else if (ItemType.BOOLEAN == variableType) {
type = "BOOLEAN";
} else if (ItemType.BYTE == variableType) {
type = "BYTE";
} else if (ItemType.DOUBLE == variableType) {
type = "DOUBLE";
} else if (ItemType.SHORT == variableType) {
type = "SHORT";
} else if (ItemType.LONG == variableType) {
type = "LONG";
} else if (ItemType.FLOAT == variableType) {
type = "FLOAT";
} else if (ItemType.STRING == variableType) {
type = "STRING";
} else {
handleException("Unknown Type " + variableType);
}
if (type != null) {
customElement.addAttribute(fac.createOMAttribute(
"type", nullNS, type));
}
xquery.addChild(customElement);
}
}
}
}
return xquery;
}
public String getMediatorClassName() {
return XQueryMediator.class.getName();
}
}