blob: e1748049e87270f52b290f4ab1b2279804c9bcef [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 Oracle. 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:
* Oracle - initial API and implementation
*******************************************************************************/
package org.eclipse.jpt.jpa.core.internal.prefs;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
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.jpt.common.utility.internal.StringTools;
import org.eclipse.jpt.jpa.core.JpaFacet;
import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
import org.eclipse.jpt.jpa.core.internal.JptCoreMessages;
import org.eclipse.jpt.jpa.core.internal.platform.JpaPlatformManagerImpl;
import org.eclipse.jpt.jpa.core.platform.GenericPlatform;
import org.eclipse.jpt.jpa.core.platform.JpaPlatformDescription;
import org.eclipse.osgi.util.NLS;
import org.osgi.service.prefs.BackingStoreException;
/**
* JptPreferencesManager
*/
public class JpaPreferencesManager
{
private final IProject project;
private static volatile boolean flushPreferences = true;
// ********** public constants **********
/**
* The key for storing a JPA project's platform ID in the Eclipse
* project's preferences.
*/
protected static final String JPA_PLATFORM_PREF_KEY = JptJpaCorePlugin.LEGACY_PLUGIN_ID_ + "platform"; //$NON-NLS-1$
/**
* The old key for storing the default JPA platform ID in the workspace preferences.
* @deprecated As of version 2.3. Instead use {@link #DEFAULT_JPA_PLATFORM_1_0_PREF_KEY} or
* {@link #DEFAULT_JPA_PLATFORM_2_0_PREF_KEY}
*/
@Deprecated
public static final String DEFAULT_JPA_PLATFORM_PREF_KEY = "defaultJpaPlatform"; //$NON-NLS-1$
/**
* The key for storing the default JPA platform ID for JPA 1.0 in the workspace preferences.
*/
public static final String DEFAULT_JPA_PLATFORM_1_0_PREF_KEY =
DEFAULT_JPA_PLATFORM_PREF_KEY + "_" + JpaFacet.VERSION_1_0.getVersionString(); //$NON-NLS-1$
/**
* The key for storing the default JPA platform ID for JPA 2.0 in the workspace preferences.
*/
public static final String DEFAULT_JPA_PLATFORM_2_0_PREF_KEY =
DEFAULT_JPA_PLATFORM_PREF_KEY + "_" + JpaFacet.VERSION_2_0.getVersionString(); //$NON-NLS-1$
/**
* The key for storing a JPA project's "discover" flag in the Eclipse
* project's preferences.
*/
public static final String DISCOVER_ANNOTATED_CLASSES = JptJpaCorePlugin.PLUGIN_ID_ + "discoverAnnotatedClasses"; //$NON-NLS-1$
//bug 354780 - made the mistake of changing the project metadata in the 3.0 release
protected static final String LEGACY_DISCOVER_ANNOTATED_CLASSES = JptJpaCorePlugin.LEGACY_PLUGIN_ID_ + "discoverAnnotatedClasses"; //$NON-NLS-1$
/**
* The key for storing the name of a JPA project's metamodel source folder
* in the Eclipse project's preferences.
*/
public static final String METAMODEL_SOURCE_FOLDER_NAME = JptJpaCorePlugin.PLUGIN_ID_ + "metamodelSourceFolderName"; //$NON-NLS-1$
//bug 354780 - made the mistake of changing the project metadata in the 3.0 release
protected static final String LEGACY_METAMODEL_SOURCE_FOLDER_NAME = JptJpaCorePlugin.LEGACY_PLUGIN_ID_ + "metamodelSourceFolderName"; //$NON-NLS-1$
// ********** static methods **************************************************
public static void clearWorkspacePreferences() throws BackingStoreException {
getWorkspacePreferences().clear();
}
// ********** preferences **********
/**
* Return the Dali preferences for the specified context.
*/
private static IEclipsePreferences getPreferences(IScopeContext context) {
return context.getNode(JptJpaCorePlugin.LEGACY_PLUGIN_ID);
}
/**
* Return the Dali preferences for the current workspace instance.
*/
public static IEclipsePreferences getWorkspacePreferences() {
return getPreferences(InstanceScope.INSTANCE);
}
/**
* Return the default Dali preferences
* @see JpaPreferenceInitializer
*/
public static IEclipsePreferences getDefaultPreferences() {
return getPreferences(DefaultScope.INSTANCE);
}
public static void initializeDefaultPreferences() {
IEclipsePreferences node = getDefaultPreferences();
// default JPA platforms
JpaPlatformDescription defaultPlatform_1_0 =
JpaPlatformManagerImpl.instance().getDefaultJpaPlatform(JpaFacet.VERSION_1_0);
if (defaultPlatform_1_0 == null) {
defaultPlatform_1_0 = GenericPlatform.VERSION_1_0;
}
node.put(DEFAULT_JPA_PLATFORM_1_0_PREF_KEY, defaultPlatform_1_0.getId());
JpaPlatformDescription defaultPlatform_2_0 =
JpaPlatformManagerImpl.instance().getDefaultJpaPlatform(JpaFacet.VERSION_2_0);
if (defaultPlatform_2_0 == null) {
defaultPlatform_2_0 = GenericPlatform.VERSION_2_0;
}
node.put(DEFAULT_JPA_PLATFORM_2_0_PREF_KEY, defaultPlatform_2_0.getId());
}
// ********** workspace preference **********
protected static String getWorkspacePreference(String key, String defaultValue) {
String value = getWorkspacePreferences().get(key, defaultValue);
return (StringTools.stringIsEmpty(value)) ? defaultValue : value;
}
protected static String getWorkspacePreference(String key) {
return getWorkspacePreferences().get(key, null);
}
public static void setWorkspacePreference(String key, String value) {
IEclipsePreferences wkspPrefs = getWorkspacePreferences();
if(value == null) {
wkspPrefs.remove(key);
}
else {
wkspPrefs.put(key, value);
}
flush(wkspPrefs);
}
protected static boolean getWorkspacePreference(String key, boolean defaultBooleanValue) {
return getWorkspacePreferences().getBoolean(key, defaultBooleanValue);
}
public static void setWorkspacePreference(String key, boolean booleanValue) {
IEclipsePreferences wkspPrefs = getWorkspacePreferences();
wkspPrefs.putBoolean(key, booleanValue);
flush(wkspPrefs);
}
public static void removeWorkspacePreference(String key) {
IEclipsePreferences wkspPrefs = getWorkspacePreferences();
wkspPrefs.remove(key);
flush(wkspPrefs);
}
// ********** private static methods **********
/**
* This method is called (via reflection) when the test plug-in is loaded.
* The preferences end up getting flushed after the test case has deleted
* its project, resulting in resource exceptions in the log, e.g.
* <pre>
* Resource '/JpaProjectManagerTests' is not open.
* </pre>
* See <code>JptJpaCoreTestsPlugin.start(BundleContext)</code>
*/
@SuppressWarnings("unused")
private static void doNotFlushPreferences() {
flushPreferences = false;
}
/**
* Flush preferences in an asynchronous Job because the flush request will
* trigger a lock on the project, which can cause us some deadlocks (e.g.
* when deleting the metamodel source folder).
* Note: the flush will also remove the prefs node if it is empty
*/
private static void flush(IEclipsePreferences prefs) {
if (flushPreferences) {
new PreferencesFlushJob(prefs).schedule();
}
}
private static class PreferencesFlushJob extends Job {
private final IEclipsePreferences prefs;
PreferencesFlushJob(IEclipsePreferences prefs) {
super(NLS.bind(JptCoreMessages.PREFERENCES_FLUSH_JOB_NAME, prefs.absolutePath()));
this.prefs = prefs;
}
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
this.prefs.flush();
}
catch(BackingStoreException ex) {
JptJpaCorePlugin.log(ex);
}
return Status.OK_STATUS;
}
}
// ********** implementation **************************************************
public JpaPreferencesManager(IProject project) {
if(project == null) {
throw new RuntimeException("Project is null"); //$NON-NLS-1$
}
this.project = project;
}
// ********** query **********
protected String getPreference(String key) {
String preferenceValue = this.getProjectPreference(key);
// check workspace preferences if not a project preference
if(preferenceValue == null) {
preferenceValue = getWorkspacePreference(key);
}
return preferenceValue;
}
protected String getPreference(String key, String defaultValue) {
String preferenceValue = this.getPreference(key);
if(StringTools.stringIsEmpty(preferenceValue)) {
return defaultValue;
}
return preferenceValue;
}
// ********** preferences **********
/**
* Return the Dali preferences for the specified Eclipse project.
*/
protected IEclipsePreferences getProjectPreferences() {
return getPreferences(new ProjectScope(this.project));
}
/**
* Clears the project of JPA-specific preferences
*/
public void clearProjectPreferences() {
this.clearProjectPreferences(
JPA_PLATFORM_PREF_KEY,
DISCOVER_ANNOTATED_CLASSES,
METAMODEL_SOURCE_FOLDER_NAME,
LEGACY_DISCOVER_ANNOTATED_CLASSES,
LEGACY_METAMODEL_SOURCE_FOLDER_NAME);
}
/**
* Clears the specified preferences
*/
public void clearProjectPreferences(String ... preferenceKeys) {
IEclipsePreferences projectPrefs = this.getProjectPreferences();
for(String preferenceKey : preferenceKeys) {
projectPrefs.remove(preferenceKey);
}
flush(projectPrefs);
}
// ********** project preference **********
protected String getProjectPreference(String key, String defaultValue) {
String value = this.getProjectPreferences().get(key, defaultValue);
return (StringTools.stringIsEmpty(value)) ? defaultValue : value;
}
protected String getProjectPreference(String key) {
return this.getProjectPreferences().get(key, null);
}
protected void setProjectPreference(String key, String value) {
IEclipsePreferences projectPrefs = this.getProjectPreferences();
if(value == null) {
projectPrefs.remove(key);
}
else {
projectPrefs.put(key, value);
}
flush(projectPrefs);
}
protected boolean getProjectPreference(String key, boolean defaultBooleanValue) {
return this.getProjectPreferences().getBoolean(key, defaultBooleanValue);
}
protected void setProjectPreference(String key, boolean booleanValue) {
IEclipsePreferences projectPrefs = this.getProjectPreferences();
projectPrefs.putBoolean(key, booleanValue);
flush(projectPrefs);
}
protected void removeProjectPreference(String key) {
IEclipsePreferences projectPrefs = this.getProjectPreferences();
projectPrefs.remove(key);
flush(projectPrefs);
}
// ********** getters/setters *********
/**
* Return the JPA platform ID associated with the specified Eclipse project.
*/
public String getJpaPlatformId() {
return this.getProjectPreference(JPA_PLATFORM_PREF_KEY, GenericPlatform.VERSION_1_0.getId());
}
/**
* Set the JPA platform ID associated with the specified Eclipse project.
*/
public void setJpaPlatformId(String jpaPlatformId) {
this.setProjectPreference(JPA_PLATFORM_PREF_KEY, jpaPlatformId);
}
/**
* Return the JPA "discover" flag associated with the specified
* Eclipse project.
*/
public boolean getDiscoverAnnotatedClasses() {
if (this.getProjectPreference(DISCOVER_ANNOTATED_CLASSES, null) != null) {
return this.getProjectPreference(DISCOVER_ANNOTATED_CLASSES, false);
}
//bug 354780 - made the mistake of changing the project metadata in the 3.0 release
return this.getProjectPreference(LEGACY_DISCOVER_ANNOTATED_CLASSES, false);
}
/**
* Set the JPA "discover" flag associated with the specified
* Eclipse project.
*/
public void setDiscoverAnnotatedClasses(boolean discoverAnnotatedClasses) {
this.setProjectPreference(DISCOVER_ANNOTATED_CLASSES, discoverAnnotatedClasses);
}
/**
* Return the name of the metamodel source folder associated with the
* specified Eclipse project.
*/
public String getMetamodelSourceFolderName() {
String metamodelSourceFolderName = this.getProjectPreference(METAMODEL_SOURCE_FOLDER_NAME, null);
if (metamodelSourceFolderName != null) {
return metamodelSourceFolderName;
}
//bug 354780 - made the mistake of changing the project metadata in the 3.0 release
return this.getProjectPreference(LEGACY_METAMODEL_SOURCE_FOLDER_NAME, null);
}
/**
* Set the name of the metamodel source folder associated with the
* specified Eclipse project.
*/
public void setMetamodelSourceFolderName(String metamodelSourceFolderName) {
this.setProjectPreference(METAMODEL_SOURCE_FOLDER_NAME, metamodelSourceFolderName);
//bug 354780 - made the mistake of changing the project metadata in the 3.0 release.
//make sure legacy setting is removed when turning off metamodel gen, if we don't then
//there will be no way to turn off meatamodel gen without sacrificing backwards compatibility
if(metamodelSourceFolderName == null) {
this.setProjectPreference(LEGACY_METAMODEL_SOURCE_FOLDER_NAME, null);
}
}
// ********** protected methods **********
protected IProject getProject() {
return this.project;
}
}