org.ebayopensource.turmeric.eclipse.mavenapi.impl.MavenEclipseApi.java Source code

Java tutorial

Introduction

Here is the source code for org.ebayopensource.turmeric.eclipse.mavenapi.impl.MavenEclipseApi.java

Source

/*******************************************************************************
 * 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);
        }
    }

}