1
package dk.aau.cs.model.tapn;
3
import java.util.ArrayList;
5
import java.util.regex.Pattern;
7
import dk.aau.cs.model.tapn.event.TimedPlaceEvent;
8
import dk.aau.cs.model.tapn.event.TimedPlaceListener;
9
import dk.aau.cs.util.Require;
11
public class SharedPlace implements TimedPlace{
12
private static final Pattern namePattern = Pattern.compile("^[a-zA-Z_][a-zA-Z0-9_]*$");
15
private TimeInvariant invariant;
17
private TimedArcPetriNetNetwork network;
18
private TimedMarking currentMarking;
20
private List<TimedPlaceListener> listeners = new ArrayList<TimedPlaceListener>();
22
public SharedPlace(String name){
23
this(name, TimeInvariant.LESS_THAN_INFINITY);
26
public SharedPlace(String name, TimeInvariant invariant){
28
setInvariant(invariant);
31
public String name() {
35
public void setName(String newName) {
36
Require.that(newName != null && !newName.isEmpty(), "A timed transition must have a name");
37
Require.that(isValid(newName), "The specified name must conform to the pattern [a-zA-Z_][a-zA-Z0-9_]*");
42
private boolean isValid(String newName) {
43
return namePattern.matcher(newName).matches();
46
public TimeInvariant invariant(){
50
public void setInvariant(TimeInvariant invariant) {
51
Require.that(invariant != null, "invariant must not be null");
52
this.invariant = invariant;
53
fireInvariantChanged();
56
public void setNetwork(TimedArcPetriNetNetwork network) {
57
this.network = network;
60
public TimedArcPetriNetNetwork network(){
64
public void addTimedPlaceListener(TimedPlaceListener listener) {
65
Require.that(listener != null, "Listener cannot be null");
66
listeners.add(listener);
69
public void removeTimedPlaceListener(TimedPlaceListener listener) {
70
Require.that(listener != null, "Listener cannot be null");
71
listeners.remove(listener);
74
public TimedPlace copy() {
75
return this; // TODO: there should only be one of each shared place
78
public boolean isShared() {
82
public void setCurrentMarking(TimedMarking marking) {
83
Require.that(marking != null, "marking cannot be null");
84
currentMarking = marking;
88
public void addToken(TimedToken timedToken) {
89
Require.that(timedToken != null, "timedToken cannot be null");
90
Require.that(timedToken.place().equals(this), "token is located in a different place");
92
currentMarking.add(timedToken);
96
public void addTokens(Iterable<TimedToken> tokens) {
97
Require.that(tokens != null, "tokens cannot be null"); // TODO: maybe check that tokens are in this place?
99
for(TimedToken token : tokens){
100
currentMarking.add(token); // avoid firing marking changed on every add
102
fireMarkingChanged();
105
public void removeToken(TimedToken timedToken) {
106
Require.that(timedToken != null, "timedToken cannot be null");
107
currentMarking.remove(timedToken);
108
fireMarkingChanged();
111
public void removeToken() {
112
if (numberOfTokens() > 0) {
113
currentMarking.remove(tokens().get(0));
114
fireMarkingChanged();
118
public List<TimedToken> tokens() {
119
return currentMarking.getTokensFor(this);
122
public int numberOfTokens() {
123
return tokens().size();
126
private void fireMarkingChanged() {
127
for(TimedPlaceListener listener : listeners){
128
listener.markingChanged(new TimedPlaceEvent(this));
132
private void fireNameChanged() {
133
for(TimedPlaceListener listener : listeners){
134
listener.nameChanged(new TimedPlaceEvent(this));
138
private void fireInvariantChanged() {
139
for(TimedPlaceListener listener : listeners){
140
listener.invariantChanged(new TimedPlaceEvent(this));
145
public String toString() {
150
public int hashCode() {
151
final int prime = 31;
153
result = prime * result + ((name == null) ? 0 : name.hashCode());
158
public boolean equals(Object obj) {
163
if (!(obj instanceof SharedPlace))
165
SharedPlace other = (SharedPlace) obj;
167
if (other.name != null)
169
} else if (!name.equals(other.name))