blob: 589dfa7167fae0f06a65540bd465e8e77f56d093 [file] [log] [blame]
/*
* Copyright (c) 2007, 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
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Alexander Shatalin (Borland) - initial API and implementation
* Michael Golubev (Borland) - [243151] explicit source/target for links
*/
«IMPORT 'http://www.eclipse.org/gmf/2009/GenModel'»
«EXTENSION xpt::diagram::updater::Utils»
«EXTENSION xpt::GenModelUtils»
«EXTENSION gmf::GenModelUtils»
«DEFINE DiagramUpdater FOR gmfgen::GenDiagramUpdater
«EXPAND xpt::Common::copyright FOR editorGen
package «editorGen.editor.packageName»;
«EXPAND xpt::Common::generatedClassComment»
public class «diagramUpdaterClassName» {
«EXPAND isShortcutOrphaned
«LET editorGen.diagram.getAllContainers()->select(container | hasSemanticChildren(container))->asSequence() AS semanticContainers
«EXPAND getGenericSemanticChildrenOfView(semanticContainers)-»
«EXPAND getSemanticChildrenOfView FOREACH semanticContainers
«EXPAND getPhantomNodesIterator
«ENDLET
«EXPAND getGenericConnectedLinks(getAllSemanticElements(editorGen.diagram), getContainedLinksMethodNameSuffix())-»
«EXPAND getGenericConnectedLinks(getAllSemanticDiagramElements(editorGen.diagram), getIncomingLinksMethodNameSuffix())-»
«EXPAND getGenericConnectedLinks(getAllSemanticDiagramElements(editorGen.diagram), getOutgoingLinksMethodNameSuffix())-»
«EXPAND getContainedLinks FOREACH getAllSemanticElements(editorGen.diagram)-»
«EXPAND getIncomingLinks FOREACH getAllSemanticDiagramElements(editorGen.diagram)-»
«EXPAND getOutgoingLinks FOREACH getAllSemanticDiagramElements(editorGen.diagram)-»
«EXPAND getContainedLinksByTypeMethod FOREACH getAllContainedLinks(editorGen.diagram)-»
«EXPAND getIncomingLinksByTypeMethod FOREACH getAllIncomingLinks(editorGen.diagram)-»
«EXPAND getOutgoingLinksByTypeMethod FOREACH getAllOutgoingLinks(editorGen.diagram)-»
«EXPAND additions
}
«ENDDEFINE»
«REM»
Currently shortcuts are supported only for domain-based diagram element.
This means, view.isSetElement() == true.
«ENDREM»
«DEFINE isShortcutOrphaned FOR gmfgen::GenDiagramUpdater
«IF not editorGen.diagram.containsShortcutsTo->isEmpty()-»
«EXPAND xpt::Common::generatedMemberComment»
public static boolean isShortcutOrphaned(org.eclipse.gmf.runtime.notation.View view) {
return !view.isSetElement() || view.getElement() == null || view.getElement().eIsProxy();
}
«ENDIF
«ENDDEFINE»
«DEFINE getGenericSemanticChildrenOfView(semanticContainers : Sequence(gmfgen::GenContainerBase)) FOR gmfgen::GenDiagramUpdater
«EXPAND xpt::Common::generatedMemberComment»
public static «EXPAND CodeStyle::G('java.util.List', getNodeDescriptorQualifiedClassName()) FOR editorGen.diagram» getSemanticChildren(org.eclipse.gmf.runtime.notation.View view) {
«IF not semanticContainers->isEmpty()-»
switch EXPAND xpt::editor::VisualIDRegistry::getVisualIDMethodCall FOR editorGen.diagram»(view)) {
«EXPAND getSemanticChildrenCase FOREACH semanticContainers
}
«ENDIF
return «EXPAND CodeStyle::emptyList FOR editorGen.diagram»;
}
«ENDDEFINE»
«DEFINE getSemanticChildrenCase FOR gmfgen::GenContainerBase
«EXPAND xpt::Common::caseVisualID»
return «EXPAND getSemanticChildrenMethodName»(view);
«ENDDEFINE»
«DEFINE getSemanticChildrenOfView FOR gmfgen::GenContainerBase
«EXPAND xpt::Common::generatedMemberComment»
public static «EXPAND CodeStyle::G('java.util.List', getDiagram().editorGen.diagramUpdater.getNodeDescriptorQualifiedClassName())» «EXPAND getSemanticChildrenMethodName»(org.eclipse.gmf.runtime.notation.View view) {
«IF getSemanticChildrenChildFeatures(self)->size() > 0 or self.getPhantomNodes()->size() > 0
«EXPAND defineModelElement
«EXPAND CodeStyle::newGenericInstance('result', 'java.util.LinkedList', getDiagram().editorGen.diagramUpdater.getNodeDescriptorQualifiedClassName())»();
«REM»childMetaFeature can be null hereENDREM»«-»
«FOREACH getSemanticChildrenChildFeatures(self) AS childMetaFeature
«IF null = childMetaFeature
{ /*FIXME no containment/child feature found in the genmodel, toolsmith need to specify Class here manually*/ childElement = /*FIXME no containment/child feature found in the genmodel, toolsmith need to specify correct one here manually*/;
«ELSEIF isListType(childMetaFeature)-»
for EXPAND CodeStyle::G('java.util.Iterator', '?' it = «EXPAND MetaModel::getFeatureValue('modelElement', self.getModelElementType()) FOR childMetaFeature».iterator(); it.hasNext();) {
«EXPAND MetaModel::DeclareAndAssign('childElement', 'it.next()', true) FOR getTypeGenClassX(childMetaFeature
«ELSE
{ «EXPAND MetaModel::DeclareAndAssign('childElement', 'modelElement', self.getModelElementType(), childMetaFeature) FOR getTypeGenClassX(childMetaFeature
«ENDIF
int visualID = «EXPAND xpt::editor::VisualIDRegistry::getNodeVisualIDMethodCall FOR getDiagram()»(view, «EXPAND MetaModel::DowncastToEObject('childElement') FOR getTypeGenClassX(childMetaFeature)»);
«EXPAND checkChildElementVisualID(null <> childMetaFeature and isListType(childMetaFeature)) FOREACH getSemanticChildren(self, childMetaFeature)-»
}
«ENDFOREACH
«IF self.getPhantomNodes()->notEmpty()-»
org.eclipse.emf.ecore.resource.Resource resource = modelElement.eResource();
«EXPAND CodeStyle::iterate('childElement', 'org.eclipse.emf.ecore.EObject', 'getPhantomNodesIterator(resource)')-»
if (childElement == modelElement) {
continue;
}
«EXPAND addNextIfPhantom FOREACH self.getPhantomNodes()-»
}
«ENDIF
return result;
«ELSE
return «EXPAND CodeStyle::emptyList»;
«ENDIF
}
«ENDDEFINE»
«DEFINE defineModelElement FOR gmfgen::GenContainerBase
if (!view.isSetElement()) {
return «EXPAND CodeStyle::emptyList»;
}
«EXPAND MetaModel::DeclareAndAssign('modelElement', 'view.getElement()') FOR self.getModelElementType()»
«ENDDEFINE»
«DEFINE defineModelElement FOR gmfgen::GenCompartment
if (false == view.eContainer() instanceof org.eclipse.gmf.runtime.notation.View) {
return «EXPAND CodeStyle::emptyList»;
}
org.eclipse.gmf.runtime.notation.View containerView = (org.eclipse.gmf.runtime.notation.View) view.eContainer();
if (!containerView.isSetElement()) {
return «EXPAND CodeStyle::emptyList»;
}
«EXPAND MetaModel::DeclareAndAssign('modelElement', 'containerView.getElement()') FOR self.getModelElementType()»
«ENDDEFINE»
«DEFINE getSemanticChildrenMethodName FOR gmfgen::GenContainerBase»get«getUniqueIdentifier()»SemanticChildren«ENDDEFINE»
«DEFINE getSemanticChildrenMethodCall FOR gmfgen::GenContainerBase»«getDiagram().editorGen.diagramUpdater.getDiagramUpdaterQualifiedClassName()».«EXPAND getSemanticChildrenMethodName»«ENDDEFINE»
«DEFINE checkChildElementVisualID(inLoop : Boolean) FOR gmfgen::GenNode
if (visualID == «EXPAND xpt::editor::VisualIDRegistry::visualID») {
result.add(new «getDiagram().editorGen.diagramUpdater.getNodeDescriptorQualifiedClassName()»(«IF null <> modelFacet.childMetaFeature»«EXPAND MetaModel::DowncastToEObject('childElement') FOR getTypeGenClassX(modelFacet.childMetaFeature)»«ENDIF», visualID));
«IF inLoop
continue;
«ENDIF
}
«ENDDEFINE»
«DEFINE addNextIfPhantom FOR gmfgen::GenNode
if EXPAND xpt::editor::VisualIDRegistry::getNodeVisualIDMethodCall FOR getDiagram()»(view, childElement) == «EXPAND xpt::editor::VisualIDRegistry::visualID») {
result.add(new «getDiagram().editorGen.diagramUpdater.getNodeDescriptorQualifiedClassName()»(childElement, «EXPAND xpt::editor::VisualIDRegistry::visualID»));
continue;
}
«ENDDEFINE»
«DEFINE getPhantomNodesIterator FOR gmfgen::GenDiagramUpdater
«IF editorGen.diagram.getPhantomNodes()->notEmpty()-»
«EXPAND xpt::Common::generatedMemberComment»
private static «EXPAND CodeStyle::G('java.util.Iterator', 'org.eclipse.emf.ecore.EObject') FOR editorGen.diagram» getPhantomNodesIterator(org.eclipse.emf.ecore.resource.Resource resource) {
return resource.getAllContents();
}
«ENDIF
«ENDDEFINE»
«DEFINE getGenericConnectedLinks(linkContainers : Sequence(gmfgen::GenCommonBase), methodNameSuffix : String) FOR gmfgen::GenDiagramUpdater
«EXPAND xpt::Common::generatedMemberComment»
public static «EXPAND CodeStyle::G('java.util.List', getLinkDescriptorQualifiedClassName()) FOR editorGen.diagram» get«methodNameSuffix»Links(org.eclipse.gmf.runtime.notation.View view) {
«IF not linkContainers->isEmpty()-»
switch EXPAND xpt::editor::VisualIDRegistry::getVisualIDMethodCall FOR editorGen.diagram»(view)) {
«EXPAND getContainedLinksCase(methodNameSuffix) FOREACH linkContainers
}
«ENDIF
return «EXPAND CodeStyle::emptyList FOR editorGen.diagram»;
}
«ENDDEFINE»
«DEFINE getContainedLinksCase(methodNameSuffix : String) FOR gmfgen::GenCommonBase
«EXPAND xpt::Common::caseVisualID»
return «EXPAND linkGetterName(methodNameSuffix)»(view);
«ENDDEFINE»
«REM»This DEFING can be used from other templates to inject call to the corresponding method«ENDREM»
«DEFINE getContainedLinksMethodCall FOR gmfgen::GenCommonBase»«getDiagram().editorGen.diagramUpdater.getDiagramUpdaterQualifiedClassName()».«EXPAND linkGetterName(getContainedLinksMethodNameSuffix())»«ENDDEFINE»
«REM»This DEFING can be used from other templates to inject call to the corresponding method«ENDREM»
«DEFINE getIncomingLinksMethodCall FOR gmfgen::GenCommonBase»«getDiagram().editorGen.diagramUpdater.getDiagramUpdaterQualifiedClassName()».«EXPAND linkGetterName(getIncomingLinksMethodNameSuffix())»«ENDDEFINE»
«REM»This DEFING can be used from other templates to inject call to the corresponding method«ENDREM»
«DEFINE getOutgoingLinksMethodCall FOR gmfgen::GenCommonBase»«getDiagram().editorGen.diagramUpdater.getDiagramUpdaterQualifiedClassName()».«EXPAND linkGetterName(getOutgoingLinksMethodNameSuffix())»«ENDDEFINE»
«DEFINE linkGetterName(suffix : String) FOR gmfgen::GenCommonBase»get«getUniqueIdentifier()»«suffix»Links«ENDDEFINE»
«DEFINE getContainedLinks FOR gmfgen::GenCommonBase
«EXPAND getConnectedLinks(getContainedLinks(self.getMetaClass(), getDiagram()), getContainedLinksMethodNameSuffix(), false)-»
«ENDDEFINE»
«DEFINE getIncomingLinks FOR gmfgen::GenLinkEnd
«EXPAND getConnectedLinks(getIncomingLinks(self), getIncomingLinksMethodNameSuffix(), true)-»
«ENDDEFINE»
«DEFINE getOutgoingLinks FOR gmfgen::GenLinkEnd
«EXPAND getConnectedLinks(getOutgoingLinks(self), getOutgoingLinksMethodNameSuffix(), false)-»
«ENDDEFINE»
«DEFINE getConnectedLinks(genLinks : Sequence(gmfgen::GenLink), methodNameSuffix : String, needCrossReferencer : Boolean) FOR gmfgen::GenCommonBase
«EXPAND xpt::Common::generatedMemberComment»
public static «EXPAND CodeStyle::G('java.util.List', getDiagram().editorGen.diagramUpdater.getLinkDescriptorQualifiedClassName())» «EXPAND linkGetterName(methodNameSuffix)»(org.eclipse.gmf.runtime.notation.View view) {
«IF genLinks->notEmpty()-»
«LET self.getMetaClass() AS metaclass
«EXPAND MetaModel::DeclareAndAssign('modelElement', 'view.getElement()') FOR metaclass»
«IF needCrossReferencer»«EXPAND CodeStyle::G2('java.util.Map', 'org.eclipse.emf.ecore.EObject', 'java.util.Collection<org.eclipse.emf.ecore.EStructuralFeature.Setting>' crossReferences = org.eclipse.emf.ecore.util.EcoreUtil.CrossReferencer.find(view.eResource().getResourceSet().getResources());
«ENDIF
«EXPAND CodeStyle::newGenericInstance('result', 'java.util.LinkedList', getDiagram().editorGen.diagramUpdater.getLinkDescriptorQualifiedClassName())»();
«EXPAND colectConnectedLinks(methodNameSuffix, needCrossReferencer, isExternalInterface(metaclass)) FOREACH genLinks
return result;
«ENDLET
«ELSE
return «EXPAND CodeStyle::emptyList»;
«ENDIF
}
«ENDDEFINE»
«DEFINE colectConnectedLinks(methodNameSuffix : String, needCrossReferencer : Boolean, isExternalInterface : Boolean) FOR gmfgen::GenLink
«IF isExternalInterface
if EXPAND MetaModel::IsInstance('modelElement') FOR modelFacet.getLinkEndType(methodNameSuffix)») {
«ENDIF
result.addAllEXPAND chooseConnectedLinksByTypeMethodName(methodNameSuffix, self) FOR modelFacet»(«IF isExternalInterface
«EXPAND MetaModel::CastEObject('modelElement') FOR modelFacet.getLinkEndType(methodNameSuffix)»«ELSE»modelElement«ENDIF»«IF needCrossReferencer», crossReferences«ENDIF»));
«IF isExternalInterface
}
«ENDIF
«ENDDEFINE»
«DEFINE chooseConnectedLinksByTypeMethodName(methodNameSuffix : String, genLink : gmfgen::GenLink) FOR gmfgen::LinkModelFacet
«EXPAND incorrectLinkModelFacet
«ENDDEFINE»
«REM»
For FeatureModelFacet-based links we are calling
getOutgoing???Links instead of getContained???Links
«ENDREM»
«DEFINE chooseConnectedLinksByTypeMethodName(methodNameSuffix : String, genLink : gmfgen::GenLink) FOR gmfgen::FeatureLinkModelFacet
«IF getContainedLinksMethodNameSuffix() = methodNameSuffix»«EXPAND getConnectedLinksByTypeMethodName(getOutgoingLinksMethodNameSuffix()) FOR genLink
«ELSE»«EXPAND getConnectedLinksByTypeMethodName(methodNameSuffix) FOR genLink
«ENDIF
«ENDDEFINE»
«REM»
For TypeModelFacet-based links we are calling
getContained???Links instead of getOutgoinf???Links
if sourceMetaFeature was not specified
«ENDREM»
«DEFINE chooseConnectedLinksByTypeMethodName(methodNameSuffix : String, genLink : gmfgen::GenLink) FOR gmfgen::TypeLinkModelFacet
«IF getOutgoingLinksMethodNameSuffix() = methodNameSuffix and null = sourceMetaFeature»«EXPAND getConnectedLinksByTypeMethodName(getContainedLinksMethodNameSuffix()) FOR genLink
«ELSE»«EXPAND getConnectedLinksByTypeMethodName(methodNameSuffix) FOR genLink
«ENDIF
«ENDDEFINE»
«DEFINE getContainedLinksByTypeMethod FOR gmfgen::GenLink»«EXPAND getContainedLinksByTypeMethod(self) FOR modelFacet»«ENDDEFINE»
«DEFINE getConnectedLinksByTypeMethodName(suffix : String) FOR gmfgen::GenLink»get«suffix»«EXPAND getConnectedLinksByTypeMethodFragment FOR modelFacet»_«visualID»«ENDDEFINE»
«DEFINE getConnectedLinksByTypeMethodFragment FOR gmfgen::TypeLinkModelFacet»TypeModelFacetLinks_«metaClass.ecoreClass.name»«ENDDEFINE»
«DEFINE getConnectedLinksByTypeMethodFragment FOR gmfgen::FeatureLinkModelFacet»FeatureModelFacetLinks_«metaFeature.genClass.ecoreClass.name»_«metaFeature.ecoreFeature.name.firstToUpper()»«ENDDEFINE»
«DEFINE getConnectedLinksByTypeMethodFragment FOR gmfgen::LinkModelFacet
«EXPAND incorrectLinkModelFacet
«ENDDEFINE»
«DEFINE getContainedLinksByTypeMethod(genLink : gmfgen::GenLink) FOR gmfgen::LinkModelFacet
«EXPAND incorrectLinkModelFacet
«ENDDEFINE»
«DEFINE getContainedLinksByTypeMethod(genLink : gmfgen::GenLink) FOR gmfgen::FeatureLinkModelFacet»«ENDDEFINE»
«DEFINE getContainedLinksByTypeMethod(genLink : gmfgen::GenLink) FOR gmfgen::TypeLinkModelFacet
«EXPAND xpt::Common::generatedMemberComment»
private static «EXPAND CodeStyle::G('java.util.Collection', genLink.getDiagram().editorGen.diagramUpdater.getLinkDescriptorQualifiedClassName()) FOR genLink» «EXPAND getConnectedLinksByTypeMethodName(getContainedLinksMethodNameSuffix()) FOR genLink»(«EXPAND MetaModel::QualifiedClassName FOR childMetaFeature.genClass» container) {
«EXPAND getContainedLinksByTypeMethodBody(genLink, false)-»
}
«ENDDEFINE»
«DEFINE getContainedLinksByTypeMethodBody(genLink : gmfgen::GenLink, sourceVarDefined : Boolean) FOR gmfgen::TypeLinkModelFacet
«EXPAND CodeStyle::newGenericInstance('result', 'java.util.LinkedList', genLink.getDiagram().editorGen.diagramUpdater.getLinkDescriptorQualifiedClassName()) FOR genLink»();
«LET isListType(childMetaFeature) AS inLoop
«IF inLoop
for EXPAND CodeStyle::G('java.util.Iterator', '?') FOR genLink» links = «EXPAND MetaModel::getFeatureValue('container', childMetaFeature.genClass) FOR childMetaFeature».iterator(); links.hasNext();) {
org.eclipse.emf.ecore.EObject linkObject = (org.eclipse.emf.ecore.EObject ) links.next();
if EXPAND MetaModel::NotInstance('linkObject') FOR metaClass») {
continue;
}
«EXPAND MetaModel::DeclareAndAssign('link', 'linkObject') FOR metaClass»
«ELSE
«IF getTypeGenClassX(childMetaFeature) = metaClass
«EXPAND MetaModel::DeclareAndAssign('link', 'container', getSourceType(), childMetaFeature) FOR metaClass»
«ELSE
«EXPAND MetaModel::DeclareAndAssign('linkObject', 'container', getSourceType(), childMetaFeature) FOR getTypeGenClassX(childMetaFeature
if EXPAND MetaModel::NotInstance('linkObject') FOR metaClass») {
return result;
}
«EXPAND MetaModel::DeclareAndAssign('link', 'linkObject') FOR metaClass»
«ENDIF
«ENDIF
«EXPAND checkLinkVisualID(genLink, inLoop)-»
«EXPAND defineLinkDestination(inLoop)-»
«IF null <> sourceMetaFeature
«EXPAND defineLinkSource(inLoop)-»
«IF sourceVarDefined
«EXPAND checkLinkSource(inLoop)-»
«ENDIF
«EXPAND addLinkDescriptor(genLink, 'src', 'dst')-»
«ELSE
«EXPAND addLinkDescriptor(genLink, 'container', 'dst')-»
«ENDIF
«IF inLoop
}
«ENDIF
«ENDLET
return result;
«ENDDEFINE»
«DEFINE addLinkDescriptor(genLink : gmfgen::GenLink, srcVar : String, dstVar : String) FOR gmfgen::TypeLinkModelFacet
result.add(new «genLink.getDiagram().editorGen.diagramUpdater.getLinkDescriptorQualifiedClassName()»(«EXPAND MetaModel::DowncastToEObject(srcVar) FOR getSourceType()», «EXPAND MetaModel::DowncastToEObject(dstVar) FOR getTargetType()», «EXPAND MetaModel::DowncastToEObject('link') FOR metaClass», «EXPAND xpt::providers::ElementTypes::accessElementType FOR genLink», «EXPAND xpt::editor::VisualIDRegistry::visualID FOR genLink»));
«ENDDEFINE»
«DEFINE checkLinkVisualID(genLink : gmfgen::GenLink, inLoop : Boolean) FOR gmfgen::TypeLinkModelFacet
if EXPAND xpt::editor::VisualIDRegistry::visualID FOR genLink» != «EXPAND xpt::editor::VisualIDRegistry::getLinkWithClassVisualIDMethodCall FOR genLink.getDiagram()»(«EXPAND MetaModel::DowncastToEObject('link') FOR metaClass»)) {
«EXPAND stopLinkProcessing(inLoop)-»
}
«ENDDEFINE»
«DEFINE defineLinkSource(inLoop : Boolean) FOR gmfgen::TypeLinkModelFacet
«IF isListType(sourceMetaFeature)-»
java.util.List sources = «EXPAND MetaModel::getFeatureValue('link', metaClass) FOR sourceMetaFeature»;
Object theSource = sources.size() == 1 ? sources.get(0) : null;
if EXPAND MetaModel::NotInstance('theSource') FOR getSourceType()») {
«EXPAND stopLinkProcessing(inLoop)-»
}
«EXPAND MetaModel::DeclareAndAssign('src', 'theSource', true) FOR getSourceType()»
«ELSE
«EXPAND MetaModel::DeclareAndAssign('src', 'link', metaClass, sourceMetaFeature) FOR getSourceType()»
«ENDIF
«ENDDEFINE»
«DEFINE checkLinkSource(inLoop : Boolean) FOR gmfgen::TypeLinkModelFacet
if (src != source) {
«EXPAND stopLinkProcessing(inLoop)-»
}
«ENDDEFINE»
«DEFINE defineLinkDestination(inLoop : Boolean) FOR gmfgen::TypeLinkModelFacet
«IF isListType(targetMetaFeature)-»
java.util.List targets = «EXPAND MetaModel::getFeatureValue('link', metaClass) FOR targetMetaFeature»;
Object theTarget = targets.size() == 1 ? targets.get(0) : null;
if EXPAND MetaModel::NotInstance('theTarget') FOR getTargetType()») {
«EXPAND stopLinkProcessing(inLoop)-»
}
«EXPAND MetaModel::DeclareAndAssign('dst', 'theTarget', true) FOR getTargetType()»
«ELSE
«EXPAND MetaModel::DeclareAndAssign('dst', 'link', metaClass, targetMetaFeature) FOR getTargetType()»
«ENDIF
«ENDDEFINE»
«DEFINE stopLinkProcessing(inLoop : Boolean) FOR gmfgen::TypeLinkModelFacet
«IF inLoop
continue;
«ELSE
return result;
«ENDIF
«ENDDEFINE»
«DEFINE getIncomingLinksByTypeMethod FOR gmfgen::GenLink
«EXPAND xpt::Common::generatedMemberComment»
private static «EXPAND CodeStyle::G('java.util.Collection', getDiagram().editorGen.diagramUpdater.getLinkDescriptorQualifiedClassName())» «EXPAND getConnectedLinksByTypeMethodName(getIncomingLinksMethodNameSuffix())»(«EXPAND MetaModel::QualifiedClassName FOR modelFacet.getTargetType()» target, «EXPAND CodeStyle::G2('java.util.Map', 'org.eclipse.emf.ecore.EObject', 'java.util.Collection<org.eclipse.emf.ecore.EStructuralFeature.Setting>' crossReferences) {
«EXPAND CodeStyle::newGenericInstance('result', 'java.util.LinkedList', getDiagram().editorGen.diagramUpdater.getLinkDescriptorQualifiedClassName())»();
«EXPAND CodeStyle::G('java.util.Collection', 'org.eclipse.emf.ecore.EStructuralFeature.Setting' settings = «EXPAND CodeStyle::castTyped('java.util.Collection'crossReferences.get(target);
«EXPAND CodeStyle::iterate('setting', 'org.eclipse.emf.ecore.EStructuralFeature.Setting', 'settings')-»
«EXPAND getIncomingLinksByTypeMethodBody(self /*FIXME pass settings var name inside for completeness */) FOR modelFacet
}
return result;
}
«ENDDEFINE»
«DEFINE getIncomingLinksByTypeMethodBody(genLink : gmfgen::GenLink) FOR gmfgen::TypeLinkModelFacet
if (setting.getEStructuralFeature() != «EXPAND MetaModel::MetaFeature FOR targetMetaFeature» || «EXPAND MetaModel::NotInstance('setting.getEObject()') FOR metaClass») {
continue;
}
«EXPAND MetaModel::DeclareAndAssign('link', 'setting.getEObject()') FOR metaClass»
«EXPAND checkLinkVisualID(genLink, true)-»
«IF null <> sourceMetaFeature
«EXPAND defineLinkSource(true)-»
«EXPAND addLinkDescriptor(genLink, 'src', 'target')-»
«ELSE
«EXPAND defineLinkContainer(true)-»
«EXPAND addLinkDescriptor(genLink, 'container', 'target')-»
«REM»TODO: continue hereENDREM»
«ENDIF
«ENDDEFINE»
«DEFINE defineLinkContainer(inLoop : Boolean) FOR gmfgen::TypeLinkModelFacet
if (false == «EXPAND MetaModel::IsContainerInstance('link', metaClass) FOR containmentMetaFeature.genClass») {
«EXPAND stopLinkProcessing(inLoop)-»
}
«EXPAND MetaModel::DeclareAndAssignContainer('container', 'link', metaClass) FOR containmentMetaFeature.genClass»
«ENDDEFINE»
«DEFINE getIncomingLinksByTypeMethodBody(genLink : gmfgen::GenLink) FOR gmfgen::FeatureLinkModelFacet
if (setting.getEStructuralFeature() == «EXPAND MetaModel::MetaFeature FOR metaFeature») {
result.add(new «genLink.getDiagram().editorGen.diagramUpdater.getLinkDescriptorQualifiedClassName()»(setting.getEObject(), «EXPAND MetaModel::DowncastToEObject('target') FOR getTargetType()», «EXPAND xpt::providers::ElementTypes::accessElementType FOR genLink», «EXPAND xpt::editor::VisualIDRegistry::visualID FOR genLink»));
}
«ENDDEFINE»
«DEFINE getIncomingLinksByTypeMethodBody(genLink : gmfgen::GenLink) FOR gmfgen::LinkModelFacet
«EXPAND incorrectLinkModelFacet
«ENDDEFINE»
«DEFINE getOutgoingLinksByTypeMethod FOR gmfgen::GenLink
«EXPAND getOutgoingLinksByTypeMethod(self) FOR modelFacet
«ENDDEFINE»
«DEFINE getOutgoingLinksByTypeMethodSignature FOR gmfgen::GenLink
private static «EXPAND CodeStyle::G('java.util.Collection', getDiagram().editorGen.diagramUpdater.getLinkDescriptorQualifiedClassName())» «EXPAND getConnectedLinksByTypeMethodName(getOutgoingLinksMethodNameSuffix())»(«EXPAND MetaModel::QualifiedClassName FOR modelFacet.getSourceType()» sourceENDDEFINE»
«DEFINE getOutgoingLinksByTypeMethod(genLink : gmfgen::GenLink) FOR gmfgen::FeatureLinkModelFacet
«EXPAND xpt::Common::generatedMemberComment»
«EXPAND getOutgoingLinksByTypeMethodSignature FOR genLink» {
«EXPAND CodeStyle::newGenericInstance('result', 'java.util.LinkedList', genLink.getDiagram().editorGen.diagramUpdater.getLinkDescriptorQualifiedClassName()) FOR genLink»();
«IF isListType(metaFeature)-»
for EXPAND CodeStyle::G('java.util.Iterator', '?') FOR genLink» destinations = «EXPAND MetaModel::getFeatureValue('source', getSourceType()) FOR metaFeature».iterator(); destinations.hasNext();) {
«EXPAND MetaModel::DeclareAndAssign('destination', 'destinations.next()', true) FOR getTargetType()»
«ELSE
«EXPAND MetaModel::DeclareAndAssign('destination', 'source', getSourceType(), metaFeature) FOR getTargetType()»
if (destination == null) {
return result;
}
«ENDIF
result.add(new «genLink.getDiagram().editorGen.diagramUpdater.getLinkDescriptorQualifiedClassName()»(«EXPAND MetaModel::DowncastToEObject('source') FOR getSourceType()», «EXPAND MetaModel::DowncastToEObject('destination') FOR getTargetType()», «EXPAND xpt::providers::ElementTypes::accessElementType FOR genLink», «EXPAND xpt::editor::VisualIDRegistry::visualID FOR genLink»));
«IF isListType(metaFeature)-»
}
«ENDIF
return result;
}
«ENDDEFINE»
«REM»More careful way to find container should be used here then GMF will be modified in accordance«ENDREM»
«DEFINE getOutgoingLinksByTypeMethod(genLink : gmfgen::GenLink) FOR gmfgen::TypeLinkModelFacet
«IF null <> sourceMetaFeature
«EXPAND xpt::Common::generatedMemberComment»
«EXPAND getOutgoingLinksByTypeMethodSignature FOR genLink» {
«EXPAND MetaModel::QualifiedClassName FOR containmentMetaFeature.genClass» container = null;
// Find container element for the link.
// Climb up by containment hierarchy starting from the source
// and return the first element that is instance of the container class.
for (org.eclipse.emf.ecore.EObject element = «EXPAND MetaModel::DowncastToEObject('source') FOR getSourceType()»; element != null && container == null; element = element.eContainer()) {
if EXPAND MetaModel::IsInstance('element') FOR containmentMetaFeature.genClass») {
container = «EXPAND MetaModel::CastEObject('element') FOR containmentMetaFeature.genClass»;
}
}
if (container == null) {
return «EXPAND CodeStyle::emptyList FOR genLink»;
}
«EXPAND getContainedLinksByTypeMethodBody(genLink, true)-»
}
«ENDIF
«ENDDEFINE»
«DEFINE getOutgoingLinksByTypeMethod(genLink : gmfgen::GenLink) FOR gmfgen::LinkModelFacet
«EXPAND incorrectLinkModelFacet
«ENDDEFINE»
«DEFINE incorrectLinkModelFacet FOR gmfgen::LinkModelFacet
«ERROR 'Incorrect LinkModelFacet: ' + self.repr()»
«ENDDEFINE»
«DEFINE additions FOR gmfgen::GenDiagramUpdater»«ENDDEFINE»