abfc770909c983ff7f63a4c2a4adc25f5cb5cee5
[idea/community.git] / java / idea-ui / src / com / intellij / framework / library / DownloadableLibraryType.java
1 /*
2  * Copyright 2000-2012 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.framework.library;
17
18 import com.intellij.diagnostic.PluginException;
19 import com.intellij.openapi.project.Project;
20 import com.intellij.openapi.roots.libraries.*;
21 import com.intellij.openapi.roots.libraries.ui.LibraryEditorComponent;
22 import com.intellij.openapi.roots.libraries.ui.LibraryPropertiesEditor;
23 import com.intellij.openapi.util.text.StringUtil;
24 import com.intellij.openapi.vfs.VirtualFile;
25 import org.jetbrains.annotations.NotNull;
26 import org.jetbrains.annotations.Nullable;
27
28 import javax.swing.*;
29 import java.net.URL;
30 import java.util.List;
31
32 public abstract class DownloadableLibraryType extends LibraryType<LibraryVersionProperties> {
33   private final Icon myIcon;
34   private final String myLibraryCategoryName;
35   private final DownloadableLibraryDescription myLibraryDescription;
36
37   /**
38    * Creates instance of library type. You also <strong>must</strong> override {@link #getLibraryTypeIcon()} method and return non-null value
39    * from it.
40    * @param libraryCategoryName presentable description of the library type
41    * @param libraryTypeId unique id of the library type, used for serialization
42    * @param groupId name of directory on https://frameworks.jetbrains.com site which contains information about available library versions
43    * @param localUrls URLs of xml files containing information about the library versions (see /contrib/osmorc/src/org/osmorc/facet/osgi.core.xml for example)
44    */
45   protected DownloadableLibraryType(@NotNull String libraryCategoryName,
46                                @NotNull String libraryTypeId,
47                                @NotNull String groupId,
48                                URL @NotNull ... localUrls) {
49     this(libraryCategoryName, libraryTypeId, groupId, null, localUrls);
50   }
51
52   /**
53    * @deprecated use {@link #DownloadableLibraryType(String, String, String, URL...)} instead and override {@link #getLibraryTypeIcon()}
54    */
55   @Deprecated
56   public DownloadableLibraryType(@NotNull String libraryCategoryName,
57                                  @NotNull String libraryTypeId,
58                                  @NotNull String groupId,
59                                  @Nullable Icon icon,
60                                  URL @NotNull ... localUrls) {
61     super(new PersistentLibraryKind<LibraryVersionProperties>(libraryTypeId) {
62       @NotNull
63       @Override
64       public LibraryVersionProperties createDefaultProperties() {
65         return new LibraryVersionProperties();
66       }
67     });
68     myLibraryCategoryName = libraryCategoryName;
69     myLibraryDescription = DownloadableLibraryService.getInstance().createLibraryDescription(groupId, localUrls);
70     myIcon = icon;
71   }
72
73   @Nullable
74   private static LibraryVersionProperties detectVersion(List<? extends VirtualFile> classesRoots, String detectionClass) {
75     if (!LibraryUtil.isClassAvailableInLibrary(classesRoots, detectionClass)) {
76       return null;
77     }
78     final String version = JarVersionDetectionUtil.detectJarVersion(detectionClass, classesRoots);
79     return new LibraryVersionProperties(version);
80   }
81
82   @Override
83   public String getCreateActionName() {
84     return null;
85   }
86
87   @Override
88   public NewLibraryConfiguration createNewLibrary(@NotNull JComponent parentComponent,
89                                                   @Nullable VirtualFile contextDirectory,
90                                                   @NotNull Project project) {
91     return null;
92   }
93
94   @NotNull
95   public DownloadableLibraryDescription getLibraryDescription() {
96     return myLibraryDescription;
97   }
98
99   public String getLibraryCategoryName() {
100     return myLibraryCategoryName;
101   }
102
103   @Override
104   public String getDescription(@NotNull LibraryVersionProperties properties) {
105     final String versionString = properties.getVersionString();
106     return StringUtil.capitalize(myLibraryCategoryName) + " library" + (versionString != null ? " of version " + versionString : "");
107   }
108
109   @Override
110   public LibraryPropertiesEditor createPropertiesEditor(@NotNull LibraryEditorComponent<LibraryVersionProperties> editorComponent) {
111     return DownloadableLibraryService.getInstance().createDownloadableLibraryEditor(myLibraryDescription, editorComponent, this);
112   }
113
114   @NotNull
115   public Icon getLibraryTypeIcon() {
116     if (myIcon == null) {
117       throw PluginException.createByClass("'DownloadableLibraryType::getLibraryTypeIcon' isn't overriden or returns 'null' in " + getClass().getName(), null, getClass());
118     }
119     return myIcon;
120   }
121
122   @Override
123   @NotNull
124   public Icon getIcon(LibraryVersionProperties properties) {
125     return getLibraryTypeIcon();
126   }
127
128   protected abstract String @NotNull [] getDetectionClassNames();
129
130   @Override
131   public LibraryVersionProperties detect(@NotNull List<VirtualFile> classesRoots) {
132     for (String className : getDetectionClassNames()) {
133       final LibraryVersionProperties versionProperties = detectVersion(classesRoots, className);
134       if (versionProperties != null) return versionProperties;
135     }
136     return null;
137   }
138 }