| /******************************************************************************* |
| * Copyright (c) 2009, 2011 Alena Laskavaia |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Alena Laskavaia - initial API and implementation |
| * Sergey Prigogin (Google) |
| *******************************************************************************/ |
| package org.eclipse.cdt.codan.internal.core; |
| |
| import org.eclipse.cdt.codan.core.CodanCorePlugin; |
| import org.eclipse.cdt.codan.core.model.CodanSeverity; |
| import org.eclipse.cdt.codan.core.model.IProblem; |
| import org.eclipse.cdt.codan.core.model.IProblemProfile; |
| import org.eclipse.cdt.codan.core.model.IProblemWorkingCopy; |
| import org.eclipse.cdt.codan.core.param.IProblemPreference; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.ProjectScope; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.core.runtime.preferences.IEclipsePreferences; |
| import org.eclipse.core.runtime.preferences.IPreferencesService; |
| import org.eclipse.core.runtime.preferences.InstanceScope; |
| import org.osgi.service.prefs.Preferences; |
| |
| /** |
| * Helper class to load/save problem profile settings in persistent storage |
| * |
| */ |
| public class CodanPreferencesLoader { |
| private IProblemProfile baseModel; |
| |
| /** |
| * Constructor |
| * |
| * @param profile - problem profile to work with |
| */ |
| public CodanPreferencesLoader(IProblemProfile profile) { |
| setInput(profile); |
| } |
| |
| /** |
| * Default constructor |
| */ |
| public CodanPreferencesLoader() { |
| } |
| |
| /** |
| * Sets the profile for this class |
| * |
| * @param profile |
| */ |
| public void setInput(IProblemProfile profile) { |
| baseModel = profile; |
| } |
| |
| /** |
| * @return problems array from the profile |
| */ |
| public IProblem[] getProblems() { |
| IProblem[] problems = baseModel.getProblems(); |
| return problems; |
| } |
| |
| /** |
| * @param id |
| * @param s |
| */ |
| public void setProperty(String id, String s) { |
| IProblem prob = baseModel.findProblem(id); |
| if (!(prob instanceof IProblemWorkingCopy)) |
| return; |
| String sevs = s; |
| boolean enabled = true; |
| if (sevs.startsWith("-")) { //$NON-NLS-1$ |
| sevs = sevs.substring(1); |
| enabled = false; |
| } |
| ((IProblemWorkingCopy) prob).setEnabled(enabled); |
| CodanSeverity sev; |
| try { |
| sev = CodanSeverity.valueOf(sevs); |
| } catch (RuntimeException e) { |
| sev = CodanSeverity.Warning; |
| } |
| ((IProblemWorkingCopy) prob).setSeverity(sev); |
| } |
| |
| @Override |
| public String toString() { |
| return getInput().toString(); |
| } |
| |
| /** |
| * @return problem profile set for this class |
| */ |
| public IProblemProfile getInput() { |
| return baseModel; |
| } |
| |
| /** |
| * @param id - property id, which is the same as problem id |
| * @return get text representation of a "property" value for the given id, |
| * which is severity name, with "-" in front of it it problem is |
| * disabled. |
| */ |
| public String getProperty(String id) { |
| IProblem prob = baseModel.findProblem(id); |
| String enabled = prob.isEnabled() ? "" : "-"; //$NON-NLS-1$ //$NON-NLS-2$ |
| String severity = prob.getSeverity().toString(); |
| String res = enabled + severity; |
| return res; |
| } |
| |
| /** |
| * Takes string values from storePreferences and applies them to the problem |
| * profile. |
| * |
| * @param storePreferences |
| */ |
| public void load(Preferences storePreferences) { |
| IProblem[] probs = getProblems(); |
| for (int i = 0; i < probs.length; i++) { |
| String id = probs[i].getId(); |
| String s = storePreferences.get(id, null); |
| if (s != null) { |
| setProperty(id, s); |
| setProblemPreferenceValues(id, storePreferences); |
| } |
| } |
| } |
| |
| /** |
| * Takes string values from storePreferences and applies them to the problem |
| * profile |
| * |
| * @param storePreferences |
| */ |
| public void load(Preferences[] storePreferences) { |
| IPreferencesService prefService = Platform.getPreferencesService(); |
| IProblem[] probs = getProblems(); |
| for (int i = 0; i < probs.length; i++) { |
| String id = probs[i].getId(); |
| String s = prefService.get(id, null, storePreferences); |
| if (s != null) { |
| setProperty(id, s); |
| setProblemPreferenceValues(id, storePreferences); |
| } |
| } |
| } |
| |
| /** |
| * Takes string values of the problem preferences from storePreferences |
| * and applies them to the problem profile. |
| * |
| * @param problemId |
| * @param storePreferences |
| */ |
| private void setProblemPreferenceValues(String problemId, Preferences storePreferences) { |
| IProblem prob = baseModel.findProblem(problemId); |
| String prefKey = getPreferencesKey(problemId); |
| if (prefKey == null) |
| return; |
| String exported = storePreferences.get(prefKey, null); |
| if (exported != null) { |
| //System.err.println(prefKey + " import " + exported); |
| try { |
| prob.getPreference().importValue(exported); |
| } catch (IllegalArgumentException e) { |
| CodanCorePlugin.log(e); |
| } |
| } |
| } |
| |
| /** |
| * Takes string values of the problem preferences from storePreferences |
| * and applies them to the problem profile. |
| * |
| * @param problemId |
| * @param storePreferences |
| */ |
| private void setProblemPreferenceValues(String problemId, Preferences[] storePreferences) { |
| IPreferencesService prefService = Platform.getPreferencesService(); |
| IProblem prob = baseModel.findProblem(problemId); |
| String prefKey = getPreferencesKey(problemId); |
| if (prefKey == null) |
| return; |
| String exported = prefService.get(prefKey, null, storePreferences); |
| if (exported != null) { |
| try { |
| prob.getPreference().importValue(exported); |
| } catch (IllegalArgumentException e) { |
| CodanCorePlugin.log(e); |
| } |
| } |
| } |
| |
| /** |
| * Return preference node (osgi preferences) for the project |
| * |
| * @param project |
| * @return project preferences node |
| */ |
| public static IEclipsePreferences getProjectNode(IProject project) { |
| if (!project.exists()) |
| return null; |
| return new ProjectScope(project).getNode(CodanCorePlugin.PLUGIN_ID); |
| } |
| |
| /** |
| * Return preference node (osgi preferences) for the workspace |
| * |
| * @return project preferences node |
| */ |
| public static IEclipsePreferences getWorkspaceNode() { |
| return InstanceScope.INSTANCE.getNode(CodanCorePlugin.PLUGIN_ID); |
| } |
| |
| /** |
| * Name of the preference key for the root problem preference in the osgi |
| * preferences |
| * |
| * @param id - problem id |
| * @return top level preference id |
| */ |
| public String getPreferencesKey(String id) { |
| IProblem prob = baseModel.findProblem(id); |
| IProblemPreference pref = prob.getPreference(); |
| if (pref == null) |
| return null; |
| return id + "." + pref.getKey(); //$NON-NLS-1$ |
| } |
| |
| /** |
| * @param id - problem id |
| * @return - export value of root problem preference (to be saved in eclipse |
| * preferences) |
| */ |
| public String getPreferencesString(String id) { |
| IProblem prob = baseModel.findProblem(id); |
| IProblemPreference pref = prob.getPreference(); |
| if (pref == null) |
| return null; |
| String str = pref.exportValue(); |
| //System.err.println(id + " set " + str); |
| return str; |
| } |
| } |