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 org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.*;
15 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ServiceClassName;
16 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ServiceFlowDirection;
17 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.TosByte;
18 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.TpProtocol;
19 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ccap.Ccaps;
20 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ccap.CcapsBuilder;
21 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ccap.attributes.AmId;
22 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ccap.attributes.AmIdBuilder;
23 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ccap.attributes.Connection;
24 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ccap.attributes.ConnectionBuilder;
25 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.classifier.Classifier;
26 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.classifier.ClassifierBuilder;
27 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.ext.classifier.ExtClassifier;
28 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.ext.classifier.ExtClassifierBuilder;
29 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.gate.spec.GateSpec;
30 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.gate.spec.GateSpecBuilder;
31 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.gates.apps.subs.Gates;
32 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.gates.apps.subs.GatesBuilder;
33 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.ipv6.classifier.Ipv6Classifier;
34 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.ipv6.classifier.Ipv6ClassifierBuilder;
35 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.traffic.profile.TrafficProfile;
36 import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.traffic.profile.TrafficProfileBuilder;
37 import org.opendaylight.yangtools.yang.binding.DataObject;
38 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
42 import java.lang.reflect.Method;
43 import java.util.List;
45 import java.util.concurrent.ConcurrentHashMap;
46 import java.util.concurrent.ExecutorService;
47 import java.util.concurrent.Executors;
49 public class ValidateInstanceData {
51 private final static Logger logger = LoggerFactory.getLogger(ValidateInstanceData.class);
54 private final DataBroker dataBroker;
55 private final ExecutorService executor;
58 private final Map<InstanceIdentifier<Gates>, Gates> gateIidMap;
61 private transient Ccaps ccap;
62 private transient InstanceIdentifier<Ccaps> ccapIID;
64 public ValidateInstanceData(final DataBroker dataBroker, final Map<InstanceIdentifier<?>, DataObject> thisData) {
65 executor = Executors.newCachedThreadPool();
66 this.dataBroker = dataBroker;
68 // TODO FIXME - this value is always null???
72 gateIidMap = new ConcurrentHashMap<>();
74 public boolean isResponseEcho() {
75 // see if there is a response object in the updated data
76 // if so this is an echo of the response message insertion so our caller can exit right away
77 if (ccap != null && ccap.getResponse() != null) {
79 } else if (! gateIidMap.isEmpty() && gateIidMap.values().iterator().next().getResponse() != null) {
84 public boolean validateYang() {
85 final String badText = "400 Bad Request - Invalid Element Values in json object - ";
86 if (isResponseEcho()) {
87 // don't validiate the echo again
91 Response response = new Response(dataBroker, ccapIID, ccap, badText);
92 if (! validateCcap(ccap, response)) {
93 logger.error("Validate CCAP {} failed - {}", ccap.getCcapId(), response.getMessage());
94 executor.execute(response);
97 } else if (! gateIidMap.isEmpty()) {
98 for (Map.Entry<InstanceIdentifier<Gates>, Gates> entry : gateIidMap.entrySet()) {
99 InstanceIdentifier<Gates> gateIID = entry.getKey();
100 Gates gate = entry.getValue();
101 Response response = new Response(dataBroker, gateIID, gate, badText);
102 if (! validateGate(gate, response)) {
103 logger.error("Validate Gate {} failed - {}", gate.getGateId(), response.getMessage());
104 executor.execute(response);
112 private void getCcap(final Map<InstanceIdentifier<?>, DataObject> thisData) {
113 for (final Map.Entry<InstanceIdentifier<?>, DataObject> entry : thisData.entrySet()) {
114 if (entry.getValue() instanceof Ccaps) {
115 ccap = (Ccaps)entry.getValue();
116 // TODO FIXME - ClassCastException waiting to occur here!!!
117 ccapIID = (InstanceIdentifier<Ccaps>) entry.getKey();
122 private void getGates(final Map<InstanceIdentifier<?>, DataObject> thisData) {
123 for (final Map.Entry<InstanceIdentifier<?>, DataObject> entry : thisData.entrySet()) {
124 if (entry.getValue() instanceof Gates) {
125 final Gates gate = (Gates)entry.getValue();
126 // TODO FIXME - ClassCastException waiting to occur here!!!
127 final InstanceIdentifier<Gates> gateIID = (InstanceIdentifier<Gates>)entry.getKey();
128 gateIidMap.put(gateIID, gate);
132 private String validateMethod(final Class<?> thisClass, final Object thisObj, final String methodName) {
134 final Method method = thisClass.getMethod(methodName);
135 method.invoke(thisObj);
136 } catch (IllegalArgumentException e) {
137 return e.getMessage();
138 } catch (Exception e) {
140 // error = String.format("%s.%s(): Method failed: %s ", thisClass.getSimpleName(), methodName, e.getMessage());
145 private boolean validateGateSpec(final Gates gate, final GatesBuilder gateBuilder, final Response response) {
149 boolean valid = true;
150 GateSpec gateSpec = gate.getGateSpec();
151 if (gateSpec != null) {
152 final ServiceFlowDirection dir;
153 error = validateMethod(GateSpec.class, gateSpec, "getDirection");
155 dir = gateSpec.getDirection();
157 if (gate.getTrafficProfile().getServiceClassName() != null) {
158 message += " gate-spec.direction not allowed for traffic-profile.SCN;";
163 message += " gate-spec.direction invalid: must be 'us' or 'ds' -" + error;
167 final TosByte tosByte;
168 error = validateMethod(GateSpec.class, gateSpec, "getDscpTosOverwrite");
170 tosByte = gateSpec.getDscpTosOverwrite();
172 message += " gate-spec.dscp-tos-overwrite invalid: " + error;
176 final TosByte tosMask;
177 error = validateMethod(GateSpec.class, gateSpec, "getDscpTosMask");
179 tosMask = gateSpec.getDscpTosMask();
180 if (tosByte != null && tosMask == null) {
181 message += " gate-spec.dscp-tos-mask missing;";
185 message += " gate-spec.dscp-tos-mask invalid: " + error;
190 // rebuild the gateSpec with nulls replacing bad values
191 final GateSpecBuilder gateSpecBuilder = new GateSpecBuilder();
192 gateSpecBuilder.setDirection(dir);
193 gateSpecBuilder.setDscpTosOverwrite(tosByte);
194 gateSpecBuilder.setDscpTosMask(tosMask);
195 gateSpec = gateSpecBuilder.build();
197 gateBuilder.setGateSpec(gateSpec);
201 response.addMessage(message);
206 private boolean validateTrafficProfile(final Gates gate, final GatesBuilder gateBuilder, final Response response) {
209 boolean valid = true;
210 TrafficProfile profile = gate.getTrafficProfile();
211 if (profile == null) {
212 message += " traffic-profile is required;";
215 final ServiceClassName scn;
216 final String error = validateMethod(TrafficProfile.class, profile, "getServiceClassName");
218 scn = profile.getServiceClassName();
220 message += " traffic-profile.service-class-name missing;";
224 message += " traffic-profile.service-class-name invalid: must be 2-16 characters " + error;
229 final TrafficProfileBuilder profileBuilder = new TrafficProfileBuilder();
230 // TODO FIXME - scn is always null???
231 profileBuilder.setServiceClassName(scn);
232 profile = profileBuilder.build();
234 gateBuilder.setTrafficProfile(profile);
238 response.addMessage(message);
243 // TODO FIXME - Break this method apart
244 private boolean validateClassifier(final Gates gate, final GatesBuilder gateBuilder, final Response response) {
245 // validate classifier
247 boolean valid = true;
249 Classifier classifier = gate.getClassifier();
251 final Ipv4Address sip;
252 String error = validateMethod(Classifier.class, classifier, "getSrcIp");
254 sip = classifier.getSrcIp();
257 message += " classifier.srcIp invalid: - " + error;
262 final Ipv4Address dip;
263 error = validateMethod(Classifier.class, classifier, "getDstIp");
265 dip = classifier.getDstIp();
268 message += " classifier.dstIp invalid: - " + error;
273 final TpProtocol proto;
274 error = validateMethod(Classifier.class, classifier, "getProtocol");
276 proto = classifier.getProtocol();
279 message += " classifier.protocol invalid: - " + error;
284 final PortNumber sport;
285 error = validateMethod(Classifier.class, classifier, "getSrcPort");
287 sport = classifier.getSrcPort();
290 message += " classifier.srcPort invalid: - " + error;
295 final PortNumber dport;
296 error = validateMethod(Classifier.class, classifier, "getDstPort");
298 dport = classifier.getDstPort();
301 message += " classifier.dstPort invalid: - " + error;
306 final TosByte tosByte;
307 error = validateMethod(Classifier.class, classifier, "getTosByte");
309 tosByte = classifier.getTosByte();
312 message += " classifier.tosByte invalid: " + error;
316 final TosByte tosMask;
317 error = validateMethod(Classifier.class, classifier, "getTosMask");
319 tosMask = classifier.getTosMask();
320 if (tosByte != null && tosMask == null) {
321 message += " classifier.tosMask missing;";
325 message += " classifier.tosMask invalid: " + error;
330 message += " classifer must have at least one match field";
334 final ClassifierBuilder cBuilder = new ClassifierBuilder();
335 cBuilder.setSrcIp(sip);
336 cBuilder.setDstIp(dip);
337 cBuilder.setProtocol(proto);
338 cBuilder.setSrcPort(sport);
339 cBuilder.setDstPort(dport);
340 cBuilder.setTosByte(tosByte);
341 cBuilder.setTosMask(tosMask);
342 classifier = cBuilder.build();
343 gateBuilder.setClassifier(classifier);
344 response.addMessage(message);
349 // TODO FIXME - breakup this method
350 private boolean validateExtClassifier(final Gates gate, final GatesBuilder gateBuilder, final Response response) {
351 // validate ext-classifier
354 boolean valid = true;
356 ExtClassifier extClassifier = gate.getExtClassifier();
358 final Ipv4Address sip;
359 error = validateMethod(ExtClassifier.class, extClassifier, "getSrcIp");
361 sip = extClassifier.getSrcIp();
364 message += " ext-classifier.srcIp invalid: - " + error;
368 final Ipv4Address sipMask;
369 error = validateMethod(ExtClassifier.class, extClassifier, "getSrcIpMask");
371 sipMask = extClassifier.getSrcIpMask();
374 message += " ext-classifier.srcIpMask invalid: - " + error;
378 if (sip != null && sipMask == null) {
379 message += " ext-classifier.srcIpMask missing";
383 final Ipv4Address dip;
384 error = validateMethod(ExtClassifier.class, extClassifier, "getDstIp");
386 dip = extClassifier.getDstIp();
389 message += " ext-classifier.dstIp invalid: - " + error;
393 final Ipv4Address dipMask;
394 error = validateMethod(ExtClassifier.class, extClassifier, "getDstIpMask");
396 dipMask = extClassifier.getDstIpMask();
399 message += " ext-classifier.srcIpMask invalid: - " + error;
403 if (dip != null && dipMask == null) {
404 message += " ext-classifier.dstIpMask missing;";
408 final TpProtocol proto;
409 error = validateMethod(ExtClassifier.class, extClassifier, "getProtocol");
411 proto = extClassifier.getProtocol();
414 message += " ext-classifier.protocol invalid: - " + error;
419 final PortNumber sportStart;
420 error = validateMethod(ExtClassifier.class, extClassifier, "getSrcPortStart");
422 sportStart = extClassifier.getSrcPortStart();
425 message += " ext-classifier.srcPortStart invalid: - " + error;
429 final PortNumber sportEnd;
430 error = validateMethod(ExtClassifier.class, extClassifier, "getSrcPortEnd");
432 sportEnd = extClassifier.getSrcPortEnd();
435 message += " ext-classifier.srcPortEnd invalid: - " + error;
439 if (sportStart != null && sportEnd != null) {
440 if (sportStart.getValue() > sportEnd.getValue()) {
441 message += " ext-classifier.srcPortStart greater than srcPortEnd";
445 // Destination port range
446 final PortNumber dportStart;
447 error = validateMethod(ExtClassifier.class, extClassifier, "getDstPortStart");
449 dportStart = extClassifier.getDstPortStart();
452 message += " ext-classifier.dstPortStart invalid: - " + error;
456 final PortNumber dportEnd;
457 error = validateMethod(ExtClassifier.class, extClassifier, "getDstPortEnd");
459 dportEnd = extClassifier.getDstPortEnd();
462 message += " ext-classifier.dstPortEnd invalid: - " + error;
466 if (dportStart != null && dportEnd != null) {
467 if (dportStart.getValue() > dportEnd.getValue()) {
468 message += " ext-classifier.dstPortStart greater than dstPortEnd";
473 final TosByte tosByte;
474 error = validateMethod(ExtClassifier.class, extClassifier, "getTosByte");
476 tosByte = extClassifier.getTosByte();
479 message += " ext-classifier.tosByte invalid: " + error;
483 final TosByte tosMask;
484 error = validateMethod(ExtClassifier.class, extClassifier, "getTosMask");
486 tosMask = extClassifier.getTosMask();
487 if (tosByte != null && tosMask == null) {
488 message += " ext-classifier.tosMask missing;";
492 message += " ext-classifier.tosMask invalid: " + error;
497 message += " ext-classifer must have at least one match field";
501 final ExtClassifierBuilder cBuilder = new ExtClassifierBuilder();
502 cBuilder.setSrcIp(sip);
503 cBuilder.setSrcIpMask(sipMask);
504 cBuilder.setDstIp(dip);
505 cBuilder.setDstIpMask(dipMask);
506 cBuilder.setProtocol(proto);
507 cBuilder.setSrcPortStart(sportStart);
508 cBuilder.setSrcPortEnd(sportEnd);
509 cBuilder.setDstPortStart(dportStart);
510 cBuilder.setDstPortEnd(dportEnd);
511 cBuilder.setTosByte(tosByte);
512 cBuilder.setTosMask(tosMask);
513 extClassifier = cBuilder.build();
514 gateBuilder.setExtClassifier(extClassifier);
515 response.addMessage(message);
520 // TODO FIXME - break apart this method.
521 private boolean validateIpv6Classifier(final Gates gate, final GatesBuilder gateBuilder, final Response response) {
522 // validate ipv6-classifier
525 boolean valid = true;
527 Ipv6Classifier ipv6Classifier = gate.getIpv6Classifier();
528 // Source IPv6 prefix
529 final Ipv6Prefix sip6;
530 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getSrcIp6");
532 sip6 = ipv6Classifier.getSrcIp6();
535 message += " ipv6-classifier.srcIp invalid: - " + error;
539 // Destination IPv6 prefix
540 final Ipv6Prefix dip6;
541 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getDstIp6");
543 dip6 = ipv6Classifier.getDstIp6();
546 message += " ipv6-classifier.dstIp invalid: - " + error;
552 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getFlowLabel");
554 flowLabel = ipv6Classifier.getFlowLabel();
555 if (flowLabel > 1048575) {
556 message += " ipv6-classifier.flowLabel invalid: - must be 0..1048575";
563 message += " ipv6-classifier.flowLabel invalid: - " + error;
568 final TpProtocol nxtHdr;
569 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getNextHdr");
571 nxtHdr = ipv6Classifier.getNextHdr();
574 message += " ipv6-classifier.nextHdr invalid: - " + error;
579 final PortNumber sportStart;
580 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getSrcPortStart");
582 sportStart = ipv6Classifier.getSrcPortStart();
585 message += " ipv6-classifier.srcPortStart invalid: - " + error;
589 final PortNumber sportEnd;
590 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getSrcPortEnd");
592 sportEnd = ipv6Classifier.getSrcPortEnd();
595 message += " ipv6-classifier.srcPortEnd invalid: - " + error;
599 if (sportStart != null && sportEnd != null) {
600 if (sportStart.getValue() > sportEnd.getValue()) {
601 message += " ipv6-classifier.srcPortStart greater than srcPortEnd";
605 // Destination port range
606 final PortNumber dportStart;
607 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getDstPortStart");
609 dportStart = ipv6Classifier.getDstPortStart();
612 message += " ipv6-classifier.dstPortStart invalid: - " + error;
616 final PortNumber dportEnd;
617 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getDstPortEnd");
619 dportEnd = ipv6Classifier.getDstPortEnd();
622 message += " ipv6-classifier.dstPortEnd invalid: - " + error;
626 if (dportStart != null && dportEnd != null) {
627 if (dportStart.getValue() > dportEnd.getValue()) {
628 message += " ipv6-classifier.dstPortStart greater than dstPortEnd";
634 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getTcLow");
636 tcLow = ipv6Classifier.getTcLow();
639 message += " ipv6-classifier.tc-low invalid: " + error;
643 final TosByte tcHigh;
644 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getTcHigh");
646 tcHigh = ipv6Classifier.getTcHigh();
649 message += " ipv6-classifier.tc-high invalid: " + error;
653 if (tcLow != null && tcHigh != null) {
654 if (tcLow.getValue() > tcHigh.getValue()) {
655 message += " ipv6-classifier.tc-low is greater than tc-high";
659 final TosByte tcMask;
660 error = validateMethod(Ipv6Classifier.class, ipv6Classifier, "getTcMask");
662 tcMask = ipv6Classifier.getTcMask();
664 message += " ipv6-classifier.tc-mask invalid: " + error;
668 if (tcLow != null && tcHigh != null && tcMask == null) {
669 message += " ipv6-classifier.tc-mask missing;";
673 message += " ipv6-classifer must have at least one match field";
678 final Ipv6ClassifierBuilder cBuilder = new Ipv6ClassifierBuilder();
679 cBuilder.setSrcIp6(sip6);
680 cBuilder.setDstIp6(dip6);
681 cBuilder.setFlowLabel(flowLabel);
682 cBuilder.setNextHdr(nxtHdr);
683 cBuilder.setSrcPortStart(sportStart);
684 cBuilder.setSrcPortEnd(sportEnd);
685 cBuilder.setDstPortStart(dportStart);
686 cBuilder.setDstPortEnd(dportEnd);
687 cBuilder.setTcLow(tcLow);
688 cBuilder.setTcHigh(tcHigh);
689 cBuilder.setTcMask(tcMask);
690 ipv6Classifier = cBuilder.build();
691 gateBuilder.setIpv6Classifier(ipv6Classifier);
692 response.addMessage(message);
697 // TODO FIXME - Do we really want the gate parameter object to be muted by this method?
698 private boolean validateGate(Gates gate, final Response response) {
699 // validate gate elements and null out invalid elements as we go
700 final GatesBuilder gateBuilder = new GatesBuilder();
702 boolean rebuild = false;
704 if (! validateGateSpec(gate, gateBuilder, response)) {
708 if (! validateTrafficProfile(gate, gateBuilder, response)) {
711 // classifiers (one of legacy classifier, ext-classifier, or ipv6 classifier
712 final Classifier classifier = gate.getClassifier();
713 final ExtClassifier extClassifier = gate.getExtClassifier();
714 final Ipv6Classifier ipv6Classifier = gate.getIpv6Classifier();
716 if (classifier != null) { count++; }
717 if (extClassifier != null) { count++; }
718 if (ipv6Classifier != null) { count++; }
720 response.addMessage(" Missing classifer: must have only 1 of classifier, ext-classifier, or ipv6-classifier");
722 } else if (count > 1) {
723 response.addMessage(" Multiple classifiers: must have only 1 of classifier, ext-classifier, or ipv6-classifier");
725 } else if (count == 1) {
726 if (classifier != null) {
727 // validate classifier
728 if (! validateClassifier(gate, gateBuilder, response)) {
731 } else if (extClassifier != null) {
732 //validate ext-classifier
733 if (! validateExtClassifier(gate, gateBuilder, response)) {
736 } else if (ipv6Classifier != null) {
737 // TODO FIXME - ipv6Classifier is always null???
738 // validate ipv6-classifier
739 if (! validateIpv6Classifier(gate, gateBuilder, response)) {
744 // rebuild the gate object with valid data and set the response
746 gateBuilder.setGateId(gate.getGateId());
747 gateBuilder.setKey(gate.getKey());
748 // TODO FIXME - the input parameter "gate" is being muted here???
749 gate = gateBuilder.build();
750 response.setGateBase(gate);
751 response.addMessage(message);
756 private boolean validateAmId(final Ccaps ccap, final CcapsBuilder ccapBuilder, final Response response) {
760 boolean valid = true;
761 AmId amId = ccap.getAmId();
763 message += " amId is required;";
767 error = validateMethod(AmId.class, amId, "getAmTag");
769 amTag = amId.getAmTag();
771 message += " amId.amTag missing;";
775 message += " amId.amTag invalid: " + error;
779 final Integer amType;
780 error = validateMethod(AmId.class, amId, "getAmType");
782 amType = amId.getAmType();
783 if (amType == null) {
784 message += " amId.amType missing;";
788 message += " amId.amType invalid: " + error;
793 final AmIdBuilder amIdBuilder = new AmIdBuilder();
794 amIdBuilder.setAmTag(amTag);
795 amIdBuilder.setAmType(amType);
796 amId = amIdBuilder.build();
797 ccapBuilder.setAmId(amId);
801 response.addMessage(message);
806 private boolean validateConnection(final Ccaps ccap, final CcapsBuilder ccapBuilder, final Response response) {
810 boolean valid = true;
811 Connection conn = ccap.getConnection();
813 message += " connection is required;";
817 final IpAddress ipAddress;
818 error = validateMethod(Connection.class, conn, "getIpAddress");
820 ipAddress = conn.getIpAddress();
821 if (ipAddress == null) {
822 message += " connection.ipAddress missing;";
826 message += " connection.ipAddress invalid: " + error;
831 final PortNumber portNum;
832 error = validateMethod(Connection.class, conn, "getPort");
834 portNum = conn.getPort();
836 message += " connection.port invalid: " + error;
841 final ConnectionBuilder connBuilder = new ConnectionBuilder();
842 connBuilder.setIpAddress(ipAddress);
843 connBuilder.setPort(portNum);
844 conn = connBuilder.build();
845 ccapBuilder.setConnection(conn);
849 response.addMessage(message);
854 private boolean validateSubscriberSubnets(final Ccaps ccap, final CcapsBuilder ccapBuilder,
855 final Response response) {
856 // subscriber-subnets
859 boolean valid = true;
860 List<IpPrefix> subnets = null;
861 error = validateMethod(Ccaps.class, ccap, "getSubscriberSubnets");
863 subnets = ccap.getSubscriberSubnets();
864 if (subnets == null) {
865 message += " subscriber-subnets is required;";
869 message += " subscriber-subnets contains invalid IpPrefix - must be <ipaddress>/<prefixlen> format;" + error;
873 // TODO FIXME - subnets is always null???
874 ccapBuilder.setSubscriberSubnets(subnets);
875 response.addMessage(message);
880 private boolean validateUpstreamScns(final Ccaps ccap, final CcapsBuilder ccapBuilder, final Response response) {
884 boolean valid = true;
885 List<ServiceClassName> usScns = null;
886 error = validateMethod(Ccaps.class, ccap, "getUpstreamScns");
888 usScns = ccap.getUpstreamScns();
889 if (usScns == null) {
890 message += " upstream-scns is required;";
894 message += " upstream-scns contains invalid SCN - must be 2-16 characters;" + error;
898 // TODO FIXME - usScns is always null???
899 ccapBuilder.setUpstreamScns(usScns);
900 response.addMessage(message);
905 private boolean validateDownstreamScns(final Ccaps ccap, final CcapsBuilder ccapBuilder, final Response response) {
908 boolean valid = true;
909 List<ServiceClassName> dsScns = null;
910 final String error = validateMethod(Ccaps.class, ccap, "getDownstreamScns");
912 dsScns = ccap.getDownstreamScns();
913 if (dsScns == null) {
914 message += " downstream-scns is required;";
918 message += " downstream-scns contains invalid SCN - must be 2-16 characters;" + error;
922 // TODO FIXME - dsScns is always null???
923 ccapBuilder.setDownstreamScns(dsScns);
924 response.addMessage(message);
930 // TODO FIXME - Do we really want the ccap parameter object to be muted by this method?
931 private boolean validateCcap(Ccaps ccap, final Response response) {
932 // validate ccap and null out invalid elements as we go
933 final CcapsBuilder ccapBuilder = new CcapsBuilder();
935 boolean rebuild = false;
937 if ( ! validateAmId(ccap, ccapBuilder, response)) {
941 if ( ! validateConnection(ccap, ccapBuilder, response)) {
944 // subscriber-subnets
945 if ( ! validateSubscriberSubnets(ccap, ccapBuilder, response)) {
949 if ( ! validateUpstreamScns(ccap, ccapBuilder, response)) {
953 if ( ! validateDownstreamScns(ccap, ccapBuilder, response)) {
956 // rebuild the ccap object with valid data and set the response
958 ccapBuilder.setCcapId(ccap.getCcapId());
959 ccapBuilder.setKey(ccap.getKey());
960 // TODO FIXME - the input parameter "ccap" is being muted here???
961 ccap = ccapBuilder.build();
962 response.setCcapBase(ccap);
963 response.addMessage(message);