blob: 6b26b6c8b179e6833765e2842d3f8e94911dee8d [file] [log] [blame]
/*******************************************************************************
* 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;
}
}