From c043ed218aae9e30de10f5d6ec10a4226bf3b5a4 Mon Sep 17 00:00:00 2001 From: WolfgangHG Date: Wed, 12 Feb 2025 19:29:14 +0100 Subject: [PATCH 1/2] Fix NodeDescriptorImporterBase.fromString to handle non ascii chars in xml file --- .../spi/node/NodeDescriptorImporterBase.java | 49 +++++++++++++++++++ .../descriptor/spi/node/NodeImporter.java | 11 +++++ .../spi/node/dom/XmlDomNodeImporter.java | 10 ++++ .../spi/node/dom/XmlDomNodeImporterImpl.java | 34 +++++++++++++ 4 files changed, 104 insertions(+) diff --git a/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/NodeDescriptorImporterBase.java b/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/NodeDescriptorImporterBase.java index daf8e489..262a3f7d 100644 --- a/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/NodeDescriptorImporterBase.java +++ b/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/NodeDescriptorImporterBase.java @@ -16,7 +16,10 @@ */ package org.jboss.shrinkwrap.descriptor.spi.node; +import java.io.IOException; import java.io.InputStream; +import java.io.Reader; +import java.io.StringReader; import java.lang.reflect.Constructor; import org.jboss.shrinkwrap.descriptor.api.Descriptor; @@ -90,6 +93,52 @@ public T fromStream(final InputStream in, final boolean close) throws IllegalArg return descriptor; } + /** + * {@inheritDoc} + * + * @see org.jboss.shrinkwrap.descriptor.api.DescriptorImporter#fromString(String) + */ + @Override + public T fromString(final String in) throws IllegalArgumentException, + DescriptorImportException { + // Precondition check + if (in == null || in.length() == 0) { + throw new IllegalArgumentException("Input string must be specified"); + } + + Reader reader = new StringReader(in); + try { + final Node rootNode = this.getNodeImporter().importAsNode(reader); + + // Create the end-user view + final Constructor constructor; + try { + constructor = endUserViewImplType.getConstructor(String.class, Node.class); + } catch (final NoSuchMethodException e) { + throw new DescriptorImportException("Descriptor impl " + endUserViewImplType.getName() + + " does not have a constructor accepting " + String.class.getName() + " and " + Node.class.getName(), + e); + } + final T descriptor; + try { + descriptor = constructor.newInstance(descriptorName, rootNode); + } catch (final Exception e) { + throw new DescriptorImportException("Could not create new instance using " + constructor + " with arg: " + + rootNode); + } + + // Return + return descriptor; + } + finally { + try { + reader.close(); + } catch (IOException e) { + throw new DescriptorImportException("Exception while closing StringReader", e); + } + } + } + // -------------------------------------------------------------------------------------|| // Contracts --------------------------------------------------------------------------|| // -------------------------------------------------------------------------------------|| diff --git a/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/NodeImporter.java b/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/NodeImporter.java index 888715e3..cc26a7cd 100644 --- a/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/NodeImporter.java +++ b/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/NodeImporter.java @@ -17,6 +17,7 @@ package org.jboss.shrinkwrap.descriptor.spi.node; import java.io.InputStream; +import java.io.Reader; /** * Imports a {@link InputStream} into a hierarchal {@link Node} structure @@ -38,4 +39,14 @@ public interface NodeImporter { */ Node importAsNode(InputStream stream, boolean close) throws IllegalArgumentException; + /** + * Imports the specified {@link Reader} into a {@link Node} structure, returning the root {@link Node}. + * + * @param input + * The reader containing the xml file content + * @return + * @throws IllegalArgumentException + * If the reader is not specified + */ + Node importAsNode(Reader input) throws IllegalArgumentException; } diff --git a/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/dom/XmlDomNodeImporter.java b/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/dom/XmlDomNodeImporter.java index ae7de19c..6241cdd7 100644 --- a/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/dom/XmlDomNodeImporter.java +++ b/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/dom/XmlDomNodeImporter.java @@ -17,6 +17,7 @@ package org.jboss.shrinkwrap.descriptor.spi.node.dom; import java.io.InputStream; +import java.io.Reader; import org.jboss.shrinkwrap.descriptor.api.DescriptorImporter; import org.jboss.shrinkwrap.descriptor.spi.node.Node; @@ -45,4 +46,13 @@ public Node importAsNode(InputStream stream, boolean close) throws IllegalArgume return delegate.importAsNode(stream, close); } + /** + * {@inheritDoc} + * + * @see org.jboss.shrinkwrap.descriptor.spi.node.NodeImporter#importAsNode(Reader) + */ + public Node importAsNode(Reader input) throws IllegalArgumentException { + return delegate.importAsNode(input); + } + } diff --git a/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/dom/XmlDomNodeImporterImpl.java b/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/dom/XmlDomNodeImporterImpl.java index 7e9ecb7f..8eea499b 100644 --- a/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/dom/XmlDomNodeImporterImpl.java +++ b/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/dom/XmlDomNodeImporterImpl.java @@ -18,6 +18,8 @@ import java.io.IOException; import java.io.InputStream; +import java.io.Reader; +import java.io.StringReader; import java.util.logging.Level; import java.util.logging.Logger; @@ -31,6 +33,7 @@ import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; /** * {@link NodeImporter} implementation backed by the {@link Document} API. @@ -88,6 +91,37 @@ public Node importAsNode(final InputStream stream, final boolean close) throws D } } + /** + * {@inheritDoc} + * + * @see org.jboss.shrinkwrap.descriptor.spi.node.NodeImporter#importAsNode(Reader) + */ + @Override + public Node importAsNode(Reader reader) throws IllegalArgumentException { + try { + // Empty contents? If so, no root Node + if (reader == null || reader.ready() == false) { + return null; + } + + final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + final DocumentBuilder builder = factory.newDocumentBuilder(); + InputSource source = new InputSource(reader); + final Document doc = builder.parse(source); + + final Element element = doc.getDocumentElement(); + + final Node root = new Node(element.getNodeName()); + + readRecursive(root, element); + return root; + + } catch (final Exception e) { + throw new DescriptorImportException("Could not import XML from string", e); + } + } + private void readRecursive(final Node target, final org.w3c.dom.Node source) { readAttributes(target, source); final NodeList sourceChildren = source.getChildNodes(); From d7add25043fb7dc6149906000dc960c03eb6c7b2 Mon Sep 17 00:00:00 2001 From: WolfgangHG Date: Wed, 12 Feb 2025 19:44:56 +0100 Subject: [PATCH 2/2] XmlDomNodeImporterImpl: removed unnessary warning from previous commit --- .../descriptor/spi/node/dom/XmlDomNodeImporterImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/dom/XmlDomNodeImporterImpl.java b/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/dom/XmlDomNodeImporterImpl.java index 8eea499b..0ff9aa34 100644 --- a/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/dom/XmlDomNodeImporterImpl.java +++ b/spi/src/main/java/org/jboss/shrinkwrap/descriptor/spi/node/dom/XmlDomNodeImporterImpl.java @@ -19,7 +19,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.Reader; -import java.io.StringReader; import java.util.logging.Level; import java.util.logging.Logger;