X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=bgp%2Fparser-spi%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fprotocol%2Fbgp%2Fparser%2Fspi%2Fpojo%2FSimpleBGPExtensionProviderContext.java;h=363a932a2ed7c321e34a141f276badea66aecdba;hb=9c40c9c560a5417c59fa67f6e7aafda7281af4db;hp=e568f590d8a45793df168f8fab767e04029a55ea;hpb=e839341f0730816c55fec9313929f03b74262276;p=bgpcep.git diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleBGPExtensionProviderContext.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleBGPExtensionProviderContext.java index e568f590d8..363a932a2e 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleBGPExtensionProviderContext.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleBGPExtensionProviderContext.java @@ -7,83 +7,163 @@ */ package org.opendaylight.protocol.bgp.parser.spi.pojo; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import java.util.concurrent.atomic.AtomicReference; import org.opendaylight.protocol.bgp.parser.spi.AttributeParser; import org.opendaylight.protocol.bgp.parser.spi.AttributeSerializer; import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext; +import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvParser; +import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvSerializer; import org.opendaylight.protocol.bgp.parser.spi.CapabilityParser; import org.opendaylight.protocol.bgp.parser.spi.CapabilitySerializer; import org.opendaylight.protocol.bgp.parser.spi.MessageParser; import org.opendaylight.protocol.bgp.parser.spi.MessageSerializer; +import org.opendaylight.protocol.bgp.parser.spi.NextHopParserSerializer; import org.opendaylight.protocol.bgp.parser.spi.NlriParser; import org.opendaylight.protocol.bgp.parser.spi.NlriSerializer; import org.opendaylight.protocol.bgp.parser.spi.ParameterParser; import org.opendaylight.protocol.bgp.parser.spi.ParameterSerializer; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParameters; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.CParameters; +import org.opendaylight.protocol.bgp.parser.spi.extended.community.ExtendedCommunityParser; +import org.opendaylight.protocol.bgp.parser.spi.extended.community.ExtendedCommunitySerializer; +import org.opendaylight.protocol.util.ReferenceCache; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.BgpParameters; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.ExtendedCommunity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.Notification; -public final class SimpleBGPExtensionProviderContext extends SimpleBGPExtensionConsumerContext implements BGPExtensionProviderContext { - @Override - public AutoCloseable registerAddressFamily(final Class clazz, final int number) { - return afiReg.registerAddressFamily(clazz, number); - } - - @Override - public AutoCloseable registerAttributeParser(final int attributeType, final AttributeParser parser) { - return attrReg.registerAttributeParser(attributeType, parser); - } - - @Override - public AutoCloseable registerAttributeSerializer(final Class attributeClass, final AttributeSerializer serializer) { - return attrReg.registerAttributeSerializer(attributeClass, serializer); - } - - @Override - public AutoCloseable registerCapabilityParser(final int capabilityType, final CapabilityParser parser) { - return capReg.registerCapabilityParser(capabilityType, parser); - } - - @Override - public AutoCloseable registerCapabilitySerializer(final Class capabilityClass, final CapabilitySerializer serializer) { - return capReg.registerCapabilitySerializer(capabilityClass, serializer); - } - - @Override - public AutoCloseable registerMessageParser(final int messageType, final MessageParser parser) { - return msgReg.registerMessageParser(messageType, parser); - } - - @Override - public AutoCloseable registerMessageSerializer(final Class messageClass, final MessageSerializer serializer) { - return msgReg.registerMessageSerializer(messageClass, serializer); - } - - @Override - public AutoCloseable registerNlriParser(final Class afi, final Class safi, - final NlriParser parser) { - return nlriReg.registerNlriParser(afi, safi, parser); - } - - @Override - public AutoCloseable registerNlriSerializer(final Class nlriClass, final NlriSerializer serializer) { - throw new UnsupportedOperationException("NLRI serialization not implemented"); - } - - @Override - public AutoCloseable registerParameterParser(final int parameterType, final ParameterParser parser) { - return paramReg.registerParameterParser(parameterType, parser); - } - - @Override - public AutoCloseable registerParameterSerializer(final Class paramClass, final ParameterSerializer serializer) { - return paramReg.registerParameterSerializer(paramClass, serializer); - } - - @Override - public AutoCloseable registerSubsequentAddressFamily(final Class clazz, final int number) { - return safiReg.registerSubsequentAddressFamily(clazz, number); - } +public class SimpleBGPExtensionProviderContext extends SimpleBGPExtensionConsumerContext implements BGPExtensionProviderContext { + + public static final int DEFAULT_MAXIMUM_CACHED_OBJECTS = 100000; + + private final AtomicReference> cacheRef; + private final ReferenceCache referenceCache = new ReferenceCache() { + @Override + public T getSharedReference(final T object) { + final Cache cache = SimpleBGPExtensionProviderContext.this.cacheRef.get(); + + @SuppressWarnings("unchecked") + final T ret = (T) cache.getIfPresent(object); + if (ret == null) { + cache.put(object, object); + return object; + } + + return ret; + } + }; + private final int maximumCachedObjects; + + public SimpleBGPExtensionProviderContext() { + this(DEFAULT_MAXIMUM_CACHED_OBJECTS); + } + + public SimpleBGPExtensionProviderContext(final int maximumCachedObjects) { + this.maximumCachedObjects = maximumCachedObjects; + + final Cache cache = CacheBuilder.newBuilder().maximumSize(maximumCachedObjects).build(); + this.cacheRef = new AtomicReference>(cache); + } + + @Override + public AutoCloseable registerAddressFamily(final Class clazz, final int number) { + return this.getAddressFamilyRegistry().registerAddressFamily(clazz, number); + } + + @Override + public AutoCloseable registerAttributeParser(final int attributeType, final AttributeParser parser) { + return this.getAttributeRegistry().registerAttributeParser(attributeType, parser); + } + + @Override + public AutoCloseable registerAttributeSerializer(final Class attributeClass, final AttributeSerializer serializer) { + return this.getAttributeRegistry().registerAttributeSerializer(attributeClass, serializer); + } + + @Override + public AutoCloseable registerCapabilityParser(final int capabilityType, final CapabilityParser parser) { + return this.getCapabilityRegistry().registerCapabilityParser(capabilityType, parser); + } + + @Override + public AutoCloseable registerCapabilitySerializer(final Class capabilityClass, final CapabilitySerializer serializer) { + return this.getCapabilityRegistry().registerCapabilitySerializer(capabilityClass, serializer); + } + + @Override + public AutoCloseable registerMessageParser(final int messageType, final MessageParser parser) { + return this.getMessageRegistry().registerMessageParser(messageType, parser); + } + + @Override + public AutoCloseable registerMessageSerializer(final Class messageClass, final MessageSerializer serializer) { + return this.getMessageRegistry().registerMessageSerializer(messageClass, serializer); + } + + /** + * Each extension requires a specific NextHop handler. Therefore this method has been deprecated for + * the method which enforce user to register it. + */ + @Deprecated + @Override + public AutoCloseable registerNlriParser(final Class afi, final Class safi, final NlriParser parser) { + return this.getNlriRegistry().registerNlriParser(afi, safi, parser, null, null); + } + + @Override + public AutoCloseable registerNlriParser(final Class afi, final Class safi, + final NlriParser parser, final NextHopParserSerializer nextHopParserSerializer, final Class cNextHopClass, final Class... cNextHopClassList) { + return this.getNlriRegistry().registerNlriParser(afi, safi, parser, nextHopParserSerializer, cNextHopClass); + } + + @Override + public AutoCloseable registerNlriSerializer(final Class nlriClass, final NlriSerializer serializer) { + return this.getNlriRegistry().registerNlriSerializer(nlriClass, serializer); + } + + @Override + public AutoCloseable registerParameterParser(final int parameterType, final ParameterParser parser) { + return this.getParameterRegistry().registerParameterParser(parameterType, parser); + } + + @Override + public AutoCloseable registerParameterSerializer(final Class paramClass, final ParameterSerializer serializer) { + return this.getParameterRegistry().registerParameterSerializer(paramClass, serializer); + } + + @Override + public AutoCloseable registerSubsequentAddressFamily(final Class clazz, final int number) { + return this.getSubsequentAddressFamilyRegistry().registerSubsequentAddressFamily(clazz, number); + } + + @Override + public ReferenceCache getReferenceCache() { + return this.referenceCache; + } + + @Override + public AutoCloseable registerExtendedCommunitySerializer(final Class extendedCommunityClass, + final ExtendedCommunitySerializer serializer) { + return this.getExtendedCommunityReistry().registerExtendedCommunitySerializer(extendedCommunityClass, serializer); + } + + @Override + public AutoCloseable registerExtendedCommunityParser(final int type, final int subtype, final ExtendedCommunityParser parser) { + return this.getExtendedCommunityReistry().registerExtendedCommunityParser(type, subtype, parser); + } + + @Override + public AutoCloseable registerBgpPrefixSidTlvParser(final int tlvType, final BgpPrefixSidTlvParser parser) { + return this.getBgpPrefixSidTlvRegistry().registerBgpPrefixSidTlvParser(tlvType, parser); + } + + @Override + public AutoCloseable registerBgpPrefixSidTlvSerializer(final Class tlvClass, final BgpPrefixSidTlvSerializer serializer) { + return this.getBgpPrefixSidTlvRegistry().registerBgpPrefixSidTlvSerializer(tlvClass, serializer); + } }