package org.osmorc.facet;
import com.intellij.facet.impl.ui.FacetEditorsFactoryImpl;
import com.intellij.facet.ui.FacetEditorContext;
import com.intellij.facet.ui.FacetValidatorsManager;
import com.intellij.facet.ui.libraries.FrameworkLibraryValidator;
import com.intellij.framework.library.DownloadableLibraryService;
import com.intellij.framework.library.DownloadableLibraryType;
import com.intellij.framework.library.LibraryVersionProperties;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.libraries.LibrariesHelper;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.LibraryUtil;
import com.intellij.openapi.roots.ui.configuration.libraries.CustomLibraryDescription;
import com.intellij.openapi.vfs.JarFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ArrayUtil;
import icons.OsmorcIdeaIcons;
import org.jetbrains.annotations.NotNull;
import org.osgi.framework.Constants;
import org.osgi.framework.Version;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
public class OsgiCoreLibraryType extends DownloadableLibraryType {
private static final String ID = "org.osgi.core";
private static final String DETECTOR_CLASS = "org.osgi.framework.Constants";
public OsgiCoreLibraryType() {
super("OSGi Core API", ID, ID, OsmorcIdeaIcons.Osgi, OsgiCoreLibraryType.class.getResource("osgi.core.xml"));
}
@Override
public LibraryVersionProperties detect(@NotNull List<VirtualFile> roots) {
if (!LibraryUtil.isClassAvailableInLibrary(roots, DETECTOR_CLASS)) {
return null;
}
VirtualFile jar = LibrariesHelper.getInstance().findRootByClass(roots, DETECTOR_CLASS);
if (jar != null && jar.getFileSystem() instanceof JarFileSystem) {
VirtualFile manifestFile = jar.findFileByRelativePath(JarFile.MANIFEST_NAME);
if (manifestFile != null) {
try {
InputStream input = manifestFile.getInputStream();
try {
String version = new Manifest(input).getMainAttributes().getValue(Constants.BUNDLE_VERSION);
if (version != null) {
try {
Version v = new Version(version);
return new LibraryVersionProperties(v.getMajor() + "." + v.getMinor() + "." + v.getMicro());
}
catch (IllegalArgumentException ignored) { }
}
}
finally {
input.close();
}
}
catch (IOException ignored) { }
}
}
// unknown version
return new LibraryVersionProperties(null);
}
@Override
protected String[] getDetectionClassNames() {
Logger.getInstance(getClass()).error(new AssertionError("shouldn't be called"));
return ArrayUtil.EMPTY_STRING_ARRAY;
}
public static boolean isOsgiCoreLibrary(@NotNull Library library) {
VirtualFile[] roots = library.getFiles(OrderRootType.CLASSES);
return LibraryUtil.isClassAvailableInLibrary(roots, DETECTOR_CLASS);
}
public static FrameworkLibraryValidator getValidator(FacetEditorContext context, FacetValidatorsManager manager) {
CustomLibraryDescription description = DownloadableLibraryService.getInstance().createDescriptionForType(OsgiCoreLibraryType.class);
return FacetEditorsFactoryImpl.getInstanceImpl().createLibraryValidator(description, context, manager, ID);
}
}