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             writeTag("packaging", null, activation.getPackaging(), serializer, activation);
734             serializer.writeEndElement();
735         }
736     }
737 
738     private void writeActivationProperty(String tagName, ActivationProperty activationProperty, XMLStreamWriter serializer)
739         throws IOException, XMLStreamException {
740         if (activationProperty != null) {
741             serializer.writeStartElement(namespace, tagName);
742             writeTag("name", null, activationProperty.getName(), serializer, activationProperty);
743             writeTag("value", null, activationProperty.getValue(), serializer, activationProperty);
744             serializer.writeEndElement();
745         }
746     }
747 
748     private void writeActivationOS(String tagName, ActivationOS activationOS, XMLStreamWriter serializer)
749         throws IOException, XMLStreamException {
750         if (activationOS != null) {
751             serializer.writeStartElement(namespace, tagName);
752             writeTag("name", null, activationOS.getName(), serializer, activationOS);
753             writeTag("family", null, activationOS.getFamily(), serializer, activationOS);
754             writeTag("arch", null, activationOS.getArch(), serializer, activationOS);
755             writeTag("version", null, activationOS.getVersion(), serializer, activationOS);
756             serializer.writeEndElement();
757         }
758     }
759 
760     private void writeActivationFile(String tagName, ActivationFile activationFile, XMLStreamWriter serializer)
761         throws IOException, XMLStreamException {
762         if (activationFile != null) {
763             serializer.writeStartElement(namespace, tagName);
764             writeTag("missing", null, activationFile.getMissing(), serializer, activationFile);
765             writeTag("exists", null, activationFile.getExists(), serializer, activationFile);
766             serializer.writeEndElement();
767         }
768     }
769 
770     private void writeReportPlugin(String tagName, ReportPlugin reportPlugin, XMLStreamWriter serializer)
771         throws IOException, XMLStreamException {
772         if (reportPlugin != null) {
773             serializer.writeStartElement(namespace, tagName);
774             writeTag("groupId", "org.apache.maven.plugins", reportPlugin.getGroupId(), serializer, reportPlugin);
775             writeTag("artifactId", null, reportPlugin.getArtifactId(), serializer, reportPlugin);
776             writeTag("version", null, reportPlugin.getVersion(), serializer, reportPlugin);
777             writeList("reportSets", false, reportPlugin.getReportSets(), serializer, reportPlugin,
778                     t -> writeReportSet("reportSet", t, serializer));
779             writeTag("inherited", null, reportPlugin.getInherited(), serializer, reportPlugin);
780             writeDom(reportPlugin.getConfiguration(), serializer);
781             serializer.writeEndElement();
782         }
783     }
784 
785     private void writeReportSet(String tagName, ReportSet reportSet, XMLStreamWriter serializer)
786         throws IOException, XMLStreamException {
787         if (reportSet != null) {
788             serializer.writeStartElement(namespace, tagName);
789             writeTag("id", "default", reportSet.getId(), serializer, reportSet);
790             writeList("reports", reportSet.getReports(), serializer, reportSet,
791                     t -> writeTag("report", null, t, serializer, null));
792             writeTag("inherited", null, reportSet.getInherited(), serializer, reportSet);
793             writeDom(reportSet.getConfiguration(), serializer);
794             serializer.writeEndElement();
795         }
796     }
797 
798     private void writePrerequisites(String tagName, Prerequisites prerequisites, XMLStreamWriter serializer)
799         throws IOException, XMLStreamException {
800         if (prerequisites != null) {
801             serializer.writeStartElement(namespace, tagName);
802             writeTag("maven", "2.0", prerequisites.getMaven(), serializer, prerequisites);
803             serializer.writeEndElement();
804         }
805     }
806 
807     private void writeRelocation(String tagName, Relocation relocation, XMLStreamWriter serializer)
808         throws IOException, XMLStreamException {
809         if (relocation != null) {
810             serializer.writeStartElement(namespace, tagName);
811             writeTag("groupId", null, relocation.getGroupId(), serializer, relocation);
812             writeTag("artifactId", null, relocation.getArtifactId(), serializer, relocation);
813             writeTag("version", null, relocation.getVersion(), serializer, relocation);
814             writeTag("message", null, relocation.getMessage(), serializer, relocation);
815             serializer.writeEndElement();
816         }
817     }
818 
819     private void writeExtension(String tagName, Extension extension, XMLStreamWriter serializer)
820         throws IOException, XMLStreamException {
821         if (extension != null) {
822             serializer.writeStartElement(namespace, tagName);
823             writeTag("groupId", null, extension.getGroupId(), serializer, extension);
824             writeTag("artifactId", null, extension.getArtifactId(), serializer, extension);
825             writeTag("version", null, extension.getVersion(), serializer, extension);
826             writeDom(extension.getConfiguration(), serializer);
827             serializer.writeEndElement();
828         }
829     }
830 
831     @FunctionalInterface
832     private interface ElementWriter<T> {
833         public void write(T t) throws IOException, XMLStreamException;
834     }
835 
836     private <T> void writeList(String tagName, List<T> list, XMLStreamWriter serializer, InputLocationTracker locationTracker, ElementWriter<T> writer) throws IOException, XMLStreamException {
837         writeList(tagName, false, list, serializer, locationTracker, writer);
838     }
839 
840     private <T> void writeList(String tagName, boolean flat, List<T> list, XMLStreamWriter serializer, InputLocationTracker locationTracker, ElementWriter<T> writer) throws IOException, XMLStreamException {
841         if (list != null && !list.isEmpty()) {
842             if (!flat) {
843                 serializer.writeStartElement(namespace, tagName);
844             }
845             int index = 0;
846             InputLocation location = locationTracker != null ? locationTracker.getLocation(tagName) : null;
847             for (T t : list) {
848                 writer.write(t);
849                 writeLocationTracking(location, Integer.valueOf(index++), serializer);
850             }
851             if (!flat) {
852                 serializer.writeEndElement();
853             }
854         }
855     }
856 
857     private <T> void writeProperties(String tagName, Map<String, String> props, XMLStreamWriter serializer, InputLocationTracker locationTracker) throws IOException, XMLStreamException {
858         if (props != null && !props.isEmpty()) {
859             serializer.writeStartElement(namespace, tagName);
860             InputLocation location = locationTracker != null ? locationTracker.getLocation(tagName) : null;
861             for (Map.Entry<String, String> entry : props.entrySet()) {
862                 String key = entry.getKey();
863                 writeTag(key, null, entry.getValue(), serializer, null);
864                 writeLocationTracking(location, key, serializer);
865             }
866             serializer.writeEndElement();
867         }
868     }
869 
870     private void writeDom(XmlNode dom, XMLStreamWriter serializer) throws IOException, XMLStreamException {
871         if (dom != null) {
872             serializer.writeStartElement(namespace, dom.getName());
873             for (Map.Entry<String, String> attr : dom.getAttributes().entrySet()) {
874                 if (attr.getKey().startsWith("xml:")) {
875                     serializer.writeAttribute("http://www.w3.org/XML/1998/namespace",
876                     attr.getKey().substring(4), attr.getValue());
877                 } else {
878                     serializer.writeAttribute(attr.getKey(), attr.getValue());
879                 }
880             }
881             for (XmlNode child : dom.getChildren()) {
882                 writeDom(child, serializer);
883             }
884             String value = dom.getValue();
885             if (value != null) {
886                 serializer.writeCharacters(value);
887             }
888             serializer.writeEndElement();
889             if (addLocationInformation && dom.getInputLocation() instanceof InputLocation && dom.getChildren().isEmpty()) {
890                 serializer.writeComment(toString((InputLocation) dom.getInputLocation()));
891             }
892         }
893     }
894 
895     private void writeTag(String tagName, String defaultValue, String value, XMLStreamWriter serializer, InputLocationTracker locationTracker) throws IOException, XMLStreamException {
896         if (value != null && !Objects.equals(defaultValue, value)) {
897             serializer.writeStartElement(namespace, tagName);
898             serializer.writeCharacters(value);
899             serializer.writeEndElement();
900             writeLocationTracking(locationTracker, tagName, serializer);
901         }
902     }
903 
904     private void writeAttr(String attrName, String value, XMLStreamWriter serializer) throws IOException, XMLStreamException {
905         if (value != null) {
906             serializer.writeAttribute(attrName, value);
907         }
908     }
909 
910     /**
911      * Method writeLocationTracking.
912      *
913      * @param locationTracker
914      * @param serializer
915      * @param key
916      * @throws IOException
917      */
918     protected void writeLocationTracking(InputLocationTracker locationTracker, Object key, XMLStreamWriter serializer) throws IOException, XMLStreamException {
919         if (addLocationInformation) {
920             InputLocation location = (locationTracker == null) ? null : locationTracker.getLocation(key);
921             if (location != null) {
922                 serializer.writeComment(toString(location));
923             }
924         }
925     } //-- void writeLocationTracking(InputLocationTracker, Object, XMLStreamWriter)
926 
927     /**
928      * Method toString.
929      *
930      * @param location
931      * @return String
932      */
933     protected String toString(InputLocation location) {
934         if (stringFormatter != null) {
935             return stringFormatter.toString(location);
936         }
937         if (location.getSource() != null) {
938             return ' ' + location.getSource().toString() + ':' + location.getLineNumber() + ' ';
939         } else {
940             return " " + location.getLineNumber() + " ";
941         }
942     } //-- String toString(InputLocation)
943 
944     static class IndentingXMLStreamWriter extends StreamWriterDelegate {
945 
946         int depth = 0;
947         boolean hasChildren = false;
948 
949         public IndentingXMLStreamWriter(XMLStreamWriter parent) {
950             super(parent);
951         }
952 
953         @Override
954         public void writeEmptyElement(String localName) throws XMLStreamException {
955             indent();
956             super.writeEmptyElement(localName);
957             hasChildren = true;
958         }
959 
960         @Override
961         public void writeEmptyElement(String namespaceURI, String localName) throws XMLStreamException {
962             indent();
963             super.writeEmptyElement(namespaceURI, localName);
964             hasChildren = true;
965         }
966 
967         @Override
968         public void writeEmptyElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
969             indent();
970             super.writeEmptyElement(prefix, localName, namespaceURI);
971             hasChildren = true;
972         }
973 
974         @Override
975         public void writeStartElement(String localName) throws XMLStreamException {
976             indent();
977             super.writeStartElement(localName);
978             depth++;
979             hasChildren = false;
980         }
981 
982         @Override
983         public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException {
984             indent();
985             super.writeStartElement(namespaceURI, localName);
986             depth++;
987             hasChildren = false;
988         }
989 
990         @Override
991         public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
992             indent();
993             super.writeStartElement(prefix, localName, namespaceURI);
994             depth++;
995             hasChildren = false;
996         }
997 
998         @Override
999         public void writeEndElement() throws XMLStreamException {
1000             depth--;
1001             if (hasChildren) {
1002                 indent();
1003             }
1004             super.writeEndElement();
1005             hasChildren = true;
1006         }
1007 
1008         private void indent() throws XMLStreamException {
1009             super.writeCharacters("\n");
1010             for (int i = 0; i < depth; i++) {
1011                 super.writeCharacters("  ");
1012             }
1013         }
1014     }
1015 }