/* * Copyright (c) 2006, 2008 Borland Software Corporation * * 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: * Alexander Shatalin (Borland) - initial API and implementation */ package org.eclipse.gmf.tests.setup.figures; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import org.junit.Assert; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.gmf.gmfgraph.BasicFont; import org.eclipse.gmf.gmfgraph.ColorConstants; import org.eclipse.gmf.gmfgraph.ConstantColor; import org.eclipse.gmf.gmfgraph.Dimension; import org.eclipse.gmf.gmfgraph.FigureDescriptor; import org.eclipse.gmf.gmfgraph.FigureGallery; import org.eclipse.gmf.gmfgraph.FigureRef; import org.eclipse.gmf.gmfgraph.Font; import org.eclipse.gmf.gmfgraph.FontStyle; import org.eclipse.gmf.gmfgraph.GMFGraphFactory; import org.eclipse.gmf.gmfgraph.Point; import org.eclipse.gmf.gmfgraph.RGBColor; import org.eclipse.gmf.gmfgraph.RealFigure; import org.eclipse.gmf.graphdef.codegen.FigureGenerator; import org.eclipse.gmf.graphdef.codegen.MapModeCodeGenStrategy; import org.eclipse.gmf.graphdef.codegen.StandaloneGenerator; import org.eclipse.gmf.graphdef.codegen.StandaloneGenerator.Config; import org.eclipse.gmf.graphdef.codegen.StandaloneGenerator.Processor; import org.eclipse.gmf.graphdef.codegen.StandaloneGenerator.ProcessorCallback; import org.eclipse.gmf.internal.graphdef.codegen.GalleryProcessor; import org.eclipse.gmf.tests.CompileUtil; import org.eclipse.gmf.tests.Plugin; import org.eclipse.gmf.tests.setup.DiaDefSetup; import org.eclipse.gmf.tests.setup.RuntimeWorkspaceSetup; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTParser; import org.eclipse.jdt.core.dom.CompilationUnit; import org.osgi.framework.Bundle; public class FigureGeneratorUtil { public static final String DEFAULT_FIGURE_PACKAGE = "org.eclipse.gmf.tests.sample.figures"; public static final String DEFAULT_PLUGIN_ACTIVATOR = DEFAULT_FIGURE_PACKAGE + ".PluginActivator"; // FigureGenerator: utility methods to generate/compile/instantiate figures public static void generate(StandaloneGenerator.Config config, Processor processor) { StandaloneGenerator generator = new StandaloneGenerator(processor, config, null); generator.run(); Assert.assertTrue(generator.getRunStatus().toString(), generator.getRunStatus().getSeverity() < IStatus.ERROR); } public static GeneratedClassData[] generateAndCompile(FigureGallery gallery) { return generateAndCompile(gallery, createStandaloneGeneratorConfig()); } public static GeneratedClassData[] generateAndCompile(StandaloneGenerator.Config config, RealFigure... figures) { FigureGallery gallery = GMFGraphFactory.eINSTANCE.createFigureGallery(); gallery.setName("bb"); gallery.getFigures().addAll(Arrays.asList(figures)); return generateAndCompile(gallery, config); } public static GeneratedClassData[] generateAndCompile(final FigureGallery gallery, StandaloneGenerator.Config config) { Assert.assertTrue(gallery.getName() != null && gallery.getName().trim().length() > 0); Assert.assertFalse(gallery.getFigures().isEmpty() && gallery.getDescriptors().isEmpty()); final Map<FigureDescriptor, String> fqns = new HashMap<FigureDescriptor, String>(); generate(config, new GalleryProcessor(gallery) { @Override public void go(ProcessorCallback callback, Config config) throws InterruptedException { super.go(callback, config); for (RealFigure f : gallery.getFigures()) { FigureRef fr = GMFGraphFactory.eINSTANCE.createFigureRef(); fr.setFigure(f); FigureDescriptor fakeDesc = DiaDefSetup.newDescriptor(f.getName(), fr); String fqn = callback.visitFigure(fakeDesc); handle(fakeDesc, fqn); } } @Override protected void handle(FigureDescriptor next, String fqn) { fqns.put(next, fqn); } }); try { Bundle bundle = installPlugin(config.getPluginID()); ArrayList<GeneratedClassData> result = new ArrayList<GeneratedClassData>(); for (FigureDescriptor next : fqns.keySet()) { result.add(new GeneratedClassData(next, bundle.loadClass(fqns.get(next)))); } return result.toArray(new GeneratedClassData[result.size()]); } catch (Exception e){ Assert.fail(e.getClass().getSimpleName() + ":" + e.getMessage()); } Assert.fail("Should not be here!"); return null; } public static Bundle installPlugin(String pluginId) throws CoreException, Exception { IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(pluginId); IStatus compileStatus = new CompileUtil().build(project); Assert.assertTrue(compileStatus.getMessage(), compileStatus.getSeverity() < IStatus.ERROR); RuntimeWorkspaceSetup.get().getReadyToStartAsBundle(project); String url = project.getLocation().toFile().toURL().toExternalForm(); return Plugin.getBundleContext().installBundle(url); } public static void generateAndParse(RealFigure f) { generateAndParse(f, new FigureGenerator(null, DEFAULT_FIGURE_PACKAGE, false)); } public static void generateAndParse(FigureDescriptor f) { generateAndParse(f, new FigureGenerator(null, DEFAULT_FIGURE_PACKAGE, false)); } public static void generateAndParse(RealFigure f, FigureGenerator generator) { FigureDescriptor fd = GMFGraphFactory.eINSTANCE.createFigureDescriptor(); // XXX the only goal of FigureRef here is to keep original figure containment intact FigureRef fr = GMFGraphFactory.eINSTANCE.createFigureRef(); fr.setFigure(f); fd.setActualFigure(fr); fd.setName(f.getName()); generateAndParse(fd, generator); } public static void generateAndParse(FigureDescriptor fd, FigureGenerator generator) { String res = generator.go(fd); Assert.assertNotNull("Generation should produce code", res); ASTParser p = ASTParser.newParser(AST.JLS3); p.setSource(res.toCharArray()); ASTNode astNode = p.createAST(null); Assert.assertEquals("Generator is expected to produce cu", astNode.getNodeType(), ASTNode.COMPILATION_UNIT); CompilationUnit cu = (CompilationUnit) astNode; if (generator.getPackageName() != null) { Assert.assertNotNull("Generator initialized with packageName should produce package statement", cu.getPackage()); Assert.assertEquals("Package names are different", generator.getPackageName(), cu.getPackage().getName().getFullyQualifiedName()); } else { Assert.assertNull(cu.getPackage()); } IProblem[] problems = cu.getProblems(); for (int i = 0; i < problems.length; i++) { Assert.assertFalse(problems[i].getMessage() + ", line:" + problems[i].getSourceLineNumber() + ", pos:" + cu.getColumnNumber(problems[i].getSourceStart()), problems[i].isError()); } } public static Config createStandaloneGeneratorConfig() { return new StandaloneGenerator.ConfigImpl(createTestPluginName(), DEFAULT_FIGURE_PACKAGE); } public static Config createStandaloneGeneratorConfig(String packageName, boolean useMapMode) { return new StandaloneGenerator.ConfigImpl(createTestPluginName(), packageName, useMapMode ? MapModeCodeGenStrategy.DYNAMIC : MapModeCodeGenStrategy.STATIC, null); } private static String createTestPluginName() { return "org.eclipse.gmf.tests.sample.figures.t" + System.currentTimeMillis(); } public static class GeneratedClassData { private final FigureDescriptor myFigureDef; private final Class<?> myLoadedClass; public GeneratedClassData(FigureDescriptor figureDef, Class<?> loadedClass) { myFigureDef = figureDef; myLoadedClass = loadedClass; } public Class<?> getLoadedClass() { return myLoadedClass; } public FigureDescriptor getFigureDef() { return myFigureDef; } } // GMFGRAPH: utility methods reused across all the tests. public static ConstantColor createConstantColor(ColorConstants constant) { ConstantColor result = GMFGraphFactory.eINSTANCE.createConstantColor(); result.setValue(constant); return result; } public static RGBColor createRGBColor(int red, int green, int blue) { RGBColor result = GMFGraphFactory.eINSTANCE.createRGBColor(); result.setRed(red); result.setGreen(green); result.setBlue(blue); return result; } public static Font createBasicFont(String name, int height, FontStyle style) { BasicFont result = GMFGraphFactory.eINSTANCE.createBasicFont(); result.setFaceName(name); result.setHeight(height); result.setStyle(style); return result; } public static Dimension createDimension(int dx, int dy) { Dimension result = GMFGraphFactory.eINSTANCE.createDimension(); result.setDx(dx); result.setDy(dy); return result; } public static Point createPoint(int x, int y){ Point point = GMFGraphFactory.eINSTANCE.createPoint(); point.setX(x); point.setY(y); return point; } }