All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.wcm.devops.conga.plugins.aem.maven.InstallPackagesMojo Maven / Gradle / Ivy

/*
 * #%L
 * wcm.io
 * %%
 * Copyright (C) 2017 wcm.io
 * %%
 * Licensed 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.
 * #L%
 */
package io.wcm.devops.conga.plugins.aem.maven;

import static io.wcm.devops.conga.generator.util.FileUtil.getCanonicalPath;

import java.io.File;
import java.util.List;

import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.BuildPluginManager;
import org.apache.maven.plugin.MavenPluginManager;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
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.project.MavenProject;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.codehaus.plexus.configuration.PlexusConfigurationException;
import org.codehaus.plexus.util.xml.Xpp3Dom;

import io.wcm.devops.conga.plugins.aem.maven.model.BundleFile;
import io.wcm.devops.conga.plugins.aem.maven.model.InstallableFile;
import io.wcm.devops.conga.plugins.aem.maven.model.ModelContentPackageFile;
import io.wcm.devops.conga.plugins.aem.maven.model.ModelParser;
import io.wcm.tooling.commons.packmgr.install.PackageFile;
import io.wcm.tooling.commons.packmgr.install.PackageInstaller;

/**
 * Installs all AEM content packages and OSGi bundles to AEM which are referenced in a model.yaml
 * generated by CONGA for a node.
 */
@Mojo(name = "package-install", threadSafe = true, requiresProject = false)
public final class InstallPackagesMojo extends AbstractContentPackageMojo {

  /**
   * Directory with the generated CONGA configuration containing the model.yaml.
   */
  @Parameter(required = true, property = "conga.nodeDirectory")
  private File nodeDirectory;

  /**
   * Whether to install (unpack) the uploaded package automatically or not.
   */
  @Parameter(property = "vault.install", defaultValue = "true")
  private boolean install;

  /**
   * Force upload and install of content package. If set to:
   * 
    *
  • true: Package is always installed, even if it was already uploaded before.
  • *
  • false: Package is only installed if it was not already uploade before.
  • *
  • nothing (default): Force is applied to packages with the string "-SNAPSHOT" in it's filename.
  • *
*/ @Parameter(property = "vault.force") private Boolean force; /** * If set to true nested packages get installed as well. */ @Parameter(property = "vault.recursive", defaultValue = "true") private boolean recursive; /** * Delay further steps after package installation by this amount of seconds */ @Parameter(property = "vault.delayAfterInstallSec") private Integer delayAfterInstallSec; /** * Replicate package(s) to publish instance after upload. */ @Parameter(property = "vault.replicatePackage") private boolean replicate; /** * Version of Sling plugin */ @Parameter(property = "sling.plugin.version", required = true, defaultValue = "2.4.2") private String slingPluginVersion; @Parameter(defaultValue = "${project}", readonly = true) private MavenProject project; @Parameter(defaultValue = "${session}", readonly = true) private MavenSession session; @Component(role = MavenPluginManager.class) private MavenPluginManager pluginManager; @Component(role = BuildPluginManager.class) private BuildPluginManager buildPluginManager; @Override public void execute() throws MojoExecutionException, MojoFailureException { if (isSkip()) { return; } if (!nodeDirectory.exists() || !nodeDirectory.isDirectory()) { throw new MojoFailureException("Node directory not found: " + getCanonicalPath(nodeDirectory)); } getLog().info("Get AEM content packages from " + getCanonicalPath(nodeDirectory)); // collect files to install ModelParser modelParser = new ModelParser(nodeDirectory); List items = modelParser.getInstallableFilesForNode(); // ensure any file exist if (items.isEmpty()) { getLog().warn("No file found for installing."); return; } // install files PackageInstaller installer = new PackageInstaller(getPackageManagerProperties()); installer.setReplicate(this.replicate); for (InstallableFile item : items) { if (item instanceof ModelContentPackageFile) { PackageFile packageFile = toPackageFile((ModelContentPackageFile)item); installer.installFile(packageFile); } else if (item instanceof BundleFile) { BundleFile bundleFile = (BundleFile)item; if (bundleFile.getInstall() == null || bundleFile.getInstall()) { installBundleViaSlingPlugin(bundleFile.getFile()); } } else { getLog().warn("Unsupported file: " + getCanonicalPath(item.getFile())); } } } private PackageFile toPackageFile(ModelContentPackageFile item) { PackageFile output = new PackageFile(); output.setFile(item.getFile()); Boolean installParam = item.getInstall(); if (installParam != null) { output.setInstall(installParam); } else { output.setInstall(this.install); } Boolean forcePAram = item.getForce(); if (forcePAram != null) { output.setForce(forcePAram); } else { output.setForce(this.force); } Boolean recursiveParam = item.getRecursive(); if (recursiveParam != null) { output.setRecursive(recursiveParam); } else { output.setRecursive(this.recursive); } Integer delayAfterInstallSecParam = item.getDelayAfterInstallSec(); if (delayAfterInstallSecParam != null) { output.setDelayAfterInstallSec(delayAfterInstallSecParam); } else if (this.delayAfterInstallSec != null) { output.setDelayAfterInstallSec(this.delayAfterInstallSec); } else { output.setDelayAfterInstallSecAutoDetect(); } output.setHttpSocketTimeoutSec(item.getHttpSocketTimeoutSec()); return output; } /** * Executes the sling-maven-plugin directly from the current project to install OSGi bundles. */ private void installBundleViaSlingPlugin(File file) throws MojoExecutionException { Plugin plugin = new Plugin(); plugin.setGroupId("org.apache.sling"); plugin.setArtifactId("sling-maven-plugin"); plugin.setVersion(this.slingPluginVersion); try { PluginDescriptor pluginDescriptor = pluginManager.getPluginDescriptor(plugin, project.getRemotePluginRepositories(), session.getRepositorySession()); MojoDescriptor mojoDescriptor = pluginDescriptor.getMojo("install-file"); MojoExecution mojoExecution = new MojoExecution(pluginDescriptor.getMojo("install-file")); Xpp3Dom config = convertConfiguration(mojoDescriptor.getMojoConfiguration()); config.getChild("slingUrl").setValue(buildConsoleUrl()); config.getChild("user").setValue(this.getConsoleUser()); config.getChild("password").setValue(this.getConsolePassword()); config.getChild("mountByFS").setValue("false"); config.getChild("bundleFileName").setValue(file.getAbsolutePath()); mojoExecution.setConfiguration(config); buildPluginManager.executeMojo(session, mojoExecution); } catch (Exception ex) { throw new MojoExecutionException("Faild to execute plugin: " + plugin, ex); } } private Xpp3Dom convertConfiguration(PlexusConfiguration plexusConfig) throws PlexusConfigurationException { Xpp3Dom config = new Xpp3Dom(plexusConfig.getName()); config.setValue(plexusConfig.getValue()); for (String attribute : plexusConfig.getAttributeNames()) { config.setAttribute(attribute, plexusConfig.getAttribute(attribute)); } for (PlexusConfiguration child : plexusConfig.getChildren()) { config.addChild(convertConfiguration(child)); } return config; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy