workcraft/workcraft

View on GitHub
workcraft/MpsatVerificationPlugin/src/org/workcraft/plugins/mpsat_verification/presets/HandshakeDataSerialiser.java

Summary

Maintainability
A
30 mins
Test Coverage
package org.workcraft.plugins.mpsat_verification.presets;

import org.w3c.dom.Element;
import org.workcraft.presets.DataSerialiser;
import org.workcraft.utils.XmlUtils;

import java.util.Collection;
import java.util.HashSet;

public class HandshakeDataSerialiser implements DataSerialiser<HandshakeParameters> {

    private static final String SETTINGS_ELEMENT = "settings";
    private static final String SETTINGS_NAME_ATTRIBUTE = "name";
    private static final String SETTINGS_REQ_ELEMENT = "req";
    private static final String SETTINGS_ACK_ELEMENT = "ack";
    private static final String SETTINGS_CHECK_ASSERTION_ATTRIBUTE = "check-assertion";
    private static final String SETTINGS_CHECK_WITHDRAWAL_ATTRIBUTE = "check-withdrawal";
    private static final String SETTINGS_STATE_ATTRIBUTE = "state";
    private static final String SETTINGS_ALLOW_INVERSION_ATTRIBUTE = "allow-inversion";

    @Override
    public HandshakeParameters fromXML(Element parent, HandshakeParameters defaultHandshakeParameters) {
        if (defaultHandshakeParameters == null) {
            defaultHandshakeParameters = new HandshakeParameters();
        }

        Element settingsElement = XmlUtils.getChildElement(SETTINGS_ELEMENT, parent);
        Collection<String> reqs = readSignals(settingsElement, SETTINGS_REQ_ELEMENT);
        Collection<String> acks = readSignals(settingsElement, SETTINGS_ACK_ELEMENT);

        boolean checkAssert = XmlUtils.readBooleanAttribute(settingsElement,
                SETTINGS_CHECK_ASSERTION_ATTRIBUTE, defaultHandshakeParameters.isCheckAssertion());

        boolean checkWithdraw = XmlUtils.readBooleanAttribute(settingsElement,
                SETTINGS_CHECK_WITHDRAWAL_ATTRIBUTE, defaultHandshakeParameters.isCheckWithdrawal());

        HandshakeParameters.State state = XmlUtils.readEnumAttribute(settingsElement,
                SETTINGS_STATE_ATTRIBUTE, HandshakeParameters.State.class,
                defaultHandshakeParameters.getState());

        boolean allowInversion = XmlUtils.readBooleanAttribute(settingsElement,
                SETTINGS_ALLOW_INVERSION_ATTRIBUTE, defaultHandshakeParameters.isAllowInversion());

        return new HandshakeParameters(reqs, acks, checkAssert, checkWithdraw, state,
                allowInversion);
    }

    private Collection<String> readSignals(Element parent, String elementName) {
        Collection<String> result = new HashSet<>();
        for (Element element : XmlUtils.getChildElements(elementName, parent)) {
            result.add(element.getAttribute(SETTINGS_NAME_ATTRIBUTE));
        }
        return result;
    }

    @Override
    public void toXML(HandshakeParameters handshakeParameters, Element parent) {
        Element settingsElement = XmlUtils.createChildElement(SETTINGS_ELEMENT, parent);
        writeSignals(settingsElement, handshakeParameters.getReqs(), SETTINGS_REQ_ELEMENT);
        writeSignals(settingsElement, handshakeParameters.getAcks(), SETTINGS_ACK_ELEMENT);

        settingsElement.setAttribute(SETTINGS_CHECK_ASSERTION_ATTRIBUTE,
                Boolean.toString(handshakeParameters.isCheckAssertion()));

        settingsElement.setAttribute(SETTINGS_CHECK_WITHDRAWAL_ATTRIBUTE,
                Boolean.toString(handshakeParameters.isCheckWithdrawal()));

        settingsElement.setAttribute(SETTINGS_STATE_ATTRIBUTE,
                handshakeParameters.getState().name());

        settingsElement.setAttribute(SETTINGS_ALLOW_INVERSION_ATTRIBUTE,
                Boolean.toString(handshakeParameters.isAllowInversion()));
    }

    private void writeSignals(Element parent, Collection<String> signals, String elementName) {
        for (String signal : signals) {
            Element element = XmlUtils.createChildElement(elementName, parent);
            element.setAttribute(SETTINGS_NAME_ATTRIBUTE, signal);
        }
    }

}