Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.jst.jee/common/org/eclipse/jst/jee/model/internal/common/AbstractMergedModelProvider.java')
-rw-r--r--plugins/org.eclipse.jst.jee/common/org/eclipse/jst/jee/model/internal/common/AbstractMergedModelProvider.java376
1 files changed, 0 insertions, 376 deletions
diff --git a/plugins/org.eclipse.jst.jee/common/org/eclipse/jst/jee/model/internal/common/AbstractMergedModelProvider.java b/plugins/org.eclipse.jst.jee/common/org/eclipse/jst/jee/model/internal/common/AbstractMergedModelProvider.java
deleted file mode 100644
index c3328ec47..000000000
--- a/plugins/org.eclipse.jst.jee/common/org/eclipse/jst/jee/model/internal/common/AbstractMergedModelProvider.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/***********************************************************************
- * Copyright (c) 2008 by SAP AG, Walldorf.
- * 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:
- * SAP AG - initial API and implementation
- ***********************************************************************/
-package org.eclipse.jst.jee.model.internal.common;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
-import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.j2ee.model.IModelProviderEvent;
-import org.eclipse.jst.j2ee.model.IModelProviderListener;
-import org.eclipse.jst.jee.JEEPlugin;
-import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
-
-/**
- * A base class for model providers providing a merged view between two
- * different model providers. The instance will be called "mergedModelProvider"
- * where the two composed providers will be called "internalProviders"
- *
- * This class introduces the notation of a disposed state. {@link #dispose()} is
- * used to dispose the model provider. {@link #isDisposed()} is used to get the
- * state of the provider. If the method {@link #getModelObject()} is called for
- * a model provider in a disposed state, the provider should try to move to a
- * non disposed state and return a correct model object.
- * {@link #getModelObject()} is loading the model. Specific implementations may
- * throw exceptions so calling {@link #getModelObject()} on a disposed provider
- * does not guarantee that calling {@link #isDisposed()} after that will return
- * <code>false</code>.
- *
- * <p>
- * Subclasses may enable/disable notifications from internalProviders with the
- * methods {@link #enableInternalNotifications()} and
- * {@link #disableInternalNotifications()}.
- * </p>
- *
- * <p>
- * internalProviders are loaded with {@link #loadDeploymentDescriptorModel()}
- * and {@link #loadAnnotationModel(Object)}. This methods should be overridden to
- * provide specific model providers. Loading the model providers is wrapped in a
- * workspace runnable to assure proper access to the workspace.
- * </p>
- *
- * <p>
- * The mergedModelProvider is a listener to the internalProviders. After
- * disposing the instance of a mergedModelProvider it should no longer accept
- * notifications from the internalProviders. It should also properly "dispose"
- * the internalProviders if needed.
- * </p>
- *
- * @author Kiril Mitov k.mitov@sap.com
- *
- */
-public abstract class AbstractMergedModelProvider<T> implements IModelProvider {
-
- protected IModelProvider ddProvider;
-
- protected IModelProvider annotationModelProvider;
-
- private class AnnotationModelListener implements IModelProviderListener {
- public void modelsChanged(IModelProviderEvent event) {
- if (disposeIfNeeded(event))
- return;
- AbstractMergedModelProvider.this.annotationModelChanged(event);
- }
- }
-
- private class XmlModelListener implements IModelProviderListener {
- public void modelsChanged(IModelProviderEvent event) {
- if (disposeIfNeeded(event))
- return;
- AbstractMergedModelProvider.this.xmlModelChanged(event);
- if (ddProvider != null){
- cache_last_change = getLastModificationTimeOfDDFile();
- }
- }
- }
-
- /**
- * @param event
- * @return true if the model provider is disposed.
- */
- private boolean disposeIfNeeded(IModelProviderEvent event) {
- if (isDisposed() || mergedModel == null)
- return true;
- if (shouldDispose(event)) {
- dispose();
- notifyListeners(event);
- return true;
- }
- return false;
- }
-
- private Collection<IModelProviderListener> listeners;
-
- protected IProject project;
-
- private AnnotationModelListener annotationModelListener;
- private XmlModelListener xmlModelListener;
-
- protected T mergedModel;
-
- protected long cache_last_change;
-
- public AbstractMergedModelProvider(IProject project) {
- this.project = project;
- }
-
- public void addListener(IModelProviderListener listener) {
- getListeners().add(listener);
- }
-
- /**
- * Returns the model merged from annotation and xml model. If the project is
- * closed or does not exist the returns <code>null</code>
- *
- * @see org.eclipse.jst.j2ee.model.IModelProvider#getModelObject()
- */
- public Object getModelObject() {
- return getMergedModel();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.jst.j2ee.model.IModelProvider#modify(java.lang.Runnable,
- * org.eclipse.core.runtime.IPath)
- */
- public void modify(Runnable runnable, IPath modelPath) {
- }
-
- public void removeListener(IModelProviderListener listener) {
- getListeners().remove(listener);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.jst.j2ee.model.IModelProvider#validateEdit(org.eclipse.core
- * .runtime.IPath, java.lang.Object)
- */
- public IStatus validateEdit(IPath modelPath, Object context) {
- if (ddProvider == null)
- getModelObject();
- return ddProvider.validateEdit(modelPath, context);
- }
-
- /**
- * Called when the annotationModel has changed. See also
- * {@link #enableInternalNotifications()} and
- * {@link #disableInternalNotifications()}
- *
- * @param event
- */
- protected abstract void annotationModelChanged(IModelProviderEvent event);
-
- /**
- * Called when the xmlModel has changed. See also
- * {@link #enableInternalNotifications()} and
- * {@link #disableInternalNotifications()}
- *
- * @param event
- */
- protected abstract void xmlModelChanged(IModelProviderEvent event);
-
- /**
- * Return a merged view of the two passed models.
- *
- * @param ddModel
- * @param annotationsModel
- * @return
- */
- protected abstract T merge(T ddModel, T annotationsModel);
-
- /**
- * Load the annotation model in the context of the ddModel.
- *
- * @param ddModel
- * @return
- * @throws CoreException
- */
- protected abstract IModelProvider loadAnnotationModel(T ddModel) throws CoreException;
-
- /**
- * @return
- * @throws CoreException
- */
- protected abstract IModelProvider loadDeploymentDescriptorModel() throws CoreException;
-
- public Collection<IModelProviderListener> getListeners() {
- if (listeners == null)
- listeners = new ArrayList<IModelProviderListener>();
- return listeners;
- }
-
- protected T getMergedModel() {
- try {
- if (mergedModel == null || hasToReloadModel()){
- mergedModel = loadModel();
- }
- } catch (CoreException e) {
- JEEPlugin.getDefault().getLog().log(e.getStatus());
- return null;
- }
- return mergedModel;
- }
-
- private boolean hasToReloadModel() {
- long lastModificationTimeOfDDFile = getLastModificationTimeOfDDFile();
- return lastModificationTimeOfDDFile == -1 ? false : lastModificationTimeOfDDFile != cache_last_change;
-// return false;
- }
-
- private long getLastModificationTimeOfDDFile() {
- if (ddProvider == null || ((EObject)ddProvider.getModelObject()).eResource() == null){
- return -1;
- }
- return WorkbenchResourceHelper.getFile(((EObject)ddProvider.getModelObject()).eResource()).getLocalTimeStamp();
- }
-
- /**
- * @return a merged view of the models from the internalProviders. This may
- * include loading the internalProviders.
- * @throws CoreException
- */
- protected T loadModel() throws CoreException {
- if (!project.isAccessible())
- throw new IllegalStateException("The project <" + project + "> is not accessible."); //$NON-NLS-1$//$NON-NLS-2$
- project.getWorkspace().run(new LoadModelsWorkspaceRunnable(), project, IWorkspace.AVOID_UPDATE,
- new NullProgressMonitor());
- return mergedModel;
- }
-
- @SuppressWarnings("unchecked")
- private void loadProviders() throws CoreException {
- if (ddProvider == null || hasToReloadModel()) {
- if (hasToReloadModel())
- ((EObject)ddProvider.getModelObject()).eResource().unload();
- ddProvider = loadDeploymentDescriptorModel();
- }
- if (ddProvider == null || ddProvider.getModelObject() == null)
- return;
- if (annotationModelProvider == null)
- annotationModelProvider = loadAnnotationModel((T) ddProvider.getModelObject());
- if (annotationModelProvider == null || annotationModelProvider.getModelObject() == null)
- return;
- T ddModel = (T) ddProvider.getModelObject();
- T annotationModel = (T) annotationModelProvider.getModelObject();
- mergedModel = createNewModelInstance();
- initMergedModelResource((EObject) ddModel);
-
- enableInternalNotifications();
- merge(ddModel, annotationModel);
- }
-
- private class LoadModelsWorkspaceRunnable implements IWorkspaceRunnable {
- public void run(IProgressMonitor monitor) throws CoreException {
- loadProviders();
- }
- }
-
- /**
- * Creates a new instance of the model that will be used for mergedModel
- *
- * @return
- */
- protected abstract T createNewModelInstance();
-
- protected void initMergedModelResource(EObject ddModel) {
- Resource resourceDD = ddModel.eResource();
- if (ddProvider != null){
- cache_last_change = getLastModificationTimeOfDDFile();
- }
-
- Resource resourceMM = ((EObject) mergedModel).eResource();
- if (resourceDD != null && resourceMM == null) {
- ResourceImpl resRes = new ResourceImpl(resourceDD.getURI());
- resRes.getContents().add((EObject) mergedModel);
- }
-
- }
-
- /**
- * The method is used for enabling notifications from the internalProviders.
- * This will add the appropriate listener to the internalProviders so that
- * {@link #annotationModelChanged(IModelProviderEvent)} and
- * {@link #xmlModelChanged(IModelProviderEvent)} are called when needed.
- */
- protected final void enableInternalNotifications() {
- xmlModelListener = new XmlModelListener();
- ddProvider.addListener(xmlModelListener);
- annotationModelListener = new AnnotationModelListener();
- annotationModelProvider.addListener(annotationModelListener);
- }
-
- /**
- * Disable notifications from internalProviders. See also
- * {@link #enableInternalNotifications()}
- */
- protected final void disableInternalNotifications() {
- ddProvider.removeListener(xmlModelListener);
- annotationModelProvider.removeListener(annotationModelListener);
- }
-
- protected void notifyListeners(final IModelProviderEvent event) {
- event.setModel(this);
- event.setProject(project);
- final Collection<IModelProviderListener> listeners = getListeners();
- IModelProviderListener[] backup = listeners.toArray(new IModelProviderListener[listeners.size()]);
- for (final IModelProviderListener listener : backup) {
- SafeRunner.run(new ISafeRunnable() {
- public void handleException(Throwable exception) {
- }
-
- public void run() throws Exception {
- listener.modelsChanged(event);
- }
- });
- }
- backup = null;
- }
-
- protected boolean shouldDispose(IModelProviderEvent event) {
- return (event.getEventCode() == IModelProviderEvent.UNLOADED_RESOURCE);
- }
-
- /**
- * Returns the dispose state of this model provider. When the provider is
- * disposed it can not be used until getModelObject is called again.
- *
- * Subclasses may override this method.
- *
- * @return true if the model provider is to be treated as disposed
- */
- public boolean isDisposed() {
- return (ddProvider == null && annotationModelProvider == null);
- }
-
- /**
- * Dispose the model provider. If the provider is already disposed the
- * method has no effect.
- *
- * Subclasses may override this method.
- *
- * @see #isDisposed()
- */
- public void dispose() {
- if (isDisposed())
- return;
- disableInternalNotifications();
- ddProvider = null;
- annotationModelProvider = null;
- mergedModel = null;
- }
-
-}

Back to the top