Complexity issue: pcep.ietf.stateful07
[bgpcep.git] / pcep / ietf-stateful07 / src / main / java / org / opendaylight / protocol / pcep / ietf / initiated00 / CInitiated00PCInitiateMessageParser.java
index 89955ad4718ff2633abea14002817842c92b6890..74e644a934af731bca8d00686e51c95a302ec861 100644 (file)
@@ -7,20 +7,17 @@
  */
 package org.opendaylight.protocol.pcep.ietf.initiated00;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
-
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
-
 import java.util.List;
-
 import org.opendaylight.protocol.pcep.spi.AbstractMessageParser;
 import org.opendaylight.protocol.pcep.spi.MessageUtil;
 import org.opendaylight.protocol.pcep.spi.ObjectRegistry;
 import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Pcinitiate;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.PcinitiateBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.PcinitiateMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.pcinitiate.message.PcinitiateMessageBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.pcinitiate.message.pcinitiate.message.Requests;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.pcinitiate.message.pcinitiate.message.RequestsBuilder;
@@ -40,7 +37,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 /**
  * Parser for {@link Pcinitiate}
  */
-public final class CInitiated00PCInitiateMessageParser extends AbstractMessageParser {
+public class CInitiated00PCInitiateMessageParser extends AbstractMessageParser {
 
     public static final int TYPE = 12;
 
@@ -50,39 +47,30 @@ public final class CInitiated00PCInitiateMessageParser extends AbstractMessagePa
 
     @Override
     public void serializeMessage(final Message message, final ByteBuf out) {
-        if (!(message instanceof PcinitiateMessage)) {
-            throw new IllegalArgumentException("Wrong instance of Message. Passed instance of " + message.getClass()
-                    + ". Needed PcinitiateMessage.");
-        }
+        Preconditions.checkArgument(message instanceof Pcinitiate, "Wrong instance of Message. Passed instance of %s. Need PcinitiateMessage.", message.getClass());
         final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.pcinitiate.message.PcinitiateMessage init = ((Pcinitiate) message).getPcinitiateMessage();
-        ByteBuf buffer = Unpooled.buffer();
+        final ByteBuf buffer = Unpooled.buffer();
         for (final Requests req : init.getRequests()) {
-            buffer.writeBytes(serializeObject(req.getSrp()));
-            buffer.writeBytes(serializeObject(req.getLsp()));
-            if (req.getEndpointsObj() != null) {
-                buffer.writeBytes(serializeObject(req.getEndpointsObj()));
-            }
-            if (req.getEro() != null) {
-                buffer.writeBytes(serializeObject(req.getEro()));
-            }
-            if (req.getLspa() != null) {
-                buffer.writeBytes(serializeObject(req.getLspa()));
-            }
-            if (req.getBandwidth() != null) {
-                buffer.writeBytes(serializeObject(req.getBandwidth()));
-            }
-            if (req.getMetrics() != null && !req.getMetrics().isEmpty()) {
-                for (final Metrics m : req.getMetrics()) {
-                    buffer.writeBytes(serializeObject(m.getMetric()));
-                }
-            }
-            if (req.getIro() != null) {
-                buffer.writeBytes(serializeObject(req.getIro()));
-            }
+            serializeRequest(req, buffer);
         }
         MessageUtil.formatMessage(TYPE, buffer, out);
     }
 
+    protected void serializeRequest(final Requests req, final ByteBuf buffer) {
+        serializeObject(req.getSrp(), buffer);
+        serializeObject(req.getLsp(), buffer);
+        serializeObject(req.getEndpointsObj(), buffer);
+        serializeObject(req.getEro(), buffer);
+        serializeObject(req.getLspa(), buffer);
+        serializeObject(req.getBandwidth(), buffer);
+        if (req.getMetrics() != null) {
+            for (final Metrics m : req.getMetrics()) {
+                serializeObject(m.getMetric(), buffer);
+            }
+        }
+        serializeObject(req.getIro(), buffer);
+    }
+
     @Override
     protected Message validate(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException {
         if (objects == null) {
@@ -90,19 +78,14 @@ public final class CInitiated00PCInitiateMessageParser extends AbstractMessagePa
         }
         final PcinitiateMessageBuilder builder = new PcinitiateMessageBuilder();
         final List<Requests> reqs = Lists.newArrayList();
-        Requests req = null;
         while (!objects.isEmpty()) {
-            req = this.getValidRequest(objects);
-            if (req == null) {
-                break;
-            }
-            reqs.add(req);
+            reqs.add(this.getValidRequest(objects));
         }
         builder.setRequests(reqs);
         return new PcinitiateBuilder().setPcinitiateMessage(builder.build()).build();
     }
 
-    private Requests getValidRequest(final List<Object> objects) {
+    protected Requests getValidRequest(final List<Object> objects) {
         final RequestsBuilder builder = new RequestsBuilder();
         builder.setSrp((Srp) objects.get(0));
         objects.remove(0);
@@ -113,55 +96,11 @@ public final class CInitiated00PCInitiateMessageParser extends AbstractMessagePa
         final List<Metrics> metrics = Lists.newArrayList();
 
         Object obj;
-        State state = State.Init;
-        while (!objects.isEmpty() && !state.equals(State.End)) {
+        State state = State.INIT;
+        while (!objects.isEmpty() && !state.equals(State.END)) {
             obj = objects.get(0);
-
-            switch (state) {
-            case Init:
-                state = State.EndpointsIn;
-                if (obj instanceof EndpointsObj) {
-                    builder.setEndpointsObj((EndpointsObj) obj);
-                    break;
-                }
-            case EndpointsIn:
-                state = State.EroIn;
-                if (obj instanceof Ero) {
-                    builder.setEro((Ero) obj);
-                    break;
-                }
-            case EroIn:
-                state = State.LspaIn;
-                if (obj instanceof Lspa) {
-                    builder.setLspa((Lspa) obj);
-                    break;
-                }
-            case LspaIn:
-                state = State.BandwidthIn;
-                if (obj instanceof Bandwidth) {
-                    builder.setBandwidth((Bandwidth) obj);
-                    break;
-                }
-            case BandwidthIn:
-                state = State.MetricIn;
-                if (obj instanceof Metric) {
-                    metrics.add(new MetricsBuilder().setMetric((Metric) obj).build());
-                    state = State.BandwidthIn;
-                    break;
-                }
-            case MetricIn:
-                state = State.IroIn;
-                if (obj instanceof Iro) {
-                    builder.setIro((Iro) obj);
-                    break;
-                }
-            case IroIn:
-                state = State.End;
-                break;
-            case End:
-                break;
-            }
-            if (!state.equals(State.End)) {
+            state = insertObject(state, obj, builder, metrics);
+            if (!state.equals(State.END)) {
                 objects.remove(0);
             }
         }
@@ -169,7 +108,47 @@ public final class CInitiated00PCInitiateMessageParser extends AbstractMessagePa
         return builder.build();
     }
 
+    private State insertObject(final State state, final Object obj, final RequestsBuilder builder, final List<Metrics> metrics) {
+        switch (state) {
+        case INIT:
+            if (obj instanceof EndpointsObj) {
+                builder.setEndpointsObj((EndpointsObj) obj);
+                return State.ENDPOINTS_IN;
+            }
+        case ENDPOINTS_IN:
+            if (obj instanceof Ero) {
+                builder.setEro((Ero) obj);
+                return State.ERO_IN;
+            }
+        case ERO_IN:
+            if (obj instanceof Lspa) {
+                builder.setLspa((Lspa) obj);
+                return State.LSPA_IN;
+            }
+        case LSPA_IN:
+            if (obj instanceof Bandwidth) {
+                builder.setBandwidth((Bandwidth) obj);
+                return State.BANDWIDTH_IN;
+            }
+        case BANDWIDTH_IN:
+            if (obj instanceof Metric) {
+                metrics.add(new MetricsBuilder().setMetric((Metric) obj).build());
+                return State.BANDWIDTH_IN;
+            }
+        case METRIC_IN:
+            if (obj instanceof Iro) {
+                builder.setIro((Iro) obj);
+                return State.IRO_IN;
+            }
+        case IRO_IN:
+        case END:
+            return State.END;
+        default:
+            return state;
+        }
+    }
+
     private enum State {
-        Init, EndpointsIn, EroIn, LspaIn, BandwidthIn, MetricIn, IroIn, End
+        INIT, ENDPOINTS_IN, ERO_IN, LSPA_IN, BANDWIDTH_IN, METRIC_IN, IRO_IN, END
     }
 }