package pipe.controllers.arcCreator;
import pipe.controllers.PetriNetController;
import pipe.controllers.application.PipeApplicationController;
import uk.ac.imperial.pipe.models.petrinet.Connectable;
import uk.ac.imperial.pipe.models.petrinet.*;
import uk.ac.imperial.pipe.models.petrinet.Place;
import uk.ac.imperial.pipe.models.petrinet.Transition;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Used to create a normal arc. That is one which takes the specified number of tokens
* from a place/produces the specified number of tokens in a place
*/
public class NormalCreator implements ArcActionCreator {
private final PipeApplicationController controller;
public NormalCreator(PipeApplicationController controller) {
this.controller = controller;
}
private Map<String, String> getInitialTokenWeights() {
PetriNetController netController = controller.getActivePetriNetController();
String token = netController.getSelectedToken();
Map<String, String> tokens = new HashMap<>();
tokens.put(token, "1");
return tokens;
}
@Override
public InboundArc createInboundArc(Place source, Transition target, List<ArcPoint> arcPoints) {
Map<String, String> weights = getInitialTokenWeights();
InboundArc inboundArc = new InboundNormalArc(source, target, weights);
inboundArc.addIntermediatePoints(arcPoints);
return inboundArc;
}
@Override
public OutboundArc createOutboundArc(Place target, Transition source, List<ArcPoint> arcPoints) {
Map<String, String> weights = getInitialTokenWeights();
OutboundArc outboundArc = new OutboundNormalArc(source, target, weights);
outboundArc.addIntermediatePoints(arcPoints);
return outboundArc;
}
@Override
public <S extends Connectable, T extends Connectable> boolean canCreate(S source, T target) {
return !source.getClass().equals(target.getClass());
}
}