Java tutorial
/* * (C) Copyright 2006-2011 Nuxeo SAS (http://nuxeo.com/) and contributors. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser General Public License * (LGPL) version 2.1 which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl.html * * This library 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. * * Contributors: * bstefanescu, slacoin */ package org.nuxeo.build.maven; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.InvalidRepositoryException; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.resolver.ArtifactCollector; import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.artifact.resolver.DefaultArtifactCollector; import org.apache.maven.artifact.resolver.ResolutionListener; import org.apache.maven.artifact.resolver.filter.ArtifactFilter; import org.apache.maven.embedder.MavenEmbedderConsoleLogger; import org.apache.maven.embedder.MavenEmbedderException; import org.apache.maven.model.Model; import org.apache.maven.model.Profile; import org.apache.maven.model.Repository; import org.apache.maven.model.RepositoryPolicy; import org.apache.maven.profiles.ProfileManager; import org.apache.maven.project.DefaultMavenProjectBuilder; import org.apache.maven.project.InvalidProjectModelException; import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectBuilder; import org.apache.maven.project.MavenProjectHelper; import org.apache.maven.project.ProjectBuildingException; import org.apache.maven.project.ProjectUtils; import org.apache.maven.project.artifact.InvalidDependencyVersionException; import org.apache.maven.settings.MavenSettingsBuilder; import org.apache.maven.settings.Settings; import org.apache.tools.ant.BuildException; import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import org.codehaus.plexus.embed.Embedder; import org.codehaus.plexus.util.IOUtil; import org.codehaus.plexus.util.xml.pull.XmlPullParserException; import org.nuxeo.build.ant.profile.AntProfileManager; import org.nuxeo.build.maven.graph.Graph; /** * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a> * */ @SuppressWarnings("unchecked") public class EmbeddedMavenClient extends MavenEmbedder implements MavenClient { protected Graph graph; protected File settingsFile; private List<ArtifactRepository> remoteRepos; protected AntProfileManager profileMgr = new AntProfileManager(); protected Logger mylogger; public EmbeddedMavenClient() { this(null); } public EmbeddedMavenClient(ClassLoader loader) { if (loader == null) { loader = Thread.currentThread().getContextClassLoader(); if (loader == null) { loader = EmbeddedMavenClient.class.getClassLoader(); } } setClassLoader(loader); graph = new Graph(this); mylogger = new MyLogger(); logger = new MavenEmbedderConsoleLogger(); } public List<Profile> getActiveProfiles() { throw new UnsupportedOperationException("Not yet implemented"); } public MavenProjectHelper getProjectHelper() { try { return (MavenProjectHelper) embedder.lookup(MavenProjectHelper.ROLE); } catch (Exception e) { throw new BuildException("Failed to lookup maven project helper"); } } public AntProfileManager getAntProfileManager() { return profileMgr; } public boolean isStarted() { return embedder != null; } public Graph getGraph() { return graph; } public ArtifactResolver getArtifactResolver() { return artifactResolver; } public ArtifactFactory getArtifactFactory() { return artifactFactory; } public Embedder getPlexusEmbedder() { return embedder; } public ProfileManager getProfileManager() { return profileManager; } public MavenProjectBuilder getProjectBuilder() { return mavenProjectBuilder; } public void setSettings(File settingsFile) { this.settingsFile = settingsFile; } public Settings getSettings() { return settings; } /** * Default implementation is not flexible enough */ @Override protected void createMavenSettings() throws MavenEmbedderException, ComponentLookupException { if (settingsFile != null) { settingsBuilder = (MavenSettingsBuilder) embedder.lookup(MavenSettingsBuilder.ROLE); try { settings = settingsBuilder.buildSettings(settingsFile); } catch (IOException e) { throw new MavenEmbedderException("Error creating settings.", e); } catch (XmlPullParserException e) { throw new MavenEmbedderException("Error creating settings.", e); } } else { super.createMavenSettings(); } settings.setOffline(offline); } public List<ArtifactRepository> getRemoteRepositories() { if (remoteRepos == null) { try { remoteRepos = buildRepositoriesFromProfiles(); } catch (Exception e) { remoteRepos = new ArrayList<ArtifactRepository>(); } addDefaultRepositories(); } return remoteRepos; } protected void addDefaultRepositories() { Repository repo = new Repository(); repo.setId("central"); repo.setUrl("http://repo1.maven.org/maven2"); repo.setLayout("default"); RepositoryPolicy policy = new RepositoryPolicy(); policy.setEnabled(false); repo.setSnapshots(policy); addRemoteRepository(repo); } public void addRemoteRepository(Repository repo) { try { ArtifactRepository arepo = ProjectUtils.buildArtifactRepository(repo, artifactRepositoryFactory, getPlexusEmbedder().getContainer()); getRemoteRepositories().add(arepo); } catch (Exception e) { e.printStackTrace(); } } public void resolve(Artifact artifact) throws ArtifactNotFoundException { resolve(artifact, getRemoteRepositories()); } public void resolve(Artifact artifact, List<ArtifactRepository> remoteRepositories) throws ArtifactNotFoundException { try { super.resolve(artifact, remoteRepositories, localRepository); } catch (ArtifactResolutionException e) { throw new RuntimeException(e); } } public List<ArtifactRepository> buildRepositoriesFromProfiles() throws Exception { ArrayList<ArtifactRepository> repos = new ArrayList<ArtifactRepository>(); List<Profile> profiles = getProfileManager().getActiveProfiles(); for (Profile profile : profiles) { List<Repository> prepos = profile.getRepositories(); for (Repository mavenRepo : prepos) { ArtifactRepository artifactRepo = null; try { artifactRepo = ProjectUtils.buildArtifactRepository(mavenRepo, artifactRepositoryFactory, getPlexusEmbedder().getContainer()); } catch (InvalidRepositoryException e) { throw new Exception("Failed to build profile repositories", e); } repos.add(artifactRepo); } } return repos; } public List<ArtifactRepository> buildArtifactRepositories(Model model) throws Exception { ArrayList<ArtifactRepository> repos = new ArrayList<ArtifactRepository>(); List<Repository> mavenRepos = model.getRepositories(); for (Repository mavenRepo : mavenRepos) { ArtifactRepository artifactRepo = null; try { artifactRepo = ProjectUtils.buildArtifactRepository(mavenRepo, artifactRepositoryFactory, getPlexusEmbedder().getContainer()); } catch (InvalidRepositoryException e) { throw new Exception("Failed to build profile repositories", e); } repos.add(artifactRepo); } return repos; } public Model readModel(String projectId, File pom, boolean strict) throws Exception { Reader reader = new FileReader(pom); try { return readModel(projectId, pom.getAbsolutePath(), reader, strict); } finally { reader.close(); } } public Model readModel(String projectId, URL pom, boolean strict) throws Exception { Reader reader = new InputStreamReader(pom.openStream()); try { return readModel(projectId, pom.toExternalForm(), reader, strict); } finally { reader.close(); } } public Model readModel(String projectId, String pomLocation, Reader reader, boolean strict) throws IOException, InvalidProjectModelException { String modelSource = IOUtil.toString(reader); if (modelSource.indexOf("<modelVersion>" + DefaultMavenProjectBuilder.MAVEN_MODEL_VERSION) < 0) { throw new InvalidProjectModelException(projectId, pomLocation, "Not a v" + DefaultMavenProjectBuilder.MAVEN_MODEL_VERSION + " POM."); } StringReader sReader = new StringReader(modelSource); try { return modelReader.read(sReader, strict); } catch (XmlPullParserException e) { throw new InvalidProjectModelException(projectId, pomLocation, "Parse error reading POM. Reason: " + e.getMessage(), e); } } public Logger getCommonLogger() { return new MyLogger(); } class MyLogger implements Logger { public void debug(String message) { logger.debug(message); } public void debug(String message, Throwable error) { logger.debug(message, error); } public void error(String message) { logger.error(message); } public void error(String message, Throwable error) { logger.error(message, error); } public void info(String message) { logger.info(message); } public void info(String message, Throwable error) { logger.info(message, error); } public void warn(String message) { logger.warn(message); } public void warn(String message, Throwable error) { logger.warn(message, error); } public boolean isDebugEnabled() { return logger.isDebugEnabled(); } @Override public void info(Throwable error) { logger.info("", error); } @Override public void warn(Throwable error) { logger.warn("", error); } @Override public void error(Throwable error) { logger.error("", error); } @Override public void debug(Throwable error) { logger.debug("", error); } } public void resolveDependencyTree(Artifact artifact, ArtifactFilter filter, ResolutionListener listener) throws ArtifactResolutionException, ProjectBuildingException { MavenProject project = mavenProjectBuilder.buildFromRepository(artifact, getRemoteRepositories(), localRepository); @SuppressWarnings("rawtypes") Set dependencyArtifacts = project.getDependencyArtifacts(); if (dependencyArtifacts == null) { try { dependencyArtifacts = project.createArtifacts(artifactFactory, null, null); } catch (InvalidDependencyVersionException e) { throw new ArtifactResolutionException("Cannot set dependencies", artifact, e); } project.setDependencyArtifacts(dependencyArtifacts); } ArtifactCollector collector = new DefaultArtifactCollector(); collector.collect(dependencyArtifacts, project.getArtifact(), project.getManagedVersionMap(), localRepository, project.getRemoteArtifactRepositories(), artifactMetadataSource, filter, Collections.singletonList(listener)); } @Override public Graph newGraph() { graph = new Graph(this); return graph; } }