import org.opendaylight.yangtools.yang.binding.Notification;
public class SimpleBGPExtensionProviderContext extends SimpleBGPExtensionConsumerContext implements BGPExtensionProviderContext {
+
public static final int DEFAULT_MAXIMUM_CACHED_OBJECTS = 100000;
private final AtomicReference<Cache<Object, Object>> cacheRef;
private final ReferenceCache referenceCache = new ReferenceCache() {
@Override
public <T> T getSharedReference(final T object) {
- final Cache<Object, Object> cache = cacheRef.get();
+ final Cache<Object, Object> cache = SimpleBGPExtensionProviderContext.this.cacheRef.get();
@SuppressWarnings("unchecked")
final T ret = (T) cache.getIfPresent(object);
this.maximumCachedObjects = maximumCachedObjects;
final Cache<Object, Object> cache = CacheBuilder.newBuilder().maximumSize(maximumCachedObjects).build();
- cacheRef = new AtomicReference<Cache<Object, Object>>(cache);
+ this.cacheRef = new AtomicReference<Cache<Object,Object>>(cache);
}
@Override
public AutoCloseable registerAddressFamily(final Class<? extends AddressFamily> clazz, final int number) {
- return afiReg.registerAddressFamily(clazz, number);
+ return this.afiReg.registerAddressFamily(clazz, number);
}
@Override
public AutoCloseable registerAttributeParser(final int attributeType, final AttributeParser parser) {
- return attrReg.registerAttributeParser(attributeType, parser);
+ return this.attrReg.registerAttributeParser(attributeType, parser);
}
@Override
public AutoCloseable registerAttributeSerializer(final Class<? extends DataObject> attributeClass, final AttributeSerializer serializer) {
- return attrReg.registerAttributeSerializer(attributeClass, serializer);
+ return this.attrReg.registerAttributeSerializer(attributeClass, serializer);
}
@Override
public AutoCloseable registerCapabilityParser(final int capabilityType, final CapabilityParser parser) {
- return capReg.registerCapabilityParser(capabilityType, parser);
+ return this.capReg.registerCapabilityParser(capabilityType, parser);
}
@Override
- public AutoCloseable registerCapabilitySerializer(final Class<? extends CParameters> capabilityClass,
- final CapabilitySerializer serializer) {
- return capReg.registerCapabilitySerializer(capabilityClass, serializer);
+ public AutoCloseable registerCapabilitySerializer(final Class<? extends CParameters> capabilityClass, final CapabilitySerializer serializer) {
+ return this.capReg.registerCapabilitySerializer(capabilityClass, serializer);
}
@Override
public AutoCloseable registerMessageParser(final int messageType, final MessageParser parser) {
- return msgReg.registerMessageParser(messageType, parser);
+ return this.msgReg.registerMessageParser(messageType, parser);
}
@Override
public AutoCloseable registerMessageSerializer(final Class<? extends Notification> messageClass, final MessageSerializer serializer) {
- return msgReg.registerMessageSerializer(messageClass, serializer);
+ return this.msgReg.registerMessageSerializer(messageClass, serializer);
}
@Override
public AutoCloseable registerNlriParser(final Class<? extends AddressFamily> afi, final Class<? extends SubsequentAddressFamily> safi,
final NlriParser parser) {
- return nlriReg.registerNlriParser(afi, safi, parser);
+ return this.nlriReg.registerNlriParser(afi, safi, parser);
}
@Override
public AutoCloseable registerNlriSerializer(final Class<? extends DataObject> nlriClass, final NlriSerializer serializer) {
- throw new UnsupportedOperationException("NLRI serialization not implemented");
+ return this.nlriReg.registerNlriSerializer(nlriClass,serializer);
}
@Override
public AutoCloseable registerParameterParser(final int parameterType, final ParameterParser parser) {
- return paramReg.registerParameterParser(parameterType, parser);
+ return this.paramReg.registerParameterParser(parameterType, parser);
}
@Override
public AutoCloseable registerParameterSerializer(final Class<? extends BgpParameters> paramClass, final ParameterSerializer serializer) {
- return paramReg.registerParameterSerializer(paramClass, serializer);
+ return this.paramReg.registerParameterSerializer(paramClass, serializer);
}
@Override
public AutoCloseable registerSubsequentAddressFamily(final Class<? extends SubsequentAddressFamily> clazz, final int number) {
- return safiReg.registerSubsequentAddressFamily(clazz, number);
+ return this.safiReg.registerSubsequentAddressFamily(clazz, number);
}
@Override
public ReferenceCache getReferenceCache() {
- return referenceCache;
+ return this.referenceCache;
}
public final synchronized int getMaximumCachedObjects() {
- return maximumCachedObjects;
+ return this.maximumCachedObjects;
}
public final synchronized void setMaximumCachedObjects(final int maximumCachedObjects) {
Preconditions.checkArgument(maximumCachedObjects >= 0);
Cache<Object, Object> newCache = CacheBuilder.newBuilder().maximumSize(maximumCachedObjects).build();
- newCache.putAll(cacheRef.get().asMap());
- cacheRef.set(newCache);
+ newCache.putAll(this.cacheRef.get().asMap());
+ this.cacheRef.set(newCache);
}
}
package org.opendaylight.protocol.bgp.parser.spi.pojo;
import com.google.common.base.Preconditions;
+import com.google.common.collect.Iterables;
import com.google.common.primitives.UnsignedBytes;
import io.netty.buffer.ByteBuf;
import org.opendaylight.protocol.bgp.parser.spi.AddressFamilyRegistry;
import org.opendaylight.protocol.bgp.parser.spi.NlriParser;
import org.opendaylight.protocol.bgp.parser.spi.NlriRegistry;
+import org.opendaylight.protocol.bgp.parser.spi.NlriSerializer;
import org.opendaylight.protocol.bgp.parser.spi.SubsequentAddressFamilyRegistry;
import org.opendaylight.protocol.concepts.AbstractRegistration;
import org.opendaylight.protocol.util.ByteArray;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpUnreachNlriBuilder;
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.yangtools.yang.binding.DataObject;
final class SimpleNlriRegistry implements NlriRegistry {
+ private static final int RESERVED = 1;
+
private final ConcurrentMap<BgpTableType, NlriParser> handlers = new ConcurrentHashMap<>();
+ private final ConcurrentMap<Class<? extends DataObject>, NlriSerializer> serializers = new ConcurrentHashMap<>();
private final SubsequentAddressFamilyRegistry safiReg;
private final AddressFamilyRegistry afiReg;
}
private static BgpTableType createKey(final Class<? extends AddressFamily> afi,
- final Class<? extends SubsequentAddressFamily> safi) {
+ final Class<? extends SubsequentAddressFamily> safi) {
Preconditions.checkNotNull(afi);
Preconditions.checkNotNull(safi);
return new BgpTableTypeImpl(afi, safi);
}
+ synchronized AutoCloseable registerNlriSerializer(final Class<? extends DataObject> nlriClass, final NlriSerializer serializer){
+ final NlriParser prev = this.handlers.get(nlriClass);
+ Preconditions.checkState(prev == null, "Serializer already bound to class " + prev);
+
+ this.serializers.put(nlriClass, serializer);
+ final Object lock = this;
+ return new AbstractRegistration() {
+ @Override
+ protected void removeRegistration() {
+ synchronized (lock) {
+ SimpleNlriRegistry.this.serializers.remove(nlriClass);
+ }
+ }
+ };
+ }
+
synchronized AutoCloseable registerNlriParser(final Class<? extends AddressFamily> afi,
- final Class<? extends SubsequentAddressFamily> safi, final NlriParser parser) {
+ final Class<? extends SubsequentAddressFamily> safi, final NlriParser parser) {
final BgpTableType key = createKey(afi, safi);
final NlriParser prev = this.handlers.get(key);
Preconditions.checkState(prev == null, "AFI/SAFI is already bound to parser " + prev);
byteAggregator.writeByte(nextHopBuffer.writerIndex());
byteAggregator.writeBytes(nextHopBuffer);
-
- //TODO how to calculate number of SNPAs Subnetwork Points of Attachment and serialize SNPAs ?
- byteAggregator.writeByte(0);
+ byteAggregator.writeZero(RESERVED);
}
@Override
byteAggregator.writeByte(this.safiReg.numberForClass(mpUnreachNlri.getSafi()));
}
+ @Override
+ public Iterable<NlriSerializer> getSerializers() {
+ return Iterables.unmodifiableIterable(this.serializers.values());
+ }
+
@Override
public MpReachNlri parseMpReach(final ByteBuf buffer) throws BGPParsingException {
final MpReachNlriBuilder builder = new MpReachNlriBuilder();
final int nextHopLength = UnsignedBytes.toInt(buffer.readByte());
final byte[] nextHop = ByteArray.readBytes(buffer, nextHopLength);
- // reserved
- buffer.skipBytes(1);
+ buffer.skipBytes(RESERVED);
final ByteBuf nlri = buffer.slice();
parser.parseNlri(nlri, nextHop, builder);