Create logic exception and use that in logic objects

This commit is contained in:
Arne Keller 2020-03-09 23:25:11 +01:00
parent 18d467e8ab
commit ed615fcf6b
30 changed files with 136 additions and 128 deletions

View File

@ -1,7 +1,5 @@
package edu.kit.informatik.modelrailwaysimulator.model; package edu.kit.informatik.modelrailwaysimulator.model;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import static edu.kit.informatik.modelrailwaysimulator.ui.command.CommandFactory.NUMBER; import static edu.kit.informatik.modelrailwaysimulator.ui.command.CommandFactory.NUMBER;
@ -34,12 +32,12 @@ public abstract class Coach extends RollingStock {
* @param length length of coach * @param length length of coach
* @param couplingFront whether the coach should have a front coupling * @param couplingFront whether the coach should have a front coupling
* @param couplingBack whether the coach should have a back coupling * @param couplingBack whether the coach should have a back coupling
* @throws InvalidInputException on invalid user input (e.g. zero-sized coach) * @throws LogicException on invalid user input (e.g. zero-sized coach)
*/ */
public Coach(int identifier, int length, boolean couplingFront, boolean couplingBack) throws InvalidInputException { public Coach(int identifier, int length, boolean couplingFront, boolean couplingBack) throws LogicException {
super(length, couplingFront, couplingBack); super(length, couplingFront, couplingBack);
if (identifier < 1) { if (identifier < 1) {
throw new InvalidInputException("coach id has to be positive!"); throw new LogicException("coach id has to be positive!");
} }
this.identifier = identifier; this.identifier = identifier;
} }

View File

@ -1,7 +1,5 @@
package edu.kit.informatik.modelrailwaysimulator.model; package edu.kit.informatik.modelrailwaysimulator.model;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
/** /**
* Diesel engine. * Diesel engine.
* *
@ -29,10 +27,10 @@ public class DieselEngine extends Engine {
* @param length length of engine * @param length length of engine
* @param couplingFront whether the engine should have a front coupling * @param couplingFront whether the engine should have a front coupling
* @param couplingBack whether the engine should have a back coupling * @param couplingBack whether the engine should have a back coupling
* @throws InvalidInputException on invalid user input (e.g. zero-sized engine) * @throws LogicException on invalid user input (e.g. zero-sized engine)
*/ */
public DieselEngine(String series, String name, int length, public DieselEngine(String series, String name, int length,
boolean couplingFront, boolean couplingBack) throws InvalidInputException { boolean couplingFront, boolean couplingBack) throws LogicException {
super(series, name, length, couplingFront, couplingBack); super(series, name, length, couplingFront, couplingBack);
} }

View File

@ -1,7 +1,5 @@
package edu.kit.informatik.modelrailwaysimulator.model; package edu.kit.informatik.modelrailwaysimulator.model;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
/** /**
* Electrical engine. * Electrical engine.
* *
@ -31,10 +29,10 @@ public class ElectricalEngine extends Engine {
* @param length length of engine * @param length length of engine
* @param couplingFront whether the engine should have a front coupling * @param couplingFront whether the engine should have a front coupling
* @param couplingBack whether the engine should have a back coupling * @param couplingBack whether the engine should have a back coupling
* @throws InvalidInputException on invalid user input (e.g. zero-sized engine) * @throws LogicException on invalid user input (e.g. zero-sized engine)
*/ */
public ElectricalEngine(String series, String name, int length, boolean couplingFront, boolean couplingBack) public ElectricalEngine(String series, String name, int length, boolean couplingFront, boolean couplingBack)
throws InvalidInputException { throws LogicException {
super(series, name, length, couplingFront, couplingBack); super(series, name, length, couplingFront, couplingBack);
} }

View File

@ -1,7 +1,5 @@
package edu.kit.informatik.modelrailwaysimulator.model; package edu.kit.informatik.modelrailwaysimulator.model;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
/** /**
* Generic engine, is usually either diesel, steam or electric. * Generic engine, is usually either diesel, steam or electric.
* *
@ -26,10 +24,10 @@ public abstract class Engine extends RollingStock {
* @param length length of this engine * @param length length of this engine
* @param couplingFront whether this engine should have a front coupling * @param couplingFront whether this engine should have a front coupling
* @param couplingBack whether this engine should have a back coupling * @param couplingBack whether this engine should have a back coupling
* @throws InvalidInputException on invalid user input (zero-sized coach) * @throws LogicException on invalid user input (zero-sized coach)
*/ */
protected Engine(String series, String name, int length, protected Engine(String series, String name, int length,
boolean couplingFront, boolean couplingBack) throws InvalidInputException { boolean couplingFront, boolean couplingBack) throws LogicException {
super(length, couplingFront, couplingBack); super(length, couplingFront, couplingBack);
this.series = series; this.series = series;
this.name = name; this.name = name;

View File

@ -1,7 +1,5 @@
package edu.kit.informatik.modelrailwaysimulator.model; package edu.kit.informatik.modelrailwaysimulator.model;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
/** /**
* A freight coach. * A freight coach.
* *
@ -27,10 +25,10 @@ public class FreightCoach extends Coach {
* @param length length of coach * @param length length of coach
* @param couplingFront whether the coach should have a front coupling * @param couplingFront whether the coach should have a front coupling
* @param couplingBack whether the coach should have a back coupling * @param couplingBack whether the coach should have a back coupling
* @throws InvalidInputException on invalid user input (e.g. zero-sized coach) * @throws LogicException on invalid user input (e.g. zero-sized coach)
*/ */
public FreightCoach(int identifier, int length, boolean couplingFront, boolean couplingBack) public FreightCoach(int identifier, int length, boolean couplingFront, boolean couplingBack)
throws InvalidInputException { throws LogicException {
super(identifier, length, couplingFront, couplingBack); super(identifier, length, couplingFront, couplingBack);
} }

View File

@ -0,0 +1,18 @@
package edu.kit.informatik.modelrailwaysimulator.model;
/**
* Thrown on illogical input or impossible to fulfill input.
*
* @author Arne Keller
* @version 1.0
*/
public class LogicException extends Exception {
/**
* Construct a new logic exception with a specific message.
*
* @param message the error message
*/
public LogicException(String message) {
super(message);
}
}

View File

@ -1,7 +1,6 @@
package edu.kit.informatik.modelrailwaysimulator.model; package edu.kit.informatik.modelrailwaysimulator.model;
import edu.kit.informatik.modelrailwaysimulator.ui.CoachType; import edu.kit.informatik.modelrailwaysimulator.ui.CoachType;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -55,9 +54,9 @@ public class ModelRailwaySimulation {
* @param start start position of the new track * @param start start position of the new track
* @param end end position of the new track * @param end end position of the new track
* @return the positive identifier of the new track if successful, -1 if none available * @return the positive identifier of the new track if successful, -1 if none available
* @throws InvalidInputException if user input is invalid (e.g. zero length track) * @throws LogicException if user input is invalid (e.g. zero length track)
*/ */
public int addTrack(Vector2D start, Vector2D end) throws InvalidInputException { public int addTrack(Vector2D start, Vector2D end) throws LogicException {
return railNetwork.addTrack(start, end); return railNetwork.addTrack(start, end);
} }
@ -68,9 +67,9 @@ public class ModelRailwaySimulation {
* @param end1 end position 1 of the switch * @param end1 end position 1 of the switch
* @param end2 end position 2 of the switch * @param end2 end position 2 of the switch
* @return the positive identifier of the switch if successful, -1 otherwise * @return the positive identifier of the switch if successful, -1 otherwise
* @throws InvalidInputException if the new switch would be invalid * @throws LogicException if the new switch would be invalid
*/ */
public int addSwitch(Vector2D start, Vector2D end1, Vector2D end2) throws InvalidInputException { public int addSwitch(Vector2D start, Vector2D end1, Vector2D end2) throws LogicException {
return railNetwork.addSwitch(start, end1, end2); return railNetwork.addSwitch(start, end1, end2);
} }
@ -115,12 +114,12 @@ public class ModelRailwaySimulation {
* Add a new engine to the simulation. * Add a new engine to the simulation.
* *
* @param newEngine the engine to add to the simulation * @param newEngine the engine to add to the simulation
* @throws InvalidInputException when the identifier is already in use * @throws LogicException when the identifier is already in use
*/ */
public void createEngine(Engine newEngine) throws InvalidInputException { public void createEngine(Engine newEngine) throws LogicException {
final String id = newEngine.getIdentifier(); final String id = newEngine.getIdentifier();
if (engines.containsKey(id) || trainSets.containsKey(id)) { if (engines.containsKey(id) || trainSets.containsKey(id)) {
throw new InvalidInputException("engine identifier already used"); throw new LogicException("engine identifier already used");
} }
engines.put(id, newEngine); engines.put(id, newEngine);
} }
@ -147,10 +146,10 @@ public class ModelRailwaySimulation {
* @param couplingFront whether the coach should have a front coupling * @param couplingFront whether the coach should have a front coupling
* @param couplingBack whether the coach should have a back coupling * @param couplingBack whether the coach should have a back coupling
* @return the identifier of the coach if successfully added, -1 if none available * @return the identifier of the coach if successfully added, -1 if none available
* @throws InvalidInputException if user input is invalid (e.g. zero-sized coach) * @throws LogicException if user input is invalid (e.g. zero-sized coach)
*/ */
public int createCoach(CoachType coachType, int length, public int createCoach(CoachType coachType, int length,
boolean couplingFront, boolean couplingBack) throws InvalidInputException { boolean couplingFront, boolean couplingBack) throws LogicException {
final int id = getNextCoachIdentifier(); final int id = getNextCoachIdentifier();
if (id < 0) { if (id < 0) {
return -1; return -1;
@ -189,12 +188,12 @@ public class ModelRailwaySimulation {
* Add a new train set to the simulation. * Add a new train set to the simulation.
* *
* @param newTrainSet the train set to add * @param newTrainSet the train set to add
* @throws InvalidInputException if the identifier is already used * @throws LogicException if the identifier is already used
*/ */
public void createTrainSet(TrainSet newTrainSet) throws InvalidInputException { public void createTrainSet(TrainSet newTrainSet) throws LogicException {
final String id = newTrainSet.getIdentifier(); final String id = newTrainSet.getIdentifier();
if (engines.containsKey(id) || trainSets.containsKey(id)) { if (engines.containsKey(id) || trainSets.containsKey(id)) {
throw new InvalidInputException("train set identifier already used"); throw new LogicException("train set identifier already used");
} }
trainSets.put(id, newTrainSet); trainSets.put(id, newTrainSet);
} }
@ -258,13 +257,13 @@ public class ModelRailwaySimulation {
* @param trainId identifier of the train * @param trainId identifier of the train
* @param rollingStockId identifier of the rolling stock * @param rollingStockId identifier of the rolling stock
* @return the added rolling stock * @return the added rolling stock
* @throws InvalidInputException if train not found and train identifier is not next identifier or rolling stock * @throws LogicException if train not found and train identifier is not next identifier or rolling stock
* is not found * is not found
*/ */
public RollingStock addTrain(int trainId, String rollingStockId) throws InvalidInputException { public RollingStock addTrain(int trainId, String rollingStockId) throws LogicException {
final Optional<RollingStock> rollingStock = getRollingStock(rollingStockId); final Optional<RollingStock> rollingStock = getRollingStock(rollingStockId);
if (!rollingStock.isPresent()) { if (!rollingStock.isPresent()) {
throw new InvalidInputException("rolling stock not found"); throw new LogicException("rolling stock not found");
} }
trainManager.addTrain(trainId, rollingStock.get()); trainManager.addTrain(trainId, rollingStock.get());
return rollingStock.get(); return rollingStock.get();
@ -304,9 +303,9 @@ public class ModelRailwaySimulation {
* *
* @param id identifier of the train to show * @param id identifier of the train to show
* @return rows of ASCII art representing this train * @return rows of ASCII art representing this train
* @throws InvalidInputException if train not found * @throws LogicException if train not found
*/ */
public List<String> showTrain(int id) throws InvalidInputException { public List<String> showTrain(int id) throws LogicException {
return trainManager.showTrain(id); return trainManager.showTrain(id);
} }
@ -317,10 +316,10 @@ public class ModelRailwaySimulation {
* @param position where to place the train * @param position where to place the train
* @param direction direction in which the train should initially go * @param direction direction in which the train should initially go
* @return whether the train was successfully placed * @return whether the train was successfully placed
* @throws InvalidInputException if train could not be found, is already placed, is not valid, direction is invalid * @throws LogicException if train could not be found, is already placed, is not valid, direction is invalid
* or railway network is not ready for trains * or railway network is not ready for trains
*/ */
public boolean putTrain(int trainId, Vector2D position, Vector2D direction) throws InvalidInputException { public boolean putTrain(int trainId, Vector2D position, Vector2D direction) throws LogicException {
return trainManager.putTrain(trainId, position, direction); return trainManager.putTrain(trainId, position, direction);
} }
@ -329,9 +328,9 @@ public class ModelRailwaySimulation {
* *
* @param speed amount of steps to move the trains * @param speed amount of steps to move the trains
* @return train collisions, no value if no trains are placed * @return train collisions, no value if no trains are placed
* @throws InvalidInputException if the simulation is not yet ready * @throws LogicException if the simulation is not yet ready
*/ */
public Optional<List<SortedSet<Integer>>> step(short speed) throws InvalidInputException { public Optional<List<SortedSet<Integer>>> step(short speed) throws LogicException {
return trainManager.step(speed); return trainManager.step(speed);
} }
} }

View File

@ -1,7 +1,5 @@
package edu.kit.informatik.modelrailwaysimulator.model; package edu.kit.informatik.modelrailwaysimulator.model;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
/** /**
* A passenger coach. * A passenger coach.
* *
@ -28,10 +26,10 @@ public class PassengerCoach extends Coach {
* @param length length of coach * @param length length of coach
* @param couplingFront whether the coach should have a front coupling * @param couplingFront whether the coach should have a front coupling
* @param couplingBack whether the coach should have a back coupling * @param couplingBack whether the coach should have a back coupling
* @throws InvalidInputException on invalid user input (e.g. zero-sized coach) * @throws LogicException on invalid user input (e.g. zero-sized coach)
*/ */
public PassengerCoach(int identifier, int length, boolean couplingFront, boolean couplingBack) public PassengerCoach(int identifier, int length, boolean couplingFront, boolean couplingBack)
throws InvalidInputException { throws LogicException {
super(identifier, length, couplingFront, couplingBack); super(identifier, length, couplingFront, couplingBack);
} }

View File

@ -1,7 +1,5 @@
package edu.kit.informatik.modelrailwaysimulator.model; package edu.kit.informatik.modelrailwaysimulator.model;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
@ -31,13 +29,13 @@ public class RailwayNetwork {
* @param start start position of the new track * @param start start position of the new track
* @param end end position of the new track * @param end end position of the new track
* @return the positive identifier of the new track if successful, -1 if none available * @return the positive identifier of the new track if successful, -1 if none available
* @throws InvalidInputException if the user provides incorrect input * @throws LogicException if the user provides incorrect input
*/ */
public int addTrack(Vector2D start, Vector2D end) throws InvalidInputException { public int addTrack(Vector2D start, Vector2D end) throws LogicException {
final long startPossibleConnections = rails.values().stream().filter(rail -> rail.canConnectTo(start)).count(); final long startPossibleConnections = rails.values().stream().filter(rail -> rail.canConnectTo(start)).count();
final long endPossibleConnections = rails.values().stream().filter(rail -> rail.canConnectTo(end)).count(); final long endPossibleConnections = rails.values().stream().filter(rail -> rail.canConnectTo(end)).count();
if (startPossibleConnections == 2 || endPossibleConnections == 2) { if (startPossibleConnections == 2 || endPossibleConnections == 2) {
throw new InvalidInputException("track would connect to two other rails"); throw new LogicException("track would connect to two other rails");
} }
if (rails.isEmpty()) { if (rails.isEmpty()) {
final Track newTrack = new Track(start, end, 1); final Track newTrack = new Track(start, end, 1);
@ -53,7 +51,7 @@ public class RailwayNetwork {
rails.put(id, newTrack); rails.put(id, newTrack);
return newTrack.getIdentifier(); return newTrack.getIdentifier();
} else { } else {
throw new InvalidInputException("track is not connected to other tracks"); throw new LogicException("track is not connected to other tracks");
} }
} }
} }
@ -65,9 +63,9 @@ public class RailwayNetwork {
* @param end1 end position 1 of the switch * @param end1 end position 1 of the switch
* @param end2 end position 2 of the switch * @param end2 end position 2 of the switch
* @return the positive identifier of the switch if successful, -1 otherwise * @return the positive identifier of the switch if successful, -1 otherwise
* @throws InvalidInputException when the new switch would be invalid * @throws LogicException when the new switch would be invalid
*/ */
public int addSwitch(Vector2D start, Vector2D end1, Vector2D end2) throws InvalidInputException { public int addSwitch(Vector2D start, Vector2D end1, Vector2D end2) throws LogicException {
if (rails.isEmpty()) { if (rails.isEmpty()) {
final Switch newSwitch = new Switch(start, end1, end2, 1); final Switch newSwitch = new Switch(start, end1, end2, 1);
rails.put(1, newSwitch); rails.put(1, newSwitch);
@ -77,7 +75,7 @@ public class RailwayNetwork {
final long end1Connections = rails.values().stream().filter(rail -> rail.canConnectTo(end1)).count(); final long end1Connections = rails.values().stream().filter(rail -> rail.canConnectTo(end1)).count();
final long end2Connections = rails.values().stream().filter(rail -> rail.canConnectTo(end2)).count(); final long end2Connections = rails.values().stream().filter(rail -> rail.canConnectTo(end2)).count();
if (startConnections == 2 || end1Connections == 2 || end2Connections == 2) { if (startConnections == 2 || end1Connections == 2 || end2Connections == 2) {
throw new InvalidInputException("switch endpoint would connect to two other rails"); throw new LogicException("switch endpoint would connect to two other rails");
} }
if (rails.values().stream() if (rails.values().stream()
.anyMatch(rail -> rail.canConnectTo(start) || rail.canConnectTo(end1) || rail.canConnectTo(end2))) { .anyMatch(rail -> rail.canConnectTo(start) || rail.canConnectTo(end1) || rail.canConnectTo(end2))) {
@ -89,7 +87,7 @@ public class RailwayNetwork {
rails.put(id, newSwitch); rails.put(id, newSwitch);
return newSwitch.getIdentifier(); return newSwitch.getIdentifier();
} else { } else {
throw new InvalidInputException("switch not connected to other rails"); throw new LogicException("switch not connected to other rails");
} }
} }
} }

View File

@ -1,7 +1,5 @@
package edu.kit.informatik.modelrailwaysimulator.model; package edu.kit.informatik.modelrailwaysimulator.model;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
/** /**
* A rolling stock with a specific integer length and couplings. Is usually an engine, train set or coach. * A rolling stock with a specific integer length and couplings. Is usually an engine, train set or coach.
* *
@ -28,14 +26,14 @@ public abstract class RollingStock {
* @param length length of this rolling stock * @param length length of this rolling stock
* @param couplingFront whether this rolling stock should have a front coupling * @param couplingFront whether this rolling stock should have a front coupling
* @param couplingBack whether this rolling stock should have a back coupling * @param couplingBack whether this rolling stock should have a back coupling
* @throws InvalidInputException on invalid user input (e.g. zero-sized coach) * @throws LogicException on invalid user input (e.g. zero-sized coach)
*/ */
protected RollingStock(int length, boolean couplingFront, boolean couplingBack) throws InvalidInputException { protected RollingStock(int length, boolean couplingFront, boolean couplingBack) throws LogicException {
if (length < 1) { if (length < 1) {
throw new InvalidInputException("rolling stock length has to be positive"); throw new LogicException("rolling stock length has to be positive");
} }
if (!couplingFront && !couplingBack) { if (!couplingFront && !couplingBack) {
throw new InvalidInputException("rolling stocks needs at least one coupling"); throw new LogicException("rolling stocks needs at least one coupling");
} }
this.length = length; this.length = length;
this.couplingFront = couplingFront; this.couplingFront = couplingFront;

View File

@ -1,7 +1,5 @@
package edu.kit.informatik.modelrailwaysimulator.model; package edu.kit.informatik.modelrailwaysimulator.model;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
/** /**
* A special coach, used for e.g. firefighting. * A special coach, used for e.g. firefighting.
* *
@ -29,10 +27,10 @@ public class SpecialCoach extends Coach {
* @param length length of coach * @param length length of coach
* @param couplingFront whether the coach should have a front coupling * @param couplingFront whether the coach should have a front coupling
* @param couplingBack whether the coach should have a back coupling * @param couplingBack whether the coach should have a back coupling
* @throws InvalidInputException on invalid user input (e.g. zero-sized coach) * @throws LogicException on invalid user input (e.g. zero-sized coach)
*/ */
public SpecialCoach(int identifier, int length, boolean couplingFront, boolean couplingBack) public SpecialCoach(int identifier, int length, boolean couplingFront, boolean couplingBack)
throws InvalidInputException { throws LogicException {
super(identifier, length, couplingFront, couplingBack); super(identifier, length, couplingFront, couplingBack);
} }

View File

@ -1,7 +1,5 @@
package edu.kit.informatik.modelrailwaysimulator.model; package edu.kit.informatik.modelrailwaysimulator.model;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
/** /**
* Steam engine. * Steam engine.
* *
@ -29,10 +27,10 @@ public class SteamEngine extends Engine {
* @param length length of engine * @param length length of engine
* @param couplingFront whether the engine should have a front coupling * @param couplingFront whether the engine should have a front coupling
* @param couplingBack whether the engine should have a back coupling * @param couplingBack whether the engine should have a back coupling
* @throws InvalidInputException on invalid user input (e.g. zero-sized engine) * @throws LogicException on invalid user input (e.g. zero-sized engine)
*/ */
public SteamEngine(String series, String name, int length, boolean couplingFront, boolean couplingBack) public SteamEngine(String series, String name, int length, boolean couplingFront, boolean couplingBack)
throws InvalidInputException { throws LogicException {
super(series, name, length, couplingFront, couplingBack); super(series, name, length, couplingFront, couplingBack);
} }

View File

@ -1,7 +1,5 @@
package edu.kit.informatik.modelrailwaysimulator.model; package edu.kit.informatik.modelrailwaysimulator.model;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
import java.util.Objects; import java.util.Objects;
/** /**
@ -31,12 +29,12 @@ public final class Switch extends Rail {
* @param end1 first end position * @param end1 first end position
* @param end2 second end position * @param end2 second end position
* @param id identifier of this switch * @param id identifier of this switch
* @throws InvalidInputException if the switch is not composed of straight lines, or has zero-length parts * @throws LogicException if the switch is not composed of straight lines, or has zero-length parts
*/ */
public Switch(Vector2D start, Vector2D end1, Vector2D end2, int id) throws InvalidInputException { public Switch(Vector2D start, Vector2D end1, Vector2D end2, int id) throws LogicException {
super(id); super(id);
if (start.distanceTo(end1) == 0 || start.distanceTo(end2) == 0 || end1.distanceTo(end2) == 0) { if (start.distanceTo(end1) == 0 || start.distanceTo(end2) == 0 || end1.distanceTo(end2) == 0) {
throw new InvalidInputException("switch has length zero"); throw new LogicException("switch has length zero");
} }
this.positionOne = new Track(start, end1, 1); this.positionOne = new Track(start, end1, 1);
this.positionTwo = new Track(start, end2, 1); this.positionTwo = new Track(start, end2, 1);

View File

@ -1,7 +1,5 @@
package edu.kit.informatik.modelrailwaysimulator.model; package edu.kit.informatik.modelrailwaysimulator.model;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
import java.util.Objects; import java.util.Objects;
/** /**
@ -26,14 +24,14 @@ public final class Track extends Rail {
* @param start start position of the track * @param start start position of the track
* @param end end position of the track * @param end end position of the track
* @param id identifier to use * @param id identifier to use
* @throws InvalidInputException if the positions are not on a straight line * @throws LogicException if the positions are not on a straight line
*/ */
public Track(Vector2D start, Vector2D end, int id) throws InvalidInputException { public Track(Vector2D start, Vector2D end, int id) throws LogicException {
super(id); super(id);
if (start.distanceTo(end) == 0) { if (start.distanceTo(end) == 0) {
throw new InvalidInputException("track has length zero"); throw new LogicException("track has length zero");
} else if (start.getX() != end.getX() && start.getY() != end.getY()) { } else if (start.getX() != end.getX() && start.getY() != end.getY()) {
throw new InvalidInputException("invalid track segment: not a straight line"); throw new LogicException("invalid track segment: not a straight line");
} }
this.start = start; this.start = start;
this.end = end; this.end = end;

View File

@ -1,7 +1,5 @@
package edu.kit.informatik.modelrailwaysimulator.model; package edu.kit.informatik.modelrailwaysimulator.model;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
@ -76,16 +74,16 @@ public final class Train implements Comparable<Train> {
* Add a rolling stock to this train. * Add a rolling stock to this train.
* *
* @param rollingStock the rolling stack to add * @param rollingStock the rolling stack to add
* @throws InvalidInputException if the rolling stock could not be added to the train * @throws LogicException if the rolling stock could not be added to the train
*/ */
public void add(RollingStock rollingStock) throws InvalidInputException { public void add(RollingStock rollingStock) throws LogicException {
final RollingStock last = rollingStocks.get(rollingStocks.size() - 1); final RollingStock last = rollingStocks.get(rollingStocks.size() - 1);
// make sure special coupling requirements are honored // make sure special coupling requirements are honored
if (rollingStock.hasCouplingFront() && last.hasCouplingBack() if (rollingStock.hasCouplingFront() && last.hasCouplingBack()
&& rollingStock.canCoupleTo(last) && last.canCoupleTo(rollingStock)) { && rollingStock.canCoupleTo(last) && last.canCoupleTo(rollingStock)) {
rollingStocks.add(rollingStock); rollingStocks.add(rollingStock);
} else { } else {
throw new InvalidInputException("could not add rolling stock to train"); throw new LogicException("could not add rolling stock to train");
} }
} }

View File

@ -1,7 +1,5 @@
package edu.kit.informatik.modelrailwaysimulator.model; package edu.kit.informatik.modelrailwaysimulator.model;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
@ -77,23 +75,23 @@ public final class TrainManager {
* *
* @param trainId train identifier * @param trainId train identifier
* @param rollingStock rolling stock to add * @param rollingStock rolling stock to add
* @throws InvalidInputException on invalid user input (e.g. rolling stock in use) * @throws LogicException on invalid user input (e.g. rolling stock in use)
*/ */
public void addTrain(int trainId, RollingStock rollingStock) throws InvalidInputException { public void addTrain(int trainId, RollingStock rollingStock) throws LogicException {
if (getTrainContainingRollingStock(rollingStock).isPresent()) { if (getTrainContainingRollingStock(rollingStock).isPresent()) {
throw new InvalidInputException("rolling stock already used"); throw new LogicException("rolling stock already used");
} }
final Train train = trains.get(trainId); final Train train = trains.get(trainId);
if (train == null) { // create new train if (train == null) { // create new train
final int correctId = getNextTrainIdentifier(); final int correctId = getNextTrainIdentifier();
if (trainId != correctId) { if (trainId != correctId) {
throw new InvalidInputException("new train identifier must be next free identifier"); throw new LogicException("new train identifier must be next free identifier");
} }
final Train newTrain = new Train(trainId, rollingStock); final Train newTrain = new Train(trainId, rollingStock);
trains.put(trainId, newTrain); trains.put(trainId, newTrain);
} else { } else {
if (train.isPlaced()) { if (train.isPlaced()) {
throw new InvalidInputException("can not add rolling stock to placed train"); throw new LogicException("can not add rolling stock to placed train");
} }
train.add(rollingStock); train.add(rollingStock);
} }
@ -139,14 +137,14 @@ public final class TrainManager {
* *
* @param trainId identifier of the train to show * @param trainId identifier of the train to show
* @return ASCII art representation of said train * @return ASCII art representation of said train
* @throws InvalidInputException if train not found * @throws LogicException if train not found
*/ */
public List<String> showTrain(int trainId) throws InvalidInputException { public List<String> showTrain(int trainId) throws LogicException {
final Train train = trains.get(trainId); final Train train = trains.get(trainId);
if (train != null) { if (train != null) {
return train.show(); return train.show();
} else { } else {
throw new InvalidInputException("no such train"); throw new LogicException("no such train");
} }
} }
@ -158,21 +156,21 @@ public final class TrainManager {
* @param position where to place the train * @param position where to place the train
* @param direction direction in which the train should initially go * @param direction direction in which the train should initially go
* @return whether the train was successfully placed * @return whether the train was successfully placed
* @throws InvalidInputException if train could not be found, is already placed, is not valid, direction is invalid * @throws LogicException if train could not be found, is already placed, is not valid, direction is invalid
* or railway network is not ready for trains * or railway network is not ready for trains
*/ */
public boolean putTrain(int trainId, Vector2D position, Vector2D direction) throws InvalidInputException { public boolean putTrain(int trainId, Vector2D position, Vector2D direction) throws LogicException {
final Train train = trains.get(trainId); final Train train = trains.get(trainId);
if (train == null) { if (train == null) {
throw new InvalidInputException("train not found"); throw new LogicException("train not found");
} else if (!train.isProperTrain()) { } else if (!train.isProperTrain()) {
throw new InvalidInputException("train is not valid"); throw new LogicException("train is not valid");
} else if (train.isPlaced()) { } else if (train.isPlaced()) {
throw new InvalidInputException("train is already placed"); throw new LogicException("train is already placed");
} else if (!direction.isDirection()) { } else if (!direction.isDirection()) {
throw new InvalidInputException("invalid train direction"); throw new LogicException("invalid train direction");
} else if (!railNetwork.isReadyForTrains()) { } else if (!railNetwork.isReadyForTrains()) {
throw new InvalidInputException("switches not set up"); throw new LogicException("switches not set up");
} }
// attempt to place train // attempt to place train
final boolean placed = train.placeOn(railNetwork, position, direction); final boolean placed = train.placeOn(railNetwork, position, direction);
@ -305,11 +303,11 @@ public final class TrainManager {
* *
* @param speed amount of steps to move the trains * @param speed amount of steps to move the trains
* @return train collisions, no value if no trains are placed * @return train collisions, no value if no trains are placed
* @throws InvalidInputException if simulation is not yet ready * @throws LogicException if simulation is not yet ready
*/ */
public Optional<List<SortedSet<Integer>>> step(short speed) throws InvalidInputException { public Optional<List<SortedSet<Integer>>> step(short speed) throws LogicException {
if (!railNetwork.isReadyForTrains()) { if (!railNetwork.isReadyForTrains()) {
throw new InvalidInputException("rail tracks/switches not set up"); throw new LogicException("rail tracks/switches not set up");
} }
if (trains.values().stream().noneMatch(Train::isPlaced)) { if (trains.values().stream().noneMatch(Train::isPlaced)) {
return Optional.empty(); return Optional.empty();

View File

@ -1,7 +1,5 @@
package edu.kit.informatik.modelrailwaysimulator.model; package edu.kit.informatik.modelrailwaysimulator.model;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
/** /**
* Train set. * Train set.
* *
@ -40,10 +38,10 @@ public class TrainSet extends RollingStock {
* @param length length of train set * @param length length of train set
* @param couplingFront whether the train set should have a front coupling * @param couplingFront whether the train set should have a front coupling
* @param couplingBack whether the train set should have a back coupling * @param couplingBack whether the train set should have a back coupling
* @throws InvalidInputException on invalid user input (e.g. zero-sized train set) * @throws LogicException on invalid user input (e.g. zero-sized train set)
*/ */
public TrainSet(String series, String name, int length, boolean couplingFront, boolean couplingBack) public TrainSet(String series, String name, int length, boolean couplingFront, boolean couplingBack)
throws InvalidInputException { throws LogicException {
super(length, couplingFront, couplingBack); super(length, couplingFront, couplingBack);
this.name = name; this.name = name;
this.series = series; this.series = series;

View File

@ -2,6 +2,7 @@ package edu.kit.informatik.modelrailwaysimulator.ui;
import edu.kit.informatik.modelrailwaysimulator.model.Coach; import edu.kit.informatik.modelrailwaysimulator.model.Coach;
import edu.kit.informatik.modelrailwaysimulator.model.FreightCoach; import edu.kit.informatik.modelrailwaysimulator.model.FreightCoach;
import edu.kit.informatik.modelrailwaysimulator.model.LogicException;
import edu.kit.informatik.modelrailwaysimulator.model.PassengerCoach; import edu.kit.informatik.modelrailwaysimulator.model.PassengerCoach;
import edu.kit.informatik.modelrailwaysimulator.model.SpecialCoach; import edu.kit.informatik.modelrailwaysimulator.model.SpecialCoach;
@ -38,10 +39,10 @@ public enum CoachType {
* @param couplingFront whether the coach should have a front coupling * @param couplingFront whether the coach should have a front coupling
* @param couplingBack whether the coach should have a back coupling * @param couplingBack whether the coach should have a back coupling
* @return new coach * @return new coach
* @throws InvalidInputException on invalid input (e.g. zero-sized coach) * @throws LogicException on invalid input (e.g. zero-sized coach)
*/ */
public Coach createCoach(int id, int length, boolean couplingFront, boolean couplingBack) public Coach createCoach(int id, int length, boolean couplingFront, boolean couplingBack)
throws InvalidInputException { throws LogicException {
switch (this) { switch (this) {
case PASSENGER: case PASSENGER:
return new PassengerCoach(id, length, couplingFront, couplingBack); return new PassengerCoach(id, length, couplingFront, couplingBack);

View File

@ -1,7 +1,9 @@
package edu.kit.informatik.modelrailwaysimulator.ui; package edu.kit.informatik.modelrailwaysimulator.ui;
import edu.kit.informatik.modelrailwaysimulator.model.LogicException;
import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation; import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation;
import edu.kit.informatik.Terminal; import edu.kit.informatik.Terminal;
import edu.kit.informatik.modelrailwaysimulator.ui.command.Command;
import edu.kit.informatik.modelrailwaysimulator.ui.command.CommandFactory; import edu.kit.informatik.modelrailwaysimulator.ui.command.CommandFactory;
/** /**
@ -46,10 +48,17 @@ public final class CommandLine {
} }
} }
final Command command;
try { try {
CommandFactory.getCommand(input).apply(simulation); command = CommandFactory.getCommand(input);
} catch (final NumberFormatException | InvalidInputException e) { } catch (final NumberFormatException | InvalidInputException e) {
Terminal.printError(e.getMessage()); Terminal.printError("input error: " + e.getMessage());
continue;
}
try {
command.apply(simulation);
} catch (final NumberFormatException | LogicException e) {
Terminal.printError("logic error: " + e.getMessage());
} }
} }
} }

View File

@ -3,6 +3,7 @@ package edu.kit.informatik.modelrailwaysimulator.ui;
import edu.kit.informatik.modelrailwaysimulator.model.DieselEngine; import edu.kit.informatik.modelrailwaysimulator.model.DieselEngine;
import edu.kit.informatik.modelrailwaysimulator.model.ElectricalEngine; import edu.kit.informatik.modelrailwaysimulator.model.ElectricalEngine;
import edu.kit.informatik.modelrailwaysimulator.model.Engine; import edu.kit.informatik.modelrailwaysimulator.model.Engine;
import edu.kit.informatik.modelrailwaysimulator.model.LogicException;
import edu.kit.informatik.modelrailwaysimulator.model.SteamEngine; import edu.kit.informatik.modelrailwaysimulator.model.SteamEngine;
/** /**
@ -39,10 +40,10 @@ public enum EngineType {
* @param couplingFront whether the engine should have a front coupling * @param couplingFront whether the engine should have a front coupling
* @param couplingBack whether the engine should have a back coupling * @param couplingBack whether the engine should have a back coupling
* @return new engine * @return new engine
* @throws InvalidInputException on invalid input (e.g. zero-sized engine) * @throws LogicException on invalid input (e.g. zero-sized engine)
*/ */
public Engine createEngine(String series, String name, int length, boolean couplingFront, boolean couplingBack) public Engine createEngine(String series, String name, int length, boolean couplingFront, boolean couplingBack)
throws InvalidInputException { throws LogicException {
switch (this) { switch (this) {
case ELECTRICAL: case ELECTRICAL:
return new ElectricalEngine(series, name, length, couplingFront, couplingBack); return new ElectricalEngine(series, name, length, couplingFront, couplingBack);

View File

@ -1,5 +1,6 @@
package edu.kit.informatik.modelrailwaysimulator.ui.command; package edu.kit.informatik.modelrailwaysimulator.ui.command;
import edu.kit.informatik.modelrailwaysimulator.model.LogicException;
import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation; import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation;
import edu.kit.informatik.modelrailwaysimulator.model.Vector2D; import edu.kit.informatik.modelrailwaysimulator.model.Vector2D;
import edu.kit.informatik.Terminal; import edu.kit.informatik.Terminal;
@ -38,7 +39,7 @@ public class AddSwitch extends Command {
private Vector2D end2; private Vector2D end2;
@Override @Override
public void apply(ModelRailwaySimulation simulation) throws InvalidInputException { public void apply(ModelRailwaySimulation simulation) throws LogicException {
if (start == null) { if (start == null) {
throw new IllegalStateException("command not initialized"); throw new IllegalStateException("command not initialized");
} }

View File

@ -1,5 +1,6 @@
package edu.kit.informatik.modelrailwaysimulator.ui.command; package edu.kit.informatik.modelrailwaysimulator.ui.command;
import edu.kit.informatik.modelrailwaysimulator.model.LogicException;
import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation; import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation;
import edu.kit.informatik.modelrailwaysimulator.model.Vector2D; import edu.kit.informatik.modelrailwaysimulator.model.Vector2D;
import edu.kit.informatik.Terminal; import edu.kit.informatik.Terminal;
@ -34,7 +35,7 @@ public class AddTrack extends Command {
private Vector2D end; private Vector2D end;
@Override @Override
public void apply(ModelRailwaySimulation simulation) throws InvalidInputException { public void apply(ModelRailwaySimulation simulation) throws LogicException {
if (start == null) { if (start == null) {
throw new IllegalStateException("command not initialized"); throw new IllegalStateException("command not initialized");
} }

View File

@ -1,5 +1,6 @@
package edu.kit.informatik.modelrailwaysimulator.ui.command; package edu.kit.informatik.modelrailwaysimulator.ui.command;
import edu.kit.informatik.modelrailwaysimulator.model.LogicException;
import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation; import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation;
import edu.kit.informatik.modelrailwaysimulator.model.RollingStock; import edu.kit.informatik.modelrailwaysimulator.model.RollingStock;
import edu.kit.informatik.Terminal; import edu.kit.informatik.Terminal;
@ -35,7 +36,7 @@ public class AddTrain extends Command {
private String rollingStockId; private String rollingStockId;
@Override @Override
public void apply(ModelRailwaySimulation simulation) throws InvalidInputException { public void apply(ModelRailwaySimulation simulation) throws LogicException {
if (rollingStockId == null) { if (rollingStockId == null) {
throw new IllegalStateException("command not initialized"); throw new IllegalStateException("command not initialized");
} }

View File

@ -1,5 +1,6 @@
package edu.kit.informatik.modelrailwaysimulator.ui.command; package edu.kit.informatik.modelrailwaysimulator.ui.command;
import edu.kit.informatik.modelrailwaysimulator.model.LogicException;
import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation; import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException; import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
@ -15,9 +16,9 @@ public abstract class Command {
* Apply this command to a model railway simulation. * Apply this command to a model railway simulation.
* *
* @param simulation simulation to use * @param simulation simulation to use
* @throws InvalidInputException on invalid user input * @throws LogicException on illogical user input
*/ */
public abstract void apply(ModelRailwaySimulation simulation) throws InvalidInputException; public abstract void apply(ModelRailwaySimulation simulation) throws LogicException;
/** /**
* Parse user input into this command object. * Parse user input into this command object.

View File

@ -1,5 +1,6 @@
package edu.kit.informatik.modelrailwaysimulator.ui.command; package edu.kit.informatik.modelrailwaysimulator.ui.command;
import edu.kit.informatik.modelrailwaysimulator.model.LogicException;
import edu.kit.informatik.modelrailwaysimulator.ui.CoachType; import edu.kit.informatik.modelrailwaysimulator.ui.CoachType;
import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation; import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation;
import edu.kit.informatik.Terminal; import edu.kit.informatik.Terminal;
@ -44,7 +45,7 @@ public class CreateCoach extends Command {
private boolean couplingBack; private boolean couplingBack;
@Override @Override
public void apply(ModelRailwaySimulation simulation) throws InvalidInputException { public void apply(ModelRailwaySimulation simulation) throws LogicException {
if (type == null) { if (type == null) {
throw new IllegalStateException("command not initialized"); throw new IllegalStateException("command not initialized");
} }

View File

@ -3,6 +3,7 @@ package edu.kit.informatik.modelrailwaysimulator.ui.command;
import edu.kit.informatik.Terminal; import edu.kit.informatik.Terminal;
import edu.kit.informatik.modelrailwaysimulator.model.Coach; import edu.kit.informatik.modelrailwaysimulator.model.Coach;
import edu.kit.informatik.modelrailwaysimulator.model.Engine; import edu.kit.informatik.modelrailwaysimulator.model.Engine;
import edu.kit.informatik.modelrailwaysimulator.model.LogicException;
import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation; import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation;
import edu.kit.informatik.modelrailwaysimulator.ui.EngineType; import edu.kit.informatik.modelrailwaysimulator.ui.EngineType;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException; import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
@ -56,7 +57,7 @@ public class CreateEngine extends Command {
private boolean couplingBack; private boolean couplingBack;
@Override @Override
public void apply(ModelRailwaySimulation simulation) throws InvalidInputException { public void apply(ModelRailwaySimulation simulation) throws LogicException {
if (type == null) { if (type == null) {
throw new IllegalStateException("command not initialized"); throw new IllegalStateException("command not initialized");
} }

View File

@ -1,6 +1,7 @@
package edu.kit.informatik.modelrailwaysimulator.ui.command; package edu.kit.informatik.modelrailwaysimulator.ui.command;
import edu.kit.informatik.modelrailwaysimulator.model.Coach; import edu.kit.informatik.modelrailwaysimulator.model.Coach;
import edu.kit.informatik.modelrailwaysimulator.model.LogicException;
import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation; import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation;
import edu.kit.informatik.Terminal; import edu.kit.informatik.Terminal;
import edu.kit.informatik.modelrailwaysimulator.model.TrainSet; import edu.kit.informatik.modelrailwaysimulator.model.TrainSet;
@ -50,7 +51,7 @@ public class CreateTrainSet extends Command {
private boolean couplingBack; private boolean couplingBack;
@Override @Override
public void apply(ModelRailwaySimulation simulation) throws InvalidInputException { public void apply(ModelRailwaySimulation simulation) throws LogicException {
if (name == null) { if (name == null) {
throw new IllegalStateException("command not initialized"); throw new IllegalStateException("command not initialized");
} }

View File

@ -1,5 +1,6 @@
package edu.kit.informatik.modelrailwaysimulator.ui.command; package edu.kit.informatik.modelrailwaysimulator.ui.command;
import edu.kit.informatik.modelrailwaysimulator.model.LogicException;
import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation; import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation;
import edu.kit.informatik.modelrailwaysimulator.model.Vector2D; import edu.kit.informatik.modelrailwaysimulator.model.Vector2D;
import edu.kit.informatik.Terminal; import edu.kit.informatik.Terminal;
@ -40,7 +41,7 @@ public class PutTrain extends Command {
private Vector2D direction; private Vector2D direction;
@Override @Override
public void apply(ModelRailwaySimulation simulation) throws InvalidInputException { public void apply(ModelRailwaySimulation simulation) throws LogicException {
if (point == null) { if (point == null) {
throw new IllegalStateException("command not initialized"); throw new IllegalStateException("command not initialized");
} }

View File

@ -1,6 +1,7 @@
package edu.kit.informatik.modelrailwaysimulator.ui.command; package edu.kit.informatik.modelrailwaysimulator.ui.command;
import edu.kit.informatik.Terminal; import edu.kit.informatik.Terminal;
import edu.kit.informatik.modelrailwaysimulator.model.LogicException;
import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation; import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation;
import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException; import edu.kit.informatik.modelrailwaysimulator.ui.InvalidInputException;
@ -24,7 +25,7 @@ public class ShowTrain extends Command {
private int id; private int id;
@Override @Override
public void apply(ModelRailwaySimulation simulation) throws InvalidInputException { public void apply(ModelRailwaySimulation simulation) throws LogicException {
simulation.showTrain(id).forEach(Terminal::printLine); simulation.showTrain(id).forEach(Terminal::printLine);
} }

View File

@ -1,6 +1,7 @@
package edu.kit.informatik.modelrailwaysimulator.ui.command; package edu.kit.informatik.modelrailwaysimulator.ui.command;
import edu.kit.informatik.Terminal; import edu.kit.informatik.Terminal;
import edu.kit.informatik.modelrailwaysimulator.model.LogicException;
import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation; import edu.kit.informatik.modelrailwaysimulator.model.ModelRailwaySimulation;
import edu.kit.informatik.modelrailwaysimulator.model.Vector2D; import edu.kit.informatik.modelrailwaysimulator.model.Vector2D;
import edu.kit.informatik.modelrailwaysimulator.ui.CommandLine; import edu.kit.informatik.modelrailwaysimulator.ui.CommandLine;
@ -30,7 +31,7 @@ public class Step extends Command {
private short speed; private short speed;
@Override @Override
public void apply(ModelRailwaySimulation simulation) throws InvalidInputException { public void apply(ModelRailwaySimulation simulation) throws LogicException {
final Optional<List<SortedSet<Integer>>> collisions = simulation.step(speed); final Optional<List<SortedSet<Integer>>> collisions = simulation.step(speed);
if (!collisions.isPresent()) { if (!collisions.isPresent()) {
// print OK if no there are trains placed // print OK if no there are trains placed