workcraft/workcraft

View on GitHub
workcraft/StgPlugin/src/org/workcraft/plugins/stg/converters/DtdToStgConverter.java

Summary

Maintainability
A
2 hrs
Test Coverage
package org.workcraft.plugins.stg.converters;

import org.workcraft.dom.Container;
import org.workcraft.dom.converters.DefaultModelConverter;
import org.workcraft.dom.math.MathNode;
import org.workcraft.dom.visual.Stylable;
import org.workcraft.dom.visual.VisualNode;
import org.workcraft.dom.visual.connections.ConnectionUtils;
import org.workcraft.dom.visual.connections.VisualConnection;
import org.workcraft.exceptions.InvalidConnectionException;
import org.workcraft.plugins.dtd.*;
import org.workcraft.plugins.stg.Signal;
import org.workcraft.plugins.stg.*;
import org.workcraft.utils.LogUtils;

import java.awt.geom.Point2D;
import java.util.Collection;
import java.util.Map;
import java.util.Set;

public class DtdToStgConverter extends DefaultModelConverter<VisualDtd, VisualStg> {

    public DtdToStgConverter(VisualDtd srcModel, VisualStg dstModel) {
        super(srcModel, dstModel);
    }

    @Override
    public Map<Class<? extends MathNode>, Class<? extends MathNode>> getComponentClassMap() {
        Map<Class<? extends MathNode>, Class<? extends MathNode>> result = super.getComponentClassMap();
        result.put(TransitionEvent.class, SignalTransition.class);
        return result;
    }

    @Override
    public void shapeConnection(VisualConnection srcConnection, VisualConnection dstConnection) {
        if (!(srcConnection instanceof VisualLevelConnection)) {
            super.shapeConnection(srcConnection, dstConnection);
        }
    }

    @Override
    public void copyStyle(Stylable srcStylable, Stylable dstStylable) {
        super.copyStyle(srcStylable, dstStylable);
        if (dstStylable instanceof VisualConnection) {
            VisualConnection dstConnection = (VisualConnection) dstStylable;
            ConnectionUtils.setDefaultStyle(dstConnection);
        }
        if ((srcStylable instanceof VisualTransitionEvent) && (dstStylable instanceof VisualSignalTransition)) {
            VisualTransitionEvent srcTransition = (VisualTransitionEvent) srcStylable;
            VisualSignalTransition dstTransition = (VisualSignalTransition) dstStylable;
            Signal.Type type = convertSignalType(srcTransition.getVisualSignal().getType());
            dstTransition.getReferencedComponent().setSignalType(type);
        }
    }

    private Signal.Type convertSignalType(org.workcraft.plugins.dtd.Signal.Type type) {
        switch (type) {
        case INPUT:
            return Signal.Type.INPUT;
        case OUTPUT:
            return Signal.Type.OUTPUT;
        case INTERNAL:
            return Signal.Type.INTERNAL;
        default:
            return null;
        }
    }

    @Override
    public String convertNodeName(String srcName, Container container) {
        VisualTransitionEvent event = getSrcModel().getVisualComponentByMathReference(srcName, VisualTransitionEvent.class);
        if (event != null) {
            VisualSignal signal = event.getVisualSignal();
            String signalName = getSrcModel().getMathName(signal);
            SignalTransition.Direction direction = convertDirection(event.getDirection());
            return signalName + direction;
        }
        return srcName;
    }

    private SignalTransition.Direction convertDirection(TransitionEvent.Direction direction) {
        switch (direction) {
        case FALL:
            return SignalTransition.Direction.MINUS;
        case RISE:
            return SignalTransition.Direction.PLUS;
        default:
            return SignalTransition.Direction.TOGGLE;
        }
    }

    @Override
    public void postprocessing() {
        createEntryStructure();
        createExitStructure();
    }

    private void createEntryStructure() {
        Collection<VisualEntryEvent> entryEvents = getSrcModel().getVisualSignalEntries(null);
        for (VisualEntryEvent entryEvent : entryEvents) {
            VisualStgPlace entryPlace = getDstModel().createVisualPlace(null);
            entryPlace.setRootSpacePosition(scalePosition(entryEvent.getRootSpacePosition()));
            entryPlace.getReferencedComponent().setTokens(1);
            Set<VisualTransitionEvent> firstTransitionEvents = getSrcModel().getPostset(entryEvent, VisualTransitionEvent.class);
            for (VisualTransitionEvent transitionEvent : firstTransitionEvents) {
                VisualNode dstNode = getSrcToDstNode(transitionEvent);
                try {
                    getDstModel().connect(entryPlace, dstNode);
                } catch (InvalidConnectionException e) {
                    LogUtils.logWarning(e.getMessage());
                }
            }
        }
    }

    private void createExitStructure() {
        Collection<VisualExitEvent> exitEvents = getSrcModel().getVisualSignalExits(null);
        for (VisualExitEvent exitEvent : exitEvents) {
            VisualStgPlace exitPlace = getDstModel().createVisualPlace(null);
            exitPlace.setRootSpacePosition(scalePosition(exitEvent.getRootSpacePosition()));
            Set<VisualTransitionEvent> lastTransitionEvents = getSrcModel().getPreset(exitEvent, VisualTransitionEvent.class);
            for (VisualTransitionEvent lastTransitionEvent : lastTransitionEvents) {
                VisualNode dstNode = getSrcToDstNode(lastTransitionEvent);
                try {
                    getDstModel().connect(dstNode, exitPlace);
                } catch (InvalidConnectionException e) {
                    LogUtils.logWarning(e.getMessage());
                }
            }
        }
    }

    @Override
    public Point2D getScale() {
        return new Point2D.Double(2.0, 2.0);
    }

}