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;
17 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
23 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.ServiceClassName;
24 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.ServiceFlowDirection;
25 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.TosByte;
26 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.TpProtocol;
27 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.ccap.attributes.AmId;
28 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.ccap.attributes.AmIdBuilder;
29 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.ccap.attributes.Connection;
30 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.ccap.attributes.ConnectionBuilder;
31 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.ccaps.Ccap;
32 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.ccaps.CcapBuilder;
33 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.pcmm.qos.classifier.Classifier;
34 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.pcmm.qos.classifier.ClassifierBuilder;
35 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.pcmm.qos.ext.classifier.ExtClassifier;
36 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.pcmm.qos.ext.classifier.ExtClassifierBuilder;
37 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.pcmm.qos.gate.spec.GateSpec;
38 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.pcmm.qos.gate.spec.GateSpecBuilder;
39 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.pcmm.qos.gates.apps.app.subscribers.subscriber.gates.Gate;
40 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.pcmm.qos.gates.apps.app.subscribers.subscriber.gates.GateBuilder;
41 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.pcmm.qos.ipv6.classifier.Ipv6Classifier;
42 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.pcmm.qos.ipv6.classifier.Ipv6ClassifierBuilder;
43 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.pcmm.qos.traffic.profile.TrafficProfile;
44 import org.opendaylight.yang.gen.v1.urn.packetcable.rev151026.pcmm.qos.traffic.profile.TrafficProfileBuilder;
45 import org.opendaylight.yangtools.yang.binding.DataObject;
46 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
50 public class ValidateInstanceData {
52 private final static Logger logger = LoggerFactory.getLogger(ValidateInstanceData.class);
55 private final MdsalUtils mdsalUtils;
58 private final Map<InstanceIdentifier<Gate>, Gate> gateIidMap;
61 private transient Ccap ccap;
62 private transient InstanceIdentifier<Ccap> ccapIID;
64 public ValidateInstanceData(final MdsalUtils mdsalUtils, final Map<InstanceIdentifier<?>, DataObject> thisData) {
65 this.mdsalUtils = mdsalUtils;
68 // Must be instantiated prior to retreiving the gates below
69 gateIidMap = new ConcurrentHashMap<>();
71 // TODO FIXME - this value is always null???
77 public boolean validateYang() {
79 if (! validateCcap(ccap)) {
80 logger.error("Validate CCAP {} failed - {}", ccap.getCcapId());
81 mdsalUtils.delete(LogicalDatastoreType.CONFIGURATION, ccapIID);
84 } else if (! gateIidMap.isEmpty()) {
85 for (Map.Entry<InstanceIdentifier<Gate>, Gate> entry : gateIidMap.entrySet()) {
86 InstanceIdentifier<Gate> gateIID = entry.getKey();
87 Gate gate = entry.getValue();
88 if (! validateGate(gate)) {
89 logger.error("Validate Gate {} failed - {}", gate.getGateId());
90 mdsalUtils.delete(LogicalDatastoreType.CONFIGURATION, gateIID);
98 private void getCcap(final Map<InstanceIdentifier<?>, DataObject> thisData) {
99 for (final Map.Entry<InstanceIdentifier<?>, DataObject> entry : thisData.entrySet()) {
100 if (entry.getValue() instanceof Ccap) {
101 ccap = (Ccap)entry.getValue();
102 // TODO FIXME - ClassCastException waiting to occur here!!!
103 ccapIID = (InstanceIdentifier<Ccap>) entry.getKey();
108 private void getGates(final Map<InstanceIdentifier<?>, DataObject> thisData) {
109 for (final Map.Entry<InstanceIdentifier<?>, DataObject> entry : thisData.entrySet()) {
110 if (entry.getValue() instanceof Gate) {
111 final Gate gate = (Gate)entry.getValue();
112 // TODO FIXME - ClassCastException waiting to occur here!!!
113 final InstanceIdentifier<Gate> gateIID = (InstanceIdentifier<Gate>)entry.getKey();
114 gateIidMap.put(gateIID, gate);
118 private String validateMethod(final Class<?> thisClass, final Object thisObj, final String methodName) {
120 final Method method = thisClass.getMethod(methodName);
121 method.invoke(thisObj);
122 } catch (IllegalArgumentException e) {
123 return e.getMessage();
124 } catch (Exception e) {
126 // error = String.format("%s.%s(): Method failed: %s ", thisClass.getSimpleName(), methodName, e.getMessage());
131 private boolean validateGateSpec(final Gate gate, final GateBuilder gateBuilder) {
135 boolean valid = true;
136 GateSpec gateSpec = gate.getGateSpec();
137 if (gateSpec != null) {
138 final ServiceFlowDirection dir;
139 error = validateMethod(GateSpec.class, gateSpec, "getDirection");
141 dir = gateSpec.getDirection();
143 if (gate.getTrafficProfile().getServiceClassName() != null) {
144 message += " gate-spec.direction not allowed for traffic-profile.SCN;";
149 message += " gate-spec.direction invalid: must be 'us' or 'ds' -" + error;
153 final TosByte tosByte;
154 error = validateMethod(GateSpec.class, gateSpec, "getDscpTosOverwrite");
156 tosByte = gateSpec.getDscpTosOverwrite();
158 message += " gate-spec.dscp-tos-overwrite invalid: " + error;
162 final TosByte tosMask;
163 error = validateMethod(GateSpec.class, gateSpec, "getDscpTosMask");
165 tosMask = gateSpec.getDscpTosMask();
166 if (tosByte != null && tosMask == null) {
167 message += " gate-spec.dscp-tos-mask missing;";
171 message += " gate-spec.dscp-tos-mask invalid: " + error;
176 // rebuild the gateSpec with nulls replacing bad values
177 final GateSpecBuilder gateSpecBuilder = new GateSpecBuilder();
178 gateSpecBuilder.setDirection(dir);
179 gateSpecBuilder.setDscpTosOverwrite(tosByte);
180 gateSpecBuilder.setDscpTosMask(tosMask);
181 gateSpec = gateSpecBuilder.build();
183 gateBuilder.setGateSpec(gateSpec);
187 logger.error(message);
192 private boolean validateTrafficProfile(final Gate gate, final GateBuilder gateBuilder) {
195 boolean valid = true;
196 TrafficProfile profile = gate.getTrafficProfile();
197 if (profile == null) {
198 message += " traffic-profile is required;";
201 final ServiceClassName scn;
202 final String error = validateMethod(TrafficProfile.class, profile, "getServiceClassName");
204 scn = profile.getServiceClassName();
206 message += " traffic-profile.service-class-name missing;";
210 message += " traffic-profile.service-class-name invalid: must be 2-16 characters " + error;
215 final TrafficProfileBuilder profileBuilder = new TrafficProfileBuilder();
216 // TODO FIXME - scn is always null???
217 profileBuilder.setServiceClassName(scn);
218 profile = profileBuilder.build();
220 gateBuilder.setTrafficProfile(profile);
224 logger.error(message);
229 // TODO FIXME - Break this method apart
230 private boolean validateClassifier(final Gate gate, final GateBuilder gateBuilder) {
231 // validate classifier
233 boolean valid = true;
235 Classifier classifier = gate.getClassifier();
237 final Ipv4Address sip;
238 String error = validateMethod(Classifier.class, classifier, "getSrcIp");
240 sip = classifier.getSrcIp();
243 message += " classifier.srcIp invalid: - " + error;
248 final Ipv4Address dip;
249 error = validateMethod(Classifier.class, classifier, "getDstIp");
251 dip = classifier.getDstIp();
254 message += " classifier.dstIp invalid: - " + error;
259 final TpProtocol proto;
260 error = validateMethod(Classifier.class, classifier, "getProtocol");
262 proto = classifier.getProtocol();
265 message += " classifier.protocol invalid: - " + error;
270 final PortNumber sport;
271 error = validateMethod(Classifier.class, classifier, "getSrcPort");
273 sport = classifier.getSrcPort();
276 message += " classifier.srcPort invalid: - " + error;
281 final PortNumber dport;
282 error = validateMethod(Classifier.class, classifier, "getDstPort");
284 dport = classifier.getDstPort();
287 message += " classifier.dstPort invalid: - " + error;
292 final TosByte tosByte;
293 error = validateMethod(Classifier.class, classifier, "getTosByte");
295 tosByte = classifier.getTosByte();
298 message += " classifier.tosByte invalid: " + error;
302 final TosByte tosMask;
303 error = validateMethod(Classifier.class, classifier, "getTosMask");
305 tosMask = classifier.getTosMask();
306 if (tosByte != null && tosMask == null) {
307 message += " classifier.tosMask missing;";
311 message += " classifier.tosMask invalid: " + error;
316 message += " classifer must have at least one match field";
320 final ClassifierBuilder cBuilder = new ClassifierBuilder();
321 cBuilder.setSrcIp(sip);
322 cBuilder.setDstIp(dip);
323 cBuilder.setProtocol(proto);
324 cBuilder.setSrcPort(sport);
325 cBuilder.setDstPort(dport);
326 cBuilder.setTosByte(tosByte);
327 cBuilder.setTosMask(tosMask);
328 classifier = cBuilder.build();
329 gateBuilder.setClassifier(classifier);
330 logger.error(message);
335 // TODO FIXME - breakup this method
336 private boolean validateExtClassifier(final Gate gate, final GateBuilder gateBuilder) {
337 // validate ext-classifier
340 boolean valid = true;
342 ExtClassifier extClassifier = gate.getExtClassifier();
344 final Ipv4Address sip;
345 error = validateMethod(ExtClassifier.class, extClassifier, "getSrcIp");
347 sip = extClassifier.getSrcIp();
350 message += " ext-classifier.srcIp invalid: - " + error;
354 final Ipv4Address sipMask;
355 error = validateMethod(ExtClassifier.class, extClassifier, "getSrcIpMask");
357 sipMask = extClassifier.getSrcIpMask();
360 message += " ext-classifier.srcIpMask invalid: - " + error;
364 if (sip != null && sipMask == null) {
365 message += " ext-classifier.srcIpMask missing";
369 final Ipv4Address dip;
370 error = validateMethod(ExtClassifier.class, extClassifier, "getDstIp");
372 dip = extClassifier.getDstIp();
375 message += " ext-classifier.dstIp invalid: - " + error;
379 final Ipv4Address dipMask;
380 error = validateMethod(ExtClassifier.class, extClassifier, "getDstIpMask");
382 dipMask = extClassifier.getDstIpMask();
385 message += " ext-classifier.srcIpMask invalid: - " + error;
389 if (dip != null && dipMask == null) {
390 message += " ext-classifier.dstIpMask missing;";
394 final TpProtocol proto;
395 error = validateMethod(ExtClassifier.class, extClassifier, "getProtocol");
397 proto = extClassifier.getProtocol();
400 message += " ext-classifier.protocol invalid: - " + error;
405 final PortNumber sportStart;
406 error = validateMethod(ExtClassifier.class, extClassifier, "getSrcPortStart");
408 sportStart = extClassifier.getSrcPortStart();
411 message += " ext-classifier.srcPortStart invalid: - " + error;
415 final PortNumber sportEnd;
416 error = validateMethod(ExtClassifier.class, extClassifier, "getSrcPortEnd");
418 sportEnd = extClassifier.getSrcPortEnd();
421 message += " ext-classifier.srcPortEnd invalid: - " + error;
425 if (sportStart != null && sportEnd != null) {
426 if (sportStart.getValue() > sportEnd.getValue()) {
427 message += " ext-classifier.srcPortStart greater than srcPortEnd";
431 // Destination port range
432 final PortNumber dportStart;
433 error = validateMethod(ExtClassifier.class, extClassifier, "getDstPortStart");
435 dportStart = extClassifier.getDstPortStart();
438 message += " ext-classifier.dstPortStart invalid: - " + error;
442 final PortNumber dportEnd;
443 error = validateMethod(ExtClassifier.class, extClassifier, "getDstPortEnd");
445 dportEnd = extClassifier.getDstPortEnd();
448 message += " ext-classifier.dstPortEnd invalid: - " + error;
452 if (dportStart != null && dportEnd != null) {
453 if (dportStart.getValue() > dportEnd.getValue()) {
454 message += " ext-classifier.dstPortStart greater than dstPortEnd";
459 final TosByte tosByte;
460 error = validateMethod(ExtClassifier.class, extClassifier, "getTosByte");
462 tosByte = extClassifier.getTosByte();
465 message += " ext-classifier.tosByte invalid: " + error;
469 final TosByte tosMask;
470 error = validateMethod(ExtClassifier.class, extClassifier, "getTosMask");
472 tosMask = extClassifier.getTosMask();
473 if (tosByte != null && tosMask == null) {
474 message += " ext-classifier.tosMask missing;";
478 message += " ext-classifier.tosMask invalid: " + error;
483 message += " ext-classifer must have at least one match field";
487 final ExtClassifierBuilder cBuilder = new ExtClassifierBuilder();
488 cBuilder.setSrcIp(sip);
489 cBuilder.setSrcIpMask(sipMask);
490 cBuilder.setDstIp(dip);
491 cBuilder.setDstIpMask(dipMask);
492 cBuilder.setProtocol(proto);
493 cBuilder.setSrcPortStart(sportStart);
494 cBuilder.setSrcPortEnd(sportEnd);
495 cBuilder.setDstPortStart(dportStart);
496 cBuilder.setDstPortEnd(dportEnd);
497 cBuilder.setTosByte(tosByte);
498 cBuilder.setTosMask(tosMask);
499 extClassifier = cBuilder.build();
500 gateBuilder.setExtClassifier(extClassifier);
501 logger.error(message);
506 // TODO FIXME - break apart this method.
507 private boolean validateIpv6Classifier(final Gate gate, final GateBuilder gateBuilder) {
508 // validate ipv6-classifier
511 boolean valid = true;
513 Ipv6Classifier ipv6Classifier = gate.getIpv6Classifier();
514 // Source IPv6 prefix
515 final Ipv6Prefix sip6;
516 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getSrcIp6");
518 sip6 = ipv6Classifier.getSrcIp6();
521 message += " ipv6-classifier.srcIp invalid: - " + error;
525 // Destination IPv6 prefix
526 final Ipv6Prefix dip6;
527 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getDstIp6");
529 dip6 = ipv6Classifier.getDstIp6();
532 message += " ipv6-classifier.dstIp invalid: - " + error;
538 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getFlowLabel");
540 flowLabel = ipv6Classifier.getFlowLabel();
541 if (flowLabel > 1048575) {
542 message += " ipv6-classifier.flowLabel invalid: - must be 0..1048575";
549 message += " ipv6-classifier.flowLabel invalid: - " + error;
554 final TpProtocol nxtHdr;
555 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getNextHdr");
557 nxtHdr = ipv6Classifier.getNextHdr();
560 message += " ipv6-classifier.nextHdr invalid: - " + error;
565 final PortNumber sportStart;
566 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getSrcPortStart");
568 sportStart = ipv6Classifier.getSrcPortStart();
571 message += " ipv6-classifier.srcPortStart invalid: - " + error;
575 final PortNumber sportEnd;
576 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getSrcPortEnd");
578 sportEnd = ipv6Classifier.getSrcPortEnd();
581 message += " ipv6-classifier.srcPortEnd invalid: - " + error;
585 if (sportStart != null && sportEnd != null) {
586 if (sportStart.getValue() > sportEnd.getValue()) {
587 message += " ipv6-classifier.srcPortStart greater than srcPortEnd";
591 // Destination port range
592 final PortNumber dportStart;
593 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getDstPortStart");
595 dportStart = ipv6Classifier.getDstPortStart();
598 message += " ipv6-classifier.dstPortStart invalid: - " + error;
602 final PortNumber dportEnd;
603 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getDstPortEnd");
605 dportEnd = ipv6Classifier.getDstPortEnd();
608 message += " ipv6-classifier.dstPortEnd invalid: - " + error;
612 if (dportStart != null && dportEnd != null) {
613 if (dportStart.getValue() > dportEnd.getValue()) {
614 message += " ipv6-classifier.dstPortStart greater than dstPortEnd";
620 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getTcLow");
622 tcLow = ipv6Classifier.getTcLow();
625 message += " ipv6-classifier.tc-low invalid: " + error;
629 final TosByte tcHigh;
630 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getTcHigh");
632 tcHigh = ipv6Classifier.getTcHigh();
635 message += " ipv6-classifier.tc-high invalid: " + error;
639 if (tcLow != null && tcHigh != null) {
640 if (tcLow.getValue() > tcHigh.getValue()) {
641 message += " ipv6-classifier.tc-low is greater than tc-high";
645 final TosByte tcMask;
646 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getTcMask");
648 tcMask = ipv6Classifier.getTcMask();
650 message += " ipv6-classifier.tc-mask invalid: " + error;
654 if (tcLow != null && tcHigh != null && tcMask == null) {
655 message += " ipv6-classifier.tc-mask missing;";
659 message += " ipv6-classifer must have at least one match field";
664 final Ipv6ClassifierBuilder cBuilder = new Ipv6ClassifierBuilder();
665 cBuilder.setSrcIp6(sip6);
666 cBuilder.setDstIp6(dip6);
667 cBuilder.setFlowLabel(flowLabel);
668 cBuilder.setNextHdr(nxtHdr);
669 cBuilder.setSrcPortStart(sportStart);
670 cBuilder.setSrcPortEnd(sportEnd);
671 cBuilder.setDstPortStart(dportStart);
672 cBuilder.setDstPortEnd(dportEnd);
673 cBuilder.setTcLow(tcLow);
674 cBuilder.setTcHigh(tcHigh);
675 cBuilder.setTcMask(tcMask);
676 ipv6Classifier = cBuilder.build();
677 gateBuilder.setIpv6Classifier(ipv6Classifier);
678 logger.error(message);
683 // TODO FIXME - Do we really want the gate parameter object to be muted by this method?
684 private boolean validateGate(Gate gate) {
685 // validate gate elements and null out invalid elements as we go
686 final GateBuilder gateBuilder = new GateBuilder();
688 boolean rebuild = false;
690 if (! validateGateSpec(gate, gateBuilder)) {
694 if (! validateTrafficProfile(gate, gateBuilder)) {
697 // classifiers (one of legacy classifier, ext-classifier, or ipv6 classifier
698 final Classifier classifier = gate.getClassifier();
699 final ExtClassifier extClassifier = gate.getExtClassifier();
700 final Ipv6Classifier ipv6Classifier = gate.getIpv6Classifier();
702 if (classifier != null) { count++; }
703 if (extClassifier != null) { count++; }
704 if (ipv6Classifier != null) { count++; }
706 message = " Missing classifer: must have only 1 of classifier, ext-classifier, or ipv6-classifier";
708 } else if (count > 1) {
709 message = "Multiple classifiers: must have only 1 of classifier, ext-classifier, or ipv6-classifier";
711 } else if (count == 1) {
712 if (classifier != null) {
713 // validate classifier
714 if (! validateClassifier(gate, gateBuilder)) {
717 } else if (extClassifier != null) {
718 //validate ext-classifier
719 if (! validateExtClassifier(gate, gateBuilder)) {
722 } else if (ipv6Classifier != null) {
723 // TODO FIXME - ipv6Classifier is always null???
724 // validate ipv6-classifier
725 if (! validateIpv6Classifier(gate, gateBuilder)) {
730 // rebuild the gate object with valid data and set the response
732 gateBuilder.setGateId(gate.getGateId());
733 gateBuilder.setKey(gate.getKey());
734 // TODO FIXME - the input parameter "gate" is being muted here???
735 gate = gateBuilder.build();
736 logger.error("Gate: {} - {}", gate, message);
741 private boolean validateAmId(final Ccap ccap, final CcapBuilder ccapBuilder) {
745 boolean valid = true;
746 AmId amId = ccap.getAmId();
748 message += " amId is required;";
752 error = validateMethod(AmId.class, amId, "getAmTag");
754 amTag = amId.getAmTag();
756 message += " amId.amTag missing;";
760 message += " amId.amTag invalid: " + error;
764 final Integer amType;
765 error = validateMethod(AmId.class, amId, "getAmType");
767 amType = amId.getAmType();
768 if (amType == null) {
769 message += " amId.amType missing;";
773 message += " amId.amType invalid: " + error;
778 final AmIdBuilder amIdBuilder = new AmIdBuilder();
779 amIdBuilder.setAmTag(amTag);
780 amIdBuilder.setAmType(amType);
781 amId = amIdBuilder.build();
782 ccapBuilder.setAmId(amId);
786 logger.error(message);
791 private boolean validateConnection(final Ccap ccap, final CcapBuilder ccapBuilder) {
795 boolean valid = true;
796 Connection conn = ccap.getConnection();
798 message += " connection is required;";
802 final IpAddress ipAddress;
803 error = validateMethod(Connection.class, conn, "getIpAddress");
805 ipAddress = conn.getIpAddress();
806 if (ipAddress == null) {
807 message += " connection.ipAddress missing;";
811 message += " connection.ipAddress invalid: " + error;
816 final PortNumber portNum;
817 error = validateMethod(Connection.class, conn, "getPort");
819 portNum = conn.getPort();
821 message += " connection.port invalid: " + error;
826 final ConnectionBuilder connBuilder = new ConnectionBuilder();
827 connBuilder.setIpAddress(ipAddress);
828 connBuilder.setPort(portNum);
829 conn = connBuilder.build();
830 ccapBuilder.setConnection(conn);
834 logger.error(message);
839 private boolean validateSubscriberSubnets(final Ccap ccap, final CcapBuilder ccapBuilder) {
840 // subscriber-subnets
843 boolean valid = true;
844 List<IpPrefix> subnets = null;
845 error = validateMethod(Ccap.class, ccap, "getSubscriberSubnets");
847 subnets = ccap.getSubscriberSubnets();
848 if (subnets == null) {
849 message += " subscriber-subnets is required;";
853 message += " subscriber-subnets contains invalid IpPrefix - must be <ipaddress>/<prefixlen> format;" + error;
857 // TODO FIXME - subnets is always null???
858 ccapBuilder.setSubscriberSubnets(subnets);
859 logger.error(message);
864 private boolean validateUpstreamScns(final Ccap ccap, final CcapBuilder ccapBuilder) {
868 boolean valid = true;
869 List<ServiceClassName> usScns = null;
870 error = validateMethod(Ccap.class, ccap, "getUpstreamScns");
872 usScns = ccap.getUpstreamScns();
873 if (usScns == null) {
874 message += " upstream-scns is required;";
878 message += " upstream-scns contains invalid SCN - must be 2-16 characters;" + error;
882 // TODO FIXME - usScns is always null???
883 ccapBuilder.setUpstreamScns(usScns);
884 logger.error(message);
889 private boolean validateDownstreamScns(final Ccap ccap, final CcapBuilder ccapBuilder) {
892 boolean valid = true;
893 List<ServiceClassName> dsScns = null;
894 final String error = validateMethod(Ccap.class, ccap, "getDownstreamScns");
896 dsScns = ccap.getDownstreamScns();
897 if (dsScns == null) {
898 message += " downstream-scns is required;";
902 message += " downstream-scns contains invalid SCN - must be 2-16 characters;" + error;
906 // TODO FIXME - dsScns is always null???
907 ccapBuilder.setDownstreamScns(dsScns);
908 logger.error(message);
914 // TODO FIXME - Do we really want the ccap parameter object to be muted by this method?
915 private boolean validateCcap(Ccap ccap) {
916 // validate ccap and null out invalid elements as we go
917 final CcapBuilder ccapBuilder = new CcapBuilder();
919 boolean rebuild = false;
921 if ( ! validateAmId(ccap, ccapBuilder)) {
925 if ( ! validateConnection(ccap, ccapBuilder)) {
928 // subscriber-subnets
929 if ( ! validateSubscriberSubnets(ccap, ccapBuilder)) {
933 if ( ! validateUpstreamScns(ccap, ccapBuilder)) {
937 if ( ! validateDownstreamScns(ccap, ccapBuilder)) {
940 // rebuild the ccap object with valid data and set the response
942 ccapBuilder.setCcapId(ccap.getCcapId());
943 ccapBuilder.setKey(ccap.getKey());
944 // TODO FIXME - the input parameter "ccap" is being muted here???
945 ccap = ccapBuilder.build();
946 logger.error("Ccap: {} - {} ", ccap, message);