/*******************************************************************************
* Copyright (c) 2006, 2008 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.wst.jsdt.internal.corext.fix;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin;
import org.eclipse.wst.jsdt.internal.ui.preferences.cleanup.CleanUpMessages;
import org.eclipse.wst.jsdt.internal.ui.preferences.cleanup.CleanUpProfileManager;
import org.eclipse.wst.jsdt.internal.ui.preferences.cleanup.CleanUpProfileVersioner;
import org.eclipse.wst.jsdt.internal.ui.preferences.formatter.ProfileStore;
import org.eclipse.wst.jsdt.internal.ui.preferences.formatter.ProfileManager.BuiltInProfile;
import org.eclipse.wst.jsdt.internal.ui.preferences.formatter.ProfileManager.CustomProfile;
import org.eclipse.wst.jsdt.internal.ui.preferences.formatter.ProfileManager.KeySet;
import org.eclipse.wst.jsdt.internal.ui.preferences.formatter.ProfileManager.Profile;
import org.eclipse.wst.jsdt.ui.JavaScriptUI;
public class CleanUpPreferenceUtil {
public static final String SAVE_PARTICIPANT_KEY_PREFIX= "sp_"; //$NON-NLS-1$
public static Map loadOptions(IScopeContext context) {
return loadOptions(context, CleanUpConstants.CLEANUP_PROFILE, CleanUpConstants.DEFAULT_PROFILE);
}
private static Map loadOptions(IScopeContext context, String profileIdKey, String defaultProfileId) {
IEclipsePreferences contextNode= context.getNode(JavaScriptUI.ID_PLUGIN);
String id= contextNode.get(profileIdKey, null);
if (id != null && ProjectScope.SCOPE.equals(context.getName())) {
return loadFromProject(context);
}
InstanceScope instanceScope= new InstanceScope();
if (id == null) {
if (ProjectScope.SCOPE.equals(context.getName())) {
id= instanceScope.getNode(JavaScriptUI.ID_PLUGIN).get(profileIdKey, null);
}
if (id == null) {
id= new DefaultScope().getNode(JavaScriptUI.ID_PLUGIN).get(profileIdKey, defaultProfileId);
}
}
List builtInProfiles= getBuiltInProfiles();
for (Iterator iterator= builtInProfiles.iterator(); iterator.hasNext();) {
Profile profile= (Profile)iterator.next();
if (id.equals(profile.getID()))
return profile.getSettings();
}
if (id.equals(CleanUpConstants.SAVE_PARTICIPANT_PROFILE))
return CleanUpConstants.getSaveParticipantSettings();
CleanUpProfileVersioner versioner= new CleanUpProfileVersioner();
ProfileStore profileStore= new ProfileStore(CleanUpConstants.CLEANUP_PROFILES, versioner);
List list= null;
try {
list= profileStore.readProfiles(instanceScope);
} catch (CoreException e1) {
JavaScriptPlugin.log(e1);
}
if (list == null)
return null;
for (Iterator iterator= list.iterator(); iterator.hasNext();) {
Profile profile= (Profile)iterator.next();
if (id.equals(profile.getID()))
return profile.getSettings();
}
return null;
}
private static Map loadFromProject(IScopeContext context) {
final Map profileOptions= new HashMap();
IEclipsePreferences uiPrefs= context.getNode(JavaScriptUI.ID_PLUGIN);
CleanUpProfileVersioner versioner= new CleanUpProfileVersioner();
Map defaultSettings= CleanUpConstants.getEclipseDefaultSettings();
KeySet[] keySets= CleanUpProfileManager.KEY_SETS;
boolean hasValues= false;
for (int i= 0; i < keySets.length; i++) {
KeySet keySet= keySets[i];
IEclipsePreferences preferences= context.getNode(keySet.getNodeName());
for (final Iterator keyIter = keySet.getKeys().iterator(); keyIter.hasNext(); ) {
final String key= (String) keyIter.next();
Object val= preferences.get(key, null);
if (val != null) {
hasValues= true;
} else {
val= defaultSettings.get(key);
}
profileOptions.put(key, val);
}
}
if (!hasValues)
return null;
int version= uiPrefs.getInt(CleanUpConstants.CLEANUP_SETTINGS_VERSION_KEY, versioner.getFirstVersion());
if (version == versioner.getCurrentVersion())
return profileOptions;
CustomProfile profile= new CustomProfile("tmp", profileOptions, version, versioner.getProfileKind()); //$NON-NLS-1$
versioner.update(profile);
return profile.getSettings();
}
public static Map loadSaveParticipantOptions(IScopeContext context) {
IEclipsePreferences node;
if (hasSettingsInScope(context)) {
node= context.getNode(JavaScriptUI.ID_PLUGIN);
} else {
IScopeContext instanceScope= new InstanceScope();
if (hasSettingsInScope(instanceScope)) {
node= instanceScope.getNode(JavaScriptUI.ID_PLUGIN);
} else {
return CleanUpConstants.getSaveParticipantSettings();
}
}
Map result= new HashMap();
Map defaultSettings= CleanUpConstants.getSaveParticipantSettings();
for (Iterator iterator= defaultSettings.keySet().iterator(); iterator.hasNext();) {
String key= (String)iterator.next();
result.put(key, node.get(SAVE_PARTICIPANT_KEY_PREFIX + key, CleanUpConstants.FALSE));
}
return result;
}
public static void saveSaveParticipantOptions(IScopeContext context, Map settings) {
IEclipsePreferences node= context.getNode(JavaScriptUI.ID_PLUGIN);
for (Iterator iterator= settings.keySet().iterator(); iterator.hasNext();) {
String key= (String)iterator.next();
node.put(SAVE_PARTICIPANT_KEY_PREFIX + key, (String)settings.get(key));
}
}
private static boolean hasSettingsInScope(IScopeContext context) {
IEclipsePreferences node= context.getNode(JavaScriptUI.ID_PLUGIN);
Map defaultSettings= CleanUpConstants.getSaveParticipantSettings();
for (Iterator iterator= defaultSettings.keySet().iterator(); iterator.hasNext();) {
String key= (String)iterator.next();
if (node.get(SAVE_PARTICIPANT_KEY_PREFIX + key, null) != null)
return true;
}
return false;
}
/**
* Returns a list of {@link org.eclipse.wst.jsdt.internal.ui.preferences.formatter.ProfileManager.Profile} stored in the <code>scope</code>
* including the built in profiles.
* @param scope the context from which to retrieve the profiles
* @return list of profiles, not null
*
*/
public static List loadProfiles(IScopeContext scope) {
CleanUpProfileVersioner versioner= new CleanUpProfileVersioner();
ProfileStore profileStore= new ProfileStore(CleanUpConstants.CLEANUP_PROFILES, versioner);
List list= null;
try {
list= profileStore.readProfiles(scope);
} catch (CoreException e1) {
JavaScriptPlugin.log(e1);
}
if (list == null) {
list= getBuiltInProfiles();
} else {
list.addAll(getBuiltInProfiles());
}
return list;
}
/**
* Returns a list of built in clean up profiles
* @return the list of built in profiles, not null
*
*/
public static List getBuiltInProfiles() {
ArrayList result= new ArrayList();
final Profile eclipseProfile= new BuiltInProfile(CleanUpConstants.ECLIPSE_PROFILE, CleanUpMessages.CleanUpProfileManager_ProfileName_EclipseBuildIn, CleanUpConstants.getEclipseDefaultSettings(), 2, CleanUpProfileVersioner.CURRENT_VERSION, CleanUpProfileVersioner.PROFILE_KIND);
result.add(eclipseProfile);
return result;
}
}