/******************************************************************************* * Copyright (c) 2012 OpenLegacy Inc. * 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: * OpenLegacy Inc. - initial API and implementation *******************************************************************************/ package org.openlegacy.terminal.mock; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; import org.openlegacy.terminal.ConnectionProperties; import org.openlegacy.terminal.TerminalConnection; import org.openlegacy.terminal.TerminalOutgoingSnapshot; import org.openlegacy.terminal.TerminalSendAction; import org.openlegacy.terminal.TerminalSnapshot; import org.openlegacy.terminal.TerminalSnapshot.SnapshotType; import java.util.HashMap; import java.util.List; import java.util.Map; public class MockStateMachineTerminalConnectionFactory extends AbstractMockTerminalConnectionFactory { private Map<SnapshotAndSendAction, TerminalSnapshot> snapshotsGraph = new HashMap<SnapshotAndSendAction, TerminalSnapshot>(); private TerminalSnapshot firstSnapshot = null; public TerminalConnection getConnection(ConnectionProperties connectionProperties) { initStateMachine(); return new MockStateMachineTerminalConnection(firstSnapshot, snapshotsGraph); } public void disconnect(TerminalConnection terminalConnection) { ((MockStateMachineTerminalConnection)terminalConnection).setCurrentSnapshot(firstSnapshot); } private void initStateMachine() { List<TerminalSnapshot> snapshots = fetchSnapshots(); TerminalSnapshot lastIncomingSnapshot = null; SnapshotAndSendAction lastNodeAndArc = null; for (TerminalSnapshot terminalSnapshot : snapshots) { if (lastIncomingSnapshot == null) { lastIncomingSnapshot = terminalSnapshot; firstSnapshot = terminalSnapshot; } if (terminalSnapshot.getSnapshotType() == SnapshotType.INCOMING && lastNodeAndArc != null) { snapshotsGraph.put(lastNodeAndArc, terminalSnapshot); lastNodeAndArc = null; lastIncomingSnapshot = terminalSnapshot; } if (terminalSnapshot.getSnapshotType() == SnapshotType.OUTGOING) { TerminalSendAction terminalSendAction = ((TerminalOutgoingSnapshot)terminalSnapshot).getTerminalSendAction(); SnapshotAndSendAction nodeAndArc = new SnapshotAndSendAction(lastIncomingSnapshot, terminalSendAction); if (!snapshotsGraph.containsKey(nodeAndArc)) { lastNodeAndArc = nodeAndArc; } } } } public static interface NodeAndArc<N, A> { N getNode(); A getArc(); } public static class SnapshotAndSendAction implements NodeAndArc<TerminalSnapshot, TerminalSendAction> { private TerminalSnapshot terminalSnapshot; private TerminalSendAction terminalSendAction; public SnapshotAndSendAction(TerminalSnapshot terminalSnapshot, TerminalSendAction terminalSendAction) { this.terminalSnapshot = terminalSnapshot; this.terminalSendAction = terminalSendAction; } public TerminalSnapshot getNode() { return terminalSnapshot; } public TerminalSendAction getArc() { return terminalSendAction; } @Override public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); } @Override public int hashCode() { return HashCodeBuilder.reflectionHashCode(this); } @Override public String toString() { return ToStringBuilder.reflectionToString(this); } } }