CAMEL-10420: Allowing changes to the starter poms
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/fb2318fa Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/fb2318fa Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/fb2318fa Branch: refs/heads/master Commit: fb2318fa8aa9e3d7e997144bb2c57e3a44edc75a Parents: d2faa45 Author: Nicola Ferraro <ni.ferr...@gmail.com> Authored: Fri Nov 4 12:22:59 2016 +0100 Committer: Nicola Ferraro <ni.ferr...@gmail.com> Committed: Fri Nov 4 17:46:06 2016 +0100 ---------------------------------------------------------------------- .../maven/packaging/SpringBootStarterMojo.java | 114 +++++++++++++++---- 1 file changed, 95 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/fb2318fa/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootStarterMojo.java ---------------------------------------------------------------------- diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootStarterMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootStarterMojo.java index 2446b04..8240be7 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootStarterMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootStarterMojo.java @@ -18,6 +18,7 @@ package org.apache.camel.maven.packaging; import java.io.ByteArrayInputStream; import java.io.File; +import java.io.FileInputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; @@ -63,7 +64,6 @@ import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.resolver.ArtifactCollector; import org.apache.maven.artifact.resolver.filter.ArtifactFilter; import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter; -import org.apache.maven.model.Repository; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; @@ -91,6 +91,11 @@ public class SpringBootStarterMojo extends AbstractMojo { private static final boolean IGNORE_TEST_MODULES = true; + private static final String GENERATED_SECTION_START = "START OF GENERATED CODE"; + private static final String GENERATED_SECTION_START_COMMENT = "<!--" + GENERATED_SECTION_START + "-->"; + private static final String GENERATED_SECTION_END = "END OF GENERATED CODE"; + private static final String GENERATED_SECTION_END_COMMENT = "<!--" + GENERATED_SECTION_END + "-->"; + /** * The maven project. * @@ -100,6 +105,12 @@ public class SpringBootStarterMojo extends AbstractMojo { */ protected MavenProject project; + /** + * Allows using the existing pom.xml file if present. + * + * @parameter property="reuseExistingPom" default-value="true" + */ + protected boolean reuseExistingPom; /** * The project directory @@ -224,29 +235,33 @@ public class SpringBootStarterMojo extends AbstractMojo { XPath xpath = XPathFactory.newInstance().newXPath(); Node dependencies = ((NodeList) xpath.compile("/project/dependencies").evaluate(pom, XPathConstants.NODESET)).item(0); - for (String dep : deps) { - Element dependency = pom.createElement("dependency"); - dependencies.appendChild(dependency); + if (deps.size() > 0) { + dependencies.appendChild(pom.createComment(GENERATED_SECTION_START)); + for (String dep : deps) { + Element dependency = pom.createElement("dependency"); + dependencies.appendChild(dependency); - String[] comps = dep.split("\\:"); - String groupIdStr = comps[0]; - String artifactIdStr = comps[1]; - String versionStr = comps.length > 2 ? comps[2] : null; + String[] comps = dep.split("\\:"); + String groupIdStr = comps[0]; + String artifactIdStr = comps[1]; + String versionStr = comps.length > 2 ? comps[2] : null; - Element groupId = pom.createElement("groupId"); - groupId.setTextContent(groupIdStr); - dependency.appendChild(groupId); + Element groupId = pom.createElement("groupId"); + groupId.setTextContent(groupIdStr); + dependency.appendChild(groupId); - Element artifactId = pom.createElement("artifactId"); - artifactId.setTextContent(artifactIdStr); - dependency.appendChild(artifactId); + Element artifactId = pom.createElement("artifactId"); + artifactId.setTextContent(artifactIdStr); + dependency.appendChild(artifactId); - if (versionStr != null) { - Element version = pom.createElement("version"); - version.setTextContent(versionStr); - dependency.appendChild(version); - } + if (versionStr != null) { + Element version = pom.createElement("version"); + version.setTextContent(versionStr); + dependency.appendChild(version); + } + } + dependencies.appendChild(pom.createComment(GENERATED_SECTION_END)); } } @@ -263,7 +278,9 @@ public class SpringBootStarterMojo extends AbstractMojo { XPath xpath = XPathFactory.newInstance().newXPath(); Node repositories = (Node) xpath.compile("/project/repositories").evaluate(originalPom, XPathConstants.NODE); if (repositories != null) { + pom.getDocumentElement().appendChild(pom.createComment(GENERATED_SECTION_START)); pom.getDocumentElement().appendChild(pom.importNode(repositories, true)); + pom.getDocumentElement().appendChild(pom.createComment(GENERATED_SECTION_END)); } } else { getLog().warn("Cannot access the project pom file to retrieve repositories"); @@ -343,7 +360,9 @@ public class SpringBootStarterMojo extends AbstractMojo { Element exclusions = pom.createElement("exclusions"); + dependency.appendChild(pom.createComment(GENERATED_SECTION_START)); dependency.appendChild(exclusions); + dependency.appendChild(pom.createComment(GENERATED_SECTION_END)); for (String lib : libsToRemove) { String groupIdStr = lib.split("\\:")[0]; @@ -420,6 +439,63 @@ public class SpringBootStarterMojo extends AbstractMojo { } private Document createBasePom() throws Exception { + Document pom = null; + if (reuseExistingPom) { + pom = createBasePomFromExisting(); + } + if (pom == null) { + pom = createBasePomFromScratch(); + } + + return pom; + } + + private Document createBasePomFromExisting() { + try { + File pomFile = new File(starterDir(), "pom.xml"); + if (pomFile.exists()) { + try (InputStream in = new FileInputStream(pomFile)) { + String content = IOUtils.toString(in, "UTF-8"); + boolean editablePom = content.contains(GENERATED_SECTION_START_COMMENT); + if (editablePom) { + content = removeGeneratedSections(content, 10); + DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + + Document pom; + try (InputStream contentIn = new ByteArrayInputStream(content.getBytes("UTF-8"))) { + pom = builder.parse(contentIn); + } + + getLog().info("Reusing the existing pom.xml for the starter"); + return pom; + } + } + } + } catch (Exception e) { + getLog().warn("Cannot use the existing pom.xml file", e); + } + + return null; + } + + private String removeGeneratedSections(String pom, int maxNumber) { + if (maxNumber > 0 && pom.contains(GENERATED_SECTION_START_COMMENT)) { + int start = pom.indexOf(GENERATED_SECTION_START_COMMENT); + int end = pom.indexOf(GENERATED_SECTION_END_COMMENT); + if (end <= start) { + throw new IllegalArgumentException("Generated sections inside the xml document are not well-formed"); + } + + String newPom = pom.substring(0, start) + pom.substring(end + GENERATED_SECTION_END_COMMENT.length()); + return removeGeneratedSections(newPom, maxNumber - 1); + } + + return pom; + } + + private Document createBasePomFromScratch() throws Exception { + getLog().info("Creating a new pom.xml for the starter from scratch"); + Template pomTemplate = getTemplate("spring-boot-starter-template-pom.template"); Map<String, String> props = new HashMap<>(); props.put("version", project.getVersion());