Package org.moxie.ant

Source Code of org.moxie.ant.MxDeploy

/*
* Copyright 2013 James Moger
*
* 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.
*/
package org.moxie.ant;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;

import org.apache.tools.ant.types.FileSet;
import org.moxie.Build;
import org.moxie.Dependency;
import org.moxie.IMavenCache;
import org.moxie.Metadata;
import org.moxie.MetadataReader;
import org.moxie.Pom;
import org.moxie.PurgePolicy;
import org.moxie.utils.FileUtils;
import org.moxie.utils.StringUtils;


public class MxDeploy extends MxRepositoryTask {
 
  private int revisionRetentionCount = -1;
  private int revisionPurgeAfterDays = -1;
  private boolean generateIndexPage;
  private List<String> tags;
  private String artifactId;
  private String name;
  private String description;
 
  public MxDeploy() {
    super();
    setTaskName("mx:deploy");
    setAllowsnapshots(false);
    setGeneratePom(true);
    setCalculatechecksums(true);
    setGenerateIndexPage(true);
  }
 
  public void setRevisionRetentionCount(int value) {
    this.revisionRetentionCount = value;
  }

  public void setRevisionPurgeAfterDays(int value) {
    this.revisionPurgeAfterDays = value;
  }

  public void setGenerateIndexPage(boolean value) {
    this.generateIndexPage = value;
  }
 
  public void setTags(String tags) {
    if (tags != null && tags.length() > 0) {
      Set<String> set = new LinkedHashSet<String>();
      StringTokenizer tok = new StringTokenizer(tags, ", ", false);
      while (tok.hasMoreTokens()) {
        set.add(tok.nextToken().toLowerCase());
      }
      this.tags = new ArrayList<String>(set);
    }   
  }
 
  public void setArtifactid(String value) {
    this.artifactId = value;
  }
 
  public void setName(String value) {
    this.name = value;
  }

  public void setDescription(String value) {
    this.description = value;
  }

  protected PurgePolicy getPurgePolicy() {
    PurgePolicy policy;
    if (baseDir == null) {
      // deploy to local repository
      policy = getBuild().getConfig().getPurgePolicy();
    } else {
      // deploy to specified repository
      policy = new PurgePolicy();
      policy.retentionCount = 1;
    }

    // override purge policy
    if (revisionRetentionCount > -1) {
      policy.retentionCount = revisionRetentionCount;
    }

    if (revisionPurgeAfterDays > -1) {
      policy.purgeAfterDays = revisionPurgeAfterDays;
    }
    return policy;
  }

  public void execute() {
    Build build = getBuild();
   
    Pom pom = build.getPom(tags);
   
    if (!StringUtils.isEmpty(name)) {
      pom.name = name;
    }
    if (!StringUtils.isEmpty(description)) {
      pom.description = description;
    }
    if (!StringUtils.isEmpty(artifactId)) {
      pom.artifactId = artifactId;
    }
   
    if (!allowSnapshots && pom.isSnapshot()) {
      // do not deploy snapshots into the repository
      return;
    }
   
    Dependency asDependency = new Dependency(pom.getCoordinates());
    IMavenCache artifactCache = getArtifactCache(pom.isSnapshot());
    File cacheRoot = artifactCache.getRootFolder();
    File artifactFile = artifactCache.getArtifact(asDependency, asDependency.extension);
    File artifactDir = artifactFile.getParentFile();
    File sourceDir = build.getConfig().getTargetDirectory();
   
    titleClass(pom.artifactId + "-" + pom.version);

    if (asDependency.isSnapshot()) {
      deploySnapshot(pom, sourceDir, artifactDir, artifactCache);
    } else {
      deployRelease(pom, sourceDir, artifactDir, true);
    }
   
    // updates the prefixes index
    artifactCache.updatePrefixesIndex();

    if (generateIndexPage) {
      boolean extracted = extractResource(cacheRoot, "maven/index.html", "index.html", false);     
      extractResource(cacheRoot, "maven/favicon.png", "favicon.png", false);
     
      if (extracted) {
        // create JSON repository metadata
        String template = readResourceAsString("maven/repository.json").trim();
        template = getProject().replaceProperties(template);
        FileUtils.writeContent(new File(cacheRoot, "repository.json"), template);
      }
     
      // create/update JSON artifact index
      String template = readResourceAsString("maven/artifact.json").trim();
      StringBuilder sb = new StringBuilder("[\n\n");
      String index = artifactCache.generatePomIndex(template, ",\n");
      sb.append(index);
      sb.append("\n]\n");
      FileUtils.writeContent(new File(cacheRoot, "artifacts.json"), sb.toString());
    }   
  }
 
  /**
   * Deploy SNAPSHOT artifacts
   *
   * @param pom
   * @param sourceDir
   * @param artifactDir
   * @param artifactCache
   */
  protected void deploySnapshot(Pom pom, File sourceDir, File artifactDir, IMavenCache artifactCache) {
    Dependency asDependency = new Dependency(pom.getCoordinates());

    // setup REVISION
    String timestamp = new SimpleDateFormat(Metadata.snapshotTimestamp).format(new Date());
    int buildNumber = 1;

    File metadataFile = new File(artifactDir, "maven-metadata.xml");     
    if (metadataFile.exists()) {
      Metadata metadata = MetadataReader.readMetadata(metadataFile);
      buildNumber = metadata.getLastBuildNumber() + 1;
    }

    String rev = timestamp + "-" + buildNumber;
    // revision is x.y.z-TIMESTAMP-BUILDNUMBER
    asDependency.revision = pom.version.replace("SNAPSHOT", rev);

    String revisionArtifact = pom.artifactId + "-" + asDependency.revision;
    getConsole().log("deploying SNAPSHOT as {0}", revisionArtifact);

    // copy & rename -SNAPSHOT to -TIMESTAMP-BUILD
    FileSet fs = new FileSet();
    fs.setProject(getProject());
    fs.setDir(sourceDir);
    fs.setIncludes(pom.artifactId + "-" + pom.version + "*");

    for (String name : fs.getDirectoryScanner().getIncludedFiles()) {
      String targetName = name.replace("SNAPSHOT", rev);
      copyFile(new File(sourceDir, name), new File(artifactDir, targetName));
    }

    // output pom file
    generatePom(artifactDir, pom, revisionArtifact);

    // calculate checksums
    calculateChecksums(artifactDir, revisionArtifact + "*");

    // update SNAPSHOT metadata and purge obsolete artifacts
    PurgePolicy policy = getPurgePolicy();
    updateSnapshotMetadata(artifactDir, asDependency, policy);
   
    // update ARTIFACTS metadata
    updateArtifactsMetadata(artifactDir, asDependency);
 
}
TOP

Related Classes of org.moxie.ant.MxDeploy

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.