From 0f9798cb6bdda57e09dd5c45bf92f7f19aa98765 Mon Sep 17 00:00:00 2001 From: Sergey Vasiliev Date: Wed, 8 Apr 2009 17:38:43 +0400 Subject: [PATCH] library versions configuration component --- .../versions/LibrariesConfigurationInfo.java | 44 ++++ .../versions/LibrariesConfigurationManager.java | 86 ++++++++ .../versions/LibraryConfigurationInfo.java | 66 ++++++ .../ui/libraries/versions/LibraryVersionInfo.java | 62 ++++++ .../ui/libraries/versions/VersionsComponent.java | 231 +++++++++++++++++++++ 5 files changed, 489 insertions(+) create mode 100644 source/com/intellij/facet/impl/ui/libraries/versions/LibrariesConfigurationInfo.java create mode 100644 source/com/intellij/facet/impl/ui/libraries/versions/LibrariesConfigurationManager.java create mode 100644 source/com/intellij/facet/impl/ui/libraries/versions/LibraryConfigurationInfo.java create mode 100644 source/com/intellij/facet/impl/ui/libraries/versions/LibraryVersionInfo.java create mode 100644 source/com/intellij/facet/impl/ui/libraries/versions/VersionsComponent.java diff --git a/source/com/intellij/facet/impl/ui/libraries/versions/LibrariesConfigurationInfo.java b/source/com/intellij/facet/impl/ui/libraries/versions/LibrariesConfigurationInfo.java new file mode 100644 index 0000000000..785d2ead09 --- /dev/null +++ b/source/com/intellij/facet/impl/ui/libraries/versions/LibrariesConfigurationInfo.java @@ -0,0 +1,44 @@ +package com.intellij.facet.impl.ui.libraries.versions; + +import com.intellij.util.xmlb.annotations.AbstractCollection; +import com.intellij.util.xmlb.annotations.Attribute; +import com.intellij.util.xmlb.annotations.Property; + +public class LibrariesConfigurationInfo { + + @Property(surroundWithTag = false) + @AbstractCollection(surroundWithTag = false) + public LibraryConfigurationInfo[] myInfos; + + @Attribute("default-version") + public String myDefaultVersion; + + @Attribute("default-ri") + public String myDefaultRI; + + @Attribute("default-download-url") + public String myDefaultDownloadUrl; + + @Attribute("default-presentation-url") + public String myDefaultPresentationUrl; + + public LibraryConfigurationInfo[] getLibraryConfigurationInfos() { + return myInfos; + } + + public String getDefaultVersion() { + return myDefaultVersion; + } + + public String getDefaultDownloadUrl() { + return myDefaultDownloadUrl; + } + + public String getDefaultPresentationUrl() { + return myDefaultPresentationUrl; + } + + public String getDefaultRI() { + return myDefaultRI; + } +} \ No newline at end of file diff --git a/source/com/intellij/facet/impl/ui/libraries/versions/LibrariesConfigurationManager.java b/source/com/intellij/facet/impl/ui/libraries/versions/LibrariesConfigurationManager.java new file mode 100644 index 0000000000..abf7b98b40 --- /dev/null +++ b/source/com/intellij/facet/impl/ui/libraries/versions/LibrariesConfigurationManager.java @@ -0,0 +1,86 @@ +package com.intellij.facet.impl.ui.libraries.versions; + +import com.intellij.facet.ui.libraries.LibraryInfo; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.ArrayUtil; +import com.intellij.util.containers.HashMap; +import com.intellij.util.xmlb.XmlSerializer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class LibrariesConfigurationManager implements Disposable { + + private static final String REQUIRED_CLASSES_DELIMITER = ","; + private static final String RI_TEMPLATE = "$RI$"; + private static final String VERSION_TEMPLATE = "$VERSION$"; + + @NotNull + public static Map> getLibraries(final String... urls) { + final Map> versionLibs = new HashMap>(); + + for (String url : urls) { + final LibrariesConfigurationInfo libs = + XmlSerializer.deserialize(LibrariesConfigurationInfo.class.getResource(url), LibrariesConfigurationInfo.class); + + assert libs != null; + assert libs.getLibraryConfigurationInfos() != null; + + final String defaultVersion = libs.getDefaultVersion(); + final String defaultRI = libs.getDefaultRI(); + final String defaultDownloadUrl = libs.getDefaultDownloadUrl(); + final String defaultPresentationUrl = libs.getDefaultPresentationUrl(); + + + for (LibraryConfigurationInfo libInfo : libs.getLibraryConfigurationInfos()) { + final String version = choose(libInfo.getVersion(), defaultVersion); + + assert !StringUtil.isEmptyOrSpaces(version); + + final String ri = choose(libInfo.getRI(), defaultRI); + final String downloadUrl = choose(libInfo.getDownloadUrl(), defaultDownloadUrl); + final String presentationdUrl = choose(libInfo.getPresentationdUrl(), defaultPresentationUrl); + + + final LibraryVersionInfo versionInfo = new LibraryVersionInfo(version, ri); + final LibraryInfo info = createLibraryInfo(downloadUrl, presentationdUrl, version, ri, libInfo); + + if (versionLibs.get(versionInfo) == null) versionLibs.put(versionInfo, new ArrayList()); + + versionLibs.get(versionInfo).add(info); + } + } + return versionLibs; + } + + @Nullable + private static String choose(@Nullable String str, @Nullable String defaultStr) { + return StringUtil.isEmptyOrSpaces(str) ? defaultStr : str; + } + + private static LibraryInfo createLibraryInfo(String downloadUrl, String presentationdUrl, String version, String ri, + LibraryConfigurationInfo libInfo) { + + downloadUrl = downloadUrl.replace(VERSION_TEMPLATE, version); + if (ri != null) { + downloadUrl = downloadUrl.replace(RI_TEMPLATE, ri); + } + + String jarName = libInfo.getJarName(); + return new LibraryInfo(jarName, version, downloadUrl + jarName, presentationdUrl, + getRequredClasses(libInfo.getRequiredClasses())); + } + + private static String[] getRequredClasses(final String requiredClasses) { + final List strings = StringUtil.split(requiredClasses, REQUIRED_CLASSES_DELIMITER); + return ArrayUtil.toStringArray(strings); + } + + public void dispose() { + + } +} \ No newline at end of file diff --git a/source/com/intellij/facet/impl/ui/libraries/versions/LibraryConfigurationInfo.java b/source/com/intellij/facet/impl/ui/libraries/versions/LibraryConfigurationInfo.java new file mode 100644 index 0000000000..b5527fc008 --- /dev/null +++ b/source/com/intellij/facet/impl/ui/libraries/versions/LibraryConfigurationInfo.java @@ -0,0 +1,66 @@ +/* + * 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 com.intellij.facet.impl.ui.libraries.versions; + +import com.intellij.util.xmlb.annotations.Attribute; +import com.intellij.util.xmlb.annotations.Tag; + +@Tag("lib") +public class LibraryConfigurationInfo { + + @Attribute("ri") + public String myRI; + + @Attribute("jar-name") + public String myJarName; + + @Attribute("version") + public String myVersion; + + @Attribute("download-url") + public String myDownloadUrl; + + @Attribute("presentation-url") + public String myPresentationdUrl; + + @Attribute("required-classes") + public String myRequiredClasses; + + public String getRI() { + return myRI; + } + + public String getJarName() { + return myJarName; + } + + public String getVersion() { + return myVersion; + } + + public String getDownloadUrl() { + return myDownloadUrl; + } + + public String getPresentationdUrl() { + return myPresentationdUrl; + } + + public String getRequiredClasses() { + return myRequiredClasses; + } +} \ No newline at end of file diff --git a/source/com/intellij/facet/impl/ui/libraries/versions/LibraryVersionInfo.java b/source/com/intellij/facet/impl/ui/libraries/versions/LibraryVersionInfo.java new file mode 100644 index 0000000000..98dccf36fd --- /dev/null +++ b/source/com/intellij/facet/impl/ui/libraries/versions/LibraryVersionInfo.java @@ -0,0 +1,62 @@ +package com.intellij.facet.impl.ui.libraries.versions; + +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; + +public class LibraryVersionInfo { + @NotNull private String myVersion; + @Nullable private String myRI; + + + public LibraryVersionInfo(@NotNull String version) { + myVersion = version; + } + + public LibraryVersionInfo(@NotNull String version, @Nullable String RI) { + myVersion = version; + myRI = RI; + } + + @NotNull + public String getVersion() { + return myVersion; + } + + public void setVersion(@NotNull String version) { + myVersion = version; + } + + @Nullable + public String getRI() { + return myRI; + } + + public void setRI(@Nullable String RI) { + myRI = RI; + } + + @Override + public String toString() { + return myVersion; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + LibraryVersionInfo that = (LibraryVersionInfo)o; + + if (myRI != null ? !myRI.equals(that.myRI) : that.myRI != null) return false; + if (!myVersion.equals(that.myVersion)) return false; + + return true; + } + + @Override + public int hashCode() { + int result = myVersion.hashCode(); + result = 31 * result + (myRI != null ? myRI.hashCode() : 0); + return result; + } +} diff --git a/source/com/intellij/facet/impl/ui/libraries/versions/VersionsComponent.java b/source/com/intellij/facet/impl/ui/libraries/versions/VersionsComponent.java new file mode 100644 index 0000000000..e12917d9ed --- /dev/null +++ b/source/com/intellij/facet/impl/ui/libraries/versions/VersionsComponent.java @@ -0,0 +1,231 @@ +package com.intellij.facet.impl.ui.libraries.versions; + +import com.intellij.facet.ui.libraries.FacetLibrariesValidator; +import com.intellij.facet.ui.libraries.FacetLibrariesValidatorDescription; +import com.intellij.facet.ui.libraries.JarVersionDetectionUtil; +import com.intellij.facet.ui.libraries.LibraryInfo; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.ui.CollectionComboBoxModel; +import com.intellij.util.containers.HashSet; +import com.intellij.util.containers.hash.HashMap; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public abstract class VersionsComponent { + private JPanel myMainPanel; + private static String UNKNOWN_RI_NAME = "Unknown"; + + @Nullable private Module myModule; + private FacetLibrariesValidator myValidator; + + private ButtonGroup myButtonGroup = new ButtonGroup(); + + private Map> myButtons = new HashMap>(); + + public VersionsComponent(@Nullable final Module module, FacetLibrariesValidator validator) { + myModule = module; + myValidator = validator; + } + + public JPanel getJComponent() { + if (myMainPanel == null) { + init(); + } + return myMainPanel; + } + + private void init() { + myMainPanel = new JPanel(new GridBagLayout()); + + Set referenceImplementations = getRIs(); + + if (referenceImplementations.size() == 1) { + String ri = referenceImplementations.iterator().next(); + addSingletonReferenceImplementationUI(ri); + } + else { + LibraryVersionInfo currentVersion = null; + + for (String ri : referenceImplementations) { + addMultipleReferenceImplementationUI(ri); + + if (currentVersion == null) { + currentVersion = getCurrentVersion(ri); + } + } + + if (currentVersion != null) { + Pair currentPair = myButtons.get(currentVersion.getRI()); + if (currentPair != null) { + currentPair.first.setSelected(true); + currentPair.second.setSelectedItem(currentVersion); + for (Pair buttonsPair : myButtons.values()) { + if (buttonsPair != currentPair) { + buttonsPair.second.setEnabled(false); + } + } + } + } + } + } + + @Nullable + protected String getFacetDetectionClass(@NotNull String currentRI) { + return null; + } + + @NotNull + protected abstract Map> getLibraries(); + + @Nullable + private LibraryVersionInfo getCurrentVersion(@NotNull String currentRI) { + String detectionClass = getFacetDetectionClass(currentRI); + if (detectionClass != null && myModule != null) { + final String version = JarVersionDetectionUtil.detectJarVersion(detectionClass, myModule); + if (version != null) { + for (LibraryVersionInfo info : getLibraries().keySet()) { + if (version.equals(info.getVersion())) { + return info; + } + } + } + } + + return null; + } + + private List getSupportedVersions(@NotNull String ri) { + List versions = new ArrayList(); + for (Map.Entry> entry : getLibraries().entrySet()) { + if (ri.equals(entry.getKey().getRI())) { + versions.add(entry.getKey()); + } + } + + return versions; + } + + private void addSingletonReferenceImplementationUI(@NotNull final String ri) { + JComboBox comboBox = createComboBox(ri); + addToPanel(new JLabel(ri), comboBox); + LibraryVersionInfo version = getCurrentVersion(ri); + if (version != null) { + comboBox.setSelectedItem(version); + } + } + + private void addMultipleReferenceImplementationUI(@NotNull final String ri) { + final JRadioButton radioButton = createRadioButton(ri); + final JComboBox comboBox = createComboBox(ri); + + addToPanel(radioButton, comboBox); + + myButtons.put(ri, new Pair(radioButton, comboBox)); + myButtonGroup.add(radioButton); + } + + private void addToPanel(@NotNull JComponent first, @NotNull JComponent second) { + myMainPanel.add(first, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1, 0, GridBagConstraints.LINE_START, + GridBagConstraints.BOTH, new Insets(2, 2, 2, 2), 0, 0)); + myMainPanel.add(second, + new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 1, 0, GridBagConstraints.LINE_END, GridBagConstraints.BOTH, + new Insets(2, 2, 2, 2), 0, 0)); + } + + private JRadioButton createRadioButton(final String ri) { + final JRadioButton radioButton = new JRadioButton(ri); + radioButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent actionEvent) { + for (Pair pair : myButtons.values()) { + if (pair.getFirst().equals(radioButton)) { + JComboBox comboBox = pair.second; + comboBox.setEnabled(true); + + LibraryVersionInfo currentVersion = getCurrentVersion(ri); + if (currentVersion != null) { + comboBox.setSelectedItem(currentVersion); + } + else { + comboBox.setSelectedItem(getLastElement(getSupportedVersions(ri))); + } + } + else { + pair.second.setEnabled(false); + } + } + } + }); + return radioButton; + } + + private JComboBox createComboBox(String ri) { + final JComboBox comboBox = new JComboBox(); + + List versions = getSupportedVersions(ri); + comboBox.setModel(new CollectionComboBoxModel(versions, null)); + + comboBox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + final LibraryVersionInfo versionInfo = getSelectedVersion(comboBox); + + if (versionInfo != null) { + myValidator.setDescription(new FacetLibrariesValidatorDescription(versionInfo.getVersion())); + myValidator.setRequiredLibraries(getRequiredLibraries(versionInfo)); + } + } + }); + + return comboBox; + } + + @Nullable + private static LibraryVersionInfo getLastElement(List versions) { + return versions.size() > 0 ? versions.get(versions.size() - 1) : null; + } + + private LibraryInfo[] getRequiredLibraries(LibraryVersionInfo versionInfo) { + List libraryInfos = getLibraries().get(versionInfo); + return libraryInfos.toArray(new LibraryInfo[libraryInfos.size()]); + } + + @Nullable + private static LibraryVersionInfo getSelectedVersion(@NotNull JComboBox comboBox) { + final Object version = comboBox.getModel().getSelectedItem(); + return version instanceof LibraryVersionInfo ? (LibraryVersionInfo)version : null; + } + + + public FacetLibrariesValidator getValidator() { + return myValidator; + } + + @Nullable + public Module getModule() { + return myModule; + } + + public Set getRIs() { + Set ris = new HashSet(); + for (LibraryVersionInfo info : getLibraries().keySet()) { + String ri = info.getRI(); + if (!StringUtil.isEmptyOrSpaces(ri)) { + ris.add(ri); + } + else { + ris.add(UNKNOWN_RI_NAME); + } + } + return ris; + } +} -- 2.11.4.GIT