package org.codehaus.mojo.repositorytools;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.maven.archiva.discoverer.ArtifactDiscoverer;
import org.apache.maven.archiva.discoverer.DiscovererException;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.manager.WagonManager;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.wagon.ConnectionException;
import org.apache.maven.wagon.ResourceDoesNotExistException;
import org.apache.maven.wagon.TransferFailedException;
import org.apache.maven.wagon.UnsupportedProtocolException;
import org.apache.maven.wagon.Wagon;
import org.apache.maven.wagon.authentication.AuthenticationException;
import org.apache.maven.wagon.authorization.AuthorizationException;
import org.apache.maven.wagon.repository.Repository;
import org.codehaus.mojo.repositorytools.components.RepositoryToolsException;
import org.codehaus.mojo.repositorytools.util.RepositoryUtils;
import org.codehaus.mojo.repositorytools.validation.ArtifactValidationManager;
import org.codehaus.plexus.archiver.ArchiverException;
import org.codehaus.plexus.archiver.UnArchiver;
import org.codehaus.plexus.archiver.manager.ArchiverManager;
import org.codehaus.plexus.archiver.manager.NoSuchArchiverException;
import org.codehaus.plexus.components.interactivity.Prompter;
import org.codehaus.plexus.components.interactivity.PrompterException;
/**
* Deploy a collection of artifacts that are packaged in a bundle. Supported
* bundle formats:
* <ul>
* <li>A single project, with pom, sources and apidoc in the root of the
* bundle, as created by the repository plugin (NYI)</li>
* <li>A zipped local repository</li>
* </ul>
*
* @goal deploy-bundle
* @requiresProject false
* @author tom
*
*/
public class DeployBundleMojo extends AbstractDeployMojo
{
/**
* @parameter expression="${bundleURL}"
* @required
*/
private String bundleURL;
/**
* @component
* @required
* @readonly
*/
private WagonManager wagonManager;
/**
* @parameter default-value="bundle" expression="${site}"
*/
private String siteId;
/**
* @component
* @required
* @readonly
*/
private ArchiverManager archiverManager;
/**
* @component
* @required
* @readonly
*/
private ArtifactValidationManager validationManager;
/**
* @component
* @required
* @readonly
*/
private Prompter prompter;
/**
* @component
* @required
* @readonly
*/
private ArtifactDiscoverer discoverer;
public ArtifactRepository createLocalRepository()
throws RepositoryToolsException
{
URL url;
try
{
url = new URL(bundleURL);
}
catch (MalformedURLException e)
{
throw new RepositoryToolsException("Invalid bundle URL: "
+ bundleURL);
}
// extract bundle
try
{
URL base = new URL(url.getProtocol(), url.getHost(), url.getPort(),
"/");
String file = url.getFile();
Wagon wagon = wagonManager.getWagon(url.getProtocol());
wagon.connect(new Repository(siteId, base.toExternalForm()));
File dest = File.createTempFile("DeployBundle", ".jar");
dest.deleteOnExit();
wagon.get(file, dest);
wagon.disconnect();
// check format
// assume directory structure for now
// use the temporary file without extension as a directory
// not unbreakable, but how do you make a unique temporary directory
// ?
String dirName = dest.getName().substring(0,
dest.getName().indexOf('.'));
File destDir = new File(dest.getParent(), dirName);
destDir.mkdirs();
UnArchiver unArchiver = archiverManager.getUnArchiver(dest);
unArchiver.setDestDirectory(destDir);
unArchiver.setSourceFile(dest);
unArchiver.extract();
// create single artifact or multiple artifacts
ArtifactRepository localRepository = cliTools.createLocalRepository(destDir);
List artifacts = discoverer.discoverArtifacts(localRepository, Collections.EMPTY_LIST, null);
// validate artifacts
for (Iterator iterator = artifacts.iterator(); iterator.hasNext();) {
Artifact artifact = (Artifact) iterator.next();
Map msgs = validationManager
.validateArtifact(artifact, cliTools.createRemoteRepositories(target),
localRepository);
RepositoryUtils.printValidation(getLog(), msgs);
}
String answer= prompter.prompt("Continue ?", Arrays.asList(new String[] {"Y", "N"}), "N");
if (!answer.equalsIgnoreCase("Y")) {
throw new RepositoryToolsException("Deployment interrupted by user.");
}
return localRepository;
}
catch (UnsupportedProtocolException e)
{
throw new RepositoryToolsException("", e);
}
catch (ConnectionException e)
{
throw new RepositoryToolsException("", e);
}
catch (AuthenticationException e)
{
throw new RepositoryToolsException("", e);
}
catch (MalformedURLException e)
{
// should not happen
throw new RepositoryToolsException("", e);
}
catch (TransferFailedException e)
{
throw new RepositoryToolsException("", e);
}
catch (ResourceDoesNotExistException e)
{
throw new RepositoryToolsException("", e);
}
catch (AuthorizationException e)
{
throw new RepositoryToolsException("", e);
}
catch (IOException e)
{
throw new RepositoryToolsException("", e);
}
catch (NoSuchArchiverException e)
{
throw new RepositoryToolsException("", e);
}
catch (ArchiverException e)
{
throw new RepositoryToolsException("", e);
}
catch (RepositoryToolsException e)
{
throw new RepositoryToolsException("", e);
}
catch (PrompterException e)
{
throw new RepositoryToolsException("", e);
}
catch (DiscovererException e)
{
throw new RepositoryToolsException("", e);
}
}
}