package org.jbehave.eclipse.preferences;
import static org.jbehave.eclipse.util.Objects.o;
import org.apache.commons.lang.StringUtils;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.jbehave.eclipse.Activator;
import org.osgi.service.prefs.BackingStoreException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ProjectPreferences {
private static final String QUALIFIER = Activator.PLUGIN_ID + "/project";
private static final String DEFAULT_PARAMETER_PREFIX = "$";
public static final String USE_PROJECT_SETTINGS = "use_project_settings";
public static final String LANGUAGES = "keyword.languages";
public static final String LANGUAGE = "keyword.language";
public static final String PARAMETER_PREFIX = "parameter.prefix";
//
private Logger logger = LoggerFactory.getLogger(ProjectPreferences.class);
//
private final PreferencesHelper helper;
//
private final boolean isProjectLevel;
private boolean useProjectSettings;
private String storyLanguage;
private String parameterPrefix;
//
private String[] availableStoryLanguages;
public ProjectPreferences(IScopeContext scope) {
helper = PreferencesHelper.getHelper(QUALIFIER, scope);
isProjectLevel = false;
}
public ProjectPreferences() {
helper = PreferencesHelper.getHelper(QUALIFIER);
isProjectLevel = false;
}
public ProjectPreferences(final IProject project) {
helper = PreferencesHelper.getHelper(QUALIFIER, project);
isProjectLevel = true;
}
public void addListener(IPreferenceChangeListener changeListener) {
helper.addListener(changeListener);
}
public boolean hasOptionsAtLowestScope() {
return helper.hasAnyAtLowestScope();
}
public void store() throws BackingStoreException {
helper.removeAllAtLowestScope();
helper.putString(LANGUAGE, storyLanguage);
helper.putString(LANGUAGES, StringUtils.join(availableStoryLanguages,","));
helper.putBoolean(USE_PROJECT_SETTINGS, useProjectSettings);
helper.putString(PARAMETER_PREFIX, parameterPrefix);
helper.flush();
logger.info("Project preferences stored (projectLevel: {}), storyLanguage: {}, useProjectSettings: {}, parameterPrefix: {}",//
o(isProjectLevel, storyLanguage, useProjectSettings, parameterPrefix));
}
public void load() throws BackingStoreException {
storyLanguage = helper.getString(LANGUAGE, "en");
availableStoryLanguages = helper.getString(LANGUAGES, "en").split(",");
useProjectSettings = helper.getBoolean(USE_PROJECT_SETTINGS, false);
parameterPrefix = helper.getString(PARAMETER_PREFIX, DEFAULT_PARAMETER_PREFIX);
logger.info("Project preferences loaded (projectLevel: {}), storyLanguage: {}, useProjectSettings: {}, parameterPrefix: {}",//
o(isProjectLevel, storyLanguage, useProjectSettings, parameterPrefix));
}
public String[] availableStoryLanguages() {
return availableStoryLanguages;
}
public void setAvailableStoryLanguages(String... availableStoryLanguages) {
this.availableStoryLanguages = availableStoryLanguages;
}
public void setStoryLanguage(String storyLanguage) {
this.storyLanguage = storyLanguage;
}
public String getStoryLanguage() {
return storyLanguage;
}
public boolean isUseProjectSettings() {
return useProjectSettings;
}
public void setUseProjectSettings(boolean useProjectSettings) {
this.useProjectSettings = useProjectSettings;
}
public String getParameterPrefix() {
if ( parameterPrefix == null ){
return DEFAULT_PARAMETER_PREFIX;
}
return parameterPrefix;
}
/**
* Define the parameter prefix, if the prefix is blank then it is automatically
* replaced by '$'
* @param parameterPrefix
*/
public void setParameterPrefix(String parameterPrefix) {
if(StringUtils.isBlank(parameterPrefix))
parameterPrefix = DEFAULT_PARAMETER_PREFIX;
this.parameterPrefix = parameterPrefix.trim();
}
public void removeAllSpecificSettings() throws BackingStoreException {
logger.info("Remove project specific settings");
helper.removeAllAtLowestScope();
load();
}
}