/*
* 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.apache.synapse.config.xml.inbound;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.util.AXIOMUtil;
import org.apache.synapse.SynapseConstants;
import org.apache.synapse.SynapseException;
import org.apache.synapse.aspects.statistics.StatisticsConfigurable;
import org.apache.synapse.config.xml.XMLConfigConstants;
import org.apache.synapse.inbound.InboundEndpoint;
import org.apache.synapse.inbound.InboundEndpointConstants;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import javax.xml.stream.XMLStreamException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Map;
public class InboundEndpointSerializer {
private static final OMFactory fac = OMAbstractFactory.getOMFactory();
protected static final OMNamespace nullNS =
fac.createOMNamespace(XMLConfigConstants.NULL_NAMESPACE, "");
public static OMElement serializeInboundEndpoint(InboundEndpoint inboundEndpoint) {
OMElement inboundEndpointElt = fac.createOMElement(InboundEndpointConstants.INBOUND_ENDPOINT,
SynapseConstants.SYNAPSE_OMNAMESPACE);
inboundEndpointElt.addAttribute(InboundEndpointConstants.INBOUND_ENDPOINT_NAME,
inboundEndpoint.getName(), null);
if (inboundEndpoint.getInjectingSeq() != null) {
inboundEndpointElt.addAttribute(InboundEndpointConstants.INBOUND_ENDPOINT_SEQUENCE,
inboundEndpoint.getInjectingSeq(), null);
}
if (inboundEndpoint.getOnErrorSeq() != null) {
inboundEndpointElt.addAttribute(InboundEndpointConstants.INBOUND_ENDPOINT_ERROR_SEQUENCE,
inboundEndpoint.getOnErrorSeq(), null);
}
if (inboundEndpoint.getProtocol() != null) {
inboundEndpointElt.addAttribute(InboundEndpointConstants.INBOUND_ENDPOINT_PROTOCOL,
inboundEndpoint.getProtocol(), null);
} else {
inboundEndpointElt.addAttribute(InboundEndpointConstants.INBOUND_ENDPOINT_CLASS,
inboundEndpoint.getClassImpl(), null);
}
StatisticsConfigurable statisticsConfigurable = inboundEndpoint.getAspectConfiguration();
if (statisticsConfigurable != null && statisticsConfigurable.isStatisticsEnable()) {
inboundEndpointElt
.addAttribute(XMLConfigConstants.STATISTICS_ATTRIB_NAME, XMLConfigConstants.STATISTICS_ENABLE,
null);
}
if (statisticsConfigurable != null && statisticsConfigurable.isTracingEnabled()) {
inboundEndpointElt
.addAttribute(XMLConfigConstants.TRACE_ATTRIB_NAME, XMLConfigConstants.TRACE_ENABLE,
null);
}
inboundEndpointElt.addAttribute(InboundEndpointConstants.INBOUND_ENDPOINT_SUSPEND,
Boolean.toString(inboundEndpoint.isSuspend()), null);
OMElement parametersElt = fac.createOMElement(InboundEndpointConstants.INBOUND_ENDPOINT_PARAMETERS,
SynapseConstants.SYNAPSE_OMNAMESPACE);
for (Map.Entry<String, String> paramEntry : inboundEndpoint.getParametersMap().entrySet()) {
String strKey = paramEntry.getKey();
OMElement parameter = fac.createOMElement(InboundEndpointConstants.INBOUND_ENDPOINT_PARAMETER,
SynapseConstants.SYNAPSE_OMNAMESPACE);
parameter.addAttribute(InboundEndpointConstants.INBOUND_ENDPOINT_PARAMETER_NAME,
strKey, null);
if(inboundEndpoint.getParameterKey(strKey) != null){
parameter.addAttribute(InboundEndpointConstants.INBOUND_ENDPOINT_PARAMETER_KEY,
inboundEndpoint.getParameterKey(strKey), null);
}else if (isWellFormedXML(paramEntry.getValue())) {
try {
OMElement omElement = AXIOMUtil.stringToOM(paramEntry.getValue());
parameter.addChild(omElement);
} catch (XMLStreamException e) {
String msg = "Error Parsing OMElement for value of " + paramEntry.getKey();
throw new SynapseException(msg, e);
}
}else {
parameter.setText(paramEntry.getValue());
}
parametersElt.addChild(parameter);
}
inboundEndpointElt.addChild(parametersElt);
return inboundEndpointElt;
}
public static OMElement serializeInboundEndpoint(OMElement parent,
InboundEndpoint inboundEndpoint) {
OMElement inboundEndpointElt = serializeInboundEndpoint(inboundEndpoint);
if (parent != null) {
parent.addChild(inboundEndpointElt);
}
return inboundEndpointElt;
}
private static boolean isWellFormedXML(String value) {
try {
XMLReader parser = XMLReaderFactory.createXMLReader();
parser.setErrorHandler(null);
InputSource source = new InputSource(new ByteArrayInputStream(value.getBytes()));
parser.parse(source);
} catch (SAXException e) {
return false;
} catch (IOException e) {
return false;
}
return true;
}
}