[512862] Introduce contextual actions to setup CDO in the genmodel Bug: 512862 Change-Id: If75f395243a68dcf898454c478fa86991119e4c5
diff --git a/org.eclipse.emf.ecoretools.design.ui/plugin.xml b/org.eclipse.emf.ecoretools.design.ui/plugin.xml index f4407ce..a5fecf6 100644 --- a/org.eclipse.emf.ecoretools.design.ui/plugin.xml +++ b/org.eclipse.emf.ecoretools.design.ui/plugin.xml
@@ -36,6 +36,10 @@ actionClass="org.eclipse.emf.ecoretools.design.ui.action.GenerateAllAction" id="org.eclipse.emf.ecoretools.design.action.generateAllID"> </javaActions> + <javaActions + actionClass="org.eclipse.emf.ecoretools.design.ui.action.OpenConfirmationDialogAction" + id="org.eclipse.emf.ecoretools.design.action.openConfirmationDialogID"> + </javaActions> </extension> <!-- <extension
diff --git a/org.eclipse.emf.ecoretools.design.ui/src/org/eclipse/emf/ecoretools/design/ui/action/OpenConfirmationDialogAction.java b/org.eclipse.emf.ecoretools.design.ui/src/org/eclipse/emf/ecoretools/design/ui/action/OpenConfirmationDialogAction.java new file mode 100644 index 0000000..ffd76e0 --- /dev/null +++ b/org.eclipse.emf.ecoretools.design.ui/src/org/eclipse/emf/ecoretools/design/ui/action/OpenConfirmationDialogAction.java
@@ -0,0 +1,62 @@ +/******************************************************************************* + * 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.emf.ecoretools.design.ui.action; + +import java.util.Collection; +import java.util.Map; + +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.sirius.tools.api.ui.IExternalJavaAction; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.PlatformUI; + +public class OpenConfirmationDialogAction implements IExternalJavaAction { + + public boolean canExecute(Collection<? extends EObject> selections) { + return true; + } + + public void execute(Collection<? extends EObject> selections, Map<String, Object> parameters) { + Object messageObj = parameters.get("message"); + Object titleObj = parameters.get("title"); + if (messageObj instanceof String) { + final String message = (String) messageObj; + final String title = getTitleFromParameter(titleObj); + Display.getDefault().syncExec(new Runnable() { + + public void run() { + IEditorPart activeEditorPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() + .getActiveEditor(); + + if (!MessageDialog.openConfirm(activeEditorPart.getSite().getShell(), title, message)) { + + throw new OperationCanceledException("user canceled"); + } + + } + }); + + } + + } + + private String getTitleFromParameter(Object titleObj) { + String title = "Confirmation ?"; + if (titleObj instanceof String) { + title = (String) titleObj; + } + return title; + } + +}
diff --git a/org.eclipse.emf.ecoretools.design/description/ecore.odesign b/org.eclipse.emf.ecoretools.design/description/ecore.odesign index e84f8b3..880541a 100644 --- a/org.eclipse.emf.ecoretools.design/description/ecore.odesign +++ b/org.eclipse.emf.ecoretools.design/description/ecore.odesign
@@ -240,6 +240,28 @@ </initialOperation> </menuItemDescription> </ownedTools> + <ownedTools xsi:type="tool:PopupMenu" name="CDO Native" precondition="aql:self.hasCDOBundle()"> + <menuItemDescription xsi:type="tool:OperationAction" name="Enable support" precondition="aql:OrderedSet{views.target}.eInverse().eContainerOrSelf(genmodel::GenModel)->asSet()->size() > 0"> + <view name="views"/> + <initialOperation> + <firstModelOperations xsi:type="tool:ExternalJavaAction" name="OpenConfirmationDialog" id="org.eclipse.emf.ecoretools.design.action.openConfirmationDialogID"> + <subModelOperations xsi:type="tool:ChangeContext" browseExpression="aql:self.enableCDOGen(OrderedSet{views->filter(viewpoint::DSemanticDecorator).target}.eInverse().eContainerOrSelf(genmodel::GenModel)->asSet())"/> + <parameters name="message" value="The selected generator model will be updated:

Set Feature Delegation = Reflective
Set Root Extends Class = org.eclipse.emf.internal.cdo.CDOObjectImpl
Set Root Extends Interface = org.eclipse.emf.cdo.CDOObject
Added Model Plugin Variables = CDO=org.eclipse.emf.cdo 
Created CDO.MF marker file

You need to regenerate the code to make these changes effective. 
"/> + <parameters name="title" value="The selected generator model will be updated:

Set Feature Delegation = Reflective
Set Root Extends Class = org.eclipse.emf.internal.cdo.CDOObjectImpl
Set Root Extends Interface = org.eclipse.emf.cdo.CDOObject
Add Model Plugin Variables = CDO=org.eclipse.emf.cdo 
Create CDO.MF marker file

You need to regenerate the code to make these changes effective. "/> + </firstModelOperations> + </initialOperation> + </menuItemDescription> + <menuItemDescription xsi:type="tool:OperationAction" name="Disable support" precondition="aql:OrderedSet{views.target}.eInverse().eContainerOrSelf(genmodel::GenModel)->asSet()->size() > 0"> + <view name="views"/> + <initialOperation> + <firstModelOperations xsi:type="tool:ExternalJavaAction" name="OpenConfirmationDialog" id="org.eclipse.emf.ecoretools.design.action.openConfirmationDialogID"> + <subModelOperations xsi:type="tool:ChangeContext" browseExpression="aql:self.disableCDOGen(OrderedSet{views->filter(viewpoint::DSemanticDecorator).target}.eInverse().eContainerOrSelf(genmodel::GenModel)->asSet())"/> + <parameters name="message" value="The selected generator model will be updated:..."/> + <parameters name="title" value="Disable CDO Native support in .genmodel ?"/> + </firstModelOperations> + </initialOperation> + </menuItemDescription> + </ownedTools> <ownedTools xsi:type="tool:SelectionWizardDescription" name="Add" precondition="aql:container.oclIsKindOf(ecore::EPackage)" forceRefresh="true" candidatesExpression="aql:self.getValidsForDiagram(containerView)->asSet() - diagram.getDisplayedEClassifiers()" multiple="true" tree="true" rootExpression="service:rootEPackages" childrenExpression="feature:eContents" iconPath="/org.eclipse.emf.ecoretools.design/icons/full/etools16/search.gif" windowTitle="Select element to add in diagram"> <element name="element"/> <containerView name="containerView"/>
diff --git a/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/service/DesignServices.java b/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/service/DesignServices.java index 6697a6e..c64f29b 100644 --- a/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/service/DesignServices.java +++ b/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/service/DesignServices.java
@@ -11,6 +11,10 @@ package org.eclipse.emf.ecoretools.design.service; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -18,8 +22,12 @@ import java.util.List; import java.util.Set; +import org.eclipse.core.runtime.Platform; +import org.eclipse.emf.codegen.ecore.genmodel.GenDelegationKind; +import org.eclipse.emf.codegen.ecore.genmodel.GenModel; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.util.Diagnostic; +import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EAnnotation; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; @@ -38,6 +46,7 @@ import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl; import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.URIConverter; import org.eclipse.emf.ecore.util.Diagnostician; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.edit.command.AddCommand; @@ -84,807 +93,893 @@ * Generic Ecore services usable from a VSM. */ public class DesignServices extends EReferenceServices { - private static final String CLASS_DIAGRAM_CLASS_MAPPINGID = "EC EClass"; + private static final String CLASS_DIAGRAM_CLASS_MAPPINGID = "EC EClass"; - /** - * Returns all the root objects of all the resources in the same - * resource-set as the specified object. - * - * @param any - * an EObject. - * @return all the root objects in the same resource-set as <code>any</code> - * or an empty collection if <code>any</code> is not inside a - * resource-set. - */ - public Collection<EObject> allRoots(EObject any) { - Resource res = any.eResource(); - if (res != null && res.getResourceSet() != null) { - Collection<EObject> roots = new ArrayList<EObject>(); - for (Resource childRes : res.getResourceSet().getResources()) { - roots.addAll(childRes.getContents()); - } - return roots; - } else { - return Collections.emptySet(); - } - } + /** + * Returns all the root objects of all the resources in the same + * resource-set as the specified object. + * + * @param any + * an EObject. + * @return all the root objects in the same resource-set as <code>any</code> + * or an empty collection if <code>any</code> is not inside a + * resource-set. + */ + public Collection<EObject> allRoots(EObject any) { + Resource res = any.eResource(); + if (res != null && res.getResourceSet() != null) { + Collection<EObject> roots = new ArrayList<EObject>(); + for (Resource childRes : res.getResourceSet().getResources()) { + roots.addAll(childRes.getContents()); + } + return roots; + } else { + return Collections.emptySet(); + } + } - public Collection<EPackage> rootEPackages(EObject any) { - return Sets.newLinkedHashSet(Iterables.filter(allRoots(any), EPackage.class)); - } + public Collection<EPackage> rootEPackages(EObject any) { + return Sets.newLinkedHashSet(Iterables.filter(allRoots(any), EPackage.class)); + } - public Boolean isEOperation(EObject any) { - return any instanceof EOperation; - } + public Boolean isEOperation(EObject any) { + return any instanceof EOperation; + } - public Boolean isEStructuralFeature(EObject any) { - return any instanceof EStructuralFeature; - } + public Boolean isEStructuralFeature(EObject any) { + return any instanceof EStructuralFeature; + } - public Boolean isEPackage(EObject any) { - return any instanceof EPackage; - } + public Boolean isEPackage(EObject any) { + return any instanceof EPackage; + } - public Boolean isEClass(EObject any) { - return any instanceof EClass; - } + public Boolean isEClass(EObject any) { + return any instanceof EClass; + } - public Boolean isEEnum(EObject any) { - return any instanceof EEnum; - } + public Boolean isEEnum(EObject any) { + return any instanceof EEnum; + } - protected static final String GEN_MODEL_PACKAGE_NS_URI = "http://www.eclipse.org/emf/2002/GenModel"; + protected static final String GEN_MODEL_PACKAGE_NS_URI = "http://www.eclipse.org/emf/2002/GenModel"; - protected static final String ECORE_PACKAGE_NS_URI = "http://www.eclipse.org/emf/2002/Ecore"; + protected static final String ECORE_PACKAGE_NS_URI = "http://www.eclipse.org/emf/2002/Ecore"; - public EObject markForAutosize(EObject any) { - if (any != null) { - any.eAdapters().add(AutosizeTrigger.AUTO_SIZE_MARKER); - } - return any; - } + public EObject markForAutosize(EObject any) { + if (any != null) { + any.eAdapters().add(AutosizeTrigger.AUTO_SIZE_MARKER); + } + return any; + } - public EObject eContainerEContainer(EObject any) { - if (any.eContainer() != null) - return any.eContainer().eContainer(); - return null; - } + public EObject eContainerEContainer(EObject any) { + if (any.eContainer() != null) + return any.eContainer().eContainer(); + return null; + } - public Collection<EStringToStringMapEntryImpl> getVisibleDocAnnotations(EObject self, DSemanticDiagram diag) { - // [diagram.getDisplayedEModelElements().oclAsType(ecore::EModelElement).eAnnotations.details->select(key - // = 'documentation')/] - Set<EStringToStringMapEntryImpl> result = Sets.newLinkedHashSet(); - for (EModelElement displayed : getDisplayedEModelElements(diag)) { - if (!(displayed instanceof EAttribute) && !(displayed instanceof EEnumLiteral) && !(displayed instanceof EOperation)) { - EAnnotation eAnnot = displayed.getEAnnotation(GEN_MODEL_PACKAGE_NS_URI); - if (eAnnot != null) { - for (EStringToStringMapEntryImpl mapEntry : Iterables.filter(eAnnot.getDetails(), EStringToStringMapEntryImpl.class)) { - if ("documentation".equals(mapEntry.getKey())) { - result.add(mapEntry); - } - } - } - } + public Collection<EStringToStringMapEntryImpl> getVisibleDocAnnotations(EObject self, DSemanticDiagram diag) { + // [diagram.getDisplayedEModelElements().oclAsType(ecore::EModelElement).eAnnotations.details->select(key + // = 'documentation')/] + Set<EStringToStringMapEntryImpl> result = Sets.newLinkedHashSet(); + for (EModelElement displayed : getDisplayedEModelElements(diag)) { + if (!(displayed instanceof EAttribute) && !(displayed instanceof EEnumLiteral) + && !(displayed instanceof EOperation)) { + EAnnotation eAnnot = displayed.getEAnnotation(GEN_MODEL_PACKAGE_NS_URI); + if (eAnnot != null) { + for (EStringToStringMapEntryImpl mapEntry : Iterables.filter(eAnnot.getDetails(), + EStringToStringMapEntryImpl.class)) { + if ("documentation".equals(mapEntry.getKey())) { + result.add(mapEntry); + } + } + } + } - } - return result; - } + } + return result; + } - public Collection<EStringToStringMapEntryImpl> getVisibleConstraintsAnnotations(EObject self, DSemanticDiagram diag) { - Set<EStringToStringMapEntryImpl> result = Sets.newLinkedHashSet(); - for (EModelElement displayed : getDisplayedEModelElements(diag)) { - if (!(displayed instanceof EAttribute) && !(displayed instanceof EEnumLiteral) && !(displayed instanceof EOperation)) { - EAnnotation eAnnot = displayed.getEAnnotation(ECORE_PACKAGE_NS_URI); - if (eAnnot != null) { - for (EStringToStringMapEntryImpl mapEntry : Iterables.filter(eAnnot.getDetails(), EStringToStringMapEntryImpl.class)) { - if ("constraints".equals(mapEntry.getKey())) { - result.add(mapEntry); - } - } - } - } + public Collection<EStringToStringMapEntryImpl> getVisibleConstraintsAnnotations(EObject self, + DSemanticDiagram diag) { + Set<EStringToStringMapEntryImpl> result = Sets.newLinkedHashSet(); + for (EModelElement displayed : getDisplayedEModelElements(diag)) { + if (!(displayed instanceof EAttribute) && !(displayed instanceof EEnumLiteral) + && !(displayed instanceof EOperation)) { + EAnnotation eAnnot = displayed.getEAnnotation(ECORE_PACKAGE_NS_URI); + if (eAnnot != null) { + for (EStringToStringMapEntryImpl mapEntry : Iterables.filter(eAnnot.getDetails(), + EStringToStringMapEntryImpl.class)) { + if ("constraints".equals(mapEntry.getKey())) { + result.add(mapEntry); + } + } + } + } - } - return result; - } + } + return result; + } - public boolean hasNoClassifier(DSemanticDiagram diagram) { - Iterator<DSemanticDecorator> it = Iterators.filter(diagram.getOwnedDiagramElements().iterator(), DSemanticDecorator.class); - while (it.hasNext()) { - DSemanticDecorator dec = it.next(); - if (dec.getTarget() instanceof EClassifier) - return true; - } - return false; - } + public boolean hasNoClassifier(DSemanticDiagram diagram) { + Iterator<DSemanticDecorator> it = Iterators.filter(diagram.getOwnedDiagramElements().iterator(), + DSemanticDecorator.class); + while (it.hasNext()) { + DSemanticDecorator dec = it.next(); + if (dec.getTarget() instanceof EClassifier) + return true; + } + return false; + } - public Set<EReference> getNonDisplayedEReferences(EClass self, DSemanticDiagram diag) { - Set<EReference> result = Sets.newLinkedHashSet(); - Set<EClass> displayedEClasses = null; - for (EReference eReference : self.getEAllReferences()) { - if (eReference.getEType() != null) { - if (displayedEClasses == null) { - displayedEClasses = getDisplayedEClasses(diag); - } - /* - * if the target of the EReference is not visible, we *have* to - * display it as a node except if it iis from a supertype which - * is visible itself, then the reference will be already - * displayed. but if the reference is owned by a super type and - * this supertype is not visible, even if the target is visible, - * then we have to display it as a node to! - */ - boolean targetTypeIsVisible = displayedEClasses.contains(eReference.getEType()); - boolean referenceIsInherited = eReference.getEContainingClass() != self; - boolean referenceHostIsVisible = displayedEClasses.contains(eReference.getEContainingClass()); - if (!referenceIsInherited && !targetTypeIsVisible) { - result.add(eReference); - } - if (referenceIsInherited && (!referenceHostIsVisible)) { - result.add(eReference); - } - } - } - return result; - } + public Set<EReference> getNonDisplayedEReferences(EClass self, DSemanticDiagram diag) { + Set<EReference> result = Sets.newLinkedHashSet(); + Set<EClass> displayedEClasses = null; + for (EReference eReference : self.getEAllReferences()) { + if (eReference.getEType() != null) { + if (displayedEClasses == null) { + displayedEClasses = getDisplayedEClasses(diag); + } + /* + * if the target of the EReference is not visible, we *have* to + * display it as a node except if it iis from a supertype which + * is visible itself, then the reference will be already + * displayed. but if the reference is owned by a super type and + * this supertype is not visible, even if the target is visible, + * then we have to display it as a node to! + */ + boolean targetTypeIsVisible = displayedEClasses.contains(eReference.getEType()); + boolean referenceIsInherited = eReference.getEContainingClass() != self; + boolean referenceHostIsVisible = displayedEClasses.contains(eReference.getEContainingClass()); + if (!referenceIsInherited && !targetTypeIsVisible) { + result.add(eReference); + } + if (referenceIsInherited && (!referenceHostIsVisible)) { + result.add(eReference); + } + } + } + return result; + } - public Set<EClass> getDisplayedEClasses(DSemanticDiagram diagram) { - Set<EClass> result = Sets.newLinkedHashSet(); - Iterator<DNodeList> it = Iterators.filter(new DDiagramQuery(diagram).getAllDiagramElements().iterator(), DNodeList.class); - while (it.hasNext()) { - DNodeList dec = it.next(); - if (dec.getTarget() instanceof EClass && dec.isVisible()) { - result.add((EClass) dec.getTarget()); - } - } - return result; - } - - public Set<EClassifier> getDisplayedEClassifiers(DSemanticDiagram diagram) { - Set<EClassifier> result = Sets.newLinkedHashSet(); - Iterator<DNodeList> it = Iterators.filter(new DDiagramQuery(diagram).getAllDiagramElements().iterator(), DNodeList.class); - while (it.hasNext()) { - DNodeList dec = it.next(); - if (dec.getTarget() instanceof EClassifier && dec.isVisible()) { - result.add((EClassifier) dec.getTarget()); - } - } - return result; - } + public Set<EClass> getDisplayedEClasses(DSemanticDiagram diagram) { + Set<EClass> result = Sets.newLinkedHashSet(); + Iterator<DNodeList> it = Iterators.filter(new DDiagramQuery(diagram).getAllDiagramElements().iterator(), + DNodeList.class); + while (it.hasNext()) { + DNodeList dec = it.next(); + if (dec.getTarget() instanceof EClass && dec.isVisible()) { + result.add((EClass) dec.getTarget()); + } + } + return result; + } - private Set<EClass> getInternalEClasses(DSemanticDiagram diagram) { - Set<EClass> result = Sets.newLinkedHashSet(); - Iterator<DNodeList> it = Iterators.filter(new DDiagramQuery(diagram).getAllDiagramElements().iterator(), DNodeList.class); - while (it.hasNext()) { - DNodeList dec = it.next(); - if (dec.getTarget() instanceof EClass) { - if (dec.getActualMapping() != null && CLASS_DIAGRAM_CLASS_MAPPINGID.equals(dec.getActualMapping().getName())) { - result.add((EClass) dec.getTarget()); - } - } - } - return result; - } + public Set<EClassifier> getDisplayedEClassifiers(DSemanticDiagram diagram) { + Set<EClassifier> result = Sets.newLinkedHashSet(); + Iterator<DNodeList> it = Iterators.filter(new DDiagramQuery(diagram).getAllDiagramElements().iterator(), + DNodeList.class); + while (it.hasNext()) { + DNodeList dec = it.next(); + if (dec.getTarget() instanceof EClassifier && dec.isVisible()) { + result.add((EClassifier) dec.getTarget()); + } + } + return result; + } - public Set<EClass> getDirectSuperTypesOrMostSpecificVisibleOnes(EClass self, DSemanticDiagram diagram) { - Set<EClass> result = Sets.newLinkedHashSet(); - Set<EClass> displayed = getDisplayedEClasses(diagram); - for (EClass directSuperType : self.getESuperTypes()) { - if (displayed.contains(directSuperType)) { - result.add(directSuperType); - } else { - Set<EClass> mostSpecificDisplayed = findMostSpecificAndVisible(directSuperType.getESuperTypes(), displayed); - if (mostSpecificDisplayed != null) { - result.addAll(mostSpecificDisplayed); - } - } - } - return result; - } + private Set<EClass> getInternalEClasses(DSemanticDiagram diagram) { + Set<EClass> result = Sets.newLinkedHashSet(); + Iterator<DNodeList> it = Iterators.filter(new DDiagramQuery(diagram).getAllDiagramElements().iterator(), + DNodeList.class); + while (it.hasNext()) { + DNodeList dec = it.next(); + if (dec.getTarget() instanceof EClass) { + if (dec.getActualMapping() != null + && CLASS_DIAGRAM_CLASS_MAPPINGID.equals(dec.getActualMapping().getName())) { + result.add((EClass) dec.getTarget()); + } + } + } + return result; + } - private Set<EClass> findMostSpecificAndVisible(Collection<EClass> superTypes, Set<EClass> displayed) { - Set<EClass> result = Sets.newLinkedHashSet(); - for (EClass eClass : superTypes) { - if (displayed.contains(eClass)) { - result.add(eClass); - } else { - result.addAll(findMostSpecificAndVisible(eClass.getESuperTypes(), displayed)); - } - } - return result; - } + public Set<EClass> getDirectSuperTypesOrMostSpecificVisibleOnes(EClass self, DSemanticDiagram diagram) { + Set<EClass> result = Sets.newLinkedHashSet(); + Set<EClass> displayed = getDisplayedEClasses(diagram); + for (EClass directSuperType : self.getESuperTypes()) { + if (displayed.contains(directSuperType)) { + result.add(directSuperType); + } else { + Set<EClass> mostSpecificDisplayed = findMostSpecificAndVisible(directSuperType.getESuperTypes(), + displayed); + if (mostSpecificDisplayed != null) { + result.addAll(mostSpecificDisplayed); + } + } + } + return result; + } - public Collection<EClass> getExternalEClasses(EPackage root, DSemanticDiagram diagram) { + private Set<EClass> findMostSpecificAndVisible(Collection<EClass> superTypes, Set<EClass> displayed) { + Set<EClass> result = Sets.newLinkedHashSet(); + for (EClass eClass : superTypes) { + if (displayed.contains(eClass)) { + result.add(eClass); + } else { + result.addAll(findMostSpecificAndVisible(eClass.getESuperTypes(), displayed)); + } + } + return result; + } - Set<EClass> related = Sets.newLinkedHashSet(); - Set<EClass> eClasses = getInternalEClasses(diagram); - RelatedElementsSwitch relations = new RelatedElementsSwitch(); - for (EClass eClass : eClasses) { - for (EClass other : Iterables.filter(relations.getRelatedElements(eClass), EClass.class)) { - related.add(other); - } - } + public Collection<EClass> getExternalEClasses(EPackage root, DSemanticDiagram diagram) { - return Sets.difference(related, eClasses); - } + Set<EClass> related = Sets.newLinkedHashSet(); + Set<EClass> eClasses = getInternalEClasses(diagram); + RelatedElementsSwitch relations = new RelatedElementsSwitch(); + for (EClass eClass : eClasses) { + for (EClass other : Iterables.filter(relations.getRelatedElements(eClass), EClass.class)) { + related.add(other); + } + } - public Collection<EReference> getEReferencesToDisplay(EPackage root, DSemanticDiagram diagram) { - // [diagram.getDisplayedEClasses().oclAsType(ecore::EClass).eAllReferences->flatten()/] - Collection<EClass> eClasses = getDisplayedEClasses(diagram); - Set<EReference> eRefs = Sets.newLinkedHashSet(); - for (EClass clazz : eClasses) { - eRefs.addAll(clazz.getEAllReferences()); - } - return eRefs; - } + return Sets.difference(related, eClasses); + } - public Boolean targetIsInterface(EClass clazz, EObject view) { - if (view instanceof DEdge) { - EdgeTarget target = ((DEdge) view).getTargetNode(); - if (target instanceof DSemanticDecorator && ((DSemanticDecorator) target).getTarget() instanceof EClass) { - return ((EClass) ((DSemanticDecorator) target).getTarget()).isInterface(); - } - } - return false; - } + public Collection<EReference> getEReferencesToDisplay(EPackage root, DSemanticDiagram diagram) { + // [diagram.getDisplayedEClasses().oclAsType(ecore::EClass).eAllReferences->flatten()/] + Collection<EClass> eClasses = getDisplayedEClasses(diagram); + Set<EReference> eRefs = Sets.newLinkedHashSet(); + for (EClass clazz : eClasses) { + eRefs.addAll(clazz.getEAllReferences()); + } + return eRefs; + } - public List<EReference> getEOppositeSemanticElements(EReference ref) { - Set<EReference> allRefs = Sets.newLinkedHashSet(); - allRefs.add(ref); - if (ref.getEOpposite() != null) - allRefs.add(ref.getEOpposite()); - return Ordering.natural().onResultOf(new Function<EReference, String>() { + public Boolean targetIsInterface(EClass clazz, EObject view) { + if (view instanceof DEdge) { + EdgeTarget target = ((DEdge) view).getTargetNode(); + if (target instanceof DSemanticDecorator && ((DSemanticDecorator) target).getTarget() instanceof EClass) { + return ((EClass) ((DSemanticDecorator) target).getTarget()).isInterface(); + } + } + return false; + } - public String apply(EReference input) { - return input.getName(); - } - }).sortedCopy(allRefs); - } + public List<EReference> getEOppositeSemanticElements(EReference ref) { + Set<EReference> allRefs = Sets.newLinkedHashSet(); + allRefs.add(ref); + if (ref.getEOpposite() != null) + allRefs.add(ref.getEOpposite()); + return Ordering.natural().onResultOf(new Function<EReference, String>() { - public Collection<EModelElement> getDisplayedEModelElements(DSemanticDiagram diagram) { - Set<EModelElement> modelelements = Sets.newLinkedHashSet(); - Iterator<DSemanticDecorator> it = Iterators.filter(Iterators.concat(Iterators.singletonIterator(diagram), new DDiagramQuery(diagram).getAllDiagramElements().iterator()), - DSemanticDecorator.class); - while (it.hasNext()) { - DSemanticDecorator dec = it.next(); - if (dec.getTarget() instanceof EModelElement) - modelelements.add((EModelElement) dec.getTarget()); - } - return modelelements; - } + public String apply(EReference input) { + return input.getName(); + } + }).sortedCopy(allRefs); + } - public List<EObject> getValidsForDiagram(final EObject element, final DSemanticDecorator containerView) { - Predicate<EObject> validForClassDiagram = new Predicate<EObject>() { + public Collection<EModelElement> getDisplayedEModelElements(DSemanticDiagram diagram) { + Set<EModelElement> modelelements = Sets.newLinkedHashSet(); + Iterator<DSemanticDecorator> it = Iterators.filter(Iterators.concat(Iterators.singletonIterator(diagram), + new DDiagramQuery(diagram).getAllDiagramElements().iterator()), DSemanticDecorator.class); + while (it.hasNext()) { + DSemanticDecorator dec = it.next(); + if (dec.getTarget() instanceof EModelElement) + modelelements.add((EModelElement) dec.getTarget()); + } + return modelelements; + } - public boolean apply(EObject input) { - return input instanceof EPackage || input instanceof EClassifier; - } - }; - return allValidSessionElements(element, validForClassDiagram); - } + public List<EObject> getValidsForDiagram(final EObject element, final DSemanticDecorator containerView) { + Predicate<EObject> validForClassDiagram = new Predicate<EObject>() { - public Collection<EObject> getRelated(EObject firstView, List<EObject> allSelectedViews, DDiagram diag) { - Set<EObject> relateds = Sets.newLinkedHashSet(); - for (DSemanticDecorator decorator : Iterables.filter(allSelectedViews, DSemanticDecorator.class)) { - relateds.addAll(new RelatedElementsSwitch().getRelatedElements(decorator.getTarget())); - } - return relateds; - } + public boolean apply(EObject input) { + return input instanceof EPackage || input instanceof EClassifier; + } + }; + return allValidSessionElements(element, validForClassDiagram); + } - public Collection<EObject> getRelated(EObject firstView, EObject aView, DDiagram diag) { - return getRelated(firstView, Lists.newArrayList(aView), diag); - } + public Collection<EObject> getRelated(EObject firstView, List<EObject> allSelectedViews, DDiagram diag) { + Set<EObject> relateds = Sets.newLinkedHashSet(); + for (DSemanticDecorator decorator : Iterables.filter(allSelectedViews, DSemanticDecorator.class)) { + relateds.addAll(new RelatedElementsSwitch().getRelatedElements(decorator.getTarget())); + } + return relateds; + } - private List<EObject> allValidSessionElements(EObject cur, Predicate<EObject> validForClassDiagram) { - Session found = SessionManager.INSTANCE.getSession(cur); - List<EObject> result = Lists.newArrayList(); - if (found != null) { - for (Resource res : found.getSemanticResources()) { - if (res.getURI().isPlatformResource() || res.getURI().isPlatformPlugin()) { - Iterators.addAll(result, Iterators.filter(res.getAllContents(), validForClassDiagram)); - } - } - } - return result; - } + public Collection<EObject> getRelated(EObject firstView, EObject aView, DDiagram diag) { + return getRelated(firstView, Lists.newArrayList(aView), diag); + } - /** - * Gets the containing resource name, or null. - * - * @param current - * is the object - * @return the resource - */ - public String eResourceName(final EObject current) { - if (current != null && current.eResource() != null) { - return current.eResource().getURI().lastSegment(); - } else { - return null; - } - } + private List<EObject> allValidSessionElements(EObject cur, Predicate<EObject> validForClassDiagram) { + Session found = SessionManager.INSTANCE.getSession(cur); + List<EObject> result = Lists.newArrayList(); + if (found != null) { + for (Resource res : found.getSemanticResources()) { + if (res.getURI().isPlatformResource() || res.getURI().isPlatformPlugin()) { + Iterators.addAll(result, Iterators.filter(res.getAllContents(), validForClassDiagram)); + } + } + } + return result; + } - /** - * Replace spaces by camel case value. - * - * @param any - * @param from - * @return - */ - public String toCamelCase(EObject any, String from) { - if (from != null) { - StringBuffer buffer = new StringBuffer(from.length()); - for (String word : Splitter.on(CharMatcher.WHITESPACE).trimResults().split(from)) { - buffer.append(toU1Case(word)); - } - return buffer.toString(); - } - return from; - } + /** + * Gets the containing resource name, or null. + * + * @param current + * is the object + * @return the resource + */ + public String eResourceName(final EObject current) { + if (current != null && current.eResource() != null) { + return current.eResource().getURI().lastSegment(); + } else { + return null; + } + } - private String toU1Case(String word) { - if (word != null && word.length() > 0) { - return new StringBuilder(word.length()).append(Ascii.toUpperCase(word.charAt(0))).append(word.substring(1)).toString(); - } - return word; - } + /** + * Replace spaces by camel case value. + * + * @param any + * @param from + * @return + */ + public String toCamelCase(EObject any, String from) { + if (from != null) { + StringBuffer buffer = new StringBuffer(from.length()); + for (String word : Splitter.on(CharMatcher.WHITESPACE).trimResults().split(from)) { + buffer.append(toU1Case(word)); + } + return buffer.toString(); + } + return from; + } - /** - * Computes the label of an EAttribute. - */ - public String render(EAttribute attr) { - return new EAttributeServices().render(attr); - } + private String toU1Case(String word) { + if (word != null && word.length() > 0) { + return new StringBuilder(word.length()).append(Ascii.toUpperCase(word.charAt(0))).append(word.substring(1)) + .toString(); + } + return word; + } - /** - * Performs a "direct edit" operation on an EAttribute. - */ - public EStructuralFeature performEdit(EAttribute attr, String editString) { - return new EAttributeServices().performEdit(attr, editString); - } + /** + * Computes the label of an EAttribute. + */ + public String render(EAttribute attr) { + return new EAttributeServices().render(attr); + } - /** - * Performs a "direct edit" operation on an EAttribute. - */ - public EStructuralFeature performEditAsAttribute(EStructuralFeature attr, String editString) { - return new EAttributeServices().performEdit(attr, editString); - } + /** + * Performs a "direct edit" operation on an EAttribute. + */ + public EStructuralFeature performEdit(EAttribute attr, String editString) { + return new EAttributeServices().performEdit(attr, editString); + } - /** - * Computes the label of an EOperation. - */ - public String render(EOperation op) { - return new EOperationServices().render(op); - } + /** + * Performs a "direct edit" operation on an EAttribute. + */ + public EStructuralFeature performEditAsAttribute(EStructuralFeature attr, String editString) { + return new EAttributeServices().performEdit(attr, editString); + } + + /** + * Computes the label of an EOperation. + */ + public String render(EOperation op) { + return new EOperationServices().render(op); + } + + public String renderTooltip(EObject current) { + String result = ""; + Optional<Diagnostic> diag = DiagnosticAttachment.get(current); + if (diag.isPresent()) { + result += prettyMessage(diag.get()); + } + return result; + } + + private String prettyMessage(Diagnostic diag) { + String result = ""; + for (Diagnostic child : diag.getChildren()) { + String message = child.getMessage(); + /* + * we remove any substring which could be the toString of some data + * and replace it with something which will not change on subsequent + * executions. + */ + for (EObject data : Iterables.filter(child.getData(), EObject.class)) { + String instanceVariableString = data.getClass().getName() + "@" + Integer.toHexString(data.hashCode()); + message = message.replace(instanceVariableString, data.eClass().getName()); + } + + result += "\n" + severityLabel(child.getSeverity()) + " : " + message; + result += prettyMessage(child); + } + return result; + } + + private String severityLabel(int severity) { + switch (severity) { + case Diagnostic.ERROR: + return "ERROR"; + case Diagnostic.CANCEL: + return "CANCEL"; + case Diagnostic.INFO: + return "INFO"; + case Diagnostic.WARNING: + return "WARNING"; + case Diagnostic.OK: + return "OK"; + + } + return "UNKNOWN"; + } + + /** + * Computes the tooltip of an EOperation. + * + * @param op + * the operation to get the tooltip from + * @return the tooltip of the given EOperation. + */ + public String renderEOperationTooltip(EOperation op) { + String validationTooltip = renderTooltip(op); + String operationSignature = new EOperationServices().renderEOperationTooltip(op); + if (validationTooltip != null && validationTooltip.length() > 0) { + return validationTooltip + "\n" + operationSignature; + } else { + return operationSignature; + } + } + + /** + * Performs a "direct edit" operation on an EOperation. + */ + public EOperation performEdit(EOperation op, String editString) { + return new EOperationServices().performEdit(op, editString); + } + + public List<ENamedElement> getAllAssociatedElements(EOperation op) { + return new EOperationServices().getAllAssociatedElements(op); + } + + /** + * Computes the label of an EReference. + */ + @Override + public String render(EReference ref) { + return new EReferenceServices().render(ref); + } + + /** + * Computes the label of an EReference. + */ + @Override + public String renderAsNode(EReference ref) { + return new EReferenceServices().renderAsNode(ref); + } - public String renderTooltip(EObject current) { - String result = ""; - Optional<Diagnostic> diag = DiagnosticAttachment.get(current); - if (diag.isPresent()) { - result += prettyMessage(diag.get()); - } - return result; - } + public String renderEOpposite(EReference ref) { + if (ref.getEOpposite() != null) { + return new EReferenceServices().render(ref.getEOpposite()); + } + return ""; + } - private String prettyMessage(Diagnostic diag) { - String result = ""; - for (Diagnostic child : diag.getChildren()) { - String message = child.getMessage(); - /* - * we remove any substring which could be the toString of some data - * and replace it with something which will not change on subsequent - * executions. - */ - for (EObject data : Iterables.filter(child.getData(), EObject.class)) { - String instanceVariableString = data.getClass().getName() + "@" + Integer.toHexString(data.hashCode()); - message = message.replace(instanceVariableString, data.eClass().getName()); - } + /** + * Performs a "direct edit" operation on an EReference. + */ + @Override + public EReference performEdit(EReference ref, String editString) { + return new EReferenceServices().performEdit(ref, editString); + } - result += "\n" + severityLabel(child.getSeverity()) + " : " + message; - result += prettyMessage(child); - } - return result; - } + /** + * Finds a type matching the specified name (case-insensitive) in the same + * resource-set as obj, or inside Ecore itself if none could be found. + * + * @param obj + * the object defining the context in which to look. + * @param name + * the name of the type to look for (case-insensitive). Only + * basic type names are supported (no qualified names). + * Whitespace before or after the name is ignored. + * @return the first type found in the resource set or Ecore itself which + * matches the specified name. + */ + public EClassifier findTypeByName(EObject obj, String name) { + EClassifier result = findTypeByName(allRoots(obj), name); + if (result == null) { + result = findTypeByNameFrom(EcorePackage.eINSTANCE, name); + } + return result; + } - private String severityLabel(int severity) { - switch (severity) { - case Diagnostic.ERROR: - return "ERROR"; - case Diagnostic.CANCEL: - return "CANCEL"; - case Diagnostic.INFO: - return "INFO"; - case Diagnostic.WARNING: - return "WARNING"; - case Diagnostic.OK: - return "OK"; + /** + * Returns the root container; it may be this object itself + * + * @param eObject + * the object to get the root container for. + * @return the root container. + */ + public EObject getRootContainer(EObject eObject) { + return EcoreUtil.getRootContainer(eObject); + } - } - return "UNKNOWN"; - } + private EClassifier findTypeByName(Iterable<EObject> roots, String name) { + for (EObject root : roots) { + EClassifier result = findTypeByNameFrom(root, name); + if (result != null) { + return result; + } + } + return null; + } - /** - * Computes the tooltip of an EOperation. - * - * @param op - * the operation to get the tooltip from - * @return the tooltip of the given EOperation. - */ - public String renderEOperationTooltip(EOperation op) { - String validationTooltip = renderTooltip(op); - String operationSignature = new EOperationServices().renderEOperationTooltip(op); - if (validationTooltip != null && validationTooltip.length() > 0) { - return validationTooltip + "\n" + operationSignature; - } else { - return operationSignature; - } - } + private EClassifier findTypeByNameFrom(EObject root, String name) { + if (root instanceof EClassifier && nameMatches((EClassifier) root, name)) { + return (EClassifier) root; + } + for (EObject obj : AllContents.of(root)) { + if (obj instanceof EClassifier && nameMatches((EClassifier) obj, name)) { + return (EClassifier) obj; + } + } + return null; + } - /** - * Performs a "direct edit" operation on an EOperation. - */ - public EOperation performEdit(EOperation op, String editString) { - return new EOperationServices().performEdit(op, editString); - } + private boolean nameMatches(EClassifier type, String name) { + if (type != null && type.getName() != null && name != null) { + return type.getName().trim().equalsIgnoreCase(name.trim()); + } else { + return false; + } + } - public List<ENamedElement> getAllAssociatedElements(EOperation op) { - return new EOperationServices().getAllAssociatedElements(op); - } + public Boolean hasError(EObject eObj) { + if (eObj instanceof EClass || eObj instanceof EStructuralFeature) { + DiagnosticAttachment attachment = DiagnosticAttachment.getAttachment(eObj); + if (attachment == null) { + Diagnostic diagnostic = Diagnostician.INSTANCE.validate(eObj); + attachment = DiagnosticAttachment.getOrCreate(eObj, diagnostic); + } + Diagnostic diag = attachment.getDiagnostic(); + if (diag != null) { + return diag.getSeverity() == Diagnostic.ERROR; + } + } + return false; + } - /** - * Computes the label of an EReference. - */ - @Override - public String render(EReference ref) { - return new EReferenceServices().render(ref); - } + public Boolean isEDataType(EObject eObj) { + return eObj.eClass() == EcorePackage.eINSTANCE.getEDataType(); + } - /** - * Computes the label of an EReference. - */ - @Override - public String renderAsNode(EReference ref) { - return new EReferenceServices().renderAsNode(ref); - } + public Boolean isDDiagram(EObject any, EObject view) { + return view instanceof DDiagram; + } - public String renderEOpposite(EReference ref) { - if (ref.getEOpposite() != null) { - return new EReferenceServices().render(ref.getEOpposite()); - } - return ""; - } + public List<EObject> eOperationSemanticElements(EOperation eOp) { + List result = Lists.newArrayList(Ordering.natural().onResultOf(new Function<EParameter, String>() { - /** - * Performs a "direct edit" operation on an EReference. - */ - @Override - public EReference performEdit(EReference ref, String editString) { - return new EReferenceServices().performEdit(ref, editString); - } + public String apply(EParameter arg0) { + return arg0.getName(); + } + }).sortedCopy(eOp.getEParameters())); + result.add(0, eOp); + return result; + } - /** - * Finds a type matching the specified name (case-insensitive) in the same - * resource-set as obj, or inside Ecore itself if none could be found. - * - * @param obj - * the object defining the context in which to look. - * @param name - * the name of the type to look for (case-insensitive). Only - * basic type names are supported (no qualified names). - * Whitespace before or after the name is ignored. - * @return the first type found in the resource set or Ecore itself which - * matches the specified name. - */ - public EClassifier findTypeByName(EObject obj, String name) { - EClassifier result = findTypeByName(allRoots(obj), name); - if (result == null) { - result = findTypeByNameFrom(EcorePackage.eINSTANCE, name); - } - return result; - } + public Boolean viewContainerNotSemanticContainer(EObject self, DSemanticDiagram diag, + DSemanticDecorator containerView) { + return containerView.getTarget() != self.eContainer(); + } - /** - * Returns the root container; it may be this object itself - * - * @param eObject - * the object to get the root container for. - * @return the root container. - */ - public EObject getRootContainer(EObject eObject) { - return EcoreUtil.getRootContainer(eObject); - } + public Boolean noEOpposite(EReference ref) { + return ref.getEOpposite() == null; + } - private EClassifier findTypeByName(Iterable<EObject> roots, String name) { - for (EObject root : roots) { - EClassifier result = findTypeByNameFrom(root, name); - if (result != null) { - return result; - } - } - return null; - } + public boolean hasNoDocAnnotation(EObject eObj) { + // Error[eAnnotations.details->select(key = 'documentation')->size() = + // 0/] + if (eObj instanceof EModelElement) { + return EcoreUtil.getDocumentation((EModelElement) eObj) == null; + } + return true; + } - private EClassifier findTypeByNameFrom(EObject root, String name) { - if (root instanceof EClassifier && nameMatches((EClassifier) root, name)) { - return (EClassifier) root; - } - for (EObject obj : AllContents.of(root)) { - if (obj instanceof EClassifier && nameMatches((EClassifier) obj, name)) { - return (EClassifier) obj; - } - } - return null; - } + public EdgeArrows arrowsFillDiamond(EObject any) { + return EdgeArrows.FILL_DIAMOND_LITERAL; + } - private boolean nameMatches(EClassifier type, String name) { - if (type != null && type.getName() != null && name != null) { - return type.getName().trim().equalsIgnoreCase(name.trim()); - } else { - return false; - } - } + public FontFormat fontFormatBold(EObject any) { + return FontFormat.BOLD_LITERAL; + } - public Boolean hasError(EObject eObj) { - if (eObj instanceof EClass || eObj instanceof EStructuralFeature) { - DiagnosticAttachment attachment = DiagnosticAttachment.getAttachment(eObj); - if (attachment == null) { - Diagnostic diagnostic = Diagnostician.INSTANCE.validate(eObj); - attachment = DiagnosticAttachment.getOrCreate(eObj, diagnostic); - } - Diagnostic diag = attachment.getDiagnostic(); - if (diag != null) { - return diag.getSeverity() == Diagnostic.ERROR; - } - } - return false; - } + public void reconnectESuperTypeSource(EObject element, EObject target, EObject source, EObject otherEnd, + EObject edgeView, EObject sourceView) { + if (edgeView instanceof DEdge && ((DEdge) edgeView).getSourceNode() instanceof DSemanticDecorator + && ((DEdge) edgeView).getTargetNode() instanceof DSemanticDecorator) { + EObject newSource = ((DSemanticDecorator) ((DEdge) edgeView).getSourceNode()).getTarget(); + EObject newTarget = ((DSemanticDecorator) ((DEdge) edgeView).getTargetNode()).getTarget(); - public Boolean isEDataType(EObject eObj) { - return eObj.eClass() == EcorePackage.eINSTANCE.getEDataType(); - } + /* + * reconnect source: + */ + if (newSource instanceof EClass && newTarget instanceof EClass && source instanceof EClass) { + ((EClass) source).getESuperTypes().remove(newTarget); + ((EClass) newSource).getESuperTypes().add((EClass) newTarget); - public Boolean isDDiagram(EObject any, EObject view) { - return view instanceof DDiagram; - } + } + } - public List<EObject> eOperationSemanticElements(EOperation eOp) { - List result = Lists.newArrayList(Ordering.natural().onResultOf(new Function<EParameter, String>() { + } - public String apply(EParameter arg0) { - return arg0.getName(); - } - }).sortedCopy(eOp.getEParameters())); - result.add(0, eOp); - return result; - } + public void reconnectESuperTypeTarget(EObject element, EObject target, EObject source, EObject otherEnd, + EObject edgeView, EObject sourceView) { + if (edgeView instanceof DEdge && ((DEdge) edgeView).getSourceNode() instanceof DSemanticDecorator + && ((DEdge) edgeView).getTargetNode() instanceof DSemanticDecorator) { + EObject newTarget = ((DSemanticDecorator) ((DEdge) edgeView).getTargetNode()).getTarget(); - public Boolean viewContainerNotSemanticContainer(EObject self, DSemanticDiagram diag, DSemanticDecorator containerView) { - return containerView.getTarget() != self.eContainer(); - } + /* + * reconnect target: + */ + if (newTarget instanceof EClass && target instanceof EClass && element instanceof EClass) { + ((EClass) element).getESuperTypes().remove(newTarget); + ((EClass) element).getESuperTypes().add((EClass) target); - public Boolean noEOpposite(EReference ref) { - return ref.getEOpposite() == null; - } + } + } - public boolean hasNoDocAnnotation(EObject eObj) { - // Error[eAnnotations.details->select(key = 'documentation')->size() = - // 0/] - if (eObj instanceof EModelElement) { - return EcoreUtil.getDocumentation((EModelElement) eObj) == null; - } - return true; - } + } - public EdgeArrows arrowsFillDiamond(EObject any) { - return EdgeArrows.FILL_DIAMOND_LITERAL; - } + public void reconnectEReferenceSource(EObject element, EObject newValue) { + if (newValue instanceof EClass && element instanceof EReference) { - public FontFormat fontFormatBold(EObject any) { - return FontFormat.BOLD_LITERAL; - } + EReference eRef = (EReference) element; + EClass srcClass = (EClass) newValue; - public void reconnectESuperTypeSource(EObject element, EObject target, EObject source, EObject otherEnd, EObject edgeView, EObject sourceView) { - if (edgeView instanceof DEdge && ((DEdge) edgeView).getSourceNode() instanceof DSemanticDecorator && ((DEdge) edgeView).getTargetNode() instanceof DSemanticDecorator) { - EObject newSource = ((DSemanticDecorator) ((DEdge) edgeView).getSourceNode()).getTarget(); - EObject newTarget = ((DSemanticDecorator) ((DEdge) edgeView).getTargetNode()).getTarget(); + if (eRef.eContainer() != srcClass) { + srcClass.getEStructuralFeatures().add(eRef); + } - /* - * reconnect source: - */ - if (newSource instanceof EClass && newTarget instanceof EClass && source instanceof EClass) { - ((EClass) source).getESuperTypes().remove(newTarget); - ((EClass) newSource).getESuperTypes().add((EClass) newTarget); + } + } - } - } + public void reconnectEReferenceTarget(EObject element, EObject newValue) { + if (newValue != null && element instanceof EReference) { - } + EReference eRef = (EReference) element; - public void reconnectESuperTypeTarget(EObject element, EObject target, EObject source, EObject otherEnd, EObject edgeView, EObject sourceView) { - if (edgeView instanceof DEdge && ((DEdge) edgeView).getSourceNode() instanceof DSemanticDecorator && ((DEdge) edgeView).getTargetNode() instanceof DSemanticDecorator) { - EObject newTarget = ((DSemanticDecorator) ((DEdge) edgeView).getTargetNode()).getTarget(); + if (newValue instanceof EClass) { + EClass targetClass = (EClass) newValue; + if (eRef.getEType() != newValue) { + eRef.setEType(targetClass); + } + } else if (newValue instanceof ETypeParameter) { + if (eRef.getEType() != newValue) { + EGenericsServices.setETypeWithGenerics(eRef, newValue); + } + } - /* - * reconnect target: - */ - if (newTarget instanceof EClass && target instanceof EClass && element instanceof EClass) { - ((EClass) element).getESuperTypes().remove(newTarget); - ((EClass) element).getESuperTypes().add((EClass) target); + } + } - } - } + /** + * Create view. + * + * @param semanticElement + * Semantic element + * @param containerView + * Container view + * @param session + * Session + * @param containerViewVariable + * Name of the container view variable + */ + private void createView(final EObject semanticElement, final DSemanticDecorator containerView, + final Session session, final String containerViewVariable) { + // Get all available mappings applicable for the copiedElement in the + // current container + List<DiagramElementMapping> semanticElementMappings = getMappings(semanticElement, containerView, session); - } + // Build a createView tool + final CreateView createViewOp = ToolFactory.eINSTANCE.createCreateView(); + for (DiagramElementMapping copiedElementMapping : semanticElementMappings) { + final DiagramElementMapping tmpCopiedElementMapping = copiedElementMapping; + createViewOp.setMapping(tmpCopiedElementMapping); + final String containerViewExpression = "var:" + containerViewVariable; + createViewOp.setContainerViewExpression(containerViewExpression); - public void reconnectEReferenceSource(EObject element, EObject newValue) { - if (newValue instanceof EClass && element instanceof EReference) { + session.getTransactionalEditingDomain().getCommandStack() + .execute(new RecordingCommand(session.getTransactionalEditingDomain()) { - EReference eRef = (EReference) element; - EClass srcClass = (EClass) newValue; + @SuppressWarnings("restriction") + @Override + protected void doExecute() { + try { + // Get the command context + DRepresentation representation = null; + if (containerView instanceof DRepresentation) { + representation = (DRepresentation) containerView; + } else if (containerView instanceof DDiagramElement) { + representation = ((DDiagramElement) containerView).getParentDiagram(); + } - if (eRef.eContainer() != srcClass) { - srcClass.getEStructuralFeatures().add(eRef); - } + final CommandContext context = new CommandContext(semanticElement, representation); - } - } + // Execute the create view task + new CreateViewTask(context, session.getModelAccessor(), createViewOp, + session.getInterpreter()).execute(); + } catch (MetaClassNotFoundException e) { + EcoreToolsDesignPlugin.INSTANCE.log(e); + } catch (FeatureNotFoundException e) { + EcoreToolsDesignPlugin.INSTANCE.log(e); + } + } + }); + } + } - public void reconnectEReferenceTarget(EObject element, EObject newValue) { - if (newValue != null && element instanceof EReference) { + /** + * Paste a semantic element and create the corresponding view in the given + * container + * + * @param container + * Semantic container + * @param semanticElement + * Element to paste + * @param containerView + * Container view + */ + public void paste(final EObject container, final EObject semanticElement, final DSemanticDecorator elementView, + final DSemanticDecorator containerView) { + // Paste the semantic element from the clipboard to the selected + // container + final Session session = SessionManager.INSTANCE.getSession(container); + TransactionalEditingDomain domain = session.getTransactionalEditingDomain(); + // The feature is set to null because the domain will deduce it + Command cmd = AddCommand.create(domain, container, null, semanticElement); + if (cmd.canExecute()) { + cmd.execute(); + } + // Create the view for the pasted element + createView(semanticElement, containerView, session, "containerView"); + } - EReference eRef = (EReference) element; + /** + * Get mappings available for a semantic element and a given container view. + * + * @param semanticElement + * Semantic element + * @param containerView + * Container view + * @param session + * Session + * @return List of mappings which could not be null + */ + @SuppressWarnings("restriction") + private List<DiagramElementMapping> getMappings(final EObject semanticElement, + final DSemanticDecorator containerView, Session session) { + ModelAccessor modelAccessor = session.getModelAccessor(); + List<DiagramElementMapping> mappings = new ArrayList<DiagramElementMapping>(); - if (newValue instanceof EClass) { - EClass targetClass = (EClass) newValue; - if (eRef.getEType() != newValue) { - eRef.setEType(targetClass); - } - } else if (newValue instanceof ETypeParameter) { - if (eRef.getEType() != newValue) { - EGenericsServices.setETypeWithGenerics(eRef, newValue); - } - } + if (containerView instanceof DSemanticDiagram) { - } - } + for (DiagramElementMapping mapping : (((DSemanticDiagram) containerView).getDescription() + .getAllContainerMappings())) { + String domainClass = ((AbstractNodeMapping) mapping).getDomainClass(); + if (modelAccessor.eInstanceOf(semanticElement, domainClass) && !mapping.isCreateElements()) { + mappings.add(mapping); + } + } + for (DiagramElementMapping mapping : (((DSemanticDiagram) containerView).getDescription() + .getAllNodeMappings())) { + String domainClass = ((AbstractNodeMapping) mapping).getDomainClass(); + if (modelAccessor.eInstanceOf(semanticElement, domainClass) && !mapping.isCreateElements()) { + mappings.add(mapping); + } + } + } else if (containerView instanceof DNodeContainer) { + for (DiagramElementMapping mapping : (((DNodeContainer) containerView).getActualMapping() + .getAllContainerMappings())) { + String domainClass = ((AbstractNodeMapping) mapping).getDomainClass(); + if (modelAccessor.eInstanceOf(semanticElement, domainClass) && !mapping.isCreateElements()) { + mappings.add(mapping); + } + } + for (DiagramElementMapping mapping : (((DNodeContainer) containerView).getActualMapping() + .getAllNodeMappings())) { + String domainClass = ((AbstractNodeMapping) mapping).getDomainClass(); + if (modelAccessor.eInstanceOf(semanticElement, domainClass) && !mapping.isCreateElements()) { + mappings.add(mapping); + } + } + } + return mappings; + } - /** - * Create view. - * - * @param semanticElement - * Semantic element - * @param containerView - * Container view - * @param session - * Session - * @param containerViewVariable - * Name of the container view variable - */ - private void createView(final EObject semanticElement, final DSemanticDecorator containerView, final Session session, final String containerViewVariable) { - // Get all available mappings applicable for the copiedElement in the - // current container - List<DiagramElementMapping> semanticElementMappings = getMappings(semanticElement, containerView, session); + public String getClassesTableName(EObject cur) { + // [(if (oclIsKindOf(ecore::EStructuralFeature) and + // oclAsType(ecore::EStructuralFeature).derived) then '/' else '' endif) + // + name/] + if (cur instanceof EStructuralFeature) { + if (((EStructuralFeature) cur).isDerived()) { + return "/" + ((EStructuralFeature) cur).getName(); + } + } + if (cur instanceof ENamedElement) { + return ((ENamedElement) cur).getName(); + } + return cur.eClass().getName(); + } - // Build a createView tool - final CreateView createViewOp = ToolFactory.eINSTANCE.createCreateView(); - for (DiagramElementMapping copiedElementMapping : semanticElementMappings) { - final DiagramElementMapping tmpCopiedElementMapping = copiedElementMapping; - createViewOp.setMapping(tmpCopiedElementMapping); - final String containerViewExpression = "var:" + containerViewVariable; - createViewOp.setContainerViewExpression(containerViewExpression); + public boolean hasCDOBundle(EObject cur) { + return Platform.getBundle("org.eclipse.emf.cdo") != null; + } - session.getTransactionalEditingDomain().getCommandStack().execute(new RecordingCommand(session.getTransactionalEditingDomain()) { + public EObject enableCDOGen(EObject cur, Set<GenModel> genmodels) throws IOException { + for (GenModel genModel : genmodels) { + if (isNotFromPluginsOrRegistry(genModel)) { + genModel.getModelPluginVariables().add("CDO=org.eclipse.emf.cdo"); + genModel.setRootExtendsInterface("org.eclipse.emf.cdo.CDOObject"); + genModel.setRootExtendsClass("org.eclipse.emf.internal.cdo.CDOObjectImpl"); + genModel.setFeatureDelegation(GenDelegationKind.REFLECTIVE_LITERAL); + genModel.setProviderRootExtendsClass("org.eclipse.emf.cdo.edit.CDOItemProviderAdapter"); - @SuppressWarnings("restriction") - @Override - protected void doExecute() { - try { - // Get the command context - DRepresentation representation = null; - if (containerView instanceof DRepresentation) { - representation = (DRepresentation) containerView; - } else if (containerView instanceof DDiagramElement) { - representation = ((DDiagramElement) containerView).getParentDiagram(); - } + if (genModel.eResource().getURI().isPlatformResource()) { + URI cdoMFURI = getCDOMFUri(genModel); + if (!URIConverter.INSTANCE.exists(cdoMFURI, Collections.EMPTY_MAP)) { + try (OutputStream out = URIConverter.INSTANCE.createOutputStream(cdoMFURI, + Collections.EMPTY_MAP)) { + new PrintWriter(out).write("This is a marker file for bundles with CDO native models."); + } + } - final CommandContext context = new CommandContext(semanticElement, representation); + } - // Execute the create view task - new CreateViewTask(context, session.getModelAccessor(), createViewOp, session.getInterpreter()).execute(); - } catch (MetaClassNotFoundException e) { - EcoreToolsDesignPlugin.INSTANCE.log(e); - } catch (FeatureNotFoundException e) { - EcoreToolsDesignPlugin.INSTANCE.log(e); - } - } - }); - } - } + } + } + return cur; + } - /** - * Paste a semantic element and create the corresponding view in the given - * container - * - * @param container - * Semantic container - * @param semanticElement - * Element to paste - * @param containerView - * Container view - */ - public void paste(final EObject container, final EObject semanticElement, final DSemanticDecorator elementView, final DSemanticDecorator containerView) { - // Paste the semantic element from the clipboard to the selected - // container - final Session session = SessionManager.INSTANCE.getSession(container); - TransactionalEditingDomain domain = session.getTransactionalEditingDomain(); - // The feature is set to null because the domain will deduce it - Command cmd = AddCommand.create(domain, container, null, semanticElement); - if (cmd.canExecute()) { - cmd.execute(); - } - // Create the view for the pasted element - createView(semanticElement, containerView, session, "containerView"); - } + private boolean isNotFromPluginsOrRegistry(GenModel genModel) { + return genModel.eResource() != null && genModel.eResource().getURI() != null + && !genModel.eResource().getURI().isPlatformPlugin(); + } - /** - * Get mappings available for a semantic element and a given container view. - * - * @param semanticElement - * Semantic element - * @param containerView - * Container view - * @param session - * Session - * @return List of mappings which could not be null - */ - @SuppressWarnings("restriction") - private List<DiagramElementMapping> getMappings(final EObject semanticElement, final DSemanticDecorator containerView, Session session) { - ModelAccessor modelAccessor = session.getModelAccessor(); - List<DiagramElementMapping> mappings = new ArrayList<DiagramElementMapping>(); + private URI getCDOMFUri(GenModel genModel) { + return URI.createPlatformResourceURI(genModel.eResource().getURI().segment(1), true).appendSegment("META-INF") + .appendSegment("CDO.MF"); + } - if (containerView instanceof DSemanticDiagram) { + public EObject disableCDOGen(EObject cur, Set<GenModel> genmodels) throws IOException { + for (GenModel genModel : genmodels) { + if (isNotFromPluginsOrRegistry(genModel)) { + genModel.getModelPluginVariables().remove("CDO=org.eclipse.emf.cdo"); + genModel.setRootExtendsInterface("org.eclipse.emf.ecore.EObject"); + genModel.setRootExtendsClass("org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container"); + genModel.setFeatureDelegation(GenDelegationKind.NONE_LITERAL); + genModel.setProviderRootExtendsClass(null); - for (DiagramElementMapping mapping : (((DSemanticDiagram) containerView).getDescription().getAllContainerMappings())) { - String domainClass = ((AbstractNodeMapping) mapping).getDomainClass(); - if (modelAccessor.eInstanceOf(semanticElement, domainClass) && !mapping.isCreateElements()) { - mappings.add(mapping); - } - } - for (DiagramElementMapping mapping : (((DSemanticDiagram) containerView).getDescription().getAllNodeMappings())) { - String domainClass = ((AbstractNodeMapping) mapping).getDomainClass(); - if (modelAccessor.eInstanceOf(semanticElement, domainClass) && !mapping.isCreateElements()) { - mappings.add(mapping); - } - } - } else if (containerView instanceof DNodeContainer) { - for (DiagramElementMapping mapping : (((DNodeContainer) containerView).getActualMapping().getAllContainerMappings())) { - String domainClass = ((AbstractNodeMapping) mapping).getDomainClass(); - if (modelAccessor.eInstanceOf(semanticElement, domainClass) && !mapping.isCreateElements()) { - mappings.add(mapping); - } - } - for (DiagramElementMapping mapping : (((DNodeContainer) containerView).getActualMapping().getAllNodeMappings())) { - String domainClass = ((AbstractNodeMapping) mapping).getDomainClass(); - if (modelAccessor.eInstanceOf(semanticElement, domainClass) && !mapping.isCreateElements()) { - mappings.add(mapping); - } - } - } - return mappings; - } + if (genModel.eResource().getURI().isPlatformResource()) { + URI cdoMFURI = getCDOMFUri(genModel); + if (URIConverter.INSTANCE.exists(cdoMFURI, Collections.EMPTY_MAP)) { + URIConverter.INSTANCE.delete(cdoMFURI, Collections.EMPTY_MAP); + } - public String getClassesTableName(EObject cur) { - // [(if (oclIsKindOf(ecore::EStructuralFeature) and - // oclAsType(ecore::EStructuralFeature).derived) then '/' else '' endif) - // + name/] - if (cur instanceof EStructuralFeature) { - if (((EStructuralFeature) cur).isDerived()) { - return "/" + ((EStructuralFeature) cur).getName(); - } - } - if (cur instanceof ENamedElement) { - return ((ENamedElement) cur).getName(); - } - return cur.eClass().getName(); - } + } + } + } + return cur; + } }
diff --git a/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/service/GenerationServices.java b/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/service/GenerationServices.java index dbd2873..c860ddc 100644 --- a/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/service/GenerationServices.java +++ b/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/service/GenerationServices.java
@@ -1,5 +1,11 @@ package org.eclipse.emf.ecoretools.design.service; +import java.util.Set; + +import org.eclipse.emf.codegen.ecore.genmodel.GenDelegationKind; +import org.eclipse.emf.codegen.ecore.genmodel.GenModel; + public class GenerationServices extends DesignServices { + }