maven libs tuning

This commit is contained in:
Gregory Shrago
2010-05-17 16:23:47 +04:00
parent 039f4c8ef8
commit 2e1110eb3a
8 changed files with 157 additions and 42 deletions
@@ -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<String> _matrixParamSet;
_matrixParamSet = _uriBuilder.addPathSegment("http://repository.sonatype.org/service/local/");
_matrixParamSet = _uriBuilder.addPathSegment(url);
_matrixParamSet = _uriBuilder.addPathSegment("repositories");
_templateAndMatrixParameterValues = new HashMap<String, Object>();
}
@@ -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<String, Object> _queryParameterValues = new HashMap<String, Object>();
@@ -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);
}
}
@@ -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;
@@ -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<RepositoryType> getRepositories() throws RemoteException;
List<ArtifactType> findArtifacts(ArtifactType template) throws RemoteException;
Map<String, List<ArtifactType>> resolveDependencies(List<ArtifactType> artifacts) throws RemoteException;
@@ -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<RepositoryType> getRepositories() throws RemoteException {
final HashMap<String, RepositoryType> result = new HashMap<String, RepositoryType>();
for (String url : mySettings.getNexusUrls()) {
try {
final List<RepositoryType> 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<RepositoryType>(result.values());
}
public List<ArtifactType> findArtifacts(ArtifactType template) throws RemoteException {
final HashMap<String, ArtifactType> result = new HashMap<String, ArtifactType>();
for (String url : mySettings.getNexusUrls()) {
@@ -135,9 +153,47 @@ public class MavenFacadeImpl extends RemoteImpl implements MavenFacade {
e.printStackTrace();
}
}
//addMissingVersions(result);
return new ArrayList<ArtifactType>(result.values());
}
private void addMissingVersions(final Map<String, ArtifactType> 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<ArtifactRepository> remoteRepos = new ArrayList<ArtifactRepository>();
for (Repository repository : mySettings.getRemoteRepositories()) {
remoteRepos.add(getRepository(repository));
}
final HashSet<String> visitedIds = new HashSet<String>();
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<ArtifactVersion> 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<String, List<ArtifactType>> resolveDependencies(List<ArtifactType> 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<Artifact> toResolve = new HashSet<Artifact>();
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<ArtifactVersion> list = (List<ArtifactVersion>)metadataSource.retrieveAvailableVersions(artifact, localRepo, remoteRepos);
// for (ArtifactVersion o : list) {
// System.out.println("avail version: " + o);
// }
final Map<String, List<ArtifactType>> resultMap = new HashMap<String, List<ArtifactType>>();
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);
@@ -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<String, Pair<String, String>> myRepositoriesMap = new HashMap<String, Pair<String, String>>();
final Map<String, RepositoryBeanInfo> myRepositoriesMap = new THashMap<String, RepositoryBeanInfo>();
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<String, String> 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<String, String> 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;
}
}
@@ -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;
}
}
@@ -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<JComponent> gridComponents = new ArrayList<JComponent>();
{
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<JComboBox> coordComponent = new ComponentWithBrowseButton<JComboBox>(myCombobox, new ActionListener() {
public void actionPerformed(ActionEvent e) {
performSearch();
}
});
coordComponent.setButtonIcon(Icons.SYNCHRONIZE_ICON);
gridComponents.add(coordComponent);
final LabeledComponent<JComboBox> repository = new LabeledComponent<JComboBox>();
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());
@@ -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<ArtifactType> 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<List<ArtifactType>> result = Ref.create(Collections.<ArtifactType>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<ArtifactType> 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<String> urls = new HashSet<String>();
if (mavenFacade != null) {
try {
final List<RepositoryType> 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;
}