package com.abstratt.mdd.modelrenderer.uml2dot; import static com.abstratt.mdd.modelrenderer.uml2dot.UML2DOTPreferences.SHOW_ELEMENTS_IN_LIBRARIES; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.uml2.uml.Element; import org.eclipse.uml2.uml.Relationship; import com.abstratt.mdd.core.util.ElementUtils; import com.abstratt.mdd.core.util.MDDUtil; import com.abstratt.mdd.modelrenderer.IRenderingSession; import com.abstratt.mdd.modelrenderer.IndentedPrintWriter; import com.abstratt.mdd.modelrenderer.uml2dot.UML2DOTPreferences.ShowCrossPackageElementOptions; public abstract class AbstractRelationshipRenderer<T extends Relationship> implements IElementRenderer<T> { @Override public final boolean renderObject(T element, IndentedPrintWriter out, IRenderingSession context) { return basicRenderObject(element, out, context); } protected abstract boolean basicRenderObject(T element, IndentedPrintWriter out, IRenderingSession<Element> context); protected boolean shouldRender(IRenderingSession<Element> context, Element source, Element destination) { boolean isModelLibrary = MDDUtil.getRootPackage(destination.getNearestPackage()).isModelLibrary(); boolean showModelLibraries = context.getSettings().getBoolean(SHOW_ELEMENTS_IN_LIBRARIES); if (isModelLibrary && !showModelLibraries) return false; ShowCrossPackageElementOptions crossPackageElementOption = context.getSettings().getSelection( ShowCrossPackageElementOptions.class); switch (crossPackageElementOption) { case Never: return EcoreUtil.equals(source.getNearestPackage(), destination.getNearestPackage()); case Immediate: return EcoreUtil.isAncestor(context.getRoot(), source); case Always: return true; case Local: return ElementUtils.sameRepository(context.getRoot(), destination); } // should never run return false; } }