blob: bf52d991dccd053f426cc5f518a7fe5226cccdbd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2008 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.core;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.core.runtime.Status;
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.core.internal.JpaModelManager;
import org.eclipse.jpt.core.internal.platform.GenericJpaPlatform;
import org.eclipse.jpt.core.internal.platform.JpaPlatformRegistry;
import org.eclipse.jpt.core.internal.prefs.JpaPreferenceConstants;
import org.eclipse.jpt.core.internal.prefs.JpaPreferenceInitializer;
import org.eclipse.jst.j2ee.internal.J2EEConstants;
import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
import org.eclipse.wst.common.project.facet.core.FacetedProjectFramework;
import org.osgi.framework.BundleContext;
import org.osgi.service.prefs.BackingStoreException;
import org.osgi.service.prefs.Preferences;
/**
* The JPT plug-in lifecycle implementation.
* A number of globally-available constants and methods.
*
* Provisional API: This class is part of an interim API that is still
* under development and expected to change significantly before reaching
* stability. It is available at this early stage to solicit feedback from
* pioneering adopters on the understanding that any code that uses this API
* will almost certainly be broken (repeatedly) as the API evolves.
*/
// TODO keep preferences in synch with the JPA project
// (connection profile name, "discover" flag)
// use listeners?
public class JptCorePlugin extends Plugin {
// ********** public constants **********
/**
* The plug-in identifier of the persistence support
* (value <code>"org.eclipse.jpt.core"</code>).
*/
public static final String PLUGIN_ID = "org.eclipse.jpt.core"; //$NON-NLS-1$
/**
* The identifier for the JPA facet
* (value <code>"jpt.jpa"</code>).
*/
public static final String FACET_ID = "jpt.jpa"; //$NON-NLS-1$
/**
* The key for storing a JPA project's platform in the Eclipse
* project's preferences.
*/
public static final String JPA_PLATFORM = PLUGIN_ID + ".platform"; //$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 = PLUGIN_ID + ".discoverAnnotatedClasses"; //$NON-NLS-1$
/**
* The key for storing a JPA project's data source connection profile name
* in the Eclipse project's persistent properties.
*/
public static final QualifiedName DATA_SOURCE_CONNECTION_PROFILE_NAME =
new QualifiedName(PLUGIN_ID, "dataSource.connectionProfileName"); //$NON-NLS-1$
/**
* The key for storing a JPA project's user overridden default schema name
* in the Eclipse project's persistent properties.
*/
public static final QualifiedName USER_OVERRIDE_DEFAULT_SCHEMA_NAME =
new QualifiedName(PLUGIN_ID, "userOverrideDefaultSchemaName"); //$NON-NLS-1$
/**
* The identifier for the JPA validation marker
* (value <code>"org.eclipse.jpt.core.jpaProblemMarker"</code>).
*/
public static final String VALIDATION_MARKER_ID = PLUGIN_ID + ".jpaProblemMarker"; //$NON-NLS-1$
/**
* Value of the content-type for orm.xml mappings files. Use this value to retrieve
* the ORM xml content type from the content type manager and to add new
* orm.xml-like extensions to this content type.
*
* @see org.eclipse.core.runtime.content.IContentTypeManager#getContentType(String)
*/
public static final String ORM_XML_CONTENT_TYPE = PLUGIN_ID + ".content.orm"; //$NON-NLS-1$
/**
* Ditto for persistence.xml.
* @see #ORM_XML_CONTENT_TYPE
*/
public static final String PERSISTENCE_XML_CONTENT_TYPE = PLUGIN_ID + ".content.persistence"; //$NON-NLS-1$
/**
* Web projects have some special exceptions.
*/
public static final String WEB_PROJECT_FACET_ID = IModuleConstants.JST_WEB_MODULE;
/**
* Web projects have some special exceptions.
*/
public static final String WEB_PROJECT_DEPLOY_PREFIX = J2EEConstants.WEB_INF_CLASSES;
public static final String DEFAULT_PERSISTENCE_XML_FILE_PATH = "META-INF/persistence.xml";
public static final String DEFAULT_ORM_XML_FILE_PATH = "META-INF/orm.xml";
// ********** singleton **********
private static JptCorePlugin INSTANCE;
/**
* Return the singleton JPT plug-in.
*/
public static JptCorePlugin instance() {
return INSTANCE;
}
// ********** public static methods **********
/**
* Return the singular JPA model corresponding to the current workspace.
*/
public static JpaModel getJpaModel() {
return JpaModelManager.instance().getJpaModel();
}
/**
* Return the JPA project corresponding to the specified Eclipse project,
* or null if unable to associate the specified project with a
* JPA project.
*/
public static JpaProject getJpaProject(IProject project) {
try {
return JpaModelManager.instance().getJpaProject(project);
} catch (CoreException ex) {
log(ex);
return null;
}
}
/**
* Return the JPA file corresponding to the specified Eclipse file,
* or null if unable to associate the specified file with a JPA file.
*/
public static JpaFile getJpaFile(IFile file) {
try {
return JpaModelManager.instance().getJpaFile(file);
} catch (CoreException ex) {
log(ex);
return null;
}
}
/**
* Return whether the specified Eclipse project has a JPA facet.
*/
public static boolean projectHasJpaFacet(IProject project) {
return projectHasFacet(project, FACET_ID);
}
/**
* Return whether the specified Eclipse project has a JPA facet.
*/
public static boolean projectHasWebFacet(IProject project) {
return projectHasFacet(project, WEB_PROJECT_FACET_ID);
}
/**
* Checked exceptions bite.
*/
private static boolean projectHasFacet(IProject project, String facetId) {
try {
return FacetedProjectFramework.hasProjectFacet(project, facetId);
} catch (CoreException ex) {
log(ex); // problems reading the project metadata - assume facet doesn't exist - return 'false'
return false;
}
}
/**
* Return the persistence.xml (specified as "META-INF/persistence.xml")
* deployment URI for the specified project.
*/
public static String getPersistenceXmlDeploymentURI(IProject project) {
return getDeploymentURI(project, DEFAULT_PERSISTENCE_XML_FILE_PATH);
}
/**
* Return the default mapping file (specified as "META-INF/orm.xml")
* deployment URI for the specified project.
*/
public static String getDefaultOrmXmlDeploymentURI(IProject project) {
return getDeploymentURI(project, DEFAULT_ORM_XML_FILE_PATH);
}
/**
* Return the mapping file (specified as "META-INF/<mappingFileName>")
* deployment URI for the specified project.
*/
public static String getOrmXmlDeploymentURI(IProject project, String mappingFileName) {
return getDeploymentURI(project, mappingFileName);
}
/**
* Tweak the specified deployment URI if the specified project
* has a web facet.
*/
public static String getDeploymentURI(IProject project, String defaultURI) {
return projectHasWebFacet(project) ?
WEB_PROJECT_DEPLOY_PREFIX + "/" + defaultURI
:
defaultURI;
}
/**
* Return the default JPA preferences
* @see JpaPreferenceInitializer
*/
public static IEclipsePreferences getDefaultPreferences() {
IScopeContext context = new DefaultScope();
return context.getNode(PLUGIN_ID);
}
/**
* Return the JPA preferences for the current workspace instance.
*/
public static IEclipsePreferences getWorkspacePreferences() {
IScopeContext context = new InstanceScope();
return context.getNode(PLUGIN_ID);
}
/**
* Return the JPA preferences for the specified Eclipse project.
*/
public static IEclipsePreferences getProjectPreferences(IProject project) {
IScopeContext context = new ProjectScope(project);
return context.getNode(PLUGIN_ID);
}
/**
* Return the default JPA library for creating new JPA projects
*/
public static String getDefaultJpaLibrary() {
return Platform.getPreferencesService().get(
JpaPreferenceConstants.PREF_DEFAULT_JPA_LIB, null,
new Preferences[] {getWorkspacePreferences(), getDefaultPreferences()});
}
/**
* Return the default JPA platform ID for creating new JPA projects
*/
public static String getDefaultJpaPlatformId() {
String platformId =
Platform.getPreferencesService().get(
JpaPreferenceConstants.PREF_DEFAULT_JPA_PLATFORM, GenericJpaPlatform.ID,
new Preferences[] {getWorkspacePreferences(), getDefaultPreferences()});
if (! JpaPlatformRegistry.instance().containsPlatform(platformId)) {
platformId =
Platform.getPreferencesService().get(
JpaPreferenceConstants.PREF_DEFAULT_JPA_PLATFORM, GenericJpaPlatform.ID,
new Preferences[] {getDefaultPreferences()});
}
return platformId;
}
/**
* Set the default JPA platform ID for creating new JPA projects
*/
public static void setDefaultJpaPlatformId(String platformId) {
IEclipsePreferences prefs = getWorkspacePreferences();
prefs.put(JpaPreferenceConstants.PREF_DEFAULT_JPA_PLATFORM, platformId);
flush(prefs);
}
/**
* Return the JPA platform associated with the specified Eclipse project.
*/
public static JpaPlatform getJpaPlatform(IProject project) {
return JpaPlatformRegistry.instance().getJpaPlatform(getJpaPlatformId(project));
}
/**
* Return the JPA platform ID associated with the specified Eclipse project.
*/
public static String getJpaPlatformId(IProject project) {
return getProjectPreferences(project).get(JPA_PLATFORM, GenericJpaPlatform.ID);
}
/**
* Set the JPA platform ID associated with the specified Eclipse project.
*/
public static void setJpaPlatformId(IProject project, String jpaPlatformId) {
IEclipsePreferences prefs = getProjectPreferences(project);
prefs.put(JPA_PLATFORM, jpaPlatformId);
flush(prefs);
}
/**
* Return the JPA "discover" flag associated with the specified
* Eclipse project.
*/
public static boolean discoverAnnotatedClasses(IProject project) {
return getProjectPreferences(project).getBoolean(DISCOVER_ANNOTATED_CLASSES, false);
}
/**
* Set the JPA "discover" flag associated with the specified
* Eclipse project.
*/
public static void setDiscoverAnnotatedClasses(IProject project, boolean discoverAnnotatedClasses) {
IEclipsePreferences prefs = getProjectPreferences(project);
prefs.putBoolean(DISCOVER_ANNOTATED_CLASSES, discoverAnnotatedClasses);
flush(prefs);
}
/**
* checked exceptions bite
*/
private static void flush(IEclipsePreferences prefs) {
try {
prefs.flush();
} catch(BackingStoreException ex) {
log(ex);
}
}
/**
* Return the name of the connection profile associated with the specified
* Eclipse project.
*/
public static String getConnectionProfileName(IProject project) {
try {
return project.getPersistentProperty(DATA_SOURCE_CONNECTION_PROFILE_NAME);
} catch (CoreException ex) {
log(ex);
return null;
}
}
/**
* Set the name of the connection profile associated with the specified
* Eclipse project.
*/
public static void setConnectionProfileName(IProject project, String connectionProfileName) {
try {
project.setPersistentProperty(DATA_SOURCE_CONNECTION_PROFILE_NAME, connectionProfileName);
} catch (CoreException ex) {
log(ex);
}
}
/**
* Return the default schema name associated with the specified Eclipse project.
* @see JpaProject#getUserOverrideDefaultSchemaName()
*/
public static String getUserOverrideDefaultSchemaName(IProject project) {
try {
return project.getPersistentProperty(USER_OVERRIDE_DEFAULT_SCHEMA_NAME);
}
catch (CoreException ce) {
log(ce);
return null;
}
}
/**
* Set the default schema name associated with the specified Eclipse project.
* @see JpaProject#setUserOverrideDefaultSchemaName()
*/
public static void setUserOverrideDefaultSchemaName(IProject project, String defaultSchemaName) {
try {
project.setPersistentProperty(USER_OVERRIDE_DEFAULT_SCHEMA_NAME, defaultSchemaName);
}
catch (CoreException ce) {
log(ce);
}
}
/**
* Log the specified status.
*/
public static void log(IStatus status) {
INSTANCE.getLog().log(status);
}
/**
* Log the specified message.
*/
public static void log(String msg) {
log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK, msg, null));
}
/**
* Log the specified exception or error.
*/
public static void log(Throwable throwable) {
log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK, throwable.getLocalizedMessage(), throwable));
}
// ********** plug-in implementation **********
public JptCorePlugin() {
super();
if (INSTANCE != null) {
throw new IllegalStateException();
}
// this convention is *wack*... ~bjv
INSTANCE = this;
}
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
JpaModelManager.instance().start();
}
@Override
public void stop(BundleContext context) throws Exception {
try {
JpaModelManager.instance().stop();
} finally {
super.stop(context);
}
}
}