From a1d7bb0512dcb848f92be7a5e6b1b9e92cb4aa1e Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Fri, 16 May 2025 23:43:23 +0200 Subject: [PATCH] extract common functionality of DefaultPluginXmlFactory --- .../api/services/xml/XmlReaderRequest.java | 6 ++ .../api/services/xml/XmlWriterRequest.java | 6 ++ .../maven/impl/DefaultModelXmlFactory.java | 8 +- .../maven/impl/DefaultPluginXmlFactory.java | 81 +++++++++---------- .../impl/DefaultPluginXmlFactoryTest.java | 8 +- 5 files changed, 57 insertions(+), 52 deletions(-) diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/xml/XmlReaderRequest.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/xml/XmlReaderRequest.java index d261345f7083..e7bd5e0dd1ac 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/xml/XmlReaderRequest.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/xml/XmlReaderRequest.java @@ -78,6 +78,12 @@ interface Transformer { String transform(String source, String fieldName); } + default void throwIfIncomplete() { + if (getInputStream() == null && getReader() == null && getPath() == null && getURL() == null) { + throw new IllegalArgumentException("writer, outputStream, or path must be non null"); + } + } + @Nonnull static XmlReaderRequestBuilder builder() { return new XmlReaderRequestBuilder(); diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/xml/XmlWriterRequest.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/xml/XmlWriterRequest.java index 46ee89c8cf49..03607a156430 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/xml/XmlWriterRequest.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/xml/XmlWriterRequest.java @@ -55,6 +55,12 @@ static XmlWriterRequestBuilder builder() { return new XmlWriterRequestBuilder<>(); } + default void throwIfIncomplete() { + if (getWriter() == null && getOutputStream() == null && getPath() == null) { + throw new IllegalArgumentException("writer, outputStream, or path must be non null"); + } + } + class XmlWriterRequestBuilder { Path path; OutputStream outputStream; diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultModelXmlFactory.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultModelXmlFactory.java index 7a5abd7d8235..843c2a012bef 100644 --- a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultModelXmlFactory.java +++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultModelXmlFactory.java @@ -83,9 +83,7 @@ private Model doRead(XmlReaderRequest request) throws XmlReaderException { URL url = request.getURL(); Reader reader = request.getReader(); InputStream inputStream = request.getInputStream(); - if (path == null && url == null && reader == null && inputStream == null) { - throw new IllegalArgumentException("path, url, reader or inputStream must be non null"); - } + request.throwIfIncomplete(); try { InputSource source = null; if (request.getModelId() != null || request.getLocation() != null) { @@ -120,9 +118,7 @@ public void write(XmlWriterRequest request) throws XmlWriterException { OutputStream outputStream = request.getOutputStream(); Writer writer = request.getWriter(); Function inputLocationFormatter = request.getInputLocationFormatter(); - if (writer == null && outputStream == null && path == null) { - throw new IllegalArgumentException("writer, outputStream or path must be non null"); - } + request.throwIfIncomplete(); try { MavenStaxWriter w = new MavenStaxWriter(); if (inputLocationFormatter != null) { diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultPluginXmlFactory.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultPluginXmlFactory.java index 876495097494..b10fbd4cbe51 100644 --- a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultPluginXmlFactory.java +++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultPluginXmlFactory.java @@ -18,13 +18,12 @@ */ package org.apache.maven.impl; +import javax.xml.stream.XMLStreamException; + +import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.io.Reader; -import java.io.Writer; -import java.net.URL; import java.nio.file.Files; -import java.nio.file.Path; import org.apache.maven.api.annotations.Nonnull; import org.apache.maven.api.di.Named; @@ -38,65 +37,63 @@ import org.apache.maven.plugin.descriptor.io.PluginDescriptorStaxReader; import org.apache.maven.plugin.descriptor.io.PluginDescriptorStaxWriter; -import static org.apache.maven.impl.ImplUtils.nonNull; import static org.apache.maven.impl.StaxLocation.getLocation; import static org.apache.maven.impl.StaxLocation.getMessage; @Named @Singleton public class DefaultPluginXmlFactory implements PluginXmlFactory { + @Override public PluginDescriptor read(@Nonnull XmlReaderRequest request) throws XmlReaderException { - nonNull(request, "request"); - Path path = request.getPath(); - URL url = request.getURL(); - Reader reader = request.getReader(); - InputStream inputStream = request.getInputStream(); - if (path == null && url == null && reader == null && inputStream == null) { - throw new IllegalArgumentException("path, url, reader or inputStream must be non null"); - } + return read(request, setAddDefaultEntities(request, new PluginDescriptorStaxReader())); + } + + @Override + public void write(XmlWriterRequest request) throws XmlWriterException { + write(request, new PluginDescriptorStaxWriter()); + } + + private static PluginDescriptor read(XmlReaderRequest request, PluginDescriptorStaxReader reader) { + request.throwIfIncomplete(); try { - PluginDescriptorStaxReader xml = new PluginDescriptorStaxReader(); - xml.setAddDefaultEntities(request.isAddDefaultEntities()); - if (inputStream != null) { - return xml.read(inputStream, request.isStrict()); - } else if (reader != null) { - return xml.read(reader, request.isStrict()); - } else if (path != null) { - try (InputStream is = Files.newInputStream(path)) { - return xml.read(is, request.isStrict()); + if (request.getInputStream() != null) { + return reader.read(request.getInputStream(), request.isStrict()); + } else if (request.getReader() != null) { + return reader.read(request.getReader(), request.isStrict()); + } else if (request.getPath() != null) { + try (InputStream is = Files.newInputStream(request.getPath())) { + return reader.read(is, request.isStrict()); } } else { - try (InputStream is = url.openStream()) { - return xml.read(is, request.isStrict()); + try (InputStream is = request.getURL().openStream()) { + return reader.read(is, request.isStrict()); } } - } catch (Exception e) { + } catch (IOException | XMLStreamException e) { throw new XmlReaderException("Unable to read plugin: " + getMessage(e), getLocation(e), e); } } - @Override - public void write(XmlWriterRequest request) throws XmlWriterException { - nonNull(request, "request"); - PluginDescriptor content = nonNull(request.getContent(), "content"); - Path path = request.getPath(); - OutputStream outputStream = request.getOutputStream(); - Writer writer = request.getWriter(); - if (writer == null && outputStream == null && path == null) { - throw new IllegalArgumentException("writer, outputStream or path must be non null"); - } + private static PluginDescriptorStaxReader setAddDefaultEntities( + XmlReaderRequest request, PluginDescriptorStaxReader reader) { + reader.setAddDefaultEntities(request.isAddDefaultEntities()); + return reader; + } + + private static void write(XmlWriterRequest request, PluginDescriptorStaxWriter writer) { + request.throwIfIncomplete(); try { - if (writer != null) { - new PluginDescriptorStaxWriter().write(writer, content); - } else if (outputStream != null) { - new PluginDescriptorStaxWriter().write(outputStream, content); + if (request.getWriter() != null) { + writer.write(request.getWriter(), request.getContent()); + } else if (request.getOutputStream() != null) { + writer.write(request.getOutputStream(), request.getContent()); } else { - try (OutputStream os = Files.newOutputStream(path)) { - new PluginDescriptorStaxWriter().write(os, content); + try (OutputStream os = Files.newOutputStream(request.getPath())) { + writer.write(os, request.getContent()); } } - } catch (Exception e) { + } catch (XmlWriterException | XMLStreamException | IOException e) { throw new XmlWriterException("Unable to write plugin: " + getMessage(e), getLocation(e), e); } } diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultPluginXmlFactoryTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultPluginXmlFactoryTest.java index 73d15c816284..d84dfbb9e212 100644 --- a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultPluginXmlFactoryTest.java +++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultPluginXmlFactoryTest.java @@ -46,6 +46,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; class DefaultPluginXmlFactoryReadWriteTest { @@ -184,7 +185,6 @@ void staticToXmlGeneratesValidXml() { .version("1.0.0") .build()); assertThat(xml).contains("" + NAME + ""); - assertThat(xml).contains("" + NAME + ""); assertThat(xml).contains("org.example"); assertThat(xml).contains("sample-plugin"); assertThat(xml).contains("1.0.0"); @@ -229,7 +229,7 @@ void writeWithNoTargetThrowsIllegalArgumentException() { .build()) .build())) .getMessage()) - .isEqualTo("writer, outputStream or path must be non null"); + .isEqualTo("writer, outputStream, or path must be non null"); } @Test @@ -268,7 +268,7 @@ void readFromUrlParsesPluginDescriptorCorrectly() throws Exception { void testReadWithPath() throws Exception { Path tempPath = Files.createTempFile("plugin", ".xml"); Files.writeString(tempPath, ""); - XmlReaderRequest request = mock(XmlReaderRequest.class); + XmlReaderRequest request = spy(XmlReaderRequest.class); when(request.getPath()).thenReturn(tempPath); when(request.getInputStream()).thenReturn(null); when(request.getReader()).thenReturn(null); @@ -283,7 +283,7 @@ void testReadWithPath() throws Exception { void testReadWithPathUrlDefault() throws Exception { Path tempPath = Files.createTempFile("plugin", ".xml"); Files.writeString(tempPath, ""); - XmlReaderRequest request = mock(XmlReaderRequest.class); + XmlReaderRequest request = spy(XmlReaderRequest.class); when(request.getPath()).thenReturn(null); when(request.getInputStream()).thenReturn(null); when(request.getReader()).thenReturn(null);