blob: 5b445c80a539717cb628166ac054a89a06cd1c7e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 2016 Willink Transformations 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:
* E.D.Willink - Initial API and implementation
*******************************************************************************/
package org.eclipse.qvtd.pivot.qvtschedule.utilities;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.util.Visitable;
import org.eclipse.qvtd.pivot.qvtbase.graphs.GraphStringBuilder;
import org.eclipse.qvtd.pivot.qvtschedule.Connection;
import org.eclipse.qvtd.pivot.qvtschedule.ConnectionRole;
import org.eclipse.qvtd.pivot.qvtschedule.DatumConnection;
import org.eclipse.qvtd.pivot.qvtschedule.Edge;
import org.eclipse.qvtd.pivot.qvtschedule.EdgeConnection;
import org.eclipse.qvtd.pivot.qvtschedule.LoadingRegion;
import org.eclipse.qvtd.pivot.qvtschedule.MappingRegion;
import org.eclipse.qvtd.pivot.qvtschedule.NavigableEdge;
import org.eclipse.qvtd.pivot.qvtschedule.Node;
import org.eclipse.qvtd.pivot.qvtschedule.NodeConnection;
import org.eclipse.qvtd.pivot.qvtschedule.OperationRegion;
import org.eclipse.qvtd.pivot.qvtschedule.Region;
import org.eclipse.qvtd.pivot.qvtschedule.ScheduledRegion;
import org.eclipse.qvtd.pivot.qvtschedule.impl.NodeConnectionImpl;
import org.eclipse.qvtd.pivot.qvtschedule.util.AbstractExtendingQVTscheduleVisitor;
/** This code is recued but has never worked properly */
public class ToGraphVisitor extends AbstractExtendingQVTscheduleVisitor<@Nullable String, @NonNull GraphStringBuilder>
{
public ToGraphVisitor(@NonNull GraphStringBuilder context) {
super(context);
}
public @NonNull String visit(@NonNull ScheduledRegion region) {
region.accept(this);
return context.toString();
}
@Override
public @Nullable String visitDatumConnection(@NonNull DatumConnection<?> datumConnection) {
context.appendEdge(datumConnection.getEdgeSource(), datumConnection, datumConnection.getEdgeTarget());
return null;
}
@Override
public @Nullable String visitEdge(@NonNull Edge edge) {
context.appendEdge(edge.getEdgeSource(), edge, edge.getEdgeTarget());
return null;
}
@Override
public @Nullable String visitEdgeConnection(@NonNull EdgeConnection edgeConnection) {
if (edgeConnection.isEdge2Edge()) {
NavigableEdge sourceEdge = edgeConnection.getSourceEnds().iterator().next();
NavigableEdge targetEdge = edgeConnection.getTargetEdges().iterator().next();
context.appendEdge(sourceEdge.getEdgeTarget(), edgeConnection, targetEdge.getEdgeTarget());
}
else {
context.appendNode(edgeConnection);
for (@NonNull NavigableEdge source : QVTscheduleUtil.getSourceEnds(edgeConnection)) {
context.appendEdge(source.getEdgeTarget(), edgeConnection, edgeConnection);
}
for (@NonNull NavigableEdge target : edgeConnection.getTargetEdges()) {
ConnectionRole role = edgeConnection.getTargets().get(target);
assert role != null;
context.appendEdge(edgeConnection, role, target.getEdgeTarget());
}
}
return null;
}
@Override
public @Nullable String visitLoadingRegion(@NonNull LoadingRegion loadingRegion) {
context.setLabel(loadingRegion.getName());
context.setColor("lightblue");
context.setPenwidth(QVTscheduleConstants.LINE_WIDTH);
context.pushCluster();
for (@NonNull Node node : QVTscheduleUtil.getNodes(loadingRegion)) {
context.appendNode(node);
}
for (@NonNull Edge edge : QVTscheduleUtil.getEdges(loadingRegion)) {
context.appendEdge(edge.getEdgeSource(), edge, edge.getEdgeTarget());
}
context.popCluster();
return null;
}
@Override
public @Nullable String visitMappingRegion(@NonNull MappingRegion object) {
context.setColor("palegreen");
context.setPenwidth(QVTscheduleConstants.LINE_WIDTH);
return super.visitMappingRegion(object);
}
@Override
public @Nullable String visitNavigableEdge(@NonNull NavigableEdge navigableEdge) {
if (navigableEdge.isSecondary()) {
// Let primary draw a bidirectional edge
}
else if ((navigableEdge.getIncomingConnection() == null) && navigableEdge.getOutgoingConnections().isEmpty()) {
return super.visitNavigableEdge(navigableEdge);
}
else {
context.appendEdge(navigableEdge.getEdgeSource(), navigableEdge, navigableEdge.getEdgeTarget());
}
return null;
}
@Override
public @Nullable String visitNode(@NonNull Node object) {
context.appendNode(object);
return null;
}
@Override
public @Nullable String visitNodeConnection(@NonNull NodeConnection nodeConnection) {
if (nodeConnection.isNode2Node()) {
Node sourceNode = QVTscheduleUtil.getSourceEnds(nodeConnection).iterator().next();
Node targetNode = nodeConnection.getTargetNodes().iterator().next();
context.appendEdge(sourceNode, nodeConnection, targetNode);
}
else {
context.appendNode(nodeConnection);
for (@NonNull Node source : QVTscheduleUtil.getSourceEnds(nodeConnection)) {
context.appendEdge(source, nodeConnection, nodeConnection);
}
for (@NonNull Node target : nodeConnection.getTargetNodes()) {
ConnectionRole role = ((NodeConnectionImpl)nodeConnection).getTargets().get(target);
assert role != null;
context.appendEdge(nodeConnection, role, target);
}
}
return null;
}
@Override
public @Nullable String visitOperationRegion(@NonNull OperationRegion object) {
context.setColor(QVTscheduleConstants.OPERATION_COLOR);
context.setPenwidth(QVTscheduleConstants.LINE_WIDTH);
return super.visitOperationRegion(object);
}
@Override
public @Nullable String visitRegion(@NonNull Region region) {
context.setLabel(region.getName());
context.pushCluster();
for (@NonNull Node node : QVTscheduleUtil.getNodes(region)) {
node.accept(this);
// s.appendNode(node);
}
for (@NonNull Edge edge : QVTscheduleUtil.getEdges(region)) {
edge.accept(this);
// s.appendEdge(edge.getSource(), edge, edge.getTarget());
}
context.popCluster();
return null;
}
@Override
public @Nullable String visitScheduledRegion(@NonNull ScheduledRegion scheduledRegion) {
context.setLabel(scheduledRegion.getName());
context.pushCluster();
for (@NonNull Region region : QVTscheduleUtil.getRegions(scheduledRegion)) {
region.accept(this);
}
for (@NonNull Node node : QVTscheduleUtil.getNodes(scheduledRegion)) {
context.appendNode(node);
}
for (@NonNull Edge edge : QVTscheduleUtil.getEdges(scheduledRegion)) {
context.appendEdge(edge.getEdgeSource(), edge, edge.getEdgeTarget());
}
for (@NonNull Connection connection : QVTscheduleUtil.getConnections(scheduledRegion)) {
connection.accept(this);
}
context.popCluster();
return null;
}
@Override
public @Nullable String visiting(@NonNull Visitable visitable) {
throw new UnsupportedOperationException(getClass().getSimpleName() + ": " + visitable.getClass().getSimpleName());
}
}