Java tutorial
/******************************************************************************* * Copyright (c) 2013 THALES GLOBAL SERVICES 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: * Obeo - initial API and implementation *******************************************************************************/ package org.eclipse.emf.ecoretools.design.service; import java.util.Collection; import java.util.List; import java.util.Set; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EOperation; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EParameter; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature.Setting; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.util.ECrossReferenceAdapter; import org.eclipse.emf.ecore.util.EcoreSwitch; import org.eclipse.sirius.business.api.session.Session; import org.eclipse.sirius.business.api.session.SessionManager; import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; /** * A switch implementation retrieving all the elements which might be related to * a single one. */ public class RelatedElementsSwitch extends EcoreSwitch<List<EObject>> { private Set<EObject> relateds; private Collection<Setting> xRefs; private ECrossReferenceAdapter referencer; public RelatedElementsSwitch() { } public RelatedElementsSwitch(ECrossReferenceAdapter xRef) { this.referencer = xRef; } public List<EObject> getRelatedElements(EObject ctx) { Session sess = SessionManager.INSTANCE.getSession(ctx); relateds = Sets.newLinkedHashSet(); if (sess != null) { xRefs = sess.getSemanticCrossReferencer().getInverseReferences(ctx); } else if (referencer != null) { xRefs = referencer.getInverseReferences(ctx); } doSwitch(ctx); relateds.remove(ctx); // hack to prevent some null element in relateds for a unknown reason. relateds.remove(null); return ImmutableList.copyOf(relateds); } @Override public List<EObject> caseEClass(EClass object) { relateds.addAll(object.getESuperTypes()); for (Setting xRef : xRefs) { if (xRef.getEObject() instanceof EClass) { relateds.add(xRef.getEObject()); } else if (xRef.getEObject() instanceof EReference && xRef.getEStructuralFeature() == EcorePackage.eINSTANCE.getEReference_EReferenceType()) { relateds.add(((EReference) xRef.getEObject()).getEContainingClass()); } } for (EReference eRef : object.getEReferences()) { if (eRef.getEType() != null) { relateds.add(eRef.getEType()); } } return super.caseEClass(object); } @Override public List<EObject> caseEOperation(EOperation object) { if (object.getEType() != null) { relateds.add(object.getEType()); } for (EParameter param : object.getEParameters()) { if (param.getEType() != null) { relateds.add(param.getEType()); } } return super.caseEOperation(object); } @Override public List<EObject> caseEReference(EReference object) { relateds.add(object.getEType()); return super.caseEReference(object); } @Override public List<EObject> caseEPackage(EPackage object) { relateds.addAll(object.getEClassifiers()); return super.caseEPackage(object); } }