blob: 4657706429ab7e53755afe4a10d98a8373b3c85b [file] [log] [blame]
Toshio Koideb609b3b2014-02-14 18:25:52 -08001package net.onrc.onos.intent;
2
3import java.util.Collection;
4import java.util.EventListener;
5import java.util.HashMap;
6import java.util.HashSet;
Toshio Koideb609b3b2014-02-14 18:25:52 -08007import java.util.LinkedList;
Toshio Koideb609b3b2014-02-14 18:25:52 -08008import java.util.Map.Entry;
9
10import net.onrc.onos.intent.Intent.IntentState;
11
12/**
13 * @author Toshio Koide (t-koide@onlab.us)
14 */
15public class IntentMap {
16 public enum ChangedEventType {
17 /**
18 * Added new intent.
19 */
20 ADDED,
21
22 /**
23 * Removed existing intent.
24 * The specified intent is an instance of Intent class (not a child class)
25 * Only id and state are valid.
26 */
27 REMOVED,
28
29 /**
30 * Changed state of existing intent.
31 * The specified intent is an instance of Intent class (not a child class)
32 * Only id and state are valid.
33 */
34 STATE_CHANGED,
35 }
36
37 public class ChangedEvent {
38 public ChangedEvent(ChangedEventType eventType, Intent intent) {
39 this.eventType = eventType;
40 this.intent = intent;
41 }
42 public ChangedEventType eventType;
43 public Intent intent;
44 }
45
46 public interface ChangedListener extends EventListener {
47 void intentsChange(LinkedList<ChangedEvent> events);
48 }
49
50 private HashSet<ChangedListener> listeners = new HashSet<>();
Toshio Koide0c9106d2014-02-19 15:26:38 -080051 private HashMap<String, Intent> intents = new HashMap<>();
Toshio Koided9fa2a82014-02-19 17:35:18 -080052
Toshio Koide0c9106d2014-02-19 15:26:38 -080053 protected void putIntent(Intent intent) {
54 if (intents.containsKey(intent.getId()))
55 removeIntent(intent.getId());
56 intents.put(intent.getId(), intent);
57 }
Toshio Koided9fa2a82014-02-19 17:35:18 -080058
Toshio Koide0c9106d2014-02-19 15:26:38 -080059 protected void removeIntent(String intentId) {
60 intents.remove(intentId);
61 }
Toshio Koided9fa2a82014-02-19 17:35:18 -080062
Toshio Koide0c9106d2014-02-19 15:26:38 -080063 public Intent getIntent(String intentId) {
64 return intents.get(intentId);
65 }
Toshio Koideb609b3b2014-02-14 18:25:52 -080066
Toshio Koide4f308732014-02-18 15:19:48 -080067 public void executeOperations(IntentOperationList operations) {
Toshio Koideb609b3b2014-02-14 18:25:52 -080068 LinkedList<ChangedEvent> events = new LinkedList<>();
69 for (IntentOperation operation: operations) {
70 switch (operation.operator) {
71 case ADD:
Toshio Koide0c9106d2014-02-19 15:26:38 -080072 putIntent(operation.intent);
Toshio Koideb609b3b2014-02-14 18:25:52 -080073 events.add(new ChangedEvent(ChangedEventType.ADDED, operation.intent));
74 break;
75 case REMOVE:
Toshio Koide0c9106d2014-02-19 15:26:38 -080076 Intent intent = getIntent(operation.intent.getId());
Toshio Koideb609b3b2014-02-14 18:25:52 -080077 if (intent == null) {
78 // TODO throw exception
79 }
80 else {
81 intent.setState(Intent.IntentState.DEL_REQ);
82 events.add(new ChangedEvent(ChangedEventType.STATE_CHANGED,
83 new Intent(intent.getId(), Intent.IntentState.DEL_REQ)));
84 }
85 break;
86 }
87 }
88 for (ChangedListener listener: listeners) {
89 listener.intentsChange(events);
90 }
91 }
92
93 public void purge() {
Toshio Koide0c9106d2014-02-19 15:26:38 -080094 LinkedList<String> removeIds = new LinkedList<>();
95 for (Entry<String, Intent> entry: intents.entrySet()) {
Toshio Koideb609b3b2014-02-14 18:25:52 -080096 Intent intent = entry.getValue();
97 if (intent.getState() == IntentState.DEL_ACK
98 || intent.getState() == IntentState.INST_NACK) {
Toshio Koide0c9106d2014-02-19 15:26:38 -080099 removeIds.add(intent.getId());
100 }
101 }
102 for (String intentId: removeIds) {
103 removeIntent(intentId);
Toshio Koideb609b3b2014-02-14 18:25:52 -0800104 }
105 }
106
107 public Collection<Intent> getAllIntents() {
108 return intents.values();
109 }
110
Toshio Koideb609b3b2014-02-14 18:25:52 -0800111 public void addChangeListener(ChangedListener listener) {
112 listeners.add(listener);
113 }
114
115 public void removeChangedListener(ChangedListener listener) {
116 listeners.remove(listener);
117 }
118}