Skip to content

Commit f1cda6d

Browse files
committed
[MNG-5862] Support XInclude
1 parent a8d0532 commit f1cda6d

File tree

5 files changed

+43
-8
lines changed

5 files changed

+43
-8
lines changed

maven-core/src/main/java/org/apache/maven/internal/transformation/ConsumerPomArtifactTransformer.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import javax.inject.Named;
2323
import javax.inject.Singleton;
2424
import javax.xml.stream.XMLInputFactory;
25+
import javax.xml.stream.XMLOutputFactory;
2526
import javax.xml.stream.XMLResolver;
2627
import javax.xml.stream.XMLStreamException;
2728
import javax.xml.stream.XMLStreamReader;
@@ -46,6 +47,7 @@
4647
import org.apache.maven.model.transform.stax.XmlUtils;
4748
import org.apache.maven.project.MavenProject;
4849
import org.apache.maven.project.artifact.ProjectArtifact;
50+
import org.apache.maven.stax.xinclude.XIncludeStreamReader;
4951
import org.codehaus.stax2.XMLInputFactory2;
5052
import org.eclipse.aether.RepositorySystemSession;
5153
import org.eclipse.aether.artifact.Artifact;
@@ -202,6 +204,10 @@ static InputStream transform(Path pomFile, TransformerContext context) throws IO
202204
factory.setProperty(WstxInputProperties.P_ENTITY_RESOLVER, resolver);
203205
factory.setProperty(WstxInputProperties.P_UNDECLARED_ENTITY_RESOLVER, null);
204206
XMLStreamReader reader = factory.createXMLStreamReader(input);
207+
XMLOutputFactory outputFactory = new com.ctc.wstx.stax.WstxOutputFactory();
208+
XIncludeStreamReader.UriLoader loader = location -> Files.newInputStream(Paths.get(location));
209+
reader = new XIncludeStreamReader(
210+
factory, outputFactory, loader, pomFile.toUri().toString(), reader);
205211
reader = new RawToConsumerPomXMLFilterFactory(new DefaultBuildPomXMLFilterFactory(context, true))
206212
.get(reader, pomFile);
207213
return XmlUtils.writeDocument(reader);

maven-model-builder/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ under the License.
6565
<groupId>org.apache.maven</groupId>
6666
<artifactId>maven-model-transform</artifactId>
6767
</dependency>
68+
<dependency>
69+
<groupId>org.apache.maven.shared</groupId>
70+
<artifactId>stax-xinclude</artifactId>
71+
<version>1.0-SNAPSHOT</version>
72+
</dependency>
6873
<!-- Testing -->
6974
<dependency>
7075
<groupId>org.eclipse.sisu</groupId>

maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,9 +1008,15 @@ private org.apache.maven.api.model.Model doReadFileModel(
10081008
}
10091009

10101010
try {
1011-
model = modelProcessor
1012-
.read(modelSource.getInputStream(), options)
1013-
.getDelegate();
1011+
if (modelSource instanceof FileModelSource) {
1012+
model = modelProcessor
1013+
.read(((FileModelSource) modelSource).getFile(), options)
1014+
.getDelegate();
1015+
} else {
1016+
model = modelProcessor
1017+
.read(modelSource.getInputStream(), options)
1018+
.getDelegate();
1019+
}
10141020
} catch (ModelParseException e) {
10151021
if (!strict) {
10161022
throw e;
@@ -1019,9 +1025,15 @@ private org.apache.maven.api.model.Model doReadFileModel(
10191025
options.put(ModelProcessor.IS_STRICT, Boolean.FALSE);
10201026

10211027
try {
1022-
model = modelProcessor
1023-
.read(modelSource.getInputStream(), options)
1024-
.getDelegate();
1028+
if (modelSource instanceof FileModelSource) {
1029+
model = modelProcessor
1030+
.read(((FileModelSource) modelSource).getFile(), options)
1031+
.getDelegate();
1032+
} else {
1033+
model = modelProcessor
1034+
.read(modelSource.getInputStream(), options)
1035+
.getDelegate();
1036+
}
10251037
} catch (ModelParseException ne) {
10261038
// still unreadable even in non-strict mode, rethrow original error
10271039
throw e;

maven-model-builder/src/main/java/org/apache/maven/model/io/DefaultModelReader.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import javax.inject.Singleton;
2424
import javax.xml.stream.Location;
2525
import javax.xml.stream.XMLInputFactory;
26+
import javax.xml.stream.XMLOutputFactory;
2627
import javax.xml.stream.XMLResolver;
2728
import javax.xml.stream.XMLStreamException;
2829
import javax.xml.stream.XMLStreamReader;
@@ -33,6 +34,7 @@
3334
import java.io.Reader;
3435
import java.nio.file.Files;
3536
import java.nio.file.Path;
37+
import java.nio.file.Paths;
3638
import java.util.Map;
3739
import java.util.Objects;
3840

@@ -42,6 +44,7 @@
4244
import org.apache.maven.model.building.ModelSourceTransformer;
4345
import org.apache.maven.model.building.TransformerContext;
4446
import org.apache.maven.model.v4.MavenStaxReader;
47+
import org.apache.maven.stax.xinclude.XIncludeStreamReader;
4548

4649
/**
4750
* Handles deserialization of a model from some kind of textual format like XML.
@@ -109,6 +112,7 @@ private Model read(InputStream input, Path pomFile, Map<String, ?> options) thro
109112
InputSource source = getSource(options);
110113
boolean strict = isStrict(options);
111114
XMLInputFactory factory = new com.ctc.wstx.stax.WstxInputFactory();
115+
XMLOutputFactory outputFactory = new com.ctc.wstx.stax.WstxOutputFactory();
112116
XMLResolver resolver = (String publicID, String systemID, String baseURI, String namespace) -> {
113117
if (systemID != null && systemID.startsWith("file:") && pomFile != null) {
114118
return pomFile.resolveSibling(systemID.substring("file:".length()))
@@ -122,6 +126,13 @@ private Model read(InputStream input, Path pomFile, Map<String, ?> options) thro
122126
factory.setProperty(WstxInputProperties.P_ENTITY_RESOLVER, resolver);
123127
XMLStreamReader parser = factory.createXMLStreamReader(input);
124128

129+
if (pomFile != null && strict) {
130+
XIncludeStreamReader.UriLoader loader = location -> Files.newInputStream(Paths.get(location));
131+
132+
parser = new XIncludeStreamReader(
133+
factory, outputFactory, loader, pomFile.toUri().toString(), parser);
134+
}
135+
125136
TransformerContext context = getTransformerContext(options);
126137
XMLStreamReader transformingParser =
127138
context != null ? transformer.transform(parser, pomFile, context) : parser;

src/mdo/reader-stax.vm

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -548,8 +548,9 @@ public class ${className} {
548548
String name = parser.getAttributeLocalName(i);
549549
String ns = parser.getAttributeNamespace(i);
550550
String value = parser.getAttributeValue(i);
551-
if ("http://www.w3.org/2001/XMLSchema-instance".equals(ns)) {
552-
// just ignore attributes with non-default namespace (for example: xmlns:xsi)
551+
if ("http://www.w3.org/2001/XMLSchema-instance".equals(ns)
552+
|| "http://www.w3.org/XML/1998/namespace".equals(ns)) {
553+
// just ignore attributes with non-default namespace (for example: xsi and xml)
553554
#if ( $class == $root )
554555
} else if ("xmlns".equals(name)) {
555556
// ignore xmlns attribute in root class, which is a reserved attribute name

0 commit comments

Comments
 (0)