package pipe.controllers.arcCreator;
import uk.ac.imperial.pipe.exceptions.PetriNetComponentException;
import uk.ac.imperial.pipe.models.petrinet.*;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Determines if an inhibitor arc can be created.
* <p>
* The logic for creating an inhibitor arc is that it can only connect from a place to a transition
* </p>
*/
public class InhibitorCreator implements ArcActionCreator {
private static final Logger LOGGER = Logger.getLogger(InhibitorCreator.class.getName());
/**
* @param source of the arc
* @param target of the arc
* @param arcPoints any point that should be added along the arc
* @return inbound arc from the place to the transition
*/
@Override
public InboundArc createInboundArc(Place source, Transition target, List<ArcPoint> arcPoints) {
InboundArc arc = new InboundInhibitorArc(source, target);
arc.addIntermediatePoints(arcPoints);
return arc;
}
/**
* @param target of the arc
* @param source of the arc
* @param arcPoints points to be added
* @return null since no arc can exist
*/
@Override
public OutboundArc createOutboundArc(Place target, Transition source, List<ArcPoint> arcPoints) {
return null;
}
/**
* @param source of the arc
* @param target of the arc
* @param <S> source connectable of the arc
* @param <T> target connectable of the arc
* @return true if the arc is connecting from place -> transition. False otherwise
*/
@Override
public <S extends Connectable, T extends Connectable> boolean canCreate(S source, T target) {
ConnectableVisior connectableVisior = new ConnectableVisior();
try {
source.accept(connectableVisior);
boolean isSourcePlace = connectableVisior.isPlace;
target.accept(connectableVisior);
boolean isTargetTransition = connectableVisior.isTransition;
return isSourcePlace && isTargetTransition;
} catch (PetriNetComponentException e) {
LOGGER.log(Level.INFO, e.toString());
return false;
}
}
/**
* Used to determine if a Petri net component object is a place or a transition
*/
private class ConnectableVisior implements PlaceVisitor, TransitionVisitor {
/**
* Is visited item a place
*/
public boolean isPlace = false;
/**
* Is visited item a transition
*/
public boolean isTransition = false;
@Override
public void visit(Place place) throws PetriNetComponentException {
isPlace = true;
isTransition = false;
}
@Override
public void visit(Transition transition) {
isPlace = false;
isTransition = true;
}
}
}