package org.eclipse.gmf.tooling.codegen.launcher; import java.lang.reflect.Constructor; import java.util.LinkedList; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.equinox.app.IApplication; import org.eclipse.equinox.app.IApplicationContext; import org.eclipse.gmf.codegen.gmfgen.GenEditorGenerator; import org.eclipse.gmf.codegen.util.CodegenEmittersWithXtend2; import org.eclipse.gmf.codegen.util.GeneratorWithXtend2; import org.eclipse.gmf.internal.common.codegen.CodeFormatterFactory; import org.eclipse.gmf.internal.common.codegen.GeneratorBase; import org.eclipse.gmf.tooling.codegen.launcher.utils.GMFGeneratorUtil; import org.eclipse.gmf.tooling.codegen.launcher.utils.SerializedCodeFormatterFactory; import org.eclipse.gmf.tooling.codegen.launcher.utils.WorkspaceHelper; import org.osgi.framework.Bundle; public class GMFGenerateApplication implements IApplication { private WorkspaceHelper myWorkspaceHelper; /* * (non-Javadoc) * * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext) */ @Override public Object start(IApplicationContext context) throws Exception { myWorkspaceHelper = new WorkspaceHelper(); ArgumentsParser runnerArguments = null; try { runnerArguments = new ArgumentsParser(context); List<String> projectsToImport = new LinkedList<String>(runnerArguments.getRelatedProjects()); projectsToImport.add(runnerArguments.getGMFGENProjectLocation()); initWorkspace(projectsToImport); GenEditorGenerator editorGen = GMFGeneratorUtil.loadEditorGen(runnerArguments.getGMFGENProjectLocation(), runnerArguments.getGMFGENResourceLocation()); initPluginProject(runnerArguments.getGenerateProjectLocation(), editorGen.getPluginDirectory()); CodegenEmittersWithXtend2 emitters = getCodegenEmitters(editorGen, runnerArguments.getCustomEmitterBundleName(), runnerArguments.getCustomEmitterClassName()); CodeFormatterFactory codeFormatterFactory = loadFormatter(runnerArguments.getFormatter()); GeneratorBase generator = new GeneratorWithXtend2(editorGen, emitters, codeFormatterFactory); generator.run(new NullProgressMonitor()); } catch (Exception e) { Activator.getDefault().error(e); if (runnerArguments != null && runnerArguments.shouldTrace()) { e.printStackTrace(); } throw e; } return IApplicationContext.EXIT_ASYNC_RESULT; } private void initPluginProject(String filesystemLocation, String gmfgenPluginDirectory) throws CoreException { String pluginProjectName = new Path(gmfgenPluginDirectory).segment(0); IPath location = new Path(filesystemLocation); if (!location.lastSegment().equals(pluginProjectName)) { location.append(pluginProjectName); } myWorkspaceHelper.createProject(pluginProjectName, location); } /* * (non-Javadoc) * * @see org.eclipse.equinox.app.IApplication#stop(org.eclipse.equinox.app.IApplicationContext) */ @Override public void stop() { myWorkspaceHelper = null; } protected void initWorkspace(List<String> projects) throws CoreException { myWorkspaceHelper.clearWorkspace(); for (String path : projects) { myWorkspaceHelper.importProject(path); } } @SuppressWarnings("unchecked") protected CodegenEmittersWithXtend2 getCodegenEmitters(GenEditorGenerator editorGen, String bundleName, String className) { CodegenEmittersWithXtend2 emitters = null; if (className != null && bundleName != null) { Bundle bundle = Platform.getBundle(bundleName); Class<? extends CodegenEmittersWithXtend2> customEmittersClass; try { customEmittersClass = (Class<? extends CodegenEmittersWithXtend2>) bundle.loadClass(className); } catch (ClassNotFoundException e) { throw new RuntimeException("Custom emitter not found. " + "Class: " + className + ". " + "Bundle:" + bundleName, e); } Constructor<? extends CodegenEmittersWithXtend2> constructor; try { constructor = customEmittersClass.getConstructor(GenEditorGenerator.class); } catch (Exception e) { throw new RuntimeException("Constructor with" + GenEditorGenerator.class.getCanonicalName() + " parameter not found", e); } try { emitters = (CodegenEmittersWithXtend2) constructor.newInstance(editorGen); } catch (Exception e) { throw new RuntimeException("Cannot create instance of" + className, e); } } else { emitters = new CodegenEmittersWithXtend2(editorGen); } return emitters; } private CodeFormatterFactory loadFormatter(String path) { if (path != null) { return new SerializedCodeFormatterFactory(path); } return CodeFormatterFactory.DEFAULT; } }