/******************************************************************************* * Copyright (c) 2000, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.internal.core; import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.jdt.core.IClasspathContainer; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.core.util.Util; import org.osgi.service.prefs.BackingStoreException; /** * */ public class UserLibraryManager { public final static String CP_USERLIBRARY_PREFERENCES_PREFIX = JavaCore.PLUGIN_ID+".userLibrary."; //$NON-NLS-1$ private Map userLibraries; public UserLibraryManager() { initialize(); } /* * Gets the library for a given name or <code>null</code> if no such library exists. */ public synchronized UserLibrary getUserLibrary(String libName) { return (UserLibrary) this.userLibraries.get(libName); } /* * Returns the names of all defined user libraries. The corresponding classpath container path * is the name appended to the CONTAINER_ID. */ public synchronized String[] getUserLibraryNames() { Set set = this.userLibraries.keySet(); return (String[]) set.toArray(new String[set.size()]); } private void initialize() { this.userLibraries = new HashMap(); IEclipsePreferences instancePreferences = JavaModelManager.getJavaModelManager().getInstancePreferences(); String[] propertyNames; try { propertyNames = instancePreferences.keys(); } catch (BackingStoreException e) { Util.log(e, "Exception while initializing user libraries"); //$NON-NLS-1$ return; } boolean preferencesNeedFlush = false; for (int i = 0, length = propertyNames.length; i < length; i++) { String propertyName = propertyNames[i]; if (propertyName.startsWith(CP_USERLIBRARY_PREFERENCES_PREFIX)) { String propertyValue = instancePreferences.get(propertyName, null); if (propertyValue != null) { String libName= propertyName.substring(CP_USERLIBRARY_PREFERENCES_PREFIX.length()); StringReader reader = new StringReader(propertyValue); UserLibrary library; try { library = UserLibrary.createFromString(reader); } catch (IOException e) { Util.log(e, "Exception while initializing user library " + libName); //$NON-NLS-1$ instancePreferences.remove(propertyName); preferencesNeedFlush = true; continue; } catch (ClasspathEntry.AssertionFailedException e) { Util.log(e, "Exception while initializing user library " + libName); //$NON-NLS-1$ instancePreferences.remove(propertyName); preferencesNeedFlush = true; continue; } this.userLibraries.put(libName, library); } } } if (preferencesNeedFlush) { try { instancePreferences.flush(); } catch (BackingStoreException e) { Util.log(e, "Exception while flusing instance preferences"); //$NON-NLS-1$ } } } public void updateUserLibrary(String libName, String encodedUserLibrary) { try { // find affected projects IPath containerPath = new Path(JavaCore.USER_LIBRARY_CONTAINER_ID).append(libName); IJavaProject[] allJavaProjects = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()).getJavaProjects(); ArrayList affectedProjects = new ArrayList(); for (int i= 0; i < allJavaProjects.length; i++) { IJavaProject javaProject = allJavaProjects[i]; IClasspathEntry[] entries= javaProject.getRawClasspath(); for (int j= 0; j < entries.length; j++) { IClasspathEntry entry = entries[j]; if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER) { if (containerPath.equals(entry.getPath())) { affectedProjects.add(javaProject); break; } } } } // decode user library UserLibrary userLibrary = encodedUserLibrary == null ? null : UserLibrary.createFromString(new StringReader(encodedUserLibrary)); synchronized (this) { // update user libraries map if (userLibrary != null) { this.userLibraries.put(libName, userLibrary); } else { this.userLibraries.remove(libName); } } // update affected projects int length = affectedProjects.size(); if (length == 0) return; IJavaProject[] projects = new IJavaProject[length]; affectedProjects.toArray(projects); IClasspathContainer[] containers = new IClasspathContainer[length]; if (userLibrary != null) { UserLibraryClasspathContainer container = new UserLibraryClasspathContainer(libName); for (int i = 0; i < length; i++) { containers[i] = container; } } JavaCore.setClasspathContainer(containerPath, projects, containers, null); } catch (IOException e) { Util.log(e, "Exception while decoding user library '"+ libName +"'."); //$NON-NLS-1$ //$NON-NLS-2$ } catch (JavaModelException e) { Util.log(e, "Exception while setting user library '"+ libName +"'."); //$NON-NLS-1$ //$NON-NLS-2$ } catch (ClasspathEntry.AssertionFailedException ase) { Util.log(ase, "Exception while decoding user library '"+ libName +"'."); //$NON-NLS-1$ //$NON-NLS-2$ } } public void removeUserLibrary(String libName) { synchronized (this.userLibraries) { IEclipsePreferences instancePreferences = JavaModelManager.getJavaModelManager().getInstancePreferences(); String propertyName = CP_USERLIBRARY_PREFERENCES_PREFIX+libName; instancePreferences.remove(propertyName); try { instancePreferences.flush(); } catch (BackingStoreException e) { Util.log(e, "Exception while removing user library " + libName); //$NON-NLS-1$ } } // this.userLibraries was updated during the PreferenceChangeEvent (see preferenceChange(...)) } public void setUserLibrary(String libName, IClasspathEntry[] entries, boolean isSystemLibrary) { synchronized (this.userLibraries) { IEclipsePreferences instancePreferences = JavaModelManager.getJavaModelManager().getInstancePreferences(); String propertyName = CP_USERLIBRARY_PREFERENCES_PREFIX+libName; try { String propertyValue = UserLibrary.serialize(entries, isSystemLibrary); instancePreferences.put(propertyName, propertyValue); // sends out a PreferenceChangeEvent (see preferenceChange(...)) } catch (IOException e) { Util.log(e, "Exception while serializing user library " + libName); //$NON-NLS-1$ return; } try { instancePreferences.flush(); } catch (BackingStoreException e) { Util.log(e, "Exception while saving user library " + libName); //$NON-NLS-1$ } } // this.userLibraries was updated during the PreferenceChangeEvent (see preferenceChange(...)) } }