/* * 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.config.xml; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.util.AXIOMUtil; import org.apache.axiom.om.impl.builder.StAXOMBuilder; import org.apache.synapse.config.Entry; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamReader; import java.io.StringReader; import java.util.Properties; public class LocalEntryConfigurationTest extends AbstractTestCase { private String key = "myEntry"; public void testSimpleTextEntry() { String text = "Apache Synapse - 2.0"; String entrySrc = "<localEntry xmlns=\"http://ws.apache.org/ns/synapse\" " + "key=\"" + key + "\">" + text + "</localEntry>"; String serializedSrc = "<localEntry xmlns=\"http://ws.apache.org/ns/synapse\" " + "key=\"" + key + "\"><![CDATA[" + text + "]]></localEntry>"; try { OMElement elem = parseXMLString(entrySrc, true); Entry entry = EntryFactory.createEntry(elem, new Properties()); assertEquals(key, entry.getKey()); assertEquals(Entry.INLINE_TEXT, entry.getType()); assertEquals(text, (String) entry.getValue()); OMElement serialization = EntrySerializer.serializeEntry(entry, null); OMElement expectedSerialization = parseXMLString(serializedSrc, false); assertTrue(compare(expectedSerialization, serialization)); } catch (XMLStreamException e) { fail("Error while parsing entry definition: " + e.getMessage()); } } public void testTextEntryWithMarkup() { textEntryWithMarkup(true); textEntryWithMarkup(false); } private void textEntryWithMarkup(boolean coalesced) { System.out.println("Testing text entry with markup characters; Coalesced " + "parsing: " + coalesced); String text = "mc.setPayloadXML(<xml>data</xml>);"; String entrySrc = "<localEntry xmlns=\"http://ws.apache.org/ns/synapse\" " + "key=\"" + key + "\"><![CDATA[" + text + "]]></localEntry>"; try { OMElement elem = parseXMLString(entrySrc, coalesced); Entry entry = EntryFactory.createEntry(elem, new Properties()); assertEquals(key, entry.getKey()); assertEquals(Entry.INLINE_TEXT, entry.getType()); assertEquals(text, (String) entry.getValue()); OMElement serialization = EntrySerializer.serializeEntry(entry, null); OMElement expectedSerialization = parseXMLString(entrySrc, false); assertTrue(compare(expectedSerialization, serialization)); } catch (XMLStreamException e) { fail("Error while parsing entry definition: " + e.getMessage()); } } public void testTextEntryWithNestedCDATA() { textEntryWithNestedCDATA(true); textEntryWithNestedCDATA(false); } private void textEntryWithNestedCDATA(boolean coalesced) { System.out.println("Testing text entry with nested CDATA elements; Coalesced " + "parsing: " + coalesced); String actualText = "mc.setPayloadXML(<xml><![CDATA[data]]></xml>);"; String escapedText = "mc.setPayloadXML(<xml><![CDATA[data]]]]><![CDATA[></xml>);"; String entrySrc = "<localEntry xmlns=\"http://ws.apache.org/ns/synapse\" " + "key=\"" + key + "\"><![CDATA[" + escapedText + "]]></localEntry>"; try { OMElement elem = parseXMLString(entrySrc, coalesced); Entry entry = EntryFactory.createEntry(elem, new Properties()); assertEquals(key, entry.getKey()); assertEquals(Entry.INLINE_TEXT, entry.getType()); assertEquals(actualText, (String) entry.getValue()); OMElement expectedSerialization = parseXMLString(entrySrc, false); OMElement serialization = EntrySerializer.serializeEntry(entry, null); assertTrue(compare(expectedSerialization, serialization)); } catch (XMLStreamException e) { fail("Error while parsing entry definition: " + e.getMessage()); } } public void testLargeTextEntry() { String text = "Apache Synapse is designed to be a simple, lightweight and high performance " + "Enterprise Service Bus (ESB) from Apache. Based on a small asynchronous core, " + "Apache Synapse has excellent support for XML and Web services - as well as binary " + "and text formats. The Synapse engine is configured with a simple XML format and " + "comes with a set of ready-to-use transports and mediators. We recommend you start " + "by reading the QuickStart and then trying out the samples. Synapse is made " + "available under the Apache Software License 2.0. For more information please visit " + "http://synapse.apache.org."; String entrySrc = "<localEntry xmlns=\"http://ws.apache.org/ns/synapse\" " + "key=\"" + key + "\">" + text + "</localEntry>"; String serializedSrc = "<localEntry xmlns=\"http://ws.apache.org/ns/synapse\" " + "key=\"" + key + "\"><![CDATA[" + text + "]]></localEntry>"; try { OMElement elem = parseXMLString(entrySrc, true); Entry entry = EntryFactory.createEntry(elem, new Properties()); assertEquals(key, entry.getKey()); assertEquals(Entry.INLINE_TEXT, entry.getType()); assertEquals(text, (String) entry.getValue()); OMElement serialization = EntrySerializer.serializeEntry(entry, null); OMElement expectedSerialization = parseXMLString(serializedSrc, false); assertEquals(text, serialization.getText()); serialization = parseXMLString(serialization.toString(), false); assertTrue(compare(expectedSerialization, serialization)); } catch (XMLStreamException e) { fail("Error while parsing entry definition: " + e.getMessage()); } } public void testLargeTextEntryWithMarkup() { larseTextEntryWithMarkup(true); larseTextEntryWithMarkup(false); } private void larseTextEntryWithMarkup(boolean coalesced) { System.out.println("Testing large text entry with markup characters; Coalesced " + "parsing: " + coalesced); String text = "Apache Synapse is designed to be a simple, lightweight and high performance " + "Enterprise Service Bus (ESB) from Apache. Based on a small asynchronous core, " + "Apache Synapse has excellent support for <XML/> and Web services - as well as binary " + "and text formats. The Synapse engine is configured with a simple XML format and " + "comes with a set of ready-to-use transports and mediators. We recommend you start " + "by reading the QuickStart and then trying out the samples. Synapse is made " + "available under the Apache Software License 2.0. For more information please visit " + "http://synapse.apache.org."; String entrySrc = "<localEntry xmlns=\"http://ws.apache.org/ns/synapse\" " + "key=\"" + key + "\"><![CDATA[" + text + "]]></localEntry>"; try { OMElement elem = parseXMLString(entrySrc, coalesced); Entry entry = EntryFactory.createEntry(elem, new Properties()); assertEquals(key, entry.getKey()); assertEquals(Entry.INLINE_TEXT, entry.getType()); assertEquals(text, (String) entry.getValue()); OMElement serialization = EntrySerializer.serializeEntry(entry, null); assertEquals(text, serialization.getText()); OMElement expectedSerialization = parseXMLString(entrySrc, false); serialization = parseXMLString(serialization.toString(), false); assertTrue(compare(expectedSerialization, serialization)); } catch (XMLStreamException e) { fail("Error while parsing entry definition: " + e.getMessage()); } } public void testSimpleXMLEntry() { String xml = "<m:project xmlns:m=\"http://testing.synapse.apache.org\"><m:id>001</m:id>" + "<m:name>Synapse</m:name></m:project>"; String entrySrc = "<localEntry xmlns=\"http://ws.apache.org/ns/synapse\" " + "key=\"" + key + "\">" + xml + "</localEntry>"; try { OMElement elem = parseXMLString(entrySrc, true); OMElement expectedSerialization = elem.cloneOMElement(); Entry entry = EntryFactory.createEntry(elem, new Properties()); assertEquals(key, entry.getKey()); assertEquals(Entry.INLINE_XML, entry.getType()); OMElement valueElem = parseXMLString(xml, true); assertTrue(compare(valueElem, (OMElement) entry.getValue())); OMElement serialization = EntrySerializer.serializeEntry(entry, null); assertTrue(compare(expectedSerialization, serialization)); } catch (XMLStreamException e) { fail("Error while parsing entry definition: " + e.getMessage()); } } public void testXMLEntryWithCDATA() { xmlEntryWithCDATA(true); xmlEntryWithCDATA(false); } private void xmlEntryWithCDATA(boolean coalesced) { System.out.println("Testing simple XML entry with CDATA elements; Coalesced " + "parsing: " + coalesced); String xml = "<m:project xmlns:m=\"http://testing.synapse.apache.org\">" + "<![CDATA[<xml>data</xml>]]></m:project>"; String entrySrc = "<localEntry xmlns=\"http://ws.apache.org/ns/synapse\" " + "key=\"" + key + "\">" + xml + "</localEntry>"; try { OMElement elem = parseXMLString(entrySrc, coalesced); OMElement expectedSerialization = elem.cloneOMElement(); Entry entry = EntryFactory.createEntry(elem, new Properties()); assertEquals(key, entry.getKey()); assertEquals(Entry.INLINE_XML, entry.getType()); OMElement valueElem = parseXMLString(xml, coalesced); assertTrue(compare(valueElem, (OMElement) entry.getValue())); OMElement serialization = EntrySerializer.serializeEntry(entry, null); assertTrue(compare(expectedSerialization, serialization)); } catch (XMLStreamException e) { fail("Error while parsing entry definition: " + e.getMessage()); } } public void testLargeXMLEntry() { String xml = "<wsdl:definitions xmlns:axis2=\"http://ws.apache.org/axis2\" xmlns:mime=\"http://schemas.xmlsoap.org/wsdl/mime/\" xmlns:ns0=\"http://ws.apache.org/axis2/xsd\" xmlns:soap12=\"http://schemas.xmlsoap.org/wsdl/soap12/\" xmlns:http=\"http://schemas.xmlsoap.org/wsdl/http/\" xmlns:ns1=\"http://org.apache.axis2/xsd\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/wsdl/soap/\" xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\" targetNamespace=\"http://ws.apache.org/axis2\">\n" + " <wsdl:documentation>\n" + " New web service to test esb\n" + " </wsdl:documentation>\n" + " <wsdl:types>\n" + " <xs:schema xmlns:ns=\"http://ws.apache.org/axis2/xsd\" attributeFormDefault=\"qualified\" elementFormDefault=\"qualified\" targetNamespace=\"http://ws.apache.org/axis2/xsd\">\n" + " <xs:element name=\"multiply\">\n" + " <xs:complexType>\n" + " <xs:sequence>\n" + " <xs:element name=\"x\" nillable=\"true\" type=\"xs:double\" />\n" + " <xs:element name=\"y\" nillable=\"true\" type=\"xs:double\" />\n" + " </xs:sequence>\n" + " </xs:complexType>\n" + " </xs:element>\n" + " <xs:element name=\"multiplyResponse\">\n" + " <xs:complexType>\n" + " <xs:sequence>\n" + " <xs:element name=\"return\" nillable=\"true\" type=\"xs:double\" />\n" + " </xs:sequence>\n" + " </xs:complexType>\n" + " </xs:element>\n" + " </xs:schema>\n" + " </wsdl:types>\n" + " <wsdl:message name=\"multiplyMessage\">\n" + " <wsdl:part name=\"part1\" element=\"ns0:multiply\" />\n" + " </wsdl:message>\n" + " <wsdl:message name=\"multiplyResponse\">\n" + " <wsdl:part name=\"part1\" element=\"ns0:multiplyResponse\" />\n" + " </wsdl:message>\n" + " <wsdl:portType name=\"esbservicePortType\">\n" + " <wsdl:operation name=\"multiply\">\n" + " <wsdl:input xmlns:wsaw=\"http://www.w3.org/2006/05/addressing/wsdl\" message=\"axis2:multiplyMessage\" wsaw:Action=\"urn:multiply\" />\n" + " <wsdl:output message=\"axis2:multiplyResponse\" />\n" + " </wsdl:operation>\n" + " </wsdl:portType>\n" + " <wsdl:binding name=\"esbserviceSOAP11Binding\" type=\"axis2:esbservicePortType\">\n" + " <soap:binding transport=\"http://schemas.xmlsoap.org/soap/http\" style=\"document\" />\n" + " <wsdl:operation name=\"multiply\">\n" + " <soap:operation soapAction=\"urn:multiply\" style=\"document\" />\n" + " <wsdl:input>\n" + " <soap:body use=\"literal\" />\n" + " </wsdl:input>\n" + " <wsdl:output>\n" + " <soap:body use=\"literal\" />\n" + " </wsdl:output>\n" + " </wsdl:operation>\n" + " </wsdl:binding>\n" + " <wsdl:binding name=\"esbserviceSOAP12Binding\" type=\"axis2:esbservicePortType\">\n" + " <soap12:binding transport=\"http://schemas.xmlsoap.org/soap/http\" style=\"document\" />\n" + " <wsdl:operation name=\"multiply\">\n" + " <soap12:operation soapAction=\"urn:multiply\" style=\"document\" />\n" + " <wsdl:input>\n" + " <soap12:body use=\"literal\" />\n" + " </wsdl:input>\n" + " <wsdl:output>\n" + " <soap12:body use=\"literal\" />\n" + " </wsdl:output>\n" + " </wsdl:operation>\n" + " </wsdl:binding>\n" + " <wsdl:binding name=\"esbserviceHttpBinding\" type=\"axis2:esbservicePortType\">\n" + " <http:binding verb=\"POST\" />\n" + " <wsdl:operation name=\"multiply\">\n" + " <http:operation location=\"multiply\" />\n" + " <wsdl:input>\n" + " <mime:content type=\"text/xml\" />\n" + " </wsdl:input>\n" + " <wsdl:output>\n" + " <mime:content type=\"text/xml\" />\n" + " </wsdl:output>\n" + " </wsdl:operation>\n" + " </wsdl:binding>\n" + " <wsdl:service name=\"esbservice\">\n" + " <wsdl:port name=\"esbserviceSOAP11port_http\" binding=\"axis2:esbserviceSOAP11Binding\">\n" + " <soap:address location=\"http://localhost:9001/services/Service1\" />\n" + " </wsdl:port>\n" + " <wsdl:port name=\"esbserviceSOAP12port_http\" binding=\"axis2:esbserviceSOAP12Binding\">\n" + " <soap12:address location=\"http://localhost:9001/services/Service1\" />\n" + " </wsdl:port>\n" + " <wsdl:port name=\"esbserviceHttpport1\" binding=\"axis2:esbserviceHttpBinding\">\n" + " <http:address location=\"http://localhost:9001/services/Service1\" />\n" + " </wsdl:port>\n" + " </wsdl:service>\n" + "</wsdl:definitions>"; String entrySrc = "<localEntry xmlns=\"http://ws.apache.org/ns/synapse\" " + "key=\"" + key + "\">" + xml + "</localEntry>"; try { OMElement elem = parseXMLString(entrySrc, true); OMElement expectedSerialization = elem.cloneOMElement(); Entry entry = EntryFactory.createEntry(elem, new Properties()); assertEquals(key, entry.getKey()); assertEquals(Entry.INLINE_XML, entry.getType()); OMElement valueElem = parseXMLString(xml, true); assertTrue(compare(valueElem, (OMElement) entry.getValue())); OMElement serialization = EntrySerializer.serializeEntry(entry, null); assertTrue(compare(expectedSerialization, serialization)); } catch (XMLStreamException e) { fail("Error while parsing entry definition: " + e.getMessage()); } } private OMElement parseXMLString(String src, boolean coalesced) throws XMLStreamException { if (coalesced) { return AXIOMUtil.stringToOM(src); } else { StringReader strReader = new StringReader(src); XMLInputFactory xmlInFac = XMLInputFactory.newInstance(); //Non-Coalescing parsing xmlInFac.setProperty("javax.xml.stream.isCoalescing", false); XMLStreamReader parser = xmlInFac.createXMLStreamReader(strReader); StAXOMBuilder builder = new StAXOMBuilder(parser); return builder.getDocumentElement(); } } }