/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.sling.maven.slingstart; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.Map; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.maven.MavenExecutionException; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.sling.provisioning.model.ArtifactGroup; import org.apache.sling.provisioning.model.Feature; import org.apache.sling.provisioning.model.Model; import org.apache.sling.provisioning.model.ModelConstants; import org.apache.sling.provisioning.model.ModelUtility; import org.apache.sling.provisioning.model.RunMode; import org.apache.sling.provisioning.model.io.ModelWriter; /** * Create a Maven repository structure from the referenced artifacts in the model. */ @Mojo( name = "repository", requiresDependencyResolution = ResolutionScope.TEST, threadSafe = true ) public class RepositoryMojo extends AbstractSlingStartMojo { private static final String DIR_NAME = "artifacts"; @Component private ArtifactHandlerManager artifactHandlerManager; /** * Used to look up Artifacts in the remote repository. * */ @Component private ArtifactResolver resolver; /** * This is the name of the final model as written to the target directory. */ @Parameter(defaultValue="slingstart.txt") private String repositoryModelName; @Override public void execute() throws MojoExecutionException, MojoFailureException { final File artifactDir = new File(this.project.getBuild().getDirectory(), DIR_NAME); this.getLog().info("Creating repository in '" + artifactDir.getPath() + "'..."); // artifacts final Model model = ProjectHelper.getEffectiveModel(this.project, getResolverOptions()); for(final Feature feature : model.getFeatures()) { for(final RunMode runMode : feature.getRunModes()) { for(final ArtifactGroup group : runMode.getArtifactGroups()) { for(final org.apache.sling.provisioning.model.Artifact artifact : group ) { copyArtifactToRepository(artifact, artifactDir); } } } } // base artifact - only if launchpad feature is available if (model.getFeature(ModelConstants.FEATURE_LAUNCHPAD) != null) { try { final org.apache.sling.provisioning.model.Artifact baseArtifact = ModelUtils.findBaseArtifact(model); final org.apache.sling.provisioning.model.Artifact appArtifact = new org.apache.sling.provisioning.model.Artifact(baseArtifact.getGroupId(), baseArtifact.getArtifactId(), baseArtifact.getVersion(), BuildConstants.CLASSIFIER_APP, BuildConstants.TYPE_JAR); copyArtifactToRepository(appArtifact, artifactDir); } catch ( final MavenExecutionException mee) { throw new MojoExecutionException(mee.getMessage(), mee.getCause()); } } // models Model rawModel = ProjectHelper.getRawModel(this.project); if (usePomVariables) { rawModel = ModelUtility.applyVariables(rawModel, new PomVariableResolver(project)); } if (usePomDependencies) { rawModel = ModelUtility.applyArtifactVersions(rawModel, new PomArtifactVersionResolver(project, allowUnresolvedPomDependencies)); } final String classifier = (project.getPackaging().equals(BuildConstants.PACKAGING_PARTIAL_SYSTEM) ? null : BuildConstants.PACKAGING_PARTIAL_SYSTEM); final org.apache.sling.provisioning.model.Artifact rawModelArtifact = new org.apache.sling.provisioning.model.Artifact( this.project.getGroupId(), this.project.getArtifactId(), this.project.getVersion(), classifier, BuildConstants.TYPE_TXT); final File rawModelFile = getRepositoryFile(artifactDir, rawModelArtifact); Writer writer = null; try { writer = new FileWriter(rawModelFile); ModelWriter.write(writer, rawModel); } catch (IOException e) { throw new MojoExecutionException("Unable to write model to " + rawModelFile, e); } finally { IOUtils.closeQuietly(writer); } // and write model to target writer = null; try { writer = new FileWriter(new File(this.project.getBuild().getDirectory(), repositoryModelName)); ModelWriter.write(writer, rawModel); } catch (IOException e) { throw new MojoExecutionException("Unable to write model to " + rawModelFile, e); } finally { IOUtils.closeQuietly(writer); } for(final Map.Entry<String, String> entry : ProjectHelper.getDependencyModel(this.project).entrySet()) { final org.apache.sling.provisioning.model.Artifact modelDepArtifact = org.apache.sling.provisioning.model.Artifact.fromMvnUrl(entry.getKey()); final String modelClassifier = (modelDepArtifact.getType().equals(BuildConstants.PACKAGING_SLINGSTART) ? BuildConstants.PACKAGING_PARTIAL_SYSTEM : modelDepArtifact.getClassifier()); final org.apache.sling.provisioning.model.Artifact modelArtifact = new org.apache.sling.provisioning.model.Artifact( modelDepArtifact.getGroupId(), modelDepArtifact.getArtifactId(), modelDepArtifact.getVersion(), modelClassifier, BuildConstants.TYPE_TXT); final File modelFile = getRepositoryFile(artifactDir, modelArtifact); Writer modelWriter = null; try { modelWriter = new FileWriter(modelFile); modelWriter.write(entry.getValue()); } catch (IOException e) { throw new MojoExecutionException("Unable to write model to " + modelFile, e); } finally { IOUtils.closeQuietly(modelWriter); } } } /** * Get the file in the repository directory * @param artifactDir The base artifact directory * @param artifact The artifact * @return The file */ private File getRepositoryFile(final File artifactDir, final org.apache.sling.provisioning.model.Artifact artifact) { final StringBuilder artifactNameBuilder = new StringBuilder(); artifactNameBuilder.append(artifact.getArtifactId()); artifactNameBuilder.append('-'); artifactNameBuilder.append(artifact.getVersion()); if ( artifact.getClassifier() != null && artifact.getClassifier().length() > 0 ) { artifactNameBuilder.append('-'); artifactNameBuilder.append(artifact.getClassifier()); } artifactNameBuilder.append('.'); artifactNameBuilder.append(artifact.getType()); final String artifactName = artifactNameBuilder.toString(); final StringBuilder sb = new StringBuilder(); sb.append(artifact.getGroupId().replace('.', File.separatorChar)); sb.append(File.separatorChar); sb.append(artifact.getArtifactId()); sb.append(File.separatorChar); sb.append(artifact.getVersion()); sb.append(File.separatorChar); sb.append(artifactName); final String destPath = sb.toString(); final File artifactFile = new File(artifactDir, destPath); artifactFile.getParentFile().mkdirs(); return artifactFile; } /** * Copy a single artifact to the repository * @throws MojoExecutionException */ private void copyArtifactToRepository(final org.apache.sling.provisioning.model.Artifact artifact, final File artifactDir) throws MojoExecutionException { final File artifactFile = getRepositoryFile(artifactDir, artifact); final Artifact source = ModelUtils.getArtifact(this.project, this.mavenSession, this.artifactHandlerManager, this.resolver, artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), artifact.getType(), artifact.getClassifier()); try { FileUtils.copyFile(source.getFile(), artifactFile); } catch (IOException e) { throw new MojoExecutionException("Unable to copy artifact from " + source.getFile(), e); } } }