From 896a160c7d7ff216b01d86d6805e26356ca5e3ae Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Wed, 27 Apr 2016 14:43:07 -0400 Subject: [PATCH] New core plug-in and clean up API of generator. Change-Id: Ifdfa47f31b34aafa07ee860e4e73201a00808677 --- .../.classpath | 7 ++ .../org.eclipse.tools.templates.core/.project | 28 +++++++ .../.settings/org.eclipse.jdt.core.prefs | 7 ++ .../META-INF/MANIFEST.MF | 12 +++ .../about.html | 24 ++++++ .../build.properties | 5 ++ .../org.eclipse.tools.templates.core/pom.xml | 37 +++++++++ .../tools/templates/core/IGenerator.java | 22 ++++++ .../templates/core/internal/Activator.java | 31 ++++++++ .../META-INF/MANIFEST.MF | 3 +- .../templates/freemarker/FMGenerator.java | 43 +++++------ .../freemarker/FMProjectGenerator.java | 4 + .../freemarker/internal/Messages.java | 25 +++++++ .../freemarker/internal/messages.properties | 4 + .../META-INF/MANIFEST.MF | 3 +- .../templates/ui/TemplateSelectionPage.java | 3 + .../tools/templates/ui/TemplateWizard.java | 75 +++++++++++++++++++ pom.xml | 1 + 18 files changed, 311 insertions(+), 23 deletions(-) create mode 100644 bundles/org.eclipse.tools.templates.core/.classpath create mode 100644 bundles/org.eclipse.tools.templates.core/.project create mode 100644 bundles/org.eclipse.tools.templates.core/.settings/org.eclipse.jdt.core.prefs create mode 100644 bundles/org.eclipse.tools.templates.core/META-INF/MANIFEST.MF create mode 100644 bundles/org.eclipse.tools.templates.core/about.html create mode 100644 bundles/org.eclipse.tools.templates.core/build.properties create mode 100644 bundles/org.eclipse.tools.templates.core/pom.xml create mode 100644 bundles/org.eclipse.tools.templates.core/src/org/eclipse/tools/templates/core/IGenerator.java create mode 100644 bundles/org.eclipse.tools.templates.core/src/org/eclipse/tools/templates/core/internal/Activator.java create mode 100644 bundles/org.eclipse.tools.templates.freemarker/src/org/eclipse/tools/templates/freemarker/internal/Messages.java create mode 100644 bundles/org.eclipse.tools.templates.freemarker/src/org/eclipse/tools/templates/freemarker/internal/messages.properties create mode 100644 bundles/org.eclipse.tools.templates.ui/src/org/eclipse/tools/templates/ui/TemplateWizard.java diff --git a/bundles/org.eclipse.tools.templates.core/.classpath b/bundles/org.eclipse.tools.templates.core/.classpath new file mode 100644 index 00000000000..eca7bdba8f0 --- /dev/null +++ b/bundles/org.eclipse.tools.templates.core/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/bundles/org.eclipse.tools.templates.core/.project b/bundles/org.eclipse.tools.templates.core/.project new file mode 100644 index 00000000000..2fe6c3c8f09 --- /dev/null +++ b/bundles/org.eclipse.tools.templates.core/.project @@ -0,0 +1,28 @@ + + + org.eclipse.tools.templates.core + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/bundles/org.eclipse.tools.templates.core/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.tools.templates.core/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000000..0c68a61dca8 --- /dev/null +++ b/bundles/org.eclipse.tools.templates.core/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/bundles/org.eclipse.tools.templates.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.tools.templates.core/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..f8c30c945e6 --- /dev/null +++ b/bundles/org.eclipse.tools.templates.core/META-INF/MANIFEST.MF @@ -0,0 +1,12 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Templates Core +Bundle-SymbolicName: org.eclipse.tools.templates.core +Bundle-Version: 1.0.0.qualifier +Bundle-Activator: org.eclipse.tools.templates.core.internal.Activator +Bundle-Vendor: Eclipse CDT +Require-Bundle: org.eclipse.core.runtime, + org.eclipse.core.resources +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Bundle-ActivationPolicy: lazy +Export-Package: org.eclipse.tools.templates.core diff --git a/bundles/org.eclipse.tools.templates.core/about.html b/bundles/org.eclipse.tools.templates.core/about.html new file mode 100644 index 00000000000..d7c511887d6 --- /dev/null +++ b/bundles/org.eclipse.tools.templates.core/about.html @@ -0,0 +1,24 @@ + + +About + + +

About This Content

+ +

June 22, 2007

+

License

+ +

The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise +indicated below, the Content is provided to you under the terms and conditions of the +Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available +at http://www.eclipse.org/legal/epl-v10.html. +For purposes of the EPL, "Program" will mean the Content.

+ +

If you did not receive this Content directly from the Eclipse Foundation, the Content is +being redistributed by another party ("Redistributor") and different terms and conditions may +apply to your use of any object code in the Content. Check the Redistributor's license that was +provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise +indicated below, the terms and conditions of the EPL still apply to any source code in the Content +and such source code may be obtained at http://www.eclipse.org.

+ + \ No newline at end of file diff --git a/bundles/org.eclipse.tools.templates.core/build.properties b/bundles/org.eclipse.tools.templates.core/build.properties new file mode 100644 index 00000000000..17daa5b49ca --- /dev/null +++ b/bundles/org.eclipse.tools.templates.core/build.properties @@ -0,0 +1,5 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + about.html diff --git a/bundles/org.eclipse.tools.templates.core/pom.xml b/bundles/org.eclipse.tools.templates.core/pom.xml new file mode 100644 index 00000000000..f4a128f2b7b --- /dev/null +++ b/bundles/org.eclipse.tools.templates.core/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + + org.eclipse.tools.templates + parent + 1.0.0-SNAPSHOT + ../../pom.xml + + + 1.0.0-SNAPSHOT + org.eclipse.tools.templates.core + eclipse-plugin + + + + + org.eclipse.tycho + tycho-source-plugin + ${tycho-version} + + + plugin-source + none + + + attach-source + none + + + + + + diff --git a/bundles/org.eclipse.tools.templates.core/src/org/eclipse/tools/templates/core/IGenerator.java b/bundles/org.eclipse.tools.templates.core/src/org/eclipse/tools/templates/core/IGenerator.java new file mode 100644 index 00000000000..9a904fc4bf4 --- /dev/null +++ b/bundles/org.eclipse.tools.templates.core/src/org/eclipse/tools/templates/core/IGenerator.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2016 QNX Software Systems 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 + *******************************************************************************/ +package org.eclipse.tools.templates.core; + +import java.util.Map; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; + +public interface IGenerator { + + void generate(Map model, IProgressMonitor monitor) throws CoreException; + + IFile[] getFilesToOpen(); + +} diff --git a/bundles/org.eclipse.tools.templates.core/src/org/eclipse/tools/templates/core/internal/Activator.java b/bundles/org.eclipse.tools.templates.core/src/org/eclipse/tools/templates/core/internal/Activator.java new file mode 100644 index 00000000000..d54b70a4716 --- /dev/null +++ b/bundles/org.eclipse.tools.templates.core/src/org/eclipse/tools/templates/core/internal/Activator.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2016 QNX Software Systems 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 + *******************************************************************************/ +package org.eclipse.tools.templates.core.internal; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +public class Activator implements BundleActivator { + + private static BundleContext context; + + static BundleContext getContext() { + return context; + } + + @Override + public void start(BundleContext bundleContext) throws Exception { + Activator.context = bundleContext; + } + + @Override + public void stop(BundleContext bundleContext) throws Exception { + Activator.context = null; + } + +} diff --git a/bundles/org.eclipse.tools.templates.freemarker/META-INF/MANIFEST.MF b/bundles/org.eclipse.tools.templates.freemarker/META-INF/MANIFEST.MF index 2a4f99788b0..7b62b334b19 100644 --- a/bundles/org.eclipse.tools.templates.freemarker/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.tools.templates.freemarker/META-INF/MANIFEST.MF @@ -6,7 +6,8 @@ Bundle-Version: 1.0.0.qualifier Bundle-Activator: org.eclipse.tools.templates.freemarker.internal.Activator Require-Bundle: org.eclipse.core.runtime, org.eclipse.core.resources, - org.freemarker;visibility:=reexport + org.freemarker;visibility:=reexport, + org.eclipse.tools.templates.core;bundle-version="1.0.0";visibility:=reexport Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Export-Package: org.eclipse.tools.templates.freemarker diff --git a/bundles/org.eclipse.tools.templates.freemarker/src/org/eclipse/tools/templates/freemarker/FMGenerator.java b/bundles/org.eclipse.tools.templates.freemarker/src/org/eclipse/tools/templates/freemarker/FMGenerator.java index adf5e4f2133..11cf6e3a353 100644 --- a/bundles/org.eclipse.tools.templates.freemarker/src/org/eclipse/tools/templates/freemarker/FMGenerator.java +++ b/bundles/org.eclipse.tools.templates.freemarker/src/org/eclipse/tools/templates/freemarker/FMGenerator.java @@ -41,7 +41,9 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; +import org.eclipse.tools.templates.core.IGenerator; import org.eclipse.tools.templates.freemarker.internal.Activator; +import org.eclipse.tools.templates.freemarker.internal.Messages; import org.osgi.framework.Bundle; import freemarker.cache.TemplateLoader; @@ -49,32 +51,30 @@ import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; -public abstract class FMGenerator implements TemplateLoader { +public abstract class FMGenerator implements IGenerator, TemplateLoader { private final Configuration templateConfig; - private String manifestPath; + private final String manifestPath; private TemplateManifest manifest; private List filesToOpen = new ArrayList<>(); - protected FMGenerator() { + protected FMGenerator(String manifestPath) { templateConfig = new Configuration(Configuration.VERSION_2_3_22); templateConfig.setTemplateLoader(this); - } - - public abstract Bundle getSourceBundle(); - - public void setTemplateManifestPath(String manifestPath) { this.manifestPath = manifestPath; } - public TemplateManifest getManifest() { - return manifest; - } - + protected abstract Bundle getSourceBundle(); + protected Class getManifestClass() { return TemplateManifest.class; } + protected TemplateManifest getManifest() { + return manifest; + } + + @Override public void generate(Map model, IProgressMonitor monitor) throws CoreException { // If no manifest, just return if (manifestPath == null) { @@ -90,7 +90,7 @@ public abstract class FMGenerator implements TemplateLoader { Unmarshaller unmarshaller = xmlContext.createUnmarshaller(); manifest = (TemplateManifest) unmarshaller.unmarshal(new StringReader(writer.toString())); } catch (JAXBException e) { - throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), "Loading template manifest", e)); + throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), Messages.FMGenerator_0, e)); } // generate files @@ -116,7 +116,7 @@ public abstract class FMGenerator implements TemplateLoader { } } catch (IOException e) { throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), - "Reading file " + fileTemplate.getSrc(), e)); + String.format(Messages.FMGenerator_1, fileTemplate.getSrc()), e)); } } @@ -138,17 +138,17 @@ public abstract class FMGenerator implements TemplateLoader { } } - public void loadFile(String templateFile, Object model, Writer out) throws CoreException { + protected void loadFile(String templateFile, Map model, Writer out) throws CoreException { try { Template template = templateConfig.getTemplate(templateFile); template.process(model, out); } catch (IOException | TemplateException e) { throw new CoreException( - new Status(IStatus.ERROR, Activator.getId(), "Processing template " + templateFile, e)); + new Status(IStatus.ERROR, Activator.getId(), String.format(Messages.FMGenerator_2, templateFile), e)); } } - public void generateFile(String templateFile, final Object model, final IFile outputFile, IProgressMonitor monitor) + public void generateFile(String templateFile, Map model, final IFile outputFile, IProgressMonitor monitor) throws CoreException { try (StringWriter writer = new StringWriter()) { loadFile(templateFile, model, writer); @@ -162,11 +162,11 @@ public abstract class FMGenerator implements TemplateLoader { } } } catch (IOException e) { - throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), "Generating file " + templateFile, e)); + throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), String.format(Messages.FMGenerator_3, templateFile), e)); } } - public static void createParent(IResource child, IProgressMonitor monitor) throws CoreException { + protected static void createParent(IResource child, IProgressMonitor monitor) throws CoreException { if (child == null) return; @@ -180,9 +180,10 @@ public abstract class FMGenerator implements TemplateLoader { parent.create(true, true, monitor); } + @Override public IFile[] getFilesToOpen() { - // TODO Auto-generated method stub - return null; + // TODO + return new IFile[0]; } @Override diff --git a/bundles/org.eclipse.tools.templates.freemarker/src/org/eclipse/tools/templates/freemarker/FMProjectGenerator.java b/bundles/org.eclipse.tools.templates.freemarker/src/org/eclipse/tools/templates/freemarker/FMProjectGenerator.java index 6032e0af999..f925b4defae 100644 --- a/bundles/org.eclipse.tools.templates.freemarker/src/org/eclipse/tools/templates/freemarker/FMProjectGenerator.java +++ b/bundles/org.eclipse.tools.templates.freemarker/src/org/eclipse/tools/templates/freemarker/FMProjectGenerator.java @@ -24,6 +24,10 @@ public abstract class FMProjectGenerator extends FMGenerator { private IProject[] referencedProjects; private IProject project; + + public FMProjectGenerator(String manifestPath) { + super(manifestPath); + } protected abstract void initProjectDescription(IProjectDescription description) throws CoreException; diff --git a/bundles/org.eclipse.tools.templates.freemarker/src/org/eclipse/tools/templates/freemarker/internal/Messages.java b/bundles/org.eclipse.tools.templates.freemarker/src/org/eclipse/tools/templates/freemarker/internal/Messages.java new file mode 100644 index 00000000000..3675f3ff359 --- /dev/null +++ b/bundles/org.eclipse.tools.templates.freemarker/src/org/eclipse/tools/templates/freemarker/internal/Messages.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2016 QNX Software Systems 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 + *******************************************************************************/ +package org.eclipse.tools.templates.freemarker.internal; + +import org.eclipse.osgi.util.NLS; + +public class Messages extends NLS { + private static final String BUNDLE_NAME = "org.eclipse.tools.templates.freemarker.internal.messages"; //$NON-NLS-1$ + public static String FMGenerator_0; + public static String FMGenerator_1; + public static String FMGenerator_2; + public static String FMGenerator_3; + static { + // initialize resource bundle + NLS.initializeMessages(BUNDLE_NAME, Messages.class); + } + + private Messages() { + } +} diff --git a/bundles/org.eclipse.tools.templates.freemarker/src/org/eclipse/tools/templates/freemarker/internal/messages.properties b/bundles/org.eclipse.tools.templates.freemarker/src/org/eclipse/tools/templates/freemarker/internal/messages.properties new file mode 100644 index 00000000000..6618fb961f9 --- /dev/null +++ b/bundles/org.eclipse.tools.templates.freemarker/src/org/eclipse/tools/templates/freemarker/internal/messages.properties @@ -0,0 +1,4 @@ +FMGenerator_0=Loading template manifest +FMGenerator_1=Reading file %s +FMGenerator_2=Processing template %s +FMGenerator_3=Generating file %s diff --git a/bundles/org.eclipse.tools.templates.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.tools.templates.ui/META-INF/MANIFEST.MF index 75b48580da4..d489defeb40 100644 --- a/bundles/org.eclipse.tools.templates.ui/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.tools.templates.ui/META-INF/MANIFEST.MF @@ -7,7 +7,8 @@ Bundle-Activator: org.eclipse.tools.templates.ui.internal.Activator Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.ui.ide, - org.eclipse.core.resources + org.eclipse.core.resources, + org.eclipse.tools.templates.core;bundle-version="1.0.0";visibility:=reexport Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Export-Package: org.eclipse.tools.templates.ui diff --git a/bundles/org.eclipse.tools.templates.ui/src/org/eclipse/tools/templates/ui/TemplateSelectionPage.java b/bundles/org.eclipse.tools.templates.ui/src/org/eclipse/tools/templates/ui/TemplateSelectionPage.java index a6f6ab6ed60..fd02ca7df49 100644 --- a/bundles/org.eclipse.tools.templates.ui/src/org/eclipse/tools/templates/ui/TemplateSelectionPage.java +++ b/bundles/org.eclipse.tools.templates.ui/src/org/eclipse/tools/templates/ui/TemplateSelectionPage.java @@ -30,6 +30,7 @@ import org.eclipse.tools.templates.ui.internal.Template; import org.eclipse.tools.templates.ui.internal.TemplateExtension; import org.eclipse.tools.templates.ui.internal.TemplateTable; import org.eclipse.ui.IWorkbenchWizard; +import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard; public class TemplateSelectionPage extends WizardPage { @@ -99,6 +100,8 @@ public class TemplateSelectionPage extends WizardPage { if (template != null) { try { IWorkbenchWizard nextWizard = template.getWizard(); + BasicNewResourceWizard oldWizard = (BasicNewResourceWizard) getWizard(); + nextWizard.init(oldWizard.getWorkbench(), oldWizard.getSelection()); nextWizard.addPages(); return nextWizard.getPages()[0]; } catch (CoreException e) { diff --git a/bundles/org.eclipse.tools.templates.ui/src/org/eclipse/tools/templates/ui/TemplateWizard.java b/bundles/org.eclipse.tools.templates.ui/src/org/eclipse/tools/templates/ui/TemplateWizard.java new file mode 100644 index 00000000000..a7d73182f07 --- /dev/null +++ b/bundles/org.eclipse.tools.templates.ui/src/org/eclipse/tools/templates/ui/TemplateWizard.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * Copyright (c) 2016 QNX Software Systems 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 + *******************************************************************************/ +package org.eclipse.tools.templates.ui; + +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.jobs.ISchedulingRule; +import org.eclipse.tools.templates.core.IGenerator; +import org.eclipse.tools.templates.ui.internal.Activator; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.actions.WorkspaceModifyOperation; +import org.eclipse.ui.ide.IDE; +import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard; + +public abstract class TemplateWizard extends BasicNewResourceWizard { + + protected abstract IGenerator getGenerator(); + + protected void populateModel(Map model) { + // nothing by default + } + + @Override + public boolean performFinish() { + IGenerator generator = getGenerator(); + Map model = new HashMap<>(); + populateModel(model); + + try { + getContainer().run(true, true, new WorkspaceModifyOperation() { + @Override + protected void execute(IProgressMonitor monitor) + throws CoreException, InvocationTargetException, InterruptedException { + monitor.beginTask("Generating project", 1); //$NON-NLS-1$ + generator.generate(model, monitor); + monitor.done(); + getWorkbench().getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + try { + IWorkbenchPage activePage = getWorkbench().getActiveWorkbenchWindow().getActivePage(); + for (IFile file : generator.getFilesToOpen()) { + IDE.openEditor(activePage, file); + } + } catch (PartInitException e) { + Activator.log(e); + } + } + }); + } + + @Override + public ISchedulingRule getRule() { + return ResourcesPlugin.getWorkspace().getRoot(); + } + }); + } catch (InterruptedException | InvocationTargetException e) { + throw new RuntimeException(e); + } + return true; + } + +} diff --git a/pom.xml b/pom.xml index 1bf00d4bcc3..5ef5011f18a 100644 --- a/pom.xml +++ b/pom.xml @@ -60,6 +60,7 @@ + bundles/org.eclipse.tools.templates.core bundles/org.eclipse.tools.templates.freemarker bundles/org.eclipse.tools.templates.ui