diff options
12 files changed, 131 insertions, 117 deletions
diff --git a/plugins/org.eclipse.gmf.codegen/templates/impl/parsers/ExpressionLabelParser.xpt b/plugins/org.eclipse.gmf.codegen/templates/impl/parsers/ExpressionLabelParser.xpt index 8cdeb0802..9eaae5046 100644 --- a/plugins/org.eclipse.gmf.codegen/templates/impl/parsers/ExpressionLabelParser.xpt +++ b/plugins/org.eclipse.gmf.codegen/templates/impl/parsers/ExpressionLabelParser.xpt @@ -12,35 +12,11 @@ «IMPORT 'http://www.eclipse.org/gmf/2009/GenModel'» -«DEFINE fields FOR gmfgen::ExpressionLabelParser-» -«IF not viewExpression.oclIsUndefined() and viewExpression.provider.oclIsKindOf(gmfgen::GenExpressionInterpreter)» - «EXPAND xpt::Common::generatedMemberComment» - private final «holder.editorGen.expressionProviders.getAbstractExpressionQualifiedClassName()» printExpression; -«ENDIF-» - -«IF not editExpression.oclIsUndefined() and editExpression.provider.oclIsKindOf(gmfgen::GenExpressionInterpreter)» - «EXPAND xpt::Common::generatedMemberComment» - private final «holder.editorGen.expressionProviders.getAbstractExpressionQualifiedClassName()» editExpression; -«ENDIF-» - -«IF not validateExpression.oclIsUndefined() and validateExpression.provider.oclIsKindOf(gmfgen::GenExpressionInterpreter)» - «EXPAND xpt::Common::generatedMemberComment» - private final «holder.editorGen.expressionProviders.getAbstractExpressionQualifiedClassName()» validateExpression; -«ENDIF-» -«ENDDEFINE» +«DEFINE fields FOR gmfgen::ExpressionLabelParser»«ENDDEFINE» «DEFINE cons(String name) FOR gmfgen::ExpressionLabelParser-» «EXPAND xpt::Common::generatedMemberComment» public «name»() { - «IF not viewExpression.oclIsUndefined() and viewExpression.provider.oclIsKindOf(gmfgen::GenExpressionInterpreter)-» - this.printExpression = «EXPAND xpt::expressions::getExpression::getExpression(viewExpression, self.expressionContext) FOR viewExpression.provider.oclAsType(gmfgen::GenExpressionInterpreter)»;«EXPAND xpt::Common::nonNLS» - «ENDIF-» - «IF not editExpression.oclIsUndefined() and editExpression.provider.oclIsKindOf(gmfgen::GenExpressionInterpreter)-» - this.editExpression = «EXPAND xpt::expressions::getExpression::getExpression(editExpression, self.expressionContext) FOR editExpression.provider.oclAsType(gmfgen::GenExpressionInterpreter)»;«EXPAND xpt::Common::nonNLS» - «ENDIF-» - «IF not validateExpression.oclIsUndefined() and validateExpression.provider.oclIsKindOf(gmfgen::GenExpressionInterpreter)-» - this.validateExpression = «EXPAND xpt::expressions::getExpression::getExpression(validateExpression, 'org.eclipse.emf.ecore.EcorePackage.eINSTANCE.getEString()') FOR validateExpression.provider.oclAsType(gmfgen::GenExpressionInterpreter)»;«EXPAND xpt::Common::nonNLS» - «ENDIF-» } «ENDDEFINE» @@ -48,7 +24,7 @@ «IF editExpression.oclIsUndefined()-» return getPrintString(element, flags); «ELSE-» -«EXPAND _evaluateAndReturnExpressionResult('this.editExpression', 'evaluateEditExpression', editExpression) FOR editExpression.provider-» +«EXPAND _evaluateAndReturnExpressionResult(self, 'evaluateEditExpression', editExpression) FOR editExpression.provider-» «ENDIF-» «ENDDEFINE» @@ -57,27 +33,29 @@ // TODO throw new UnsupportedOperationException(); «ELSE-» -«EXPAND _evaluateAndReturnExpressionResult('this.printExpression', 'evaluatePrintExpression', viewExpression) FOR viewExpression.provider-» +«EXPAND _evaluateAndReturnExpressionResult(self, 'evaluatePrintExpression', viewExpression) FOR viewExpression.provider-» «ENDIF-» «ENDDEFINE» -«DEFINE _evaluateAndReturnExpressionResult(String expressionFieldName, String javaMethodName, ValueExpression expression) FOR gmfgen::GenExpressionProviderBase»«ERROR 'Abstract template call: _evaluateAndReturnExpressionResult'»«ENDDEFINE» -«DEFINE _evaluateAndReturnExpressionResult(String expressionFieldName, String javaMethodName, ValueExpression expression) FOR gmfgen::GenExpressionInterpreter-» +«DEFINE _evaluateAndReturnExpressionResult(gmfgen::ExpressionLabelParser parser, String javaMethodName, ValueExpression expression) FOR gmfgen::GenExpressionProviderBase»«ERROR 'Abstract template call: _evaluateAndReturnExpressionResult'»«ENDDEFINE» +«DEFINE _evaluateAndReturnExpressionResult(gmfgen::ExpressionLabelParser parser, String javaMethodName, ValueExpression expression) FOR gmfgen::GenExpressionInterpreter-» org.eclipse.emf.ecore.EObject target = (org.eclipse.emf.ecore.EObject) element.getAdapter(org.eclipse.emf.ecore.EObject.class); -Object result = «expressionFieldName».evaluate(target); +Object result = «EXPAND xpt::expressions::getExpression::getExpression(expression, parser.expressionContext)».evaluate(target); return String.valueOf(result); «ENDDEFINE» -«DEFINE _evaluateAndReturnExpressionResult(String expressionFieldName, String javaMethodName, ValueExpression expression) FOR gmfgen::GenJavaExpressionProvider-» +«DEFINE _evaluateAndReturnExpressionResult(gmfgen::ExpressionLabelParser parser, String javaMethodName, ValueExpression expression) FOR gmfgen::GenJavaExpressionProvider-» return «javaMethodName»((org.eclipse.emf.ecore.EObject) element.getAdapter(org.eclipse.emf.ecore.EObject.class)); «ENDDEFINE» -«DEFINE _evaluateAndReturnExpressionResult(String expressionFieldName, String javaMethodName, ValueExpression expression) FOR gmfgen::GenLiteralExpressionProvider-» +«DEFINE _evaluateAndReturnExpressionResult(gmfgen::ExpressionLabelParser parser, String javaMethodName, ValueExpression expression) FOR gmfgen::GenLiteralExpressionProvider-» return «expression.body»; «ENDDEFINE» «DEFINE accessValidateExpression FOR gmfgen::ExpressionLabelParser-» «IF not validateExpression.oclIsUndefined() -» - if («IF validateExpression.provider.getLanguage() = gmfgen::GenLanguage::_literal»!«validateExpression.body»«ELSE»Boolean.FALSE.equals(«IF validateExpression.provider.oclIsKindOf(gmfgen::GenExpressionInterpreter)»this.validateExpression.evaluate(editString)«ELSEIF validateExpression.provider.oclIsKindOf(gmfgen::GenJavaExpressionProvider)»evaluateValidateExpression(editString)«ENDIF»)«ENDIF») { + if («IF validateExpression.provider.getLanguage() = gmfgen::GenLanguage::_literal»!«validateExpression.body»«ELSE-» + Boolean.FALSE.equals(«IF validateExpression.provider.oclIsKindOf(gmfgen::GenExpressionInterpreter)»«EXPAND xpt::expressions::getExpression::getExpression(validateExpression, 'org.eclipse.emf.ecore.EcorePackage.eINSTANCE.getEString()') FOR validateExpression.provider.oclAsType(gmfgen::GenExpressionInterpreter)».evaluate(editString)«-» + «ELSEIF validateExpression.provider.oclIsKindOf(gmfgen::GenJavaExpressionProvider)»evaluateValidateExpression(editString)«ENDIF»)«ENDIF») { return org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus.UNEDITABLE_STATUS; } // else fall-through «ENDIF-» diff --git a/plugins/org.eclipse.gmf.codegen/templates/xpt/editor/VisualIDRegistry.xpt b/plugins/org.eclipse.gmf.codegen/templates/xpt/editor/VisualIDRegistry.xpt index a73432be0..9cc52d40c 100644 --- a/plugins/org.eclipse.gmf.codegen/templates/xpt/editor/VisualIDRegistry.xpt +++ b/plugins/org.eclipse.gmf.codegen/templates/xpt/editor/VisualIDRegistry.xpt @@ -88,11 +88,6 @@ public class «visualIDRegistryClassName» { «DEFINE attributes FOR gmfgen::GenDiagram-» «EXPAND xpt::Common::generatedMemberComment» private static final String DEBUG_KEY = "«editorGen.plugin.iD»/debug/visualID"; «EXPAND xpt::Common::nonNLS» -«IF null <> editorGen.expressionProviders-» - «EXPAND _constraintField FOREACH topLevelNodes-» - «EXPAND _constraintField FOREACH childNodes-» - «EXPAND _constraintField FOREACH links-» -«ENDIF-» «ENDDEFINE» «DEFINE getViewVisualID FOR gmfgen::GenDiagram-» @@ -314,7 +309,7 @@ private static boolean isDiagram(«EXPAND MetaModel::QualifiedClassName FOR doma «IF null <> editorGen.expressionProviders-» «EXPAND _constraintMethod FOREACH topLevelNodes->select(n | n.modelFacet.modelElementSelector <> null)-» «EXPAND _constraintMethod FOREACH childNodes->select(n | n.modelFacet.modelElementSelector <> null)-» - «FOREACH links->asSequence() AS l»«EXPAND _constraintMethod(l) FOR l.modelFacet»«ENDFOREACH» + «FOREACH links AS l»«EXPAND _constraintMethod(l) FOR l.modelFacet»«ENDFOREACH» «ENDIF-» «ENDDEFINE» @@ -347,34 +342,15 @@ private static boolean isDiagram(«EXPAND MetaModel::QualifiedClassName FOR doma } «ENDDEFINE» +// FIXME move these methods to ElementInitializers or any other more suitable place «DEFINE _domainElementConstraintMethod(diagramElement : gmfgen::GenCommonBase, expression : gmfgen::ValueExpression, context : genmodel::GenClass) FOR gmfgen::GenExpressionInterpreter-» «EXPAND xpt::Common::generatedMemberComment» private static boolean «EXPAND _domainElementConstraintMethodName FOR diagramElement»(«EXPAND MetaModel::QualifiedClassName FOR context» domainElement) { - if («constraintFieldName(diagramElement)» == null) { // lazy initialization - «constraintFieldName(diagramElement)» = «EXPAND xpt::expressions::getExpression::getExpression(expression, context)»; «EXPAND xpt::Common::nonNLS» - } - Object result = «constraintFieldName(diagramElement)».evaluate(domainElement); + Object result = «EXPAND xpt::expressions::getExpression::getExpression(expression, context)».evaluate(domainElement); return result instanceof Boolean && ((Boolean)result).booleanValue(); } «ENDDEFINE» - -«DEFINE _constraintField FOR gmfgen::GenNode»«EXPAND _constraintField(self) FOR modelFacet»«ENDDEFINE» -«DEFINE _constraintField FOR gmfgen::GenLink»«EXPAND _constraintField(self) FOR modelFacet»«ENDDEFINE» - -«DEFINE _constraintField(diagramElement : gmfgen::GenCommonBase) FOR gmfgen::ModelFacet»«ENDDEFINE» -«DEFINE _constraintField(diagramElement : gmfgen::GenCommonBase) FOR gmfgen::TypeModelFacet-» -«IF modelElementSelector <> null»«EXPAND _constraintField(diagramElement) FOR modelElementSelector.provider»«ENDIF-» -«ENDDEFINE» - -«DEFINE _constraintField(diagramElement : gmfgen::GenCommonBase) FOR gmfgen::GenExpressionInterpreter» - «EXPAND xpt::Common::generatedMemberComment» - private static «container.getAbstractExpressionQualifiedClassName()» «constraintFieldName(diagramElement)»; -«ENDDEFINE» - -«DEFINE _constraintField(diagramElement : gmfgen::GenCommonBase) FOR gmfgen::GenExpressionProviderBase»«ERROR 'Need to define approach to constraint fields for ' + self.repr()»«ENDDEFINE» -«DEFINE _constraintField(diagramElement : gmfgen::GenCommonBase) FOR gmfgen::GenJavaExpressionProvider»«ENDDEFINE»// IOW, no fields for Java - «REM» Constraints support end. «ENDREM» diff --git a/plugins/org.eclipse.gmf.codegen/templates/xpt/expressions/OCLExpressionFactory.xpt b/plugins/org.eclipse.gmf.codegen/templates/xpt/expressions/OCLExpressionFactory.xpt index 5473d6bc0..1aa27c046 100755 --- a/plugins/org.eclipse.gmf.codegen/templates/xpt/expressions/OCLExpressionFactory.xpt +++ b/plugins/org.eclipse.gmf.codegen/templates/xpt/expressions/OCLExpressionFactory.xpt @@ -19,16 +19,14 @@ package «container.expressionsPackageName»; «EXPAND xpt::Common::generatedClassComment» public class «className» { - «EXPAND xpt::Common::generatedMemberComment» - private «className»() { - } + «EXPAND _initInterpreterFactory» «EXPAND xpt::Common::generatedMemberComment» public static «container.getAbstractExpressionQualifiedClassName()» getExpression(String body, org.eclipse.emf.ecore.EClassifier context, java.util.Map«EXPAND CodeStyle::G2('String', 'org.eclipse.emf.ecore.EClassifier') FOR container.editorGen.diagram» environment) { return new Expression(body, context, environment); } - «EXPAND xpt::Common::generatedMemberComment» + «EXPAND xpt::Common::generatedMemberComment('This method will become private in the next release')»«REM»FIXME private or completely remove in the next release «ENDREM» public static «container.getAbstractExpressionQualifiedClassName()» getExpression(String body, org.eclipse.emf.ecore.EClassifier context) { return getExpression(body, context, «EXPAND CodeStyle::emptyMap('String, org.eclipse.emf.ecore.EClassifier') FOR container.editorGen.diagram»); } @@ -113,3 +111,33 @@ org.eclipse.ocl.options.ParsingOptions.setOption(«environmentVar», org.eclipse «ENDDEFINE» «DEFINE additions FOR gmfgen::GenExpressionInterpreter»«ENDDEFINE» + +// just to avoid identical piece of template in the RegexpExpressionFactory +«DEFINE _initInterpreterFactory FOR gmfgen::GenExpressionInterpreter-» + «EXPAND xpt::Common::generatedMemberComment» + private final «container.getAbstractExpressionQualifiedClassName()»[] expressions; + + «EXPAND xpt::Common::generatedMemberComment» + protected «className»() { + this.expressions = new «container.getAbstractExpressionQualifiedClassName()»[«expressions->size()»]; + } + + «EXPAND xpt::Common::generatedMemberComment» + public static «container.getAbstractExpressionQualifiedClassName()» getExpression(int index, org.eclipse.emf.ecore.EClassifier context) { + «className» cached = «EXPAND plugin::Activator::instanceAccess FOR container.editorGen».get«className»(); + if (cached == null) { + «EXPAND plugin::Activator::instanceAccess FOR container.editorGen».set«className»(cached = new «className»()); + } + if (index < 0 || index >= cached.expressions.length) { + throw new IllegalArgumentException(); + } + if (cached.expressions[index] == null) { + final String[] exprBodies = new String[] { + «FOREACH expressions.getBodyString() AS b»«b», «EXPAND xpt::Common::nonNLS» + «ENDFOREACH-» + }; + cached.expressions[index] = getExpression(exprBodies[index], context); + } + return cached.expressions[index]; + } +«ENDDEFINE»
\ No newline at end of file diff --git a/plugins/org.eclipse.gmf.codegen/templates/xpt/expressions/RegexpExpressionFactory.xpt b/plugins/org.eclipse.gmf.codegen/templates/xpt/expressions/RegexpExpressionFactory.xpt index bed2d4d85..a42c198c0 100755 --- a/plugins/org.eclipse.gmf.codegen/templates/xpt/expressions/RegexpExpressionFactory.xpt +++ b/plugins/org.eclipse.gmf.codegen/templates/xpt/expressions/RegexpExpressionFactory.xpt @@ -19,16 +19,14 @@ package «container.expressionsPackageName»; «EXPAND xpt::Common::generatedClassComment» public class «className» { - «EXPAND xpt::Common::generatedMemberComment» - private «className»() { - } + «EXPAND xpt::expressions::OCLExpressionFactory::_initInterpreterFactory» «EXPAND xpt::Common::generatedMemberComment» public static «container.getAbstractExpressionQualifiedClassName()» getExpression(String body, org.eclipse.emf.ecore.EClassifier context, java.util.Map«EXPAND CodeStyle::G2('String', 'org.eclipse.emf.ecore.EClassifier') FOR container.editorGen.diagram» environment) { return new Expression(body, context, environment); } - «EXPAND xpt::Common::generatedMemberComment» + «EXPAND xpt::Common::generatedMemberComment('This method will become private in the next release')»«REM»FIXME private or completely remove in the next release «ENDREM» public static «container.getAbstractExpressionQualifiedClassName()» getExpression(String body, org.eclipse.emf.ecore.EClassifier context) { return getExpression(body, context, «EXPAND CodeStyle::emptyMap('String, org.eclipse.emf.ecore.EClassifier') FOR container.editorGen.diagram»); } diff --git a/plugins/org.eclipse.gmf.codegen/templates/xpt/expressions/ValueExpression.qvto b/plugins/org.eclipse.gmf.codegen/templates/xpt/expressions/ValueExpression.qvto index 9389b45d2..028c4b8a7 100644 --- a/plugins/org.eclipse.gmf.codegen/templates/xpt/expressions/ValueExpression.qvto +++ b/plugins/org.eclipse.gmf.codegen/templates/xpt/expressions/ValueExpression.qvto @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009 Borland Software Corporation + * Copyright (c) 2008, 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 @@ -14,9 +14,8 @@ modeltype gmfgen uses "http://www.eclipse.org/gmf/2009/GenModel"; library ValueExpression; -helper constraintFieldName(cb : gmfgen::GenCommonBase) : String { - return cb.getUniqueIdentifier() + '_Constraint' -} +// next two methods are likely to be removed soon as well +// (once we completely support expression caching inside factory helper sourceConstraintFieldName(l : gmfgen::GenLink) : String { return l.getUniqueIdentifier() + '_SourceExpression' diff --git a/plugins/org.eclipse.gmf.codegen/templates/xpt/expressions/getExpression.xpt b/plugins/org.eclipse.gmf.codegen/templates/xpt/expressions/getExpression.xpt index 98de181ed..7d34c03c5 100644 --- a/plugins/org.eclipse.gmf.codegen/templates/xpt/expressions/getExpression.xpt +++ b/plugins/org.eclipse.gmf.codegen/templates/xpt/expressions/getExpression.xpt @@ -14,12 +14,12 @@ «IMPORT 'http://www.eclipse.org/emf/2002/GenModel'» «DEFINE getExpression(gmfgen::ValueExpression valueExpr, genmodel::GenClassifier context) FOR gmfgen::GenExpressionInterpreter-» -«getQualifiedClassName()».«getExpressionAccessor(valueExpr)»(«valueExpr.getBodyString()», «EXPAND MetaModel::MetaClass FOR context»)«-» +«getQualifiedClassName()».«getExpressionAccessor(valueExpr)»(«expressions->indexOf(valueExpr) - 1», «EXPAND MetaModel::MetaClass FOR context»)«-» «ENDDEFINE» // occasionally we need to use some well-known context type, i.e. String «DEFINE getExpression(gmfgen::ValueExpression valueExpr, String contextMetaClassifier) FOR gmfgen::GenExpressionInterpreter-» -«getQualifiedClassName()».«getExpressionAccessor(valueExpr)»(«valueExpr.getBodyString()», «contextMetaClassifier»)«-» +«getQualifiedClassName()».«getExpressionAccessor(valueExpr)»(«expressions->indexOf(valueExpr) - 1», «contextMetaClassifier»)«-» «ENDDEFINE» // pass specific environment to obtain expression diff --git a/plugins/org.eclipse.gmf.codegen/templates/xpt/plugin/Activator.xpt b/plugins/org.eclipse.gmf.codegen/templates/xpt/plugin/Activator.xpt index cdddeab1c..379ee79d1 100644 --- a/plugins/org.eclipse.gmf.codegen/templates/xpt/plugin/Activator.xpt +++ b/plugins/org.eclipse.gmf.codegen/templates/xpt/plugin/Activator.xpt @@ -40,6 +40,17 @@ public class «activatorClassName» extends org.eclipse.ui.plugin.AbstractUIPlug private «editorGen.diagram.getLinkCreationConstraintsQualifiedClassName()» linkConstraints; «ENDIF-» + + «EXPAND xpt::Common::generatedMemberComment» + private «editorGen.diagram.getElementInitializersPackageName()».«editorGen.diagram.getElementInitializersClassName()» initializers; + +«IF not editorGen.expressionProviders.oclIsUndefined() -» +«FOREACH editorGen.expressionProviders.providers[gmfgen::GenExpressionInterpreter] AS p-» + «EXPAND xpt::Common::generatedMemberComment» + private «p.getQualifiedClassName()» «p.language»Factory; +«ENDFOREACH-» +«ENDIF-» + «EXPAND xpt::Common::generatedMemberComment» public «activatorClassName»() { } @@ -58,7 +69,13 @@ public class «activatorClassName» extends org.eclipse.ui.plugin.AbstractUIPlug adapterFactory = null; «IF editorGen.diagram.links->exists(not sansDomain)-» linkConstraints = null; -«ENDIF-» +«ENDIF-» + initializers = null; +«IF not editorGen.expressionProviders.oclIsUndefined() -» +«FOREACH editorGen.expressionProviders.providers[gmfgen::GenExpressionInterpreter] AS p-» + «p.language»Factory = null; +«ENDFOREACH-» +«ENDIF-» instance = null; super.stop(context); } @@ -178,6 +195,31 @@ public class «activatorClassName» extends org.eclipse.ui.plugin.AbstractUIPlug «ENDIF-» «EXPAND xpt::Common::generatedMemberComment» + public «editorGen.diagram.getElementInitializersPackageName()».«editorGen.diagram.getElementInitializersClassName()» getElementInitializers() { + return initializers; + } + + «EXPAND xpt::Common::generatedMemberComment» + public void setElementInitializers(«editorGen.diagram.getElementInitializersPackageName()».«editorGen.diagram.getElementInitializersClassName()» i) { + this.initializers = i; + } + +«IF not editorGen.expressionProviders.oclIsUndefined() -» +«FOREACH editorGen.expressionProviders.providers[gmfgen::GenExpressionInterpreter] AS p-» + «EXPAND xpt::Common::generatedMemberComment» + public «p.getQualifiedClassName()» get«p.className»() { + return «p.language»Factory; + } + + «EXPAND xpt::Common::generatedMemberComment» + public void set«p.className»(«p.getQualifiedClassName()» f) { + this.«p.language»Factory = f; + } + +«ENDFOREACH-» +«ENDIF-» + + «EXPAND xpt::Common::generatedMemberComment» public void logError(String error) { logError(error, null); } diff --git a/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/ElementInitializers.xpt b/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/ElementInitializers.xpt index cbef1b472..9d79955b5 100644 --- a/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/ElementInitializers.xpt +++ b/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/ElementInitializers.xpt @@ -20,15 +20,31 @@ «EXTENSION xpt::GenModelUtils» «EXTENSION gmf::GenModelUtils» +// XXX should generate this class only when there is initialization logic defined in the model + «DEFINE ElementInitializers FOR gmfgen::GenDiagram-» «EXPAND xpt::Common::copyright FOR editorGen-» -package «providersPackageName»; +package «getElementInitializersPackageName()»; «EXPAND xpt::Common::generatedClassComment» -public class ElementInitializers { +public class «getElementInitializersClassName()» { + + protected «getElementInitializersClassName()»() { + // use #getInstance to access cached instance + } + «EXPAND Initializers» «EXPAND JavaSupport» «EXPAND additions-» + + «EXPAND xpt::Common::generatedMemberComment» + public static «getElementInitializersClassName()» getInstance() { + «getElementInitializersClassName()» cached = «EXPAND plugin::Activator::instanceAccess FOR editorGen».getElementInitializers(); + if (cached == null) { + «EXPAND plugin::Activator::instanceAccess FOR editorGen».setElementInitializers(cached = new «getElementInitializersClassName()»()); + } + return cached; + } } «ENDDEFINE» @@ -65,9 +81,9 @@ public class ElementInitializers { «DEFINE initMethod(diagramElement : gmfgen::GenCommonBase) FOR gmfgen::GenFeatureSeqInitializer-» «EXPAND xpt::Common::generatedMemberComment» - public static void init_«diagramElement.getUniqueIdentifier()»(«EXPAND MetaModel::QualifiedClassName FOR elementClass» instance) { + public void init_«diagramElement.getUniqueIdentifier()»(«EXPAND MetaModel::QualifiedClassName FOR elementClass» instance) { try { - «FOREACH initializers->asSequence() AS i»«EXPAND performInit(diagramElement, 'instance', elementClass, getSuffixes((initializers->indexOf(i) - 1))) FOR i»«ENDFOREACH-» + «FOREACH initializers AS i»«EXPAND performInit(diagramElement, 'instance', elementClass, getSuffixes((initializers->indexOf(i) - 1))) FOR i»«ENDFOREACH-» } catch(RuntimeException e) { «diagramElement.getDiagram().editorGen.plugin.getActivatorQualifiedClassName()».getInstance().logError("Element initialization failed", e); //$NON-NLS-1$ } @@ -113,12 +129,12 @@ public class ElementInitializers { «ENDDEFINE» «DEFINE performInit(diagramElement : gmfgen::GenCommonBase, instanceVar : String, instanceClass : genmodel::GenClass, counters : Sequence(Integer)) FOR gmfgen::GenReferenceNewElementSpec-» -«FOREACH newElementInitializers->asSequence() AS newElemInit-» +«FOREACH newElementInitializers AS newElemInit-» «LET getSuffixes(counters, (newElementInitializers->indexOf(newElemInit) - 1)) AS initializerCounters-» «LET getVariableName('newInstance', initializerCounters) AS newInstanceVar-» «EXPAND MetaModel::NewInstance(newInstanceVar) FOR newElemInit.elementClass-» «EXPAND MetaModel::modifyFeature(instanceVar, instanceClass, newInstanceVar) FOR feature» -«FOREACH newElemInit.initializers->asSequence() AS i»«EXPAND performInit(diagramElement, newInstanceVar, newElemInit.elementClass, getSuffixes(initializerCounters, (newElemInit.initializers->indexOf(i) - 1))) FOR i»«ENDFOREACH» +«FOREACH newElemInit.initializers AS i»«EXPAND performInit(diagramElement, newInstanceVar, newElemInit.elementClass, getSuffixes(initializerCounters, (newElemInit.initializers->indexOf(i) - 1))) FOR i»«ENDFOREACH» «ENDLET-» «ENDLET-» «ENDFOREACH-» @@ -128,10 +144,7 @@ public class ElementInitializers { «DEFINE evaluateExpr(diagramElement : gmfgen::GenCommonBase, valueExpr : gmfgen::GenFeatureValueSpec, instanceVar : String) FOR gmfgen::GenExpressionProviderBase»«ENDDEFINE» -// XXX perhaps, using instance.eClass() is better option than MetaModel::MetaClass (though, need to rely on instance variable name/type) -// FIXME - creating new expression each time we need to initialize an element is not very efficient (e.g. OCLFactory.getExpression()). -// Perhaps, factory implementation should be changed instead, to keep all optimization in a single place? -«DEFINE evaluateExpr(diagramElement : gmfgen::GenCommonBase, valueExpr : gmfgen::GenFeatureValueSpec, instanceVar : String) FOR gmfgen::GenExpressionInterpreter-» +«DEFINE evaluateExpr(gmfgen::GenCommonBase diagramElement, gmfgen::GenFeatureValueSpec valueExpr, String instanceVar) FOR gmfgen::GenExpressionInterpreter-» «EXPAND xpt::expressions::getExpression::getExpression(valueExpr.value, valueExpr.featureSeqInitializer.elementClass)».evaluate(«instanceVar»)«-» «ENDDEFINE» @@ -162,7 +175,7 @@ public class ElementInitializers { «DEFINE javaMethod(diagramElement : gmfgen::GenCommonBase, vs : gmfgen::GenFeatureValueSpec) FOR gmfgen::GenExpressionProviderBase-»«ENDDEFINE» «DEFINE javaMethod(diagramElement : gmfgen::GenCommonBase, vs : gmfgen::GenFeatureValueSpec) FOR gmfgen::GenJavaExpressionProvider-» «EXPAND xpt::Common::generatedMemberComment» - private static «EXPAND MetaModel::featureTargetType FOR vs.feature» «javaMethodName(diagramElement, vs)»(«EXPAND MetaModel::QualifiedClassName FOR vs.featureSeqInitializer.elementClass» self) { + private «EXPAND MetaModel::featureTargetType FOR vs.feature» «javaMethodName(diagramElement, vs)»(«EXPAND MetaModel::QualifiedClassName FOR vs.featureSeqInitializer.elementClass» self) { «IF injectExpressionBody and (vs.value.body <> null and vs.value.body.size() <> 0)-» «vs.value.body» «ELSEIF throwException or (injectExpressionBody and (vs.value.body = null or vs.value.body.size() = 0))-» @@ -174,4 +187,11 @@ public class ElementInitializers { return null; «ENDIF-» } +«ENDDEFINE» + +// GenLink or GenNode +«DEFINE initMethodCall(gmfgen::TypeModelFacet modelFacet, String newElementVar) FOR gmfgen::GenCommonBase-» +«IF modelFacet.modelElementInitializer <> null -» +«getDiagram().getElementInitializersPackageName()».«getDiagram().getElementInitializersClassName()».getInstance().init_«getUniqueIdentifier()»(«newElementVar»); +«ENDIF-» «ENDDEFINE»
\ No newline at end of file diff --git a/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/ElementTypes.xpt b/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/ElementTypes.xpt index aa75db597..6012c104a 100644 --- a/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/ElementTypes.xpt +++ b/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/ElementTypes.xpt @@ -19,7 +19,7 @@ package «providersPackageName»; «EXPAND xpt::Common::generatedClassComment» -public class «elementTypesClassName» extends ElementInitializers { +public class «elementTypesClassName» { «EXPAND _constructor-» diff --git a/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/MetricProvider.xpt b/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/MetricProvider.xpt index 164cf2be2..1c620ce63 100755 --- a/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/MetricProvider.xpt +++ b/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/MetricProvider.xpt @@ -66,7 +66,6 @@ public class «metricProviderClassName» { «EXPAND keysAndToolTipsMethods FOR editorGen.metrics» -«EXPAND metricCalcField FOREACH editorGen.metrics.metrics->select(m | m.rule <> null and (m.target <> null and m.target.getContext() <> null))» «EXPAND metricCalcMethod FOREACH editorGen.metrics.metrics->select(m | m.rule <> null and (m.target <> null and m.target.getContext() <> null))» «EXPAND MetricsResultView::Class» @@ -359,14 +358,10 @@ public class «metricProviderClassName» { «REM»Note, use of QualifiedClassName here assumes it always works the same for the notation model, regardless of 'dynamic model' use (i.e. always gives qName of oeg.runtime.notation.* Java class)«ENDREM» «DEFINE calcMethodArgs(metric : gmfgen::GenMetricRule) FOR gmfgen::GenNotationElementTarget»«EXPAND MetaModel::QualifiedClassName FOR element» target«ENDDEFINE» - «DEFINE calcMethodBody(metric : gmfgen::GenMetricRule) FOR gmfgen::GenExpressionProviderBase»«ERROR 'No idea how to calculate metric\'s value for ' + self.repr()»«ENDDEFINE» «DEFINE calcMethodBody(metric : gmfgen::GenMetricRule) FOR gmfgen::GenExpressionInterpreter-» - if («exprFieldName(metric)» == null) { - «exprFieldName(metric)» = «EXPAND xpt::expressions::getExpression::getExpression(metric.rule, metric.target.getContext())»; - } - Object val = «exprFieldName(metric)».evaluate(target); + Object val = «EXPAND xpt::expressions::getExpression::getExpression(metric.rule, metric.target.getContext())».evaluate(target); if (val instanceof Number) { return val.getClass() == Double.class ? (Double) val : new Double(((Number) val).doubleValue()); } @@ -385,16 +380,6 @@ public class «metricProviderClassName» { «ENDIF-» «ENDDEFINE» -«DEFINE metricCalcField FOR gmfgen::GenMetricRule-» -«EXPAND metricCalcField(self) FOR rule.provider-» -«ENDDEFINE» - -«DEFINE metricCalcField(metric : gmfgen::GenMetricRule) FOR gmfgen::GenExpressionProviderBase»«REM»NO-OP«ENDREM»«ENDDEFINE» -«DEFINE metricCalcField(metric : gmfgen::GenMetricRule) FOR gmfgen::GenExpressionInterpreter-» - «EXPAND xpt::Common::generatedMemberComment» - private static«REM»FIXME: refactor to get rid of static fields«ENDREM» «container.getAbstractExpressionQualifiedClassName()» «exprFieldName(metric)»; -«ENDDEFINE» - «DEFINE invokeCalcMethod(accessor : String, isSpecific : Boolean) FOR gmfgen::GenMetricRule» «container.editorGen.diagram.getMetricProviderQualifiedClassName()».«calcMethodName(self)»(«IF not isSpecific /*CastEObject would be better, however need GenClassifier*/»(«EXPAND MetaModel::QualifiedClassName FOR target.getContext()») «ENDIF»«accessor»)«ENDDEFINE» diff --git a/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/Metrics.qvto b/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/Metrics.qvto index 15303b925..b4eead6ca 100644 --- a/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/Metrics.qvto +++ b/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/Metrics.qvto @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009 Borland Software Corporation + * Copyright (c) 2008, 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 @@ -31,10 +31,6 @@ helper getDomainMetrics(c : gmfgen::GenMetricContainer) : Sequence(gmfgen::GenMe return c.metrics->asSequence()->select(target.oclIsKindOf(gmfgen::GenDomainElementTarget)) } -helper exprFieldName(m : gmfgen::GenMetricRule) : String { - return 'expression' + validJavaIdentifier(m.key).firstToUpper() -} - helper calcMethodName(m : gmfgen::GenMetricRule) : String { return 'calc' + validJavaIdentifier(m.key).firstToUpper() } diff --git a/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/ValidationProvider.xpt b/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/ValidationProvider.xpt index 0272747e6..78d48a337 100755 --- a/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/ValidationProvider.xpt +++ b/plugins/org.eclipse.gmf.codegen/templates/xpt/providers/ValidationProvider.xpt @@ -234,11 +234,6 @@ static boolean isInDefaultEditorContext(Object object) { «EXPAND xpt::Common::generatedMemberComment» public static class «getConstraintAdapterLocalClassName()» extends org.eclipse.emf.validation.AbstractModelConstraint { -«IF rule.provider.getLanguage() <> gmfgen::GenLanguage::java-» - «EXPAND xpt::Common::generatedMemberComment» - private «container.getAbstractExpressionQualifiedClassName()» expression; - -«ENDIF-» «EXPAND xpt::Common::generatedMemberComment» public org.eclipse.core.runtime.IStatus validate(org.eclipse.emf.validation.IValidationContext ctx) { «EXPAND constraintAdapter_initContext(self) FOR target-» @@ -262,10 +257,7 @@ static boolean isInDefaultEditorContext(Object object) { «DEFINE constraintAdapter_validateMethod(audit : gmfgen::GenAuditRule) FOR gmfgen::GenExpressionProviderBase»«ERROR 'No idea how to evaluate an audit rule for ' + self.repr()»«ENDDEFINE» «DEFINE constraintAdapter_validateMethod(audit : gmfgen::GenAuditRule) FOR gmfgen::GenExpressionInterpreter-» - if (expression == null) { - expression = «EXPAND xpt::expressions::getExpression::getExpression(audit.rule, audit.target.getContext())»; - } - Object result = expression.evaluate(context); + Object result = «EXPAND xpt::expressions::getExpression::getExpression(audit.rule, audit.target.getContext())».evaluate(context); if (result instanceof Boolean && ((Boolean) result).booleanValue()) { return org.eclipse.core.runtime.Status.OK_STATUS;«REM»XXX why not ctx.createSuccessStatus()???«ENDREM» } |