Clean up ShortestPathFirst
[bgpcep.git] / bgp / extensions / linkstate / src / main / java / org / opendaylight / protocol / bgp / linkstate / impl / nlri / LinkstateNlriParser.java
index 34dd3669287396b388b81d85a5d7926013d13bea..17df17b8d18b2789a1fa5145b8b8059f1ec18d7e 100644 (file)
@@ -9,10 +9,8 @@ package org.opendaylight.protocol.bgp.linkstate.impl.nlri;
 
 import com.google.common.annotations.VisibleForTesting;
 import io.netty.buffer.ByteBuf;
-import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Optional;
 import org.opendaylight.bgp.concepts.RouteDistinguisherUtil;
 import org.opendaylight.protocol.bgp.linkstate.spi.AbstractTeLspNlriCodec;
 import org.opendaylight.protocol.bgp.linkstate.spi.pojo.SimpleNlriTypeRegistry;
@@ -20,38 +18,37 @@ import org.opendaylight.protocol.bgp.parser.BGPParsingException;
 import org.opendaylight.protocol.bgp.parser.spi.NlriParser;
 import org.opendaylight.protocol.bgp.parser.spi.NlriSerializer;
 import org.opendaylight.protocol.bgp.parser.spi.PeerSpecificParserConstraint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.Identifier;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.ProtocolId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.ObjectType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.destination.CLinkstateDestination;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.destination.CLinkstateDestinationBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.LinkCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.NodeCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.PrefixCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.link._case.LinkDescriptors;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.link._case.LocalNodeDescriptors;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.link._case.RemoteNodeDescriptors;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.node._case.NodeDescriptors;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.prefix._case.AdvertisingNodeDescriptors;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.prefix._case.PrefixDescriptors;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.update.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationLinkstateCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.update.attributes.mp.reach.nlri.advertized.routes.destination.type.destination.linkstate._case.DestinationLinkstateBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.Attributes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.Attributes1;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.Attributes2;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpReachNlriBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.MpUnreachNlriBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.mp.reach.nlri.AdvertizedRoutes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.mp.reach.nlri.AdvertizedRoutesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.mp.unreach.nlri.WithdrawnRoutes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.update.attributes.mp.unreach.nlri.WithdrawnRoutesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.Identifier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.ProtocolId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.ObjectType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.destination.CLinkstateDestination;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.destination.CLinkstateDestinationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.object.type.LinkCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.object.type.NodeCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.object.type.PrefixCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.object.type.link._case.LinkDescriptors;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.object.type.link._case.LocalNodeDescriptors;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.object.type.link._case.RemoteNodeDescriptors;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.object.type.node._case.NodeDescriptors;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.object.type.prefix._case.AdvertisingNodeDescriptors;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.object.type.prefix._case.PrefixDescriptors;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.update.attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationLinkstateCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.update.attributes.mp.reach.nlri.advertized.routes.destination.type.destination.linkstate._case.DestinationLinkstateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.update.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.path.attributes.Attributes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.AttributesReach;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.AttributesUnreach;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.attributes.reach.MpReachNlriBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.attributes.reach.mp.reach.nlri.AdvertizedRoutes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.attributes.reach.mp.reach.nlri.AdvertizedRoutesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.attributes.unreach.MpUnreachNlriBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.attributes.unreach.mp.unreach.nlri.WithdrawnRoutes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.attributes.unreach.mp.unreach.nlri.WithdrawnRoutesBuilder;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.Uint64;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -63,29 +60,29 @@ public final class LinkstateNlriParser implements NlriParser, NlriSerializer {
     private static final Logger LOG = LoggerFactory.getLogger(LinkstateNlriParser.class);
 
     @VisibleForTesting
-    public static final NodeIdentifier OBJECT_TYPE_NID = new NodeIdentifier(ObjectType.QNAME);
+    public static final NodeIdentifier OBJECT_TYPE_NID = NodeIdentifier.create(ObjectType.QNAME);
     @VisibleForTesting
-    public static final NodeIdentifier NODE_DESCRIPTORS_NID = new NodeIdentifier(NodeDescriptors.QNAME);
+    public static final NodeIdentifier NODE_DESCRIPTORS_NID = NodeIdentifier.create(NodeDescriptors.QNAME);
     @VisibleForTesting
-    public static final NodeIdentifier LOCAL_NODE_DESCRIPTORS_NID = new NodeIdentifier(LocalNodeDescriptors.QNAME);
+    public static final NodeIdentifier LOCAL_NODE_DESCRIPTORS_NID = NodeIdentifier.create(LocalNodeDescriptors.QNAME);
     @VisibleForTesting
-    public static final NodeIdentifier REMOTE_NODE_DESCRIPTORS_NID = new NodeIdentifier(RemoteNodeDescriptors.QNAME);
+    public static final NodeIdentifier REMOTE_NODE_DESCRIPTORS_NID = NodeIdentifier.create(RemoteNodeDescriptors.QNAME);
     @VisibleForTesting
-    public static final NodeIdentifier ADVERTISING_NODE_DESCRIPTORS_NID
-            = new NodeIdentifier(AdvertisingNodeDescriptors.QNAME);
+    public static final NodeIdentifier ADVERTISING_NODE_DESCRIPTORS_NID = NodeIdentifier.create(
+        AdvertisingNodeDescriptors.QNAME);
     @VisibleForTesting
-    public static final NodeIdentifier PREFIX_DESCRIPTORS_NID = new NodeIdentifier(PrefixDescriptors.QNAME);
+    public static final NodeIdentifier PREFIX_DESCRIPTORS_NID = NodeIdentifier.create(PrefixDescriptors.QNAME);
     @VisibleForTesting
-    public static final NodeIdentifier LINK_DESCRIPTORS_NID = new NodeIdentifier(LinkDescriptors.QNAME);
+    public static final NodeIdentifier LINK_DESCRIPTORS_NID = NodeIdentifier.create(LinkDescriptors.QNAME);
     @VisibleForTesting
-    public static final NodeIdentifier PROTOCOL_ID_NID = new NodeIdentifier(
-            QName.create(CLinkstateDestination.QNAME.getModule(), "protocol-id"));
+    public static final NodeIdentifier PROTOCOL_ID_NID = NodeIdentifier.create(
+            QName.create(CLinkstateDestination.QNAME.getModule(), "protocol-id").intern());
     @VisibleForTesting
-    public static final NodeIdentifier IDENTIFIER_NID = new NodeIdentifier(
-            QName.create(CLinkstateDestination.QNAME.getModule(), "identifier"));
+    public static final NodeIdentifier IDENTIFIER_NID = NodeIdentifier.create(
+            QName.create(CLinkstateDestination.QNAME.getModule(), "identifier").intern());
     @VisibleForTesting
-    private static final NodeIdentifier DISTINGUISHER_NID = new NodeIdentifier(
-            QName.create(CLinkstateDestination.QNAME.getModule(), "route-distinguisher"));
+    private static final NodeIdentifier DISTINGUISHER_NID = NodeIdentifier.create(
+            QName.create(CLinkstateDestination.QNAME.getModule(), "route-distinguisher").intern());
     private final SimpleNlriTypeRegistry nlriTypeReg = SimpleNlriTypeRegistry.getInstance();
 
 
@@ -98,7 +95,7 @@ public final class LinkstateNlriParser implements NlriParser, NlriSerializer {
     private List<CLinkstateDestination> parseNlri(final ByteBuf nlri) {
         final List<CLinkstateDestination> dests = new ArrayList<>();
         while (nlri.isReadable()) {
-            final CLinkstateDestination destination = this.nlriTypeReg.parseNlriType(nlri);
+            final CLinkstateDestination destination = nlriTypeReg.parseNlriType(nlri);
             if (destination == null) {
                 continue;
             }
@@ -116,10 +113,10 @@ public final class LinkstateNlriParser implements NlriParser, NlriSerializer {
         final List<CLinkstateDestination> dst = parseNlri(nlri);
 
         builder.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setDestinationType(
-                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.update
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.update
                         .attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCaseBuilder()
                         .setDestinationLinkstate(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang
-                                .bgp.linkstate.rev180329.update.attributes.mp.unreach.nlri.withdrawn.routes.destination
+                                .bgp.linkstate.rev200120.update.attributes.mp.unreach.nlri.withdrawn.routes.destination
                                 .type.destination.linkstate._case.DestinationLinkstateBuilder()
                                 .setCLinkstateDestination(dst).build()).build()).build());
     }
@@ -139,8 +136,8 @@ public final class LinkstateNlriParser implements NlriParser, NlriSerializer {
 
     @Override
     public void serializeAttribute(final Attributes pathAttributes, final ByteBuf byteAggregator) {
-        final Attributes1 pathAttributes1 = pathAttributes.augmentation(Attributes1.class);
-        final Attributes2 pathAttributes2 = pathAttributes.augmentation(Attributes2.class);
+        final AttributesReach pathAttributes1 = pathAttributes.augmentation(AttributesReach.class);
+        final AttributesUnreach pathAttributes2 = pathAttributes.augmentation(AttributesUnreach.class);
         if (pathAttributes1 != null) {
             serializeAdvertisedRoutes(pathAttributes1.getMpReachNlri().getAdvertizedRoutes(), byteAggregator);
         } else if (pathAttributes2 != null) {
@@ -152,9 +149,9 @@ public final class LinkstateNlriParser implements NlriParser, NlriSerializer {
         if (withdrawnRoutes != null && withdrawnRoutes.getDestinationType() instanceof DestinationLinkstateCase) {
             final DestinationLinkstateCase linkstateCase
                     = (DestinationLinkstateCase) withdrawnRoutes.getDestinationType();
-            for (final CLinkstateDestination cLinkstateDestination : linkstateCase.getDestinationLinkstate()
+            for (final CLinkstateDestination linkstateDestinationCase : linkstateCase.getDestinationLinkstate()
                     .getCLinkstateDestination()) {
-                this.nlriTypeReg.serializeNlriType(cLinkstateDestination, byteAggregator);
+                nlriTypeReg.serializeNlriType(linkstateDestinationCase, byteAggregator);
             }
         }
     }
@@ -162,126 +159,103 @@ public final class LinkstateNlriParser implements NlriParser, NlriSerializer {
     private void serializeAdvertisedRoutes(final AdvertizedRoutes advertizedRoutes, final ByteBuf byteAggregator) {
         if (advertizedRoutes != null && advertizedRoutes.getDestinationType()
                 instanceof
-                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.update
+                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.update
                         .attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationLinkstateCase) {
-            final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.update
+            final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.update
                     .attributes.mp.reach.nlri.advertized.routes.destination.type.DestinationLinkstateCase
-                    linkstateCase = (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate
-                    .rev180329.update.attributes.mp.reach.nlri.advertized.routes.destination.type
-                    .DestinationLinkstateCase) advertizedRoutes.getDestinationType();
+                    linkstateCase = (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang
+                        .bgp.linkstate.rev200120.update.attributes.mp.reach.nlri.advertized.routes.destination.type
+                        .DestinationLinkstateCase) advertizedRoutes.getDestinationType();
 
-            for (final CLinkstateDestination cLinkstateDestination : linkstateCase.getDestinationLinkstate()
-                    .getCLinkstateDestination()) {
-                this.nlriTypeReg.serializeNlriType(cLinkstateDestination, byteAggregator);
+            for (var linkstateDestinationCase : linkstateCase.getDestinationLinkstate().getCLinkstateDestination()) {
+                nlriTypeReg.serializeNlriType(linkstateDestinationCase, byteAggregator);
             }
         }
     }
 
     // FIXME : use codec
     private static int domProtocolIdValue(final String protocolId) {
-        switch (protocolId) {
-        case "isis-level1":
-            return ProtocolId.IsisLevel1.getIntValue();
-        case "isis-level2":
-            return ProtocolId.IsisLevel2.getIntValue();
-        case "ospf":
-            return ProtocolId.Ospf.getIntValue();
-        case "direct":
-            return ProtocolId.Direct.getIntValue();
-        case "static":
-            return ProtocolId.Static.getIntValue();
-        case "ospf-v3":
-            return ProtocolId.OspfV3.getIntValue();
-        case "rsvp-te":
-            return ProtocolId.RsvpTe.getIntValue();
-        case "bgp-epe":
-            return ProtocolId.BgpEpe.getIntValue();
-        case "segment-routing":
-            return ProtocolId.SegmentRouting.getIntValue();
-        default:
-            return 0;
-        }
+        return switch (protocolId) {
+            case "isis-level1" -> ProtocolId.IsisLevel1.getIntValue();
+            case "isis-level2" -> ProtocolId.IsisLevel2.getIntValue();
+            case "ospf" -> ProtocolId.Ospf.getIntValue();
+            case "direct" -> ProtocolId.Direct.getIntValue();
+            case "static" -> ProtocolId.Static.getIntValue();
+            case "ospf-v3" -> ProtocolId.OspfV3.getIntValue();
+            case "rsvp-te" -> ProtocolId.RsvpTe.getIntValue();
+            case "bgp-epe" -> ProtocolId.BgpEpe.getIntValue();
+            case "segment-routing" -> ProtocolId.SegmentRouting.getIntValue();
+            default -> 0;
+        };
     }
 
-    public static CLinkstateDestination extractLinkstateDestination(
-            final DataContainerNode<? extends PathArgument> linkstate) {
-        final CLinkstateDestinationBuilder builder = new CLinkstateDestinationBuilder();
-        serializeCommonParts(builder, linkstate);
-
-        final ChoiceNode objectType = (ChoiceNode) linkstate.getChild(OBJECT_TYPE_NID).get();
-        if (objectType.getChild(ADVERTISING_NODE_DESCRIPTORS_NID).isPresent()) {
-            serializeAdvertisedNodeDescriptor(builder, objectType);
-        } else if (objectType.getChild(LOCAL_NODE_DESCRIPTORS_NID).isPresent()) {
-            serializeLocalNodeDescriptor(builder, objectType);
-        } else if (objectType.getChild(NODE_DESCRIPTORS_NID).isPresent()) {
-            serializeNodeDescriptor(builder, objectType);
-        } else if (AbstractTeLspNlriCodec.isTeLsp(objectType)) {
-            builder.setObjectType(AbstractTeLspNlriCodec.serializeTeLsp(objectType));
-        } else {
-            LOG.warn("Unknown Object Type: {}.", objectType);
+    public static CLinkstateDestination extractLinkstateDestination(final DataContainerNode linkstate) {
+        final var builder = new CLinkstateDestinationBuilder()
+            .setRouteDistinguisher(RouteDistinguisherUtil.extractRouteDistinguisher(linkstate, DISTINGUISHER_NID));
+        final var protocolId = linkstate.childByArg(PROTOCOL_ID_NID);
+        if (protocolId != null) {
+            // DOM representation contains values as are in the model, not as are in generated enum
+            builder.setProtocolId(ProtocolId.forValue(domProtocolIdValue((String) protocolId.body())));
+        }
+        final var identifier = linkstate.childByArg(IDENTIFIER_NID);
+        if (identifier != null) {
+            builder.setIdentifier(new Identifier((Uint64) identifier.body()));
         }
-        return builder.build();
-    }
 
-    private static void serializeNodeDescriptor(final CLinkstateDestinationBuilder builder,
-            final ChoiceNode objectType) {
-        final NodeCaseBuilder nodeBuilder = new NodeCaseBuilder();
-        // node descriptors
-        nodeBuilder.setNodeDescriptors(NodeNlriParser
-                .serializeNodeDescriptors((ContainerNode) objectType.getChild(NODE_DESCRIPTORS_NID).get()));
-        builder.setObjectType(nodeBuilder.build());
+        return builder
+            .setObjectType(serializeObjectType((ChoiceNode) linkstate.getChildByArg(OBJECT_TYPE_NID)))
+            .build();
     }
 
-    private static void serializeLocalNodeDescriptor(final CLinkstateDestinationBuilder builder,
-            final ChoiceNode objectType) {
-        // link local node descriptors
-        final LinkCaseBuilder linkBuilder = new LinkCaseBuilder();
+    private static ObjectType serializeObjectType(final ChoiceNode objectType) {
+        final var advNode = objectType.childByArg(ADVERTISING_NODE_DESCRIPTORS_NID);
+        if (advNode != null) {
+            // prefix node descriptors
+            final var builder = new PrefixCaseBuilder()
+                .setAdvertisingNodeDescriptors(NodeNlriParser.serializeAdvNodeDescriptors((ContainerNode) advNode));
 
-        linkBuilder.setLocalNodeDescriptors(NodeNlriParser.serializeLocalNodeDescriptors((ContainerNode) objectType
-                .getChild(LOCAL_NODE_DESCRIPTORS_NID).get()));
-        // link remote node descriptors
-        if (objectType.getChild(REMOTE_NODE_DESCRIPTORS_NID).isPresent()) {
-            linkBuilder.setRemoteNodeDescriptors(NodeNlriParser
-                    .serializeRemoteNodeDescriptors((ContainerNode) objectType.getChild(REMOTE_NODE_DESCRIPTORS_NID)
-                            .get()));
+            // prefix descriptors
+            final var prefix = objectType.childByArg(PREFIX_DESCRIPTORS_NID);
+            if (prefix != null) {
+                builder.setPrefixDescriptors(
+                    AbstractPrefixNlriParser.serializePrefixDescriptors((ContainerNode) prefix));
+            }
+            return builder.build();
         }
-        // link descriptors
-        final Optional<DataContainerChild<? extends PathArgument, ?>> linkDescriptors
-                = objectType.getChild(LINK_DESCRIPTORS_NID);
-        linkDescriptors.ifPresent(dataContainerChild -> linkBuilder.setLinkDescriptors(LinkNlriParser
-                .serializeLinkDescriptors((ContainerNode) dataContainerChild)));
-        builder.setObjectType(linkBuilder.build());
-    }
 
-    private static void serializeAdvertisedNodeDescriptor(final CLinkstateDestinationBuilder builder,
-            final ChoiceNode objectType) {
-        // prefix node descriptors
-        final PrefixCaseBuilder prefixBuilder = new PrefixCaseBuilder();
-        prefixBuilder.setAdvertisingNodeDescriptors(NodeNlriParser
-                .serializeAdvNodeDescriptors((ContainerNode) objectType.getChild(ADVERTISING_NODE_DESCRIPTORS_NID)
-                        .get()));
+        final var localNode = objectType.childByArg(LOCAL_NODE_DESCRIPTORS_NID);
+        if (localNode != null) {
+            // link local node descriptors
+            final var builder = new LinkCaseBuilder()
+                .setLocalNodeDescriptors(NodeNlriParser.serializeLocalNodeDescriptors((ContainerNode) localNode));
+            // link remote node descriptors
+            final var remoteNode = objectType.childByArg(REMOTE_NODE_DESCRIPTORS_NID);
+            if (remoteNode != null) {
+                builder.setRemoteNodeDescriptors(
+                    NodeNlriParser.serializeRemoteNodeDescriptors((ContainerNode) remoteNode));
+            }
+            // link descriptors
+            final var link = objectType.childByArg(LINK_DESCRIPTORS_NID);
+            if (link != null) {
+                builder.setLinkDescriptors(LinkNlriParser.serializeLinkDescriptors((ContainerNode) link));
+            }
+            return builder.build();
+        }
 
-        // prefix descriptors
-        final Optional<DataContainerChild<? extends PathArgument, ?>> prefixDescriptors
-                = objectType.getChild(PREFIX_DESCRIPTORS_NID);
-        prefixDescriptors.ifPresent(dataContainerChild -> prefixBuilder.setPrefixDescriptors(AbstractPrefixNlriParser
-                .serializePrefixDescriptors((ContainerNode) dataContainerChild)));
-        builder.setObjectType(prefixBuilder.build());
-    }
+        final var node = objectType.childByArg(NODE_DESCRIPTORS_NID);
+        if (node != null) {
+            // node descriptors
+            return new NodeCaseBuilder()
+                .setNodeDescriptors(NodeNlriParser.serializeNodeDescriptors((ContainerNode) node))
+                .build();
+        }
+
+        final var teLsp = AbstractTeLspNlriCodec.serializeObjectType(objectType);
+        if (teLsp != null) {
+            return teLsp;
+        }
 
-    private static void serializeCommonParts(final CLinkstateDestinationBuilder builder,
-            final DataContainerNode<? extends PathArgument> linkstate) {
-        // serialize common parts
-        final Optional<DataContainerChild<? extends PathArgument, ?>> distinguisher
-                = linkstate.getChild(DISTINGUISHER_NID);
-        distinguisher.ifPresent(dataContainerChild -> builder.setRouteDistinguisher(RouteDistinguisherUtil
-                .parseRouteDistinguisher(dataContainerChild.getValue())));
-        final Optional<DataContainerChild<? extends PathArgument, ?>> protocolId = linkstate.getChild(PROTOCOL_ID_NID);
-        // DOM representation contains values as are in the model, not as are in generated enum
-        protocolId.ifPresent(dataContainerChild -> builder.setProtocolId(ProtocolId
-                .forValue(domProtocolIdValue((String) dataContainerChild.getValue()))));
-        final Optional<DataContainerChild<? extends PathArgument, ?>> identifier = linkstate.getChild(IDENTIFIER_NID);
-        identifier.ifPresent(dataContainerChild -> builder
-                .setIdentifier(new Identifier((BigInteger) dataContainerChild.getValue())));
+        LOG.warn("Ignoring unknown Object Type: {}.", objectType);
+        return null;
     }
 }