~tapaal-contributor/tapaal/disappearing-tokens-1940098

« back to all changes in this revision

Viewing changes to src/dk/aau/cs/model/tapn/SharedTransition.java

  • Committer: Kenneth Yrke Jørgensen
  • Date: 2011-04-12 09:50:16 UTC
  • mfrom: (329.1.188 tapaal-1.5)
  • Revision ID: mail@yrke.dk-20110412095016-e4hqdgab5596ja09
Merged with branch addning support for new 1.5 features

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package dk.aau.cs.model.tapn;
 
2
 
 
3
import java.util.ArrayList;
 
4
import java.util.Collection;
 
5
import java.util.List;
 
6
import java.util.regex.Pattern;
 
7
 
 
8
import dk.aau.cs.util.Require;
 
9
 
 
10
public class SharedTransition {
 
11
        private static final Pattern namePattern = Pattern.compile("^[a-zA-Z_][a-zA-Z0-9_]*$");
 
12
        
 
13
        private String name;
 
14
        private List<TimedTransition> transitions = new ArrayList<TimedTransition>();
 
15
 
 
16
        private TimedArcPetriNetNetwork network;
 
17
        
 
18
        public SharedTransition(String name){
 
19
                setName(name);
 
20
        }
 
21
        
 
22
        public TimedArcPetriNetNetwork network() {
 
23
                return network;
 
24
        }
 
25
        
 
26
        public void setNetwork(TimedArcPetriNetNetwork network){
 
27
                this.network = network;
 
28
        }
 
29
 
 
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_]*");
 
33
                this.name = newName;
 
34
                for(TimedTransition transition : transitions){
 
35
                        transition.setName(newName);
 
36
                }
 
37
        }
 
38
 
 
39
        private boolean isValid(String newName) {
 
40
                return namePattern.matcher(newName).matches();
 
41
        }
 
42
 
 
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);
 
49
        }
 
50
 
 
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;
 
55
                }
 
56
                return true;
 
57
        }
 
58
 
 
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);
 
63
        }       
 
64
 
 
65
        public boolean isEnabled() {
 
66
                if(transitions.size() == 0) return false;
 
67
 
 
68
                for(TimedTransition transition : transitions){
 
69
                        if(!transition.isEnabledAlone()) return false;
 
70
                }
 
71
                return true;
 
72
        }
 
73
 
 
74
        public String name() {
 
75
                return name;
 
76
        }
 
77
        
 
78
        public void delete(){
 
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){
 
83
                        transition.delete();
 
84
                }
 
85
        }
 
86
 
 
87
        @Override
 
88
        public String toString() {
 
89
                return name;
 
90
        }
 
91
 
 
92
        @Override
 
93
        public int hashCode() {
 
94
                final int prime = 31;
 
95
                int result = 1;
 
96
                result = prime * result + ((name == null) ? 0 : name.hashCode());
 
97
                return result;
 
98
        }
 
99
 
 
100
        @Override
 
101
        public boolean equals(Object obj) {
 
102
                if (this == obj)
 
103
                        return true;
 
104
                if (obj == null)
 
105
                        return false;
 
106
                if (!(obj instanceof SharedTransition))
 
107
                        return false;
 
108
                SharedTransition other = (SharedTransition) obj;
 
109
                if (name == null) {
 
110
                        if (other.name != null)
 
111
                                return false;
 
112
                } else if (!name.equals(other.name))
 
113
                        return false;
 
114
                return true;
 
115
        }
 
116
 
 
117
        public Collection<TimedTransition> transitions() {
 
118
                return new ArrayList<TimedTransition>(transitions);
 
119
        }
 
120
}