content: /*******************************************************************************
   * 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;
      }
  
  }
  