diff options
author | Stéphane Bégaudeau | 2018-05-24 07:10:36 +0000 |
---|---|---|
committer | Pierre-Charles David | 2018-05-25 13:51:46 +0000 |
commit | b82fdf585de90f18fa2c8b4599d778889d3d71c9 (patch) | |
tree | 90ee9fd002f0c1e1c4dd34d5e954664cb8a2cd9c /plugins | |
parent | 26c8fe0dacb847cf7ab64be71c834f6aa2f2aced (diff) | |
download | org.eclipse.sirius-b82fdf585de90f18fa2c8b4599d778889d3d71c9.tar.gz org.eclipse.sirius-b82fdf585de90f18fa2c8b4599d778889d3d71c9.tar.xz org.eclipse.sirius-b82fdf585de90f18fa2c8b4599d778889d3d71c9.zip |
[509735] Add support for the gap pattern generator in the workflow
Bug: 509735
Change-Id: Idcfe25720e79f8b4139f52f2878fcab2a0836c37
Signed-off-by: Stéphane Bégaudeau <stephane.begaudeau@obeo.fr>
Diffstat (limited to 'plugins')
13 files changed, 732 insertions, 9 deletions
diff --git a/plugins/org.eclipse.sirius.workflow.edit/.classpath b/plugins/org.eclipse.sirius.workflow.edit/.classpath index 03565ec5d9..623f92521e 100644 --- a/plugins/org.eclipse.sirius.workflow.edit/.classpath +++ b/plugins/org.eclipse.sirius.workflow.edit/.classpath @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src-gen"/> + <classpathentry kind="src" path="src-generator"/> + <classpathentry kind="src" path="src-spec"/> <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> <classpathentry kind="output" path="bin"/> diff --git a/plugins/org.eclipse.sirius.workflow.edit/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.sirius.workflow.edit/.settings/org.eclipse.jdt.core.prefs index 97c066b909..1332c7faf2 100644 --- a/plugins/org.eclipse.sirius.workflow.edit/.settings/org.eclipse.jdt.core.prefs +++ b/plugins/org.eclipse.sirius.workflow.edit/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,13 @@ eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 @@ -7,15 +16,19 @@ org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning org.eclipse.jdt.core.compiler.problem.deprecation=warning org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore @@ -23,33 +36,58 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=ignore +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore @@ -57,14 +95,17 @@ org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedImport=warning org.eclipse.jdt.core.compiler.problem.unusedLabel=warning org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.8 @@ -351,4 +392,3 @@ org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled diff --git a/plugins/org.eclipse.sirius.workflow.edit/META-INF/MANIFEST.MF b/plugins/org.eclipse.sirius.workflow.edit/META-INF/MANIFEST.MF index b1cf261521..8b0684bee8 100644 --- a/plugins/org.eclipse.sirius.workflow.edit/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.sirius.workflow.edit/META-INF/MANIFEST.MF @@ -8,8 +8,9 @@ Bundle-Activator: org.eclipse.sirius.workflow.edit.WorkflowEditPlugin$Implementa Bundle-Vendor: %providerName Bundle-Localization: plugin Bundle-RequiredExecutionEnvironment: JavaSE-1.8 -Export-Package: org.eclipse.sirius.workflow.edit, - org.eclipse.sirius.workflow.provider +Export-Package: org.eclipse.sirius.workflow.edit;version="6.0.0", + org.eclipse.sirius.workflow.edit.internal.generator;version="6.0.0";x-internal:=true, + org.eclipse.sirius.workflow.provider;version="6.0.0" Require-Bundle: org.eclipse.core.runtime;bundle-version="3.12.0", org.eclipse.sirius.workflow.model;bundle-version="6.0.0";visibility:=reexport, org.eclipse.emf.edit;bundle-version="2.12.0";visibility:=reexport, diff --git a/plugins/org.eclipse.sirius.workflow.edit/build.properties b/plugins/org.eclipse.sirius.workflow.edit/build.properties index aec82a9812..e9714277c6 100644 --- a/plugins/org.eclipse.sirius.workflow.edit/build.properties +++ b/plugins/org.eclipse.sirius.workflow.edit/build.properties @@ -15,7 +15,9 @@ bin.includes = .,\ plugin.properties,\ about.html jars.compile.order = . -source.. = src-gen/ +source.. = src-gen/,\ + src-generator/,\ + src-spec/ output.. = bin/ javacWarnings.. = none javacDefaultEncoding.. = US-ASCII diff --git a/plugins/org.eclipse.sirius.workflow.edit/plugin.xml b/plugins/org.eclipse.sirius.workflow.edit/plugin.xml index 9354db6bb3..558e09f885 100644 --- a/plugins/org.eclipse.sirius.workflow.edit/plugin.xml +++ b/plugins/org.eclipse.sirius.workflow.edit/plugin.xml @@ -16,10 +16,10 @@ <plugin> <extension point="org.eclipse.emf.edit.itemProviderAdapterFactories"> - <!-- @generated workflow --> + <!-- @generated NOT workflow --> <factory uri="http://www.eclipse.org/sirius/workflow/1.0.0" - class="org.eclipse.sirius.workflow.provider.WorkflowItemProviderAdapterFactory" + class="org.eclipse.sirius.workflow.provider.WorkflowItemProviderAdapterFactorySpec" supportedTypes= "org.eclipse.emf.edit.provider.IEditingDomainItemProvider org.eclipse.emf.edit.provider.IStructuredItemContentProvider @@ -30,9 +30,9 @@ </extension> <extension point="org.eclipse.emf.edit.childCreationExtenders"> - <!-- @generated workflow --> + <!-- @generated NOT workflow --> <extender uri="http://www.eclipse.org/sirius/description/1.1.0" - class="org.eclipse.sirius.workflow.provider.WorkflowItemProviderAdapterFactory$DescriptionChildCreationExtender"/> + class="org.eclipse.sirius.workflow.provider.DescriptionChildCreationExtenderSpec"/> </extension> </plugin> diff --git a/plugins/org.eclipse.sirius.workflow.edit/src-generator/org/eclipse/sirius/workflow/edit/internal/generator/GapPatternGenerator.java b/plugins/org.eclipse.sirius.workflow.edit/src-generator/org/eclipse/sirius/workflow/edit/internal/generator/GapPatternGenerator.java new file mode 100644 index 0000000000..cd90135dbf --- /dev/null +++ b/plugins/org.eclipse.sirius.workflow.edit/src-generator/org/eclipse/sirius/workflow/edit/internal/generator/GapPatternGenerator.java @@ -0,0 +1,263 @@ +/** + * Copyright (c) 2016, 2018 Obeo. + * 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: + * Obeo - initial API and implementation + * + */ +package org.eclipse.sirius.workflow.edit.internal.generator; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EClassifier; +import org.eclipse.emf.ecore.EPackage; +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.emf.ecore.xmi.impl.EcoreResourceFactoryImpl; + +/** + * Utility class used to generate the Java classes used for the generation gap pattern of the EMF Edit part. + * + * @author sbegaudeau + */ +@SuppressWarnings({ "checkstyle:multiplestringliterals" }) +public final class GapPatternGenerator { + /** + * The constructor. + */ + private GapPatternGenerator() { + // do nothing + } + + /** + * The entry point of our generator. + * + * @param args + * The arguments (unused) + */ + public static void main(String[] args) { + String userDir = System.getProperty("user.dir"); //$NON-NLS-1$ + Path siriusWorkflowEditProjectPath = Paths.get(userDir); + Path siriusWorkflowProjectPath = siriusWorkflowEditProjectPath.getParent().resolve("org.eclipse.sirius.workflow.model"); //$NON-NLS-1$ + Path ecoreModel = siriusWorkflowProjectPath.resolve("model/workflow.ecore"); //$NON-NLS-1$ + + ResourceSet resourceSet = new ResourceSetImpl(); + resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ecore", new EcoreResourceFactoryImpl()); //$NON-NLS-1$ + URI uri = URI.createFileURI(ecoreModel.toAbsolutePath().toString()); + + Path outputFolderPath = siriusWorkflowEditProjectPath.resolve("src-spec/org/eclipse/sirius/workflow/provider"); //$NON-NLS-1$ + + Resource resource = resourceSet.getResource(uri, true); + if (resource != null && resource.getContents().size() == 1 && resource.getContents().get(0) instanceof EPackage) { + EPackage ePackage = (EPackage) resource.getContents().get(0); + + GapPatternGenerator.generateAdapterFactory(outputFolderPath, ePackage); + GapPatternGenerator.generateDescriptionChildCreationExtender(outputFolderPath, ePackage); + + List<EClassifier> eClassifiers = ePackage.getEClassifiers(); + for (EClassifier eClassifier : eClassifiers) { + if (eClassifier instanceof EClass) { + GapPatternGenerator.generateItemProvider(outputFolderPath, (EClass) eClassifier); + } + } + } + } + + /** + * Appends the copyrights to the given string builder and returns it. + * + * @param builder + * The string builder + * @return The given string builder + */ + private static StringBuilder appendCopyright(StringBuilder builder) { + builder.append("/**").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" * Copyright (c) 2018 Obeo.").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" * All rights reserved. This program and the accompanying materials").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" * are made available under the terms of the Eclipse Public License v1.0").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" * which accompanies this distribution, and is available at").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" * http://www.eclipse.org/legal/epl-v10.html").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" *").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" * Contributors:").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" * Obeo - initial API and implementation").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" *").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" */").append(System.lineSeparator()); //$NON-NLS-1$ + return builder; + } + + /** + * Returns the given word with the first character in upper case. + * + * @param word + * The word + * @return The given word with the first character in upper case + */ + private static String toUpperFirst(String word) { + return word.substring(0, 1).toUpperCase() + word.substring(1); + } + + /** + * Returns the given word with the first character in lower case. + * + * @param word + * The word + * @return The given word with the first character in lower case + */ + private static String toLowerFirst(String word) { + return word.substring(0, 1).toLowerCase() + word.substring(1); + } + + /** + * Writes the file at the given location with the given content. + * + * @param outputFilePath + * The file location + * @param builder + * The content + * @param force + * <code>true</code> to indicate that we should overwrite the existing file, if any, <code>false</code> + * otherwise + */ + private static void writeSourceFile(Path outputFilePath, StringBuilder builder, boolean force) { + File parentFolder = outputFilePath.toFile().getParentFile(); + if (!parentFolder.exists()) { + parentFolder.mkdirs(); + } + if (!outputFilePath.toFile().exists() || force) { + try { + Files.write(outputFilePath, builder.toString().getBytes()); + } catch (IOException e) { + // CHECKSTYLE:OFF + e.printStackTrace(); + // CHECKSTYLE:ON + } + } + } + + /** + * Generates the adapter factory for the given EPackage in the given output folder. + * + * @param outputFolderPath + * The path of the output folder + * @param ePackage + * The EPackage + */ + private static void generateAdapterFactory(Path outputFolderPath, EPackage ePackage) { + StringBuilder builder = GapPatternGenerator.appendCopyright(new StringBuilder()); + + builder.append("package org.eclipse.sirius.workflow.provider;").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(System.lineSeparator()); + builder.append("import org.eclipse.emf.common.notify.Adapter;").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(System.lineSeparator()); + builder.append("/**").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" * Subclass used to not have to modify the generated code.").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" *").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" * @author ").append(System.getProperty("user.name")).append(System.lineSeparator()); //$NON-NLS-1$ //$NON-NLS-2$ + builder.append(" */").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append("public class WorkflowItemProviderAdapterFactorySpec extends WorkflowItemProviderAdapterFactory {").append(System.lineSeparator()); //$NON-NLS-1$ + + for (EClassifier eClassifier : ePackage.getEClassifiers()) { + if (eClassifier instanceof EClass && !((EClass) eClassifier).isAbstract() && !((EClass) eClassifier).isInterface()) { + builder.append(System.lineSeparator()); + builder.append(" @Override").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" public Adapter create" + GapPatternGenerator.toUpperFirst(eClassifier.getName()) + "Adapter() {").append(System.lineSeparator()); //$NON-NLS-1$ //$NON-NLS-2$ + builder.append(" if (" + GapPatternGenerator.toLowerFirst(eClassifier.getName()) + "ItemProvider == null) {").append(System.lineSeparator()); //$NON-NLS-1$ //$NON-NLS-2$ + builder.append(" " + GapPatternGenerator.toLowerFirst(eClassifier.getName()) + "ItemProvider = new " + GapPatternGenerator.toUpperFirst(eClassifier.getName()) //$NON-NLS-1$ //$NON-NLS-2$ + + "ItemProviderSpec(this);") //$NON-NLS-1$ + .append(System.lineSeparator()); + builder.append(" }").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(System.lineSeparator()); + builder.append(" return " + GapPatternGenerator.toLowerFirst(eClassifier.getName()) + "ItemProvider;").append(System.lineSeparator()); //$NON-NLS-1$ //$NON-NLS-2$ + builder.append(" }").append(System.lineSeparator()); //$NON-NLS-1$ + } + } + + builder.append("}").append(System.lineSeparator()); //$NON-NLS-1$ + + String className = GapPatternGenerator.toUpperFirst(ePackage.getName()) + "ItemProviderAdapterFactorySpec.java"; //$NON-NLS-1$ + Path outputFilePath = outputFolderPath.resolve(className); + + GapPatternGenerator.writeSourceFile(outputFilePath, builder, true); + } + + /** + * Generates the description child creation extender for the given EPackage in the given output folder. + * + * @param outputFolderPath + * The path of the output folder + * @param ePackage + * The EPackage + */ + private static void generateDescriptionChildCreationExtender(Path outputFolderPath, EPackage ePackage) { + StringBuilder builder = GapPatternGenerator.appendCopyright(new StringBuilder()); + builder.append("package org.eclipse.sirius.workflow.provider;").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(System.lineSeparator()); + builder.append("import org.eclipse.sirius.workflow.provider.WorkflowItemProviderAdapterFactory.DescriptionChildCreationExtender;").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(System.lineSeparator()); + builder.append("/**").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" * Subclass used to not have to modify the generated code.").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" *").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" * @author ").append(System.getProperty("user.name")).append(System.lineSeparator()); //$NON-NLS-1$ //$NON-NLS-2$ + builder.append(" */").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append("public class DescriptionChildCreationExtenderSpec extends DescriptionChildCreationExtender {") //$NON-NLS-1$ + .append(System.lineSeparator()); + builder.append("}").append(System.lineSeparator()); //$NON-NLS-1$ + + String className = "DescriptionChildCreationExtenderSpec.java"; //$NON-NLS-1$ + Path outputFilePath = outputFolderPath.resolve(className); + + GapPatternGenerator.writeSourceFile(outputFilePath, builder, false); + } + + /** + * Generates the item provider for the given EClass in the given output folder. + * + * @param outputFolderPath + * The path of the output folder + * @param eClass + * The EClass + */ + private static void generateItemProvider(Path outputFolderPath, EClass eClass) { + StringBuilder builder = GapPatternGenerator.appendCopyright(new StringBuilder()); + builder.append("package org.eclipse.sirius.workflow.provider;").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(System.lineSeparator()); + builder.append("import org.eclipse.emf.common.notify.AdapterFactory;").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(System.lineSeparator()); + builder.append("/**").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" * Subclass used to not have to modify the generated code.").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" *").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" * @author sbegaudeau").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" */").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append("public class " + GapPatternGenerator.toUpperFirst(eClass.getName()) + "ItemProviderSpec extends " + GapPatternGenerator.toUpperFirst(eClass.getName()) + "ItemProvider {") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + .append(System.lineSeparator()); + builder.append(System.lineSeparator()); + builder.append(" /**").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" * The constructor.").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" *").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" * @param adapterFactory").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" * The adapter factory").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" */").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" public " + GapPatternGenerator.toUpperFirst(eClass.getName()) + "ItemProviderSpec(AdapterFactory adapterFactory) {").append(System.lineSeparator()); //$NON-NLS-1$ //$NON-NLS-2$ + builder.append(" super(adapterFactory);").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(" }").append(System.lineSeparator()); //$NON-NLS-1$ + builder.append(System.lineSeparator()); + builder.append("}").append(System.lineSeparator()); //$NON-NLS-1$ + + String className = GapPatternGenerator.toUpperFirst(eClass.getName()) + "ItemProviderSpec.java"; //$NON-NLS-1$ + Path outputFilePath = outputFolderPath.resolve(className); + + GapPatternGenerator.writeSourceFile(outputFilePath, builder, false); + } +} diff --git a/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/ActivityDescriptionItemProviderSpec.java b/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/ActivityDescriptionItemProviderSpec.java new file mode 100644 index 0000000000..5524fc26ee --- /dev/null +++ b/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/ActivityDescriptionItemProviderSpec.java @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2018 Obeo. + * 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: + * Obeo - initial API and implementation + * + */ +package org.eclipse.sirius.workflow.provider; + +import org.eclipse.emf.common.notify.AdapterFactory; +import org.eclipse.emf.edit.provider.StyledString; + +/** + * Subclass used to not have to modify the generated code. + * + * @author sbegaudeau + */ +public class ActivityDescriptionItemProviderSpec extends ActivityDescriptionItemProvider { + + /** + * The constructor. + * + * @param adapterFactory + * The adapter factory + */ + public ActivityDescriptionItemProviderSpec(AdapterFactory adapterFactory) { + super(adapterFactory); + } + + @Override + public String getText(Object object) { + Object styledText = this.getStyledText(object); + if (styledText instanceof StyledString) { + return ((StyledString) styledText).getString(); + } + return super.getText(object); + } + + @Override + public Object getStyledText(Object object) { + return Utils.computeLabel(this, object, "_UI_ActivityDescription_type"); //$NON-NLS-1$ + } +} diff --git a/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/DescriptionChildCreationExtenderSpec.java b/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/DescriptionChildCreationExtenderSpec.java new file mode 100644 index 0000000000..3b00d1c8cb --- /dev/null +++ b/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/DescriptionChildCreationExtenderSpec.java @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2018 Obeo. + * 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: + * Obeo - initial API and implementation + * + */ +package org.eclipse.sirius.workflow.provider; + +import org.eclipse.sirius.workflow.provider.WorkflowItemProviderAdapterFactory.DescriptionChildCreationExtender; + +/** + * Subclass used to not have to modify the generated code. + * + * @author sbegaudeau + */ +public class DescriptionChildCreationExtenderSpec extends DescriptionChildCreationExtender { +} diff --git a/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/PageDescriptionItemProviderSpec.java b/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/PageDescriptionItemProviderSpec.java new file mode 100644 index 0000000000..56e527de0c --- /dev/null +++ b/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/PageDescriptionItemProviderSpec.java @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2018 Obeo. + * 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: + * Obeo - initial API and implementation + * + */ +package org.eclipse.sirius.workflow.provider; + +import org.eclipse.emf.common.notify.AdapterFactory; +import org.eclipse.emf.edit.provider.StyledString; + +/** + * Subclass used to not have to modify the generated code. + * + * @author sbegaudeau + */ +public class PageDescriptionItemProviderSpec extends PageDescriptionItemProvider { + + /** + * The constructor. + * + * @param adapterFactory + * The adapter factory + */ + public PageDescriptionItemProviderSpec(AdapterFactory adapterFactory) { + super(adapterFactory); + } + + @Override + public String getText(Object object) { + Object styledText = this.getStyledText(object); + if (styledText instanceof StyledString) { + return ((StyledString) styledText).getString(); + } + return super.getText(object); + } + + @Override + public Object getStyledText(Object object) { + return Utils.computeLabel(this, object, "_UI_PageDescription_type"); //$NON-NLS-1$ + } + +} diff --git a/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/SectionDescriptionItemProviderSpec.java b/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/SectionDescriptionItemProviderSpec.java new file mode 100644 index 0000000000..86138eb02f --- /dev/null +++ b/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/SectionDescriptionItemProviderSpec.java @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2018 Obeo. + * 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: + * Obeo - initial API and implementation + * + */ +package org.eclipse.sirius.workflow.provider; + +import org.eclipse.emf.common.notify.AdapterFactory; +import org.eclipse.emf.edit.command.CommandParameter; +import org.eclipse.emf.edit.provider.StyledString; + +/** + * Subclass used to not have to modify the generated code. + * + * @author sbegaudeau + */ +public class SectionDescriptionItemProviderSpec extends SectionDescriptionItemProvider { + + /** + * The constructor. + * + * @param adapterFactory + * The adapter factory + */ + public SectionDescriptionItemProviderSpec(AdapterFactory adapterFactory) { + super(adapterFactory); + } + + @Override + public String getText(Object object) { + Object styledText = this.getStyledText(object); + if (styledText instanceof StyledString) { + return ((StyledString) styledText).getString(); + } + return super.getText(object); + } + + @Override + public Object getStyledText(Object object) { + return Utils.computeLabel(this, object, "_UI_SectionDescription_type"); //$NON-NLS-1$ + } + + @Override + protected CommandParameter createChildParameter(Object feature, Object child) { + Utils.addNoopNavigationOperations(child); + return super.createChildParameter(feature, child); + } +} diff --git a/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/Utils.java b/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/Utils.java new file mode 100644 index 0000000000..50eac08822 --- /dev/null +++ b/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/Utils.java @@ -0,0 +1,138 @@ +/** + * Copyright (c) 2017 Obeo. + * 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: + * Obeo - initial API and implementation + * + */ +package org.eclipse.sirius.workflow.provider; + +import java.util.Optional; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.edit.provider.IItemFontProvider; +import org.eclipse.emf.edit.provider.ItemProviderAdapter; +import org.eclipse.emf.edit.provider.StyledString; +import org.eclipse.emf.edit.provider.StyledString.Style; +import org.eclipse.sirius.viewpoint.description.IdentifiedElement; +import org.eclipse.sirius.viewpoint.description.tool.ChangeContext; +import org.eclipse.sirius.viewpoint.description.tool.InitialOperation; +import org.eclipse.sirius.viewpoint.description.tool.ToolFactory; +import org.eclipse.sirius.viewpoint.description.tool.ToolPackage; + +/** + * Utility class used to store common operations for all the item providers. + * + * @author sbegaudeau + */ +public final class Utils { + + /** + * The style used by keywords. + */ + public static final Style KEYWORD_STYLE = Style.newBuilder().setForegroundColor(URI.createURI("color://rgb/125/9/82")).setFont(IItemFontProvider.BOLD_FONT).toStyle(); //$NON-NLS-1$ + + /** + * The constructor. + */ + private Utils() { + // prevent instantiation + } + + /** + * Computes the label of the given object. + * + * @param itemProviderAdapter + * The item provider adapter of the object + * @param object + * The object + * @param defaultLabelKey + * The key of the default label + * @return The label or <code>null</code> if it is undefined + */ + public static StyledString computeLabel(ItemProviderAdapter itemProviderAdapter, Object object, String defaultLabelKey) { + StyledString styledString = new StyledString(); + if (object instanceof IdentifiedElement) { + IdentifiedElement identifiedElement = (IdentifiedElement) object; + styledString = Utils.computeIdentifiedElementLabel(itemProviderAdapter, identifiedElement, defaultLabelKey); + } + return styledString; + } + + /** + * Computes the label of the given identified element. + * + * @param itemProviderAdapter + * The {@link ItemProviderAdapter} + * @param identifiedElement + * The Identified Element + * @param defaultLabelKey + * The default label key + * @return The label of the element + */ + private static StyledString computeIdentifiedElementLabel(ItemProviderAdapter itemProviderAdapter, IdentifiedElement identifiedElement, String defaultLabelKey) { + String label = Optional.ofNullable(identifiedElement.getLabel()).orElse(""); //$NON-NLS-1$ + if (label.isEmpty()) { + label = Optional.ofNullable(identifiedElement.getName()).filter(id -> !id.isEmpty()).orElse(itemProviderAdapter.getString(defaultLabelKey)); + } + StyledString styledString = new StyledString(label); + + EStructuralFeature eStructuralFeature = identifiedElement.eClass().getEStructuralFeature("extends"); //$NON-NLS-1$ + if (eStructuralFeature instanceof EReference && identifiedElement.eIsSet(eStructuralFeature)) { + Object extendsValue = identifiedElement.eGet(eStructuralFeature); + styledString.append(" extends ", KEYWORD_STYLE); //$NON-NLS-1$ + styledString.append(Utils.computeSimpleLabel(itemProviderAdapter, extendsValue)); + } + + return styledString; + } + + /** + * Returns the label of the given object. + * + * @param itemProviderAdapter + * The Item Provider Adapter + * @param object + * The object + * @return Its Label + */ + private static String computeSimpleLabel(ItemProviderAdapter itemProviderAdapter, Object object) { + if (object instanceof IdentifiedElement) { + IdentifiedElement identifiedElement = (IdentifiedElement) object; + String label = Optional.ofNullable(identifiedElement.getLabel()).orElse(""); //$NON-NLS-1$ + if (label.isEmpty()) { + label = Optional.ofNullable(identifiedElement.getName()).filter(id -> !id.isEmpty()).orElse(itemProviderAdapter.getString("_UI_" + identifiedElement.eClass().getName() + "_type")); //$NON-NLS-1$ //$NON-NLS-2$ + } + return label; + } + return ""; //$NON-NLS-1$ + } + + /** + * Add default "Begin" operations with a no-op navigation to the specific element. + * + * @param child + * a newly created child. + */ + public static void addNoopNavigationOperations(Object child) { + if (child instanceof EObject) { + EObject obj = (EObject) child; + for (EReference ref : obj.eClass().getEAllReferences()) { + if (ref.isContainment() && ref.getEReferenceType() == ToolPackage.Literals.INITIAL_OPERATION) { + InitialOperation begin = ToolFactory.eINSTANCE.createInitialOperation(); + ChangeContext noop = ToolFactory.eINSTANCE.createChangeContext(); + noop.setBrowseExpression("var:self"); //$NON-NLS-1$ + begin.setFirstModelOperations(noop); + obj.eSet(ref, begin); + } + } + } + } +} diff --git a/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/WorkflowDescriptionItemProviderSpec.java b/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/WorkflowDescriptionItemProviderSpec.java new file mode 100644 index 0000000000..681519d6d5 --- /dev/null +++ b/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/WorkflowDescriptionItemProviderSpec.java @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2018 Obeo. + * 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: + * Obeo - initial API and implementation + * + */ +package org.eclipse.sirius.workflow.provider; + +import org.eclipse.emf.common.notify.AdapterFactory; +import org.eclipse.emf.edit.provider.StyledString; + +/** + * Subclass used to not have to modify the generated code. + * + * @author sbegaudeau + */ +public class WorkflowDescriptionItemProviderSpec extends WorkflowDescriptionItemProvider { + + /** + * The constructor. + * + * @param adapterFactory + * The adapter factory + */ + public WorkflowDescriptionItemProviderSpec(AdapterFactory adapterFactory) { + super(adapterFactory); + } + + @Override + public String getText(Object object) { + Object styledText = this.getStyledText(object); + if (styledText instanceof StyledString) { + return ((StyledString) styledText).getString(); + } + return super.getText(object); + } + + @Override + public Object getStyledText(Object object) { + return Utils.computeLabel(this, object, "_UI_WorkflowDescription_type"); //$NON-NLS-1$ + } + +} diff --git a/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/WorkflowItemProviderAdapterFactorySpec.java b/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/WorkflowItemProviderAdapterFactorySpec.java new file mode 100644 index 0000000000..e482620ce1 --- /dev/null +++ b/plugins/org.eclipse.sirius.workflow.edit/src-spec/org/eclipse/sirius/workflow/provider/WorkflowItemProviderAdapterFactorySpec.java @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2018 Obeo. + * 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: + * Obeo - initial API and implementation + * + */ +package org.eclipse.sirius.workflow.provider; + +import org.eclipse.emf.common.notify.Adapter; + +/** + * Subclass used to not have to modify the generated code. + * + * @author sbegaudeau + */ +public class WorkflowItemProviderAdapterFactorySpec extends WorkflowItemProviderAdapterFactory { + + @Override + public Adapter createWorkflowDescriptionAdapter() { + if (workflowDescriptionItemProvider == null) { + workflowDescriptionItemProvider = new WorkflowDescriptionItemProviderSpec(this); + } + + return workflowDescriptionItemProvider; + } + + @Override + public Adapter createPageDescriptionAdapter() { + if (pageDescriptionItemProvider == null) { + pageDescriptionItemProvider = new PageDescriptionItemProviderSpec(this); + } + + return pageDescriptionItemProvider; + } + + @Override + public Adapter createSectionDescriptionAdapter() { + if (sectionDescriptionItemProvider == null) { + sectionDescriptionItemProvider = new SectionDescriptionItemProviderSpec(this); + } + + return sectionDescriptionItemProvider; + } + + @Override + public Adapter createActivityDescriptionAdapter() { + if (activityDescriptionItemProvider == null) { + activityDescriptionItemProvider = new ActivityDescriptionItemProviderSpec(this); + } + + return activityDescriptionItemProvider; + } +} |