2 * Validate all instance data received from the config datastore via the onDataChange() notification.
4 * N.B. that yang typedefs are not validated when a PUT operation places them into the config datastore.
5 * This means that they can arrive at onDataChange() with invalid values.
7 * In particular integer range values and string patterns (such as IP prefix/len) are not checked
8 * and accessing these values via any object.getValue() method call will cause an exception (as yang
9 * finally gets around to actually enforcing the typedef).
11 package org.opendaylight.controller.packetcable.provider;
13 import java.lang.reflect.Method;
14 import java.util.List;
16 import java.util.concurrent.ConcurrentHashMap;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
24 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ServiceClassName;
25 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ServiceFlowDirection;
26 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.TosByte;
27 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.TpProtocol;
28 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ccap.Ccaps;
29 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ccap.CcapsBuilder;
30 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ccap.attributes.AmId;
31 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ccap.attributes.AmIdBuilder;
32 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ccap.attributes.Connection;
33 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ccap.attributes.ConnectionBuilder;
34 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.classifier.Classifier;
35 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.classifier.ClassifierBuilder;
36 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.ext.classifier.ExtClassifier;
37 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.ext.classifier.ExtClassifierBuilder;
38 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.gate.spec.GateSpec;
39 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.gate.spec.GateSpecBuilder;
40 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.gates.apps.subs.Gates;
41 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.gates.apps.subs.GatesBuilder;
42 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.ipv6.classifier.Ipv6Classifier;
43 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.ipv6.classifier.Ipv6ClassifierBuilder;
44 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.traffic.profile.TrafficProfile;
45 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.traffic.profile.TrafficProfileBuilder;
46 import org.opendaylight.yangtools.yang.binding.DataObject;
47 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
51 public class ValidateInstanceData {
53 private final static Logger logger = LoggerFactory.getLogger(ValidateInstanceData.class);
56 private final MdsalUtils mdsalUtils;
59 private final Map<InstanceIdentifier<Gates>, Gates> gateIidMap;
62 private transient Ccaps ccap;
63 private transient InstanceIdentifier<Ccaps> ccapIID;
65 public ValidateInstanceData(final MdsalUtils mdsalUtils, final Map<InstanceIdentifier<?>, DataObject> thisData) {
66 this.mdsalUtils = mdsalUtils;
69 // Must be instantiated prior to retreiving the gates below
70 gateIidMap = new ConcurrentHashMap<>();
72 // TODO FIXME - this value is always null???
78 public boolean validateYang() {
80 if (! validateCcap(ccap)) {
81 logger.error("Validate CCAP {} failed - {}", ccap.getCcapId());
82 mdsalUtils.delete(LogicalDatastoreType.CONFIGURATION, ccapIID);
85 } else if (! gateIidMap.isEmpty()) {
86 for (Map.Entry<InstanceIdentifier<Gates>, Gates> entry : gateIidMap.entrySet()) {
87 InstanceIdentifier<Gates> gateIID = entry.getKey();
88 Gates gate = entry.getValue();
89 if (! validateGate(gate)) {
90 logger.error("Validate Gate {} failed - {}", gate.getGateId());
91 mdsalUtils.delete(LogicalDatastoreType.CONFIGURATION, gateIID);
99 private void getCcap(final Map<InstanceIdentifier<?>, DataObject> thisData) {
100 for (final Map.Entry<InstanceIdentifier<?>, DataObject> entry : thisData.entrySet()) {
101 if (entry.getValue() instanceof Ccaps) {
102 ccap = (Ccaps)entry.getValue();
103 // TODO FIXME - ClassCastException waiting to occur here!!!
104 ccapIID = (InstanceIdentifier<Ccaps>) entry.getKey();
109 private void getGates(final Map<InstanceIdentifier<?>, DataObject> thisData) {
110 for (final Map.Entry<InstanceIdentifier<?>, DataObject> entry : thisData.entrySet()) {
111 if (entry.getValue() instanceof Gates) {
112 final Gates gate = (Gates)entry.getValue();
113 // TODO FIXME - ClassCastException waiting to occur here!!!
114 final InstanceIdentifier<Gates> gateIID = (InstanceIdentifier<Gates>)entry.getKey();
115 gateIidMap.put(gateIID, gate);
119 private String validateMethod(final Class<?> thisClass, final Object thisObj, final String methodName) {
121 final Method method = thisClass.getMethod(methodName);
122 method.invoke(thisObj);
123 } catch (IllegalArgumentException e) {
124 return e.getMessage();
125 } catch (Exception e) {
127 // error = String.format("%s.%s(): Method failed: %s ", thisClass.getSimpleName(), methodName, e.getMessage());
132 private boolean validateGateSpec(final Gates gate, final GatesBuilder gateBuilder) {
136 boolean valid = true;
137 GateSpec gateSpec = gate.getGateSpec();
138 if (gateSpec != null) {
139 final ServiceFlowDirection dir;
140 error = validateMethod(GateSpec.class, gateSpec, "getDirection");
142 dir = gateSpec.getDirection();
144 if (gate.getTrafficProfile().getServiceClassName() != null) {
145 message += " gate-spec.direction not allowed for traffic-profile.SCN;";
150 message += " gate-spec.direction invalid: must be 'us' or 'ds' -" + error;
154 final TosByte tosByte;
155 error = validateMethod(GateSpec.class, gateSpec, "getDscpTosOverwrite");
157 tosByte = gateSpec.getDscpTosOverwrite();
159 message += " gate-spec.dscp-tos-overwrite invalid: " + error;
163 final TosByte tosMask;
164 error = validateMethod(GateSpec.class, gateSpec, "getDscpTosMask");
166 tosMask = gateSpec.getDscpTosMask();
167 if (tosByte != null && tosMask == null) {
168 message += " gate-spec.dscp-tos-mask missing;";
172 message += " gate-spec.dscp-tos-mask invalid: " + error;
177 // rebuild the gateSpec with nulls replacing bad values
178 final GateSpecBuilder gateSpecBuilder = new GateSpecBuilder();
179 gateSpecBuilder.setDirection(dir);
180 gateSpecBuilder.setDscpTosOverwrite(tosByte);
181 gateSpecBuilder.setDscpTosMask(tosMask);
182 gateSpec = gateSpecBuilder.build();
184 gateBuilder.setGateSpec(gateSpec);
188 logger.error(message);
193 private boolean validateTrafficProfile(final Gates gate, final GatesBuilder gateBuilder) {
196 boolean valid = true;
197 TrafficProfile profile = gate.getTrafficProfile();
198 if (profile == null) {
199 message += " traffic-profile is required;";
202 final ServiceClassName scn;
203 final String error = validateMethod(TrafficProfile.class, profile, "getServiceClassName");
205 scn = profile.getServiceClassName();
207 message += " traffic-profile.service-class-name missing;";
211 message += " traffic-profile.service-class-name invalid: must be 2-16 characters " + error;
216 final TrafficProfileBuilder profileBuilder = new TrafficProfileBuilder();
217 // TODO FIXME - scn is always null???
218 profileBuilder.setServiceClassName(scn);
219 profile = profileBuilder.build();
221 gateBuilder.setTrafficProfile(profile);
225 logger.error(message);
230 // TODO FIXME - Break this method apart
231 private boolean validateClassifier(final Gates gate, final GatesBuilder gateBuilder) {
232 // validate classifier
234 boolean valid = true;
236 Classifier classifier = gate.getClassifier();
238 final Ipv4Address sip;
239 String error = validateMethod(Classifier.class, classifier, "getSrcIp");
241 sip = classifier.getSrcIp();
244 message += " classifier.srcIp invalid: - " + error;
249 final Ipv4Address dip;
250 error = validateMethod(Classifier.class, classifier, "getDstIp");
252 dip = classifier.getDstIp();
255 message += " classifier.dstIp invalid: - " + error;
260 final TpProtocol proto;
261 error = validateMethod(Classifier.class, classifier, "getProtocol");
263 proto = classifier.getProtocol();
266 message += " classifier.protocol invalid: - " + error;
271 final PortNumber sport;
272 error = validateMethod(Classifier.class, classifier, "getSrcPort");
274 sport = classifier.getSrcPort();
277 message += " classifier.srcPort invalid: - " + error;
282 final PortNumber dport;
283 error = validateMethod(Classifier.class, classifier, "getDstPort");
285 dport = classifier.getDstPort();
288 message += " classifier.dstPort invalid: - " + error;
293 final TosByte tosByte;
294 error = validateMethod(Classifier.class, classifier, "getTosByte");
296 tosByte = classifier.getTosByte();
299 message += " classifier.tosByte invalid: " + error;
303 final TosByte tosMask;
304 error = validateMethod(Classifier.class, classifier, "getTosMask");
306 tosMask = classifier.getTosMask();
307 if (tosByte != null && tosMask == null) {
308 message += " classifier.tosMask missing;";
312 message += " classifier.tosMask invalid: " + error;
317 message += " classifer must have at least one match field";
321 final ClassifierBuilder cBuilder = new ClassifierBuilder();
322 cBuilder.setSrcIp(sip);
323 cBuilder.setDstIp(dip);
324 cBuilder.setProtocol(proto);
325 cBuilder.setSrcPort(sport);
326 cBuilder.setDstPort(dport);
327 cBuilder.setTosByte(tosByte);
328 cBuilder.setTosMask(tosMask);
329 classifier = cBuilder.build();
330 gateBuilder.setClassifier(classifier);
331 logger.error(message);
336 // TODO FIXME - breakup this method
337 private boolean validateExtClassifier(final Gates gate, final GatesBuilder gateBuilder) {
338 // validate ext-classifier
341 boolean valid = true;
343 ExtClassifier extClassifier = gate.getExtClassifier();
345 final Ipv4Address sip;
346 error = validateMethod(ExtClassifier.class, extClassifier, "getSrcIp");
348 sip = extClassifier.getSrcIp();
351 message += " ext-classifier.srcIp invalid: - " + error;
355 final Ipv4Address sipMask;
356 error = validateMethod(ExtClassifier.class, extClassifier, "getSrcIpMask");
358 sipMask = extClassifier.getSrcIpMask();
361 message += " ext-classifier.srcIpMask invalid: - " + error;
365 if (sip != null && sipMask == null) {
366 message += " ext-classifier.srcIpMask missing";
370 final Ipv4Address dip;
371 error = validateMethod(ExtClassifier.class, extClassifier, "getDstIp");
373 dip = extClassifier.getDstIp();
376 message += " ext-classifier.dstIp invalid: - " + error;
380 final Ipv4Address dipMask;
381 error = validateMethod(ExtClassifier.class, extClassifier, "getDstIpMask");
383 dipMask = extClassifier.getDstIpMask();
386 message += " ext-classifier.srcIpMask invalid: - " + error;
390 if (dip != null && dipMask == null) {
391 message += " ext-classifier.dstIpMask missing;";
395 final TpProtocol proto;
396 error = validateMethod(ExtClassifier.class, extClassifier, "getProtocol");
398 proto = extClassifier.getProtocol();
401 message += " ext-classifier.protocol invalid: - " + error;
406 final PortNumber sportStart;
407 error = validateMethod(ExtClassifier.class, extClassifier, "getSrcPortStart");
409 sportStart = extClassifier.getSrcPortStart();
412 message += " ext-classifier.srcPortStart invalid: - " + error;
416 final PortNumber sportEnd;
417 error = validateMethod(ExtClassifier.class, extClassifier, "getSrcPortEnd");
419 sportEnd = extClassifier.getSrcPortEnd();
422 message += " ext-classifier.srcPortEnd invalid: - " + error;
426 if (sportStart != null && sportEnd != null) {
427 if (sportStart.getValue() > sportEnd.getValue()) {
428 message += " ext-classifier.srcPortStart greater than srcPortEnd";
432 // Destination port range
433 final PortNumber dportStart;
434 error = validateMethod(ExtClassifier.class, extClassifier, "getDstPortStart");
436 dportStart = extClassifier.getDstPortStart();
439 message += " ext-classifier.dstPortStart invalid: - " + error;
443 final PortNumber dportEnd;
444 error = validateMethod(ExtClassifier.class, extClassifier, "getDstPortEnd");
446 dportEnd = extClassifier.getDstPortEnd();
449 message += " ext-classifier.dstPortEnd invalid: - " + error;
453 if (dportStart != null && dportEnd != null) {
454 if (dportStart.getValue() > dportEnd.getValue()) {
455 message += " ext-classifier.dstPortStart greater than dstPortEnd";
460 final TosByte tosByte;
461 error = validateMethod(ExtClassifier.class, extClassifier, "getTosByte");
463 tosByte = extClassifier.getTosByte();
466 message += " ext-classifier.tosByte invalid: " + error;
470 final TosByte tosMask;
471 error = validateMethod(ExtClassifier.class, extClassifier, "getTosMask");
473 tosMask = extClassifier.getTosMask();
474 if (tosByte != null && tosMask == null) {
475 message += " ext-classifier.tosMask missing;";
479 message += " ext-classifier.tosMask invalid: " + error;
484 message += " ext-classifer must have at least one match field";
488 final ExtClassifierBuilder cBuilder = new ExtClassifierBuilder();
489 cBuilder.setSrcIp(sip);
490 cBuilder.setSrcIpMask(sipMask);
491 cBuilder.setDstIp(dip);
492 cBuilder.setDstIpMask(dipMask);
493 cBuilder.setProtocol(proto);
494 cBuilder.setSrcPortStart(sportStart);
495 cBuilder.setSrcPortEnd(sportEnd);
496 cBuilder.setDstPortStart(dportStart);
497 cBuilder.setDstPortEnd(dportEnd);
498 cBuilder.setTosByte(tosByte);
499 cBuilder.setTosMask(tosMask);
500 extClassifier = cBuilder.build();
501 gateBuilder.setExtClassifier(extClassifier);
502 logger.error(message);
507 // TODO FIXME - break apart this method.
508 private boolean validateIpv6Classifier(final Gates gate, final GatesBuilder gateBuilder) {
509 // validate ipv6-classifier
512 boolean valid = true;
514 Ipv6Classifier ipv6Classifier = gate.getIpv6Classifier();
515 // Source IPv6 prefix
516 final Ipv6Prefix sip6;
517 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getSrcIp6");
519 sip6 = ipv6Classifier.getSrcIp6();
522 message += " ipv6-classifier.srcIp invalid: - " + error;
526 // Destination IPv6 prefix
527 final Ipv6Prefix dip6;
528 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getDstIp6");
530 dip6 = ipv6Classifier.getDstIp6();
533 message += " ipv6-classifier.dstIp invalid: - " + error;
539 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getFlowLabel");
541 flowLabel = ipv6Classifier.getFlowLabel();
542 if (flowLabel > 1048575) {
543 message += " ipv6-classifier.flowLabel invalid: - must be 0..1048575";
550 message += " ipv6-classifier.flowLabel invalid: - " + error;
555 final TpProtocol nxtHdr;
556 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getNextHdr");
558 nxtHdr = ipv6Classifier.getNextHdr();
561 message += " ipv6-classifier.nextHdr invalid: - " + error;
566 final PortNumber sportStart;
567 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getSrcPortStart");
569 sportStart = ipv6Classifier.getSrcPortStart();
572 message += " ipv6-classifier.srcPortStart invalid: - " + error;
576 final PortNumber sportEnd;
577 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getSrcPortEnd");
579 sportEnd = ipv6Classifier.getSrcPortEnd();
582 message += " ipv6-classifier.srcPortEnd invalid: - " + error;
586 if (sportStart != null && sportEnd != null) {
587 if (sportStart.getValue() > sportEnd.getValue()) {
588 message += " ipv6-classifier.srcPortStart greater than srcPortEnd";
592 // Destination port range
593 final PortNumber dportStart;
594 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getDstPortStart");
596 dportStart = ipv6Classifier.getDstPortStart();
599 message += " ipv6-classifier.dstPortStart invalid: - " + error;
603 final PortNumber dportEnd;
604 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getDstPortEnd");
606 dportEnd = ipv6Classifier.getDstPortEnd();
609 message += " ipv6-classifier.dstPortEnd invalid: - " + error;
613 if (dportStart != null && dportEnd != null) {
614 if (dportStart.getValue() > dportEnd.getValue()) {
615 message += " ipv6-classifier.dstPortStart greater than dstPortEnd";
621 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getTcLow");
623 tcLow = ipv6Classifier.getTcLow();
626 message += " ipv6-classifier.tc-low invalid: " + error;
630 final TosByte tcHigh;
631 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getTcHigh");
633 tcHigh = ipv6Classifier.getTcHigh();
636 message += " ipv6-classifier.tc-high invalid: " + error;
640 if (tcLow != null && tcHigh != null) {
641 if (tcLow.getValue() > tcHigh.getValue()) {
642 message += " ipv6-classifier.tc-low is greater than tc-high";
646 final TosByte tcMask;
647 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getTcMask");
649 tcMask = ipv6Classifier.getTcMask();
651 message += " ipv6-classifier.tc-mask invalid: " + error;
655 if (tcLow != null && tcHigh != null && tcMask == null) {
656 message += " ipv6-classifier.tc-mask missing;";
660 message += " ipv6-classifer must have at least one match field";
665 final Ipv6ClassifierBuilder cBuilder = new Ipv6ClassifierBuilder();
666 cBuilder.setSrcIp6(sip6);
667 cBuilder.setDstIp6(dip6);
668 cBuilder.setFlowLabel(flowLabel);
669 cBuilder.setNextHdr(nxtHdr);
670 cBuilder.setSrcPortStart(sportStart);
671 cBuilder.setSrcPortEnd(sportEnd);
672 cBuilder.setDstPortStart(dportStart);
673 cBuilder.setDstPortEnd(dportEnd);
674 cBuilder.setTcLow(tcLow);
675 cBuilder.setTcHigh(tcHigh);
676 cBuilder.setTcMask(tcMask);
677 ipv6Classifier = cBuilder.build();
678 gateBuilder.setIpv6Classifier(ipv6Classifier);
679 logger.error(message);
684 // TODO FIXME - Do we really want the gate parameter object to be muted by this method?
685 private boolean validateGate(Gates gate) {
686 // validate gate elements and null out invalid elements as we go
687 final GatesBuilder gateBuilder = new GatesBuilder();
689 boolean rebuild = false;
691 if (! validateGateSpec(gate, gateBuilder)) {
695 if (! validateTrafficProfile(gate, gateBuilder)) {
698 // classifiers (one of legacy classifier, ext-classifier, or ipv6 classifier
699 final Classifier classifier = gate.getClassifier();
700 final ExtClassifier extClassifier = gate.getExtClassifier();
701 final Ipv6Classifier ipv6Classifier = gate.getIpv6Classifier();
703 if (classifier != null) { count++; }
704 if (extClassifier != null) { count++; }
705 if (ipv6Classifier != null) { count++; }
707 message = " Missing classifer: must have only 1 of classifier, ext-classifier, or ipv6-classifier";
709 } else if (count > 1) {
710 message = "Multiple classifiers: must have only 1 of classifier, ext-classifier, or ipv6-classifier";
712 } else if (count == 1) {
713 if (classifier != null) {
714 // validate classifier
715 if (! validateClassifier(gate, gateBuilder)) {
718 } else if (extClassifier != null) {
719 //validate ext-classifier
720 if (! validateExtClassifier(gate, gateBuilder)) {
723 } else if (ipv6Classifier != null) {
724 // TODO FIXME - ipv6Classifier is always null???
725 // validate ipv6-classifier
726 if (! validateIpv6Classifier(gate, gateBuilder)) {
731 // rebuild the gate object with valid data and set the response
733 gateBuilder.setGateId(gate.getGateId());
734 gateBuilder.setKey(gate.getKey());
735 // TODO FIXME - the input parameter "gate" is being muted here???
736 gate = gateBuilder.build();
737 logger.error("Gate: {} - {}", gate, message);
742 private boolean validateAmId(final Ccaps ccap, final CcapsBuilder ccapBuilder) {
746 boolean valid = true;
747 AmId amId = ccap.getAmId();
749 message += " amId is required;";
753 error = validateMethod(AmId.class, amId, "getAmTag");
755 amTag = amId.getAmTag();
757 message += " amId.amTag missing;";
761 message += " amId.amTag invalid: " + error;
765 final Integer amType;
766 error = validateMethod(AmId.class, amId, "getAmType");
768 amType = amId.getAmType();
769 if (amType == null) {
770 message += " amId.amType missing;";
774 message += " amId.amType invalid: " + error;
779 final AmIdBuilder amIdBuilder = new AmIdBuilder();
780 amIdBuilder.setAmTag(amTag);
781 amIdBuilder.setAmType(amType);
782 amId = amIdBuilder.build();
783 ccapBuilder.setAmId(amId);
787 logger.error(message);
792 private boolean validateConnection(final Ccaps ccap, final CcapsBuilder ccapBuilder) {
796 boolean valid = true;
797 Connection conn = ccap.getConnection();
799 message += " connection is required;";
803 final IpAddress ipAddress;
804 error = validateMethod(Connection.class, conn, "getIpAddress");
806 ipAddress = conn.getIpAddress();
807 if (ipAddress == null) {
808 message += " connection.ipAddress missing;";
812 message += " connection.ipAddress invalid: " + error;
817 final PortNumber portNum;
818 error = validateMethod(Connection.class, conn, "getPort");
820 portNum = conn.getPort();
822 message += " connection.port invalid: " + error;
827 final ConnectionBuilder connBuilder = new ConnectionBuilder();
828 connBuilder.setIpAddress(ipAddress);
829 connBuilder.setPort(portNum);
830 conn = connBuilder.build();
831 ccapBuilder.setConnection(conn);
835 logger.error(message);
840 private boolean validateSubscriberSubnets(final Ccaps ccap, final CcapsBuilder ccapBuilder) {
841 // subscriber-subnets
844 boolean valid = true;
845 List<IpPrefix> subnets = null;
846 error = validateMethod(Ccaps.class, ccap, "getSubscriberSubnets");
848 subnets = ccap.getSubscriberSubnets();
849 if (subnets == null) {
850 message += " subscriber-subnets is required;";
854 message += " subscriber-subnets contains invalid IpPrefix - must be <ipaddress>/<prefixlen> format;" + error;
858 // TODO FIXME - subnets is always null???
859 ccapBuilder.setSubscriberSubnets(subnets);
860 logger.error(message);
865 private boolean validateUpstreamScns(final Ccaps ccap, final CcapsBuilder ccapBuilder) {
869 boolean valid = true;
870 List<ServiceClassName> usScns = null;
871 error = validateMethod(Ccaps.class, ccap, "getUpstreamScns");
873 usScns = ccap.getUpstreamScns();
874 if (usScns == null) {
875 message += " upstream-scns is required;";
879 message += " upstream-scns contains invalid SCN - must be 2-16 characters;" + error;
883 // TODO FIXME - usScns is always null???
884 ccapBuilder.setUpstreamScns(usScns);
885 logger.error(message);
890 private boolean validateDownstreamScns(final Ccaps ccap, final CcapsBuilder ccapBuilder) {
893 boolean valid = true;
894 List<ServiceClassName> dsScns = null;
895 final String error = validateMethod(Ccaps.class, ccap, "getDownstreamScns");
897 dsScns = ccap.getDownstreamScns();
898 if (dsScns == null) {
899 message += " downstream-scns is required;";
903 message += " downstream-scns contains invalid SCN - must be 2-16 characters;" + error;
907 // TODO FIXME - dsScns is always null???
908 ccapBuilder.setDownstreamScns(dsScns);
909 logger.error(message);
915 // TODO FIXME - Do we really want the ccap parameter object to be muted by this method?
916 private boolean validateCcap(Ccaps ccap) {
917 // validate ccap and null out invalid elements as we go
918 final CcapsBuilder ccapBuilder = new CcapsBuilder();
920 boolean rebuild = false;
922 if ( ! validateAmId(ccap, ccapBuilder)) {
926 if ( ! validateConnection(ccap, ccapBuilder)) {
929 // subscriber-subnets
930 if ( ! validateSubscriberSubnets(ccap, ccapBuilder)) {
934 if ( ! validateUpstreamScns(ccap, ccapBuilder)) {
938 if ( ! validateDownstreamScns(ccap, ccapBuilder)) {
941 // rebuild the ccap object with valid data and set the response
943 ccapBuilder.setCcapId(ccap.getCcapId());
944 ccapBuilder.setKey(ccap.getKey());
945 // TODO FIXME - the input parameter "ccap" is being muted here???
946 ccap = ccapBuilder.build();
947 logger.error("Ccap: {} - {} ", ccap, message);