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

com.luuuis.maven.smartass.ArchiveDependenciesMojo.groovy Maven / Gradle / Ivy

There is a newer version: 1.8
Show newest version
/*
 * Copyright ? 2011 Atlassian Pty Ltd. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package com.luuuis.maven.smartass

import org.apache.maven.project.MavenProject
import org.apache.maven.project.MavenProjectHelper
import org.codehaus.gmaven.mojo.GroovyMojo

/**
 * Archive dependencies MOJO.
 *
 * @goal archive-dependencies
 */
class ArchiveDependenciesMojo extends GroovyMojo
{
  /**
   * The name of the output file that this MOJO will create.
   *
   * @parameter default-value='${project.build.finalName}.zip'
   */
  String archiveName

  /**
   * The name of the output file that this MOJO will create.
   *
   * @parameter default-value='${project.build.finalName}.list'
   */
  String listFileName

  /**
   * The scope to consider when calculating the set of dependencies to archive.
   *
   * @parameter default-value="runtime"
   */
  String includeScope

  /**
   * Whether to skip the create of the archive
   *
   * @parameter default-value="${skip.smartass.zip.update}"
   */
  boolean skipZipUpdate;

  /**
   * @parameter expression="${project}"
   * @required
   * @readonly
   */
  MavenProject project

  /**
   * The Maven project helper.
   *
   * @component
   */
  MavenProjectHelper projectHelper

  /**
   * The AntBuilder.
   */
  AntBuilder ant = new AntBuilder()

  /**
   * Creates the archive containing the artifacts of this project's dependencies.
   */
  void execute()
  {
    File archive = new File("${project.build.directory}/${archiveName}")
    long archiveLastModified = archive.exists() ? archive.lastModified() : 0
    if (log.debugEnabled)
    {
      log.debug "Archive '${archive.absolutePath}' modified on ${new Date(archiveLastModified)}"
    }

    def allArtifacts = project.dependencyArtifacts.findAll { it.scope == includeScope }
    log.debug "Considering all dependencies with '${includeScope}' scope"

    // determine what dependencies need to be updated in the archive
    def updatedArtifacts = allArtifacts.findAll { it.file.lastModified() > archiveLastModified }
    if (log.debugEnabled)
    {
      allArtifacts.each {
        log.debug "Artifact ${it.id} resolves to ${it.file.absolutePath} (modified on ${new Date(it.file.lastModified())})"
      }
    }

    // read the cache and compare it with the current set of dependencies
    Set cachedDeps = readDependenciesFromAssFile() as SortedSet
    log.debug "Cached dependency set: ${cachedDeps}"

    def isOverwrite = false
    Set currentDeps = allArtifacts.collect { "${it.groupId}:${it.artifactId}:${it.version}".toString() } as SortedSet
    if (archive.exists() && currentDeps != cachedDeps)
    {
      log.info "Dependency set has changed. Rebuilding archive..."
      updatedArtifacts = allArtifacts
      isOverwrite = true
    }

    if (updatedArtifacts && skipZipUpdate) {
      log.info "Skipping the update of $archiveName"
    }
    else if (updatedArtifacts)
    {
      if (archive.exists() && !isOverwrite)
      {
        log.info "Updating archive. These artifacts have changed:"
        updatedArtifacts.each { log.info " - ${it.groupId}:${it.artifactId}:${it.version}" }
      }

      // Groovy AntBuilder FTW!
      archive.parentFile.mkdirs()
      ant.zip(destfile: archive.absolutePath, update: !isOverwrite) {
        updatedArtifacts.each { artifact ->
          zipfileset(file: artifact.file)
        }
      }
    }
    else
    {
      log.info "Bundled plugins zip is up to date."
    }

    // attach the bundled plugins zip, then write out the ass file
    if (archive.isFile()) {
      projectHelper.attachArtifact(project, "zip", null, archive)
    }
    writeDependenciesToAssFile(currentDeps)
    writeArtifactsToListFile(allArtifacts)
  }

  protected void writeArtifactsToListFile(Collection updatedArtifacts) {
    File listFile = new File("${project.build.directory}/${listFileName}")
    listFile.parentFile.mkdirs()
    listFile.withWriter { writer ->
      updatedArtifacts.each { artifact ->
        writer.writeLine(artifact.file.getAbsolutePath())
      }
    }
  }

  protected Set readDependenciesFromAssFile()
  {
    File cacheFile = new File("${project.build.directory}/${archiveName}.ass")

    return cacheFile.exists() ? cacheFile.readLines() : []
  }

  protected void writeDependenciesToAssFile(def dependencies)
  {
    File cacheFile = new File("${project.build.directory}/${archiveName}.ass")
    cacheFile.parentFile.mkdirs()
    cacheFile.withWriter { writer ->
      dependencies.each { dep ->
        writer.writeLine(dep)
      }
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy