blob: 747806a835255d55b0e17f1f258dc4c9308228a9 [file] [log] [blame]
/*
* Copyright (c) 2006, 2010 Borland Software Corporation and others
*
* 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:
* bblajer - initial API and implementation
*/
package org.eclipse.gmf.tests.gef;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collections;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.codegen.ecore.genmodel.GenClass;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.ContentHandler;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gmf.codegen.gmfgen.GenDiagram;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.tests.Utils;
import org.eclipse.gmf.tests.rt.AbstractCanvasTest;
import org.eclipse.gmf.tests.setup.GeneratedDiagramPlugin;
import org.eclipse.gmf.tests.setup.ViewerConfiguration;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.FileEditorInput;
/**
* Abstract test that operates with open diagram editors instead of fake no-update viewers.
* Note, distinct subclasses for Full and Lite runtimes are required since
* {@link #createViewerConfiguration(EditPartViewer, GeneratedDiagramPlugin)} and
* {@link #createDiagramView(EObject, GeneratedDiagramPlugin)} need different implementation.
*/
public abstract class AbstractDiagramEditorTest extends AbstractCanvasTest {
private IProject myProject;
private IEditorPart myEditor;
private IFile myDiagramFile;
private Boolean mySameModelAndDiagramFile = null;
private final ViewerConfiguration.Factory myViewerConfigFactory;
public AbstractDiagramEditorTest(String name, ViewerConfiguration.Factory viewerConfigFactory) {
super(name);
assert viewerConfigFactory != null;
myViewerConfigFactory = viewerConfigFactory;
}
@Override
protected void setUp() throws Exception {
super.setUp();
myProject = createProject();
mySameModelAndDiagramFile = null; // use default value (i.e. from gmfgen)
}
protected IProject getProject() {
return myProject;
}
protected IEditorPart getEditor() {
if (myEditor == null) {
myEditor = openEditor(getDiagramFile());
assertNotNull(myEditor);
assertFalse("Fail fast if not diagram editor is associated with diagram file", "org.eclipse.ui.DefaultTextEditor".equals(myEditor.getEditorSite().getId()));
}
return myEditor;
}
private IFile getDiagramFile() {
if (myDiagramFile == null) {
myDiagramFile = createDiagramFile();
}
return myDiagramFile;
}
@Override
protected ViewerConfiguration createViewerConfiguration() {
IEditorPart editorPart = getEditor();
GraphicalViewer viewer = (GraphicalViewer) editorPart.getAdapter(GraphicalViewer.class);
return getViewerConfigurationFactory().createViewerConfiguration(viewer, getSetup());
}
protected final ViewerConfiguration.Factory getViewerConfigurationFactory() {
return myViewerConfigFactory;
}
@Override
protected void tearDown() throws Exception {
if (myEditor != null) {
closeEditor(myEditor);
}
// keep project alive for potential workspace investigations
// deleteProject();
myProject = null;
myDiagramFile = null;
super.tearDown();
}
protected static void closeEditor(IEditorPart editor) {
editor.doSave(new NullProgressMonitor());
Utils.assertDispatchDisplayMessages(3);
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().closeEditor(editor, true);
}
protected IProject createProject() {
String projectName = getUniqueString();
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
assertFalse("Project with this name already present in the workspace: " + projectName, project.exists());
try {
project.create(new NullProgressMonitor());
project.open(new NullProgressMonitor());
} catch (CoreException e) {
fail(e.getMessage());
}
assertTrue("Project was not created: " + projectName, project.exists());
return project;
}
protected void deleteProject() throws CoreException {
if (myProject != null) {
if (getProject().isOpen()) {
getProject().close(new NullProgressMonitor());
}
if (getProject().exists()) {
getProject().delete(true, new NullProgressMonitor());
}
}
}
/**
* Unless invoked, default value from gmfgen model will be used.
* Note, should be called prior to any #getEditor() or #getDiagram() call
*/
protected final void useSameFileForDiagramAndModel(boolean sameFile) {
assertNull("Can't use this method after diagram file has been created", myDiagramFile);
mySameModelAndDiagramFile = Boolean.valueOf(sameFile);
}
private IFile createDiagramFile() {
boolean sameFileForDiagramAndModel;
if (mySameModelAndDiagramFile != null) {
sameFileForDiagramAndModel = mySameModelAndDiagramFile.booleanValue();
} else {
sameFileForDiagramAndModel = getSetup().getGenDiagram().getEditorGen().isSameFileForDiagramAndModel();
}
// use test name for diagram file name since there should be no more than one diagram file per test
// and it's easier to analyze test contents with meaningful names
EObject domainElement = createDiagramDomainObject(getSetup());
Diagram diagramView = createDiagramView(domainElement, getSetup());
assertNotNull("Diagram was not created", diagramView);
assertSame(domainElement, diagramView.getElement());
return createDiagramFile(getProject(), getName(), getSetup().getGenDiagram(), domainElement, diagramView, sameFileForDiagramAndModel);
}
// XXX full and lite runtimes now need different initialization steps (unless we have common createDiagram code in e.g. DiagramEditorUtil
protected abstract Diagram createDiagramView(EObject domainElement, GeneratedDiagramPlugin genPlugin);
private static IFile createDiagramFile(IProject where, String fileNameStem, GenDiagram genDiagram, EObject domainElement, Diagram diagramView, boolean storeModelInDiagramFile) {
final String diagramFileName = fileNameStem + "." + genDiagram.getEditorGen().getDiagramFileExtension();
IFile diagramFile = where.getFile(diagramFileName);
assertFalse("Diagram file was already created", diagramFile.exists());
IFile modelFile = null;
if (!storeModelInDiagramFile) {
IPath diagramFilePath = diagramFile.getProjectRelativePath();
IPath modelFilePath = diagramFilePath.removeFileExtension().addFileExtension(genDiagram.getEditorGen().getDomainFileExtension());
modelFile = where.getFile(modelFilePath);
assertFalse("Model file was already created", modelFile.exists());
}
ResourceSet resourceSet = new ResourceSetImpl();
Resource diagramResource = resourceSet.createResource(URI.createPlatformResourceURI(diagramFile.getFullPath().toOSString(), true), ContentHandler.UNSPECIFIED_CONTENT_TYPE);
Resource modelResource = modelFile != null ? resourceSet.createResource(URI.createPlatformResourceURI(modelFile.getFullPath().toOSString(), true), ContentHandler.UNSPECIFIED_CONTENT_TYPE) : null;
if (modelResource != null) {
modelResource.getContents().add(domainElement);
} else {
diagramResource.getContents().add(domainElement);
}
assertSame("[sanity]", domainElement, diagramView.getElement());
diagramResource.getContents().add(diagramView);
diagramView.setName(fileNameStem);
try {
if (modelResource != null) {
modelResource.save(Collections.EMPTY_MAP);
}
diagramResource.save(Collections.EMPTY_MAP);
} catch (Exception e) {
fail(e.toString());
}
return diagramFile;
}
protected static EObject createDiagramDomainObject(GeneratedDiagramPlugin genPlugin) {
try {
GenClass diagramElementGenClass = genPlugin.getGenDiagram().getDomainDiagramElement();
GenPackage domainGenPackage = diagramElementGenClass.getGenPackage();
Class<?> factoryInterface = genPlugin.loadGeneratedClass(domainGenPackage.getQualifiedFactoryInterfaceName());
assertNotNull("Factory interface not found", factoryInterface);
Field accessor = null;
accessor = factoryInterface.getField(domainGenPackage.getFactoryInstanceName());
assertNotNull("Accessor field not found", accessor);
Object factory = null;
factory = accessor.get(null);
assertNotNull("Factory unavailable", factory);
Method createMethod = null;
createMethod = factory.getClass().getMethod("create" + diagramElementGenClass.getName(), new Class[0]);
assertNotNull("Create method unavailable", createMethod);
EObject domainDiagramElement = null;
domainDiagramElement = (EObject) createMethod.invoke(factory, new Object[0]);
assertNotNull("Domain diagram element was not created", domainDiagramElement);
return domainDiagramElement;
} catch (Exception ex) {
fail(ex.toString());
}
return null;
}
protected IEditorPart openEditor(IFile diagramFile) {
try {
IEditorDescriptor editorDesc = IDE.getEditorDescriptor(diagramFile, true);
IEditorPart result = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor(new FileEditorInput(diagramFile), editorDesc.getId(), true);
return result;
} catch (PartInitException e) {
fail(e.getMessage());
}
return null;
}
protected final String getUniqueString() {
return "AbstractDiagramEditorTest_" + String.valueOf(System.currentTimeMillis());
}
}