From 2e1110eb3ac48351b683c2e8afcb3c8372d4ad94 Mon Sep 17 00:00:00 2001 From: Gregory Shrago Date: Mon, 17 May 2010 16:23:02 +0400 Subject: [PATCH] maven libs tuning --- .../idea/maven/facade/nexus/Endpoint.java | 11 +-- .../maven/facade/nexus/RepositoryType.java | 3 +- .../idea/maven/facade/remote/MavenFacade.java | 3 + .../facade/remote/impl/MavenFacadeImpl.java | 80 ++++++++++++++++--- .../MavenRepositoriesProvider.java | 27 ++++--- .../beans/RepositoryBeanInfo.java | 7 ++ .../maven/utils/RepositoryAttachDialog.java | 29 ++++++- .../maven/utils/RepositoryAttachHandler.java | 39 +++++++-- 8 files changed, 157 insertions(+), 42 deletions(-) diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/Endpoint.java b/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/Endpoint.java index c568d82b5dcb..6ece3e529291 100644 --- a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/Endpoint.java +++ b/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/Endpoint.java @@ -241,9 +241,10 @@ public class Endpoint { /** * Create new instance - * + * + * @param url */ - public Repositories() + public Repositories(String url) throws JAXBException { _jc = JAXBContext.newInstance("org.jetbrains.idea.maven.facade.nexus"); @@ -251,7 +252,7 @@ public class Endpoint { _dsDispatcher = new DSDispatcher(); _uriBuilder = new UriBuilder(); List _matrixParamSet; - _matrixParamSet = _uriBuilder.addPathSegment("http://repository.sonatype.org/service/local/"); + _matrixParamSet = _uriBuilder.addPathSegment(url); _matrixParamSet = _uriBuilder.addPathSegment("repositories"); _templateAndMatrixParameterValues = new HashMap(); } @@ -266,7 +267,7 @@ public class Endpoint { return _retVal; } - public Repositories getRepolistAsRepositories() + public org.jetbrains.idea.maven.facade.nexus.Repositories getRepolistAsRepositories() throws IOException, MalformedURLException, JAXBException { HashMap _queryParameterValues = new HashMap(); @@ -280,7 +281,7 @@ public class Endpoint { JAXBElement jaxbElement = ((JAXBElement) _retVal); _retVal = jaxbElement.getValue(); } - return ((Repositories) _retVal); + return ((org.jetbrains.idea.maven.facade.nexus.Repositories) _retVal); } } diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/RepositoryType.java b/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/RepositoryType.java index bd744208670f..202625e341a0 100644 --- a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/RepositoryType.java +++ b/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/RepositoryType.java @@ -20,6 +20,7 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; +import java.io.Serializable; /** @@ -67,7 +68,7 @@ import javax.xml.bind.annotation.XmlType; "exposed", "effectiveLocalStorageUrl" }) -public class RepositoryType { +public class RepositoryType implements Serializable { @XmlElement(required = true) protected String resourceURI; diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/MavenFacade.java b/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/MavenFacade.java index a585d2e168ad..fad937de1e90 100644 --- a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/MavenFacade.java +++ b/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/MavenFacade.java @@ -16,6 +16,7 @@ package org.jetbrains.idea.maven.facade.remote; import org.jetbrains.idea.maven.facade.nexus.ArtifactType; +import org.jetbrains.idea.maven.facade.nexus.RepositoryType; import java.io.Serializable; import java.rmi.Remote; @@ -29,6 +30,8 @@ import java.util.Map; */ public interface MavenFacade extends Remote { + List getRepositories() throws RemoteException; + List findArtifacts(ArtifactType template) throws RemoteException; Map> resolveDependencies(List artifacts) throws RemoteException; diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/impl/MavenFacadeImpl.java b/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/impl/MavenFacadeImpl.java index f52c4fee3270..47232abc8ad6 100644 --- a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/impl/MavenFacadeImpl.java +++ b/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/impl/MavenFacadeImpl.java @@ -29,6 +29,7 @@ import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.settings.MavenSettingsBuilder; import org.apache.maven.settings.RuntimeInfo; import org.apache.maven.settings.Settings; +import org.apache.maven.artifact.versioning.ArtifactVersion; import org.apache.maven.wagon.events.TransferEvent; import org.apache.maven.wagon.events.TransferListener; import org.codehaus.classworlds.ClassWorld; @@ -38,6 +39,7 @@ import org.codehaus.plexus.component.repository.exception.ComponentLookupExcepti import org.codehaus.plexus.util.xml.pull.XmlPullParserException; import org.jetbrains.idea.maven.facade.nexus.ArtifactType; import org.jetbrains.idea.maven.facade.nexus.Endpoint; +import org.jetbrains.idea.maven.facade.nexus.RepositoryType; import org.jetbrains.idea.maven.facade.nexus.SearchResults; import org.jetbrains.idea.maven.facade.remote.MavenFacade; import org.jetbrains.idea.maven.facade.remote.RemoteTransferListener; @@ -120,6 +122,22 @@ public class MavenFacadeImpl extends RemoteImpl implements MavenFacade { } + public List getRepositories() throws RemoteException { + final HashMap result = new HashMap(); + for (String url : mySettings.getNexusUrls()) { + try { + final List repos = new Endpoint.Repositories(url).getRepolistAsRepositories().getData().getRepositoriesItem(); + for (RepositoryType repo : repos) { + result.put(repo.getId(), repo); + } + } + catch(Exception e){ + e.printStackTrace(); + } + } + return new ArrayList(result.values()); + } + public List findArtifacts(ArtifactType template) throws RemoteException { final HashMap result = new HashMap(); for (String url : mySettings.getNexusUrls()) { @@ -135,9 +153,47 @@ public class MavenFacadeImpl extends RemoteImpl implements MavenFacade { e.printStackTrace(); } } + //addMissingVersions(result); + return new ArrayList(result.values()); } + private void addMissingVersions(final Map result) { + try { + final ArtifactMetadataSource metadataSource = (ArtifactMetadataSource)ourContainer.lookup(ArtifactMetadataSource.ROLE); + final ArtifactFactory artifactFactory = (ArtifactFactory)ourContainer.lookup(ArtifactFactory.ROLE); + final ArtifactRepository localRepo = getRepository(mySettings.getLocalRepository()); + final List remoteRepos = new ArrayList(); + for (Repository repository : mySettings.getRemoteRepositories()) { + remoteRepos.add(getRepository(repository)); + } + final HashSet visitedIds = new HashSet(); + for (ArtifactType artifactType : result.values()) { + if (!visitedIds.add(artifactType.getGroupId()+":"+artifactType.getArtifactId())) continue; + if (artifactType.getPackaging() == null) continue; + final Artifact artifact = createArtifact(artifactFactory, artifactType); + try { + final List list = metadataSource.retrieveAvailableVersions(artifact, localRepo, remoteRepos); + for (ArtifactVersion version : list) { + final String coord = artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + version; + if (!result.containsKey(coord)) { + final ArtifactType type = new ArtifactType(artifactType.getGroupId(), artifactType.getArtifactId(), version.toString()); + type.setPackaging(artifact.getType()); + result.put(coord, type); + } + } + } + catch (Exception ex) { + ex.printStackTrace(); + } + } + } + catch (Exception e) { + handleException(e); + throw new AssertionError(); + } + } + public Map> resolveDependencies(List artifacts) throws RemoteException { try { return resolveDependenciesInner(artifacts); @@ -249,21 +305,9 @@ public class MavenFacadeImpl extends RemoteImpl implements MavenFacade { final Artifact project = artifactFactory.createBuildArtifact("local", "project", "1.0", "pom"); final Set toResolve = new HashSet(); for (ArtifactType template : artifactsToResolve) { - final Artifact artifact = artifactFactory.createDependencyArtifact( - template.getGroupId(), - template.getArtifactId(), - template.getVersion() == null? null :VersionRange.createFromVersion(template.getVersion()), - template.getPackaging(), - null, - "runtime"); - toResolve.add(artifact); + toResolve.add(createArtifact(artifactFactory, template)); } -// resolver.resolve(artifact, remoteRepos, localRepo); -// final List list = (List)metadataSource.retrieveAvailableVersions(artifact, localRepo, remoteRepos); -// for (ArtifactVersion o : list) { -// System.out.println("avail version: " + o); -// } final Map> resultMap = new HashMap>(); for (Artifact artifact : toResolve) { try { @@ -289,6 +333,16 @@ public class MavenFacadeImpl extends RemoteImpl implements MavenFacade { return resultMap; } + private Artifact createArtifact(ArtifactFactory artifactFactory, ArtifactType template) { + return artifactFactory.createDependencyArtifact( + template.getGroupId(), + template.getArtifactId(), + template.getVersion() == null? null : VersionRange.createFromVersion(template.getVersion()), + template.getPackaging(), + null, + "runtime"); + } + private static ArtifactRepository getRepository(Repository r) throws ComponentLookupException { final ArtifactRepositoryLayout repoLayout = (ArtifactRepositoryLayout)ourContainer.lookup(ArtifactRepositoryLayout.ROLE, r.getLayout()); return new DefaultArtifactRepository(r.getId(), r.getUrl(), repoLayout); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/MavenRepositoriesProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/MavenRepositoriesProvider.java index 65d29ae07e44..eb1250fcc0f3 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/MavenRepositoriesProvider.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/MavenRepositoriesProvider.java @@ -15,12 +15,9 @@ */ package org.jetbrains.idea.maven.dom.converters.repositories; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ServiceManager; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Pair; -import com.intellij.util.containers.HashMap; import com.intellij.util.xmlb.XmlSerializer; +import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.dom.converters.repositories.beans.RepositoriesBean; @@ -37,7 +34,7 @@ public class MavenRepositoriesProvider { return ServiceManager.getService(MavenRepositoriesProvider.class); } - Map> myRepositoriesMap = new HashMap>(); + final Map myRepositoriesMap = new THashMap(); public MavenRepositoriesProvider() { final RepositoriesBean repositoriesBean = @@ -48,12 +45,12 @@ public class MavenRepositoriesProvider { assert repositories != null; for (RepositoryBeanInfo repository : repositories) { - registerRepository(repository.getId(), repository.getName(), repository.getUrl()); + registerRepository(repository.getId(), repository); } } - public void registerRepository(@NotNull String id, @NotNull String name, @NotNull String url) { - myRepositoriesMap.put(id, Pair.create(name, url)); + public void registerRepository(@NotNull String id, RepositoryBeanInfo info) { + myRepositoriesMap.put(id, info); } @NotNull @@ -63,13 +60,19 @@ public class MavenRepositoriesProvider { @Nullable public String getRepositoryName(@Nullable String id) { - Pair pair = myRepositoriesMap.get(id); - return pair != null ? pair.getFirst() : null; + RepositoryBeanInfo pair = myRepositoriesMap.get(id); + return pair != null ? pair.getName() : null; } @Nullable public String getRepositoryUrl(@Nullable String id) { - Pair pair = myRepositoriesMap.get(id); - return pair != null ? pair.getSecond() : null; + RepositoryBeanInfo pair = myRepositoriesMap.get(id); + return pair != null ? pair.getUrl() : null; + } + + @Nullable + public String getRepositoryLayout(@Nullable String id) { + RepositoryBeanInfo pair = myRepositoriesMap.get(id); + return pair != null ? pair.getLayout() : null; } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/beans/RepositoryBeanInfo.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/beans/RepositoryBeanInfo.java index 96f918b3e937..e3767bbfac57 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/beans/RepositoryBeanInfo.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/beans/RepositoryBeanInfo.java @@ -32,6 +32,9 @@ public class RepositoryBeanInfo { @Attribute("url") public String myUrl; + @Attribute("layout") + public String myLayout; + public String getId() { return myId; } @@ -43,4 +46,8 @@ public class RepositoryBeanInfo { public String getUrl() { return myUrl; } + + public String getLayout() { + return myLayout; + } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachDialog.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachDialog.java index 636f64ad2df7..78620c28b370 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachDialog.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachDialog.java @@ -21,10 +21,13 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.ui.*; import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.ui.CollectionComboBoxModel; import com.intellij.uiDesigner.core.GridConstraints; import com.intellij.uiDesigner.core.GridLayoutManager; +import com.intellij.util.Icons; import com.intellij.util.Processor; import com.intellij.util.ui.AsyncProcessIcon; import org.jetbrains.annotations.Nullable; @@ -32,6 +35,8 @@ import org.jetbrains.idea.maven.facade.nexus.ArtifactType; import javax.swing.*; import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; @@ -60,14 +65,16 @@ public class RepositoryAttachDialog extends DialogWrapper { myProgressIcon = new AsyncProcessIcon("Progress"); myProgressIcon.setVisible(false); myProgressIcon.suspend(); - myInfoLabel = new JLabel(" "); + myInfoLabel = new JLabel(""); myCombobox = new JComboBox(new CollectionComboBoxModel(myShownItems, null)); myCombobox.setEditable(true); + ((JTextField)myCombobox.getEditor().getEditorComponent()).setColumns(50); myCombobox.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { final boolean popupVisible = myCombobox.isPopupVisible(); if (e.getKeyCode() == KeyEvent.VK_ENTER && e.getModifiers() == 0) { + if (true) return; if (!popupVisible) { if (performSearch()) { e.consume(); @@ -95,6 +102,7 @@ public class RepositoryAttachDialog extends DialogWrapper { } } }); + updateInfoLabel(); init(); } @@ -194,17 +202,24 @@ public class RepositoryAttachDialog extends DialogWrapper { final ArrayList gridComponents = new ArrayList(); { - JPanel caption = new JPanel(new BorderLayout()); + JPanel caption = new JPanel(new BorderLayout(15, 0)); JLabel textLabel = new JLabel("Enter keywords or Maven coordinates: \ni.e. 'spring', 'jsf' or 'org.hibernate:hibernate-core:3.3.0.GA'"); textLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0)); textLabel.setUI(new MultiLineLabelUI()); caption.add(textLabel, BorderLayout.WEST); final JPanel infoPanel = new JPanel(new BorderLayout()); - caption.add(infoPanel, BorderLayout.EAST); infoPanel.add(myInfoLabel, BorderLayout.WEST); infoPanel.add(myProgressIcon, BorderLayout.EAST); + caption.add(infoPanel, BorderLayout.EAST); gridComponents.add(caption); - gridComponents.add(myCombobox); + + final ComponentWithBrowseButton coordComponent = new ComponentWithBrowseButton(myCombobox, new ActionListener() { + public void actionPerformed(ActionEvent e) { + performSearch(); + } + }); + coordComponent.setButtonIcon(Icons.SYNCHRONIZE_ICON); + gridComponents.add(coordComponent); final LabeledComponent repository = new LabeledComponent(); repository.getLabel().setText("Repository"); @@ -215,6 +230,12 @@ public class RepositoryAttachDialog extends DialogWrapper { if (!myManaged) { myDirectoryField = new TextFieldWithBrowseButton(); + if (myProject != null && !myProject.isDefault()) { + final VirtualFile baseDir = myProject.getBaseDir(); + if (baseDir != null) { + myDirectoryField.setText(FileUtil.toSystemDependentName(baseDir.getPath()+"/lib")); + } + } myDirectoryField.addBrowseFolderListener(ProjectBundle.message("file.chooser.directory.for.downloaded.libraries.title"), ProjectBundle.message("file.chooser.directory.for.downloaded.libraries.description"), null, FileChooserDescriptorFactory.createSingleFolderDescriptor()); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachHandler.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachHandler.java index 36cfa6b14ade..fcfd41e56e51 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachHandler.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachHandler.java @@ -31,11 +31,13 @@ import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.NullableComputable; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.maven.dom.converters.repositories.MavenRepositoriesProvider; import org.jetbrains.idea.maven.facade.nexus.ArtifactType; +import org.jetbrains.idea.maven.facade.nexus.RepositoryType; import org.jetbrains.idea.maven.facade.remote.MavenFacade; import org.jetbrains.idea.maven.facade.remote.MavenFacadeManager; import org.jetbrains.idea.maven.facade.remote.RemoteTransferListener; @@ -127,7 +129,7 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { Library.ModifiableModel library, Collection artifactTypes, String copyTo) { - final String repoUrl = createMavenFacadeSettings(project).getLocalRepository().getUrl(); + final String repoUrl = createMavenFacadeSettings(project, null).getLocalRepository().getUrl(); for (OrderRootType type : OrderRootType.getAllTypes()) { for (String url : library.getUrls(type)) { if (url.startsWith(repoUrl)) { @@ -169,8 +171,11 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { final Ref> result = Ref.create(Collections.emptyList()); try { final MavenFacade mavenFacade = mavenManager.getMavenFacade(project); - mavenFacade.setMavenSettings(createMavenFacadeSettings(project)); - result.set(mavenFacade.findArtifacts(template)); + final MavenFacade.MavenFacadeSettings settings = createMavenFacadeSettings(project, mavenFacade); + mavenFacade.setMavenSettings(settings); + final List artifacts = mavenFacade.findArtifacts(template); + // todo assign proper repo urls + result.set(artifacts); } catch (Exception e) { handleError(null, e); @@ -235,7 +240,7 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { final MavenFacadeManager mavenManager = ServiceManager.getService(project, MavenFacadeManager.class); try { final MavenFacade mavenFacade = mavenManager.getMavenFacade(project); - mavenFacade.setMavenSettings(createMavenFacadeSettings(project)); + mavenFacade.setMavenSettings(createMavenFacadeSettings(project, mavenFacade)); final RemoteTransferListener transferListener = fromProgressIndicator(indicator); UnicastRemoteObject.exportObject(transferListener, 0); mavenFacade.setTransferListener(transferListener); @@ -350,16 +355,36 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { return urls.toArray(new String[urls.size()]); } - private static MavenFacade.MavenFacadeSettings createMavenFacadeSettings(Project project) { + private static MavenFacade.MavenFacadeSettings createMavenFacadeSettings(Project project, MavenFacade mavenFacade) { final MavenFacade.MavenFacadeSettings settings = new MavenFacade.MavenFacadeSettings(); final MavenGeneralSettings generalSettings = MavenProjectsManager.getInstance(project).getGeneralSettings(); settings.setLocalRepository(new MavenFacade.Repository("local", VfsUtil.pathToUrl(generalSettings.getEffectiveLocalRepository().getPath()), "default")); + settings.getNexusUrls().add("http://repository.sonatype.org/service/local/"); + // http://maven.labs.intellij.net:8081/nexus/content/repositories/central/ + settings.getNexusUrls().add("http://maven.labs.intellij.net:8081/nexus/"); + final HashSet urls = new HashSet(); + if (mavenFacade != null) { + try { + final List repositories = mavenFacade.getRepositories(); + for (RepositoryType repository : repositories) { + if (urls.add(repository.getContentResourceURI()) && "maven2".equals(repository.getProvider())) { + settings.getRemoteRepositories().add(new MavenFacade.Repository(repository.getId(), repository.getContentResourceURI(), "default")); + } + } + } + catch (Exception e) { + + } + } + final MavenRepositoriesProvider provider = MavenRepositoriesProvider.getInstance(); for (String id : provider.getRepositoryIds()) { - settings.getRemoteRepositories().add(new MavenFacade.Repository(id, provider.getRepositoryUrl(id), "default")); + final String url = provider.getRepositoryUrl(id); + if (urls.add(url)) { + settings.getRemoteRepositories().add(new MavenFacade.Repository(id, url, StringUtil.notNullize(provider.getRepositoryLayout(id), "default"))); + } } - settings.getNexusUrls().add("http://repository.sonatype.org/service/local/"); return settings; }