1
package dk.aau.cs.model.tapn;
3
import java.util.ArrayList;
4
import java.util.Collection;
6
import java.util.regex.Pattern;
8
import dk.aau.cs.util.Require;
10
public class SharedTransition {
11
private static final Pattern namePattern = Pattern.compile("^[a-zA-Z_][a-zA-Z0-9_]*$");
14
private List<TimedTransition> transitions = new ArrayList<TimedTransition>();
16
private TimedArcPetriNetNetwork network;
18
public SharedTransition(String name){
22
public TimedArcPetriNetNetwork network() {
26
public void setNetwork(TimedArcPetriNetNetwork network){
27
this.network = network;
30
public void setName(String newName) {
31
Require.that(newName != null && !newName.isEmpty(), "A timed transition must have a name");
32
Require.that(isValid(newName), "The specified name must conform to the pattern [a-zA-Z_][a-zA-Z0-9_]*");
34
for(TimedTransition transition : transitions){
35
transition.setName(newName);
39
private boolean isValid(String newName) {
40
return namePattern.matcher(newName).matches();
43
// TODO: Find a better name for this
44
public void makeShared(TimedTransition transition){
45
Require.that(transition != null, "transition cannot be null");
46
Require.that(templateDoesNotContainSharedTransition(transition.model()), "Another transition in the same template is already shared under that name");
47
transition.makeShared(this); // this will unshare first if part of another shared transition
48
transitions.add(transition);
51
private boolean templateDoesNotContainSharedTransition(TimedArcPetriNet model) {
52
Require.that(model != null, "model cannot be null");
53
for(TimedTransition transition : transitions){
54
if(model.equals(transition.model())) return false;
59
// TODO: this should somehow change timedTransition also, but calling unshare yields infinite loop
60
public void unshare(TimedTransition timedTransition) {
61
Require.that(timedTransition != null, "timedTransition cannot be null");
62
transitions.remove(timedTransition);
65
public boolean isEnabled() {
66
if(transitions.size() == 0) return false;
68
for(TimedTransition transition : transitions){
69
if(!transition.isEnabledAlone()) return false;
74
public String name() {
79
// transition.delete() will call unshare and thus modify the transitions collection
80
// which won't work while we are iterating through it, so we copy it first.
81
ArrayList<TimedTransition> copy = new ArrayList<TimedTransition>(transitions);
82
for(TimedTransition transition : copy){
88
public String toString() {
93
public int hashCode() {
96
result = prime * result + ((name == null) ? 0 : name.hashCode());
101
public boolean equals(Object obj) {
106
if (!(obj instanceof SharedTransition))
108
SharedTransition other = (SharedTransition) obj;
110
if (other.name != null)
112
} else if (!name.equals(other.name))
117
public Collection<TimedTransition> transitions() {
118
return new ArrayList<TimedTransition>(transitions);