Rework parser infrastructure to support partial message processing 15/2915/1
authorRobert Varga <rovarga@cisco.com>
Wed, 20 Nov 2013 15:19:17 +0000 (16:19 +0100)
committerRobert Varga <rovarga@cisco.com>
Wed, 20 Nov 2013 15:19:17 +0000 (16:19 +0100)
Change-Id: Iebb10ef8b3b90c99d12bd0ea71aaa81e95e8c3e8
Signed-off-by: Robert Varga <rovarga@cisco.com>
21 files changed:
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/PCEPMessageFactory.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/AbstractMessageParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPCloseMessageParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPErrorMessageParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPKeepAliveMessageParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPNotificationMessageParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPOpenMessageParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPReplyMessageParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPReportMessageParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPRequestMessageParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPUpdateRequestMessageParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PcinitiateMessageParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPClassTypeObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPEndPointsObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPOpenObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPRequestParameterObjectParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPSrpObjectParser.java
pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/PCEPValidatorTest.java
pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/MessageParser.java
pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/ObjectParser.java
pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/pojo/SimpleObjectHandlerRegistry.java

index d348d72ba85fede7ef20197c752634059ea90315..627b1673602c291a128cd1bf338f2ce4a8bfaae3 100644 (file)
@@ -10,11 +10,13 @@ package org.opendaylight.protocol.pcep.impl;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.UnpooledByteBufAllocator;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.opendaylight.protocol.framework.DeserializerException;
 import org.opendaylight.protocol.framework.DocumentedException;
 import org.opendaylight.protocol.framework.ProtocolMessageFactory;
 import org.opendaylight.protocol.pcep.PCEPDeserializerException;
-import org.opendaylight.protocol.pcep.PCEPDocumentedException;
 import org.opendaylight.protocol.pcep.spi.MessageHandlerRegistry;
 import org.opendaylight.protocol.pcep.spi.MessageSerializer;
 import org.opendaylight.protocol.util.ByteArray;
@@ -77,17 +79,20 @@ public final class PCEPMessageFactory implements ProtocolMessageFactory<Message>
                                        + (msgLength - COMMON_HEADER_LENGTH));
                }
 
+               final List<Message> errors = new ArrayList<>();
                Message msg = null;
 
                try {
-                       msg = this.registry.getMessageParser(type).parseMessage(msgBody);
+                       msg = this.registry.getMessageParser(type).parseMessage(msgBody, errors);
                } catch (final PCEPDeserializerException e) {
                        logger.debug("Unexpected deserializer problem", e);
                        throw new DeserializerException(e.getMessage(), e);
-               } catch (final PCEPDocumentedException e) {
-                       logger.debug("Documented deserializer problem", e);
-                       throw new DocumentedException(e.getMessage(), e);
                }
+
+               if (!errors.isEmpty()) {
+                       // FIXME: we have a bunch of error messages, how can we send them back?
+               }
+
                logger.debug("Message was parsed. {}", msg);
                return msg;
        }
index 66dd3fcf8e9020433467cdb3159f341045d1afd6..83504e04367e4c141869937bdb5cb67b046098aa 100644 (file)
@@ -8,7 +8,6 @@ import org.opendaylight.protocol.pcep.PCEPDeserializerException;
 import org.opendaylight.protocol.pcep.PCEPDocumentedException;
 import org.opendaylight.protocol.pcep.PCEPErrorMapping;
 import org.opendaylight.protocol.pcep.PCEPErrors;
-import org.opendaylight.protocol.pcep.UnknownObject;
 import org.opendaylight.protocol.pcep.spi.MessageParser;
 import org.opendaylight.protocol.pcep.spi.MessageSerializer;
 import org.opendaylight.protocol.pcep.spi.ObjectHandlerRegistry;
@@ -17,18 +16,22 @@ import org.opendaylight.protocol.pcep.spi.ObjectParser;
 import org.opendaylight.protocol.pcep.spi.ObjectSerializer;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.PcerrBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
 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.PcerrMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcep.error.object.ErrorObjectBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.PcerrMessageBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.ErrorsBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 import com.google.common.primitives.UnsignedBytes;
 
 public abstract class AbstractMessageParser implements MessageParser, MessageSerializer {
+       private static final Logger LOG = LoggerFactory.getLogger(AbstractMessageParser.class);
 
        private static final int COMMON_OBJECT_HEADER_LENGTH = 4;
 
@@ -92,7 +95,7 @@ public abstract class AbstractMessageParser implements MessageParser, MessageSer
                return retBytes;
        }
 
-       protected List<Object> parseObjects(final byte[] bytes) throws PCEPDeserializerException, PCEPDocumentedException {
+       protected final List<Object> parseObjects(final byte[] bytes) throws PCEPDeserializerException {
                int offset = 0;
                final List<Object> objs = Lists.newArrayList();
                while (bytes.length - offset > 0) {
@@ -127,25 +130,20 @@ public abstract class AbstractMessageParser implements MessageParser, MessageSer
 
                        offset += objLength - COMMON_OBJECT_HEADER_LENGTH;
 
-                       final ObjectParser parser = this.registry.getObjectParser(objClass, objType);
-
+                       final ObjectParser parser = Preconditions.checkNotNull(this.registry.getObjectParser(objClass, objType));
                        final ObjectHeader header = new ObjectHeaderImpl(flags.get(P_FLAG_OFFSET), flags.get(I_FLAG_OFFSET));
 
-                       try {
-                               objs.add(parser.parseObject(header, bytesToPass));
-                       } catch (final PCEPDocumentedException e) {
-                               if (e.getError() == PCEPErrors.UNRECOGNIZED_OBJ_CLASS | e.getError() == PCEPErrors.UNRECOGNIZED_OBJ_TYPE
-                                               | e.getError() == PCEPErrors.NOT_SUPPORTED_OBJ_CLASS | e.getError() == PCEPErrors.NOT_SUPPORTED_OBJ_TYPE) {
-                                       objs.add(new UnknownObject(e.getError()));
-                               } else {
-                                       throw e;
-                               }
+                       // parseObject is required to return null for P=0 errored objects
+                       final Object o = parser.parseObject(header, bytesToPass);
+                       if (o != null) {
+                               objs.add(o);
                        }
                }
+
                return objs;
        }
 
-       protected PcerrMessage createErrorMsg(final PCEPErrors e) {
+       public static PcerrMessage createErrorMsg(final PCEPErrors e) {
                final PCEPErrorMapping maping = PCEPErrorMapping.getInstance();
                return new PcerrBuilder().setPcerrMessage(
                                new PcerrMessageBuilder().setErrors(
@@ -153,4 +151,24 @@ public abstract class AbstractMessageParser implements MessageParser, MessageSer
                                                                new ErrorObjectBuilder().setType(maping.getFromErrorsEnum(e).type).setValue(
                                                                                maping.getFromErrorsEnum(e).value).build()).build())).build()).build();
        }
+
+       // FIXME: remove PCEPDocumentedException
+       abstract protected Message validate(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException, PCEPDocumentedException;
+
+       @Override
+       public final Message parseMessage(final byte[] buffer, final List<Message> errors) throws PCEPDeserializerException {
+               Preconditions.checkNotNull(buffer, "Buffer may not be null");
+
+               // Parse objects first
+               final List<Object> objs = parseObjects(buffer);
+
+               // Run validation
+               try {
+                       return validate(objs, errors);
+               } catch (PCEPDocumentedException e) {
+                       LOG.info("Message failed to validate", e);
+                       errors.add(createErrorMsg(e.getError()));
+                       return null;
+               }
+       }
 }
index d4cd1818723374cd3279ba830ab69f880b755865..1a166cd4e70a49ee6193b479d9d9a4771a641c8c 100644 (file)
@@ -12,7 +12,6 @@ import io.netty.buffer.ByteBuf;
 import java.util.List;
 
 import org.opendaylight.protocol.pcep.PCEPDeserializerException;
-import org.opendaylight.protocol.pcep.PCEPDocumentedException;
 import org.opendaylight.protocol.pcep.spi.ObjectHandlerRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Close;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.CloseBuilder;
@@ -49,15 +48,7 @@ public class PCEPCloseMessageParser extends AbstractMessageParser {
        }
 
        @Override
-       public CloseMessage parseMessage(final byte[] buffer) throws PCEPDeserializerException, PCEPDocumentedException {
-               if (buffer == null || buffer.length == 0) {
-                       throw new PCEPDeserializerException("Close message doesn't contain CLOSE object.");
-               }
-               final List<Object> objs = parseObjects(buffer);
-               return validate(objs);
-       }
-
-       private Close validate(final List<Object> objects) throws PCEPDeserializerException {
+       protected Close validate(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException {
                if (objects == null) {
                        throw new IllegalArgumentException("Passed list can't be null.");
                }
index 3091a9c7a841021f2e2aa10d2e884c3f95435f35..94f908815b7bccba41473ece48f6435c6af54b31 100644 (file)
@@ -9,12 +9,10 @@ package org.opendaylight.protocol.pcep.impl.message;
 
 import io.netty.buffer.ByteBuf;
 
-import java.util.Arrays;
 import java.util.List;
 
 import org.opendaylight.protocol.pcep.PCEPDeserializerException;
 import org.opendaylight.protocol.pcep.PCEPDocumentedException;
-import org.opendaylight.protocol.pcep.PCEPErrorMapping;
 import org.opendaylight.protocol.pcep.PCEPErrors;
 import org.opendaylight.protocol.pcep.UnknownObject;
 import org.opendaylight.protocol.pcep.spi.ObjectHandlerRegistry;
@@ -24,7 +22,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.PcerrMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcep.error.object.ErrorObject;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcep.error.object.ErrorObjectBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.PcerrMessageBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.Errors;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.ErrorsBuilder;
@@ -78,30 +75,15 @@ public class PCEPErrorMessageParser extends AbstractMessageParser {
        }
 
        @Override
-       public Message parseMessage(final byte[] buffer) throws PCEPDeserializerException, PCEPDocumentedException {
-               if (buffer == null || buffer.length == 0) {
-                       throw new PCEPDeserializerException("Error message is empty.");
-               }
-               final List<Object> objs = parseObjects(buffer);
-               PcerrMessage m = null;
-               try {
-                       m = validate(objs);
-               } catch (final PCEPDocumentedException e) {
-                       final PCEPErrorMapping maping = PCEPErrorMapping.getInstance();
-                       return new PcerrBuilder().setPcerrMessage(
-                                       new PcerrMessageBuilder().setErrors(
-                                                       Arrays.asList(new ErrorsBuilder().setErrorObject(
-                                                                       new ErrorObjectBuilder().setType(maping.getFromErrorsEnum(e.getError()).type).setValue(
-                                                                                       maping.getFromErrorsEnum(e.getError()).value).build()).build())).build()).build();
-               }
-               return m;
-       }
-
-       private PcerrMessage validate(final List<Object> objects) throws PCEPDeserializerException, PCEPDocumentedException {
+       protected PcerrMessage validate(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException, PCEPDocumentedException {
                if (objects == null) {
                        throw new IllegalArgumentException("Passed list can't be null.");
                }
 
+               if (objects.isEmpty()) {
+                       throw new PCEPDeserializerException("Error message is empty.");
+               }
+
                final List<Rps> requestParameters = Lists.newArrayList();
                final List<Errors> errorObjects = Lists.newArrayList();
                final PcerrMessageBuilder b = new PcerrMessageBuilder();
index accfb46d19b6b525b04dcc6fe85bd91ad55a8814..6c8e6dc6cc7bb57c10e7063f0ecf3af18dbfb553 100644 (file)
@@ -9,17 +9,21 @@ package org.opendaylight.protocol.pcep.impl.message;
 
 import io.netty.buffer.ByteBuf;
 
+import java.util.List;
+
+import org.opendaylight.protocol.pcep.PCEPDeserializerException;
 import org.opendaylight.protocol.pcep.spi.ObjectHandlerRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.KeepaliveBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.KeepaliveMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
+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.keepalive.message.KeepaliveMessageBuilder;
 
 /**
  * Parser for {@link KeepaliveMessage}
  */
 public class PCEPKeepAliveMessageParser extends AbstractMessageParser {
-
+       private static final KeepaliveMessage MESSAGE = new KeepaliveBuilder().setKeepaliveMessage(new KeepaliveMessageBuilder().build()).build();
        public static final int TYPE = 2;
 
        public PCEPKeepAliveMessageParser(final ObjectHandlerRegistry registry) {
@@ -30,18 +34,20 @@ public class PCEPKeepAliveMessageParser extends AbstractMessageParser {
        public void serializeMessage(final Message message, final ByteBuf buffer) {
                if (!(message instanceof KeepaliveMessage)) {
                        throw new IllegalArgumentException("Wrong instance of Message. Passed instance of " + message.getClass()
-                                       + ". Nedded KeepaliveMessage.");
+                                       + ". Need KeepaliveMessage.");
                }
                buffer.writeBytes(new byte[0]);
        }
 
        @Override
-       public KeepaliveMessage parseMessage(final byte[] buffer) {
-               return new KeepaliveBuilder().setKeepaliveMessage(new KeepaliveMessageBuilder().build()).build();
+       public int getMessageType() {
+               return TYPE;
        }
 
        @Override
-       public int getMessageType() {
-               return TYPE;
+       protected KeepaliveMessage validate(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException {
+               // FIXME: keepalive shouldn't have objects
+
+               return MESSAGE;
        }
 }
index 248869dcf91814f154c28a0d45854ed21857e7b0..068e25a91d296de35ca2d3d064dccd4e84b90843 100644 (file)
@@ -72,20 +72,15 @@ public class PCEPNotificationMessageParser extends AbstractMessageParser {
        }
 
        @Override
-       public Message parseMessage(final byte[] buffer) throws PCEPDeserializerException, PCEPDocumentedException {
-               if (buffer == null || buffer.length == 0) {
-                       throw new PCEPDeserializerException("Notification message cannot be empty.");
-               }
-               final List<Object> objs = parseObjects(buffer);
-
-               return validate(objs);
-       }
-
-       public Message validate(final List<Object> objects) throws PCEPDeserializerException {
+       protected Message validate(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException {
                if (objects == null) {
                        throw new IllegalArgumentException("Passed list can't be null.");
                }
 
+               if (objects.isEmpty()) {
+                       throw new PCEPDeserializerException("Notification message cannot be empty.");
+               }
+
                final PCEPErrorMapping maping = PCEPErrorMapping.getInstance();
 
                final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcntf.message.pcntf.message.Notifications> compositeNotifications = Lists.newArrayList();
index 675bc25bbc2da732659fbfb25a791f672c6d3f07..339943303fec940c566f7493d14cc7918e1f6e09 100644 (file)
@@ -12,7 +12,6 @@ import io.netty.buffer.ByteBuf;
 import java.util.List;
 
 import org.opendaylight.protocol.pcep.PCEPDeserializerException;
-import org.opendaylight.protocol.pcep.PCEPDocumentedException;
 import org.opendaylight.protocol.pcep.spi.ObjectHandlerRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.OpenBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
@@ -35,7 +34,7 @@ public class PCEPOpenMessageParser extends AbstractMessageParser {
        @Override
        public void serializeMessage(final Message message, final ByteBuf buffer) {
                if (!(message instanceof OpenMessage)) {
-                       throw new IllegalArgumentException("Wrong instance of Message. Passed instance " + message.getClass() + ". Nedded OpenMessage.");
+                       throw new IllegalArgumentException("Wrong instance of Message. Passed instance " + message.getClass() + ". Needed OpenMessage.");
                }
                final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.message.OpenMessage open = ((OpenMessage) message).getOpenMessage();
 
@@ -47,17 +46,7 @@ public class PCEPOpenMessageParser extends AbstractMessageParser {
        }
 
        @Override
-       public OpenMessage parseMessage(final byte[] buffer) throws PCEPDeserializerException, PCEPDocumentedException {
-               if (buffer == null || buffer.length == 0) {
-                       throw new PCEPDeserializerException("Open message doesn't contain OPEN object.");
-               }
-               final List<Object> objs = parseObjects(buffer);
-
-               return new OpenBuilder().setOpenMessage(validate(objs)).build();
-       }
-
-       private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.message.OpenMessage validate(
-                       final List<Object> objects) throws PCEPDeserializerException {
+       protected org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Open validate(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException {
                if (objects == null) {
                        throw new IllegalArgumentException("Passed list can't be null.");
                }
@@ -75,7 +64,7 @@ public class PCEPOpenMessageParser extends AbstractMessageParser {
                        throw new PCEPDeserializerException("Unprocessed Objects: " + objects);
                }
 
-               return msg;
+               return new OpenBuilder().setOpenMessage(msg).build();
        }
 
        @Override
index 3ef912b51df8aba6e156259eb198e43837c15197..cdbc59ef3669c4939df2bf5a5fc4cb2bc4f5d408 100644 (file)
@@ -9,16 +9,12 @@ package org.opendaylight.protocol.pcep.impl.message;
 
 import io.netty.buffer.ByteBuf;
 
-import java.util.Arrays;
 import java.util.List;
 
-import org.opendaylight.protocol.pcep.PCEPDeserializerException;
 import org.opendaylight.protocol.pcep.PCEPDocumentedException;
-import org.opendaylight.protocol.pcep.PCEPErrorMapping;
 import org.opendaylight.protocol.pcep.PCEPErrors;
 import org.opendaylight.protocol.pcep.UnknownObject;
 import org.opendaylight.protocol.pcep.spi.ObjectHandlerRegistry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.PcerrBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Pcrep;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.PcrepBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
@@ -32,9 +28,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.Lspa;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.metric.object.Metric;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.of.object.Of;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcep.error.object.ErrorObjectBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.PcerrMessageBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.ErrorsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.PcrepMessageBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.Replies;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.RepliesBuilder;
@@ -122,26 +115,7 @@ public class PCEPReplyMessageParser extends AbstractMessageParser {
        }
 
        @Override
-       public Message parseMessage(final byte[] buffer) throws PCEPDeserializerException, PCEPDocumentedException {
-               if (buffer == null || buffer.length == 0) {
-                       throw new PCEPDeserializerException("Error message is empty.");
-               }
-               final List<Object> objs = parseObjects(buffer);
-               PcrepMessage m = null;
-               try {
-                       m = validate(objs);
-               } catch (final PCEPDocumentedException e) {
-                       final PCEPErrorMapping maping = PCEPErrorMapping.getInstance();
-                       return new PcerrBuilder().setPcerrMessage(
-                                       new PcerrMessageBuilder().setErrors(
-                                                       Arrays.asList(new ErrorsBuilder().setErrorObject(
-                                                                       new ErrorObjectBuilder().setType(maping.getFromErrorsEnum(e.getError()).type).setValue(
-                                                                                       maping.getFromErrorsEnum(e.getError()).value).build()).build())).build()).build();
-               }
-               return m;
-       }
-
-       private Pcrep validate(final List<Object> objects) throws PCEPDocumentedException {
+       protected Pcrep validate(final List<Object> objects, final List<Message> errors) throws PCEPDocumentedException {
                final List<Replies> replies = Lists.newArrayList();
                while (!objects.isEmpty()) {
                        replies.add(this.getValidReply(objects));
index 66a9f725b752d44066317a9a3bdefba2a8836f13..b59ce68bcfc47e14fb7438096c594f98bbef3076 100644 (file)
@@ -89,22 +89,14 @@ public class PCEPReportMessageParser extends AbstractMessageParser {
        }
 
        @Override
-       public Message parseMessage(final byte[] buffer) throws PCEPDeserializerException {
-               if (buffer == null || buffer.length == 0) {
-                       throw new PCEPDeserializerException("Pcrpt message cannot be empty.");
-               }
-               try {
-                       final List<Object> objs = parseObjects(buffer);
-                       return validate(objs);
-               } catch (final PCEPDocumentedException e) {
-                       return createErrorMsg(e.getError());
-               }
-       }
-
-       public Message validate(final List<Object> objects) throws PCEPDeserializerException, PCEPDocumentedException {
+       public Message validate(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException, PCEPDocumentedException {
                if (objects == null) {
                        throw new IllegalArgumentException("Passed list can't be null.");
                }
+               if (objects.isEmpty()) {
+                       throw new PCEPDeserializerException("Pcrpt message cannot be empty.");
+               }
+
                final List<Reports> reports = Lists.newArrayList();
 
                while (!objects.isEmpty()) {
index 3c2599b65cd4b42425aacfa32292f053e17ca3e2..137950664ac08fc9e6f7aadc52a8c6726358e1ed 100644 (file)
@@ -9,6 +9,8 @@ package org.opendaylight.protocol.pcep.impl.message;
 
 import io.netty.buffer.ByteBuf;
 
+import java.util.List;
+
 import org.opendaylight.protocol.pcep.PCEPDeserializerException;
 import org.opendaylight.protocol.pcep.spi.ObjectHandlerRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
@@ -35,255 +37,255 @@ public class PCEPRequestMessageParser extends AbstractMessageParser {
        }
 
        @Override
-       public PcrepMessage parseMessage(final byte[] buffer) throws PCEPDeserializerException {
-               // TODO Auto-generated method stub
+       protected Message validate(
+                       final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object> objects,
+                       final List<Message> errors) throws PCEPDeserializerException {
+               // if (objects == null)
+               // throw new IllegalArgumentException("Passed list can't be null.");
+               //
+               // final List<Message> msgs = Lists.newArrayList();
+               // final List<CompositeRequestSvecObject> svecList = new ArrayList<CompositeRequestSvecObject>();
+               //
+               // CompositeRequestSvecObject svecComp;
+               // while (!objects.isEmpty()) {
+               // try {
+               // if ((svecComp = getValidSvecComposite(objects)) == null)
+               // break;
+               // } catch (final PCEPDocumentedException e) {
+               // msgs.add(new PCEPErrorMessage(new PCEPErrorObject(e.getError())));
+               // return msgs;
+               // }
+               //
+               // svecList.add(svecComp);
+               // }
+               //
+               // while (!objects.isEmpty()) {
+               // final List<CompositeRequestObject> requests = new ArrayList<CompositeRequestObject>();
+               // PCEPRequestParameterObject rpObj = null;
+               // boolean requestRejected = false;
+               //
+               // if (objects.get(0) instanceof PCEPRequestParameterObject) {
+               // rpObj = (PCEPRequestParameterObject) objects.get(0);
+               // objects.remove(rpObj);
+               // if (!rpObj.isProcessed()) {
+               // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(rpObj, new PCEPErrorObject(PCEPErrors.P_FLAG_NOT_SET))));
+               // requestRejected = true;
+               // }
+               //
+               // } else {
+               // // if RP obj is missing return error only;
+               // msgs.clear();
+               // msgs.add(new PCEPErrorMessage(new PCEPErrorObject(PCEPErrors.RP_MISSING)));
+               // return msgs;
+               // }
+               //
+               // PCEPEndPointsObject<?> endPoints = null;
+               // if (objects.get(0) instanceof PCEPEndPointsObject<?>) {
+               // endPoints = (PCEPEndPointsObject<?>) objects.get(0);
+               // objects.remove(0);
+               // if (!endPoints.isProcessed()) {
+               // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(copyRP(rpObj, false), new
+               // PCEPErrorObject(PCEPErrors.P_FLAG_NOT_SET))));
+               // requestRejected = true;
+               // }
+               // } else {
+               // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(copyRP(rpObj, false), new
+               // PCEPErrorObject(PCEPErrors.END_POINTS_MISSING))));
+               // requestRejected = true;
+               // }
+               //
+               // // ignore all continual end-points objects
+               // while (!objects.isEmpty() && objects.get(0) instanceof PCEPEndPointsObject<?>) {
+               // objects.remove(0);
+               // }
+               //
+               // PCEPClassTypeObject classType = null;
+               // PCEPLspObject lsp = null;
+               // PCEPLspaObject lspa = null;
+               // PCEPRequestedPathBandwidthObject bandwidth = null;
+               // final List<PCEPMetricObject> metrics = new ArrayList<PCEPMetricObject>();
+               // PCEPReportedRouteObject rro = null;
+               // PCEPExistingPathBandwidthObject rroBandwidth = null;
+               // PCEPIncludeRouteObject iro = null;
+               // PCEPLoadBalancingObject loadBalancing = null;
+               //
+               // int state = 1;
+               // while (!objects.isEmpty()) {
+               // final Object obj = objects.get(0);
+               // if (obj instanceof UnknownObject) {
+               // if (((UnknownObject) obj).isProcessingRule()) {
+               // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(copyRP(rpObj, false), new PCEPErrorObject(((UnknownObject)
+               // obj).getError()))));
+               // requestRejected = true;
+               // }
+               //
+               // objects.remove(0);
+               // continue;
+               // }
+               // switch (state) {
+               // case 1:
+               // state = 2;
+               // if (obj instanceof PCEPClassTypeObject) {
+               // classType = (PCEPClassTypeObject) obj;
+               // if (!classType.isProcessed()) {
+               // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(copyRP(rpObj, false), new
+               // PCEPErrorObject(PCEPErrors.P_FLAG_NOT_SET))));
+               // requestRejected = true;
+               // }
+               // break;
+               // }
+               // case 2:
+               // state = 3;
+               // if (obj instanceof PCEPLspObject) {
+               // lsp = (PCEPLspObject) obj;
+               // break;
+               // }
+               // case 3:
+               // state = 4;
+               // if (obj instanceof PCEPLspaObject) {
+               // lspa = (PCEPLspaObject) obj;
+               // break;
+               // }
+               // case 4:
+               // state = 5;
+               // if (obj instanceof PCEPRequestedPathBandwidthObject) {
+               // bandwidth = (PCEPRequestedPathBandwidthObject) obj;
+               // break;
+               // }
+               // case 5:
+               // state = 6;
+               // if (obj instanceof PCEPMetricObject) {
+               // metrics.add((PCEPMetricObject) obj);
+               // state = 5;
+               //
+               // break;
+               // }
+               // case 6:
+               // state = 8;
+               // if (obj instanceof PCEPReportedRouteObject) {
+               // rro = (PCEPReportedRouteObject) obj;
+               // state = 7;
+               // break;
+               // }
+               // case 7:
+               // state = 8;
+               // if (obj instanceof PCEPExistingPathBandwidthObject) {
+               // rroBandwidth = (PCEPExistingPathBandwidthObject) obj;
+               // break;
+               // }
+               // case 8:
+               // state = 9;
+               // if (obj instanceof PCEPIncludeRouteObject) {
+               // iro = (PCEPIncludeRouteObject) obj;
+               // break;
+               // }
+               // case 9:
+               // if (obj instanceof PCEPLoadBalancingObject) {
+               // loadBalancing = (PCEPLoadBalancingObject) obj;
+               // break;
+               // }
+               // state = 10;
+               // }
+               //
+               // if (state == 10) {
+               // break;
+               // }
+               //
+               // objects.remove(obj);
+               // }
+               //
+               // if (rpObj.isReoptimized() && bandwidth != null && bandwidth.getBandwidth() != new Bandwidth(new byte[] { 0 }) &&
+               // rro == null) {
+               // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(copyRP(rpObj, false), new
+               // PCEPErrorObject(PCEPErrors.RRO_MISSING))));
+               // requestRejected = true;
+               // }
+               //
+               // if (!requestRejected) {
+               // requests.add(new CompositeRequestObject(rpObj, endPoints, classType, lsp, lspa, bandwidth, metrics, rro,
+               // rroBandwidth, iro, loadBalancing));
+               // msgs.add(new PCEPRequestMessage(Collections.unmodifiableList(svecList), Collections.unmodifiableList(requests)));
+               // }
+               // }
+               //
+               // return msgs;
+               // }
+               //
+               // private static CompositeRequestSvecObject getValidSvecComposite(final List<Object> objects) throws
+               // PCEPDocumentedException {
+               // if (objects == null || objects.isEmpty()) {
+               // throw new IllegalArgumentException("List cannot be null or empty.");
+               // }
+               //
+               // PCEPSvecObject svec = null;
+               // if (objects.get(0) instanceof PCEPSvecObject) {
+               // svec = (PCEPSvecObject) objects.get(0);
+               // objects.remove(svec);
+               // } else
+               // return null;
+               //
+               // PCEPObjectiveFunctionObject of = null;
+               // PCEPGlobalConstraintsObject gc = null;
+               // PCEPExcludeRouteObject xro = null;
+               // final List<PCEPMetricObject> metrics = new ArrayList<PCEPMetricObject>();
+               //
+               // int state = 1;
+               // while (!objects.isEmpty()) {
+               // final Object obj = objects.get(0);
+               //
+               // if (obj instanceof UnknownObject && ((UnknownObject) obj).isProcessingRule()) {
+               // throw new PCEPDocumentedException("Unknown object in SVEC list.", ((UnknownObject) obj).getError());
+               // }
+               //
+               // switch (state) {
+               // case 1:
+               // state = 2;
+               // if (obj instanceof PCEPObjectiveFunctionObject) {
+               // of = (PCEPObjectiveFunctionObject) obj;
+               // break;
+               // }
+               // case 2:
+               // state = 3;
+               // if (obj instanceof PCEPGlobalConstraintsObject) {
+               // gc = (PCEPGlobalConstraintsObject) obj;
+               // break;
+               // }
+               // case 3:
+               // state = 4;
+               // if (obj instanceof PCEPExcludeRouteObject) {
+               // xro = (PCEPExcludeRouteObject) obj;
+               // break;
+               // }
+               // case 4:
+               // state = 5;
+               // if (obj instanceof PCEPMetricObject) {
+               // metrics.add((PCEPMetricObject) obj);
+               // state = 4;
+               //
+               // break;
+               // }
+               // }
+               //
+               // if (state == 5)
+               // break;
+               //
+               // objects.remove(obj);
+               // }
+               //
+               // return new CompositeRequestSvecObject(svec, of, gc, xro, metrics);
+               // }
+               //
+               // private static PCEPRequestParameterObject copyRP(final PCEPRequestParameterObject origRp, final boolean
+               // processed) {
+               // return new PCEPRequestParameterObject(origRp.isLoose(), origRp.isBidirectional(), origRp.isReoptimized(),
+               // origRp.isMakeBeforeBreak(), origRp.isReportRequestOrder(), origRp.isSuplyOFOnResponse(),
+               // origRp.isFragmentation(), origRp.isP2mp(), origRp.isEroCompression(), origRp.getPriority(),
+               // origRp.getRequestID(), origRp.getTlvs(), processed, origRp.isIgnored());
+               // }
+
                return null;
        }
 
-       // public List<Message> validate(final List<Object> objects) {
-       // if (objects == null)
-       // throw new IllegalArgumentException("Passed list can't be null.");
-       //
-       // final List<Message> msgs = Lists.newArrayList();
-       // final List<CompositeRequestSvecObject> svecList = new ArrayList<CompositeRequestSvecObject>();
-       //
-       // CompositeRequestSvecObject svecComp;
-       // while (!objects.isEmpty()) {
-       // try {
-       // if ((svecComp = getValidSvecComposite(objects)) == null)
-       // break;
-       // } catch (final PCEPDocumentedException e) {
-       // msgs.add(new PCEPErrorMessage(new PCEPErrorObject(e.getError())));
-       // return msgs;
-       // }
-       //
-       // svecList.add(svecComp);
-       // }
-       //
-       // while (!objects.isEmpty()) {
-       // final List<CompositeRequestObject> requests = new ArrayList<CompositeRequestObject>();
-       // PCEPRequestParameterObject rpObj = null;
-       // boolean requestRejected = false;
-       //
-       // if (objects.get(0) instanceof PCEPRequestParameterObject) {
-       // rpObj = (PCEPRequestParameterObject) objects.get(0);
-       // objects.remove(rpObj);
-       // if (!rpObj.isProcessed()) {
-       // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(rpObj, new PCEPErrorObject(PCEPErrors.P_FLAG_NOT_SET))));
-       // requestRejected = true;
-       // }
-       //
-       // } else {
-       // // if RP obj is missing return error only;
-       // msgs.clear();
-       // msgs.add(new PCEPErrorMessage(new PCEPErrorObject(PCEPErrors.RP_MISSING)));
-       // return msgs;
-       // }
-       //
-       // PCEPEndPointsObject<?> endPoints = null;
-       // if (objects.get(0) instanceof PCEPEndPointsObject<?>) {
-       // endPoints = (PCEPEndPointsObject<?>) objects.get(0);
-       // objects.remove(0);
-       // if (!endPoints.isProcessed()) {
-       // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(copyRP(rpObj, false), new
-       // PCEPErrorObject(PCEPErrors.P_FLAG_NOT_SET))));
-       // requestRejected = true;
-       // }
-       // } else {
-       // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(copyRP(rpObj, false), new
-       // PCEPErrorObject(PCEPErrors.END_POINTS_MISSING))));
-       // requestRejected = true;
-       // }
-       //
-       // // ignore all continual end-points objects
-       // while (!objects.isEmpty() && objects.get(0) instanceof PCEPEndPointsObject<?>) {
-       // objects.remove(0);
-       // }
-       //
-       // PCEPClassTypeObject classType = null;
-       // PCEPLspObject lsp = null;
-       // PCEPLspaObject lspa = null;
-       // PCEPRequestedPathBandwidthObject bandwidth = null;
-       // final List<PCEPMetricObject> metrics = new ArrayList<PCEPMetricObject>();
-       // PCEPReportedRouteObject rro = null;
-       // PCEPExistingPathBandwidthObject rroBandwidth = null;
-       // PCEPIncludeRouteObject iro = null;
-       // PCEPLoadBalancingObject loadBalancing = null;
-       //
-       // int state = 1;
-       // while (!objects.isEmpty()) {
-       // final Object obj = objects.get(0);
-       // if (obj instanceof UnknownObject) {
-       // if (((UnknownObject) obj).isProcessingRule()) {
-       // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(copyRP(rpObj, false), new PCEPErrorObject(((UnknownObject)
-       // obj).getError()))));
-       // requestRejected = true;
-       // }
-       //
-       // objects.remove(0);
-       // continue;
-       // }
-       // switch (state) {
-       // case 1:
-       // state = 2;
-       // if (obj instanceof PCEPClassTypeObject) {
-       // classType = (PCEPClassTypeObject) obj;
-       // if (!classType.isProcessed()) {
-       // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(copyRP(rpObj, false), new
-       // PCEPErrorObject(PCEPErrors.P_FLAG_NOT_SET))));
-       // requestRejected = true;
-       // }
-       // break;
-       // }
-       // case 2:
-       // state = 3;
-       // if (obj instanceof PCEPLspObject) {
-       // lsp = (PCEPLspObject) obj;
-       // break;
-       // }
-       // case 3:
-       // state = 4;
-       // if (obj instanceof PCEPLspaObject) {
-       // lspa = (PCEPLspaObject) obj;
-       // break;
-       // }
-       // case 4:
-       // state = 5;
-       // if (obj instanceof PCEPRequestedPathBandwidthObject) {
-       // bandwidth = (PCEPRequestedPathBandwidthObject) obj;
-       // break;
-       // }
-       // case 5:
-       // state = 6;
-       // if (obj instanceof PCEPMetricObject) {
-       // metrics.add((PCEPMetricObject) obj);
-       // state = 5;
-       //
-       // break;
-       // }
-       // case 6:
-       // state = 8;
-       // if (obj instanceof PCEPReportedRouteObject) {
-       // rro = (PCEPReportedRouteObject) obj;
-       // state = 7;
-       // break;
-       // }
-       // case 7:
-       // state = 8;
-       // if (obj instanceof PCEPExistingPathBandwidthObject) {
-       // rroBandwidth = (PCEPExistingPathBandwidthObject) obj;
-       // break;
-       // }
-       // case 8:
-       // state = 9;
-       // if (obj instanceof PCEPIncludeRouteObject) {
-       // iro = (PCEPIncludeRouteObject) obj;
-       // break;
-       // }
-       // case 9:
-       // if (obj instanceof PCEPLoadBalancingObject) {
-       // loadBalancing = (PCEPLoadBalancingObject) obj;
-       // break;
-       // }
-       // state = 10;
-       // }
-       //
-       // if (state == 10) {
-       // break;
-       // }
-       //
-       // objects.remove(obj);
-       // }
-       //
-       // if (rpObj.isReoptimized() && bandwidth != null && bandwidth.getBandwidth() != new Bandwidth(new byte[] { 0 }) &&
-       // rro == null) {
-       // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(copyRP(rpObj, false), new
-       // PCEPErrorObject(PCEPErrors.RRO_MISSING))));
-       // requestRejected = true;
-       // }
-       //
-       // if (!requestRejected) {
-       // requests.add(new CompositeRequestObject(rpObj, endPoints, classType, lsp, lspa, bandwidth, metrics, rro,
-       // rroBandwidth, iro, loadBalancing));
-       // msgs.add(new PCEPRequestMessage(Collections.unmodifiableList(svecList), Collections.unmodifiableList(requests)));
-       // }
-       // }
-       //
-       // return msgs;
-       // }
-       //
-       // private static CompositeRequestSvecObject getValidSvecComposite(final List<Object> objects) throws
-       // PCEPDocumentedException {
-       // if (objects == null || objects.isEmpty()) {
-       // throw new IllegalArgumentException("List cannot be null or empty.");
-       // }
-       //
-       // PCEPSvecObject svec = null;
-       // if (objects.get(0) instanceof PCEPSvecObject) {
-       // svec = (PCEPSvecObject) objects.get(0);
-       // objects.remove(svec);
-       // } else
-       // return null;
-       //
-       // PCEPObjectiveFunctionObject of = null;
-       // PCEPGlobalConstraintsObject gc = null;
-       // PCEPExcludeRouteObject xro = null;
-       // final List<PCEPMetricObject> metrics = new ArrayList<PCEPMetricObject>();
-       //
-       // int state = 1;
-       // while (!objects.isEmpty()) {
-       // final Object obj = objects.get(0);
-       //
-       // if (obj instanceof UnknownObject && ((UnknownObject) obj).isProcessingRule()) {
-       // throw new PCEPDocumentedException("Unknown object in SVEC list.", ((UnknownObject) obj).getError());
-       // }
-       //
-       // switch (state) {
-       // case 1:
-       // state = 2;
-       // if (obj instanceof PCEPObjectiveFunctionObject) {
-       // of = (PCEPObjectiveFunctionObject) obj;
-       // break;
-       // }
-       // case 2:
-       // state = 3;
-       // if (obj instanceof PCEPGlobalConstraintsObject) {
-       // gc = (PCEPGlobalConstraintsObject) obj;
-       // break;
-       // }
-       // case 3:
-       // state = 4;
-       // if (obj instanceof PCEPExcludeRouteObject) {
-       // xro = (PCEPExcludeRouteObject) obj;
-       // break;
-       // }
-       // case 4:
-       // state = 5;
-       // if (obj instanceof PCEPMetricObject) {
-       // metrics.add((PCEPMetricObject) obj);
-       // state = 4;
-       //
-       // break;
-       // }
-       // }
-       //
-       // if (state == 5)
-       // break;
-       //
-       // objects.remove(obj);
-       // }
-       //
-       // return new CompositeRequestSvecObject(svec, of, gc, xro, metrics);
-       // }
-       //
-       // private static PCEPRequestParameterObject copyRP(final PCEPRequestParameterObject origRp, final boolean
-       // processed) {
-       // return new PCEPRequestParameterObject(origRp.isLoose(), origRp.isBidirectional(), origRp.isReoptimized(),
-       // origRp.isMakeBeforeBreak(), origRp.isReportRequestOrder(), origRp.isSuplyOFOnResponse(),
-       // origRp.isFragmentation(), origRp.isP2mp(), origRp.isEroCompression(), origRp.getPriority(),
-       // origRp.getRequestID(), origRp.getTlvs(), processed, origRp.isIgnored());
-       // }
-
        @Override
        public int getMessageType() {
                return TYPE;
index 32c617792dcb0b721d4b5a766a626c79dec5ce83..ca0ba404e6281be14ade122f959edc50d5858224 100644 (file)
@@ -81,22 +81,14 @@ public class PCEPUpdateRequestMessageParser extends AbstractMessageParser {
        }
 
        @Override
-       public Message parseMessage(final byte[] buffer) throws PCEPDeserializerException {
-               if (buffer == null || buffer.length == 0) {
-                       throw new PCEPDeserializerException("Pcup message cannot be empty.");
-               }
-               try {
-                       final List<Object> objs = parseObjects(buffer);
-                       return validate(objs);
-               } catch (final PCEPDocumentedException e) {
-                       return createErrorMsg(e.getError());
-               }
-       }
-
-       public Message validate(final List<Object> objects) throws PCEPDeserializerException, PCEPDocumentedException {
+       protected Message validate(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException, PCEPDocumentedException {
                if (objects == null) {
                        throw new IllegalArgumentException("Passed list can't be null.");
                }
+               if (objects.isEmpty()) {
+                       throw new PCEPDeserializerException("Pcup message cannot be empty.");
+               }
+
                final List<Updates> updateRequests = Lists.newArrayList();
 
                while (!objects.isEmpty()) {
index b31b969c19e2f1d970919e58783f2926ecd4863e..d804f790293c2770984fe79c848377038f1668ee 100644 (file)
@@ -87,15 +87,7 @@ public class PcinitiateMessageParser extends AbstractMessageParser {
        }
 
        @Override
-       public Message parseMessage(final byte[] buffer) throws PCEPDeserializerException, PCEPDocumentedException {
-               if (buffer == null || buffer.length == 0) {
-                       throw new PCEPDeserializerException("Initiate message cannot be empty.");
-               }
-               final List<Object> objs = parseObjects(buffer);
-               return validate(objs);
-       }
-
-       public Message validate(final List<Object> objects) throws PCEPDeserializerException {
+       protected Message validate(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException {
                if (objects == null) {
                        throw new IllegalArgumentException("Passed list can't be null.");
                }
index e1dd4ad8790c867a2fd287078f254935e4bc510a..34fd29873cf79de87a384c9324abd6dc995d3b23 100644 (file)
@@ -8,8 +8,8 @@
 package org.opendaylight.protocol.pcep.impl.object;
 
 import org.opendaylight.protocol.pcep.PCEPDeserializerException;
-import org.opendaylight.protocol.pcep.PCEPDocumentedException;
 import org.opendaylight.protocol.pcep.PCEPErrors;
+import org.opendaylight.protocol.pcep.UnknownObject;
 import org.opendaylight.protocol.pcep.spi.TlvHandlerRegistry;
 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;
@@ -48,7 +48,7 @@ public class PCEPClassTypeObjectParser extends AbstractObjectWithTlvsParser<Clas
        }
 
        @Override
-       public ClassType parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException, PCEPDocumentedException {
+       public Object parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException {
                if (bytes == null) {
                        throw new IllegalArgumentException("Byte array is mandatory.");
                }
@@ -57,7 +57,8 @@ public class PCEPClassTypeObjectParser extends AbstractObjectWithTlvsParser<Clas
                                        + bytes.length);
                }
                if (!header.isProcessingRule()) {
-                       throw new PCEPDocumentedException("Processed bit not set", PCEPErrors.P_FLAG_NOT_SET);
+                       //LOG.debug("Processed bit not set on CLASS TYPE OBJECT, ignoring it");
+                       return null;
                }
                final ClassTypeBuilder builder = new ClassTypeBuilder();
 
@@ -68,7 +69,8 @@ public class PCEPClassTypeObjectParser extends AbstractObjectWithTlvsParser<Clas
                builder.setClassType(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ClassType(ct));
 
                if (ct < 0 || ct > 8) {
-                       throw new PCEPDocumentedException("Invalid class type " + ct, PCEPErrors.INVALID_CT);
+                       // LOG.info("Invalid class type {}", ct);
+                       return new UnknownObject(PCEPErrors.INVALID_CT);
                }
                return builder.build();
        }
index 95dd74a0abf01d7245fcfa8722c551b5afe15aa6..cd513db0caa5b75de9c3e2d7d9a59e4e168ecdb2 100644 (file)
@@ -10,8 +10,6 @@ package org.opendaylight.protocol.pcep.impl.object;
 import org.opendaylight.protocol.concepts.Ipv4Util;
 import org.opendaylight.protocol.concepts.Ipv6Util;
 import org.opendaylight.protocol.pcep.PCEPDeserializerException;
-import org.opendaylight.protocol.pcep.PCEPDocumentedException;
-import org.opendaylight.protocol.pcep.PCEPErrors;
 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;
@@ -56,14 +54,14 @@ public class PCEPEndPointsObjectParser extends AbstractObjectWithTlvsParser<Endp
        }
 
        @Override
-       public EndpointsObj parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException,
-                       PCEPDocumentedException {
+       public EndpointsObj parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException {
                if (bytes == null) {
                        throw new IllegalArgumentException("Array of bytes is mandatory");
                }
 
                if (!header.isProcessingRule()) {
-                       throw new PCEPDocumentedException("Processed flag not set", PCEPErrors.P_FLAG_NOT_SET);
+                       //LOG.debug("Processed bit not set on ENDPOINTS OBJECT, ignoring it");
+                       return null;
                }
 
                final EndpointsObjBuilder builder = new EndpointsObjBuilder();
index 4271137ca866a07ddd69d9cd4be654da5db3e695..d15e64eb792d71cbc362b75dfc503b15e18c4d7b 100644 (file)
@@ -9,8 +9,8 @@
 package org.opendaylight.protocol.pcep.impl.object;
 
 import org.opendaylight.protocol.pcep.PCEPDeserializerException;
-import org.opendaylight.protocol.pcep.PCEPDocumentedException;
 import org.opendaylight.protocol.pcep.PCEPErrors;
+import org.opendaylight.protocol.pcep.UnknownObject;
 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;
@@ -72,14 +72,15 @@ public class PCEPOpenObjectParser extends AbstractObjectWithTlvsParser<TlvsBuild
        }
 
        @Override
-       public Open parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException, PCEPDocumentedException {
+       public Object 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.");
                }
                final int versionValue = ByteArray.copyBitsRange(bytes[VER_FLAGS_MF_OFFSET], VERSION_SF_OFFSET, VERSION_SF_LENGTH);
 
                if (versionValue != PCEP_VERSION) {
-                       throw new PCEPDocumentedException("Unsupported PCEP version " + versionValue, PCEPErrors.PCEP_VERSION_NOT_SUPPORTED);
+                       // LOG.info("Unsupported PCEP version {}", versionValue);
+                       return new UnknownObject(PCEPErrors.PCEP_VERSION_NOT_SUPPORTED);
                }
                final OpenBuilder builder = new OpenBuilder();
                builder.setVersion(new ProtocolVersion((short) versionValue));
index fdaecc47233685b3cfaaaede6b0c9b05927d351b..66d97e24f4384060986d661bd3ce489329c58f49 100644 (file)
@@ -12,7 +12,6 @@ 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.spi.TlvHandlerRegistry;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object;
@@ -93,7 +92,7 @@ public class PCEPRequestParameterObjectParser extends AbstractObjectWithTlvsPars
        }
 
        @Override
-       public Rp 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.");
                }
@@ -107,10 +106,13 @@ public class PCEPRequestParameterObjectParser extends AbstractObjectWithTlvsPars
 
                final RpBuilder builder = new RpBuilder();
                builder.setIgnore(header.isIgnore());
-               // FIXME: change binary files
-               // if (!header.isProcessingRule()) {
-               // throw new PCEPDocumentedException("P flag is not set.", PCEPErrors.P_FLAG_NOT_SET);
-               // }
+
+               //FIXME : change binary files
+               //if (!header.isProcessingRule()) {
+               //LOG.debug("Processed bit not set on RP OBJECT, ignoring it");
+               //      return null;
+               //}
+
                builder.setProcessingRule(header.isProcessingRule());
 
                builder.setPriority(priority);
index 1d261b82380360ebee9c5ad1061be3afc850b195..ae26a83e53eaf3e2257e113ce022ba8432807595 100644 (file)
@@ -10,8 +10,6 @@ package org.opendaylight.protocol.pcep.impl.object;
 import java.util.Arrays;
 
 import org.opendaylight.protocol.pcep.PCEPDeserializerException;
-import org.opendaylight.protocol.pcep.PCEPDocumentedException;
-import org.opendaylight.protocol.pcep.PCEPErrors;
 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;
@@ -41,7 +39,7 @@ public final class PCEPSrpObjectParser extends AbstractObjectWithTlvsParser<SrpB
        }
 
        @Override
-       public Srp parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException, PCEPDocumentedException {
+       public Srp 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.");
                }
@@ -56,12 +54,8 @@ public final class PCEPSrpObjectParser extends AbstractObjectWithTlvsParser<SrpB
                builder.setIgnore(header.isIgnore());
                builder.setProcessingRule(header.isProcessingRule());
                final byte[] srpId = ByteArray.subByte(bytes, FLAGS_SIZE, SRP_ID_SIZE);
-               if (Arrays.equals(srpId, new byte[] { 0, 0, 0, 0 })) {
-                       // The absence of the SRP object is equivalent to an SRP object with the reserved value of 0x00000000.
-                       throw new PCEPDocumentedException("Srp object has 0 value.", PCEPErrors.SRP_MISSING);
-               }
-               if (Arrays.equals(srpId, new byte[] { 0xFFFFFFFF })) {
-                       throw new PCEPDeserializerException("Max values for SRP ID are reserved.");
+               if (Arrays.equals(srpId, new byte[] { 0, 0, 0, 0 }) || Arrays.equals(srpId, new byte[] { 0xFFFFFFFF })) {
+                       throw new PCEPDeserializerException("Min/Max values for SRP ID are reserved.");
                }
                builder.setOperationId(new SrpIdNumber(ByteArray.bytesToLong(srpId)));
                return builder.build();
index 8dbbf49b25790bf103ef046f3bbc95a0033ee281..752ca6b1330526f38abbb3c38c2cc473e0fbd6cf 100644 (file)
@@ -14,6 +14,7 @@ import io.netty.buffer.Unpooled;
 
 import java.io.IOException;
 import java.math.BigInteger;
+import java.util.Collections;
 import java.util.List;
 
 import org.junit.Before;
@@ -42,6 +43,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.mes
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.PcrepBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.PcrptBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.PcupdBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OfId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OperationalStatus;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.PlspId;
@@ -279,7 +281,7 @@ public class PCEPValidatorTest {
                                tlv1).setLspDbVersion(tlv2).build());
                builder.setOpen(b.build());
 
-               assertEquals(new OpenBuilder().setOpenMessage(builder.build()).build(), parser.parseMessage(result));
+               assertEquals(new OpenBuilder().setOpenMessage(builder.build()).build(), parser.parseMessage(result, Collections.<Message>emptyList()));
                final ByteBuf buf = Unpooled.buffer(result.length);
                parser.serializeMessage(new OpenBuilder().setOpenMessage(builder.build()).build(), buf);
                assertArrayEquals(result, buf.array());
@@ -287,11 +289,11 @@ public class PCEPValidatorTest {
 
        @Test
        public void testKeepAliveMsg() throws IOException, PCEPDeserializerException, PCEPDocumentedException {
-               final byte[] result = new byte[] { 0, 0, 0, 0 };
+               final byte[] result = new byte[] { };
                final PCEPKeepAliveMessageParser parser = new PCEPKeepAliveMessageParser(this.objectRegistry);
                final KeepaliveBuilder builder = new KeepaliveBuilder().setKeepaliveMessage(new KeepaliveMessageBuilder().build());
 
-               assertEquals(builder.build(), parser.parseMessage(result));
+               assertEquals(builder.build(), parser.parseMessage(result, Collections.<Message>emptyList()));
                final ByteBuf buf = Unpooled.buffer(result.length);
                parser.serializeMessage(builder.build(), buf);
                assertArrayEquals(result, buf.array());
@@ -305,7 +307,7 @@ public class PCEPValidatorTest {
                final CloseBuilder builder = new CloseBuilder().setCCloseMessage(new CCloseMessageBuilder().setCClose(
                                new CCloseBuilder().setIgnore(false).setProcessingRule(false).setReason((short) 5).build()).build());
 
-               assertEquals(builder.build(), parser.parseMessage(result));
+               assertEquals(builder.build(), parser.parseMessage(result, Collections.<Message>emptyList()));
                final ByteBuf buf = Unpooled.buffer(result.length);
                parser.serializeMessage(builder.build(), buf);
                assertArrayEquals(result, buf.array());
@@ -552,7 +554,7 @@ public class PCEPValidatorTest {
                replies1.add(rBuilder.build());
                builder.setReplies(replies1);
 
-               assertEquals(new PcrepBuilder().setPcrepMessage(builder.build()).build(), parser.parseMessage(result));
+               assertEquals(new PcrepBuilder().setPcrepMessage(builder.build()).build(), parser.parseMessage(result, Collections.<Message>emptyList()));
                ByteBuf buf = Unpooled.buffer(result.length);
                parser.serializeMessage(new PcrepBuilder().setPcrepMessage(builder.build()).build(), buf);
                assertArrayEquals(result, buf.array());
@@ -569,7 +571,7 @@ public class PCEPValidatorTest {
                replies2.add(rBuilder2.build());
                builder.setReplies(replies2);
 
-               assertEquals(new PcrepBuilder().setPcrepMessage(builder.build()).build(), parser.parseMessage(result));
+               assertEquals(new PcrepBuilder().setPcrepMessage(builder.build()).build(), parser.parseMessage(result, Collections.<Message>emptyList()));
                buf = Unpooled.buffer(result.length);
                parser.serializeMessage(new PcrepBuilder().setPcrepMessage(builder.build()).build(), buf);
                assertArrayEquals(result, buf.array());
@@ -584,7 +586,7 @@ public class PCEPValidatorTest {
                replies3.add(rBuilder.build());
                builder.setReplies(replies3);
 
-               assertEquals(new PcrepBuilder().setPcrepMessage(builder.build()).build(), parser.parseMessage(result));
+               assertEquals(new PcrepBuilder().setPcrepMessage(builder.build()).build(), parser.parseMessage(result, Collections.<Message>emptyList()));
                buf = Unpooled.buffer(result.length);
                parser.serializeMessage(new PcrepBuilder().setPcrepMessage(builder.build()).build(), buf);
                assertArrayEquals(result, buf.array());
@@ -606,7 +608,7 @@ public class PCEPValidatorTest {
                replies4.add(rBuilder.build());
                builder.setReplies(replies4);
 
-               assertEquals(new PcrepBuilder().setPcrepMessage(builder.build()).build(), parser.parseMessage(result));
+               assertEquals(new PcrepBuilder().setPcrepMessage(builder.build()).build(), parser.parseMessage(result, Collections.<Message>emptyList()));
                buf = Unpooled.buffer(result.length);
                parser.serializeMessage(new PcrepBuilder().setPcrepMessage(builder.build()).build(), buf);
                assertArrayEquals(result, buf.array());
@@ -627,7 +629,7 @@ public class PCEPValidatorTest {
                updates.add(new UpdatesBuilder().setSrp(this.srp).setLsp(this.lsp).setPath(pBuilder.build()).build());
                builder.setUpdates(updates);
 
-               assertEquals(new PcupdBuilder().setPcupdMessage(builder.build()).build(), parser.parseMessage(result));
+               assertEquals(new PcupdBuilder().setPcupdMessage(builder.build()).build(), parser.parseMessage(result, Collections.<Message>emptyList()));
                ByteBuf buf = Unpooled.buffer(result.length);
                parser.serializeMessage(new PcupdBuilder().setPcupdMessage(builder.build()).build(), buf);
                assertArrayEquals(result, buf.array());
@@ -642,7 +644,7 @@ public class PCEPValidatorTest {
                updates1.add(new UpdatesBuilder().setSrp(this.srp).setLsp(this.lsp).setPath(pBuilder1.build()).build());
                builder.setUpdates(updates1);
 
-               assertEquals(new PcupdBuilder().setPcupdMessage(builder.build()).build(), parser.parseMessage(result));
+               assertEquals(new PcupdBuilder().setPcupdMessage(builder.build()).build(), parser.parseMessage(result, Collections.<Message>emptyList()));
                buf = Unpooled.buffer(result.length);
                parser.serializeMessage(new PcupdBuilder().setPcupdMessage(builder.build()).build(), buf);
                assertArrayEquals(result, buf.array());
@@ -660,7 +662,7 @@ public class PCEPValidatorTest {
                reports.add(new ReportsBuilder().setLsp(this.lsp).build());
                builder.setReports(reports);
 
-               assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(), parser.parseMessage(result));
+               assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(), parser.parseMessage(result, Collections.<Message>emptyList()));
                ByteBuf buf = Unpooled.buffer(result.length);
                parser.serializeMessage(new PcrptBuilder().setPcrptMessage(builder.build()).build(), buf);
                assertArrayEquals(result, buf.array());
@@ -671,7 +673,7 @@ public class PCEPValidatorTest {
                reports1.add(new ReportsBuilder().setLsp(this.lsp).setPath(new PathBuilder().setEro(this.ero).setLspa(this.lspa).build()).build());
                builder.setReports(reports1);
 
-               assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(), parser.parseMessage(result));
+               assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(), parser.parseMessage(result, Collections.<Message>emptyList()));
                buf = Unpooled.buffer(result.length);
                parser.serializeMessage(new PcrptBuilder().setPcrptMessage(builder.build()).build(), buf);
                assertArrayEquals(result, buf.array());
@@ -687,7 +689,7 @@ public class PCEPValidatorTest {
                reports2.add(new ReportsBuilder().setSrp(this.srp).setLsp(this.lsp).setPath(pBuilder.build()).build());
                builder.setReports(reports2);
 
-               assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(), parser.parseMessage(result));
+               assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(), parser.parseMessage(result, Collections.<Message>emptyList()));
                buf = Unpooled.buffer(result.length);
                parser.serializeMessage(new PcrptBuilder().setPcrptMessage(builder.build()).build(), buf);
                assertArrayEquals(result, buf.array());
@@ -704,7 +706,7 @@ public class PCEPValidatorTest {
                reports3.add(new ReportsBuilder().setSrp(this.srp).setLsp(this.lsp).setPath(pBuilder1.build()).build());
                builder.setReports(reports3);
 
-               assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(), parser.parseMessage(result));
+               assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(), parser.parseMessage(result, Collections.<Message>emptyList()));
                buf = Unpooled.buffer(result.length);
                parser.serializeMessage(new PcrptBuilder().setPcrptMessage(builder.build()).build(), buf);
                assertArrayEquals(result, buf.array());
@@ -729,7 +731,7 @@ public class PCEPValidatorTest {
                reqs.add(rBuilder.build());
                builder.setRequests(reqs);
 
-               assertEquals(new PcinitiateBuilder().setPcinitiateMessage(builder.build()).build(), parser.parseMessage(result));
+               assertEquals(new PcinitiateBuilder().setPcinitiateMessage(builder.build()).build(), parser.parseMessage(result, Collections.<Message>emptyList()));
                final ByteBuf buf = Unpooled.buffer(result.length);
                parser.serializeMessage(new PcinitiateBuilder().setPcinitiateMessage(builder.build()).build(), buf);
                assertArrayEquals(result, buf.array());
@@ -771,7 +773,7 @@ public class PCEPValidatorTest {
                nots.add(b.build());
                builder.setNotifications(nots);
 
-               assertEquals(new PcntfBuilder().setPcntfMessage(builder.build()).build(), parser.parseMessage(result));
+               assertEquals(new PcntfBuilder().setPcntfMessage(builder.build()).build(), parser.parseMessage(result, Collections.<Message>emptyList()));
                final ByteBuf buf = Unpooled.buffer(result.length);
                parser.serializeMessage(new PcntfBuilder().setPcntfMessage(builder.build()).build(), buf);
                assertArrayEquals(result, buf.array());
@@ -792,7 +794,7 @@ public class PCEPValidatorTest {
                builder.setErrors(innerErr);
                builder.setErrorType(new SessionBuilder().setOpen(this.open).build());
 
-               assertEquals(new PcerrBuilder().setPcerrMessage(builder.build()).build(), parser.parseMessage(result));
+               assertEquals(new PcerrBuilder().setPcerrMessage(builder.build()).build(), parser.parseMessage(result, Collections.<Message>emptyList()));
                ByteBuf buf = Unpooled.buffer(result.length);
                parser.serializeMessage(new PcerrBuilder().setPcerrMessage(builder.build()).build(), buf);
                assertArrayEquals(result, buf.array());
@@ -809,7 +811,7 @@ public class PCEPValidatorTest {
                builder.setErrors(innerErr);
                builder.setErrorType(new RequestBuilder().setRps(rps).build());
 
-               assertEquals(new PcerrBuilder().setPcerrMessage(builder.build()).build(), parser.parseMessage(result));
+               assertEquals(new PcerrBuilder().setPcerrMessage(builder.build()).build(), parser.parseMessage(result, Collections.<Message>emptyList()));
                buf = Unpooled.buffer(result.length);
                parser.serializeMessage(new PcerrBuilder().setPcerrMessage(builder.build()).build(), buf);
                assertArrayEquals(result, buf.array());
index e5db62769c23ee959c313a70284288721fd49cf5..eac072aeae635d931518462177c38f2908c5e52f 100644 (file)
@@ -7,10 +7,11 @@
  */
 package org.opendaylight.protocol.pcep.spi;
 
+import java.util.List;
+
 import org.opendaylight.protocol.pcep.PCEPDeserializerException;
-import org.opendaylight.protocol.pcep.PCEPDocumentedException;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
 
 public interface MessageParser {
-       public Message parseMessage(byte[] buffer) throws PCEPDeserializerException, PCEPDocumentedException;
+       Message parseMessage(byte[] buffer, List<Message> errors) throws PCEPDeserializerException;
 }
index 2c0e3d6f0709710cc3c67102d3be0fa60c769ed0..8fa3a4fe992eea62075abed54170b863c6790a69 100644 (file)
@@ -8,11 +8,10 @@
 package org.opendaylight.protocol.pcep.spi;
 
 import org.opendaylight.protocol.pcep.PCEPDeserializerException;
-import org.opendaylight.protocol.pcep.PCEPDocumentedException;
 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;
 
 public interface ObjectParser {
 
-       public Object parseObject(final ObjectHeader header, final byte[] buffer) throws PCEPDeserializerException, PCEPDocumentedException;
+       public Object parseObject(final ObjectHeader header, final byte[] buffer) throws PCEPDeserializerException;
 }
index 7452e375783dc9402778d6222c54a8afd7a9d8e1..6d7a7121c40e3828d365fc922f2db847bc8d260d 100644 (file)
@@ -8,11 +8,13 @@
 package org.opendaylight.protocol.pcep.spi.pojo;
 
 import org.opendaylight.protocol.concepts.HandlerRegistry;
+import org.opendaylight.protocol.pcep.UnknownObject;
 import org.opendaylight.protocol.pcep.spi.ObjectHandlerRegistry;
 import org.opendaylight.protocol.pcep.spi.ObjectParser;
 import org.opendaylight.protocol.pcep.spi.ObjectSerializer;
 import org.opendaylight.protocol.util.Util;
 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.yangtools.yang.binding.DataContainer;
 
 import com.google.common.base.Preconditions;
@@ -41,7 +43,34 @@ public final class SimpleObjectHandlerRegistry implements ObjectHandlerRegistry
 
        @Override
        public ObjectParser getObjectParser(final int objectClass, final int objectType) {
-               return this.handlers.getParser(createKey(objectClass, objectType));
+               final ObjectParser ret = this.handlers.getParser(createKey(objectClass, objectType));
+               if (ret != null) {
+                       return ret;
+               }
+
+               boolean foundClass = false;
+
+               // FIXME: search the parsers, check classes
+               //e.getError() == PCEPErrors.UNRECOGNIZED_OBJ_CLASS || e.getError() == PCEPErrors.UNRECOGNIZED_OBJ_TYPE
+
+               if (!foundClass) {
+                       return new ObjectParser() {
+                               @Override
+                               public Object parseObject(final ObjectHeader header, final byte[] buffer) {
+                                       // FIXME: appropriate error (unrecognized object class)
+                                       return new UnknownObject(null);
+                               }
+                       };
+
+               } else {
+                       return new ObjectParser() {
+                               @Override
+                               public Object parseObject(final ObjectHeader header, final byte[] buffer) {
+                                       // FIXME: appropriate error (unrecognized object type)
+                                       return new UnknownObject(null);
+                               }
+                       };
+               }
        }
 
        @Override