This is an automated email from the ASF dual-hosted git repository. davidb pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-feature-converter-maven-plugin.git
commit bba261319c4a08ce6fe2b0b43c213df97498470d Author: Andreas Schaefer <[email protected]> AuthorDate: Fri Nov 15 16:43:42 2019 -0800 Added the installation of the FM created by the converter if this plugin is used on a Content Package module --- .../cpconverter/maven/mojos/ContentPackage.java | 38 ++++++-- .../cpconverter/maven/mojos/ConvertCPMojo.java | 59 +++++++----- src/site/markdown/usage.md.vm | 100 ++++++++++++++++++++- 3 files changed, 170 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/apache/sling/cpconverter/maven/mojos/ContentPackage.java b/src/main/java/org/apache/sling/cpconverter/maven/mojos/ContentPackage.java index 0b2b36c..295f270 100644 --- a/src/main/java/org/apache/sling/cpconverter/maven/mojos/ContentPackage.java +++ b/src/main/java/org/apache/sling/cpconverter/maven/mojos/ContentPackage.java @@ -21,7 +21,9 @@ import org.apache.maven.project.MavenProject; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.lang.reflect.Array; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Set; @@ -38,12 +40,14 @@ public class ContentPackage { */ private String artifactId = ""; - private String type = "zip"; + private List<String> types = new ArrayList(Arrays.asList("zip")); // TODO: Classifier should not be set as we have the one from the converter private String classifier = ""; private boolean excludeTransitive; + + private boolean moduleIsContentPackage; public void setGroupId(String groupId) { this.groupId = groupId == null ? "" : groupId; @@ -60,7 +64,20 @@ public class ContentPackage { public boolean isExcludeTransitive() { return excludeTransitive; } - + + public void setModuleIsContentPackage(boolean moduleIsContentPackage) { + this.moduleIsContentPackage = moduleIsContentPackage; + if(this.moduleIsContentPackage) { + types.add("content-package"); + } else { + types.remove("content-package"); + } + } + + public boolean isModuleIsContentPackage() { + return moduleIsContentPackage; + } + public Collection<Artifact> getMatchingArtifacts(final MavenProject project) { // get artifacts depending on whether we exclude transitives or not final Set<Artifact> artifacts; @@ -73,15 +90,26 @@ public class ContentPackage { // all dependencies, transitives included artifacts = project.getArtifacts(); } + // Add the project artifact itself to convert after building a content package + if(moduleIsContentPackage) { + Artifact projectArtifact = project.getArtifact(); + System.out.println("Project Artifact: " + projectArtifact); + artifacts.add(projectArtifact); + } return getMatchingArtifacts(artifacts); } public Collection<Artifact> getMatchingArtifacts(final Collection<Artifact> artifacts) { final List<Artifact> matches = new ArrayList<Artifact>(); for (Artifact artifact : artifacts) { + System.out.println("Check Artifact: " + artifact); + System.out.println("Check Artifact Group: " + artifact.getGroupId()); + System.out.println("Check Artifact Artifact: " + artifact.getArtifactId()); + System.out.println("Check Artifact Type: " + artifact.getType()); + System.out.println("Check Artifact Classifier: " + artifact.getClassifier()); if(groupId.equals(artifact.getGroupId()) && artifactId.equals(artifact.getArtifactId()) - && type.equals(artifact.getType()) + && types.contains(artifact.getType()) && (classifier.equals(artifact.getClassifier()) || (classifier.equals("") && artifact.getClassifier() == null)) ) { matches.add(artifact); @@ -98,8 +126,8 @@ public class ContentPackage { builder.append("groupId=").append(groupId).append(","); builder.append("artifactId=").append(artifactId).append(","); - if (type != null) { - builder.append("type=").append(type).append(","); + if (types != null) { + builder.append("type='").append(types).append("',"); } if (classifier != null) { builder.append("classifier=").append(classifier).append(","); diff --git a/src/main/java/org/apache/sling/cpconverter/maven/mojos/ConvertCPMojo.java b/src/main/java/org/apache/sling/cpconverter/maven/mojos/ConvertCPMojo.java index 4638912..a7921c5 100644 --- a/src/main/java/org/apache/sling/cpconverter/maven/mojos/ConvertCPMojo.java +++ b/src/main/java/org/apache/sling/cpconverter/maven/mojos/ConvertCPMojo.java @@ -17,7 +17,9 @@ package org.apache.sling.cpconverter.maven.mojos; import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.ArtifactUtils; import org.apache.maven.artifact.DefaultArtifact; +import org.apache.maven.artifact.handler.DefaultArtifactHandler; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.Mojo; @@ -78,6 +80,8 @@ public final class ConvertCPMojo public static final String CFG_CONTENT_PACKAGES = "packages"; + public static final String CFG_IS_CONTENT_PACKAGE = "isContentPackage"; + public static final boolean DEFAULT_STRING_VALIDATION = false; public static final boolean DEFAULT_MERGE_CONFIGURATIONS = false; @@ -90,6 +94,8 @@ public final class ConvertCPMojo public static final String DEFAULT_FM_OUTPUT_DIRECTORY = DEFAULT_CONVERTED_CP_OUTPUT_DIRECTORY + "/fm.out"; + public static final boolean DEFAULT_IS_CONTENT_PACKAGE = false; + /** * If set to {@code true} the Content Package is strictly validated. */ @@ -151,6 +157,12 @@ public final class ConvertCPMojo @Parameter(property = CFG_CONTENT_PACKAGES) private List<ContentPackage> contentPackages; + /** + * If set to {@code true} the module is handled as Content Package + */ + @Parameter(property = CFG_IS_CONTENT_PACKAGE, defaultValue = DEFAULT_IS_CONTENT_PACKAGE + "") + private boolean isContentPackage; + @Override public void execute() throws MojoExecutionException, MojoFailureException { // Un-encode a given Artifact Override Id @@ -207,18 +219,14 @@ public final class ConvertCPMojo File targetFile = new File(targetPath); if (targetFile.exists() && targetFile.isFile() && targetFile.canRead()) { converter.convert(project.getArtifact().getFile()); -// Artifact convertedPackage = new DefaultArtifact( -// project.getGroupId(), project.getArtifactId(), project.getVersion(), -// "compile", ZIP_TYPE, PACKAGE_CLASSIFIER, artifactHandlerManager.getArtifactHandler(ZIP_TYPE) -// ); -// installConvertedCP(convertedPackage); } else { getLog().error("Artifact is not found: " + targetPath); } } else { for(ContentPackage contentPackage: contentPackages) { - getLog().info("Content Package Artifact File: " + contentPackage.toString()); + getLog().info("Content Package Artifact File: " + contentPackage.toString() + ", is module CP: " + isContentPackage); contentPackage.setExcludeTransitive(true); + contentPackage.setModuleIsContentPackage(isContentPackage); final Collection<Artifact> artifacts = contentPackage.getMatchingArtifacts(project); if (artifacts.isEmpty()) { getLog().warn("No matching artifacts for " + contentPackage); @@ -227,6 +235,7 @@ public final class ConvertCPMojo getLog().info("Target Convert CP of --- " + contentPackage + " ---"); for (final Artifact artifact : artifacts) { final File source = artifact.getFile(); + getLog().info("Artifact: '" + artifact + "', source file: '" + source + "'"); if (source.exists() && source.isFile() && source.canRead()) { converter.convert(source); Artifact convertedPackage = new DefaultArtifact( @@ -258,6 +267,9 @@ public final class ConvertCPMojo File destFolder = new File(userHome, ".m2/repository"); if(destFolder.isDirectory()) { copyFiles(convertedCPOutput, destFolder); + if(isContentPackage) { + installFMDescriptor(project.getArtifact()); + } } } } @@ -312,24 +324,29 @@ public final class ConvertCPMojo } } - private void installConvertedCP(Artifact artifact) throws MojoFailureException, MojoExecutionException { + private void installFMDescriptor(Artifact artifact) { if(installConvertedCP) { Collection<Artifact> artifacts = Collections.synchronizedCollection(new ArrayList<>()); - // Rebuild the converted package path - String convertedPackagePath = artifact.getGroupId().replaceAll("\\.", "/") - + "/" + artifact.getArtifactId() - + "/" + artifact.getVersion() - + "/" + artifact.getArtifactId() - + "-" + artifact.getVersion() - + "-" + PACKAGE_CLASSIFIER - + "." + ZIP_TYPE; - File convertedPackageFile = new File(convertedCPOutput, convertedPackagePath); - if(convertedPackageFile.exists() && convertedPackageFile.canRead()) { - artifact.setFile(convertedPackageFile); - artifacts.add(artifact); - installArtifact(mavenSession.getProjectBuildingRequest(), artifacts); + // Source FM Descriptor File Path + String fmDescriptorFilePath = fmPrefix + artifact.getArtifactId() + ".json"; + File fmDescriptorFile = new File(fmOutput, fmDescriptorFilePath); + if(fmDescriptorFile.exists() && fmDescriptorFile.canRead()) { + // Need to create a new Artifact Handler for the different extension and an Artifact to not + // change the module artifact + DefaultArtifactHandler fmArtifactHandler = new DefaultArtifactHandler("slingosgifeature"); + DefaultArtifact fmArtifact = new DefaultArtifact( + artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), + artifact.getScope(), "slingosgifeature", artifact.getArtifactId(), fmArtifactHandler + ); + fmArtifact.setFile(fmDescriptorFile); + artifacts.add(fmArtifact); + try { + installArtifact(mavenSession.getProjectBuildingRequest(), artifacts); + } catch (MojoFailureException | MojoExecutionException e) { + getLog().error("Failed to install FM Descriptor", e); + } } else { - getLog().error("xCould not find Converted Package: " + convertedPackageFile); + getLog().error("Could not find FM Descriptor File: " + fmDescriptorFile); } } } diff --git a/src/site/markdown/usage.md.vm b/src/site/markdown/usage.md.vm index c6118c3..0c63fc9 100644 --- a/src/site/markdown/usage.md.vm +++ b/src/site/markdown/usage.md.vm @@ -10,7 +10,7 @@ $h2 Usage -$h3 Converting Sling, Project Content Packages and Lauch it +$h3 Converting Sling, Project Content Packages and Launch it **Note**: In this sample we use Maven variables like **project.groupId** instead of a static value assuming that the project is within the same project that creates the content packages. Adjust that as needed. @@ -291,3 +291,101 @@ mvn \ install \ -P launch ``` + +$h3 Converting a Content Package and Install its Feature Model Descriptor + +Instead of building everything local in a dedicated Maven module now each Content Project Module +can install their generated Feature Module descriptor into the local Maven repository so that it +can be **included as artifact** when the FM project is assembled. + +First in each Content Package module add this plugin configuration to your POM in the **build** section: + +``` +<plugin> + <groupId>org.apache.sling</groupId> + <artifactId>sling-feature-converter-maven-plugin</artifactId> + <version>${sp}sling-feature-converter-maven-plugin.version}</version> + <extensions>true</extensions> + <executions> + <execution> + <id>convert-cp</id> + <phase>verify</phase> + <goals> + <goal>convert-cp</goal> + </goals> + <configuration> + <artifactIdOverride>${sp}project.groupId}:${sp}project.artifactId}:slingosgifeature:${sp3}filename}}}:${sp}project.version}</artifactIdOverride> + <installConvertedCP>true</installConvertedCP> + <convertedCPOutput>${sp}project.build.directory}/fm.out</convertedCPOutput> + <fmOutput>${sp}project.build.directory}/fm</fmOutput> + <fmPrefix>peregrine-</fmPrefix> + <isContentPackage>true</isContentPackage> + <contentPackages> + <contentPackage> + <groupId>${sp}project.groupId}</groupId> + <artifactId>${sp}project.artifactId}</artifactId> + </contentPackage> + </contentPackages> + </configuration> + </execution> + </executions> +</plugin> +``` + +* **sling-feature-converter-maven-plugin.version**: is a property with the version of this plugin to be used (1.0.0-SNAPSHOT for now) +* **artifactIdOverride**: This should match the Maven Id with this pattern: 'groupId':'artifactId':'type fixed to slingosgifeature':'classifier':'version' +* **installConvertedCP**: must be set to true otherwise I cannot be assembled later +* **convertedCPOutput/fmOutput/fmPrefix**: adjust to your preferences +* **isContentPackage**: must be set to true +* **contentPackage**: must match the module's properties (later we might remove this) + +After a successful build one can check the installation by going to your local Maven repository, got to the location of you artifact and +check if there is a file with the extension **slingosgifeature**. + +Now we can go to the Assembly part and add the FM installed locally as artifact: + +``` +<plugin> + <groupId>org.apache.sling</groupId> + <artifactId>slingfeature-maven-plugin</artifactId> + <version>${slingfeature-maven-plugin.version}</version> + <extensions>true</extensions> + <configuration> + <features>target/fm</features> + <generatedFeatures>${basedir}/target/fm</generatedFeatures> + </configuration> + <executions> + <execution> + <id>aggregate-base-feature</id> + <phase>generate-test-sources</phase> + <goals> + <goal>aggregate-features</goal> + </goals> + <configuration> + <aggregates> + <aggregate> + <classifier>example-runtime</classifier> + <filesInclude>**/*.json</filesInclude> + <configurationOverrides>*=USE_LATEST</configurationOverrides> + <includeArtifact> + <groupId>${project.groupId}</groupId> + <artifactId>base.ui.apps</artifactId> + <version>${project.version}</version> + <classifier>base.ui.apps</classifier> + <type>slingosgifeature</type> + </includeArtifact> + ... + </aggregate> + </aggregates> + </configuration> + </execution> + </executions> +</plugin> +``` + +* **slingfeature-maven-plugin.version**: version of the sling feature maven plugin to be used +* **features/generatedFeatures**: add/set depending on your project +* **classifier/filesInclude/configurationOverrides**: set depending on your project +* **includeArtifact**: one entry per Content Package FM. The **groupId**, **artifactId**, **version** and **classifier** + must match your FM descriptor +
