1 package org.apache.helix.model;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.HashMap;
23 import java.util.HashSet;
24 import java.util.Map;
25 import java.util.Set;
26 import java.util.TreeMap;
27
28 import org.apache.helix.HelixProperty;
29 import org.apache.helix.ZNRecord;
30 import org.apache.helix.model.Message.MessageType;
31 import org.apache.helix.model.builder.ConstraintItemBuilder;
32 import org.apache.log4j.Logger;
33
34
35 public class ClusterConstraints extends HelixProperty
36 {
37 private static Logger LOG = Logger.getLogger(ClusterConstraints.class);
38
39 public enum ConstraintAttribute
40 {
41 STATE, MESSAGE_TYPE, TRANSITION, RESOURCE, INSTANCE, CONSTRAINT_VALUE
42 }
43
44 public enum ConstraintValue
45 {
46 ANY
47 }
48
49 public enum ConstraintType
50 {
51 STATE_CONSTRAINT, MESSAGE_CONSTRAINT
52 }
53
54
55 private final Map<String, ConstraintItem> _constraints = new HashMap<String, ConstraintItem>();
56
57 public ClusterConstraints(ConstraintType type) {
58 super(type.toString());
59 }
60
61 public ClusterConstraints(ZNRecord record)
62 {
63 super(record);
64
65 for (String constraintId : _record.getMapFields().keySet())
66 {
67 ConstraintItemBuilder builder = new ConstraintItemBuilder();
68 ConstraintItem item = builder.addConstraintAttributes(_record.getMapField(constraintId)).build();
69
70 if (item.getAttributes().size() > 0 && item.getConstraintValue() != null)
71 {
72 addConstraintItem(constraintId, item);
73 } else
74 {
75 LOG.error("Skip invalid constraint. key: " + constraintId + ", value: "
76 + _record.getMapField(constraintId));
77 }
78 }
79 }
80
81
82
83
84
85
86
87 public void addConstraintItem(String constraintId, ConstraintItem item) {
88 Map<String, String> map = new TreeMap<String, String>();
89 for (ConstraintAttribute attr : item.getAttributes().keySet()) {
90 map.put(attr.toString(), item.getAttributeValue(attr));
91 }
92 map.put(ConstraintAttribute.CONSTRAINT_VALUE.toString(), item.getConstraintValue());
93 _record.setMapField(constraintId, map);
94 _constraints.put(constraintId, item);
95 }
96
97 public void addConstraintItems(Map<String, ConstraintItem> items) {
98 for (String constraintId : items.keySet()) {
99 addConstraintItem(constraintId, items.get(constraintId));
100 }
101 }
102
103
104
105
106
107
108 public void removeConstraintItem(String constraintId) {
109 _constraints.remove(constraintId);
110 _record.getMapFields().remove(constraintId);
111 }
112
113
114
115
116
117
118
119 public ConstraintItem getConstraintItem(String constraintId) {
120 return _constraints.get(constraintId);
121 }
122
123
124
125
126 public Set<ConstraintItem> match(Map<ConstraintAttribute, String> attributes)
127 {
128 Set<ConstraintItem> matches = new HashSet<ConstraintItem>();
129 for (ConstraintItem item : _constraints.values())
130 {
131 if (item.match(attributes))
132 {
133 matches.add(item);
134 }
135 }
136 return matches;
137 }
138
139
140 public static Map<ConstraintAttribute, String> toConstraintAttributes(Message msg)
141 {
142 Map<ConstraintAttribute, String> attributes = new TreeMap<ConstraintAttribute, String>();
143 String msgType = msg.getMsgType();
144 attributes.put(ConstraintAttribute.MESSAGE_TYPE, msgType);
145 if (MessageType.STATE_TRANSITION.toString().equals(msgType))
146 {
147 if (msg.getFromState() != null && msg.getToState() != null)
148 {
149 attributes.put(ConstraintAttribute.TRANSITION,
150 msg.getFromState() + "-" + msg.getToState());
151 }
152 if (msg.getResourceName() != null)
153 {
154 attributes.put(ConstraintAttribute.RESOURCE, msg.getResourceName());
155 }
156 if (msg.getTgtName() != null)
157 {
158 attributes.put(ConstraintAttribute.INSTANCE, msg.getTgtName());
159 }
160 }
161 return attributes;
162 }
163
164 @Override
165 public boolean isValid()
166 {
167
168 return true;
169 }
170
171 }