Skip to content

Commit

Permalink
Protect the diagrams from a change in server version
Browse files Browse the repository at this point in the history
* Should the server version be changed, diagrams that are open or already
  have been opened will have elements that have been cached. Such caches
  cause exceptions since they contains models comprising of runtime specific
  language objects, which are not common between runtime clients. Thus,
  can cause class cast exceptions in the query service

* ModelerCore
 * Ensure editors are closed upon a change of server version

* DiagramEntityManager
 * Clear the diagram cache on change of version

* SqlMappingRootCache
 * Clear the mapping caches on change of version

* DqpPlugin
* PreviewModelObjectLabelProvider
 * Initialise the default server version as early as possible to avoid an
   unnecessary server version change
  • Loading branch information
Paul Richardson committed Feb 4, 2013
1 parent d275bda commit 131447e
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 2 deletions.
1 change: 1 addition & 0 deletions plugins/org.teiid.designer.core/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.8.0,4.0.0)",
org.teiid.designer.metamodels.core;bundle-version="[8.0.0,9.0.0)",
org.eclipse.xsd;bundle-version="[2.8.0,3.0.0)",
org.eclipse.emf.mapping;bundle-version="[2.7.0,3.0.0)",
org.eclipse.ui;bundle-version="3.103.0",
org.teiid.core.designer;bundle-version="[8.0.0,9.0.0)",
org.jdom;bundle-version="[1.1.1,2.0.0)",
org.teiid.designer.legacy;bundle-version="[8.0.0,9.0.0)",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.XMLMapImpl;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.xsd.XSDPlugin;
import org.eclipse.xsd.impl.XSDSchemaImpl;
import org.eclipse.xsd.util.XSDConstants;
Expand Down Expand Up @@ -2130,8 +2133,20 @@ public static void removeTeiidServerVersionListener(ITeiidServerVersionListener
* @param defaultServer
*/
public static void setDefaultServer(ITeiidServer defaultServer) {
if (defaultServer == null)
return;

if (defaultTeiidServer != null && defaultTeiidServer.equals(defaultServer))
return;

defaultTeiidServer = defaultServer;

for (IWorkbenchWindow window : PlatformUI.getWorkbench().getWorkbenchWindows()) {
for (IWorkbenchPage page : window.getPages()) {
page.closeAllEditors(true);
}
}

if (teiidServerVersionListeners == null)
return;

Expand Down
3 changes: 2 additions & 1 deletion plugins/org.teiid.designer.diagram.ui/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.8.0,4.0.0)",
org.teiid.designer.jdbc;bundle-version="[8.0.0,9.0.0)",
org.teiid.designer.metamodels.relational;bundle-version="[8.0.0,9.0.0)",
org.teiid.core.designer;bundle-version="[8.0.0,9.0.0)",
org.teiid.designer.metamodels.core;bundle-version="[8.0.0,9.0.0)"
org.teiid.designer.metamodels.core;bundle-version="[8.0.0,9.0.0)",
org.teiid.designer.spi;bundle-version="[8.0.0,9.0.0)"
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
import org.teiid.designer.diagram.ui.DiagramUiConstants;
import org.teiid.designer.metamodels.diagram.AbstractDiagramEntity;
import org.teiid.designer.metamodels.diagram.Diagram;
import org.teiid.designer.runtime.spi.ITeiidServerVersionListener;
import org.teiid.designer.runtime.version.spi.ITeiidServerVersion;
import org.teiid.designer.ui.UiPlugin;
import org.teiid.designer.ui.event.ModelResourceEvent;
import org.teiid.designer.ui.viewsupport.ModelObjectUtilities;
Expand All @@ -42,6 +44,7 @@ public class DiagramEntityManager {
private static final String MMUUID = "mmuuid"; //$NON-NLS-1$
private static boolean clearingStaleDiagrams = false;
private static EventObjectListener eventObjectListener;
private static ITeiidServerVersionListener teiidServerVersionListener;
private static boolean debugPrint = false;

static {
Expand All @@ -58,6 +61,18 @@ public void processEvent(EventObject event) {
DiagramUiConstants.Util.log(IStatus.ERROR, e, e.getMessage());
}

teiidServerVersionListener = new ITeiidServerVersionListener() {

@Override
public void versionChanged(ITeiidServerVersion version) {
// Clear the diagram cache since the diagrams are invalid given the server version
if (diagramMap != null)
diagramMap.clear();
}
};

ModelerCore.addTeiidServerVersionListener(teiidServerVersionListener);

}

public static void addDiagram(Diagram diagram) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ILightweightLabelDecorator;
import org.teiid.designer.runtime.DqpPlugin;
import org.teiid.designer.ui.UiPlugin;
import org.teiid.designer.ui.viewsupport.ModelObjectUtilities;

Expand Down Expand Up @@ -79,6 +80,10 @@ public void removeListener( ILabelProviderListener arg0 ) {
public void decorate( Object eObject,
IDecoration decoration ) {

// Ensure the server manager has been initialised, which ensures the teiid
// server version has been correctly set.
DqpPlugin.getInstance().getServerManager();

boolean isPreviewable = ModelObjectUtilities.isExecutable((EObject)eObject);
if (isPreviewable) {
decoration.addOverlay(UiPlugin.getDefault().getPreviewableDecoratorImage(), IDecoration.BOTTOM_RIGHT);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@

import java.io.IOException;
import java.util.ResourceBundle;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
Expand All @@ -19,6 +18,9 @@
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWindowListener;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.server.core.IServer;
import org.osgi.framework.BundleContext;
Expand Down Expand Up @@ -293,6 +295,41 @@ public void notifyAdd(ModelWorkspaceNotification notification) {
// Initialize teiid parent server state listener
getServersProvider().addServerStateListener(TeiidParentServerListener.getInstance());
getServersProvider().addServerLifecycleListener(TeiidParentServerListener.getInstance());

/*
* Window listener that will initialise the server manager if it has not already been.
* This means it is not up to the TeiidServerProvider, which may never be called if
* the Servers view is not displayed. The most important point of this is to ensure
* that the default server has been set in ModelerCore in order to ensure the correct
* runtime client is used.
*/
PlatformUI.getWorkbench().addWindowListener(new IWindowListener() {
@Override
public void windowActivated(IWorkbenchWindow window) {
if (serverMgr != null)
return;

Display display = PlatformUI.getWorkbench().getDisplay();
display.asyncExec(new Runnable() {
@Override
public void run() {
getServerManager();
}
});
}

@Override
public void windowOpened(IWorkbenchWindow window) {
}

@Override
public void windowDeactivated(IWorkbenchWindow window) {
}

@Override
public void windowClosed(IWorkbenchWindow window) {
}
});
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
import org.teiid.designer.metamodels.transformation.SqlTransformationMappingRoot;
import org.teiid.designer.query.sql.ISQLConstants;
import org.teiid.designer.query.sql.lang.ICommand;
import org.teiid.designer.runtime.spi.ITeiidServerVersionListener;
import org.teiid.designer.runtime.version.spi.ITeiidServerVersion;
import org.teiid.designer.transformation.TransformationPlugin;
import org.teiid.designer.transformation.validation.SqlTransformationResult;
import org.teiid.designer.transformation.validation.TransformationValidator;
Expand All @@ -53,6 +55,27 @@ public class SqlMappingRootCache implements ISQLConstants {

private static final SqlMappingRootCache INSTANCE = new SqlMappingRootCache();

private static ITeiidServerVersionListener teiidServerVersionListener;

static {
teiidServerVersionListener = new ITeiidServerVersionListener() {

@Override
public void versionChanged(ITeiidServerVersion version) {
/*
* Invalidate the cache since the models are no longer valid due to the change
* of server version. The models contain LanguageObjects which are not common
* between runtime clients.
*/
invalidateCache();
}
};

ModelerCore.addTeiidServerVersionListener(teiidServerVersionListener);
}



/**
* Get the SqlMappingRootCache instance for this VM.
* @return the singleton instance for this VM; never null
Expand Down

0 comments on commit 131447e

Please sign in to comment.