Skip to content

Commit 8410e6b

Browse files
author
Vincent Potucek
committed
Give SPOT for DefaultPluginXmlFactory leveraging OOP
1 parent 3e9c164 commit 8410e6b

File tree

4 files changed

+70
-63
lines changed

4 files changed

+70
-63
lines changed

api/maven-api-core/src/main/java/org/apache/maven/api/services/xml/XmlReaderRequest.java

+7
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@ interface Transformer {
7878
String transform(String source, String fieldName);
7979
}
8080

81+
default XmlReaderRequest assertReadable() {
82+
if (getInputStream() == null && getReader() == null && getPath() == null && getURL() == null) {
83+
throw new IllegalArgumentException("writer, outputStream or path must be non null");
84+
}
85+
return this;
86+
}
87+
8188
@Nonnull
8289
static XmlReaderRequestBuilder builder() {
8390
return new XmlReaderRequestBuilder();

api/maven-api-core/src/main/java/org/apache/maven/api/services/xml/XmlWriterRequest.java

+7
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@ static <T> XmlWriterRequestBuilder<T> builder() {
5555
return new XmlWriterRequestBuilder<>();
5656
}
5757

58+
default XmlWriterRequest<T> assertWritable() {
59+
if (getWriter() == null && getOutputStream() == null && getPath() == null) {
60+
throw new IllegalArgumentException("writer, outputStream or path must be non null");
61+
}
62+
return this;
63+
}
64+
5865
class XmlWriterRequestBuilder<T> {
5966
Path path;
6067
OutputStream outputStream;

impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultPluginXmlFactory.java

+37-44
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,10 @@
1818
*/
1919
package org.apache.maven.impl;
2020

21-
import java.io.InputStream;
22-
import java.io.OutputStream;
23-
import java.io.Reader;
24-
import java.io.Writer;
25-
import java.net.URL;
21+
import javax.xml.stream.XMLStreamException;
22+
23+
import java.io.IOException;
2624
import java.nio.file.Files;
27-
import java.nio.file.Path;
2825

2926
import org.apache.maven.api.annotations.Nonnull;
3027
import org.apache.maven.api.di.Named;
@@ -38,65 +35,61 @@
3835
import org.apache.maven.plugin.descriptor.io.PluginDescriptorStaxReader;
3936
import org.apache.maven.plugin.descriptor.io.PluginDescriptorStaxWriter;
4037

41-
import static org.apache.maven.impl.ImplUtils.nonNull;
4238
import static org.apache.maven.impl.StaxLocation.getLocation;
4339
import static org.apache.maven.impl.StaxLocation.getMessage;
4440

4541
@Named
4642
@Singleton
4743
public class DefaultPluginXmlFactory implements PluginXmlFactory {
44+
4845
@Override
4946
public PluginDescriptor read(@Nonnull XmlReaderRequest request) throws XmlReaderException {
50-
nonNull(request, "request");
51-
Path path = request.getPath();
52-
URL url = request.getURL();
53-
Reader reader = request.getReader();
54-
InputStream inputStream = request.getInputStream();
55-
if (path == null && url == null && reader == null && inputStream == null) {
56-
throw new IllegalArgumentException("path, url, reader or inputStream must be non null");
57-
}
47+
return read(request.assertReadable(), setAddDefaultEntities(request, new PluginDescriptorStaxReader()));
48+
}
49+
50+
@Override
51+
public void write(XmlWriterRequest<PluginDescriptor> request) throws XmlWriterException {
52+
write(request.assertWritable(), new PluginDescriptorStaxWriter());
53+
}
54+
55+
private static PluginDescriptor read(XmlReaderRequest request, PluginDescriptorStaxReader reader) {
5856
try {
59-
PluginDescriptorStaxReader xml = new PluginDescriptorStaxReader();
60-
xml.setAddDefaultEntities(request.isAddDefaultEntities());
61-
if (inputStream != null) {
62-
return xml.read(inputStream, request.isStrict());
63-
} else if (reader != null) {
64-
return xml.read(reader, request.isStrict());
65-
} else if (path != null) {
66-
try (InputStream is = Files.newInputStream(path)) {
67-
return xml.read(is, request.isStrict());
57+
if (request.getInputStream() != null) {
58+
return reader.read(request.getInputStream(), request.isStrict());
59+
} else if (request.getReader() != null) {
60+
return reader.read(request.getReader(), request.isStrict());
61+
} else if (request.getPath() != null) {
62+
try (var is = Files.newInputStream(request.getPath())) {
63+
return reader.read(is, request.isStrict());
6864
}
6965
} else {
70-
try (InputStream is = url.openStream()) {
71-
return xml.read(is, request.isStrict());
66+
try (var is = request.getURL().openStream()) {
67+
return reader.read(is, request.isStrict());
7268
}
7369
}
74-
} catch (Exception e) {
70+
} catch (IOException | XMLStreamException e) {
7571
throw new XmlReaderException("Unable to read plugin: " + getMessage(e), getLocation(e), e);
7672
}
7773
}
7874

79-
@Override
80-
public void write(XmlWriterRequest<PluginDescriptor> request) throws XmlWriterException {
81-
nonNull(request, "request");
82-
PluginDescriptor content = nonNull(request.getContent(), "content");
83-
Path path = request.getPath();
84-
OutputStream outputStream = request.getOutputStream();
85-
Writer writer = request.getWriter();
86-
if (writer == null && outputStream == null && path == null) {
87-
throw new IllegalArgumentException("writer, outputStream or path must be non null");
88-
}
75+
private static PluginDescriptorStaxReader setAddDefaultEntities(
76+
XmlReaderRequest request, PluginDescriptorStaxReader reader) {
77+
reader.setAddDefaultEntities(request.isAddDefaultEntities());
78+
return reader;
79+
}
80+
81+
private static void write(XmlWriterRequest<PluginDescriptor> request, PluginDescriptorStaxWriter writer) {
8982
try {
90-
if (writer != null) {
91-
new PluginDescriptorStaxWriter().write(writer, content);
92-
} else if (outputStream != null) {
93-
new PluginDescriptorStaxWriter().write(outputStream, content);
83+
if (request.getWriter() != null) {
84+
writer.write(request.getWriter(), request.getContent());
85+
} else if (request.getOutputStream() != null) {
86+
writer.write(request.getOutputStream(), request.getContent());
9487
} else {
95-
try (OutputStream os = Files.newOutputStream(path)) {
96-
new PluginDescriptorStaxWriter().write(os, content);
88+
try (var os = Files.newOutputStream(request.getPath())) {
89+
writer.write(os, request.getContent());
9790
}
9891
}
99-
} catch (Exception e) {
92+
} catch (XmlWriterException | XMLStreamException | IOException e) {
10093
throw new XmlWriterException("Unable to write plugin: " + getMessage(e), getLocation(e), e);
10194
}
10295
}

impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultPluginXmlFactoryTest.java

+19-19
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import static org.junit.jupiter.api.Assertions.assertNotNull;
4747
import static org.junit.jupiter.api.Assertions.assertThrows;
4848
import static org.mockito.Mockito.mock;
49+
import static org.mockito.Mockito.spy;
4950
import static org.mockito.Mockito.when;
5051

5152
class DefaultPluginXmlFactoryReadWriteTest {
@@ -73,9 +74,9 @@ void readFromInputStreamParsesPluginDescriptorCorrectly() {
7374
PluginDescriptor descriptor = defaultPluginXmlFactory.read(XmlReaderRequest.builder()
7475
.inputStream(new ByteArrayInputStream(SAMPLE_PLUGIN_XML.getBytes()))
7576
.build());
76-
assertThat(descriptor.getName()).isEqualTo(NAME);
77-
assertThat(descriptor.getGroupId()).isEqualTo("org.example");
7877
assertThat(descriptor.getArtifactId()).isEqualTo("sample-plugin");
78+
assertThat(descriptor.getGroupId()).isEqualTo("org.example");
79+
assertThat(descriptor.getName()).isEqualTo(NAME);
7980
assertThat(descriptor.getVersion()).isEqualTo("1.0.0");
8081
}
8182

@@ -160,18 +161,18 @@ void toXmlStringGeneratesValidXml() {
160161
.artifactId("sample-plugin")
161162
.version("1.0.0")
162163
.build());
163-
assertThat(xml).contains("<name>" + NAME + "</name>");
164-
assertThat(xml).contains("<groupId>org.example</groupId>");
165164
assertThat(xml).contains("<artifactId>sample-plugin</artifactId>");
165+
assertThat(xml).contains("<groupId>org.example</groupId>");
166+
assertThat(xml).contains("<name>" + NAME + "</name>");
166167
assertThat(xml).contains("<version>1.0.0</version>");
167168
}
168169

169170
@Test
170171
void staticFromXmlParsesValidXml() {
171172
PluginDescriptor descriptor = DefaultPluginXmlFactory.fromXml(SAMPLE_PLUGIN_XML);
172-
assertThat(descriptor.getName()).isEqualTo(NAME);
173-
assertThat(descriptor.getGroupId()).isEqualTo("org.example");
174173
assertThat(descriptor.getArtifactId()).isEqualTo("sample-plugin");
174+
assertThat(descriptor.getGroupId()).isEqualTo("org.example");
175+
assertThat(descriptor.getName()).isEqualTo(NAME);
175176
assertThat(descriptor.getVersion()).isEqualTo("1.0.0");
176177
}
177178

@@ -184,22 +185,21 @@ void staticToXmlGeneratesValidXml() {
184185
.version("1.0.0")
185186
.build());
186187
assertThat(xml).contains("<name>" + NAME + "</name>");
187-
assertThat(xml).contains("<name>" + NAME + "</name>");
188188
assertThat(xml).contains("<groupId>org.example</groupId>");
189189
assertThat(xml).contains("<artifactId>sample-plugin</artifactId>");
190190
assertThat(xml).contains("<version>1.0.0</version>");
191191
}
192192

193193
@Test
194194
void writeWithFailingWriterThrowsXmlWriterException() {
195-
String unableToWritePlugin = "Unable to write plugin" + randomUUID();
196-
String ioEx = "ioEx" + randomUUID();
195+
String unableToWritePlugin = "Unable to write plugin: " + NAME;
196+
String ioEx = "ioEx: " + NAME;
197197
XmlWriterException exception = assertThatExceptionOfType(XmlWriterException.class)
198198
.isThrownBy(() -> defaultPluginXmlFactory.write(XmlWriterRequest.<PluginDescriptor>builder()
199199
.writer(new Writer() {
200200
@Override
201201
public void write(char[] cbuf, int off, int len) {
202-
throw new XmlWriterException(unableToWritePlugin, null, new IOException(ioEx));
202+
throw new XmlWriterException(NAME, null, new IOException(ioEx));
203203
}
204204

205205
@Override
@@ -213,10 +213,10 @@ public void close() {}
213213
.build())
214214
.build()))
215215
.actual();
216-
assertThat(exception.getMessage()).contains(unableToWritePlugin);
217216
assertThat(exception.getCause()).isInstanceOf(XmlWriterException.class);
218217
assertThat(exception.getCause().getCause().getMessage()).isEqualTo(ioEx);
219-
assertThat(exception.getCause().getMessage()).isEqualTo(unableToWritePlugin);
218+
assertThat(exception.getCause().getMessage()).isEqualTo(NAME);
219+
assertThat(exception.getMessage()).isEqualTo(unableToWritePlugin);
220220
}
221221

222222
@Test
@@ -239,8 +239,8 @@ void readMalformedXmlThrowsXmlReaderException() {
239239
.inputStream(new ByteArrayInputStream("<plugin><name>Broken Plugin".getBytes()))
240240
.build()))
241241
.actual();
242-
assertThat(exception.getMessage()).contains("Unable to read plugin");
243242
assertThat(exception.getCause()).isInstanceOf(WstxEOFException.class);
243+
assertThat(exception.getMessage()).contains("Unable to read plugin");
244244
}
245245

246246
@Test
@@ -258,19 +258,19 @@ void readFromUrlParsesPluginDescriptorCorrectly() throws Exception {
258258
PluginDescriptor descriptor = defaultPluginXmlFactory.read(XmlReaderRequest.builder()
259259
.inputStream(xmlFile.toUri().toURL().openStream())
260260
.build());
261-
assertThat(descriptor.getName()).isEqualTo(NAME);
262-
assertThat(descriptor.getGroupId()).isEqualTo("org.example");
263261
assertThat(descriptor.getArtifactId()).isEqualTo("sample-plugin");
262+
assertThat(descriptor.getGroupId()).isEqualTo("org.example");
263+
assertThat(descriptor.getName()).isEqualTo(NAME);
264264
assertThat(descriptor.getVersion()).isEqualTo("1.0.0");
265265
}
266266

267267
@Test
268268
void testReadWithPath() throws Exception {
269269
Path tempPath = Files.createTempFile("plugin", ".xml");
270270
Files.writeString(tempPath, "<plugin/>");
271-
XmlReaderRequest request = mock(XmlReaderRequest.class);
272-
when(request.getPath()).thenReturn(tempPath);
271+
XmlReaderRequest request = spy(XmlReaderRequest.class);
273272
when(request.getInputStream()).thenReturn(null);
273+
when(request.getPath()).thenReturn(tempPath);
274274
when(request.getReader()).thenReturn(null);
275275
when(request.getURL()).thenReturn(null);
276276
when(request.isAddDefaultEntities()).thenReturn(false);
@@ -283,9 +283,9 @@ void testReadWithPath() throws Exception {
283283
void testReadWithPathUrlDefault() throws Exception {
284284
Path tempPath = Files.createTempFile("plugin", ".xml");
285285
Files.writeString(tempPath, "<plugin/>");
286-
XmlReaderRequest request = mock(XmlReaderRequest.class);
287-
when(request.getPath()).thenReturn(null);
286+
XmlReaderRequest request = spy(XmlReaderRequest.class);
288287
when(request.getInputStream()).thenReturn(null);
288+
when(request.getPath()).thenReturn(null);
289289
when(request.getReader()).thenReturn(null);
290290
when(request.getURL()).thenReturn(tempPath.toUri().toURL());
291291
when(request.isAddDefaultEntities()).thenReturn(false);

0 commit comments

Comments
 (0)