From 7cc2ed78ddf20843f7cc3da481636009ff428dde Mon Sep 17 00:00:00 2001 From: Xavier Fournet Date: Wed, 15 Aug 2012 14:03:36 +0200 Subject: [PATCH 1/3] [IDEA-91145] Merge maven-embedder-1.1-SNAPSHOT into maven2-server-impl --- .../maven-embedder-1.1-SNAPSHOT-sources.jar | Bin 12269 -> 0 bytes .../lib/maven-embedder-1.1-SNAPSHOT.jar | Bin 23104 -> 0 bytes .../maven2-server-impl/maven2-server-impl.iml | 11 - .../maven/embedder/AbstractMavenLogger.java | 114 ++++ .../maven/embedder/FieldAccessor.java | 54 ++ .../maven/embedder/MavenEmbedder.java | 577 ++++++++++++++++++ .../maven/embedder/MavenEmbedderLog.java | 76 +++ .../maven/embedder/MavenEmbedderLogger.java | 31 + .../maven/embedder/MavenEmbedderSettings.java | 151 +++++ .../maven/embedder/MavenExecutionResult.java | 44 ++ .../maven/embedder/NullMavenLogger.java | 12 + .../embedder/PlexusComponentConfigurator.java | 13 + 12 files changed, 1072 insertions(+), 11 deletions(-) delete mode 100644 plugins/maven/maven2-server-impl/lib-src/maven-embedder-1.1-SNAPSHOT-sources.jar delete mode 100644 plugins/maven/maven2-server-impl/lib/maven-embedder-1.1-SNAPSHOT.jar create mode 100644 plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/AbstractMavenLogger.java create mode 100644 plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/FieldAccessor.java create mode 100644 plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedder.java create mode 100644 plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedderLog.java create mode 100644 plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedderLogger.java create mode 100644 plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedderSettings.java create mode 100644 plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenExecutionResult.java create mode 100644 plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/NullMavenLogger.java create mode 100644 plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/PlexusComponentConfigurator.java diff --git a/plugins/maven/maven2-server-impl/lib-src/maven-embedder-1.1-SNAPSHOT-sources.jar b/plugins/maven/maven2-server-impl/lib-src/maven-embedder-1.1-SNAPSHOT-sources.jar deleted file mode 100644 index 041fce01bc86fb45e7db6350ff72bda9e8827d87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12269 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 diff --git a/plugins/maven/maven2-server-impl/lib/maven-embedder-1.1-SNAPSHOT.jar b/plugins/maven/maven2-server-impl/lib/maven-embedder-1.1-SNAPSHOT.jar deleted file mode 100644 index c08b985459fba1072173ccd85a137e1d064cc709..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23104 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 - - - - - - - - - - - diff --git a/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/AbstractMavenLogger.java b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/AbstractMavenLogger.java new file mode 100644 index 000000000000..b166d1ea5d6b --- /dev/null +++ b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/AbstractMavenLogger.java @@ -0,0 +1,114 @@ +/* ========================================================================== + * Copyright 2006 Mevenide Team + * + * 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 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================================= + */ + +package org.jetbrains.maven.embedder; + +import org.codehaus.plexus.logging.Logger; + +public abstract class AbstractMavenLogger implements Logger { + private static final String LINE_SEPARATOR = System.getProperty("line.separator"); + + private int myThreshold; + + private void doPrint(int level, String message, Throwable throwable) { + if (level < myThreshold) return; + + if (!message.endsWith(LINE_SEPARATOR)) { + message += LINE_SEPARATOR; + } + + printMessage(level, message, throwable); + } + + protected abstract void printMessage(int level, String message, Throwable throwable); + + public void debug(String string, Throwable throwable) { + doPrint(LEVEL_DEBUG, string, throwable); + } + + public void info(String string, Throwable throwable) { + doPrint(LEVEL_INFO, string, throwable); + } + + public void warn(String string, Throwable throwable) { + doPrint(LEVEL_WARN, string, throwable); + } + + public void error(String string, Throwable throwable) { + doPrint(LEVEL_ERROR, string, throwable); + } + + public void fatalError(String string, Throwable throwable) { + doPrint(LEVEL_FATAL, string, throwable); + } + + public void debug(String message) { + debug(message, null); + } + + public boolean isDebugEnabled() { + return getThreshold() <= LEVEL_DEBUG; + } + + public void info(String message) { + info(message, null); + } + + public boolean isInfoEnabled() { + return getThreshold() <= LEVEL_INFO; + } + + public void warn(String message) { + warn(message, null); + } + + public boolean isWarnEnabled() { + return getThreshold() <= LEVEL_WARN; + } + + public void error(String message) { + error(message, null); + } + + public boolean isErrorEnabled() { + return getThreshold() <= LEVEL_ERROR; + } + + public void fatalError(String message) { + fatalError(message, null); + } + + public boolean isFatalErrorEnabled() { + return getThreshold() <= LEVEL_FATAL; + } + + public void setThreshold(int threshold) { + this.myThreshold = threshold; + } + + public int getThreshold() { + return myThreshold; + } + + public Logger getChildLogger(String s) { + return null; + } + + public String getName() { + return toString(); + } +} diff --git a/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/FieldAccessor.java b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/FieldAccessor.java new file mode 100644 index 000000000000..90255d1320df --- /dev/null +++ b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/FieldAccessor.java @@ -0,0 +1,54 @@ +/* + * Copyright 2000-2009 JetBrains s.r.o. + * + * 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 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.maven.embedder; + +import java.lang.reflect.Field; + +class FieldAccessor { + private volatile FIELD_TYPE myWagonManagerCache; + private final Class myHostClass; + private final Object myHost; + private final String myFieldName; + + public FieldAccessor(Class hostClass, T host, String fieldName) { + myHostClass = hostClass; + myHost = host; + myFieldName = fieldName; + } + + public FIELD_TYPE getField() { + if (myWagonManagerCache == null) { + Object value = getFieldValue(myHostClass, myFieldName, myHost); + //noinspection unchecked + myWagonManagerCache = (FIELD_TYPE)value; + } + return myWagonManagerCache; + } + + private Object getFieldValue(Class c, String fieldName, Object o) { + try { + Field f = c.getDeclaredField(fieldName); + f.setAccessible(true); + return f.get(o); + } + catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } + catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedder.java b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedder.java new file mode 100644 index 000000000000..3fa0fa4762bd --- /dev/null +++ b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedder.java @@ -0,0 +1,577 @@ +/* + * Copyright 2000-2009 JetBrains s.r.o. + * + * 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 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.maven.embedder; + +import org.apache.maven.DefaultMaven; +import org.apache.maven.Maven; +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.factory.ArtifactFactory; +import org.apache.maven.artifact.handler.ArtifactHandler; +import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; +import org.apache.maven.artifact.manager.DefaultWagonManager; +import org.apache.maven.artifact.manager.WagonManager; +import org.apache.maven.artifact.metadata.ArtifactMetadataSource; +import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.artifact.repository.ArtifactRepositoryFactory; +import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy; +import org.apache.maven.artifact.repository.DefaultArtifactRepository; +import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; +import org.apache.maven.artifact.resolver.*; +import org.apache.maven.execution.DefaultMavenExecutionRequest; +import org.apache.maven.execution.MavenExecutionRequest; +import org.apache.maven.execution.ReactorManager; +import org.apache.maven.extension.ExtensionManager; +import org.apache.maven.model.Extension; +import org.apache.maven.model.Plugin; +import org.apache.maven.monitor.event.DefaultEventDispatcher; +import org.apache.maven.monitor.event.DefaultEventMonitor; +import org.apache.maven.monitor.event.EventDispatcher; +import org.apache.maven.plugin.PluginManager; +import org.apache.maven.profiles.DefaultProfileManager; +import org.apache.maven.profiles.ProfileManager; +import org.apache.maven.project.MavenProject; +import org.apache.maven.project.MavenProjectBuilder; +import org.apache.maven.project.ProjectBuilderConfiguration; +import org.apache.maven.project.interpolation.ModelInterpolationException; +import org.apache.maven.settings.*; +import org.codehaus.classworlds.ClassWorld; +import org.codehaus.plexus.DefaultPlexusContainer; +import org.codehaus.plexus.PlexusContainer; +import org.codehaus.plexus.PlexusContainerException; +import org.codehaus.plexus.component.repository.ComponentDescriptor; +import org.codehaus.plexus.component.repository.exception.ComponentLookupException; +import org.codehaus.plexus.logging.BaseLoggerManager; +import org.codehaus.plexus.logging.Logger; +import org.codehaus.plexus.util.xml.Xpp3Dom; +import org.codehaus.plexus.util.xml.pull.XmlPullParserException; +import org.jetbrains.annotations.NotNull; +import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher; +import org.sonatype.plexus.components.sec.dispatcher.SecDispatcherException; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.*; + +public class MavenEmbedder { + private static final String PROP_MAVEN_HOME = "maven.home"; + + private final DefaultPlexusContainer myContainer; + private final Settings mySettings; + private final Logger myLogger; + private final MavenEmbedderSettings myEmbedderSettings; + private final ArtifactRepository myLocalRepository; + + private MavenEmbedder(@NotNull DefaultPlexusContainer container, + @NotNull Settings settings, + @NotNull Logger logger, + @NotNull MavenEmbedderSettings embedderSettings) { + myContainer = container; + mySettings = settings; + myLogger = logger; + myEmbedderSettings = embedderSettings; + myLocalRepository = createLocalRepository(embedderSettings); + + loadSettings(); + } + + private void loadSettings() { + // copied from DefaultMaven.resolveParameters + // copied because using original code spoils something in the container and configuration are get messed and not picked up. + WagonManager wagonManager = getComponent(WagonManager.class); + + wagonManager.setOnline(!mySettings.isOffline()); + + if (wagonManager instanceof DefaultWagonManager) { + ((DefaultWagonManager)wagonManager).setHttpUserAgent("Apache-Maven/2.2"); + } + + Proxy proxy = mySettings.getActiveProxy(); + if (proxy != null && proxy.getHost() != null) { + String pass = decrypt(proxy.getPassword()); + wagonManager.addProxy(proxy.getProtocol(), proxy.getHost(), proxy.getPort(), proxy.getUsername(), pass, proxy.getNonProxyHosts()); + } + + for (Object each : mySettings.getServers()) { + Server server = (Server)each; + + String passWord = decrypt(server.getPassword()); + String passPhrase = decrypt(server.getPassphrase()); + + wagonManager.addAuthenticationInfo(server.getId(), server.getUsername(), passWord, server.getPrivateKey(), passPhrase); + + wagonManager.addPermissionInfo(server.getId(), server.getFilePermissions(), server.getDirectoryPermissions()); + + if (server.getConfiguration() != null) { + wagonManager.addConfiguration(server.getId(), (Xpp3Dom)server.getConfiguration()); + } + } + + for (Object each : mySettings.getMirrors()) { + Mirror mirror = (Mirror)each; + if (mirror.getUrl() == null) continue; + wagonManager.addMirror(mirror.getId(), mirror.getMirrorOf(), mirror.getUrl()); + } + // end copied from DefaultMaven.resolveParameters + } + + private String decrypt(String pass) { + try { + pass = getComponent(SecDispatcher.class, "maven").decrypt(pass); + } + catch (SecDispatcherException e) { + MavenEmbedderLog.LOG.warn(e); + } + return pass; + } + + private ArtifactRepository createLocalRepository(MavenEmbedderSettings generalSettings) { + ArtifactRepositoryLayout layout = getComponent(ArtifactRepositoryLayout.class, "default"); + ArtifactRepositoryFactory factory = getComponent(ArtifactRepositoryFactory.class); + + String url = mySettings.getLocalRepository(); + if (!url.startsWith("file:")) url = "file://" + url; + + ArtifactRepository localRepository = new DefaultArtifactRepository("local", url, layout); + + boolean snapshotPolicySet = mySettings.isOffline(); + if (!snapshotPolicySet && generalSettings.getSnapshotUpdatePolicy() == MavenEmbedderSettings.UpdatePolicy.ALWAYS_UPDATE) { + factory.setGlobalUpdatePolicy(ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS); + } + factory.setGlobalChecksumPolicy(ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN); + + return localRepository; + } + + @NotNull + public ArtifactRepository getLocalRepository() { + return myLocalRepository; + } + + @NotNull + public File getLocalRepositoryFile() { + return new File(myLocalRepository.getBasedir()); + } + + public Settings getSettings() { + return mySettings; + } + + @NotNull + public MavenExecutionResult resolveProject(@NotNull final File file, @NotNull final List activeProfiles) { + return resolveProject(file, activeProfiles, Collections.emptyList()); + } + + @NotNull + public MavenExecutionResult resolveProject(@NotNull final File file, + @NotNull final List activeProfiles, + List listeners) { + MavenExecutionRequest request = createRequest(file, activeProfiles, Collections.emptyList(), Collections.emptyList()); + ProjectBuilderConfiguration config = request.getProjectBuilderConfiguration(); + + request.getGlobalProfileManager().loadSettingsProfiles(mySettings); + + ProfileManager globalProfileManager = request.getGlobalProfileManager(); + globalProfileManager.loadSettingsProfiles(request.getSettings()); + + List exceptions = new ArrayList(); + MavenProject project = null; + try { + // copied from DefaultMavenProjectBuilder.buildWithDependencies + MavenProjectBuilder builder = getComponent(MavenProjectBuilder.class); + project = builder.build(new File(file.getPath()), config); + builder.calculateConcreteState(project, config, false); + + // copied from DefaultLifecycleExecutor.execute + findExtensions(project); + // end copied from DefaultLifecycleExecutor.execute + + Artifact projectArtifact = project.getArtifact(); + Map managedVersions = project.getManagedVersionMap(); + ArtifactMetadataSource metadataSource = getComponent(ArtifactMetadataSource.class); + project.setDependencyArtifacts(project.createArtifacts(getComponent(ArtifactFactory.class), null, null)); + + ArtifactResolver resolver = getComponent(ArtifactResolver.class); + ArtifactResolutionResult result = resolver + .resolveTransitively(project.getDependencyArtifacts(), projectArtifact, managedVersions, myLocalRepository, + project.getRemoteArtifactRepositories(), metadataSource, null, listeners); + project.setArtifacts(result.getArtifacts()); + // end copied from DefaultMavenProjectBuilder.buildWithDependencies + } + catch (Exception e) { + return handleException(e); + } + + return new MavenExecutionResult(project, exceptions); + } + + private void findExtensions(MavenProject project) { + // end copied from DefaultLifecycleExecutor.findExtensions + ExtensionManager extensionManager = getComponent(ExtensionManager.class); + for (Object each : project.getBuildExtensions()) { + try { + extensionManager.addExtension((Extension)each, project, myLocalRepository); + } + catch (PlexusContainerException e) { + MavenEmbedderLog.LOG.error(e); + } + catch (ArtifactResolutionException e) { + MavenEmbedderLog.LOG.error(e); + } + catch (ArtifactNotFoundException e) { + MavenEmbedderLog.LOG.error(e); + } + } + extensionManager.registerWagons(); + + Map handlers = findArtifactTypeHandlers(project); + getComponent(ArtifactHandlerManager.class).addHandlers(handlers); + } + + @SuppressWarnings({"unchecked"}) + private Map findArtifactTypeHandlers(MavenProject project) { + // end copied from DefaultLifecycleExecutor.findExtensions + Map result = new HashMap(); + for (Object each : project.getBuildPlugins()) { + Plugin eachPlugin = (Plugin)each; + + if (eachPlugin.isExtensions()) { + try { + PluginManager pluginManager = getComponent(PluginManager.class); + pluginManager.verifyPlugin(eachPlugin, project, mySettings, myLocalRepository); + result.putAll(pluginManager.getPluginComponents(eachPlugin, ArtifactHandler.ROLE)); + } + catch (Exception e) { + MavenEmbedderLog.LOG.info(e); + continue; + } + + for (Object o : result.values()) { + ArtifactHandler handler = (ArtifactHandler)o; + if (project.getPackaging().equals(handler.getPackaging())) { + project.getArtifact().setArtifactHandler(handler); + } + } + } + } + return result; + } + + public void resolve(@NotNull final Artifact artifact, @NotNull final List repos) + throws ArtifactResolutionException, ArtifactNotFoundException { + getComponent(ArtifactResolver.class).resolve(artifact, repos, myLocalRepository); + } + + public Set resolveTransitively(@NotNull Set toResolve, @NotNull List repos) + throws ArtifactResolutionException, ArtifactNotFoundException { + Artifact project = getComponent(ArtifactFactory.class).createBuildArtifact("temp", "temp", "666", "pom"); + + return getComponent(ArtifactResolver.class) + .resolveTransitively(toResolve, project, Collections.EMPTY_MAP, myLocalRepository, repos, getComponent(ArtifactMetadataSource.class)) + .getArtifacts(); + } + + @NotNull + public MavenExecutionResult execute(@NotNull final File file, + @NotNull final List activeProfiles, + @NotNull final List goals) { + try { + MavenExecutionRequest request = createRequest(file, activeProfiles, Collections.emptyList(), goals); + Maven maven = getComponent(Maven.class); + Method method = maven.getClass().getDeclaredMethod("doExecute", MavenExecutionRequest.class, EventDispatcher.class); + method.setAccessible(true); + ReactorManager reactor = (ReactorManager)method.invoke(maven, request, request.getEventDispatcher()); + return new MavenExecutionResult(reactor.getTopLevelProject(), Collections.emptyList()); + } + catch (InvocationTargetException e) { + return handleException(e.getTargetException()); + } + catch (NoSuchMethodException e) { + throw new RuntimeException(e); // should never happen + } + catch (IllegalAccessException e) { + throw new RuntimeException(e); // should never happen + } + } + + @NotNull + public MavenExecutionResult readProjectWithModules(@NotNull final File file, List activeProfiles, List inactiveProfiles) { + MavenExecutionRequest request = createRequest(file, activeProfiles, inactiveProfiles, Collections.emptyList()); + request.getGlobalProfileManager().loadSettingsProfiles(mySettings); + request.setRecursive(true); + + return readProject(request); + } + + @NotNull + private MavenExecutionResult readProject(@NotNull final MavenExecutionRequest request) { + ProfileManager globalProfileManager = request.getGlobalProfileManager(); + globalProfileManager.loadSettingsProfiles(request.getSettings()); + + MavenProject rootProject = null; + final List exceptions = new ArrayList(); + Object result = null; + try { + final File pomFile = new File(request.getPomFile()); + if (!pomFile.exists()) { + throw new FileNotFoundException("File doesn't exist: " + pomFile.getPath()); + } + + final Method getProjectsMethod = DefaultMaven.class.getDeclaredMethod("getProjects", MavenExecutionRequest.class); + getProjectsMethod.setAccessible(true); + Maven maven = getComponent(Maven.class); + result = getProjectsMethod.invoke(maven, request); + } + catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + catch (InvocationTargetException e) { + return handleException(e.getTargetException()); + } + catch (Exception e) { + return handleException(e); + } + + if (result != null) { + MavenProjectBuilder builder = getComponent(MavenProjectBuilder.class); + for (Object p : (List)result) { + MavenProject project = (MavenProject)p; + try { + builder.calculateConcreteState(project, request.getProjectBuilderConfiguration(), false); + } + catch (ModelInterpolationException e) { + exceptions.add(e); + } + + if (project.isExecutionRoot()) { + rootProject = project; + } + } + + if (rootProject == null && exceptions.isEmpty()) { + throw new RuntimeException("Could't build project for unknown reason"); + } + } + + return new MavenExecutionResult(rootProject, exceptions); + } + + @NotNull + public MavenExecutionResult readProject(@NotNull final File file, + @NotNull final List activeProfiles, + @NotNull final List inactiveProfiles) { + MavenExecutionRequest request = createRequest(file, activeProfiles, inactiveProfiles, Collections.emptyList()); + request.getGlobalProfileManager().loadSettingsProfiles(mySettings); + request.setRecursive(false); + + return readProject(request); + } + + private MavenExecutionRequest createRequest(File file, List activeProfiles, List inactiveProfiles, List goals) { + Properties executionProperties = myEmbedderSettings.getProperties(); + if (executionProperties == null) executionProperties = new Properties(); + + DefaultEventDispatcher dispatcher = new DefaultEventDispatcher(); + dispatcher.addEventMonitor(new DefaultEventMonitor(myLogger)); + + // subclassing because in DefaultMavenExecutionRequest field isRecursive is always false + MavenExecutionRequest result = new DefaultMavenExecutionRequest(myLocalRepository, mySettings, dispatcher, goals, file.getParent(), + createProfileManager(activeProfiles, inactiveProfiles, + executionProperties), executionProperties, + new Properties(), true) { + private boolean myIsRecursive; + + @Override + public boolean isRecursive() { + return myIsRecursive; + } + + @Override + public void setRecursive(final boolean recursive) { + myIsRecursive = recursive; + } + }; + + result.setPomFile(file.getPath()); + result.setRecursive(myEmbedderSettings.isRecursive()); + + return result; + } + + private MavenExecutionResult handleException(Throwable e) { + if (e instanceof RuntimeException) throw (RuntimeException)e; + if (e instanceof Error) throw (Error)e; + + return new MavenExecutionResult(null, Collections.singletonList((Exception)e)); + } + + private ProfileManager createProfileManager(List activeProfiles, List inactiveProfiles, Properties executionProperties) { + ProfileManager profileManager = new DefaultProfileManager(getContainer(), executionProperties); + profileManager.explicitlyActivate(activeProfiles); + profileManager.explicitlyDeactivate(inactiveProfiles); + return profileManager; + } + + @SuppressWarnings({"unchecked"}) + public T getComponent(Class clazz) { + try { + return (T)getContainer().lookup(clazz.getName()); + } + catch (ComponentLookupException e) { + throw new RuntimeException(e); + } + } + + @SuppressWarnings({"unchecked"}) + public T getComponent(Class clazz, String roleHint) { + try { + return (T)getContainer().lookup(clazz.getName(), roleHint); + } + catch (ComponentLookupException e) { + throw new RuntimeException(e); + } + } + + public PlexusContainer getContainer() { + return myContainer; + } + + public void release() { + releaseResolverThreadExecutor(); + myContainer.dispose(); + } + + private void releaseResolverThreadExecutor() { + ArtifactResolver resolver = getComponent(ArtifactResolver.class); + @SuppressWarnings({"unchecked"}) FieldAccessor pool = new FieldAccessor(DefaultArtifactResolver.class, resolver, "resolveArtifactPool"); + try { + final Object threadPool = pool.getField(); // an instance of a hidden copy of ThreadPoolExecutor + threadPool.getClass().getMethod("shutdown").invoke(threadPool); + } + catch (RuntimeException e) { + throw e; + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + @NotNull + public static MavenEmbedder create(@NotNull final MavenEmbedderSettings embedderSettings) { + @NotNull final Logger logger = getLogger(embedderSettings); + + DefaultPlexusContainer container = new DefaultPlexusContainer(); + container.setClassWorld(new ClassWorld("plexus.core", embedderSettings.getClass().getClassLoader())); + container.setLoggerManager(new BaseLoggerManager() { + @Override + protected Logger createLogger(final String s) { + return logger; + } + }); + + try { + container.initialize(); + container.start(); + } + catch (PlexusContainerException e) { + MavenEmbedderLog.LOG.error(e); + throw new RuntimeException(e); + } + + final PlexusComponentConfigurator configurator = embedderSettings.getConfigurator(); + if (configurator != null) { + configurator.configureComponents(container); + } + + File mavenHome = embedderSettings.getMavenHome(); + if (mavenHome != null) { + System.setProperty(PROP_MAVEN_HOME, mavenHome.getPath()); + } + + Settings nativeSettings = buildSettings(container, embedderSettings); + + return new MavenEmbedder(container, nativeSettings, logger, embedderSettings); + } + + @NotNull + private static Logger getLogger(@NotNull final MavenEmbedderSettings embedderSettings) { + final Logger logger = embedderSettings.getLogger(); + return logger != null ? logger : new NullMavenLogger(); + } + + public static Settings buildSettings(PlexusContainer container, MavenEmbedderSettings embedderSettings) { + File file = embedderSettings.getGlobalSettingsFile(); + if (file != null) { + System.setProperty(MavenSettingsBuilder.ALT_GLOBAL_SETTINGS_XML_LOCATION, file.getPath()); + } + + Settings settings = null; + + try { + MavenSettingsBuilder builder = (MavenSettingsBuilder)container.lookup(MavenSettingsBuilder.ROLE); + + File userSettingsFile = embedderSettings.getUserSettingsFile(); + if (userSettingsFile != null && userSettingsFile.exists() && !userSettingsFile.isDirectory()) { + settings = builder.buildSettings(userSettingsFile, false); + } + + if (settings == null) { + settings = builder.buildSettings(); + } + } + catch (ComponentLookupException e) { + MavenEmbedderLog.LOG.error(e); + } + catch (IOException e) { + MavenEmbedderLog.LOG.warn(e); + } + catch (XmlPullParserException e) { + MavenEmbedderLog.LOG.warn(e); + } + + if (settings == null) { + settings = new Settings(); + } + + if (embedderSettings.getLocalRepository() != null) { + settings.setLocalRepository(embedderSettings.getLocalRepository().getPath()); + } + if (settings.getLocalRepository() == null) { + settings.setLocalRepository(System.getProperty("user.home") + "/.m2/repository"); + } + + settings.setOffline(embedderSettings.isWorkOffline()); + settings.setInteractiveMode(false); + settings.setUsePluginRegistry(embedderSettings.isUsePluginRegistry()); + + RuntimeInfo runtimeInfo = new RuntimeInfo(settings); + runtimeInfo.setPluginUpdateOverride(embedderSettings.getPluginUpdatePolicy() == MavenEmbedderSettings.UpdatePolicy.ALWAYS_UPDATE); + settings.setRuntimeInfo(runtimeInfo); + + return settings; + } + + public static void setImplementation(PlexusContainer container, Class componentClass, Class implementationClass) { + ComponentDescriptor d = container.getComponentDescriptor(componentClass.getName()); + d.setImplementation(implementationClass.getName()); + } +} + diff --git a/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedderLog.java b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedderLog.java new file mode 100644 index 000000000000..78cb538f928b --- /dev/null +++ b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedderLog.java @@ -0,0 +1,76 @@ +/* + * Copyright 2000-2009 JetBrains s.r.o. + * + * 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 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.maven.embedder; + +import org.jetbrains.annotations.NotNull; + +public class MavenEmbedderLog { + public static final MavenEmbedderLogger LOG = new MavenEmbedderLogger() { + public void debug(final CharSequence msg) { + if (ourDelegate != null) ourDelegate.debug(msg); + } + + public void debug(final CharSequence msg, final Throwable e) { + if (ourDelegate != null) ourDelegate.debug(msg, e); + } + + public void debug(final Throwable e) { + if (ourDelegate != null) ourDelegate.debug(e); + } + + public void info(final CharSequence msg) { + if (ourDelegate != null) ourDelegate.info(msg); + } + + public void info(final CharSequence msg, final Throwable e) { + if (ourDelegate != null) ourDelegate.info(msg, e); + } + + public void info(final Throwable e) { + if (ourDelegate != null) ourDelegate.info(e); + } + + public void warn(final CharSequence msg) { + if (ourDelegate != null) ourDelegate.warn(msg); + } + + public void warn(final CharSequence msg, final Throwable e) { + if (ourDelegate != null) ourDelegate.warn(msg, e); + } + + public void warn(final Throwable e) { + if (ourDelegate != null) ourDelegate.warn(e); + } + + public void error(final CharSequence msg) { + if (ourDelegate != null) ourDelegate.error(msg); + } + + public void error(final CharSequence msg, final Throwable e) { + if (ourDelegate != null) ourDelegate.error(msg, e); + } + + public void error(final Throwable e) { + if (ourDelegate != null) ourDelegate.error(e); + } + }; + + private static MavenEmbedderLogger ourDelegate = null; + + public void setLogger(@NotNull final MavenEmbedderLogger logger) { + ourDelegate = logger; + } +} diff --git a/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedderLogger.java b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedderLogger.java new file mode 100644 index 000000000000..8205236b2b69 --- /dev/null +++ b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedderLogger.java @@ -0,0 +1,31 @@ +package org.jetbrains.maven.embedder; + +/** + * @author Sergey.Anchipolevsky + * Date: 27.01.2010 + */ +public interface MavenEmbedderLogger { + void debug(CharSequence msg); + + void debug(CharSequence msg, Throwable e); + + void debug(Throwable e); + + void info(CharSequence msg); + + void info(CharSequence msg, Throwable e); + + void info(Throwable e); + + void warn(CharSequence msg); + + void warn(CharSequence msg, Throwable e); + + void warn(Throwable e); + + void error(CharSequence msg); + + void error(CharSequence msg, Throwable e); + + void error(Throwable e); +} diff --git a/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedderSettings.java b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedderSettings.java new file mode 100644 index 000000000000..0e9c51c3c083 --- /dev/null +++ b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedderSettings.java @@ -0,0 +1,151 @@ +/* + * Copyright 2000-2009 JetBrains s.r.o. + * + * 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 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.maven.embedder; + +import org.codehaus.plexus.logging.Logger; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.util.Properties; + +public class MavenEmbedderSettings { + public enum UpdatePolicy { + ALWAYS_UPDATE, DO_NOT_UPDATE + } + + private boolean workOffline = false; + private boolean isRecursive = true; + private File mavenHome; + private File userSettingsFile; + private File globalSettingsFile; + private File localRepository; + private boolean usePluginRegistry = false; + private UpdatePolicy snapshotUpdatePolicy = UpdatePolicy.ALWAYS_UPDATE; + private UpdatePolicy pluginUpdatePolicy = UpdatePolicy.DO_NOT_UPDATE; + private Properties myProperties; + + @Nullable + private Logger myLogger; + @Nullable + private PlexusComponentConfigurator myConfigurator; + + public boolean isWorkOffline() { + return workOffline; + } + + public void setWorkOffline(boolean workOffline) { + this.workOffline = workOffline; + } + + public boolean isRecursive() { + return isRecursive; + } + + public void setRecursive(boolean recursive) { + isRecursive = recursive; + } + + @Nullable + public File getMavenHome() { + return mavenHome; + } + + public void setMavenHome(@Nullable File mavenHome) { + this.mavenHome = mavenHome; + } + + @Nullable + public File getUserSettingsFile() { + return userSettingsFile; + } + + public void setUserSettingsFile(@Nullable File userSettingsFile) { + this.userSettingsFile = userSettingsFile; + } + + @Nullable + public File getGlobalSettingsFile() { + return globalSettingsFile; + } + + public void setGlobalSettingsFile(@Nullable File globalSettingsFile) { + this.globalSettingsFile = globalSettingsFile; + } + + @Nullable + public File getLocalRepository() { + return localRepository; + } + + public void setLocalRepository(@Nullable File localRepository) { + this.localRepository = localRepository; + } + + public boolean isUsePluginRegistry() { + return usePluginRegistry; + } + + public void setUsePluginRegistry(boolean usePluginRegistry) { + this.usePluginRegistry = usePluginRegistry; + } + + @NotNull + public UpdatePolicy getPluginUpdatePolicy() { + return pluginUpdatePolicy; + } + + public void setPluginUpdatePolicy(@Nullable UpdatePolicy value) { + this.pluginUpdatePolicy = value; + } + + @NotNull + public UpdatePolicy getSnapshotUpdatePolicy() { + return snapshotUpdatePolicy; + } + + public void setSnapshotUpdatePolicy(@Nullable UpdatePolicy value) { + this.snapshotUpdatePolicy = value; + } + + @Nullable + public Properties getProperties() { + return myProperties; + } + + public void setProperties(@Nullable Properties properties) { + myProperties = properties; + } + + @Nullable + public Logger getLogger() { + return myLogger; + } + + public void setLogger(@Nullable final Logger logger) { + myLogger = logger; + } + + + public void setConfigurator(@Nullable final PlexusComponentConfigurator configurator) { + myConfigurator = configurator; + } + + @Nullable + public PlexusComponentConfigurator getConfigurator() { + return myConfigurator; + } +} diff --git a/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenExecutionResult.java b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenExecutionResult.java new file mode 100644 index 000000000000..bef95fd1369d --- /dev/null +++ b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenExecutionResult.java @@ -0,0 +1,44 @@ +/* + * Copyright 2000-2009 JetBrains s.r.o. + * + * 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 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.maven.embedder; + +import org.apache.maven.project.MavenProject; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class MavenExecutionResult { + private final MavenProject myMavenProject; + private final List myExceptions; + + public MavenExecutionResult(@Nullable MavenProject mavenProject, List exceptions) { + myMavenProject = mavenProject; + myExceptions = exceptions; + } + + @Nullable + public MavenProject getMavenProject() { + return myMavenProject; + } + + public List getExceptions() { + return myExceptions; + } + + public boolean hasExceptions() { + return !myExceptions.isEmpty(); + } +} diff --git a/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/NullMavenLogger.java b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/NullMavenLogger.java new file mode 100644 index 000000000000..17aea9782d5f --- /dev/null +++ b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/NullMavenLogger.java @@ -0,0 +1,12 @@ +package org.jetbrains.maven.embedder; + +/** + * @author Sergey.Anchipolevsky + * Date: 28.01.2010 + */ +class NullMavenLogger extends AbstractMavenLogger { + @Override + protected void printMessage(final int level, final String message, final Throwable throwable) { + // do nothing + } +} diff --git a/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/PlexusComponentConfigurator.java b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/PlexusComponentConfigurator.java new file mode 100644 index 000000000000..3dc69e083c5a --- /dev/null +++ b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/PlexusComponentConfigurator.java @@ -0,0 +1,13 @@ +package org.jetbrains.maven.embedder; + +import org.codehaus.plexus.PlexusContainer; +import org.jetbrains.annotations.NotNull; + +/** + * @author Sergey.Anchipolevsky + * Date: 21.09.2009 + */ +public interface PlexusComponentConfigurator { + void configureComponents(@NotNull PlexusContainer container); + +} From b596794fb04f3a559ad77ad78eac5e3d59c401cf Mon Sep 17 00:00:00 2001 From: Xavier Fournet Date: Thu, 6 Sep 2012 16:43:04 +0200 Subject: [PATCH 2/3] [IDEA-91145] Add a new MavenEmbedderWrapper#execute method that permit to specify the project list and explicit profile exclusions --- .../maven/server/MavenServerEmbedder.java | 7 ++++-- .../embedder/Maven2ServerEmbedderImpl.java | 14 +++++++---- .../maven/embedder/MavenEmbedder.java | 23 +++++++++++++++++-- .../server/Maven3ServerEmbedderImpl.java | 9 ++++++-- .../maven/server/MavenEmbedderWrapper.java | 21 ++++++++++++++++- 5 files changed, 63 insertions(+), 11 deletions(-) diff --git a/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerEmbedder.java b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerEmbedder.java index c1a2b112727a..37210de9ce84 100644 --- a/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerEmbedder.java +++ b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerEmbedder.java @@ -54,8 +54,11 @@ public interface MavenServerEmbedder extends Remote { @NotNull MavenServerExecutionResult execute(@NotNull File file, @NotNull Collection activeProfiles, - @NotNull List goals) throws RemoteException, - MavenServerProcessCanceledException; + @NotNull Collection inactiveProfiles, + @NotNull List goals, + @NotNull final List selectedProjects, + boolean alsoMake, + boolean alsoMakeDependents) throws RemoteException, MavenServerProcessCanceledException; void reset() throws RemoteException; diff --git a/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerEmbedderImpl.java b/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerEmbedderImpl.java index 0bee080b8c84..cae29c345b98 100644 --- a/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerEmbedderImpl.java +++ b/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerEmbedderImpl.java @@ -327,13 +327,19 @@ public class Maven2ServerEmbedderImpl extends MavenRemoteObject implements Maven } @NotNull + @Override public MavenServerExecutionResult execute(@NotNull final File file, - @NotNull final Collection activeProfiles, - @NotNull final List goals) - throws MavenServerProcessCanceledException, RemoteException { + @NotNull final Collection activeProfiles, + @NotNull final Collection inactiveProfiles, + @NotNull final List goals, + @NotNull final List selectedProjects, + final boolean alsoMake, + final boolean alsoMakeDependents) throws RemoteException, MavenServerProcessCanceledException { return doExecute(new Executor() { public MavenServerExecutionResult execute() throws Exception { - MavenExecutionResult result = myImpl.execute(file, new ArrayList(activeProfiles), goals); + MavenExecutionResult result = myImpl + .execute(file, new ArrayList(activeProfiles), new ArrayList(inactiveProfiles), goals, selectedProjects, alsoMake, + alsoMakeDependents); return createExecutionResult(file, result, null); } }); diff --git a/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedder.java b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedder.java index 3fa0fa4762bd..3926a3d1f030 100644 --- a/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedder.java +++ b/plugins/maven/maven2-server-impl/src/org/jetbrains/maven/embedder/MavenEmbedder.java @@ -289,9 +289,28 @@ public class MavenEmbedder { @NotNull public MavenExecutionResult execute(@NotNull final File file, @NotNull final List activeProfiles, - @NotNull final List goals) { + @NotNull final List inactiveProfiles, + @NotNull final List goals, + @NotNull final List selectedProjects, + boolean alsoMake, + boolean alsoMakeDependents) { try { - MavenExecutionRequest request = createRequest(file, activeProfiles, Collections.emptyList(), goals); + MavenExecutionRequest request = createRequest(file, activeProfiles, inactiveProfiles, goals); + + if (!selectedProjects.isEmpty()) { + request.setRecursive(true); + request.setSelectedProjects(selectedProjects); + if (alsoMake && alsoMakeDependents) { + request.setMakeBehavior(ReactorManager.MAKE_BOTH_MODE); + } + else if (alsoMake) { + request.setMakeBehavior(ReactorManager.MAKE_MODE); + } + else if (alsoMakeDependents) { + request.setMakeBehavior(ReactorManager.MAKE_DEPENDENTS_MODE); + } + } + Maven maven = getComponent(Maven.class); Method method = maven.getClass().getDeclaredMethod("doExecute", MavenExecutionRequest.class, EventDispatcher.class); method.setAccessible(true); diff --git a/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3ServerEmbedderImpl.java b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3ServerEmbedderImpl.java index c66c35f7dffd..6bf4947c5de6 100644 --- a/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3ServerEmbedderImpl.java +++ b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3ServerEmbedderImpl.java @@ -190,8 +190,13 @@ public class Maven3ServerEmbedderImpl extends MavenRemoteObject implements Maven @NotNull @Override - public MavenServerExecutionResult execute(@NotNull File file, @NotNull Collection activeProfiles, @NotNull List goals) - throws RemoteException, MavenServerProcessCanceledException { + public MavenServerExecutionResult execute(@NotNull File file, + @NotNull Collection activeProfiles, + @NotNull Collection inactiveProfiles, + @NotNull List goals, + @NotNull List selectedProjects, + boolean alsoMake, + boolean alsoMakeDependents) throws RemoteException, MavenServerProcessCanceledException { throw new UnsupportedOperationException(); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenEmbedderWrapper.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenEmbedderWrapper.java index 520c3d9c4f76..3686d6f7c0e7 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenEmbedderWrapper.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenEmbedderWrapper.java @@ -157,7 +157,26 @@ public abstract class MavenEmbedderWrapper extends RemoteObjectWrapper() { @Override public MavenServerExecutionResult execute() throws RemoteException, MavenServerProcessCanceledException { - return getOrCreateWrappee().execute(new File(file.getPath()), activeProfiles, goals); + return getOrCreateWrappee() + .execute(new File(file.getPath()), activeProfiles, Collections.emptyList(), goals, Collections.emptyList(), false, + false); + } + }); + } + + @NotNull + public MavenServerExecutionResult execute(@NotNull final VirtualFile file, + @NotNull final Collection activeProfiles, + @NotNull final Collection inactiveProfiles, + @NotNull final List goals, + @NotNull final List selectedProjects, + final boolean alsoMake, + final boolean alsoMakeDependents) throws MavenProcessCanceledException { + return perform(new RetriableCancelable() { + @Override + public MavenServerExecutionResult execute() throws RemoteException, MavenServerProcessCanceledException { + return getOrCreateWrappee() + .execute(new File(file.getPath()), activeProfiles, inactiveProfiles, goals, selectedProjects, alsoMake, alsoMakeDependents); } }); } From d88d26418edb5bca31ad4c5caa5d9274f7fac10d Mon Sep 17 00:00:00 2001 From: Xavier Fournet Date: Thu, 6 Sep 2012 16:47:43 +0200 Subject: [PATCH 3/3] [IDEA-91145] Add methods to find Maven root projects --- .../idea/maven/project/MavenProjectsTree.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java index 1c92e44d2432..a6d1d74eb6af 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java @@ -918,6 +918,33 @@ public class MavenProjectsTree { } } + public MavenProject findRootProject(@NotNull MavenProject project) { + readLock(); + try { + MavenProject rootProject = project; + while (true) { + MavenProject aggregator = myModuleToAggregatorMapping.get(project); + if (aggregator == null) { + return rootProject; + } + rootProject = aggregator; + } + } + finally { + readUnlock(); + } + } + + public boolean isRootProject(@NotNull MavenProject project) { + readLock(); + try { + return myModuleToAggregatorMapping.get(project) == null; + } + finally { + readUnlock(); + } + } + public List getModules(MavenProject aggregator) { readLock(); try {