View Javadoc
1   // =================== DO NOT EDIT THIS FILE ====================
2   //  Generated by Modello Velocity from writer-stax.vm
3   //  template, any modifications will be overwritten.
4   // ==============================================================
5   package org.apache.maven.model.v4;
6   
7   import java.io.IOException;
8   import java.io.InputStream;
9   import java.io.OutputStream;
10  import java.io.Reader;
11  import java.io.Writer;
12  import java.text.DateFormat;
13  import java.util.ArrayList;
14  import java.util.Date;
15  import java.util.HashSet;
16  import java.util.List;
17  import java.util.Map;
18  import java.util.Objects;
19  import java.util.Properties;
20  import java.util.Set;
21  import javax.xml.stream.XMLOutputFactory;
22  import javax.xml.stream.XMLStreamException;
23  import javax.xml.stream.XMLStreamWriter;
24  import org.apache.maven.api.annotations.Generated;
25  import org.apache.maven.api.model.InputLocation;
26  import org.apache.maven.api.model.InputLocationTracker;
27  import org.apache.maven.api.xml.XmlNode;
28  import org.apache.maven.internal.xml.XmlNodeBuilder;
29  import org.apache.maven.api.model.Model;
30  import org.apache.maven.api.model.ModelBase;
31  import org.apache.maven.api.model.PluginContainer;
32  import org.apache.maven.api.model.PluginConfiguration;
33  import org.apache.maven.api.model.BuildBase;
34  import org.apache.maven.api.model.Build;
35  import org.apache.maven.api.model.CiManagement;
36  import org.apache.maven.api.model.Notifier;
37  import org.apache.maven.api.model.Contributor;
38  import org.apache.maven.api.model.Dependency;
39  import org.apache.maven.api.model.Developer;
40  import org.apache.maven.api.model.Exclusion;
41  import org.apache.maven.api.model.IssueManagement;
42  import org.apache.maven.api.model.DistributionManagement;
43  import org.apache.maven.api.model.License;
44  import org.apache.maven.api.model.MailingList;
45  import org.apache.maven.api.model.Organization;
46  import org.apache.maven.api.model.PatternSet;
47  import org.apache.maven.api.model.Parent;
48  import org.apache.maven.api.model.Scm;
49  import org.apache.maven.api.model.FileSet;
50  import org.apache.maven.api.model.Resource;
51  import org.apache.maven.api.model.RepositoryBase;
52  import org.apache.maven.api.model.Repository;
53  import org.apache.maven.api.model.DeploymentRepository;
54  import org.apache.maven.api.model.RepositoryPolicy;
55  import org.apache.maven.api.model.Site;
56  import org.apache.maven.api.model.ConfigurationContainer;
57  import org.apache.maven.api.model.Plugin;
58  import org.apache.maven.api.model.PluginExecution;
59  import org.apache.maven.api.model.DependencyManagement;
60  import org.apache.maven.api.model.PluginManagement;
61  import org.apache.maven.api.model.Reporting;
62  import org.apache.maven.api.model.Profile;
63  import org.apache.maven.api.model.Activation;
64  import org.apache.maven.api.model.ActivationProperty;
65  import org.apache.maven.api.model.ActivationOS;
66  import org.apache.maven.api.model.ActivationFile;
67  import org.apache.maven.api.model.ReportPlugin;
68  import org.apache.maven.api.model.ReportSet;
69  import org.apache.maven.api.model.Prerequisites;
70  import org.apache.maven.api.model.Relocation;
71  import org.apache.maven.api.model.Extension;
72  import org.apache.maven.api.model.InputSource;
73  import org.codehaus.stax2.util.StreamWriterDelegate;
74  
75  import static javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI;
76  
77  @Generated
78  public class MavenStaxWriter {
79  
80        //--------------------------/
81       //- Class/Member Variables -/
82      //--------------------------/
83  
84      /**
85       * Default namespace.
86       */
87      private static final String NAMESPACE = "http://maven.apache.org/POM/4.0.0";
88  
89      /**
90       * Default schemaLocation.
91       */
92      private static final String SCHEMA_LOCATION = "https://maven.apache.org/xsd/maven-4.0.0.xsd";
93  
94      /**
95       * Field namespace.
96       */
97      private String namespace = NAMESPACE;
98  
99      /**
100      * Field schemaLocation.
101      */
102     private String schemaLocation = SCHEMA_LOCATION;
103 
104     /**
105      * Field fileComment.
106      */
107     private String fileComment = null;
108 
109     private boolean addLocationInformation = true;
110 
111     /**
112      * Field stringFormatter.
113      */
114     protected InputLocation.StringFormatter stringFormatter;
115 
116       //-----------/
117      //- Methods -/
118     //-----------/
119 
120     /**
121      * Method setNamespace.
122      *
123      * @param namespace the namespace to use.
124      */
125     public void setNamespace(String namespace) {
126         this.namespace = Objects.requireNonNull(namespace);
127     } //-- void setNamespace(String)
128 
129     /**
130      * Method setSchemaLocation.
131      *
132      * @param schemaLocation the schema location to use.
133      */
134     public void setSchemaLocation(String schemaLocation) {
135         this.schemaLocation = Objects.requireNonNull(schemaLocation);
136         } //-- void setSchemaLocation(String)
137 
138     /**
139      * Method setFileComment.
140      *
141      * @param fileComment a fileComment object.
142      */
143     public void setFileComment(String fileComment) {
144         this.fileComment = fileComment;
145     } //-- void setFileComment(String)
146 
147     /**
148      * Method setAddLocationInformation.
149      */
150     public void setAddLocationInformation(boolean addLocationInformation) {
151         this.addLocationInformation = addLocationInformation;
152     } //-- void setAddLocationInformation(String)
153 
154     /**
155      * Method setStringFormatter.
156      *
157      * @param stringFormatter
158      */
159     public void setStringFormatter(InputLocation.StringFormatter stringFormatter) {
160         this.stringFormatter = stringFormatter;
161     } //-- void setStringFormatter(InputLocation.StringFormatter)
162 
163     /**
164      * Method write.
165      *
166      * @param writer a writer object
167      * @param model a Model object
168      * @throws IOException IOException if any
169      */
170     public void write(Writer writer, Model model) throws IOException, XMLStreamException {
171         XMLOutputFactory factory = new com.ctc.wstx.stax.WstxOutputFactory();
172         factory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, false);
173         factory.setProperty(com.ctc.wstx.api.WstxOutputProperties.P_USE_DOUBLE_QUOTES_IN_XML_DECL, true);
174         factory.setProperty(com.ctc.wstx.api.WstxOutputProperties.P_ADD_SPACE_AFTER_EMPTY_ELEM, true);
175         XMLStreamWriter serializer = new IndentingXMLStreamWriter(factory.createXMLStreamWriter(writer));
176         serializer.writeStartDocument(model.getModelEncoding(), null);
177         writeModel("project", model, serializer);
178         serializer.writeEndDocument();
179     } //-- void write(Writer, Model)
180 
181     /**
182      * Method write.
183      *
184      * @param stream a stream object
185      * @param model a Model object
186      * @throws IOException IOException if any
187      */
188     public void write(OutputStream stream, Model model) throws IOException, XMLStreamException {
189         XMLOutputFactory factory = new com.ctc.wstx.stax.WstxOutputFactory();
190         factory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, false);
191         factory.setProperty(com.ctc.wstx.api.WstxOutputProperties.P_USE_DOUBLE_QUOTES_IN_XML_DECL, true);
192         factory.setProperty(com.ctc.wstx.api.WstxOutputProperties.P_ADD_SPACE_AFTER_EMPTY_ELEM, true);
193         XMLStreamWriter serializer = new IndentingXMLStreamWriter(factory.createXMLStreamWriter(stream, model.getModelEncoding()));
194         serializer.writeStartDocument(model.getModelEncoding(), null);
195         writeModel("project", model, serializer);
196         serializer.writeEndDocument();
197     } //-- void write(OutputStream, Model)
198 
199     private void writeModel(String tagName, Model model, XMLStreamWriter serializer)
200         throws IOException, XMLStreamException {
201         if (model != null) {
202             if (this.fileComment != null) {
203                 serializer.writeCharacters("\n");
204                 serializer.writeComment(this.fileComment);
205                 serializer.writeCharacters("\n");
206             }
207             serializer.writeStartElement("", tagName, namespace);
208             serializer.writeNamespace("", namespace);
209             serializer.writeNamespace("xsi", W3C_XML_SCHEMA_INSTANCE_NS_URI);
210             serializer.writeAttribute(W3C_XML_SCHEMA_INSTANCE_NS_URI, "schemaLocation", namespace + " " + schemaLocation);
211             writeAttr("child.project.url.inherit.append.path", model.getChildProjectUrlInheritAppendPath(), serializer);
212             writeAttr("root", model.isRoot() ? "true" : null, serializer);
213             writeAttr("preserve.model.version", model.isPreserveModelVersion() ? "true" : null, serializer);
214             writeTag("modelVersion", null, model.getModelVersion(), serializer, model);
215             writeParent("parent", model.getParent(), serializer);
216             writeTag("groupId", null, model.getGroupId(), serializer, model);
217             writeTag("artifactId", null, model.getArtifactId(), serializer, model);
218             writeTag("version", null, model.getVersion(), serializer, model);
219             writeTag("packaging", "jar", model.getPackaging(), serializer, model);
220             writeTag("name", null, model.getName(), serializer, model);
221             writeTag("description", null, model.getDescription(), serializer, model);
222             writeTag("url", null, model.getUrl(), serializer, model);
223             writeTag("inceptionYear", null, model.getInceptionYear(), serializer, model);
224             writeOrganization("organization", model.getOrganization(), serializer);
225             writeList("licenses", false, model.getLicenses(), serializer, model,
226                     t -> writeLicense("license", t, serializer));
227             writeList("developers", false, model.getDevelopers(), serializer, model,
228                     t -> writeDeveloper("developer", t, serializer));
229             writeList("contributors", false, model.getContributors(), serializer, model,
230                     t -> writeContributor("contributor", t, serializer));
231             writeList("mailingLists", false, model.getMailingLists(), serializer, model,
232                     t -> writeMailingList("mailingList", t, serializer));
233             writePrerequisites("prerequisites", model.getPrerequisites(), serializer);
234             writeList("modules", model.getModules(), serializer, model,
235                     t -> writeTag("module", null, t, serializer, null));
236             writeScm("scm", model.getScm(), serializer);
237             writeIssueManagement("issueManagement", model.getIssueManagement(), serializer);
238             writeCiManagement("ciManagement", model.getCiManagement(), serializer);
239             writeDistributionManagement("distributionManagement", model.getDistributionManagement(), serializer);
240             writeProperties("properties", model.getProperties(), serializer, model);
241             writeDependencyManagement("dependencyManagement", model.getDependencyManagement(), serializer);
242             writeList("dependencies", false, model.getDependencies(), serializer, model,
243                     t -> writeDependency("dependency", t, serializer));
244             writeList("repositories", false, model.getRepositories(), serializer, model,
245                     t -> writeRepository("repository", t, serializer));
246             writeList("pluginRepositories", false, model.getPluginRepositories(), serializer, model,
247                     t -> writeRepository("pluginRepository", t, serializer));
248             writeBuild("build", model.getBuild(), serializer);
249             writeReporting("reporting", model.getReporting(), serializer);
250             writeList("profiles", false, model.getProfiles(), serializer, model,
251                     t -> writeProfile("profile", t, serializer));
252             serializer.writeEndElement();
253         }
254     }
255 
256     private void writeModelBase(String tagName, ModelBase modelBase, XMLStreamWriter serializer)
257         throws IOException, XMLStreamException {
258         if (modelBase != null) {
259             serializer.writeStartElement(namespace, tagName);
260             writeList("modules", modelBase.getModules(), serializer, modelBase,
261                     t -> writeTag("module", null, t, serializer, null));
262             writeDistributionManagement("distributionManagement", modelBase.getDistributionManagement(), serializer);
263             writeProperties("properties", modelBase.getProperties(), serializer, modelBase);
264             writeDependencyManagement("dependencyManagement", modelBase.getDependencyManagement(), serializer);
265             writeList("dependencies", false, modelBase.getDependencies(), serializer, modelBase,
266                     t -> writeDependency("dependency", t, serializer));
267             writeList("repositories", false, modelBase.getRepositories(), serializer, modelBase,
268                     t -> writeRepository("repository", t, serializer));
269             writeList("pluginRepositories", false, modelBase.getPluginRepositories(), serializer, modelBase,
270                     t -> writeRepository("pluginRepository", t, serializer));
271             writeReporting("reporting", modelBase.getReporting(), serializer);
272             serializer.writeEndElement();
273         }
274     }
275 
276     private void writePluginContainer(String tagName, PluginContainer pluginContainer, XMLStreamWriter serializer)
277         throws IOException, XMLStreamException {
278         if (pluginContainer != null) {
279             serializer.writeStartElement(namespace, tagName);
280             writeList("plugins", false, pluginContainer.getPlugins(), serializer, pluginContainer,
281                     t -> writePlugin("plugin", t, serializer));
282             serializer.writeEndElement();
283         }
284     }
285 
286     private void writePluginConfiguration(String tagName, PluginConfiguration pluginConfiguration, XMLStreamWriter serializer)
287         throws IOException, XMLStreamException {
288         if (pluginConfiguration != null) {
289             serializer.writeStartElement(namespace, tagName);
290             writePluginManagement("pluginManagement", pluginConfiguration.getPluginManagement(), serializer);
291             writeList("plugins", false, pluginConfiguration.getPlugins(), serializer, pluginConfiguration,
292                     t -> writePlugin("plugin", t, serializer));
293             serializer.writeEndElement();
294         }
295     }
296 
297     private void writeBuildBase(String tagName, BuildBase buildBase, XMLStreamWriter serializer)
298         throws IOException, XMLStreamException {
299         if (buildBase != null) {
300             serializer.writeStartElement(namespace, tagName);
301             writeTag("defaultGoal", null, buildBase.getDefaultGoal(), serializer, buildBase);
302             writeList("resources", false, buildBase.getResources(), serializer, buildBase,
303                     t -> writeResource("resource", t, serializer));
304             writeList("testResources", false, buildBase.getTestResources(), serializer, buildBase,
305                     t -> writeResource("testResource", t, serializer));
306             writeTag("directory", null, buildBase.getDirectory(), serializer, buildBase);
307             writeTag("finalName", null, buildBase.getFinalName(), serializer, buildBase);
308             writeList("filters", buildBase.getFilters(), serializer, buildBase,
309                     t -> writeTag("filter", null, t, serializer, null));
310             writePluginManagement("pluginManagement", buildBase.getPluginManagement(), serializer);
311             writeList("plugins", false, buildBase.getPlugins(), serializer, buildBase,
312                     t -> writePlugin("plugin", t, serializer));
313             serializer.writeEndElement();
314         }
315     }
316 
317     private void writeBuild(String tagName, Build build, XMLStreamWriter serializer)
318         throws IOException, XMLStreamException {
319         if (build != null) {
320             serializer.writeStartElement(namespace, tagName);
321             writeTag("sourceDirectory", null, build.getSourceDirectory(), serializer, build);
322             writeTag("scriptSourceDirectory", null, build.getScriptSourceDirectory(), serializer, build);
323             writeTag("testSourceDirectory", null, build.getTestSourceDirectory(), serializer, build);
324             writeTag("outputDirectory", null, build.getOutputDirectory(), serializer, build);
325             writeTag("testOutputDirectory", null, build.getTestOutputDirectory(), serializer, build);
326             writeList("extensions", false, build.getExtensions(), serializer, build,
327                     t -> writeExtension("extension", t, serializer));
328             writeTag("defaultGoal", null, build.getDefaultGoal(), serializer, build);
329             writeList("resources", false, build.getResources(), serializer, build,
330                     t -> writeResource("resource", t, serializer));
331             writeList("testResources", false, build.getTestResources(), serializer, build,
332                     t -> writeResource("testResource", t, serializer));
333             writeTag("directory", null, build.getDirectory(), serializer, build);
334             writeTag("finalName", null, build.getFinalName(), serializer, build);
335             writeList("filters", build.getFilters(), serializer, build,
336                     t -> writeTag("filter", null, t, serializer, null));
337             writePluginManagement("pluginManagement", build.getPluginManagement(), serializer);
338             writeList("plugins", false, build.getPlugins(), serializer, build,
339                     t -> writePlugin("plugin", t, serializer));
340             serializer.writeEndElement();
341         }
342     }
343 
344     private void writeCiManagement(String tagName, CiManagement ciManagement, XMLStreamWriter serializer)
345         throws IOException, XMLStreamException {
346         if (ciManagement != null) {
347             serializer.writeStartElement(namespace, tagName);
348             writeTag("system", null, ciManagement.getSystem(), serializer, ciManagement);
349             writeTag("url", null, ciManagement.getUrl(), serializer, ciManagement);
350             writeList("notifiers", false, ciManagement.getNotifiers(), serializer, ciManagement,
351                     t -> writeNotifier("notifier", t, serializer));
352             serializer.writeEndElement();
353         }
354     }
355 
356     private void writeNotifier(String tagName, Notifier notifier, XMLStreamWriter serializer)
357         throws IOException, XMLStreamException {
358         if (notifier != null) {
359             serializer.writeStartElement(namespace, tagName);
360             writeTag("type", "mail", notifier.getType(), serializer, notifier);
361             writeTag("sendOnError", "true", notifier.isSendOnError() ? null : "false", serializer, notifier);
362             writeTag("sendOnFailure", "true", notifier.isSendOnFailure() ? null : "false", serializer, notifier);
363             writeTag("sendOnSuccess", "true", notifier.isSendOnSuccess() ? null : "false", serializer, notifier);
364             writeTag("sendOnWarning", "true", notifier.isSendOnWarning() ? null : "false", serializer, notifier);
365             writeTag("address", null, notifier.getAddress(), serializer, notifier);
366             writeProperties("configuration", notifier.getConfiguration(), serializer, notifier);
367             serializer.writeEndElement();
368         }
369     }
370 
371     private void writeContributor(String tagName, Contributor contributor, XMLStreamWriter serializer)
372         throws IOException, XMLStreamException {
373         if (contributor != null) {
374             serializer.writeStartElement(namespace, tagName);
375             writeTag("name", null, contributor.getName(), serializer, contributor);
376             writeTag("email", null, contributor.getEmail(), serializer, contributor);
377             writeTag("url", null, contributor.getUrl(), serializer, contributor);
378             writeTag("organization", null, contributor.getOrganization(), serializer, contributor);
379             writeTag("organizationUrl", null, contributor.getOrganizationUrl(), serializer, contributor);
380             writeList("roles", contributor.getRoles(), serializer, contributor,
381                     t -> writeTag("role", null, t, serializer, null));
382             writeTag("timezone", null, contributor.getTimezone(), serializer, contributor);
383             writeProperties("properties", contributor.getProperties(), serializer, contributor);
384             serializer.writeEndElement();
385         }
386     }
387 
388     private void writeDependency(String tagName, Dependency dependency, XMLStreamWriter serializer)
389         throws IOException, XMLStreamException {
390         if (dependency != null) {
391             serializer.writeStartElement(namespace, tagName);
392             writeTag("groupId", null, dependency.getGroupId(), serializer, dependency);
393             writeTag("artifactId", null, dependency.getArtifactId(), serializer, dependency);
394             writeTag("version", null, dependency.getVersion(), serializer, dependency);
395             writeTag("type", "jar", dependency.getType(), serializer, dependency);
396             writeTag("classifier", null, dependency.getClassifier(), serializer, dependency);
397             writeTag("scope", null, dependency.getScope(), serializer, dependency);
398             writeTag("systemPath", null, dependency.getSystemPath(), serializer, dependency);
399             writeList("exclusions", false, dependency.getExclusions(), serializer, dependency,
400                     t -> writeExclusion("exclusion", t, serializer));
401             writeTag("optional", null, dependency.getOptional(), serializer, dependency);
402             serializer.writeEndElement();
403         }
404     }
405 
406     private void writeDeveloper(String tagName, Developer developer, XMLStreamWriter serializer)
407         throws IOException, XMLStreamException {
408         if (developer != null) {
409             serializer.writeStartElement(namespace, tagName);
410             writeTag("id", null, developer.getId(), serializer, developer);
411             writeTag("name", null, developer.getName(), serializer, developer);
412             writeTag("email", null, developer.getEmail(), serializer, developer);
413             writeTag("url", null, developer.getUrl(), serializer, developer);
414             writeTag("organization", null, developer.getOrganization(), serializer, developer);
415             writeTag("organizationUrl", null, developer.getOrganizationUrl(), serializer, developer);
416             writeList("roles", developer.getRoles(), serializer, developer,
417                     t -> writeTag("role", null, t, serializer, null));
418             writeTag("timezone", null, developer.getTimezone(), serializer, developer);
419             writeProperties("properties", developer.getProperties(), serializer, developer);
420             serializer.writeEndElement();
421         }
422     }
423 
424     private void writeExclusion(String tagName, Exclusion exclusion, XMLStreamWriter serializer)
425         throws IOException, XMLStreamException {
426         if (exclusion != null) {
427             serializer.writeStartElement(namespace, tagName);
428             writeTag("groupId", null, exclusion.getGroupId(), serializer, exclusion);
429             writeTag("artifactId", null, exclusion.getArtifactId(), serializer, exclusion);
430             serializer.writeEndElement();
431         }
432     }
433 
434     private void writeIssueManagement(String tagName, IssueManagement issueManagement, XMLStreamWriter serializer)
435         throws IOException, XMLStreamException {
436         if (issueManagement != null) {
437             serializer.writeStartElement(namespace, tagName);
438             writeTag("system", null, issueManagement.getSystem(), serializer, issueManagement);
439             writeTag("url", null, issueManagement.getUrl(), serializer, issueManagement);
440             serializer.writeEndElement();
441         }
442     }
443 
444     private void writeDistributionManagement(String tagName, DistributionManagement distributionManagement, XMLStreamWriter serializer)
445         throws IOException, XMLStreamException {
446         if (distributionManagement != null) {
447             serializer.writeStartElement(namespace, tagName);
448             writeDeploymentRepository("repository", distributionManagement.getRepository(), serializer);
449             writeDeploymentRepository("snapshotRepository", distributionManagement.getSnapshotRepository(), serializer);
450             writeSite("site", distributionManagement.getSite(), serializer);
451             writeTag("downloadUrl", null, distributionManagement.getDownloadUrl(), serializer, distributionManagement);
452             writeRelocation("relocation", distributionManagement.getRelocation(), serializer);
453             writeTag("status", null, distributionManagement.getStatus(), serializer, distributionManagement);
454             serializer.writeEndElement();
455         }
456     }
457 
458     private void writeLicense(String tagName, License license, XMLStreamWriter serializer)
459         throws IOException, XMLStreamException {
460         if (license != null) {
461             serializer.writeStartElement(namespace, tagName);
462             writeTag("name", null, license.getName(), serializer, license);
463             writeTag("url", null, license.getUrl(), serializer, license);
464             writeTag("distribution", null, license.getDistribution(), serializer, license);
465             writeTag("comments", null, license.getComments(), serializer, license);
466             serializer.writeEndElement();
467         }
468     }
469 
470     private void writeMailingList(String tagName, MailingList mailingList, XMLStreamWriter serializer)
471         throws IOException, XMLStreamException {
472         if (mailingList != null) {
473             serializer.writeStartElement(namespace, tagName);
474             writeTag("name", null, mailingList.getName(), serializer, mailingList);
475             writeTag("subscribe", null, mailingList.getSubscribe(), serializer, mailingList);
476             writeTag("unsubscribe", null, mailingList.getUnsubscribe(), serializer, mailingList);
477             writeTag("post", null, mailingList.getPost(), serializer, mailingList);
478             writeTag("archive", null, mailingList.getArchive(), serializer, mailingList);
479             writeList("otherArchives", mailingList.getOtherArchives(), serializer, mailingList,
480                     t -> writeTag("otherArchive", null, t, serializer, null));
481             serializer.writeEndElement();
482         }
483     }
484 
485     private void writeOrganization(String tagName, Organization organization, XMLStreamWriter serializer)
486         throws IOException, XMLStreamException {
487         if (organization != null) {
488             serializer.writeStartElement(namespace, tagName);
489             writeTag("name", null, organization.getName(), serializer, organization);
490             writeTag("url", null, organization.getUrl(), serializer, organization);
491             serializer.writeEndElement();
492         }
493     }
494 
495     private void writePatternSet(String tagName, PatternSet patternSet, XMLStreamWriter serializer)
496         throws IOException, XMLStreamException {
497         if (patternSet != null) {
498             serializer.writeStartElement(namespace, tagName);
499             writeList("includes", patternSet.getIncludes(), serializer, patternSet,
500                     t -> writeTag("include", null, t, serializer, null));
501             writeList("excludes", patternSet.getExcludes(), serializer, patternSet,
502                     t -> writeTag("exclude", null, t, serializer, null));
503             serializer.writeEndElement();
504         }
505     }
506 
507     private void writeParent(String tagName, Parent parent, XMLStreamWriter serializer)
508         throws IOException, XMLStreamException {
509         if (parent != null) {
510             serializer.writeStartElement(namespace, tagName);
511             writeTag("groupId", null, parent.getGroupId(), serializer, parent);
512             writeTag("artifactId", null, parent.getArtifactId(), serializer, parent);
513             writeTag("version", null, parent.getVersion(), serializer, parent);
514             writeTag("relativePath", "..", parent.getRelativePath(), serializer, parent);
515             serializer.writeEndElement();
516         }
517     }
518 
519     private void writeScm(String tagName, Scm scm, XMLStreamWriter serializer)
520         throws IOException, XMLStreamException {
521         if (scm != null) {
522             serializer.writeStartElement(namespace, tagName);
523             writeAttr("child.scm.connection.inherit.append.path", scm.getChildScmConnectionInheritAppendPath(), serializer);
524             writeAttr("child.scm.developerConnection.inherit.append.path", scm.getChildScmDeveloperConnectionInheritAppendPath(), serializer);
525             writeAttr("child.scm.url.inherit.append.path", scm.getChildScmUrlInheritAppendPath(), serializer);
526             writeTag("connection", null, scm.getConnection(), serializer, scm);
527             writeTag("developerConnection", null, scm.getDeveloperConnection(), serializer, scm);
528             writeTag("tag", "HEAD", scm.getTag(), serializer, scm);
529             writeTag("url", null, scm.getUrl(), serializer, scm);
530             serializer.writeEndElement();
531         }
532     }
533 
534     private void writeFileSet(String tagName, FileSet fileSet, XMLStreamWriter serializer)
535         throws IOException, XMLStreamException {
536         if (fileSet != null) {
537             serializer.writeStartElement(namespace, tagName);
538             writeTag("directory", null, fileSet.getDirectory(), serializer, fileSet);
539             writeList("includes", fileSet.getIncludes(), serializer, fileSet,
540                     t -> writeTag("include", null, t, serializer, null));
541             writeList("excludes", fileSet.getExcludes(), serializer, fileSet,
542                     t -> writeTag("exclude", null, t, serializer, null));
543             serializer.writeEndElement();
544         }
545     }
546 
547     private void writeResource(String tagName, Resource resource, XMLStreamWriter serializer)
548         throws IOException, XMLStreamException {
549         if (resource != null) {
550             serializer.writeStartElement(namespace, tagName);
551             writeTag("targetPath", null, resource.getTargetPath(), serializer, resource);
552             writeTag("filtering", null, resource.getFiltering(), serializer, resource);
553             writeTag("directory", null, resource.getDirectory(), serializer, resource);
554             writeList("includes", resource.getIncludes(), serializer, resource,
555                     t -> writeTag("include", null, t, serializer, null));
556             writeList("excludes", resource.getExcludes(), serializer, resource,
557                     t -> writeTag("exclude", null, t, serializer, null));
558             serializer.writeEndElement();
559         }
560     }
561 
562     private void writeRepositoryBase(String tagName, RepositoryBase repositoryBase, XMLStreamWriter serializer)
563         throws IOException, XMLStreamException {
564         if (repositoryBase != null) {
565             serializer.writeStartElement(namespace, tagName);
566             writeTag("id", null, repositoryBase.getId(), serializer, repositoryBase);
567             writeTag("name", null, repositoryBase.getName(), serializer, repositoryBase);
568             writeTag("url", null, repositoryBase.getUrl(), serializer, repositoryBase);
569             writeTag("layout", "default", repositoryBase.getLayout(), serializer, repositoryBase);
570             serializer.writeEndElement();
571         }
572     }
573 
574     private void writeRepository(String tagName, Repository repository, XMLStreamWriter serializer)
575         throws IOException, XMLStreamException {
576         if (repository != null) {
577             serializer.writeStartElement(namespace, tagName);
578             writeRepositoryPolicy("releases", repository.getReleases(), serializer);
579             writeRepositoryPolicy("snapshots", repository.getSnapshots(), serializer);
580             writeTag("id", null, repository.getId(), serializer, repository);
581             writeTag("name", null, repository.getName(), serializer, repository);
582             writeTag("url", null, repository.getUrl(), serializer, repository);
583             writeTag("layout", "default", repository.getLayout(), serializer, repository);
584             serializer.writeEndElement();
585         }
586     }
587 
588     private void writeDeploymentRepository(String tagName, DeploymentRepository deploymentRepository, XMLStreamWriter serializer)
589         throws IOException, XMLStreamException {
590         if (deploymentRepository != null) {
591             serializer.writeStartElement(namespace, tagName);
592             writeTag("uniqueVersion", "true", deploymentRepository.isUniqueVersion() ? null : "false", serializer, deploymentRepository);
593             writeRepositoryPolicy("releases", deploymentRepository.getReleases(), serializer);
594             writeRepositoryPolicy("snapshots", deploymentRepository.getSnapshots(), serializer);
595             writeTag("id", null, deploymentRepository.getId(), serializer, deploymentRepository);
596             writeTag("name", null, deploymentRepository.getName(), serializer, deploymentRepository);
597             writeTag("url", null, deploymentRepository.getUrl(), serializer, deploymentRepository);
598             writeTag("layout", "default", deploymentRepository.getLayout(), serializer, deploymentRepository);
599             serializer.writeEndElement();
600         }
601     }
602 
603     private void writeRepositoryPolicy(String tagName, RepositoryPolicy repositoryPolicy, XMLStreamWriter serializer)
604         throws IOException, XMLStreamException {
605         if (repositoryPolicy != null) {
606             serializer.writeStartElement(namespace, tagName);
607             writeTag("enabled", null, repositoryPolicy.getEnabled(), serializer, repositoryPolicy);
608             writeTag("updatePolicy", null, repositoryPolicy.getUpdatePolicy(), serializer, repositoryPolicy);
609             writeTag("checksumPolicy", null, repositoryPolicy.getChecksumPolicy(), serializer, repositoryPolicy);
610             serializer.writeEndElement();
611         }
612     }
613 
614     private void writeSite(String tagName, Site site, XMLStreamWriter serializer)
615         throws IOException, XMLStreamException {
616         if (site != null) {
617             serializer.writeStartElement(namespace, tagName);
618             writeAttr("child.site.url.inherit.append.path", site.getChildSiteUrlInheritAppendPath(), serializer);
619             writeTag("id", null, site.getId(), serializer, site);
620             writeTag("name", null, site.getName(), serializer, site);
621             writeTag("url", null, site.getUrl(), serializer, site);
622             serializer.writeEndElement();
623         }
624     }
625 
626     private void writeConfigurationContainer(String tagName, ConfigurationContainer configurationContainer, XMLStreamWriter serializer)
627         throws IOException, XMLStreamException {
628         if (configurationContainer != null) {
629             serializer.writeStartElement(namespace, tagName);
630             writeTag("inherited", null, configurationContainer.getInherited(), serializer, configurationContainer);
631             writeDom(configurationContainer.getConfiguration(), serializer);
632             serializer.writeEndElement();
633         }
634     }
635 
636     private void writePlugin(String tagName, Plugin plugin, XMLStreamWriter serializer)
637         throws IOException, XMLStreamException {
638         if (plugin != null) {
639             serializer.writeStartElement(namespace, tagName);
640             writeTag("groupId", "org.apache.maven.plugins", plugin.getGroupId(), serializer, plugin);
641             writeTag("artifactId", null, plugin.getArtifactId(), serializer, plugin);
642             writeTag("version", null, plugin.getVersion(), serializer, plugin);
643             writeTag("extensions", null, plugin.getExtensions(), serializer, plugin);
644             writeList("executions", false, plugin.getExecutions(), serializer, plugin,
645                     t -> writePluginExecution("execution", t, serializer));
646             writeList("dependencies", false, plugin.getDependencies(), serializer, plugin,
647                     t -> writeDependency("dependency", t, serializer));
648             writeTag("inherited", null, plugin.getInherited(), serializer, plugin);
649             writeDom(plugin.getConfiguration(), serializer);
650             serializer.writeEndElement();
651         }
652     }
653 
654     private void writePluginExecution(String tagName, PluginExecution pluginExecution, XMLStreamWriter serializer)
655         throws IOException, XMLStreamException {
656         if (pluginExecution != null) {
657             serializer.writeStartElement(namespace, tagName);
658             writeTag("id", "default", pluginExecution.getId(), serializer, pluginExecution);
659             writeTag("phase", null, pluginExecution.getPhase(), serializer, pluginExecution);
660             writeTag("priority", "0", Integer.toString(pluginExecution.getPriority()), serializer, pluginExecution);
661             writeList("goals", pluginExecution.getGoals(), serializer, pluginExecution,
662                     t -> writeTag("goal", null, t, serializer, null));
663             writeTag("inherited", null, pluginExecution.getInherited(), serializer, pluginExecution);
664             writeDom(pluginExecution.getConfiguration(), serializer);
665             serializer.writeEndElement();
666         }
667     }
668 
669     private void writeDependencyManagement(String tagName, DependencyManagement dependencyManagement, XMLStreamWriter serializer)
670         throws IOException, XMLStreamException {
671         if (dependencyManagement != null) {
672             serializer.writeStartElement(namespace, tagName);
673             writeList("dependencies", false, dependencyManagement.getDependencies(), serializer, dependencyManagement,
674                     t -> writeDependency("dependency", t, serializer));
675             serializer.writeEndElement();
676         }
677     }
678 
679     private void writePluginManagement(String tagName, PluginManagement pluginManagement, XMLStreamWriter serializer)
680         throws IOException, XMLStreamException {
681         if (pluginManagement != null) {
682             serializer.writeStartElement(namespace, tagName);
683             writeList("plugins", false, pluginManagement.getPlugins(), serializer, pluginManagement,
684                     t -> writePlugin("plugin", t, serializer));
685             serializer.writeEndElement();
686         }
687     }
688 
689     private void writeReporting(String tagName, Reporting reporting, XMLStreamWriter serializer)
690         throws IOException, XMLStreamException {
691         if (reporting != null) {
692             serializer.writeStartElement(namespace, tagName);
693             writeTag("excludeDefaults", null, reporting.getExcludeDefaults(), serializer, reporting);
694             writeTag("outputDirectory", null, reporting.getOutputDirectory(), serializer, reporting);
695             writeList("plugins", false, reporting.getPlugins(), serializer, reporting,
696                     t -> writeReportPlugin("plugin", t, serializer));
697             serializer.writeEndElement();
698         }
699     }
700 
701     private void writeProfile(String tagName, Profile profile, XMLStreamWriter serializer)
702         throws IOException, XMLStreamException {
703         if (profile != null) {
704             serializer.writeStartElement(namespace, tagName);
705             writeTag("id", "default", profile.getId(), serializer, profile);
706             writeActivation("activation", profile.getActivation(), serializer);
707             writeBuildBase("build", profile.getBuild(), serializer);
708             writeList("modules", profile.getModules(), serializer, profile,
709                     t -> writeTag("module", null, t, serializer, null));
710             writeDistributionManagement("distributionManagement", profile.getDistributionManagement(), serializer);
711             writeProperties("properties", profile.getProperties(), serializer, profile);
712             writeDependencyManagement("dependencyManagement", profile.getDependencyManagement(), serializer);
713             writeList("dependencies", false, profile.getDependencies(), serializer, profile,
714                     t -> writeDependency("dependency", t, serializer));
715             writeList("repositories", false, profile.getRepositories(), serializer, profile,
716                     t -> writeRepository("repository", t, serializer));
717             writeList("pluginRepositories", false, profile.getPluginRepositories(), serializer, profile,
718                     t -> writeRepository("pluginRepository", t, serializer));
719             writeReporting("reporting", profile.getReporting(), serializer);
720             serializer.writeEndElement();
721         }
722     }
723 
724     private void writeActivation(String tagName, Activation activation, XMLStreamWriter serializer)
725         throws IOException, XMLStreamException {
726         if (activation != null) {
727             serializer.writeStartElement(namespace, tagName);
728             writeTag("activeByDefault", "false", activation.isActiveByDefault() ? "true" : null, serializer, activation);
729             writeTag("jdk", null, activation.getJdk(), serializer, activation);
730             writeActivationOS("os", activation.getOs(), serializer);
731             writeActivationProperty("property", activation.getProperty(), serializer);
732             writeActivationFile("file", activation.getFile(), serializer);
733             serializer.writeEndElement();
734         }
735     }
736 
737     private void writeActivationProperty(String tagName, ActivationProperty activationProperty, XMLStreamWriter serializer)
738         throws IOException, XMLStreamException {
739         if (activationProperty != null) {
740             serializer.writeStartElement(namespace, tagName);
741             writeTag("name", null, activationProperty.getName(), serializer, activationProperty);
742             writeTag("value", null, activationProperty.getValue(), serializer, activationProperty);
743             serializer.writeEndElement();
744         }
745     }
746 
747     private void writeActivationOS(String tagName, ActivationOS activationOS, XMLStreamWriter serializer)
748         throws IOException, XMLStreamException {
749         if (activationOS != null) {
750             serializer.writeStartElement(namespace, tagName);
751             writeTag("name", null, activationOS.getName(), serializer, activationOS);
752             writeTag("family", null, activationOS.getFamily(), serializer, activationOS);
753             writeTag("arch", null, activationOS.getArch(), serializer, activationOS);
754             writeTag("version", null, activationOS.getVersion(), serializer, activationOS);
755             serializer.writeEndElement();
756         }
757     }
758 
759     private void writeActivationFile(String tagName, ActivationFile activationFile, XMLStreamWriter serializer)
760         throws IOException, XMLStreamException {
761         if (activationFile != null) {
762             serializer.writeStartElement(namespace, tagName);
763             writeTag("missing", null, activationFile.getMissing(), serializer, activationFile);
764             writeTag("exists", null, activationFile.getExists(), serializer, activationFile);
765             serializer.writeEndElement();
766         }
767     }
768 
769     private void writeReportPlugin(String tagName, ReportPlugin reportPlugin, XMLStreamWriter serializer)
770         throws IOException, XMLStreamException {
771         if (reportPlugin != null) {
772             serializer.writeStartElement(namespace, tagName);
773             writeTag("groupId", "org.apache.maven.plugins", reportPlugin.getGroupId(), serializer, reportPlugin);
774             writeTag("artifactId", null, reportPlugin.getArtifactId(), serializer, reportPlugin);
775             writeTag("version", null, reportPlugin.getVersion(), serializer, reportPlugin);
776             writeList("reportSets", false, reportPlugin.getReportSets(), serializer, reportPlugin,
777                     t -> writeReportSet("reportSet", t, serializer));
778             writeTag("inherited", null, reportPlugin.getInherited(), serializer, reportPlugin);
779             writeDom(reportPlugin.getConfiguration(), serializer);
780             serializer.writeEndElement();
781         }
782     }
783 
784     private void writeReportSet(String tagName, ReportSet reportSet, XMLStreamWriter serializer)
785         throws IOException, XMLStreamException {
786         if (reportSet != null) {
787             serializer.writeStartElement(namespace, tagName);
788             writeTag("id", "default", reportSet.getId(), serializer, reportSet);
789             writeList("reports", reportSet.getReports(), serializer, reportSet,
790                     t -> writeTag("report", null, t, serializer, null));
791             writeTag("inherited", null, reportSet.getInherited(), serializer, reportSet);
792             writeDom(reportSet.getConfiguration(), serializer);
793             serializer.writeEndElement();
794         }
795     }
796 
797     private void writePrerequisites(String tagName, Prerequisites prerequisites, XMLStreamWriter serializer)
798         throws IOException, XMLStreamException {
799         if (prerequisites != null) {
800             serializer.writeStartElement(namespace, tagName);
801             writeTag("maven", "2.0", prerequisites.getMaven(), serializer, prerequisites);
802             serializer.writeEndElement();
803         }
804     }
805 
806     private void writeRelocation(String tagName, Relocation relocation, XMLStreamWriter serializer)
807         throws IOException, XMLStreamException {
808         if (relocation != null) {
809             serializer.writeStartElement(namespace, tagName);
810             writeTag("groupId", null, relocation.getGroupId(), serializer, relocation);
811             writeTag("artifactId", null, relocation.getArtifactId(), serializer, relocation);
812             writeTag("version", null, relocation.getVersion(), serializer, relocation);
813             writeTag("message", null, relocation.getMessage(), serializer, relocation);
814             serializer.writeEndElement();
815         }
816     }
817 
818     private void writeExtension(String tagName, Extension extension, XMLStreamWriter serializer)
819         throws IOException, XMLStreamException {
820         if (extension != null) {
821             serializer.writeStartElement(namespace, tagName);
822             writeTag("groupId", null, extension.getGroupId(), serializer, extension);
823             writeTag("artifactId", null, extension.getArtifactId(), serializer, extension);
824             writeTag("version", null, extension.getVersion(), serializer, extension);
825             writeDom(extension.getConfiguration(), serializer);
826             serializer.writeEndElement();
827         }
828     }
829 
830     @FunctionalInterface
831     private interface ElementWriter<T> {
832         public void write(T t) throws IOException, XMLStreamException;
833     }
834 
835     private <T> void writeList(String tagName, List<T> list, XMLStreamWriter serializer, InputLocationTracker locationTracker, ElementWriter<T> writer) throws IOException, XMLStreamException {
836         writeList(tagName, false, list, serializer, locationTracker, writer);
837     }
838 
839     private <T> void writeList(String tagName, boolean flat, List<T> list, XMLStreamWriter serializer, InputLocationTracker locationTracker, ElementWriter<T> writer) throws IOException, XMLStreamException {
840         if (list != null && !list.isEmpty()) {
841             if (!flat) {
842                 serializer.writeStartElement(namespace, tagName);
843             }
844             int index = 0;
845             InputLocation location = locationTracker != null ? locationTracker.getLocation(tagName) : null;
846             for (T t : list) {
847                 writer.write(t);
848                 writeLocationTracking(location, Integer.valueOf(index++), serializer);
849             }
850             if (!flat) {
851                 serializer.writeEndElement();
852             }
853         }
854     }
855 
856     private <T> void writeProperties(String tagName, Map<String, String> props, XMLStreamWriter serializer, InputLocationTracker locationTracker) throws IOException, XMLStreamException {
857         if (props != null && !props.isEmpty()) {
858             serializer.writeStartElement(namespace, tagName);
859             InputLocation location = locationTracker != null ? locationTracker.getLocation(tagName) : null;
860             for (Map.Entry<String, String> entry : props.entrySet()) {
861                 String key = entry.getKey();
862                 writeTag(key, null, entry.getValue(), serializer, null);
863                 writeLocationTracking(location, key, serializer);
864             }
865             serializer.writeEndElement();
866         }
867     }
868 
869     private void writeDom(XmlNode dom, XMLStreamWriter serializer) throws IOException, XMLStreamException {
870         if (dom != null) {
871             serializer.writeStartElement(namespace, dom.getName());
872             for (Map.Entry<String, String> attr : dom.getAttributes().entrySet()) {
873                 if (attr.getKey().startsWith("xml:")) {
874                     serializer.writeAttribute("http://www.w3.org/XML/1998/namespace",
875                     attr.getKey().substring(4), attr.getValue());
876                 } else {
877                     serializer.writeAttribute(attr.getKey(), attr.getValue());
878                 }
879             }
880             for (XmlNode child : dom.getChildren()) {
881                 writeDom(child, serializer);
882             }
883             String value = dom.getValue();
884             if (value != null) {
885                 serializer.writeCharacters(value);
886             }
887             serializer.writeEndElement();
888             if (addLocationInformation && dom.getInputLocation() instanceof InputLocation && dom.getChildren().isEmpty()) {
889                 serializer.writeComment(toString((InputLocation) dom.getInputLocation()));
890             }
891         }
892     }
893 
894     private void writeTag(String tagName, String defaultValue, String value, XMLStreamWriter serializer, InputLocationTracker locationTracker) throws IOException, XMLStreamException {
895         if (value != null && !Objects.equals(defaultValue, value)) {
896             serializer.writeStartElement(namespace, tagName);
897             serializer.writeCharacters(value);
898             serializer.writeEndElement();
899             writeLocationTracking(locationTracker, tagName, serializer);
900         }
901     }
902 
903     private void writeAttr(String attrName, String value, XMLStreamWriter serializer) throws IOException, XMLStreamException {
904         if (value != null) {
905             serializer.writeAttribute(attrName, value);
906         }
907     }
908 
909     /**
910      * Method writeLocationTracking.
911      *
912      * @param locationTracker
913      * @param serializer
914      * @param key
915      * @throws IOException
916      */
917     protected void writeLocationTracking(InputLocationTracker locationTracker, Object key, XMLStreamWriter serializer) throws IOException, XMLStreamException {
918         if (addLocationInformation) {
919             InputLocation location = (locationTracker == null) ? null : locationTracker.getLocation(key);
920             if (location != null) {
921                 serializer.writeComment(toString(location));
922             }
923         }
924     } //-- void writeLocationTracking(InputLocationTracker, Object, XMLStreamWriter)
925 
926     /**
927      * Method toString.
928      *
929      * @param location
930      * @return String
931      */
932     protected String toString(InputLocation location) {
933         if (stringFormatter != null) {
934             return stringFormatter.toString(location);
935         }
936         if (location.getSource() != null) {
937             return ' ' + location.getSource().toString() + ':' + location.getLineNumber() + ' ';
938         } else {
939             return " " + location.getLineNumber() + " ";
940         }
941     } //-- String toString(InputLocation)
942 
943     static class IndentingXMLStreamWriter extends StreamWriterDelegate {
944 
945         int depth = 0;
946         boolean hasChildren = false;
947 
948         public IndentingXMLStreamWriter(XMLStreamWriter parent) {
949             super(parent);
950         }
951 
952         @Override
953         public void writeEmptyElement(String localName) throws XMLStreamException {
954             indent();
955             super.writeEmptyElement(localName);
956             hasChildren = true;
957         }
958 
959         @Override
960         public void writeEmptyElement(String namespaceURI, String localName) throws XMLStreamException {
961             indent();
962             super.writeEmptyElement(namespaceURI, localName);
963             hasChildren = true;
964         }
965 
966         @Override
967         public void writeEmptyElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
968             indent();
969             super.writeEmptyElement(prefix, localName, namespaceURI);
970             hasChildren = true;
971         }
972 
973         @Override
974         public void writeStartElement(String localName) throws XMLStreamException {
975             indent();
976             super.writeStartElement(localName);
977             depth++;
978             hasChildren = false;
979         }
980 
981         @Override
982         public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException {
983             indent();
984             super.writeStartElement(namespaceURI, localName);
985             depth++;
986             hasChildren = false;
987         }
988 
989         @Override
990         public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
991             indent();
992             super.writeStartElement(prefix, localName, namespaceURI);
993             depth++;
994             hasChildren = false;
995         }
996 
997         @Override
998         public void writeEndElement() throws XMLStreamException {
999             depth--;
1000             if (hasChildren) {
1001                 indent();
1002             }
1003             super.writeEndElement();
1004             hasChildren = true;
1005         }
1006 
1007         private void indent() throws XMLStreamException {
1008             super.writeCharacters("\n");
1009             for (int i = 0; i < depth; i++) {
1010                 super.writeCharacters("  ");
1011             }
1012         }
1013     }
1014 }