| package org.eclipse.emf.ecoretools.design.service; |
| |
| import java.util.Collection; |
| import java.util.Set; |
| |
| import org.eclipse.emf.ecore.EClass; |
| import org.eclipse.emf.ecore.EClassifier; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.EPackage; |
| import org.eclipse.emf.ecore.EStructuralFeature; |
| import org.eclipse.sirius.business.api.query.EObjectQuery; |
| import org.eclipse.sirius.diagram.DDiagram; |
| import org.eclipse.sirius.diagram.DNodeList; |
| import org.eclipse.sirius.diagram.DSemanticDiagram; |
| import org.eclipse.sirius.diagram.business.api.query.DDiagramElementQuery; |
| import org.eclipse.sirius.ext.base.Option; |
| import org.eclipse.sirius.viewpoint.DSemanticDecorator; |
| |
| import com.google.common.base.Joiner; |
| import com.google.common.collect.Iterables; |
| import com.google.common.collect.Sets; |
| |
| public class ReviewServices extends DesignServices { |
| |
| public Collection<EPackage> getPackageDependencies(EPackage source) { |
| // used to be |
| // [self->filter(ecore::EPackage).eClassifiers->filter(ecore::EClass).eAllStructuralFeatures.eType->union(self->filter(ecore::EPackage).eClassifiers->filter(ecore::EClass).eAllSuperTypes).eContainer(ecore::EPackage)->asOrderedSet()->asSequence()->excluding(self)/] |
| Set<EPackage> dependencies = Sets.newLinkedHashSet(); |
| |
| for (EClass containedClassifiers : Iterables.filter( |
| source.getEClassifiers(), EClass.class)) { |
| dependencies.addAll(externalDependencies(containedClassifiers)); |
| } |
| |
| dependencies.remove(source); |
| return dependencies; |
| } |
| |
| private Set<EPackage> externalDependencies(EClass containedClassifiers) { |
| Set<EPackage> dependencies = Sets.newLinkedHashSet(); |
| for (EStructuralFeature eRef : containedClassifiers |
| .getEAllStructuralFeatures()) { |
| if (eRef.getEType() != null |
| && eRef.getEType().getEPackage() != null) { |
| dependencies.add(eRef.getEType().getEPackage()); |
| } |
| } |
| for (EClass superClazz : containedClassifiers.getEAllSuperTypes()) { |
| if (superClazz.getEPackage() != null) { |
| dependencies.add(superClazz.getEPackage()); |
| } |
| } |
| return dependencies; |
| } |
| |
| public Integer getDependenciesAmount(EObject a) { |
| // TODO |
| return 2; |
| } |
| |
| public String getDependenciesTooltip(EClass clazz, DSemanticDecorator view) { |
| Option<DDiagram> diag = new org.eclipse.sirius.diagram.business.api.query.EObjectQuery(view).getParentDiagram(); |
| if (diag.some()) { |
| Set<EPackage> displayedPackages = getDisplayedEPackages(diag.get()); |
| // we don't want coupling errors with our own package. |
| displayedPackages.remove(clazz.getEPackage()); |
| Set<String> explanations = Sets.newLinkedHashSet(); |
| if (diag != null) { |
| for (EPackage dep : externalDependencies(clazz)) { |
| if (displayedPackages.contains(dep)) { |
| explanations.add("Dependency to " + dep.getNsURI() |
| + ": \n" |
| + externalDependenciesExplanation(dep, clazz)); |
| } |
| } |
| } |
| return Joiner.on('\n').join(explanations); |
| } |
| return ""; |
| } |
| |
| public String getDependenciesLabel(EClass clazz) { |
| return clazz.getName() + " (" + externalDependencies(clazz).size() |
| + ")"; |
| } |
| |
| public Collection<EClassifier> getElementsIntroducingDependencies( |
| EPackage source, DSemanticDiagram diagram) { |
| Set<EClassifier> classifiersIntroducingDependencies = Sets |
| .newLinkedHashSet(); |
| |
| Set<EPackage> otherPackages = getDisplayedEPackages(diagram); |
| otherPackages.remove(source); |
| |
| for (EClass containedClassifiers : Iterables.filter( |
| source.getEClassifiers(), EClass.class)) { |
| for (EStructuralFeature eRef : containedClassifiers |
| .getEAllStructuralFeatures()) { |
| if (eRef.getEType() != null |
| && otherPackages |
| .contains(eRef.getEType().getEPackage())) { |
| classifiersIntroducingDependencies.add(eRef |
| .getEContainingClass()); |
| } |
| } |
| for (EClass superClazz : containedClassifiers.getEAllSuperTypes()) { |
| if (otherPackages.contains(superClazz.getEPackage())) { |
| classifiersIntroducingDependencies |
| .add(containedClassifiers); |
| } |
| } |
| } |
| return classifiersIntroducingDependencies; |
| } |
| |
| private Set<EPackage> getDisplayedEPackages(DDiagram diagram) { |
| Set<EPackage> otherPackages = Sets.newLinkedHashSet(); |
| for (DNodeList list : Iterables.filter( |
| diagram.getOwnedDiagramElements(), DNodeList.class)) { |
| if (!new DDiagramElementQuery(list).isHidden() |
| && list.getTarget() instanceof EPackage) { |
| otherPackages.add((EPackage) list.getTarget()); |
| } |
| } |
| return otherPackages; |
| } |
| |
| private String externalDependenciesExplanation(EPackage dep, EClass clazz) { |
| Set<String> explanations = Sets.newLinkedHashSet(); |
| for (EStructuralFeature eRef : clazz.getEAllStructuralFeatures()) { |
| if (eRef.getEType() != null && eRef.getEType().getEPackage() == dep) { |
| explanations.add(" - " + eRef.eClass().getName() + " " |
| + eRef.getName() + " refers to type " |
| + eRef.getEType().getName() + " in package " |
| + dep.getName()); |
| } |
| } |
| for (EClass superClazz : clazz.getEAllSuperTypes()) { |
| if (superClazz.getEPackage() == dep) { |
| explanations.add(" - EClass" + clazz.getName() |
| + " extends type " + superClazz.getName() |
| + " in package " + dep.getName()); |
| } |
| } |
| return Joiner.on('\n').join(explanations); |
| } |
| } |