blob: 83ade8beb42e0f3a4c48510918a93444de7c2d87 [file] [log] [blame]
Thomas Vachuska83e090e2014-10-22 14:25:35 -07001/*
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07002 * Copyright 2014 Open Networking Laboratory
Thomas Vachuska83e090e2014-10-22 14:25:35 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
Thomas Vachuska83e090e2014-10-22 14:25:35 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
Thomas Vachuska83e090e2014-10-22 14:25:35 -070015 */
alshabib7410fea2014-09-16 13:48:39 -070016package org.onlab.onos.net.flow.criteria;
tom8bb16062014-09-12 14:47:46 -070017
alshabib99b8fdc2014-09-25 14:30:22 -070018import static com.google.common.base.MoreObjects.toStringHelper;
19
alshabibba5ac482014-10-02 17:15:20 -070020import java.util.Objects;
21
alshabib7b795492014-09-16 14:38:39 -070022import org.onlab.onos.net.PortNumber;
23import org.onlab.onos.net.flow.criteria.Criterion.Type;
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -070024import org.onlab.packet.IpPrefix;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070025import org.onlab.packet.MacAddress;
26import org.onlab.packet.VlanId;
alshabib7b795492014-09-16 14:38:39 -070027
tom8bb16062014-09-12 14:47:46 -070028/**
29 * Factory class to create various traffic selection criteria.
30 */
31public final class Criteria {
32
alshabib7b795492014-09-16 14:38:39 -070033 //TODO: incomplete type implementation. Need to implement complete list from Criterion
34
tom8bb16062014-09-12 14:47:46 -070035 // Ban construction
36 private Criteria() {
37 }
38
39 /**
alshabib7b795492014-09-16 14:38:39 -070040 * Creates a match on IN_PORT field using the specified value.
41 *
42 * @param port inport value
43 * @return match criterion
44 */
45 public static Criterion matchInPort(PortNumber port) {
46 return new PortCriterion(port);
47 }
48
49 /**
tom8bb16062014-09-12 14:47:46 -070050 * Creates a match on ETH_SRC field using the specified value. This value
51 * may be a wildcard mask.
52 *
tomc104d282014-09-19 10:57:55 -070053 * @param mac MAC address value or wildcard mask
tom8bb16062014-09-12 14:47:46 -070054 * @return match criterion
55 */
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070056 public static Criterion matchEthSrc(MacAddress mac) {
alshabib7b795492014-09-16 14:38:39 -070057 return new EthCriterion(mac, Type.ETH_SRC);
tom8bb16062014-09-12 14:47:46 -070058 }
59
alshabib369d2942014-09-12 17:59:35 -070060 /**
61 * Creates a match on ETH_DST field using the specified value. This value
62 * may be a wildcard mask.
63 *
tomc104d282014-09-19 10:57:55 -070064 * @param mac MAC address value or wildcard mask
alshabib369d2942014-09-12 17:59:35 -070065 * @return match criterion
66 */
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070067 public static Criterion matchEthDst(MacAddress mac) {
alshabib7b795492014-09-16 14:38:39 -070068 return new EthCriterion(mac, Type.ETH_DST);
69 }
70
71 /**
72 * Creates a match on ETH_TYPE field using the specified value.
73 *
74 * @param ethType eth type value
75 * @return match criterion
76 */
77 public static Criterion matchEthType(Short ethType) {
78 return new EthTypeCriterion(ethType);
79 }
80
81 /**
82 * Creates a match on VLAN ID field using the specified value.
83 *
84 * @param vlanId vlan id value
85 * @return match criterion
86 */
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070087 public static Criterion matchVlanId(VlanId vlanId) {
alshabib7b795492014-09-16 14:38:39 -070088 return new VlanIdCriterion(vlanId);
89 }
90
91 /**
92 * Creates a match on VLAN PCP field using the specified value.
93 *
94 * @param vlanPcp vlan pcp value
95 * @return match criterion
96 */
alshabibb45d1962014-09-18 14:25:45 -070097 public static Criterion matchVlanPcp(Byte vlanPcp) {
alshabib7b795492014-09-16 14:38:39 -070098 return new VlanPcpCriterion(vlanPcp);
99 }
100
101 /**
102 * Creates a match on IP proto field using the specified value.
103 *
104 * @param proto ip protocol value
105 * @return match criterion
106 */
107 public static Criterion matchIPProtocol(Byte proto) {
108 return new IPProtocolCriterion(proto);
109 }
110
111 /**
112 * Creates a match on IP src field using the specified value.
113 *
114 * @param ip ip src value
115 * @return match criterion
116 */
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -0700117 public static Criterion matchIPSrc(IpPrefix ip) {
alshabib7b795492014-09-16 14:38:39 -0700118 return new IPCriterion(ip, Type.IPV4_SRC);
119 }
120
121 /**
122 * Creates a match on IP dst field using the specified value.
123 *
124 * @param ip ip src value
125 * @return match criterion
126 */
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -0700127 public static Criterion matchIPDst(IpPrefix ip) {
alshabib7b795492014-09-16 14:38:39 -0700128 return new IPCriterion(ip, Type.IPV4_DST);
alshabib369d2942014-09-12 17:59:35 -0700129 }
130
Toshio Koide9c44c9a2014-10-09 11:44:36 -0700131 /**
132 * Creates a match on TCP source port field using the specified value.
133 *
Yuta HIGUCHI5c947272014-11-03 21:39:21 -0800134 * @param tcpPort TCP source port
Toshio Koide9c44c9a2014-10-09 11:44:36 -0700135 * @return match criterion
136 */
137 public static Criterion matchTcpSrc(Short tcpPort) {
138 return new TcpPortCriterion(tcpPort, Type.TCP_SRC);
139 }
140
141 /**
142 * Creates a match on TCP destination port field using the specified value.
143 *
Yuta HIGUCHI5c947272014-11-03 21:39:21 -0800144 * @param tcpPort TCP destination port
Toshio Koide9c44c9a2014-10-09 11:44:36 -0700145 * @return match criterion
146 */
147 public static Criterion matchTcpDst(Short tcpPort) {
148 return new TcpPortCriterion(tcpPort, Type.TCP_DST);
149 }
alshabib369d2942014-09-12 17:59:35 -0700150
Marc De Leenheer49087752014-10-23 13:54:09 -0700151 /**
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800152 * Creates a match on MPLS label.
153 * @param mplsLabel MPLS label
154 * @return match criterion
155 */
156
157 public static Criterion matchMplsLabel(Integer mplsLabel) {
158 return new MplsCriterion(mplsLabel);
159 }
160
161 /**
Marc De Leenheer49087752014-10-23 13:54:09 -0700162 * Creates a match on lambda field using the specified value.
163 *
Yuta HIGUCHI5c947272014-11-03 21:39:21 -0800164 * @param lambda lamda to match on
Marc De Leenheer49087752014-10-23 13:54:09 -0700165 * @return match criterion
166 */
167 public static Criterion matchLambda(Short lambda) {
168 return new LambdaCriterion(lambda, Type.OCH_SIGID);
169 }
170
171 /**
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700172 * Creates a match on lambda field using the specified value.
173 *
Yuta HIGUCHI5c947272014-11-03 21:39:21 -0800174 * @param sigType signame type
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700175 * @return match criterion
176 */
Praseed Balakrishnan2dd5abd2014-11-03 14:56:28 -0800177 public static Criterion matchOpticalSignalType(Short sigType) {
178 return new OpticalSignalTypeCriterion(sigType, Type.OCH_SIGTYPE);
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700179 }
180
181
182 /**
alshabib7b795492014-09-16 14:38:39 -0700183 * Implementations of criteria.
184 */
alshabib7b795492014-09-16 14:38:39 -0700185 public static final class PortCriterion implements Criterion {
186 private final PortNumber port;
187
188 public PortCriterion(PortNumber port) {
189 this.port = port;
190 }
191
192 @Override
193 public Type type() {
194 return Type.IN_PORT;
195 }
196
197 public PortNumber port() {
198 return this.port;
199 }
alshabib99b8fdc2014-09-25 14:30:22 -0700200
201 @Override
202 public String toString() {
203 return toStringHelper(type().toString())
204 .add("port", port).toString();
205 }
alshabibba5ac482014-10-02 17:15:20 -0700206
207 @Override
208 public int hashCode() {
Thomas Vachuska9b2da212014-11-10 19:30:25 -0800209 return Objects.hash(type(), port);
alshabibba5ac482014-10-02 17:15:20 -0700210 }
211
212 @Override
213 public boolean equals(Object obj) {
214 if (this == obj) {
215 return true;
216 }
217 if (obj instanceof PortCriterion) {
218 PortCriterion that = (PortCriterion) obj;
alshabib2020b892014-10-20 15:47:08 -0700219 return Objects.equals(port, that.port) &&
220 Objects.equals(this.type(), that.type());
alshabibba5ac482014-10-02 17:15:20 -0700221
222 }
223 return false;
224 }
225
alshabib7b795492014-09-16 14:38:39 -0700226 }
227
228
229 public static final class EthCriterion implements Criterion {
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700230 private final MacAddress mac;
alshabib7b795492014-09-16 14:38:39 -0700231 private final Type type;
232
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700233 public EthCriterion(MacAddress mac, Type type) {
alshabib7b795492014-09-16 14:38:39 -0700234 this.mac = mac;
235 this.type = type;
236 }
237
238 @Override
239 public Type type() {
240 return this.type;
241 }
242
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700243 public MacAddress mac() {
alshabib7b795492014-09-16 14:38:39 -0700244 return this.mac;
245 }
alshabib99b8fdc2014-09-25 14:30:22 -0700246
247 @Override
248 public String toString() {
249 return toStringHelper(type().toString())
250 .add("mac", mac).toString();
251 }
252
alshabibba5ac482014-10-02 17:15:20 -0700253 @Override
254 public int hashCode() {
Thomas Vachuska9b2da212014-11-10 19:30:25 -0800255 return Objects.hash(type, mac);
alshabibba5ac482014-10-02 17:15:20 -0700256 }
257
258 @Override
259 public boolean equals(Object obj) {
260 if (this == obj) {
261 return true;
262 }
263 if (obj instanceof EthCriterion) {
264 EthCriterion that = (EthCriterion) obj;
265 return Objects.equals(mac, that.mac) &&
266 Objects.equals(type, that.type);
267
268
269 }
270 return false;
271 }
272
273
alshabib7b795492014-09-16 14:38:39 -0700274 }
275
276 public static final class EthTypeCriterion implements Criterion {
277
278 private final Short ethType;
279
280 public EthTypeCriterion(Short ethType) {
281 this.ethType = ethType;
282 }
283
284 @Override
285 public Type type() {
286 return Type.ETH_TYPE;
287 }
288
289 public Short ethType() {
290 return ethType;
291 }
292
alshabib99b8fdc2014-09-25 14:30:22 -0700293 @Override
294 public String toString() {
295 return toStringHelper(type().toString())
296 .add("ethType", Long.toHexString(ethType)).toString();
297 }
298
alshabibba5ac482014-10-02 17:15:20 -0700299 @Override
300 public int hashCode() {
Thomas Vachuska9b2da212014-11-10 19:30:25 -0800301 return Objects.hash(type(), ethType);
alshabibba5ac482014-10-02 17:15:20 -0700302 }
303
304 @Override
305 public boolean equals(Object obj) {
306 if (this == obj) {
307 return true;
308 }
309 if (obj instanceof EthTypeCriterion) {
310 EthTypeCriterion that = (EthTypeCriterion) obj;
alshabib2020b892014-10-20 15:47:08 -0700311 return Objects.equals(ethType, that.ethType) &&
312 Objects.equals(this.type(), that.type());
alshabibba5ac482014-10-02 17:15:20 -0700313
314
315 }
316 return false;
317 }
318
alshabib7b795492014-09-16 14:38:39 -0700319 }
320
321
322 public static final class IPCriterion implements Criterion {
323
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -0700324 private final IpPrefix ip;
alshabib7b795492014-09-16 14:38:39 -0700325 private final Type type;
326
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -0700327 public IPCriterion(IpPrefix ip, Type type) {
alshabib7b795492014-09-16 14:38:39 -0700328 this.ip = ip;
329 this.type = type;
330 }
331
332 @Override
333 public Type type() {
334 return this.type;
335 }
336
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -0700337 public IpPrefix ip() {
alshabib7b795492014-09-16 14:38:39 -0700338 return this.ip;
339 }
340
alshabib99b8fdc2014-09-25 14:30:22 -0700341 @Override
342 public String toString() {
343 return toStringHelper(type().toString())
344 .add("ip", ip).toString();
345 }
alshabib7b795492014-09-16 14:38:39 -0700346
alshabibba5ac482014-10-02 17:15:20 -0700347 @Override
348 public int hashCode() {
Thomas Vachuska9b2da212014-11-10 19:30:25 -0800349 return Objects.hash(type, ip);
alshabibba5ac482014-10-02 17:15:20 -0700350 }
351
352 @Override
353 public boolean equals(Object obj) {
354 if (this == obj) {
355 return true;
356 }
357 if (obj instanceof IPCriterion) {
358 IPCriterion that = (IPCriterion) obj;
359 return Objects.equals(ip, that.ip) &&
360 Objects.equals(type, that.type);
361
362
363 }
364 return false;
365 }
366
alshabib7b795492014-09-16 14:38:39 -0700367 }
368
369
370 public static final class IPProtocolCriterion implements Criterion {
371
372 private final Byte proto;
373
374 public IPProtocolCriterion(Byte protocol) {
375 this.proto = protocol;
376 }
377
378 @Override
379 public Type type() {
380 return Type.IP_PROTO;
381 }
382
383 public Byte protocol() {
384 return proto;
385 }
386
alshabib99b8fdc2014-09-25 14:30:22 -0700387 @Override
388 public String toString() {
389 return toStringHelper(type().toString())
390 .add("protocol", Long.toHexString(proto)).toString();
391 }
392
alshabibba5ac482014-10-02 17:15:20 -0700393 @Override
394 public int hashCode() {
Thomas Vachuska9b2da212014-11-10 19:30:25 -0800395 return Objects.hash(type(), proto);
alshabibba5ac482014-10-02 17:15:20 -0700396 }
397
398 @Override
399 public boolean equals(Object obj) {
400 if (this == obj) {
401 return true;
402 }
403 if (obj instanceof IPProtocolCriterion) {
404 IPProtocolCriterion that = (IPProtocolCriterion) obj;
405 return Objects.equals(proto, that.proto);
406
407
408 }
409 return false;
410 }
411
alshabib7b795492014-09-16 14:38:39 -0700412 }
413
414
415 public static final class VlanPcpCriterion implements Criterion {
416
417 private final Byte vlanPcp;
418
419 public VlanPcpCriterion(Byte vlanPcp) {
420 this.vlanPcp = vlanPcp;
421 }
422
423 @Override
424 public Type type() {
425 return Type.VLAN_PCP;
426 }
427
alshabib35edb1a2014-09-16 17:44:44 -0700428 public Byte priority() {
alshabib7b795492014-09-16 14:38:39 -0700429 return vlanPcp;
430 }
431
alshabib99b8fdc2014-09-25 14:30:22 -0700432 @Override
433 public String toString() {
434 return toStringHelper(type().toString())
435 .add("pcp", Long.toHexString(vlanPcp)).toString();
436 }
437
alshabibba5ac482014-10-02 17:15:20 -0700438 @Override
439 public int hashCode() {
Thomas Vachuska9b2da212014-11-10 19:30:25 -0800440 return Objects.hash(type(), vlanPcp);
alshabibba5ac482014-10-02 17:15:20 -0700441 }
442
443 @Override
444 public boolean equals(Object obj) {
445 if (this == obj) {
446 return true;
447 }
448 if (obj instanceof VlanPcpCriterion) {
449 VlanPcpCriterion that = (VlanPcpCriterion) obj;
alshabib2020b892014-10-20 15:47:08 -0700450 return Objects.equals(vlanPcp, that.vlanPcp) &&
451 Objects.equals(this.type(), that.type());
alshabibba5ac482014-10-02 17:15:20 -0700452
453
454 }
455 return false;
456 }
457
alshabib7b795492014-09-16 14:38:39 -0700458 }
459
460
461 public static final class VlanIdCriterion implements Criterion {
462
463
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700464 private final VlanId vlanId;
alshabib7b795492014-09-16 14:38:39 -0700465
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700466 public VlanIdCriterion(VlanId vlanId) {
alshabib7b795492014-09-16 14:38:39 -0700467 this.vlanId = vlanId;
468 }
469
470 @Override
471 public Type type() {
472 return Type.VLAN_VID;
473 }
474
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700475 public VlanId vlanId() {
alshabib7b795492014-09-16 14:38:39 -0700476 return vlanId;
477 }
478
alshabib99b8fdc2014-09-25 14:30:22 -0700479 @Override
480 public String toString() {
481 return toStringHelper(type().toString())
482 .add("id", vlanId).toString();
483 }
484
alshabibba5ac482014-10-02 17:15:20 -0700485 @Override
486 public int hashCode() {
Thomas Vachuska9b2da212014-11-10 19:30:25 -0800487 return Objects.hash(type(), vlanId);
alshabibba5ac482014-10-02 17:15:20 -0700488 }
489
490 @Override
491 public boolean equals(Object obj) {
492 if (this == obj) {
493 return true;
494 }
495 if (obj instanceof VlanIdCriterion) {
496 VlanIdCriterion that = (VlanIdCriterion) obj;
alshabib2020b892014-10-20 15:47:08 -0700497 return Objects.equals(vlanId, that.vlanId) &&
498 Objects.equals(this.type(), that.type());
alshabibba5ac482014-10-02 17:15:20 -0700499
500
501 }
502 return false;
503 }
504
alshabib7b795492014-09-16 14:38:39 -0700505 }
506
507
Toshio Koide9c44c9a2014-10-09 11:44:36 -0700508 public static final class TcpPortCriterion implements Criterion {
509
510 private final Short tcpPort;
511 private final Type type;
512
513 public TcpPortCriterion(Short tcpPort, Type type) {
514 this.tcpPort = tcpPort;
515 this.type = type;
516 }
517
518 @Override
519 public Type type() {
520 return this.type;
521 }
522
523 public Short tcpPort() {
524 return this.tcpPort;
525 }
526
527 @Override
528 public String toString() {
529 return toStringHelper(type().toString())
530 .add("tcpPort", tcpPort).toString();
531 }
532
533 @Override
534 public int hashCode() {
Thomas Vachuska9b2da212014-11-10 19:30:25 -0800535 return Objects.hash(type, tcpPort);
Toshio Koide9c44c9a2014-10-09 11:44:36 -0700536 }
537
538 @Override
539 public boolean equals(Object obj) {
540 if (this == obj) {
541 return true;
542 }
543 if (obj instanceof TcpPortCriterion) {
544 TcpPortCriterion that = (TcpPortCriterion) obj;
545 return Objects.equals(tcpPort, that.tcpPort) &&
546 Objects.equals(type, that.type);
547
548
549 }
550 return false;
551 }
552 }
Marc De Leenheer49087752014-10-23 13:54:09 -0700553
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800554 public static final class MplsCriterion implements Criterion {
555
556 private final Integer mplsLabel;
557
558 public MplsCriterion(Integer mplsLabel) {
559 this.mplsLabel = mplsLabel;
560 }
561
562 @Override
563 public Type type() {
564 return Type.MPLS_LABEL;
565 }
566
567 public Integer label() {
568 return mplsLabel;
569 }
570
571 @Override
572 public String toString() {
573 return toStringHelper(type().toString())
574 .add("mpls", mplsLabel.intValue()).toString();
575 }
576
577 @Override
578 public int hashCode() {
579 return Objects.hash(mplsLabel, type());
580 }
581
582 @Override
583 public boolean equals(Object obj) {
584 if (this == obj) {
585 return true;
586 }
587 if (obj instanceof MplsCriterion) {
588 MplsCriterion that = (MplsCriterion) obj;
589 return Objects.equals(mplsLabel, that.mplsLabel) &&
590 Objects.equals(this.type(), that.type());
591
592
593 }
594 return false;
595 }
596
597 }
598
599
Marc De Leenheer49087752014-10-23 13:54:09 -0700600 public static final class LambdaCriterion implements Criterion {
601
602 private final short lambda;
603 private final Type type;
604
605 public LambdaCriterion(short lambda, Type type) {
606 this.lambda = lambda;
607 this.type = type;
608 }
609
610 @Override
611 public Type type() {
612 return this.type;
613 }
614
615 public Short lambda() {
616 return this.lambda;
617 }
618
619 @Override
620 public String toString() {
621 return toStringHelper(type().toString())
622 .add("lambda", lambda).toString();
623 }
624
625 @Override
626 public int hashCode() {
Thomas Vachuska9b2da212014-11-10 19:30:25 -0800627 return Objects.hash(type, lambda);
Marc De Leenheer49087752014-10-23 13:54:09 -0700628 }
629
630 @Override
631 public boolean equals(Object obj) {
632 if (this == obj) {
633 return true;
634 }
635 if (obj instanceof LambdaCriterion) {
636 LambdaCriterion that = (LambdaCriterion) obj;
637 return Objects.equals(lambda, that.lambda) &&
638 Objects.equals(type, that.type);
639 }
640 return false;
641 }
642 }
643
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700644 public static final class OpticalSignalTypeCriterion implements Criterion {
645
Praseed Balakrishnan2dd5abd2014-11-03 14:56:28 -0800646 private final Short signalType;
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700647 private final Type type;
648
Praseed Balakrishnan2dd5abd2014-11-03 14:56:28 -0800649 public OpticalSignalTypeCriterion(Short signalType, Type type) {
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700650 this.signalType = signalType;
651 this.type = type;
652 }
653
654 @Override
655 public Type type() {
656 return this.type;
657 }
658
Praseed Balakrishnan2dd5abd2014-11-03 14:56:28 -0800659 public Short signalType() {
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700660 return this.signalType;
661 }
662
663 @Override
664 public String toString() {
665 return toStringHelper(type().toString())
666 .add("signalType", signalType).toString();
667 }
668
669 @Override
670 public int hashCode() {
Thomas Vachuska9b2da212014-11-10 19:30:25 -0800671 return Objects.hash(type, signalType);
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700672 }
673
674 @Override
675 public boolean equals(Object obj) {
676 if (this == obj) {
677 return true;
678 }
679 if (obj instanceof OpticalSignalTypeCriterion) {
680 OpticalSignalTypeCriterion that = (OpticalSignalTypeCriterion) obj;
681 return Objects.equals(signalType, that.signalType) &&
682 Objects.equals(type, that.type);
683 }
684 return false;
685 }
686 }
687
tom8bb16062014-09-12 14:47:46 -0700688}