Rework parser infrastructure to support partial message processing
[bgpcep.git] / pcep / impl / src / main / java / org / opendaylight / protocol / pcep / impl / object / PCEPRequestParameterObjectParser.java
index acc5b1eecde4ea8f37b204dae0a7ef073331d4c4..66d97e24f4384060986d661bd3ce489329c58f49 100644 (file)
@@ -12,26 +12,21 @@ import java.util.Arrays;
 import java.util.BitSet;
 
 import org.opendaylight.protocol.pcep.PCEPDeserializerException;
-import org.opendaylight.protocol.pcep.PCEPDocumentedException;
-import org.opendaylight.protocol.pcep.impl.Util;
-import org.opendaylight.protocol.pcep.spi.AbstractObjectWithTlvsParser;
 import org.opendaylight.protocol.pcep.spi.TlvHandlerRegistry;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ObjectHeader;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OrderTlv;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.RequestId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.RpObject;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Tlv;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.requests.RpBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.Tlvs;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.TlvsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.tlvs.OrderBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.order.tlv.Order;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.Rp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.RpBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.rp.Tlvs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.rp.TlvsBuilder;
 
 /**
- * Parser for {@link RpObject}
+ * Parser for {@link Rp}
  */
-
 public class PCEPRequestParameterObjectParser extends AbstractObjectWithTlvsParser<RpBuilder> {
 
        public static final int CLASS = 2;
@@ -41,29 +36,28 @@ public class PCEPRequestParameterObjectParser extends AbstractObjectWithTlvsPars
        /*
         * lengths of fields in bytes
         */
-       public static final int FLAGS_PRI_MF_LENGTH = 4; // multi-field
-       public static final int RID_F_LENGTH = 4;
+       private static final int FLAGS_PRI_MF_LENGTH = 4;
+       private static final int RID_F_LENGTH = 4;
 
        /*
         * lengths of subfields inside multi-field in bits
         */
-       public static final int FLAGS_SF_LENGTH = 29;
-       public static final int PRI_SF_LENGTH = 3;
+       private static final int FLAGS_SF_LENGTH = 29;
 
        /*
         * offsets of field in bytes
         */
 
-       public static final int FLAGS_PRI_MF_OFFSET = 0;
-       public static final int RID_F_OFFSET = FLAGS_PRI_MF_OFFSET + FLAGS_PRI_MF_LENGTH;
-       public static final int TLVS_OFFSET = RID_F_OFFSET + RID_F_LENGTH;
+       private static final int FLAGS_PRI_MF_OFFSET = 0;
+       private static final int RID_F_OFFSET = FLAGS_PRI_MF_OFFSET + FLAGS_PRI_MF_LENGTH;
+       private static final int TLVS_OFFSET = RID_F_OFFSET + RID_F_LENGTH;
 
        /*
         * offsets of subfields inside multi-field in bits
         */
 
-       public static final int FLAGS_SF_OFFSET = 0;
-       public static final int PRI_SF_OFFSET = FLAGS_SF_OFFSET + FLAGS_SF_LENGTH;
+       private static final int FLAGS_SF_OFFSET = 0;
+       private static final int PRI_SF_OFFSET = FLAGS_SF_OFFSET + FLAGS_SF_LENGTH;
 
        /*
         * flags offsets inside flags sub-field in bits
@@ -83,23 +77,22 @@ public class PCEPRequestParameterObjectParser extends AbstractObjectWithTlvsPars
         * OF extension flags offsets inside flags sub.field in bits
         */
 
-       private static int S_FLAG_OFFSET = 24; // Supply OF on response
-
+       private static final int S_FLAG_OFFSET = 24;
        /*
         * RFC6006 flags
         */
-       private static int F_FLAG_OFFSET = 18;
+       private static final int F_FLAG_OFFSET = 18;
 
-       private static int N_FLAG_OFFSET = 19;
+       private static final int N_FLAG_OFFSET = 19;
 
-       private static int E_FLAG_OFFSET = 20;
+       private static final int E_FLAG_OFFSET = 20;
 
        public PCEPRequestParameterObjectParser(final TlvHandlerRegistry tlvReg) {
                super(tlvReg);
        }
 
        @Override
-       public RpObject parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException, PCEPDocumentedException {
+       public Rp parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException {
                if (bytes == null || bytes.length == 0) {
                        throw new IllegalArgumentException("Array of bytes is mandatory. Can't be null or empty.");
                }
@@ -112,86 +105,80 @@ public class PCEPRequestParameterObjectParser extends AbstractObjectWithTlvsPars
                priority |= (flags.get(PRI_SF_OFFSET) ? 1 : 0) << 2;
 
                final RpBuilder builder = new RpBuilder();
+               builder.setIgnore(header.isIgnore());
 
-               parseTlvs(builder, ByteArray.cutBytes(bytes, TLVS_OFFSET));
+               //FIXME : change binary files
+               //if (!header.isProcessingRule()) {
+               //LOG.debug("Processed bit not set on RP OBJECT, ignoring it");
+               //      return null;
+               //}
 
-               builder.setIgnore(header.isIgnore());
                builder.setProcessingRule(header.isProcessingRule());
 
-               builder.setBiDirectional(flags.get(B_FLAG_OFFSET));
-               builder.setEroCompression(flags.get(E_FLAG_OFFSET));
+               builder.setPriority(priority);
                builder.setFragmentation(flags.get(F_FLAG_OFFSET));
-               builder.setLoose(flags.get(O_FLAG_OFFSET));
+               builder.setP2mp(flags.get(N_FLAG_OFFSET));
+               builder.setEroCompression(flags.get(E_FLAG_OFFSET));
                builder.setMakeBeforeBreak(flags.get(M_FLAG_OFFSET));
                builder.setOrder(flags.get(D_FLAG_OFFSET));
-               builder.setP2mp(flags.get(N_FLAG_OFFSET));
-               builder.setReoptimization(flags.get(R_FLAG_OFFSET));
                builder.setSupplyOf(flags.get(S_FLAG_OFFSET));
-               builder.setPriority(priority);
-               builder.setRequestId(new RequestId(ByteArray.bytesToLong(Arrays.copyOfRange(bytes, RID_F_OFFSET, RID_F_OFFSET + RID_F_LENGTH))));
+               builder.setLoose(flags.get(O_FLAG_OFFSET));
+               builder.setBiDirectional(flags.get(B_FLAG_OFFSET));
+               builder.setReoptimization(flags.get(R_FLAG_OFFSET));
 
+               builder.setRequestId(new RequestId(ByteArray.bytesToLong(Arrays.copyOfRange(bytes, RID_F_OFFSET, RID_F_OFFSET + RID_F_LENGTH))));
+               parseTlvs(builder, ByteArray.cutBytes(bytes, TLVS_OFFSET));
                return builder.build();
        }
 
        @Override
        public void addTlv(final RpBuilder builder, final Tlv tlv) {
-               final TlvsBuilder tbuilder = new TlvsBuilder();
-               if (tlv instanceof OrderTlv) {
-                       final OrderBuilder b = new OrderBuilder();
-                       b.setDelete(((OrderTlv) tlv).getDelete());
-                       b.setSetup(((OrderTlv) tlv).getSetup());
-                       tbuilder.setOrder(b.build());
+               if (tlv instanceof Order) {
+                       builder.setTlvs(new TlvsBuilder().setOrder((Order) tlv).build());
                }
-               builder.setTlvs(tbuilder.build());
        }
 
        @Override
        public byte[] serializeObject(final Object object) {
-               if (!(object instanceof RpObject)) {
+               if (!(object instanceof Rp)) {
                        throw new IllegalArgumentException("Wrong instance of PCEPObject. Passed " + object.getClass() + ". Needed RpObject.");
                }
-
-               final RpObject rPObj = (RpObject) object;
-
-               final BitSet flags_priority = new BitSet(FLAGS_PRI_MF_LENGTH * Byte.SIZE);
-
-               flags_priority.set(R_FLAG_OFFSET, rPObj.isReoptimization());
-               flags_priority.set(B_FLAG_OFFSET, rPObj.isBiDirectional());
-               flags_priority.set(O_FLAG_OFFSET, rPObj.isLoose());
-               flags_priority.set(M_FLAG_OFFSET, rPObj.isMakeBeforeBreak());
-               flags_priority.set(D_FLAG_OFFSET, rPObj.isOrder());
-               flags_priority.set(S_FLAG_OFFSET, rPObj.isSupplyOf());
-               flags_priority.set(F_FLAG_OFFSET, rPObj.isFragmentation());
-               flags_priority.set(N_FLAG_OFFSET, rPObj.isP2mp());
-               flags_priority.set(E_FLAG_OFFSET, rPObj.isEroCompression());
-
-               flags_priority.set(PRI_SF_OFFSET, (rPObj.getPriority() & 1 << 2) != 0);
-               flags_priority.set(PRI_SF_OFFSET + 1, (rPObj.getPriority() & 1 << 1) != 0);
-               flags_priority.set(PRI_SF_OFFSET + 2, (rPObj.getPriority() & 1) != 0);
+               final Rp rPObj = (Rp) object;
+               final BitSet flags = new BitSet(FLAGS_PRI_MF_LENGTH * Byte.SIZE);
+
+               flags.set(R_FLAG_OFFSET, rPObj.isReoptimization());
+               flags.set(B_FLAG_OFFSET, rPObj.isBiDirectional());
+               flags.set(O_FLAG_OFFSET, rPObj.isLoose());
+               flags.set(M_FLAG_OFFSET, rPObj.isMakeBeforeBreak());
+               flags.set(D_FLAG_OFFSET, rPObj.isOrder());
+               flags.set(S_FLAG_OFFSET, rPObj.isSupplyOf());
+               flags.set(F_FLAG_OFFSET, rPObj.isFragmentation());
+               flags.set(N_FLAG_OFFSET, rPObj.isP2mp());
+               flags.set(E_FLAG_OFFSET, rPObj.isEroCompression());
+
+               flags.set(PRI_SF_OFFSET, (rPObj.getPriority() & 1 << 2) != 0);
+               flags.set(PRI_SF_OFFSET + 1, (rPObj.getPriority() & 1 << 1) != 0);
+               flags.set(PRI_SF_OFFSET + 2, (rPObj.getPriority() & 1) != 0);
 
                final byte[] tlvs = serializeTlvs(rPObj.getTlvs());
-               int tlvsLength = 0;
-               if (tlvs != null) {
-                       tlvsLength = tlvs.length;
-               }
-               final byte[] retBytes = new byte[TLVS_OFFSET + tlvsLength + Util.getPadding(TLVS_OFFSET + tlvs.length, PADDED_TO)];
-
-               if (tlvs != null) {
-                       ByteArray.copyWhole(tlvs, retBytes, TLVS_OFFSET);
-               }
+               final byte[] retBytes = new byte[TLVS_OFFSET + tlvs.length + getPadding(TLVS_OFFSET + tlvs.length, PADDED_TO)];
 
-               ByteArray.copyWhole(ByteArray.bitSetToBytes(flags_priority, FLAGS_PRI_MF_LENGTH), retBytes, FLAGS_PRI_MF_OFFSET);
+               ByteArray.copyWhole(ByteArray.bitSetToBytes(flags, FLAGS_PRI_MF_LENGTH), retBytes, FLAGS_PRI_MF_OFFSET);
                ByteArray.copyWhole(ByteArray.subByte(ByteArray.longToBytes(rPObj.getRequestId().getValue()), (Long.SIZE / Byte.SIZE)
                                - RID_F_LENGTH, RID_F_LENGTH), retBytes, RID_F_OFFSET);
-
+               if (tlvs.length != 0) {
+                       ByteArray.copyWhole(tlvs, retBytes, TLVS_OFFSET);
+               }
                return retBytes;
        }
 
        public byte[] serializeTlvs(final Tlvs tlvs) {
-               if (tlvs.getOrder() != null) {
-                       return serializeTlv(new OrderBuilder().setDelete(tlvs.getOrder().getDelete()).setSetup(tlvs.getOrder().getSetup()).build());
+               if (tlvs == null) {
+                       return new byte[0];
+               } else if (tlvs.getOrder() != null) {
+                       return serializeTlv(tlvs.getOrder());
                }
-               return null;
+               return new byte[0];
        }
 
        @Override