From ed32ca3167b1e95093cf47e72756ce48f8c8393f Mon Sep 17 00:00:00 2001 From: cjmamo <823038+cjmamo@users.noreply.github.com> Date: Mon, 20 Jan 2025 17:52:06 +0100 Subject: [PATCH] fix: solve issue where ConsumeSerializerVisitor doesn't write the closing tags of empty elements when closeEmptyElements is false refactor: relocate visitor classes under the `visitor` package --- .../engine/delivery/AbstractParser.java | 20 ++--- .../delivery/dom/DOMFilterProvider.java | 2 +- .../engine/delivery/dom/SmooksDOMFilter.java | 6 +- .../config/DefaultResourceConfig.java | 2 +- .../visitor}/ConsumeSerializerVisitor.java | 23 +++-- .../visitor}/SimpleSerializerVisitor.java | 2 +- .../SystemConsumeSerializerVisitor.java | 2 +- .../dom}/ContextObjectSerializerVisitor.java | 2 +- .../visitor/dom}/DOMSerializerVisitor.java | 2 +- .../dom}/DefaultDOMSerializerVisitor.java | 2 +- .../dom}/GhostElementSerializerVisitor.java | 2 +- .../visitor/dom}/Serializer.java | 2 +- .../visitor/dom}/TextSerializerVisitor.java | 2 +- .../visitor/smooks/NestedSmooksVisitor.java | 2 +- .../xsd/smooks/smooks-core-1.6.xsd-smooks.xml | 2 +- .../src/main/resources/system-serializers.xml | 8 +- .../JIRAs/MILYN_367/MILYN_367_TestCase.java | 7 +- ...ExpandableContentDeliveryUnitTestCase.java | 4 +- .../engine/delivery/FilterCloseTestCase.java | 10 +-- .../TestExpandableContentHandler.java | 2 +- .../dom/serialize/AddAttributeSerializer.java | 1 + .../EmptyElTestSerializerVisitor.java | 1 + .../RemoveTestSerializaterVisitor.java | 1 + .../dom/serialize/SerializerTestCase.java | 1 + .../delivery/java/JavaSourceTestCase.java | 2 +- .../delivery/sax/ng/SaxNgFilterTestCase.java | 81 ++++++++--------- .../ConsumeSerializerVisitorTestCase.java | 87 +++++++++++++++++++ .../smooks/NestedSmooksVisitorTestCase.java | 2 +- .../DefaultWritingOff_One_Serializer_Test.xml | 2 +- ...6.xml => smooks-config-max-node-depth.xml} | 0 .../delivery/smooks-config-invalid-error.txt | 2 +- 31 files changed, 185 insertions(+), 99 deletions(-) rename core/src/main/java/org/smooks/engine/{delivery/sax/ng => resource/visitor}/ConsumeSerializerVisitor.java (92%) rename core/src/main/java/org/smooks/engine/{delivery/sax/ng => resource/visitor}/SimpleSerializerVisitor.java (99%) rename core/src/main/java/org/smooks/engine/{delivery/sax/ng => resource/visitor}/SystemConsumeSerializerVisitor.java (98%) rename core/src/main/java/org/smooks/engine/{delivery/dom/serialize => resource/visitor/dom}/ContextObjectSerializerVisitor.java (99%) rename core/src/main/java/org/smooks/engine/{delivery/dom/serialize => resource/visitor/dom}/DOMSerializerVisitor.java (97%) rename core/src/main/java/org/smooks/engine/{delivery/dom/serialize => resource/visitor/dom}/DefaultDOMSerializerVisitor.java (98%) rename core/src/main/java/org/smooks/engine/{delivery/dom/serialize => resource/visitor/dom}/GhostElementSerializerVisitor.java (98%) rename core/src/main/java/org/smooks/engine/{delivery/dom/serialize => resource/visitor/dom}/Serializer.java (99%) rename core/src/main/java/org/smooks/engine/{delivery/dom/serialize => resource/visitor/dom}/TextSerializerVisitor.java (98%) create mode 100644 core/src/test/java/org/smooks/engine/resource/visitor/ConsumeSerializerVisitorTestCase.java rename core/src/test/resources/org/smooks/engine/delivery/sax/ng/{smooks-config-06.xml => smooks-config-max-node-depth.xml} (100%) diff --git a/core/src/main/java/org/smooks/engine/delivery/AbstractParser.java b/core/src/main/java/org/smooks/engine/delivery/AbstractParser.java index b9c0ec462..692429b57 100644 --- a/core/src/main/java/org/smooks/engine/delivery/AbstractParser.java +++ b/core/src/main/java/org/smooks/engine/delivery/AbstractParser.java @@ -141,7 +141,7 @@ public static void attachXMLReader(XMLReader xmlReader, ExecutionContext execCon NamespaceDeclarationStack namespaceDeclarationStack = execContext.get(NamespaceManager.NAMESPACE_DECLARATION_STACK_TYPED_KEY); if (namespaceDeclarationStack == null) { - throw new IllegalStateException("No NamespaceDeclarationStack attached to the ExecutionContext."); + throw new IllegalStateException("No NamespaceDeclarationStack attached to the ExecutionContext"); } namespaceDeclarationStack.pushReader(xmlReader); } @@ -189,7 +189,7 @@ public static void setReaders(Stack readers, ExecutionContext executi */ public static ResourceConfig getSAXParserConfiguration(ContentDeliveryConfig deliveryConfig) { if (deliveryConfig == null) { - throw new IllegalArgumentException("null 'deliveryConfig' arg in method call."); + throw new IllegalArgumentException("null 'deliveryConfig' arg in method call"); } ResourceConfig saxDriverConfig = null; @@ -210,7 +210,7 @@ protected InputStream urlToStream(URL url) { try { return url.openStream(); } catch (IOException e) { - throw new SmooksException("Invalid URL on StreamSource: '" + url + "'. Unable to open stream to resource.", e); + throw new SmooksException("Invalid URL on StreamSource: '" + url + "'. Unable to open stream to resource", e); } } @@ -222,7 +222,7 @@ protected Reader streamToReader(InputStream inputStream, String contentEncoding) return new InputStreamReader(inputStream, StandardCharsets.UTF_8); } } catch (UnsupportedEncodingException e) { - throw new SmooksException("Unable to decode input stream.", e); + throw new SmooksException("Unable to decode input stream", e); } } @@ -232,7 +232,7 @@ protected InputSource createInputSource(Source source, String contentEncoding) { StreamSource streamSource = (StreamSource) source; InputStream inputStream = streamSource.getInputStream(); if (inputStream == null) { - throw new SmooksException("Invalid StreamSource. Unable to extract an InputStream."); + throw new SmooksException("Invalid StreamSource. Unable to extract an InputStream"); } Reader reader = streamToReader(inputStream, contentEncoding); @@ -268,7 +268,7 @@ protected XMLReader createXMLReader() throws SAXException { JavaSource javaSource = (JavaSource) source; if (isFeatureOn(JavaSource.FEATURE_GENERATE_EVENT_STREAM, saxDriverConfig) && !javaSource.isEventStreamRequired()) { - throw new SmooksConfigException(String.format("Invalid Smooks configuration. Feature [%s] is explicitly configured 'on' in the Smooks configuration, while the supplied JavaSource has explicitly configured event streaming to be off (through a call to JavaSource.setEventStreamRequired).", JavaSource.FEATURE_GENERATE_EVENT_STREAM)); + throw new SmooksConfigException(String.format("Invalid Smooks configuration. Feature [%s] is explicitly configured 'on' in the Smooks configuration, while the supplied JavaSource has explicitly configured event streaming to be off (through a call to JavaSource.setEventStreamRequired)", JavaSource.FEATURE_GENERATE_EVENT_STREAM)); } // Event streaming must be explicitly turned off. If is on as long as it is (a) not configured "off" in @@ -308,7 +308,7 @@ protected void attachNamespaceDeclarationStack(XMLReader reader, ExecutionContex NamespaceDeclarationStack nsDeclarationStack = execContext.get(NamespaceManager.NAMESPACE_DECLARATION_STACK_TYPED_KEY); if (nsDeclarationStack == null) { - throw new IllegalStateException("NamespaceDeclarationStack not configured on ExecutionContext."); + throw new IllegalStateException("NamespaceDeclarationStack not configured on ExecutionContext"); } ((NamespaceDeclarationStackAware) reader).setNamespaceDeclarationStack(nsDeclarationStack); @@ -322,7 +322,7 @@ protected void configureReader(XMLReader xmlReader, DefaultHandler2 contentHandl if (xmlReader instanceof JavaXMLReader) { if (!(source instanceof JavaSource)) { - throw new SmooksException("A " + JavaSource.class.getName() + " source must be supplied for " + JavaXMLReader.class.getName() + " implementations."); + throw new SmooksException("A " + JavaSource.class.getName() + " source must be supplied for " + JavaXMLReader.class.getName() + " implementations"); } ((JavaXMLReader) xmlReader).setSourceObjects(((JavaSource) source).getSourceObjects()); } @@ -332,7 +332,7 @@ protected void configureReader(XMLReader xmlReader, DefaultHandler2 contentHandl try { xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler", contentHandler); } catch (SAXNotRecognizedException e) { - LOGGER.warn("XMLReader property 'http://xml.org/sax/properties/lexical-handler' not recognized by XMLReader '" + xmlReader.getClass().getName() + "'."); + LOGGER.warn("XMLReader property 'http://xml.org/sax/properties/lexical-handler' not recognized by XMLReader [{}]", xmlReader.getClass().getName()); } } @@ -363,7 +363,7 @@ private Object createHandler(String handlerName) { try { return ClassUtils.forName(handlerName, getClass()).newInstance(); } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) { - throw new SmooksException("Failed to create SAX Handler '" + handlerName + "'.", e); + throw new SmooksException("Failed to create SAX Handler '" + handlerName + "'", e); } } diff --git a/core/src/main/java/org/smooks/engine/delivery/dom/DOMFilterProvider.java b/core/src/main/java/org/smooks/engine/delivery/dom/DOMFilterProvider.java index 5d99598a2..f4bc5536f 100644 --- a/core/src/main/java/org/smooks/engine/delivery/dom/DOMFilterProvider.java +++ b/core/src/main/java/org/smooks/engine/delivery/dom/DOMFilterProvider.java @@ -57,7 +57,7 @@ import org.smooks.api.resource.visitor.dom.Phase; import org.smooks.api.resource.visitor.dom.VisitPhase; import org.smooks.engine.delivery.AbstractFilterProvider; -import org.smooks.engine.delivery.dom.serialize.DOMSerializerVisitor; +import org.smooks.engine.resource.visitor.dom.DOMSerializerVisitor; import org.smooks.engine.delivery.event.DefaultContentDeliveryConfigExecutionEvent; import org.smooks.engine.lookup.GlobalParamsLookup; import org.smooks.engine.lookup.NamespaceManagerLookup; diff --git a/core/src/main/java/org/smooks/engine/delivery/dom/SmooksDOMFilter.java b/core/src/main/java/org/smooks/engine/delivery/dom/SmooksDOMFilter.java index be0c76038..2731f664f 100644 --- a/core/src/main/java/org/smooks/engine/delivery/dom/SmooksDOMFilter.java +++ b/core/src/main/java/org/smooks/engine/delivery/dom/SmooksDOMFilter.java @@ -69,8 +69,8 @@ import org.smooks.api.resource.visitor.dom.VisitPhase; import org.smooks.engine.delivery.AbstractFilter; import org.smooks.engine.delivery.ContentHandlerBindingIndex; -import org.smooks.engine.delivery.dom.serialize.Serializer; -import org.smooks.engine.delivery.dom.serialize.TextSerializerVisitor; +import org.smooks.engine.resource.visitor.dom.Serializer; +import org.smooks.engine.resource.visitor.dom.TextSerializerVisitor; import org.smooks.engine.delivery.event.*; import org.smooks.engine.delivery.fragment.NodeFragment; import org.smooks.engine.lifecycle.AssemblyStartedDOMFilterLifecyclePhase; @@ -163,7 +163,7 @@ * *
  • * Serialisation: This phase is executed by the {@link #serialize(Node, Writer)} method (which uses the - * {@link org.smooks.engine.delivery.dom.serialize.Serializer} class). The serialisation phase takes the processed DOM and + * {@link Serializer} class). The serialisation phase takes the processed DOM and * iterates over it to apply all {@link SerializerVisitor SerializationUnits}, * which write the document to the target output stream. *

    diff --git a/core/src/main/java/org/smooks/engine/resource/config/DefaultResourceConfig.java b/core/src/main/java/org/smooks/engine/resource/config/DefaultResourceConfig.java index 5135db2bc..765d6fd98 100644 --- a/core/src/main/java/org/smooks/engine/resource/config/DefaultResourceConfig.java +++ b/core/src/main/java/org/smooks/engine/resource/config/DefaultResourceConfig.java @@ -50,7 +50,7 @@ import org.smooks.api.resource.config.ResourceConfig; import org.smooks.api.resource.config.ResourceConfigChangeListener; import org.smooks.api.resource.config.xpath.SelectorPath; -import org.smooks.engine.delivery.dom.serialize.DefaultDOMSerializerVisitor; +import org.smooks.engine.resource.visitor.dom.DefaultDOMSerializerVisitor; import org.smooks.engine.resource.config.xpath.SelectorPathFactory; import org.smooks.resource.URIResourceLocator; import org.smooks.support.ClassUtils; diff --git a/core/src/main/java/org/smooks/engine/delivery/sax/ng/ConsumeSerializerVisitor.java b/core/src/main/java/org/smooks/engine/resource/visitor/ConsumeSerializerVisitor.java similarity index 92% rename from core/src/main/java/org/smooks/engine/delivery/sax/ng/ConsumeSerializerVisitor.java rename to core/src/main/java/org/smooks/engine/resource/visitor/ConsumeSerializerVisitor.java index de0f31faf..23c18f039 100644 --- a/core/src/main/java/org/smooks/engine/delivery/sax/ng/ConsumeSerializerVisitor.java +++ b/core/src/main/java/org/smooks/engine/resource/visitor/ConsumeSerializerVisitor.java @@ -40,7 +40,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * =========================LICENSE_END================================== */ -package org.smooks.engine.delivery.sax.ng; +package org.smooks.engine.resource.visitor; import org.smooks.api.ExecutionContext; import org.smooks.api.SmooksException; @@ -50,6 +50,7 @@ import org.smooks.api.resource.visitor.Visitor; import org.smooks.api.resource.visitor.dom.DOMElementVisitor; import org.smooks.engine.delivery.fragment.NodeFragment; +import org.smooks.engine.delivery.sax.ng.SaxNgContentDeliveryConfig; import org.smooks.engine.memento.AbstractVisitorMemento; import org.smooks.engine.memento.SimpleVisitorMemento; import org.smooks.engine.memento.VisitorMemento; @@ -103,20 +104,16 @@ public void setCloseEmptyElements(@Named(Filter.CLOSE_EMPTY_ELEMENTS) Optional nodeFragment = new NodeFragment(element); executionContext.getMementoCaretaker().stash(new ElementMemento(nodeFragment, this, false), elementMemento -> { - if (!elementMemento.isOpen()) { - try { - writeStartElement(element, new FragmentWriter(executionContext, nodeFragment), executionContext); - } catch (IOException e) { - throw new SmooksException(e.getMessage(), e); - } - - return new ElementMemento(nodeFragment, ConsumeSerializerVisitor.this, true); - } else { - return elementMemento; + try { + writeStartElement(element, writer, executionContext); + } catch (IOException e) { + throw new SmooksException(e.getMessage(), e); } + + return new ElementMemento(nodeFragment, ConsumeSerializerVisitor.this, true); }); } @@ -131,7 +128,7 @@ protected void closeElement(final Element element, final Writer writer, final Ex writer.write("/>"); } else { if (!elementMemento.isOpen()) { - writeStartElement(element, executionContext); + writeStartElement(element, executionContext, writer); } writer.write(" org.smooks.engine.resource.config.loader.xml.extension.NewResourceConfig - org.smooks.engine.delivery.sax.ng.SimpleSerializerVisitor + org.smooks.engine.resource.visitor.SimpleSerializerVisitor org.smooks.engine.resource.config.loader.xml.extension.SetOnResourceConfig diff --git a/core/src/main/resources/system-serializers.xml b/core/src/main/resources/system-serializers.xml index da2940a47..d99d7a445 100644 --- a/core/src/main/resources/system-serializers.xml +++ b/core/src/main/resources/system-serializers.xml @@ -47,20 +47,20 @@ default-target-profile="*"> - org.smooks.engine.delivery.dom.serialize.ContextObjectSerializerVisitor + org.smooks.engine.resource.visitor.dom.ContextObjectSerializerVisitor - org.smooks.engine.delivery.dom.serialize.GhostElementSerializerVisitor + org.smooks.engine.resource.visitor.dom.GhostElementSerializerVisitor - org.smooks.engine.delivery.dom.serialize.TextSerializerVisitor + org.smooks.engine.resource.visitor.dom.TextSerializerVisitor false - org.smooks.engine.delivery.sax.ng.SystemConsumeSerializerVisitor + org.smooks.engine.resource.visitor.SystemConsumeSerializerVisitor diff --git a/core/src/test/java/org/smooks/JIRAs/MILYN_367/MILYN_367_TestCase.java b/core/src/test/java/org/smooks/JIRAs/MILYN_367/MILYN_367_TestCase.java index 1d8ae410a..03f7865ed 100644 --- a/core/src/test/java/org/smooks/JIRAs/MILYN_367/MILYN_367_TestCase.java +++ b/core/src/test/java/org/smooks/JIRAs/MILYN_367/MILYN_367_TestCase.java @@ -43,19 +43,16 @@ package org.smooks.JIRAs.MILYN_367; import org.junit.jupiter.api.Test; -import org.smooks.FilterSettings; import org.smooks.Smooks; -import org.smooks.StreamFilterType; import org.smooks.api.ExecutionContext; import org.smooks.api.SmooksException; import org.smooks.api.resource.visitor.dom.DOMVisitAfter; import org.smooks.api.resource.visitor.dom.DOMVisitBefore; -import org.smooks.engine.DefaultApplicationContext; import org.smooks.engine.DefaultApplicationContextBuilder; import org.smooks.engine.DefaultFilterSettings; import org.smooks.engine.delivery.dom.DOMFilterType; -import org.smooks.engine.delivery.dom.serialize.DefaultDOMSerializerVisitor; -import org.smooks.engine.delivery.sax.ng.ConsumeSerializerVisitor; +import org.smooks.engine.resource.visitor.dom.DefaultDOMSerializerVisitor; +import org.smooks.engine.resource.visitor.ConsumeSerializerVisitor; import org.smooks.io.sink.StringSink; import org.smooks.io.source.StreamSource; import org.smooks.support.StreamUtils; diff --git a/core/src/test/java/org/smooks/engine/delivery/ExpandableContentDeliveryUnitTestCase.java b/core/src/test/java/org/smooks/engine/delivery/ExpandableContentDeliveryUnitTestCase.java index 09534748a..4b2f6ee73 100644 --- a/core/src/test/java/org/smooks/engine/delivery/ExpandableContentDeliveryUnitTestCase.java +++ b/core/src/test/java/org/smooks/engine/delivery/ExpandableContentDeliveryUnitTestCase.java @@ -49,8 +49,8 @@ import org.smooks.api.resource.visitor.dom.DOMVisitAfter; import org.smooks.api.resource.visitor.dom.DOMVisitBefore; import org.smooks.engine.delivery.dom.DOMContentDeliveryConfig; -import org.smooks.engine.delivery.dom.serialize.ContextObjectSerializerVisitor; -import org.smooks.engine.delivery.dom.serialize.DefaultDOMSerializerVisitor; +import org.smooks.engine.resource.visitor.dom.ContextObjectSerializerVisitor; +import org.smooks.engine.resource.visitor.dom.DefaultDOMSerializerVisitor; import org.xml.sax.SAXException; import java.io.IOException; diff --git a/core/src/test/java/org/smooks/engine/delivery/FilterCloseTestCase.java b/core/src/test/java/org/smooks/engine/delivery/FilterCloseTestCase.java index f7ec13477..bdc00f292 100644 --- a/core/src/test/java/org/smooks/engine/delivery/FilterCloseTestCase.java +++ b/core/src/test/java/org/smooks/engine/delivery/FilterCloseTestCase.java @@ -74,23 +74,23 @@ public void test_close_io() throws IOException, SAXException { public void test_close_io(String profile, int expectedCloseCallCount) throws IOException, SAXException { Smooks smooks = new Smooks(getClass().getResourceAsStream("smooks-config-close-filter-io.xml")); - ExecutionContext execContext; + ExecutionContext executionContext; // Test io stream close.... // We need to +1 this because Xerces always closes input streams/readers and there's no // way of turning that off TestInputStream inStream = new TestInputStream("".getBytes(), expectedCloseCallCount + 1); TestOutputStream outStream = new TestOutputStream(expectedCloseCallCount); - execContext = smooks.createExecutionContext(profile); - smooks.filterSource(execContext, new StreamSource(inStream), new StreamSink(outStream)); + executionContext = smooks.createExecutionContext(profile); + smooks.filterSource(executionContext, new StreamSource<>(inStream), new StreamSink<>(outStream)); // Test io reader/writer close... // We need to +1 this because Xerces always closes input streams/readers and there's no // way of turning that off TestReader reader = new TestReader("", expectedCloseCallCount + 1); TestWriter writer = new TestWriter(expectedCloseCallCount); - execContext = smooks.createExecutionContext(profile); - smooks.filterSource(execContext, new ReaderSource(reader), new WriterSink(writer)); + executionContext = smooks.createExecutionContext(profile); + smooks.filterSource(executionContext, new ReaderSource<>(reader), new WriterSink<>(writer)); } private static class TestInputStream extends ByteArrayInputStream { diff --git a/core/src/test/java/org/smooks/engine/delivery/TestExpandableContentHandler.java b/core/src/test/java/org/smooks/engine/delivery/TestExpandableContentHandler.java index b4b4204a1..23a743c65 100644 --- a/core/src/test/java/org/smooks/engine/delivery/TestExpandableContentHandler.java +++ b/core/src/test/java/org/smooks/engine/delivery/TestExpandableContentHandler.java @@ -48,7 +48,7 @@ import org.smooks.engine.resource.config.DefaultResourceConfig; import org.smooks.api.ExecutionContext; import org.smooks.api.resource.visitor.dom.DOMElementVisitor; -import org.smooks.engine.delivery.dom.serialize.DefaultDOMSerializerVisitor; +import org.smooks.engine.resource.visitor.dom.DefaultDOMSerializerVisitor; import org.w3c.dom.Element; import java.util.ArrayList; diff --git a/core/src/test/java/org/smooks/engine/delivery/dom/serialize/AddAttributeSerializer.java b/core/src/test/java/org/smooks/engine/delivery/dom/serialize/AddAttributeSerializer.java index 1b1654901..c1f2ebe73 100644 --- a/core/src/test/java/org/smooks/engine/delivery/dom/serialize/AddAttributeSerializer.java +++ b/core/src/test/java/org/smooks/engine/delivery/dom/serialize/AddAttributeSerializer.java @@ -42,6 +42,7 @@ */ package org.smooks.engine.delivery.dom.serialize; +import org.smooks.engine.resource.visitor.dom.DefaultDOMSerializerVisitor; import org.smooks.io.DomSerializer; import org.w3c.dom.NamedNodeMap; diff --git a/core/src/test/java/org/smooks/engine/delivery/dom/serialize/EmptyElTestSerializerVisitor.java b/core/src/test/java/org/smooks/engine/delivery/dom/serialize/EmptyElTestSerializerVisitor.java index d1ce64f77..4ebbcb2d2 100644 --- a/core/src/test/java/org/smooks/engine/delivery/dom/serialize/EmptyElTestSerializerVisitor.java +++ b/core/src/test/java/org/smooks/engine/delivery/dom/serialize/EmptyElTestSerializerVisitor.java @@ -43,6 +43,7 @@ package org.smooks.engine.delivery.dom.serialize; import org.smooks.api.ExecutionContext; +import org.smooks.engine.resource.visitor.dom.DefaultDOMSerializerVisitor; import org.w3c.dom.*; import javax.inject.Inject; diff --git a/core/src/test/java/org/smooks/engine/delivery/dom/serialize/RemoveTestSerializaterVisitor.java b/core/src/test/java/org/smooks/engine/delivery/dom/serialize/RemoveTestSerializaterVisitor.java index 13a42963d..62966c4cd 100644 --- a/core/src/test/java/org/smooks/engine/delivery/dom/serialize/RemoveTestSerializaterVisitor.java +++ b/core/src/test/java/org/smooks/engine/delivery/dom/serialize/RemoveTestSerializaterVisitor.java @@ -43,6 +43,7 @@ package org.smooks.engine.delivery.dom.serialize; import org.smooks.api.ExecutionContext; +import org.smooks.engine.resource.visitor.dom.DefaultDOMSerializerVisitor; import org.w3c.dom.Element; import java.io.IOException; diff --git a/core/src/test/java/org/smooks/engine/delivery/dom/serialize/SerializerTestCase.java b/core/src/test/java/org/smooks/engine/delivery/dom/serialize/SerializerTestCase.java index f8cc188ea..2fc09e8f1 100644 --- a/core/src/test/java/org/smooks/engine/delivery/dom/serialize/SerializerTestCase.java +++ b/core/src/test/java/org/smooks/engine/delivery/dom/serialize/SerializerTestCase.java @@ -51,6 +51,7 @@ import org.smooks.engine.lifecycle.PostConstructLifecyclePhase; import org.smooks.engine.lookup.LifecycleManagerLookup; import org.smooks.engine.resource.config.DefaultResourceConfig; +import org.smooks.engine.resource.visitor.dom.Serializer; import org.smooks.support.XmlUtils; import org.smooks.testkit.MockExecutionContext; import org.smooks.testkit.delivery.dom.MockContentDeliveryConfig; diff --git a/core/src/test/java/org/smooks/engine/delivery/java/JavaSourceTestCase.java b/core/src/test/java/org/smooks/engine/delivery/java/JavaSourceTestCase.java index 6433627f4..a7e6cb2a8 100644 --- a/core/src/test/java/org/smooks/engine/delivery/java/JavaSourceTestCase.java +++ b/core/src/test/java/org/smooks/engine/delivery/java/JavaSourceTestCase.java @@ -149,7 +149,7 @@ public void test_streamingOn_02() throws IOException, SAXException { try { smooks.filterSource(javaSource); } catch(SmooksException e) { - assertEquals("Invalid Smooks configuration. Feature [" + JavaSource.FEATURE_GENERATE_EVENT_STREAM + "] is explicitly configured 'on' in the Smooks configuration, while the supplied JavaSource has explicitly configured event streaming to be off (through a call to JavaSource.setEventStreamRequired).", e.getCause().getMessage()); + assertEquals("Invalid Smooks configuration. Feature [" + JavaSource.FEATURE_GENERATE_EVENT_STREAM + "] is explicitly configured 'on' in the Smooks configuration, while the supplied JavaSource has explicitly configured event streaming to be off (through a call to JavaSource.setEventStreamRequired)", e.getCause().getMessage()); } } diff --git a/core/src/test/java/org/smooks/engine/delivery/sax/ng/SaxNgFilterTestCase.java b/core/src/test/java/org/smooks/engine/delivery/sax/ng/SaxNgFilterTestCase.java index 377f6da89..40dc4b63d 100644 --- a/core/src/test/java/org/smooks/engine/delivery/sax/ng/SaxNgFilterTestCase.java +++ b/core/src/test/java/org/smooks/engine/delivery/sax/ng/SaxNgFilterTestCase.java @@ -52,6 +52,7 @@ import org.smooks.io.sink.WriterSink; import org.smooks.io.source.ReaderSource; import org.smooks.io.source.StreamSource; +import org.smooks.io.source.StringSource; import org.smooks.support.StreamUtils; import org.smooks.testkit.TextUtils; import org.xml.sax.SAXException; @@ -72,7 +73,7 @@ public class SaxNgFilterTestCase { @BeforeEach - public void before() throws Exception { + public void beforeEach() throws Exception { Visitor01.element = null; Visitor01.children.clear(); Visitor01.childText.clear(); @@ -90,56 +91,56 @@ public void before() throws Exception { } @Test - public void test_reader_writer() throws SAXException, IOException { + public void testReaderSourceAndWriterSink() throws SAXException, IOException { Smooks smooks = new Smooks(getClass().getResourceAsStream("smooks-config-01.xml")); ExecutionContext execContext = smooks.createExecutionContext(); String input = new String(StreamUtils.readStream(getClass().getResourceAsStream("test-01.xml"))); StringWriter writer = new StringWriter(); - smooks.filterSource(execContext, new ReaderSource(new StringReader(input)), new WriterSink(writer)); + smooks.filterSource(execContext, new ReaderSource<>(new StringReader(input)), new WriterSink<>(writer)); assertEquals(TextUtils.trimLines(new StringReader(input)).toString(), TextUtils.trimLines(new StringReader(writer.toString())).toString()); } @Test - public void test_reader_stream() throws SAXException, IOException { + public void testStringSourceAndStreamSink() throws SAXException, IOException { Smooks smooks = new Smooks(getClass().getResourceAsStream("smooks-config-01.xml")); ExecutionContext execContext = smooks.createExecutionContext(); String input = new String(StreamUtils.readStream(getClass().getResourceAsStream("test-01.xml"))); ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - smooks.filterSource(execContext, new ReaderSource(new StringReader(input)), new StreamSink(outStream)); + smooks.filterSource(execContext, new StringSource(input), new StreamSink<>(outStream)); assertEquals(TextUtils.trimLines(new StringReader(input)).toString(), TextUtils.trimLines(new StringReader(outStream.toString())).toString()); } @Test - public void test_stream_stream() throws SAXException, IOException { + public void testStreamSourceAndStreamSink() throws SAXException, IOException { Smooks smooks = new Smooks(getClass().getResourceAsStream("smooks-config-01.xml")); ExecutionContext execContext = smooks.createExecutionContext(); String input = new String(StreamUtils.readStream(getClass().getResourceAsStream("test-01.xml"))); ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - smooks.filterSource(execContext, new StreamSource(new ByteArrayInputStream(input.getBytes())), new StreamSink(outStream)); + smooks.filterSource(execContext, new StreamSource<>(new ByteArrayInputStream(input.getBytes())), new StreamSink<>(outStream)); assertEquals(TextUtils.trimLines(new StringReader(input)).toString(), TextUtils.trimLines(new StringReader(outStream.toString())).toString()); } @Test - public void test_stream_writer() throws SAXException, IOException { + public void testStreamSourceAndWriterSink() throws SAXException, IOException { Smooks smooks = new Smooks(getClass().getResourceAsStream("smooks-config-01.xml")); ExecutionContext execContext = smooks.createExecutionContext(); String input = new String(StreamUtils.readStream(getClass().getResourceAsStream("test-01.xml"))); StringWriter writer = new StringWriter(); - smooks.filterSource(execContext, new StreamSource(new ByteArrayInputStream(input.getBytes())), new WriterSink(writer)); + smooks.filterSource(execContext, new StreamSource<>(new ByteArrayInputStream(input.getBytes())), new WriterSink<>(writer)); assertEquals(TextUtils.trimLines(new StringReader(input)).toString(), TextUtils.trimLines(new StringReader(writer.toString())).toString()); } @Test - public void test_selection() throws IOException, SAXException { + public void testVisits() throws IOException, SAXException { Smooks smooks = new Smooks(getClass().getResourceAsStream("smooks-config-02.xml")); ExecutionContext execContext = smooks.createExecutionContext(); String input = new String(StreamUtils.readStream(getClass().getResourceAsStream("test-01.xml"))); - smooks.filterSource(execContext, new StreamSource(new ByteArrayInputStream(input.getBytes()))); + smooks.filterSource(execContext, new StreamSource<>(new ByteArrayInputStream(input.getBytes()))); assertEquals("h", Visitor01.element.getLocalName()); assertEquals("y", Visitor01.element.getPrefix()); assertEquals("http://y", Visitor01.element.getNamespaceURI()); @@ -160,26 +161,26 @@ public void test_selection() throws IOException, SAXException { } @Test - public void test_contextual_1() throws IOException, SAXException { - test_contextual("smooks-config-03.xml"); + public void testVisitsGivenSelectorHasContext() throws IOException, SAXException { + testContextual("smooks-config-03.xml"); } @Test - public void test_contextual_2() throws IOException, SAXException { - test_contextual("smooks-config-03.01.xml"); + public void testVisitsGivenSelectorHasWildcard() throws IOException, SAXException { + testContextual("smooks-config-03.01.xml"); } @Test - public void test_contextual_3() throws IOException, SAXException { - test_contextual("smooks-config-03.02.xml"); + public void testVisitsGivenSelectorIsDescendantOrSelf() throws IOException, SAXException { + testContextual("smooks-config-03.02.xml"); } - public void test_contextual(String config) throws IOException, SAXException { + public void testContextual(String config) throws IOException, SAXException { Smooks smooks = new Smooks(getClass().getResourceAsStream(config)); ExecutionContext execContext = smooks.createExecutionContext(); String input = new String(StreamUtils.readStream(getClass().getResourceAsStream("test-01.xml"))); - smooks.filterSource(execContext, new StreamSource(new ByteArrayInputStream(input.getBytes()))); + smooks.filterSource(execContext, new StreamSource<>(new ByteArrayInputStream(input.getBytes()))); assertEquals("h", Visitor01.element.getLocalName()); assertEquals("y", Visitor01.element.getPrefix()); assertEquals("http://y", Visitor01.element.getNamespaceURI()); @@ -196,49 +197,49 @@ public void test_contextual(String config) throws IOException, SAXException { } @Test - public void test_document() throws IOException, SAXException { + public void testVisitsGivenDocumentSelector() throws IOException, SAXException { Smooks smooks = new Smooks(getClass().getResourceAsStream("smooks-config-04.xml")); ExecutionContext execContext = smooks.createExecutionContext(); String input = new String(StreamUtils.readStream(getClass().getResourceAsStream("test-01.xml"))); - smooks.filterSource(execContext, new StreamSource(new ByteArrayInputStream(input.getBytes()))); + smooks.filterSource(execContext, new StreamSource<>(new ByteArrayInputStream(input.getBytes()))); assertEquals("xx", Visitor01.element.getLocalName()); assertEquals("xx", Visitor02.element.getLocalName()); assertNull(Visitor03.element); } @Test - public void test_visitBeforeOnly() throws IOException, SAXException { + public void testBeforeVisitorVisited() throws IOException, SAXException { Smooks smooks = new Smooks(getClass().getResourceAsStream("smooks-config-05.xml")); - smooks.filterSource(smooks.createExecutionContext(), new ReaderSource(new StringReader(""))); + smooks.filterSource(smooks.createExecutionContext(), new ReaderSource<>(new StringReader(""))); assertTrue(VisitBeforeVisitor.visited); assertEquals("Hi There!", VisitBeforeVisitor.staticInjectedParam); } @Test - public void test_visitBeforeAndChildren() throws IOException, SAXException { + public void testBeforeVisitorAndChildrenVisitorVisited() throws IOException, SAXException { Smooks smooks = new Smooks(getClass().getResourceAsStream("smooks-config-05.xml")); - smooks.filterSource(smooks.createExecutionContext(), new ReaderSource(new StringReader(""))); + smooks.filterSource(smooks.createExecutionContext(), new ReaderSource<>(new StringReader(""))); assertTrue(BeforeVisitorAndChildrenVisitor.visited); assertFalse(BeforeVisitorAndChildrenVisitor.onChildText); assertFalse(BeforeVisitorAndChildrenVisitor.onChildElement); BeforeVisitorAndChildrenVisitor.reset(); - smooks.filterSource(smooks.createExecutionContext(), new ReaderSource(new StringReader("text"))); + smooks.filterSource(smooks.createExecutionContext(), new ReaderSource<>(new StringReader("text"))); assertTrue(BeforeVisitorAndChildrenVisitor.visited); assertTrue(BeforeVisitorAndChildrenVisitor.onChildText); assertFalse(BeforeVisitorAndChildrenVisitor.onChildElement); BeforeVisitorAndChildrenVisitor.reset(); - smooks.filterSource(smooks.createExecutionContext(), new ReaderSource(new StringReader(""))); + smooks.filterSource(smooks.createExecutionContext(), new ReaderSource<>(new StringReader(""))); assertTrue(BeforeVisitorAndChildrenVisitor.visited); assertFalse(BeforeVisitorAndChildrenVisitor.onChildText); assertTrue(BeforeVisitorAndChildrenVisitor.onChildElement); BeforeVisitorAndChildrenVisitor.reset(); - smooks.filterSource(smooks.createExecutionContext(), new ReaderSource(new StringReader("text"))); + smooks.filterSource(smooks.createExecutionContext(), new ReaderSource<>(new StringReader("text"))); assertTrue(BeforeVisitorAndChildrenVisitor.visited); assertTrue(BeforeVisitorAndChildrenVisitor.onChildText); assertTrue(BeforeVisitorAndChildrenVisitor.onChildElement); @@ -246,44 +247,44 @@ public void test_visitBeforeAndChildren() throws IOException, SAXException { } @Test - public void test_visitAfterOnly() throws IOException, SAXException { + public void testAfterVisitorVisited() throws IOException, SAXException { Smooks smooks = new Smooks(getClass().getResourceAsStream("smooks-config-05.xml")); - smooks.filterSource(smooks.createExecutionContext(), new ReaderSource(new StringReader(""))); + smooks.filterSource(smooks.createExecutionContext(), new ReaderSource<>(new StringReader(""))); assertTrue(VisitAfterVisitor.visited); } @Test - public void test_max_node_depth() throws IOException, SAXException { - Smooks smooks = new Smooks(getClass().getResourceAsStream("smooks-config-06.xml")); + public void testMaxNodeDepth() throws IOException, SAXException { + Smooks smooks = new Smooks(getClass().getResourceAsStream("smooks-config-max-node-depth.xml")); - smooks.filterSource(smooks.createExecutionContext(), new ReaderSource(new StringReader("foobar"))); + smooks.filterSource(smooks.createExecutionContext(), new ReaderSource<>(new StringReader("foobar"))); assertNotNull(MaxNodeDepthVisitor.element); } @Test - public void test_visitAfterAndChildren() throws IOException, SAXException { + public void testAfterVisitorAndChildrenVisitorVisited() throws IOException, SAXException { Smooks smooks = new Smooks(getClass().getResourceAsStream("smooks-config-05.xml")); - smooks.filterSource(smooks.createExecutionContext(), new ReaderSource(new StringReader(""))); + smooks.filterSource(smooks.createExecutionContext(), new ReaderSource<>(new StringReader(""))); assertTrue(AfterVisitorAndChildrenVisitor.visited); assertFalse(AfterVisitorAndChildrenVisitor.onChildText); assertFalse(AfterVisitorAndChildrenVisitor.onChildElement); AfterVisitorAndChildrenVisitor.reset(); - smooks.filterSource(smooks.createExecutionContext(), new ReaderSource(new StringReader("text"))); + smooks.filterSource(smooks.createExecutionContext(), new ReaderSource<>(new StringReader("text"))); assertTrue(AfterVisitorAndChildrenVisitor.visited); assertTrue(AfterVisitorAndChildrenVisitor.onChildText); assertFalse(AfterVisitorAndChildrenVisitor.onChildElement); AfterVisitorAndChildrenVisitor.reset(); - smooks.filterSource(smooks.createExecutionContext(), new ReaderSource(new StringReader(""))); + smooks.filterSource(smooks.createExecutionContext(), new ReaderSource<>(new StringReader(""))); assertTrue(AfterVisitorAndChildrenVisitor.visited); assertFalse(AfterVisitorAndChildrenVisitor.onChildText); assertTrue(AfterVisitorAndChildrenVisitor.onChildElement); AfterVisitorAndChildrenVisitor.reset(); - smooks.filterSource(smooks.createExecutionContext(), new ReaderSource(new StringReader("text"))); + smooks.filterSource(smooks.createExecutionContext(), new ReaderSource<>(new StringReader("text"))); assertTrue(AfterVisitorAndChildrenVisitor.visited); assertTrue(AfterVisitorAndChildrenVisitor.onChildText); assertTrue(AfterVisitorAndChildrenVisitor.onChildElement); @@ -292,13 +293,13 @@ public void test_visitAfterAndChildren() throws IOException, SAXException { @Test @Disabled("FIXME") - public void test_report() throws IOException, SAXException { + public void testReport() throws IOException, SAXException { Smooks smooks = new Smooks(getClass().getResourceAsStream("smooks-config-04.xml")); ExecutionContext executionContext = smooks.createExecutionContext(); StringWriter reportWriter = new StringWriter(); executionContext.getContentDeliveryRuntime().addExecutionEventListener(new FlatReportGenerator(reportWriter, smooks.getApplicationContext())); - smooks.filterSource(executionContext, new ReaderSource(new StringReader(""))); + smooks.filterSource(executionContext, new ReaderSource<>(new StringReader(""))); assertTrue(compareCharStreams(getClass().getResourceAsStream("report-expected.txt"), new ByteArrayInputStream(reportWriter.toString().getBytes()))); } diff --git a/core/src/test/java/org/smooks/engine/resource/visitor/ConsumeSerializerVisitorTestCase.java b/core/src/test/java/org/smooks/engine/resource/visitor/ConsumeSerializerVisitorTestCase.java new file mode 100644 index 000000000..25824f080 --- /dev/null +++ b/core/src/test/java/org/smooks/engine/resource/visitor/ConsumeSerializerVisitorTestCase.java @@ -0,0 +1,87 @@ +/*- + * ========================LICENSE_START================================= + * Smooks Core + * %% + * Copyright (C) 2020 - 2025 Smooks + * %% + * Licensed under the terms of the Apache License Version 2.0, or + * the GNU Lesser General Public License version 3.0 or later. + * + * SPDX-License-Identifier: Apache-2.0 OR LGPL-3.0-or-later + * + * ====================================================================== + * + * Licensed 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. + * + * ====================================================================== + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * =========================LICENSE_END================================== + */ +package org.smooks.engine.resource.visitor; + +import org.junit.jupiter.api.Test; +import org.smooks.Smooks; +import org.smooks.engine.DefaultApplicationContextBuilder; +import org.smooks.engine.DefaultFilterSettings; +import org.smooks.io.sink.StringSink; +import org.smooks.io.source.StringSource; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ConsumeSerializerVisitorTestCase { + + @Test + public void testSerializationWhenCloseEmptyElementsIsFalse() { + Smooks smooks = new Smooks(new DefaultApplicationContextBuilder().withFilterSettings(new DefaultFilterSettings().setDefaultSerializationOn(false)).build()); + ConsumeSerializerVisitor consumeSerializerVisitor = new ConsumeSerializerVisitor(); + consumeSerializerVisitor.setCloseEmptyElements(Optional.of(false)); + smooks.addVisitor(consumeSerializerVisitor, "*"); + + + StringSink stringSink = new StringSink(); + smooks.filterSource(new StringSource(""), stringSink); + + assertEquals("", stringSink.getResult()); + } + + + @Test + public void testSerializationWhenCloseEmptyElementsIsTrue() { + Smooks smooks = new Smooks(new DefaultApplicationContextBuilder().withFilterSettings(new DefaultFilterSettings().setDefaultSerializationOn(false)).build()); + ConsumeSerializerVisitor consumeSerializerVisitor = new ConsumeSerializerVisitor(); + consumeSerializerVisitor.setCloseEmptyElements(Optional.of(true)); + smooks.addVisitor(consumeSerializerVisitor, "*"); + + + StringSink stringSink = new StringSink(); + smooks.filterSource(new StringSource(""), stringSink); + + assertEquals("", stringSink.getResult()); + } + +} diff --git a/core/src/test/java/org/smooks/engine/resource/visitor/smooks/NestedSmooksVisitorTestCase.java b/core/src/test/java/org/smooks/engine/resource/visitor/smooks/NestedSmooksVisitorTestCase.java index a4c8f6595..34d77089a 100644 --- a/core/src/test/java/org/smooks/engine/resource/visitor/smooks/NestedSmooksVisitorTestCase.java +++ b/core/src/test/java/org/smooks/engine/resource/visitor/smooks/NestedSmooksVisitorTestCase.java @@ -67,7 +67,7 @@ import org.smooks.engine.delivery.interceptor.ExceptionInterceptor; import org.smooks.engine.delivery.interceptor.InterceptorVisitorChainFactory; import org.smooks.engine.delivery.interceptor.InterceptorVisitorDefinition; -import org.smooks.engine.delivery.sax.ng.SimpleSerializerVisitor; +import org.smooks.engine.resource.visitor.SimpleSerializerVisitor; import org.smooks.engine.delivery.interceptor.EventPointerStaticProxyInterceptor; import org.smooks.engine.lookup.InstanceLookup; import org.smooks.engine.lookup.InterceptorVisitorChainFactoryLookup; diff --git a/core/src/test/resources/org/smooks/engine/delivery/dom/serialize/DefaultWritingOff_One_Serializer_Test.xml b/core/src/test/resources/org/smooks/engine/delivery/dom/serialize/DefaultWritingOff_One_Serializer_Test.xml index 8f119138c..23d2fa305 100644 --- a/core/src/test/resources/org/smooks/engine/delivery/dom/serialize/DefaultWritingOff_One_Serializer_Test.xml +++ b/core/src/test/resources/org/smooks/engine/delivery/dom/serialize/DefaultWritingOff_One_Serializer_Test.xml @@ -53,7 +53,7 @@ - org.smooks.engine.delivery.dom.serialize.DefaultDOMSerializerVisitor + org.smooks.engine.resource.visitor.dom.DefaultDOMSerializerVisitor diff --git a/core/src/test/resources/org/smooks/engine/delivery/sax/ng/smooks-config-06.xml b/core/src/test/resources/org/smooks/engine/delivery/sax/ng/smooks-config-max-node-depth.xml similarity index 100% rename from core/src/test/resources/org/smooks/engine/delivery/sax/ng/smooks-config-06.xml rename to core/src/test/resources/org/smooks/engine/delivery/sax/ng/smooks-config-max-node-depth.xml diff --git a/core/src/test/resources/org/smooks/engine/delivery/smooks-config-invalid-error.txt b/core/src/test/resources/org/smooks/engine/delivery/smooks-config-invalid-error.txt index 5caa67f82..aeb0e8518 100644 --- a/core/src/test/resources/org/smooks/engine/delivery/smooks-config-invalid-error.txt +++ b/core/src/test/resources/org/smooks/engine/delivery/smooks-config-invalid-error.txt @@ -1 +1 @@ -Ambiguous Resource Config set. All content handlers must support processing on the SAX and/or DOM Filter:DOM SAX Resource ('x' equals supported)---------------------------------------------------------------------SAX NG DOM Target Profile: [[*]], Selector: [smooks:context-object], Resource: [org.smooks.engine.delivery.dom.serialize.ContextObjectSerializerVisitor], Num Params: [0]SAX NG DOM Target Profile: [[*]], Selector: [smooks:ghost-element], Resource: [org.smooks.engine.delivery.dom.serialize.GhostElementSerializerVisitor], Num Params: [0]SAX NG DOM Target Profile: [[*]], Selector: [smooks:text], Resource: [org.smooks.engine.delivery.dom.serialize.TextSerializerVisitor], Num Params: [1]SAX NG DOM Target Profile: [[*]], Selector: [*], Resource: [org.smooks.engine.delivery.sax.ng.SystemConsumeSerializerVisitor], Num Params: [0]DOM Target Profile: [[org.smooks.api.profile.Profile#default_profile]], Selector: [a], Resource: [org.smooks.engine.delivery.dom.ProcessorVisitor1], Num Params: [0]SAX NG Target Profile: [[org.smooks.api.profile.Profile#default_profile]], Selector: [b], Resource: [org.smooks.engine.delivery.sax.ng.Visitor01], Num Params: [0]Target Profile: [[org.smooks.api.profile.Profile#default_profile]], Selector: [c], Resource: [org.smooks.engine.delivery.DefaultContentDeliveryConfigBuilderTestCase$UnsupportedVisitor], Num Params: [0] \ No newline at end of file +Ambiguous Resource Config set. All content handlers must support processing on the SAX and/or DOM Filter:DOM SAX Resource ('x' equals supported)---------------------------------------------------------------------SAX NG DOM Target Profile: [[*]], Selector: [smooks:context-object], Resource: [org.smooks.engine.resource.visitor.dom.ContextObjectSerializerVisitor], Num Params: [0]SAX NG DOM Target Profile: [[*]], Selector: [smooks:ghost-element], Resource: [org.smooks.engine.resource.visitor.dom.GhostElementSerializerVisitor], Num Params: [0]SAX NG DOM Target Profile: [[*]], Selector: [smooks:text], Resource: [org.smooks.engine.resource.visitor.dom.TextSerializerVisitor], Num Params: [1]SAX NG DOM Target Profile: [[*]], Selector: [*], Resource: [org.smooks.engine.resource.visitor.SystemConsumeSerializerVisitor], Num Params: [0]DOM Target Profile: [[org.smooks.api.profile.Profile#default_profile]], Selector: [a], Resource: [org.smooks.engine.delivery.dom.ProcessorVisitor1], Num Params: [0]SAX NG Target Profile: [[org.smooks.api.profile.Profile#default_profile]], Selector: [b], Resource: [org.smooks.engine.delivery.sax.ng.Visitor01], Num Params: [0]Target Profile: [[org.smooks.api.profile.Profile#default_profile]], Selector: [c], Resource: [org.smooks.engine.delivery.DefaultContentDeliveryConfigBuilderTestCase$UnsupportedVisitor], Num Params: [0] \ No newline at end of file