/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
* 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
*******************************************************************************/
package org.ebayopensource.turmeric.eclipse.mavenapi.impl;
import static org.apache.commons.lang.StringUtils.isNotBlank;
import static org.ebayopensource.turmeric.eclipse.mavenapi.impl.MavenApiHelper.getMavenProjectManager;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.WildcardQuery;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.model.Build;
import org.apache.maven.model.Model;
import org.apache.maven.model.Parent;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
import org.apache.maven.project.MavenProject;
import org.apache.maven.repository.metadata.ArtifactMetadata;
import org.ebayopensource.turmeric.eclipse.mavenapi.exception.MavenEclipseApiException;
import org.ebayopensource.turmeric.eclipse.mavenapi.request.AbstractProjectMavenizationRequest;
import org.ebayopensource.turmeric.eclipse.mavenapi.request.ProjectMavenizationRequest;
import org.ebayopensource.turmeric.eclipse.mavenapi.request.ProjectMavenizationRequestRaw;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jdt.core.JavaCore;
import org.maven.ide.eclipse.MavenPlugin;
import org.maven.ide.eclipse.core.IMavenConstants;
import org.maven.ide.eclipse.index.IndexedArtifact;
import org.maven.ide.eclipse.internal.index.NexusIndexManager;
import org.maven.ide.eclipse.internal.repository.RepositoryInfo;
import org.maven.ide.eclipse.project.IMavenProjectFacade;
import org.maven.ide.eclipse.project.IProjectConfigurationManager;
import org.maven.ide.eclipse.project.MavenProjectInfo;
import org.maven.ide.eclipse.project.ProjectImportConfiguration;
import org.maven.ide.eclipse.project.ResolverConfiguration;
import org.maven.ide.eclipse.repository.IRepositoryRegistry;
import org.sonatype.nexus.index.ArtifactInfo;
/**
* The Class MavenEclipseApi.
*
* @author <a href="oleg@codehaus.org">Oleg Gusakov</a>
*/
public class MavenEclipseApi extends AbstractMavenEclipseApi {
private Model generateModel(final ProjectMavenizationRequest req,
IProgressMonitor monitor) {
final Model model = new Model();
model.setModelVersion("4.0.0");
final ArtifactMetadata artifact = req.getArtifact();
if ((monitor instanceof NullProgressMonitor) == false) {
monitor = new SubProgressMonitor(monitor, 50);
monitor.setTaskName("Mavenizing project->"
+ req.getEclipseProject());
}
if (req.getParent() != null) {
final ArtifactMetadata md = req.getParent();
final Parent parent = new Parent();
parent.setGroupId(md.getGroupId());
parent.setArtifactId(md.getArtifactId());
parent.setVersion(md.getVersion());
model.setParent(parent);
}
monitor.worked(5);
model.setGroupId(artifact.getGroupId());
model.setArtifactId(artifact.getArtifactId());
model.setVersion(artifact.getVersion());
model.setName(req.getEclipseProject().getName());
if (isNotBlank(artifact.getType())
&& !StringUtils.equalsIgnoreCase(artifact.getType().trim(),
"jar"))
model.setPackaging(artifact.getType());
final Properties props = req.getProperties();
if (props != null && props.size() > 0)
model.setProperties(props);
monitor.worked(5);
// build is first set into model here
if (req.getSourcePath() != null) {
final String sp = req.getSourcePath();
final Build build = model.getBuild() != null ? model.getBuild()
: new Build();
build.setSourceDirectory(sp);
model.setBuild(build);
}
if (req.getTestSourcePath() != null) {
final Build build = model.getBuild() != null ? model.getBuild()
: new Build();
build.setTestSourceDirectory(req.getTestSourcePath());
model.setBuild(build);
}
if (req.getTestOutputPath() != null) {
final Build build = model.getBuild() != null ? model.getBuild()
: new Build();
build.setTestOutputDirectory(req.getTestOutputPath());
model.setBuild(build);
}
if (req.getResourceDirectories() != null
&& req.getResourceDirectories().isEmpty() == false) {
final Build build = model.getBuild() != null ? model.getBuild()
: new Build();
build.setResources(req.getResourceDirectories());
model.setBuild(build);
}
monitor.worked(5);
if (req.getTestResourceDirectories() != null
&& req.getTestResourceDirectories().isEmpty() == false) {
final Build build = model.getBuild() != null ? model.getBuild()
: new Build();
build.setTestResources(req.getTestResourceDirectories());
model.setBuild(build);
}
monitor.worked(5);
if (req.getBuildPlugins() != null
&& req.getBuildPlugins().isEmpty() == false) {
final Build build = model.getBuild() != null ? model.getBuild()
: new Build();
for (Plugin buildPlugin : req.getBuildPlugins()) {
build.addPlugin(buildPlugin);
}
}
if (req.getOutputPath() != null) {
final Build build = model.getBuild() != null ? model.getBuild()
: new Build();
build.setOutputDirectory(req.getOutputPath());
}
if (req.getDependencies() != null
&& req.getDependencies().isEmpty() == false) {
for (final ArtifactMetadata am : req.getDependencies()) {
model.addDependency(MavenEclipseUtil.dependency(am));
}
}
monitor.worked(5);
return model;
}
private void mavenizeProject(Model model, IProject proj,
IProgressMonitor monitor) throws MavenEclipseApiException {
final MavenXpp3Writer mw = new MavenXpp3Writer();
final IFile pom = proj.getFile(IMavenConstants.POM_FILE_NAME);
try {
final StringWriter sw = new StringWriter();
mw.write(sw, model);
final ByteArrayInputStream bais = new ByteArrayInputStream(sw
.toString().getBytes());
if (pom.exists())
pom.setContents(bais, true, true, null);
else
pom.create(bais, true, null);
final MavenPlugin m3e = MavenPlugin.getDefault();
if (m3e == null)
throw new MavenEclipseApiException("Cannot obtain MavenPlugin");
/*
* final BuildPathManager bpm = m3e.getBuildpathManager(); if( bpm
* == null ) throw new MavenEclipseApiException(
* "Cannot obtain BuildPathManager from MavenPlugin" );
*/
monitor.worked(5);
final MavenProjectInfo info = new MavenProjectInfo(proj.getName(),
pom.getLocation().toFile(), model, null);
final ProjectImportConfiguration importConfiguration = new ProjectImportConfiguration();
// will get SWTException if a normal progress monitor
// is passed to M2Eclipse API (0.10.0),
// which terminates the artifact downloading. See
// https://issues.sonatype.org/browse/MNGECLIPSE-2251. To work
// around, use NullProgressMonitor instead.
monitor = new NullProgressMonitor();
final IProjectConfigurationManager configManager = MavenPlugin
.getDefault().getProjectConfigurationManager();
final Collection<MavenProjectInfo> projects = new ArrayList<MavenProjectInfo>(
1);
projects.add(info);
// configManager.getRule();
// configManager.createSimpleProject(proj, pom.getLocation(), model,
// null, importConfiguration, monitor);
configManager
.importProjects(projects, importConfiguration, monitor);
final ResolverConfiguration rc = new ResolverConfiguration();
if (proj.hasNature(JavaCore.NATURE_ID) == false
|| proj.hasNature(IMavenConstants.NATURE_ID) == false)
;
{// during the import project process, the JDT/Maven natures will
// not be added if the project already exists
configManager.enableMavenNature(proj, rc, monitor);
}
// this function consumes too much memory
// configManager.updateProjectConfiguration(proj, rc, "", monitor);
pom.refreshLocal(IResource.DEPTH_INFINITE, monitor);
} catch (final Exception e) {
throw new MavenEclipseApiException(e);
}
}
/**
* {@inheritDoc}
*/
@Override
public IProject mavenizeProject(final ProjectMavenizationRequest req,
IProgressMonitor monitor) throws MavenEclipseApiException {
Model model = generateModel(req, monitor);
mavenizeProject(model, req.getEclipseProject(), monitor);
return req.getEclipseProject();
}
/**
* {@inheritDoc}
*/
@Override
public Artifact resolveArtifact(final ArtifactMetadata metadata)
throws MavenEclipseApiException {
if (metadata == null)
return null;
return super.resolveArtifact(_getEmbedder(),
MavenApiHelper.getRepositorySystem(), metadata);
}
/**
* {@inheritDoc}
*/
@Override
public Collection<Artifact> findGroup(final String groupRegEx)
throws MavenEclipseApiException {
return _toArtifactCollection(_findGroup(_getIndexManager(), groupRegEx));
}
/**
* {@inheritDoc}
*/
@Override
public Collection<Artifact> findArtifact(final String query)
throws MavenEclipseApiException {
return _toArtifactCollection(_findArtifact(_getIndexManager(), query));
}
/**
* {@inheritDoc}
*/
@Override
public List<Artifact> resolveArtifactAsClasspath(
final ArtifactMetadata metadata) throws MavenEclipseApiException {
return super.resolveArtifactAsClasspath(_getEmbedder(), metadata);
}
/**
* {@inheritDoc}
*/
@Override
public MavenProject resolveArtifactAsProject(final Artifact artifact)
throws MavenEclipseApiException {
if (artifact == null)
return null;
final IMavenProjectFacade facade = getMavenProjectManager()
.getMavenProject(artifact.getGroupId(),
artifact.getArtifactId(), artifact.getVersion());
try {
if (facade != null)
return facade.getMavenProject(new NullProgressMonitor());
resolveArtifact(artifact);
final File pomFile = MavenEclipseUtil.getArtifactPOMFile(artifact);
if (pomFile.exists() == false) {
final ArtifactMetadata pomArtifact = MavenEclipseUtil
.artifactMetadata(artifact);
pomArtifact.setType(PACKAGING_TYPE_POM);
resolveArtifact(pomArtifact);
}
return _getEmbedder().readProject(pomFile,
new NullProgressMonitor());
} catch (CoreException e) {
throw new MavenEclipseApiException(e);
}
}
/**
* according to name,to search artifact. It supports wildcard.
*
* @param name the name, may include wild cards.
* @return a Collection of Artifacts that matched the query.
* @throws MavenEclipseApiException the maven eclipse api exception
*/
public Collection<Artifact> findArtifactByName(String name)
throws MavenEclipseApiException {
return findArtifactByNameAndGroup(name, "");
}
/**
* {@inheritDoc}
*/
@Override
public Collection<Artifact> findArtifactByNameAndGroup(String name,
String group) throws MavenEclipseApiException {
return findArtifactByNameAndGroupAndRepositoryUrl(name, group, "");
}
/**
* according to artifact name,group and repository url ,to search artifact.
* It supports wildcard.
*
* @param name the artifact name, can include wildcards
* @param group the group id, can include wildcards
* @param repositoryUrl a repository url location
* @return a collection of artifacts that matched the query
* @throws MavenEclipseApiException the maven eclipse api exception
*/
public Collection<Artifact> findArtifactByNameAndGroupAndRepositoryUrl(
String name, String group, String repositoryUrl)
throws MavenEclipseApiException {
Collection<ArtifactMetadata> ams = null;
try {
BooleanQuery bq = new BooleanQuery();
BooleanQuery.setMaxClauseCount(Integer.MAX_VALUE);
Query query = null;
if (StringUtils.isNotBlank(name)) {
bq.add(new WildcardQuery(new Term(ArtifactInfo.ARTIFACT_ID,
name.toLowerCase())), Occur.MUST);
} else {
bq.add(new WildcardQuery(
new Term(ArtifactInfo.ARTIFACT_ID, "*")), Occur.MUST);
}
if (StringUtils.isNotBlank(group)) {
bq.add(new WildcardQuery(new Term(ArtifactInfo.GROUP_ID, group
.toLowerCase())), Occur.MUST);
} else {
bq.add(new WildcardQuery(new Term(ArtifactInfo.GROUP_ID, "*")),
Occur.MUST);
}
RepositoryInfo repository = new RepositoryInfo(null, repositoryUrl,
IRepositoryRegistry.SCOPE_UNKNOWN, null);
final Map<String, IndexedArtifact> results = ((NexusIndexManager) _getIndexManager())
.search(repository, bq);
ams = _returnFindings(results);
} catch (final CoreException e) {
throw new MavenEclipseApiException(e);
}
return _toArtifactCollection(ams);
}
/**
* {@inheritDoc}
*/
@Override
public IProject mavenizeProject(AbstractProjectMavenizationRequest req,
IProgressMonitor monitor) throws MavenEclipseApiException {
if (req instanceof ProjectMavenizationRequest) {
return mavenizeProject((ProjectMavenizationRequest) req, monitor);
} else if (req instanceof ProjectMavenizationRequestRaw) {
final ProjectMavenizationRequestRaw reqRaw = (ProjectMavenizationRequestRaw) req;
mavenizeProject(reqRaw.getMavenModel(), reqRaw.getEclipseProject(),
monitor);
return reqRaw.getEclipseProject();
} else {
throw new IllegalArgumentException("illegal argument->" + req);
}
}
}