blob: 60f4b55e9fc7cda6851b1e1290d02fb68106646a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2007 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.dltk.internal.core;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
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.dltk.core.DLTKCore;
import org.eclipse.dltk.core.DLTKLanguageManager;
import org.eclipse.dltk.core.IBuildpathContainer;
import org.eclipse.dltk.core.IBuildpathEntry;
import org.eclipse.dltk.core.IDLTKLanguageToolkit;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.internal.core.util.Util;
import org.osgi.service.prefs.BackingStoreException;
/**
*
*/
public class UserLibraryManager {
public final static String BP_USERLIBRARY_PREFERENCES_PREFIX = DLTKCore.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,
IDLTKLanguageToolkit toolkit) {
return (UserLibrary) this.userLibraries.get(makeLibraryName(libName,
toolkit));
}
public static String makeLibraryName(String libName,
IDLTKLanguageToolkit toolkit) {
if (toolkit == null) {
return "#" + libName; //$NON-NLS-1$
}
return toolkit.getNatureId() + "#" + libName; //$NON-NLS-1$
}
private String getLibraryName(String key) {
int pos = key.indexOf("#"); //$NON-NLS-1$
if (pos != -1) {
return key.substring(pos + 1);
}
return key;
}
private IDLTKLanguageToolkit getToolkitFromKey(String key) {
int pos = key.indexOf("#"); //$NON-NLS-1$
if (pos != -1) {
String nature = key.substring(0, pos);
return DLTKLanguageManager.getLanguageToolkit(nature);
}
return null;
}
/*
* 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(
IDLTKLanguageToolkit toolkit) {
Set set = this.userLibraries.keySet();
Set result = new HashSet();
for (Iterator iterator = set.iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
int pos = key.indexOf("#"); //$NON-NLS-1$
if (pos != -1) {
String nature = key.substring(0, pos);
if (toolkit.getNatureId().equals(nature)) {
result.add(getLibraryName(key));
}
}
}
return (String[]) result.toArray(new String[result.size()]);
}
private void initialize() {
this.userLibraries = new HashMap();
IEclipsePreferences instancePreferences = ModelManager
.getModelManager().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(BP_USERLIBRARY_PREFERENCES_PREFIX)) {
String propertyValue = instancePreferences.get(propertyName,
null);
if (propertyValue != null) {
String libName = propertyName
.substring(BP_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;
}
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(DLTKCore.USER_LIBRARY_CONTAINER_ID)
.append(getLibraryName(libName));
IScriptProject[] allJavaProjects = DLTKCore.create(
ResourcesPlugin.getWorkspace().getRoot())
.getScriptProjects();
ArrayList affectedProjects = new ArrayList();
for (int i = 0; i < allJavaProjects.length; i++) {
IScriptProject javaProject = allJavaProjects[i];
IBuildpathEntry[] entries = javaProject.getRawBuildpath();
for (int j = 0; j < entries.length; j++) {
IBuildpathEntry entry = entries[j];
if (entry.getEntryKind() == IBuildpathEntry.BPE_CONTAINER) {
if (containerPath.equals(entry.getPath())) {
affectedProjects.add(javaProject);
break;
}
}
}
}
// decode user library
UserLibrary userLibrary = encodedUserLibrary == null ? null
: UserLibrary.createFromString(new StringReader(
encodedUserLibrary));
// 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;
IScriptProject[] projects = new IScriptProject[length];
affectedProjects.toArray(projects);
IBuildpathContainer[] containers = new IBuildpathContainer[length];
IDLTKLanguageToolkit toolkit = getToolkitFromKey(libName);
if (userLibrary != null && toolkit != null) {
UserLibraryBuildpathContainer container = new UserLibraryBuildpathContainer(
getLibraryName(libName), toolkit);
for (int i = 0; i < length; i++) {
containers[i] = container;
}
}
DLTKCore.setBuildpathContainer(containerPath, projects, containers,
null);
} catch (IOException e) {
Util.log(e,
"Exception while decoding user library '" + libName + "'."); //$NON-NLS-1$ //$NON-NLS-2$
} catch (ModelException e) {
Util.log(e,
"Exception while setting user library '" + libName + "'."); //$NON-NLS-1$ //$NON-NLS-2$
}
}
public synchronized void removeUserLibrary(String libName,
IDLTKLanguageToolkit toolkit) {
IEclipsePreferences instancePreferences = ModelManager
.getModelManager().getInstancePreferences();
String propertyName = BP_USERLIBRARY_PREFERENCES_PREFIX
+ makeLibraryName(libName, toolkit);
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 synchronized void setUserLibrary(String libName,
IBuildpathEntry[] entries, boolean isSystemLibrary,
IDLTKLanguageToolkit toolkit) {
setUserLibrary(libName, entries, isSystemLibrary, null, toolkit);
}
public synchronized void setUserLibrary(String libName,
IBuildpathEntry[] entries, boolean isSystemLibrary,
Map<String, String> attributes, IDLTKLanguageToolkit toolkit) {
IEclipsePreferences instancePreferences = ModelManager
.getModelManager().getInstancePreferences();
String propertyName = BP_USERLIBRARY_PREFERENCES_PREFIX
+ makeLibraryName(libName, toolkit);
try {
String propertyValue = UserLibrary.serialize(entries,
isSystemLibrary, attributes);
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(...))
}
}