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.*;
+import org.apache.maven.project.MavenProject;
import org.apache.maven.project.artifact.ProjectArtifactFactory;
import org.apache.maven.project.interpolation.AbstractStringBasedModelInterpolator;
import org.apache.maven.project.interpolation.ModelInterpolationException;
import org.apache.maven.project.interpolation.ModelInterpolator;
-import org.apache.maven.project.interpolation.StringSearchModelInterpolator;
import org.apache.maven.project.path.DefaultPathTranslator;
import org.apache.maven.project.path.PathTranslator;
import org.apache.maven.settings.Mirror;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.project.*;
import org.jetbrains.idea.maven.utils.MavenLog;
import org.jetbrains.idea.maven.utils.MavenProcessCanceledException;
});
}
+ public Artifact resolve(@NotNull final MavenId id,
+ @NotNull final String type,
+ @Nullable final String classifier,
+ @NotNull final List<MavenRemoteRepository> remoteRepositories)
+ throws MavenProcessCanceledException {
+ return doExecute(new Executor<Artifact>() {
+ public Artifact execute() throws Exception {
+ Artifact artifact = getComponent(ArtifactFactory.class).createArtifactWithClassifier(id.getGroupId(),
+ id.getArtifactId(),
+ id.getVersion(),
+ type,
+ classifier);
+ try {
+ getComponent(ArtifactResolver.class).resolve(artifact, convertRepositories(remoteRepositories), myLocalRepository);
+ return artifact;
+ }
+ catch (Exception e) {
+ MavenLog.LOG.info(e);
+ }
+ return artifact;
+ }
+ });
+ }
+
private List<ArtifactRepository> convertRepositories(List<MavenRemoteRepository> repositories) {
List<ArtifactRepository> result = new ArrayList<ArtifactRepository>();
for (MavenRemoteRepository each : repositories) {
});
}
- public Artifact createArtifact(String groupId, String artifactId, String version, String type, String classifier) {
- return getComponent(ArtifactFactory.class).createArtifactWithClassifier(groupId,
- artifactId,
- version,
- type,
- classifier);
- }
-
@NotNull
public MavenExecutionResult execute(@NotNull final VirtualFile file,
@NotNull final Collection<String> activeProfiles,
Library.ModifiableModel libraryModel = provider.getLibraryModel(library);
setUrl(libraryModel, OrderRootType.CLASSES, artifact, null);
- setUrl(libraryModel, OrderRootType.SOURCES, artifact, MavenConstants.SOURCES_CLASSIFIER);
- setUrl(libraryModel, JavadocOrderRootType.getInstance(), artifact, MavenConstants.JAVADOC_CLASSIFIER);
+ setUrl(libraryModel, OrderRootType.SOURCES, artifact, MavenConstants.CLASSIFIER_SOURCES);
+ setUrl(libraryModel, JavadocOrderRootType.getInstance(), artifact, MavenConstants.CLASSIFIER_JAVADOC);
LibraryOrderEntry e = myRootModel.addLibraryEntry(library);
e.setExported(isExportable);
String path = classes.substring(0, dotPos);
String jarSuffix = ".jar" + JarFileSystem.JAR_SEPARATOR;
- String sourcesPath = path + "-" + MavenConstants.SOURCES_CLASSIFIER + jarSuffix;
- String javadocPath = path + "-" + MavenConstants.JAVADOC_CLASSIFIER + jarSuffix;
+ String sourcesPath = path + "-" + MavenConstants.CLASSIFIER_SOURCES + jarSuffix;
+ String javadocPath = path + "-" + MavenConstants.CLASSIFIER_JAVADOC + jarSuffix;
for (String each : library.getUrls(OrderRootType.SOURCES)) {
if (!FileUtil.pathsEqual(each, sourcesPath)) return true;
import org.apache.maven.artifact.Artifact;
import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper;
import org.jetbrains.idea.maven.utils.MavenConstants;
-import org.jetbrains.idea.maven.utils.MavenProgressIndicator;
+import org.jetbrains.idea.maven.utils.MavenLog;
import org.jetbrains.idea.maven.utils.MavenProcessCanceledException;
+import org.jetbrains.idea.maven.utils.MavenProgressIndicator;
import java.io.File;
import java.util.*;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicInteger;
public class MavenArtifactDownloader {
+ private final static ExecutorService EXECUTOR = new ThreadPoolExecutor(0, 5, 1, TimeUnit.MINUTES, new ArrayBlockingQueue<Runnable>(5));
+
private final MavenEmbedderWrapper myEmbedder;
private final MavenProgressIndicator myProgress;
private final MavenProjectsTree myProjectsTree;
public static void download(MavenProjectsTree projectsTree,
List<MavenProject> mavenProjects,
- boolean demand,
- MavenEmbedderWrapper embedder,
+ boolean downloadSources,
+ boolean downloadJavadoc, MavenEmbedderWrapper embedder,
MavenProgressIndicator p) throws MavenProcessCanceledException {
- new MavenArtifactDownloader(projectsTree, mavenProjects, embedder, p).download(demand);
+ new MavenArtifactDownloader(projectsTree, mavenProjects, embedder, p).download(downloadSources, downloadJavadoc);
}
private MavenArtifactDownloader(MavenProjectsTree projectsTree,
myProgress = p;
}
- private void download(boolean demand) throws MavenProcessCanceledException {
+ private void download(boolean downloadSources, boolean downloadJavadoc) throws MavenProcessCanceledException {
List<File> downloadedFiles = new ArrayList<File>();
try {
- Map<MavenArtifact, Set<MavenRemoteRepository>> artifacts = collectArtifactsToDownload();
+ Map<MavenId, Set<MavenRemoteRepository>> artifacts = collectArtifactsToDownload();
- download(MavenConstants.SOURCES_CLASSIFIER, artifacts, downloadedFiles);
- download(MavenConstants.JAVADOC_CLASSIFIER, artifacts, downloadedFiles);
+ download(downloadSources, downloadJavadoc, artifacts, downloadedFiles);
}
finally {
scheduleFilesRefresh(downloadedFiles);
}
}
- private Map<MavenArtifact, Set<MavenRemoteRepository>> collectArtifactsToDownload() {
- Map<MavenArtifact, Set<MavenRemoteRepository>> result = new THashMap<MavenArtifact, Set<MavenRemoteRepository>>();
+ private Map<MavenId, Set<MavenRemoteRepository>> collectArtifactsToDownload() {
+ Map<MavenId, Set<MavenRemoteRepository>> result = new THashMap<MavenId, Set<MavenRemoteRepository>>();
- for (MavenProject each : myMavenProjects) {
- List<MavenRemoteRepository> repositories = each.getRemoteRepositories();
+ for (MavenProject eachProject : myMavenProjects) {
+ List<MavenRemoteRepository> repositories = eachProject.getRemoteRepositories();
- for (MavenArtifact eachDependency : each.getDependencies()) {
- if (!each.isSupportedDependency(eachDependency)) continue;
+ for (MavenArtifact eachDependency : eachProject.getDependencies()) {
if (Artifact.SCOPE_SYSTEM.equalsIgnoreCase(eachDependency.getScope())) continue;
if (myProjectsTree.findProject(eachDependency.getMavenId()) != null) continue;
+ if (!eachProject.isSupportedDependency(eachDependency)) continue;
+ if (!eachDependency.isResolved()) continue;
- Set<MavenRemoteRepository> registeredRepositories = result.get(eachDependency);
+ MavenId depId = eachDependency.getMavenId();
+ Set<MavenRemoteRepository> registeredRepositories = result.get(depId);
if (registeredRepositories == null) {
registeredRepositories = new LinkedHashSet<MavenRemoteRepository>();
- result.put(eachDependency, registeredRepositories);
+ result.put(depId, registeredRepositories);
}
registeredRepositories.addAll(repositories);
}
return result;
}
- private void download(String classifier,
- Map<MavenArtifact, Set<MavenRemoteRepository>> libraryArtifacts,
- List<File> downloadedFiles) throws MavenProcessCanceledException {
- myProgress.setText(ProjectBundle.message("maven.downloading.artifact", classifier));
-
- int step = 0;
- for (Map.Entry<MavenArtifact, Set<MavenRemoteRepository>> eachEntry : libraryArtifacts.entrySet()) {
- MavenArtifact eachArtifact = eachEntry.getKey();
-
- myProgress.checkCanceled();
- myProgress.setFraction(((double)step++) / libraryArtifacts.size());
- myProgress.setText2(eachArtifact.toString());
-
- Artifact a = myEmbedder.createArtifact(eachArtifact.getGroupId(),
- eachArtifact.getArtifactId(),
- eachArtifact.getVersion(),
- MavenConstants.TYPE_JAR,
- classifier);
- myEmbedder.resolve(a, new ArrayList<MavenRemoteRepository>(eachEntry.getValue()));
- if (a.isResolved()) downloadedFiles.add(a.getFile());
+ private void download(final boolean downloadSources,
+ final boolean downloadJavadoc,
+ final Map<MavenId, Set<MavenRemoteRepository>> libraryArtifacts,
+ final List<File> downloadedFiles) throws MavenProcessCanceledException {
+ List<Future<?>> futures = new ArrayList<Future<?>>();
+
+ List<String> classifiers = new ArrayList<String>(2);
+ if (downloadSources) classifiers.add(MavenConstants.CLASSIFIER_SOURCES);
+ if (downloadJavadoc) classifiers.add(MavenConstants.CLASSIFIER_JAVADOC);
+
+ final AtomicInteger downloaded = new AtomicInteger();
+ final int total = libraryArtifacts.size() * classifiers.size();
+ try {
+ for (final Map.Entry<MavenId, Set<MavenRemoteRepository>> eachEntry : libraryArtifacts.entrySet()) {
+ myProgress.checkCanceled();
+
+ for (final String eachClassifier : classifiers) {
+ futures.add(EXECUTOR.submit(new Runnable() {
+ public void run() {
+ try {
+ myProgress.checkCanceled();
+ myProgress.setFraction(((double)downloaded.getAndIncrement()) / total);
+
+ Artifact a = myEmbedder.resolve(eachEntry.getKey(), MavenConstants.TYPE_JAR, eachClassifier,
+ new ArrayList<MavenRemoteRepository>(eachEntry.getValue()));
+ if (a.isResolved()) downloadedFiles.add(a.getFile());
+ }
+ catch (MavenProcessCanceledException ignore) {
+ }
+ }
+ }));
+ }
+ }
+ }
+ finally {
+ for (Future<?> each : futures) {
+ try {
+ each.get();
+ }
+ catch (Exception e) {
+ MavenLog.LOG.error(e);
+ }
+ }
}
}
}
public String getHelpTopic() {
return "reference.settings.project.maven.importing";
}
-
}
import java.util.List;
-/**
- * @author Vladislav.Kaznacheev
- */
public class MavenImportingSettings implements Cloneable {
private static final String PROCESS_RESOURCES_PHASE = "process-resources";
public static final String[] UPDATE_FOLDERS_PHASES = new String[]{
private boolean useMavenOutput = true;
private String updateFoldersOnImportPhase = UPDATE_FOLDERS_DEFAULT_PHASE;
+ private boolean downloadSourcesAutomatically = false;
+ private boolean downloadJavadocAutomatically = false;
+
private List<Listener> myListeners = ContainerUtil.createEmptyCOWList();
@NotNull
this.updateFoldersOnImportPhase = updateFoldersOnImportPhase;
}
+ public boolean shouldDownloadSourcesAutomatically() {
+ return downloadSourcesAutomatically;
+ }
+
+ public void setDownloadSourcesAutomatically(boolean Value) {
+ this.downloadSourcesAutomatically = Value;
+ }
+
+ public boolean shouldDownloadJavadocAutomatically() {
+ return downloadJavadocAutomatically;
+ }
+
+ public void setDownloadJavadocAutomatically(boolean value) {
+ this.downloadJavadocAutomatically = value;
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
MavenImportingSettings that = (MavenImportingSettings)o;
- if (importAutomatically != that.importAutomatically) return false;
if (createModuleGroups != that.createModuleGroups) return false;
if (createModulesForAggregators != that.createModulesForAggregators) return false;
+ if (importAutomatically != that.importAutomatically) return false;
+ if (downloadJavadocAutomatically != that.downloadJavadocAutomatically) return false;
+ if (downloadSourcesAutomatically != that.downloadSourcesAutomatically) return false;
if (lookForNested != that.lookForNested) return false;
if (useMavenOutput != that.useMavenOutput) return false;
if (!dedicatedModuleDir.equals(that.dedicatedModuleDir)) return false;
result = 31 * result + (createModuleGroups ? 1 : 0);
result = 31 * result + (useMavenOutput ? 1 : 0);
result = 31 * result + (updateFoldersOnImportPhase != null ? updateFoldersOnImportPhase.hashCode() : 0);
+ result = 31 * result + (downloadSourcesAutomatically ? 1 : 0);
+ result = 31 * result + (downloadJavadocAutomatically ? 1 : 0);
return result;
}
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="org.jetbrains.idea.maven.project.MavenImportingSettingsForm">
- <grid id="27dc6" binding="myPanel" layout-manager="GridLayoutManager" row-count="10" column-count="4" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+ <grid id="27dc6" binding="myPanel" layout-manager="GridLayoutManager" row-count="11" column-count="4" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
- <xy x="20" y="20" width="457" height="306"/>
+ <xy x="20" y="20" width="457" height="401"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<vspacer id="5d738">
<constraints>
- <grid row="9" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
+ <grid row="10" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
</vspacer>
<component id="9a961" class="javax.swing.JCheckBox" binding="mySeparateModulesDirCheckBox" default-binding="true">
<text value="Import Maven projects &automatically"/>
</properties>
</component>
+ <grid id="49dc8" layout-manager="GridLayoutManager" row-count="1" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+ <margin top="10" left="0" bottom="0" right="0"/>
+ <constraints>
+ <grid row="9" column="0" row-span="1" col-span="4" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties>
+ <focusable value="true"/>
+ </properties>
+ <border type="none"/>
+ <children>
+ <component id="62876" class="javax.swing.JLabel">
+ <constraints>
+ <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties>
+ <text value="Automatically download"/>
+ </properties>
+ </component>
+ <component id="42e57" class="javax.swing.JCheckBox" binding="myDownloadSourcesCheckBox" default-binding="true">
+ <constraints>
+ <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties>
+ <margin top="2" left="0" bottom="2" right="3"/>
+ <text value="Sou&rces"/>
+ </properties>
+ </component>
+ <component id="a3f2e" class="javax.swing.JCheckBox" binding="myDownloadJavadocCheckBox" default-binding="true">
+ <constraints>
+ <grid row="0" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="7" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties>
+ <text value="&Javadoc"/>
+ </properties>
+ </component>
+ </children>
+ </grid>
</children>
</grid>
<buttonGroups>
package org.jetbrains.idea.maven.project;
import com.intellij.ide.util.projectWizard.WizardContext;
+import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.projectImport.ProjectFormatPanel;
import javax.swing.*;
private JCheckBox myCreateGroupsCheckBox;
private JComboBox myUpdateFoldersOnImportPhaseComboBox;
private JCheckBox myUseMavenOutputCheckBox;
+ private JCheckBox myDownloadSourcesCheckBox;
+ private JCheckBox myDownloadJavadocCheckBox;
public MavenImportingSettingsForm(boolean isImportStep) {
- if(!isImportStep){
+ if (!isImportStep) {
mySearchRecursivelyCheckBox.setVisible(false);
myProjectFormatLabel.setVisible(false);
myProjectFormatComboBox.setVisible(false);
mySeparateModulesDirCheckBox.addActionListener(listener);
mySeparateModulesDirChooser.addBrowseFolderListener(ProjectBundle.message("maven.import.title.module.dir"), "", null,
- new FileChooserDescriptor(false, true, false, false, false, false));
+ new FileChooserDescriptor(false, true, false, false, false, false));
myUpdateFoldersOnImportPhaseComboBox.setModel(new DefaultComboBoxModel(MavenImportingSettings.UPDATE_FOLDERS_PHASES));
}
data.setCreateModulesForAggregators(myCreateModulesForAggregators.isSelected());
data.setCreateModuleGroups(myCreateGroupsCheckBox.isSelected());
+ data.setUseMavenOutput(myUseMavenOutputCheckBox.isSelected());
+
data.setUpdateFoldersOnImportPhase((String)myUpdateFoldersOnImportPhaseComboBox.getSelectedItem());
- data.setUseMavenOutput(myUseMavenOutputCheckBox.isSelected());
+ data.setDownloadSourcesAutomatically(myDownloadSourcesCheckBox.isSelected());
+ data.setDownloadJavadocAutomatically(myDownloadJavadocCheckBox.isSelected());
}
public void setData(MavenImportingSettings data) {
myCreateModulesForAggregators.setSelected(data.isCreateModulesForAggregators());
myCreateGroupsCheckBox.setSelected(data.isCreateModuleGroups());
+ myUseMavenOutputCheckBox.setSelected(data.isUseMavenOutput());
+
myUpdateFoldersOnImportPhaseComboBox.setSelectedItem(data.getUpdateFoldersOnImportPhase());
- myUseMavenOutputCheckBox.setSelected(data.isUseMavenOutput());
+ myDownloadSourcesCheckBox.setSelected(data.shouldDownloadSourcesAutomatically());
+ myDownloadJavadocCheckBox.setSelected(data.shouldDownloadJavadocAutomatically());
updateControls();
}
if (projectWithChanges.first.hasUnresolvedPlugins()) {
schedulePluginsResolving(projectWithChanges.first, nativeMavenProject);
}
+ scheduleArtifactsDownloading(Collections.singleton(projectWithChanges.first),
+ getImportingSettings().shouldDownloadSourcesAutomatically(),
+ getImportingSettings().shouldDownloadJavadocAutomatically());
scheduleForNextImport(projectWithChanges);
}
processMessage(message);
});
}
- public void scheduleArtifactsDownloading(final Collection<MavenProject> projects) {
+ public void scheduleArtifactsDownloading(final Collection<MavenProject> projects, final boolean sources, final boolean javadoc) {
+ if (!sources && !javadoc) return;
+
runWhenFullyOpen(new Runnable() {
public void run() {
for (MavenProject each : projects) {
- myArtifactsDownloadingProcessor.scheduleTask(new MavenProjectsProcessorArtifactsDownloadingTask(each, myProjectsTree));
+ myArtifactsDownloadingProcessor.scheduleTask(
+ new MavenProjectsProcessorArtifactsDownloadingTask(each, myProjectsTree, sources, javadoc));
}
}
});
}
+ public void scheduleArtifactsDownloading(final Collection<MavenProject> projects) {
+ scheduleArtifactsDownloading(projects, true, true);
+ }
+
public void scheduleArtifactsDownloadingForAllProjects() {
scheduleArtifactsDownloading(getProjects());
}
import org.jetbrains.idea.maven.utils.MavenProgressIndicator;
public class MavenProjectsProcessorArtifactsDownloadingTask extends MavenProjectsProcessorBasicTask {
+ private final boolean myDownloadSources;
+ private final boolean myDownloadJavadoc;
+
public MavenProjectsProcessorArtifactsDownloadingTask(MavenProject project,
- MavenProjectsTree tree) {
+ MavenProjectsTree tree,
+ boolean downloadSources,
+ boolean downloadJavadoc) {
super(project, tree);
+ myDownloadSources = downloadSources;
+ myDownloadJavadoc = downloadJavadoc;
}
public void perform(Project project, MavenEmbeddersManager embeddersManager, MavenConsole console, MavenProgressIndicator indicator)
throws MavenProcessCanceledException {
- myTree.downloadArtifacts(myMavenProject, embeddersManager, console, indicator);
+ myTree.downloadArtifacts(myMavenProject, myDownloadSources, myDownloadJavadoc, embeddersManager, console, indicator);
}
}
\ No newline at end of file
}
public void downloadArtifacts(MavenProject mavenProject,
+ boolean downloadSources,
+ boolean downloadJavadoc,
MavenEmbeddersManager embeddersManager,
MavenConsole console,
MavenProgressIndicator process) throws MavenProcessCanceledException {
embedder.customizeForResolve(console, process);
try {
- MavenArtifactDownloader.download(this, Collections.singletonList(mavenProject), true, embedder, process);
+ MavenArtifactDownloader.download(this, Collections.singletonList(mavenProject), downloadSources, downloadJavadoc, embedder, process);
fireArtifactsDownloaded(mavenProject);
}
finally {
embedder.customizeForResolve(console, process);
try {
- Artifact artifact = embedder.createArtifact(id.getGroupId(),
- id.getArtifactId(),
- id.getVersion(),
- MavenConstants.TYPE_JAR,
- null);
+ Artifact artifact = embedder.resolve(id, MavenConstants.TYPE_JAR, null, mavenProject.getRemoteRepositories());
artifact.setScope(Artifact.SCOPE_COMPILE);
- embedder.resolve(artifact, mavenProject.getRemoteRepositories());
return new MavenArtifact(artifact, mavenProject.getLocalRepository());
}
finally {
public static final String TYPE_JAR = "jar";
public static final String TYPE_WAR = "war";
- public static final String JAVADOC_CLASSIFIER = "javadoc";
- public static final String SOURCES_CLASSIFIER = "sources";
+ public static final String CLASSIFIER_JAVADOC = "javadoc";
+ public static final String CLASSIFIER_SOURCES = "sources";
public static final String SCOPE_COMPILE = "compile";
public static final String SCOPE_PROVIDEED = "provided";
maven.downloading.pom.plugins=Downloading plugins for {0}
maven.downloading=Downloading Maven sources and javadocs
maven.downloading.finished=Finished downloading artifacts
-maven.downloading.artifact=Downloading {0}
maven.transfer.progress={0}/{1}K [{2}] {3}
maven.transfer.start=Checking [{0}] {1}