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

org.apache.maven.dotnet.UnPackMojo Maven / Gradle / Ivy

Go to download

A plugin that provides general build and test facilities for .Net projects and solutions

The newest version!
/*
 * Maven and Sonar plugin for .Net
 * Copyright (C) 2010 Jose Chillan and Alexandre Victoor
 * mailto: [email protected] or [email protected]
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
 */

package org.apache.maven.dotnet;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.dotnet.commons.project.VisualStudioProject;
import org.apache.maven.dotnet.commons.project.VisualStudioSolution;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.codehaus.plexus.archiver.ArchiverException;
import org.codehaus.plexus.archiver.zip.ZipUnArchiver;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.logging.console.ConsoleLogger;
import org.codehaus.plexus.util.DirectoryWalkListener;
import org.codehaus.plexus.util.DirectoryWalker;
import org.codehaus.plexus.util.FileUtils;

/**
 * Download dependencies and unpack format SLN (zip)
 * 
 * @goal unpack
 * @requiresDependencyResolution
 * @phase unpack
 * @description package a .Net project or solution
 * @author Mathias COCHERIL Jun 23, 2010
 */
public class UnPackMojo extends AbstractDotNetMojo {

  final static int BIG_ARCHIVE_SIZE = (1 << 20) * 10; // 10Mb
  final static String LOCAL_DIR_NAME = "local",
  DOTNET_DIR_NAME = "dotnet",
  PROP_PREFIX = DOTNET_DIR_NAME + ".",
  PROP_UNPACK_ROOT = PROP_PREFIX + "unpack.root",
  PROP_OFFSET = PROP_PREFIX + "offset",
  DOTNET_DUMP_CSPROJ_VARS = PROP_PREFIX + "asp.file";

  
  /**
   * @parameter expression="${dotnet.unpack.root}" 
   */
  private String unPackRoot;

  /**
   * @parameter expression="${dotnet.offset}" 
   */
  private String offset;
  
  /**
   * @parameter expression="${dotnet.asp.file}" 
   */
  private String csprojvars;

  private Set dllDirs = new LinkedHashSet();

  private ConsoleLogger consolLogger = new ConsoleLogger(Logger.LEVEL_ERROR, "console");

  /**
   * @parameter default-value="${localRepository}"
   * @required
   */
  private ArtifactRepository localRepository;  // NOSONAR

  @Override
  protected void executeProject(VisualStudioProject visualProject) throws MojoExecutionException, MojoFailureException {
  }

  @Override
  protected void executeSolution(VisualStudioSolution visualSolution) throws MojoExecutionException, MojoFailureException {
  }

  /**
   * Launches the MOJO action. 
* This method downloads pom.xml and packages dependencies and build AssemblySearchPaths file * * @throws MojoExecutionException * @throws MojoFailureException */ @Override public void execute() throws MojoExecutionException, MojoFailureException { dllDirs.clear(); if (StringUtils.isEmpty(unPackRoot)) { unPackRoot = localRepository.getBasedir() + File.separator + DOTNET_DIR_NAME + File.separator + LOCAL_DIR_NAME; } if (offset == null) { offset = ""; } Iterator it = this.project.getArtifacts().iterator(); while (it.hasNext()) { Artifact artifact = it.next(); File packagePath = new File(unPackRoot + File.separator + localRepository.pathOf(artifact)); if ( !packagePath.getParentFile().exists()) { unZipPackage(artifact, localRepository.pathOf(artifact)); } else { getLog().info("UpToDate " + packagePath.getParentFile().getPath()); WatchedDirectoryWalkListener watchedDirectoryWalkListener = new WatchedDirectoryWalkListener(dllDirs, offset); DirectoryWalker dw = new DirectoryWalker(); dw.setBaseDir(new File(packagePath.getParentFile().getPath())); dw.addDirectoryWalkListener(watchedDirectoryWalkListener); try { dw.scan(); } catch (IllegalStateException e) { throw new MojoExecutionException(packagePath.getParentFile().getPath() + " : " + e.getMessage(), e); } } } if (csprojvars != null) { getLog().info("writing variables into file " + csprojvars); ByteArrayOutputStream baOut = new ByteArrayOutputStream(); PrintStream psOut = new PrintStream(baOut); psOut.println(""); psOut.println(" "); psOut.println(" "); psOut.println(" "); psOut.println(" "); psOut.print(" $(AssemblySearchPaths)"); Iterator iter = dllDirs.iterator(); while (iter.hasNext()) { psOut.println(";"); psOut.print(" " + iter.next()); } psOut.println(""); psOut.println(" "); psOut.println(" "); psOut.println(""); FileOutputStream fileOutputStreamOrder = null; try { fileOutputStreamOrder = new FileOutputStream(new File(csprojvars)); fileOutputStreamOrder.write(baOut.toByteArray()); } catch (FileNotFoundException e) { throw new MojoExecutionException("Troubles during writing variables", e); } catch (IOException e) { throw new MojoExecutionException("Troubles during writing variables", e); } finally { if (fileOutputStreamOrder != null) { try { fileOutputStreamOrder.close(); } catch (IOException e) { getLog().info(e); } } } } } /** * Unzip sln package. * * @param artifact * current artifact * @param packagePath * path where to unzip the package */ protected void unZipPackage(Artifact artifact, String packagePath) { if (artifact.getFile().exists()) { { if (artifact.getFile().length() > BIG_ARCHIVE_SIZE) { getLog().info(" " + artifact.getFile().getName() + " is a big archive. Uncompressing may take a while..."); } try { WatchedZipUnArchiver zip = new WatchedZipUnArchiver(dllDirs, offset); zip.setSourceFile(artifact.getFile()); zip.enableLogging(consolLogger); if (unPackRoot != null) { File unPackRootFile = (new File(unPackRoot + File.separator + packagePath)).getParentFile(); unPackRootFile.mkdirs(); zip.setDestDirectory(unPackRootFile); } else { zip.setDestDirectory(artifact.getFile().getParentFile()); } zip.extract(); getLog().info("Unarchived " + artifact.getFile().length() + " bytes"); } catch (ArchiverException e) { getLog().warn("Could not untar file "+ artifact.getFile(), e); } catch (IOException e) { getLog().warn("Could not untar file "+artifact.getFile(),e); } } } else { getLog().info("Nothing to untar !" + artifact.getFile()); } } private class WatchedZipUnArchiver extends ZipUnArchiver { Set dllDirs; String offset; WatchedZipUnArchiver(Set dllDirs, String offset) { this.dllDirs = dllDirs; this.offset = offset; } /** * Check for dll in package. * */ @Override protected void extractFile(File srcF, File dir, InputStream compressedInputStream, String entryName, Date entryDate, boolean isDirectory) throws IOException { super.extractFile(srcF, dir, compressedInputStream, entryName, entryDate, isDirectory); File file = FileUtils.resolveFile(dir, entryName); if (file.isFile() && file.getPath().startsWith(this.getDestDirectory().getPath() + File.separator + offset) && file.getName().endsWith(".dll")) { getLog().info("Watched : " + file.getAbsolutePath()); dllDirs.add(file.getParent()); } } } private class WatchedDirectoryWalkListener implements DirectoryWalkListener { Set dllDirs; String offset; WatchedDirectoryWalkListener(Set dllDirs, String offset) { this.dllDirs = dllDirs; this.offset = offset; } public void directoryWalkStarting(File baseDir) { this.baseDir = baseDir.getPath(); } /** * Check for dll on file system. * */ public void directoryWalkStep(int percentage, File file) { if (file.isFile() && file.getPath().startsWith(this.baseDir + File.separator + offset) && file.getName().endsWith(".dll")) { getLog().info("Watched : " + file.getAbsolutePath()); dllDirs.add(file.getParent()); } } public void directoryWalkFinished() { } private String baseDir; @Override public void debug(String arg0) { getLog().debug(arg0); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy