Skip to content

Commit cd34ecf

Browse files
author
Vincent Potucek
committed
Cure feature envy of DefaultPluginXmlFactory leveraging OOP
1 parent ec56597 commit cd34ecf

File tree

4 files changed

+342
-44
lines changed

4 files changed

+342
-44
lines changed

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

Lines changed: 7 additions & 0 deletions
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 validateReadability() {
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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import org.apache.maven.api.annotations.Nullable;
2929

3030
/**
31-
* An XML writer request.
31+
* An XML writer
3232
*
3333
* @since 4.0.0
3434
* @param <T> the object type to read
@@ -55,6 +55,13 @@ static <T> XmlWriterRequestBuilder<T> builder() {
5555
return new XmlWriterRequestBuilder<>();
5656
}
5757

58+
default XmlWriterRequest<T> validateWritable() {
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

Lines changed: 31 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,12 @@
1818
*/
1919
package org.apache.maven.impl;
2020

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

2928
import org.apache.maven.api.annotations.Nonnull;
3029
import org.apache.maven.api.di.Named;
@@ -38,65 +37,54 @@
3837
import org.apache.maven.plugin.descriptor.io.PluginDescriptorStaxReader;
3938
import org.apache.maven.plugin.descriptor.io.PluginDescriptorStaxWriter;
4039

41-
import static org.apache.maven.impl.ImplUtils.nonNull;
4240
import static org.apache.maven.impl.StaxLocation.getLocation;
4341
import static org.apache.maven.impl.StaxLocation.getMessage;
4442

4543
@Named
4644
@Singleton
4745
public class DefaultPluginXmlFactory implements PluginXmlFactory {
46+
47+
static final PluginDescriptorStaxWriter WRITER = new PluginDescriptorStaxWriter();
48+
static final PluginDescriptorStaxReader READER = new PluginDescriptorStaxReader();
49+
4850
@Override
4951
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-
}
52+
READER.setAddDefaultEntities(request.isAddDefaultEntities());
53+
var req = request.validateReadability();
5854
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());
68-
}
69-
} else {
70-
try (InputStream is = url.openStream()) {
71-
return xml.read(is, request.isStrict());
55+
if (req.getInputStream() != null) {
56+
return READER.read(req.getInputStream(), req.isStrict());
57+
} else if (req.getReader() != null) {
58+
return READER.read(req.getReader(), req.isStrict());
59+
} else if (req.getPath() != null) {
60+
try (InputStream is = Files.newInputStream(req.getPath())) {
61+
return READER.read(is, req.isStrict());
7262
}
7363
}
74-
} catch (Exception e) {
64+
try (InputStream is = req.getURL().openStream()) {
65+
return READER.read(is, req.isStrict());
66+
}
67+
} catch (IOException | XMLStreamException e) {
7568
throw new XmlReaderException("Unable to read plugin: " + getMessage(e), getLocation(e), e);
7669
}
7770
}
7871

7972
@Override
8073
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-
}
74+
var req = request.validateWritable();
8975
try {
90-
if (writer != null) {
91-
new PluginDescriptorStaxWriter().write(writer, content);
92-
} else if (outputStream != null) {
93-
new PluginDescriptorStaxWriter().write(outputStream, content);
94-
} else {
95-
try (OutputStream os = Files.newOutputStream(path)) {
96-
new PluginDescriptorStaxWriter().write(outputStream, content);
76+
if (req.getWriter() != null) {
77+
WRITER.write(req.getWriter(), req.getContent());
78+
} else if (req.getOutputStream() != null) {
79+
WRITER.write(req.getOutputStream(), req.getContent());
80+
} else if (req.getPath() != null) {
81+
try (OutputStream os = Files.newOutputStream(req.getPath())) {
82+
WRITER.write(os, req.getContent());
9783
}
84+
} else {
85+
throw new IllegalArgumentException("writer, outputStream or path must be non null");
9886
}
99-
} catch (Exception e) {
87+
} catch (XmlWriterException | XMLStreamException | IOException e) {
10088
throw new XmlWriterException("Unable to write plugin: " + getMessage(e), getLocation(e), e);
10189
}
10290
}

0 commit comments

Comments
 (0)