blob: 7922ad7d903f2115a098ac90f88bd467e2a7ca26 [file] [log] [blame]
/*
* 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.
*/
/*
* User: anna
* Date: 11-Mar-2009
*/
package org.jetbrains.idea.eclipse.conversion;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.LibraryTable;
import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar;
import com.intellij.openapi.util.JDOMUtil;
import com.intellij.openapi.vfs.JarFileSystem;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.util.containers.ContainerUtil;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class EclipseUserLibrariesHelper {
//private static final String ORG_ECLIPSE_JDT_CORE_PREFS = "org.eclipse.jdt.core.prefs";
//private static final String ORG_ECLIPSE_JDT_CORE_USER_LIBRARY = "org.eclipse.jdt.core.userLibrary.";
private EclipseUserLibrariesHelper() {
}
private static void writeUserLibrary(final Library library, final Element libElement) {
final VirtualFile[] files = library.getFiles(OrderRootType.CLASSES);
for (VirtualFile file : files) {
Element archElement = new Element("archive");
if (file.getFileSystem() instanceof JarFileSystem) {
final VirtualFile localFile = JarFileSystem.getInstance().getVirtualFileForJar(file);
if (localFile != null) {
file = localFile;
}
}
archElement.setAttribute("path", file.getPath());
libElement.addContent(archElement);
}
}
public static void appendProjectLibraries(final Project project, @Nullable final File userLibrariesFile) throws IOException {
if (userLibrariesFile == null) return;
if (userLibrariesFile.exists() && !userLibrariesFile.isFile()) return;
final File parentFile = userLibrariesFile.getParentFile();
if (parentFile == null) return;
if (!parentFile.isDirectory()) {
if (!parentFile.mkdir()) return;
}
final Element userLibsElement = new Element("eclipse-userlibraries");
final List<Library> libraries = new ArrayList<Library>(Arrays.asList(ProjectLibraryTable.getInstance(project).getLibraries()));
ContainerUtil.addAll(libraries, LibraryTablesRegistrar.getInstance().getLibraryTable().getLibraries());
for (Library library : libraries) {
Element libElement = new Element("library");
libElement.setAttribute("name", library.getName());
writeUserLibrary(library, libElement);
userLibsElement.addContent(libElement);
}
JDOMUtil.writeDocument(new Document(userLibsElement), userLibrariesFile, "\n");
}
public static void readProjectLibrariesContent(File exportedFile, Project project, Collection<String> unknownLibraries)
throws IOException, JDOMException {
if (exportedFile.exists()) {
final LibraryTable libraryTable = ProjectLibraryTable.getInstance(project);
final Element rootElement = JDOMUtil.loadDocument(exportedFile).getRootElement();
for (Object o : rootElement.getChildren("library")) {
final Element libElement = (Element)o;
final String libName = libElement.getAttributeValue("name");
Library libraryByName = libraryTable.getLibraryByName(libName);
if (libraryByName == null) {
final LibraryTable.ModifiableModel model = libraryTable.getModifiableModel();
libraryByName = model.createLibrary(libName);
model.commit();
}
if (libraryByName != null) {
final Library.ModifiableModel model = libraryByName.getModifiableModel();
for (Object a : libElement.getChildren("archive")) {
String rootPath = ((Element)a).getAttributeValue("path");
if (rootPath.startsWith("/")) { //relative to workspace root
rootPath = project.getBaseDir().getPath() + rootPath;
}
String url = VfsUtil.pathToUrl(rootPath);
final VirtualFile localFile = VirtualFileManager.getInstance().findFileByUrl(url);
if (localFile != null) {
final VirtualFile jarFile = JarFileSystem.getInstance().getJarRootForLocalFile(localFile);
if (jarFile != null) {
url = jarFile.getUrl();
}
}
model.addRoot(url, OrderRootType.CLASSES);
}
model.commit();
}
unknownLibraries.remove(libName); //ignore finally found libraries
}
}
}
}