From d7652fb4ef69e193b271e39e864228b033bba8bc Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 20 Nov 2013 16:19:17 +0100 Subject: [PATCH] Rework parser infrastructure to support partial message processing Change-Id: Iebb10ef8b3b90c99d12bd0ea71aaa81e95e8c3e8 Signed-off-by: Robert Varga --- .../pcep/impl/PCEPMessageFactory.java | 15 +- .../impl/message/AbstractMessageParser.java | 46 +- .../impl/message/PCEPCloseMessageParser.java | 11 +- .../impl/message/PCEPErrorMessageParser.java | 28 +- .../message/PCEPKeepAliveMessageParser.java | 18 +- .../PCEPNotificationMessageParser.java | 15 +- .../impl/message/PCEPOpenMessageParser.java | 17 +- .../impl/message/PCEPReplyMessageParser.java | 28 +- .../impl/message/PCEPReportMessageParser.java | 18 +- .../message/PCEPRequestMessageParser.java | 494 +++++++++--------- .../PCEPUpdateRequestMessageParser.java | 18 +- .../impl/message/PcinitiateMessageParser.java | 10 +- .../object/PCEPClassTypeObjectParser.java | 10 +- .../object/PCEPEndPointsObjectParser.java | 8 +- .../impl/object/PCEPOpenObjectParser.java | 7 +- .../PCEPRequestParameterObjectParser.java | 14 +- .../pcep/impl/object/PCEPSrpObjectParser.java | 12 +- .../protocol/pcep/impl/PCEPValidatorTest.java | 38 +- .../protocol/pcep/spi/MessageParser.java | 5 +- .../protocol/pcep/spi/ObjectParser.java | 3 +- .../spi/pojo/SimpleObjectHandlerRegistry.java | 31 +- 21 files changed, 406 insertions(+), 440 deletions(-) diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/PCEPMessageFactory.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/PCEPMessageFactory.java index d348d72ba8..627b167360 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/PCEPMessageFactory.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/PCEPMessageFactory.java @@ -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 + (msgLength - COMMON_HEADER_LENGTH)); } + final List 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; } diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/AbstractMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/AbstractMessageParser.java index 66dd3fcf8e..83504e0436 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/AbstractMessageParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/AbstractMessageParser.java @@ -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 parseObjects(final byte[] bytes) throws PCEPDeserializerException, PCEPDocumentedException { + protected final List parseObjects(final byte[] bytes) throws PCEPDeserializerException { int offset = 0; final List 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 objects, final List errors) throws PCEPDeserializerException, PCEPDocumentedException; + + @Override + public final Message parseMessage(final byte[] buffer, final List errors) throws PCEPDeserializerException { + Preconditions.checkNotNull(buffer, "Buffer may not be null"); + + // Parse objects first + final List 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; + } + } } diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPCloseMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPCloseMessageParser.java index d4cd181872..1a166cd4e7 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPCloseMessageParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPCloseMessageParser.java @@ -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 objs = parseObjects(buffer); - return validate(objs); - } - - private Close validate(final List objects) throws PCEPDeserializerException { + protected Close validate(final List objects, final List errors) throws PCEPDeserializerException { if (objects == null) { throw new IllegalArgumentException("Passed list can't be null."); } diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPErrorMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPErrorMessageParser.java index 3091a9c7a8..94f908815b 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPErrorMessageParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPErrorMessageParser.java @@ -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 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 objects) throws PCEPDeserializerException, PCEPDocumentedException { + protected PcerrMessage validate(final List objects, final List 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 requestParameters = Lists.newArrayList(); final List errorObjects = Lists.newArrayList(); final PcerrMessageBuilder b = new PcerrMessageBuilder(); diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPKeepAliveMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPKeepAliveMessageParser.java index accfb46d19..6c8e6dc6cc 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPKeepAliveMessageParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPKeepAliveMessageParser.java @@ -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 objects, final List errors) throws PCEPDeserializerException { + // FIXME: keepalive shouldn't have objects + + return MESSAGE; } } diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPNotificationMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPNotificationMessageParser.java index 248869dcf9..068e25a91d 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPNotificationMessageParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPNotificationMessageParser.java @@ -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 objs = parseObjects(buffer); - - return validate(objs); - } - - public Message validate(final List objects) throws PCEPDeserializerException { + protected Message validate(final List objects, final List 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 compositeNotifications = Lists.newArrayList(); diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPOpenMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPOpenMessageParser.java index 675bc25bbc..339943303f 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPOpenMessageParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPOpenMessageParser.java @@ -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 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 objects) throws PCEPDeserializerException { + protected org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Open validate(final List objects, final List 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 diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPReplyMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPReplyMessageParser.java index 3ef912b51d..cdbc59ef36 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPReplyMessageParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPReplyMessageParser.java @@ -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 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 objects) throws PCEPDocumentedException { + protected Pcrep validate(final List objects, final List errors) throws PCEPDocumentedException { final List replies = Lists.newArrayList(); while (!objects.isEmpty()) { replies.add(this.getValidReply(objects)); diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPReportMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPReportMessageParser.java index 66a9f725b7..b59ce68bcf 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPReportMessageParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPReportMessageParser.java @@ -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 objs = parseObjects(buffer); - return validate(objs); - } catch (final PCEPDocumentedException e) { - return createErrorMsg(e.getError()); - } - } - - public Message validate(final List objects) throws PCEPDeserializerException, PCEPDocumentedException { + public Message validate(final List objects, final List 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 = Lists.newArrayList(); while (!objects.isEmpty()) { diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPRequestMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPRequestMessageParser.java index 3c2599b65c..137950664a 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPRequestMessageParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPRequestMessageParser.java @@ -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 objects, + final List errors) throws PCEPDeserializerException { + // if (objects == null) + // throw new IllegalArgumentException("Passed list can't be null."); + // + // final List msgs = Lists.newArrayList(); + // final List svecList = new ArrayList(); + // + // 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 requests = new ArrayList(); + // 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 metrics = new ArrayList(); + // 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 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 metrics = new ArrayList(); + // + // 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 validate(final List objects) { - // if (objects == null) - // throw new IllegalArgumentException("Passed list can't be null."); - // - // final List msgs = Lists.newArrayList(); - // final List svecList = new ArrayList(); - // - // 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 requests = new ArrayList(); - // 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 metrics = new ArrayList(); - // 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 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 metrics = new ArrayList(); - // - // 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; diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPUpdateRequestMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPUpdateRequestMessageParser.java index 32c617792d..ca0ba404e6 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPUpdateRequestMessageParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPUpdateRequestMessageParser.java @@ -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 objs = parseObjects(buffer); - return validate(objs); - } catch (final PCEPDocumentedException e) { - return createErrorMsg(e.getError()); - } - } - - public Message validate(final List objects) throws PCEPDeserializerException, PCEPDocumentedException { + protected Message validate(final List objects, final List 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 updateRequests = Lists.newArrayList(); while (!objects.isEmpty()) { diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PcinitiateMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PcinitiateMessageParser.java index b31b969c19..d804f79029 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PcinitiateMessageParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PcinitiateMessageParser.java @@ -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 objs = parseObjects(buffer); - return validate(objs); - } - - public Message validate(final List objects) throws PCEPDeserializerException { + protected Message validate(final List objects, final List errors) throws PCEPDeserializerException { if (objects == null) { throw new IllegalArgumentException("Passed list can't be null."); } diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPClassTypeObjectParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPClassTypeObjectParser.java index e1dd4ad879..34fd29873c 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPClassTypeObjectParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPClassTypeObjectParser.java @@ -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 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(); } diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPEndPointsObjectParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPEndPointsObjectParser.java index 95dd74a0ab..cd513db0ca 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPEndPointsObjectParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPEndPointsObjectParser.java @@ -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 AbstractObjectWithTlvsParseremptyList())); 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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.emptyList())); buf = Unpooled.buffer(result.length); parser.serializeMessage(new PcerrBuilder().setPcerrMessage(builder.build()).build(), buf); assertArrayEquals(result, buf.array()); diff --git a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/MessageParser.java b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/MessageParser.java index e5db62769c..eac072aeae 100644 --- a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/MessageParser.java +++ b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/MessageParser.java @@ -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 errors) throws PCEPDeserializerException; } diff --git a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/ObjectParser.java b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/ObjectParser.java index 2c0e3d6f07..8fa3a4fe99 100644 --- a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/ObjectParser.java +++ b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/ObjectParser.java @@ -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; } diff --git a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/pojo/SimpleObjectHandlerRegistry.java b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/pojo/SimpleObjectHandlerRegistry.java index 7452e37578..6d7a7121c4 100644 --- a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/pojo/SimpleObjectHandlerRegistry.java +++ b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/pojo/SimpleObjectHandlerRegistry.java @@ -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 -- 2.36.6