/*
* Copyright (c) 2012-2016 Marsha Chechik, Alessio Di Sandro, Michalis Famelis,
* Rick Salay.
* 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:
* Alessio Di Sandro - Implementation.
*/
package edu.toronto.cs.se.modelepedia.classdiagram.diagram.part;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.gmf.tooling.runtime.update.DiagramUpdater;
import edu.toronto.cs.se.modelepedia.classdiagram.Association;
import edu.toronto.cs.se.modelepedia.classdiagram.Attribute;
import edu.toronto.cs.se.modelepedia.classdiagram.Class;
import edu.toronto.cs.se.modelepedia.classdiagram.ClassDiagram;
import edu.toronto.cs.se.modelepedia.classdiagram.ClassDiagramPackage;
import edu.toronto.cs.se.modelepedia.classdiagram.Dependency;
import edu.toronto.cs.se.modelepedia.classdiagram.Operation;
import edu.toronto.cs.se.modelepedia.classdiagram.diagram.edit.parts.AssociationEditPart;
import edu.toronto.cs.se.modelepedia.classdiagram.diagram.edit.parts.AttributeEditPart;
import edu.toronto.cs.se.modelepedia.classdiagram.diagram.edit.parts.ClassClassOwnedAttributesCompartmentEditPart;
import edu.toronto.cs.se.modelepedia.classdiagram.diagram.edit.parts.ClassClassOwnedOperationsCompartmentEditPart;
import edu.toronto.cs.se.modelepedia.classdiagram.diagram.edit.parts.ClassDiagramEditPart;
import edu.toronto.cs.se.modelepedia.classdiagram.diagram.edit.parts.ClassEditPart;
import edu.toronto.cs.se.modelepedia.classdiagram.diagram.edit.parts.ClassNestedInEditPart;
import edu.toronto.cs.se.modelepedia.classdiagram.diagram.edit.parts.ClassSuperclassEditPart;
import edu.toronto.cs.se.modelepedia.classdiagram.diagram.edit.parts.DependencyEditPart;
import edu.toronto.cs.se.modelepedia.classdiagram.diagram.edit.parts.OperationEditPart;
import edu.toronto.cs.se.modelepedia.classdiagram.diagram.providers.ClassDiagramElementTypes;
/**
* @generated
*/
public class ClassDiagramDiagramUpdater {
/**
* @generated
*/
public static boolean isShortcutOrphaned(View view) {
return !view.isSetElement() || view.getElement() == null || view.getElement().eIsProxy();
}
/**
* @generated
*/
public static List<ClassDiagramNodeDescriptor> getSemanticChildren(View view) {
switch (ClassDiagramVisualIDRegistry.getVisualID(view)) {
case ClassDiagramEditPart.VISUAL_ID:
return getClassDiagram_1000SemanticChildren(view);
case ClassClassOwnedAttributesCompartmentEditPart.VISUAL_ID:
return getClassClassOwnedAttributesCompartment_7001SemanticChildren(view);
case ClassClassOwnedOperationsCompartmentEditPart.VISUAL_ID:
return getClassClassOwnedOperationsCompartment_7002SemanticChildren(view);
}
return Collections.emptyList();
}
/**
* @generated
*/
public static List<ClassDiagramNodeDescriptor> getClassDiagram_1000SemanticChildren(View view) {
if (!view.isSetElement()) {
return Collections.emptyList();
}
ClassDiagram modelElement = (ClassDiagram) view.getElement();
LinkedList<ClassDiagramNodeDescriptor> result = new LinkedList<ClassDiagramNodeDescriptor>();
for (Iterator<?> it = modelElement.getClasses().iterator(); it.hasNext();) {
Class childElement = (Class) it.next();
int visualID = ClassDiagramVisualIDRegistry.getNodeVisualID(view, childElement);
if (visualID == ClassEditPart.VISUAL_ID) {
result.add(new ClassDiagramNodeDescriptor(childElement, visualID));
continue;
}
}
return result;
}
/**
* @generated
*/
public static List<ClassDiagramNodeDescriptor> getClassClassOwnedAttributesCompartment_7001SemanticChildren(
View view) {
if (false == view.eContainer() instanceof View) {
return Collections.emptyList();
}
View containerView = (View) view.eContainer();
if (!containerView.isSetElement()) {
return Collections.emptyList();
}
Class modelElement = (Class) containerView.getElement();
LinkedList<ClassDiagramNodeDescriptor> result = new LinkedList<ClassDiagramNodeDescriptor>();
for (Iterator<?> it = modelElement.getOwnedAttributes().iterator(); it.hasNext();) {
Attribute childElement = (Attribute) it.next();
int visualID = ClassDiagramVisualIDRegistry.getNodeVisualID(view, childElement);
if (visualID == AttributeEditPart.VISUAL_ID) {
result.add(new ClassDiagramNodeDescriptor(childElement, visualID));
continue;
}
}
return result;
}
/**
* @generated
*/
public static List<ClassDiagramNodeDescriptor> getClassClassOwnedOperationsCompartment_7002SemanticChildren(
View view) {
if (false == view.eContainer() instanceof View) {
return Collections.emptyList();
}
View containerView = (View) view.eContainer();
if (!containerView.isSetElement()) {
return Collections.emptyList();
}
Class modelElement = (Class) containerView.getElement();
LinkedList<ClassDiagramNodeDescriptor> result = new LinkedList<ClassDiagramNodeDescriptor>();
for (Iterator<?> it = modelElement.getOwnedOperations().iterator(); it.hasNext();) {
Operation childElement = (Operation) it.next();
int visualID = ClassDiagramVisualIDRegistry.getNodeVisualID(view, childElement);
if (visualID == OperationEditPart.VISUAL_ID) {
result.add(new ClassDiagramNodeDescriptor(childElement, visualID));
continue;
}
}
return result;
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getContainedLinks(View view) {
switch (ClassDiagramVisualIDRegistry.getVisualID(view)) {
case ClassDiagramEditPart.VISUAL_ID:
return getClassDiagram_1000ContainedLinks(view);
case ClassEditPart.VISUAL_ID:
return getClass_2001ContainedLinks(view);
case AttributeEditPart.VISUAL_ID:
return getAttribute_3001ContainedLinks(view);
case OperationEditPart.VISUAL_ID:
return getOperation_3002ContainedLinks(view);
case AssociationEditPart.VISUAL_ID:
return getAssociation_4001ContainedLinks(view);
case DependencyEditPart.VISUAL_ID:
return getDependency_4002ContainedLinks(view);
}
return Collections.emptyList();
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getIncomingLinks(View view) {
switch (ClassDiagramVisualIDRegistry.getVisualID(view)) {
case ClassEditPart.VISUAL_ID:
return getClass_2001IncomingLinks(view);
case AttributeEditPart.VISUAL_ID:
return getAttribute_3001IncomingLinks(view);
case OperationEditPart.VISUAL_ID:
return getOperation_3002IncomingLinks(view);
case AssociationEditPart.VISUAL_ID:
return getAssociation_4001IncomingLinks(view);
case DependencyEditPart.VISUAL_ID:
return getDependency_4002IncomingLinks(view);
}
return Collections.emptyList();
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getOutgoingLinks(View view) {
switch (ClassDiagramVisualIDRegistry.getVisualID(view)) {
case ClassEditPart.VISUAL_ID:
return getClass_2001OutgoingLinks(view);
case AttributeEditPart.VISUAL_ID:
return getAttribute_3001OutgoingLinks(view);
case OperationEditPart.VISUAL_ID:
return getOperation_3002OutgoingLinks(view);
case AssociationEditPart.VISUAL_ID:
return getAssociation_4001OutgoingLinks(view);
case DependencyEditPart.VISUAL_ID:
return getDependency_4002OutgoingLinks(view);
}
return Collections.emptyList();
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getClassDiagram_1000ContainedLinks(View view) {
ClassDiagram modelElement = (ClassDiagram) view.getElement();
LinkedList<ClassDiagramLinkDescriptor> result = new LinkedList<ClassDiagramLinkDescriptor>();
result.addAll(getContainedTypeModelFacetLinks_Association_4001(modelElement));
result.addAll(getContainedTypeModelFacetLinks_Dependency_4002(modelElement));
return result;
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getClass_2001ContainedLinks(View view) {
Class modelElement = (Class) view.getElement();
LinkedList<ClassDiagramLinkDescriptor> result = new LinkedList<ClassDiagramLinkDescriptor>();
result.addAll(getOutgoingFeatureModelFacetLinks_Class_NestedIn_4003(modelElement));
result.addAll(getOutgoingFeatureModelFacetLinks_Class_Superclass_4004(modelElement));
return result;
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getAttribute_3001ContainedLinks(View view) {
return Collections.emptyList();
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getOperation_3002ContainedLinks(View view) {
return Collections.emptyList();
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getAssociation_4001ContainedLinks(View view) {
return Collections.emptyList();
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getDependency_4002ContainedLinks(View view) {
return Collections.emptyList();
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getClass_2001IncomingLinks(View view) {
Class modelElement = (Class) view.getElement();
Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences = EcoreUtil.CrossReferencer
.find(view.eResource().getResourceSet().getResources());
LinkedList<ClassDiagramLinkDescriptor> result = new LinkedList<ClassDiagramLinkDescriptor>();
result.addAll(getIncomingTypeModelFacetLinks_Association_4001(modelElement, crossReferences));
result.addAll(getIncomingTypeModelFacetLinks_Dependency_4002(modelElement, crossReferences));
result.addAll(getIncomingFeatureModelFacetLinks_Class_NestedIn_4003(modelElement, crossReferences));
result.addAll(getIncomingFeatureModelFacetLinks_Class_Superclass_4004(modelElement, crossReferences));
return result;
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getAttribute_3001IncomingLinks(View view) {
return Collections.emptyList();
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getOperation_3002IncomingLinks(View view) {
return Collections.emptyList();
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getAssociation_4001IncomingLinks(View view) {
return Collections.emptyList();
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getDependency_4002IncomingLinks(View view) {
return Collections.emptyList();
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getClass_2001OutgoingLinks(View view) {
Class modelElement = (Class) view.getElement();
LinkedList<ClassDiagramLinkDescriptor> result = new LinkedList<ClassDiagramLinkDescriptor>();
result.addAll(getOutgoingTypeModelFacetLinks_Association_4001(modelElement));
result.addAll(getOutgoingTypeModelFacetLinks_Dependency_4002(modelElement));
result.addAll(getOutgoingFeatureModelFacetLinks_Class_NestedIn_4003(modelElement));
result.addAll(getOutgoingFeatureModelFacetLinks_Class_Superclass_4004(modelElement));
return result;
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getAttribute_3001OutgoingLinks(View view) {
return Collections.emptyList();
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getOperation_3002OutgoingLinks(View view) {
return Collections.emptyList();
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getAssociation_4001OutgoingLinks(View view) {
return Collections.emptyList();
}
/**
* @generated
*/
public static List<ClassDiagramLinkDescriptor> getDependency_4002OutgoingLinks(View view) {
return Collections.emptyList();
}
/**
* @generated
*/
private static Collection<ClassDiagramLinkDescriptor> getContainedTypeModelFacetLinks_Association_4001(
ClassDiagram container) {
LinkedList<ClassDiagramLinkDescriptor> result = new LinkedList<ClassDiagramLinkDescriptor>();
for (Iterator<?> links = container.getAssociations().iterator(); links.hasNext();) {
EObject linkObject = (EObject) links.next();
if (false == linkObject instanceof Association) {
continue;
}
Association link = (Association) linkObject;
if (AssociationEditPart.VISUAL_ID != ClassDiagramVisualIDRegistry.getLinkWithClassVisualID(link)) {
continue;
}
Class dst = link.getTarget();
Class src = link.getSource();
result.add(
new ClassDiagramLinkDescriptor(
src,
dst,
link,
ClassDiagramElementTypes.Association_4001,
AssociationEditPart.VISUAL_ID));
}
return result;
}
/**
* @generated
*/
private static Collection<ClassDiagramLinkDescriptor> getContainedTypeModelFacetLinks_Dependency_4002(
ClassDiagram container) {
LinkedList<ClassDiagramLinkDescriptor> result = new LinkedList<ClassDiagramLinkDescriptor>();
for (Iterator<?> links = container.getDependencies().iterator(); links.hasNext();) {
EObject linkObject = (EObject) links.next();
if (false == linkObject instanceof Dependency) {
continue;
}
Dependency link = (Dependency) linkObject;
if (DependencyEditPart.VISUAL_ID != ClassDiagramVisualIDRegistry.getLinkWithClassVisualID(link)) {
continue;
}
Class dst = link.getDepender();
Class src = link.getDependee();
result.add(
new ClassDiagramLinkDescriptor(
src,
dst,
link,
ClassDiagramElementTypes.Dependency_4002,
DependencyEditPart.VISUAL_ID));
}
return result;
}
/**
* @generated
*/
private static Collection<ClassDiagramLinkDescriptor> getIncomingTypeModelFacetLinks_Association_4001(
Class target, Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences) {
LinkedList<ClassDiagramLinkDescriptor> result = new LinkedList<ClassDiagramLinkDescriptor>();
Collection<EStructuralFeature.Setting> settings = crossReferences.get(target);
for (EStructuralFeature.Setting setting : settings) {
if (setting.getEStructuralFeature() != ClassDiagramPackage.eINSTANCE.getAssociation_Target()
|| false == setting.getEObject() instanceof Association) {
continue;
}
Association link = (Association) setting.getEObject();
if (AssociationEditPart.VISUAL_ID != ClassDiagramVisualIDRegistry.getLinkWithClassVisualID(link)) {
continue;
}
Class src = link.getSource();
result.add(
new ClassDiagramLinkDescriptor(
src,
target,
link,
ClassDiagramElementTypes.Association_4001,
AssociationEditPart.VISUAL_ID));
}
return result;
}
/**
* @generated
*/
private static Collection<ClassDiagramLinkDescriptor> getIncomingTypeModelFacetLinks_Dependency_4002(
Class target, Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences) {
LinkedList<ClassDiagramLinkDescriptor> result = new LinkedList<ClassDiagramLinkDescriptor>();
Collection<EStructuralFeature.Setting> settings = crossReferences.get(target);
for (EStructuralFeature.Setting setting : settings) {
if (setting.getEStructuralFeature() != ClassDiagramPackage.eINSTANCE.getDependency_Depender()
|| false == setting.getEObject() instanceof Dependency) {
continue;
}
Dependency link = (Dependency) setting.getEObject();
if (DependencyEditPart.VISUAL_ID != ClassDiagramVisualIDRegistry.getLinkWithClassVisualID(link)) {
continue;
}
Class src = link.getDependee();
result.add(
new ClassDiagramLinkDescriptor(
src,
target,
link,
ClassDiagramElementTypes.Dependency_4002,
DependencyEditPart.VISUAL_ID));
}
return result;
}
/**
* @generated
*/
private static Collection<ClassDiagramLinkDescriptor> getIncomingFeatureModelFacetLinks_Class_NestedIn_4003(
Class target, Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences) {
LinkedList<ClassDiagramLinkDescriptor> result = new LinkedList<ClassDiagramLinkDescriptor>();
Collection<EStructuralFeature.Setting> settings = crossReferences.get(target);
for (EStructuralFeature.Setting setting : settings) {
if (setting.getEStructuralFeature() == ClassDiagramPackage.eINSTANCE.getClass_NestedIn()) {
result.add(
new ClassDiagramLinkDescriptor(
setting.getEObject(),
target,
ClassDiagramElementTypes.ClassNestedIn_4003,
ClassNestedInEditPart.VISUAL_ID));
}
}
return result;
}
/**
* @generated
*/
private static Collection<ClassDiagramLinkDescriptor> getIncomingFeatureModelFacetLinks_Class_Superclass_4004(
Class target, Map<EObject, Collection<EStructuralFeature.Setting>> crossReferences) {
LinkedList<ClassDiagramLinkDescriptor> result = new LinkedList<ClassDiagramLinkDescriptor>();
Collection<EStructuralFeature.Setting> settings = crossReferences.get(target);
for (EStructuralFeature.Setting setting : settings) {
if (setting.getEStructuralFeature() == ClassDiagramPackage.eINSTANCE.getClass_Superclass()) {
result.add(
new ClassDiagramLinkDescriptor(
setting.getEObject(),
target,
ClassDiagramElementTypes.ClassSuperclass_4004,
ClassSuperclassEditPart.VISUAL_ID));
}
}
return result;
}
/**
* @generated
*/
private static Collection<ClassDiagramLinkDescriptor> getOutgoingTypeModelFacetLinks_Association_4001(
Class source) {
ClassDiagram 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 (EObject element = source; element != null && container == null; element = element.eContainer()) {
if (element instanceof ClassDiagram) {
container = (ClassDiagram) element;
}
}
if (container == null) {
return Collections.emptyList();
}
LinkedList<ClassDiagramLinkDescriptor> result = new LinkedList<ClassDiagramLinkDescriptor>();
for (Iterator<?> links = container.getAssociations().iterator(); links.hasNext();) {
EObject linkObject = (EObject) links.next();
if (false == linkObject instanceof Association) {
continue;
}
Association link = (Association) linkObject;
if (AssociationEditPart.VISUAL_ID != ClassDiagramVisualIDRegistry.getLinkWithClassVisualID(link)) {
continue;
}
Class dst = link.getTarget();
Class src = link.getSource();
if (src != source) {
continue;
}
result.add(
new ClassDiagramLinkDescriptor(
src,
dst,
link,
ClassDiagramElementTypes.Association_4001,
AssociationEditPart.VISUAL_ID));
}
return result;
}
/**
* @generated
*/
private static Collection<ClassDiagramLinkDescriptor> getOutgoingTypeModelFacetLinks_Dependency_4002(Class source) {
ClassDiagram 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 (EObject element = source; element != null && container == null; element = element.eContainer()) {
if (element instanceof ClassDiagram) {
container = (ClassDiagram) element;
}
}
if (container == null) {
return Collections.emptyList();
}
LinkedList<ClassDiagramLinkDescriptor> result = new LinkedList<ClassDiagramLinkDescriptor>();
for (Iterator<?> links = container.getDependencies().iterator(); links.hasNext();) {
EObject linkObject = (EObject) links.next();
if (false == linkObject instanceof Dependency) {
continue;
}
Dependency link = (Dependency) linkObject;
if (DependencyEditPart.VISUAL_ID != ClassDiagramVisualIDRegistry.getLinkWithClassVisualID(link)) {
continue;
}
Class dst = link.getDepender();
Class src = link.getDependee();
if (src != source) {
continue;
}
result.add(
new ClassDiagramLinkDescriptor(
src,
dst,
link,
ClassDiagramElementTypes.Dependency_4002,
DependencyEditPart.VISUAL_ID));
}
return result;
}
/**
* @generated
*/
private static Collection<ClassDiagramLinkDescriptor> getOutgoingFeatureModelFacetLinks_Class_NestedIn_4003(
Class source) {
LinkedList<ClassDiagramLinkDescriptor> result = new LinkedList<ClassDiagramLinkDescriptor>();
Class destination = source.getNestedIn();
if (destination == null) {
return result;
}
result.add(
new ClassDiagramLinkDescriptor(
source,
destination,
ClassDiagramElementTypes.ClassNestedIn_4003,
ClassNestedInEditPart.VISUAL_ID));
return result;
}
/**
* @generated
*/
private static Collection<ClassDiagramLinkDescriptor> getOutgoingFeatureModelFacetLinks_Class_Superclass_4004(
Class source) {
LinkedList<ClassDiagramLinkDescriptor> result = new LinkedList<ClassDiagramLinkDescriptor>();
Class destination = source.getSuperclass();
if (destination == null) {
return result;
}
result.add(
new ClassDiagramLinkDescriptor(
source,
destination,
ClassDiagramElementTypes.ClassSuperclass_4004,
ClassSuperclassEditPart.VISUAL_ID));
return result;
}
/**
* @generated
*/
public static final DiagramUpdater TYPED_INSTANCE = new DiagramUpdater() {
/**
* @generated
*/
@Override
public List<ClassDiagramNodeDescriptor> getSemanticChildren(View view) {
return ClassDiagramDiagramUpdater.getSemanticChildren(view);
}
/**
* @generated
*/
@Override
public List<ClassDiagramLinkDescriptor> getContainedLinks(View view) {
return ClassDiagramDiagramUpdater.getContainedLinks(view);
}
/**
* @generated
*/
@Override
public List<ClassDiagramLinkDescriptor> getIncomingLinks(View view) {
return ClassDiagramDiagramUpdater.getIncomingLinks(view);
}
/**
* @generated
*/
@Override
public List<ClassDiagramLinkDescriptor> getOutgoingLinks(View view) {
return ClassDiagramDiagramUpdater.getOutgoingLinks(view);
}
};
}