c3425a8cdf0e8d149d803527537e6e4028c766d7
[bgpcep.git] / bgp / parser-spi / src / main / java / org / opendaylight / protocol / bgp / parser / spi / pojo / SimpleBGPExtensionProviderContext.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.protocol.bgp.parser.spi.pojo;
9
10 import com.google.common.base.Preconditions;
11 import com.google.common.cache.Cache;
12 import com.google.common.cache.CacheBuilder;
13 import java.util.concurrent.atomic.AtomicReference;
14 import org.opendaylight.protocol.bgp.parser.spi.AttributeParser;
15 import org.opendaylight.protocol.bgp.parser.spi.AttributeSerializer;
16 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
17 import org.opendaylight.protocol.bgp.parser.spi.CapabilityParser;
18 import org.opendaylight.protocol.bgp.parser.spi.CapabilitySerializer;
19 import org.opendaylight.protocol.bgp.parser.spi.MessageParser;
20 import org.opendaylight.protocol.bgp.parser.spi.MessageSerializer;
21 import org.opendaylight.protocol.bgp.parser.spi.NlriParser;
22 import org.opendaylight.protocol.bgp.parser.spi.NlriSerializer;
23 import org.opendaylight.protocol.bgp.parser.spi.ParameterParser;
24 import org.opendaylight.protocol.bgp.parser.spi.ParameterSerializer;
25 import org.opendaylight.protocol.util.ReferenceCache;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParameters;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.optional.capabilities.CParameters;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily;
30 import org.opendaylight.yangtools.yang.binding.DataObject;
31 import org.opendaylight.yangtools.yang.binding.Notification;
32
33 public class SimpleBGPExtensionProviderContext extends SimpleBGPExtensionConsumerContext implements BGPExtensionProviderContext {
34
35     public static final int DEFAULT_MAXIMUM_CACHED_OBJECTS = 100000;
36
37     private final AtomicReference<Cache<Object, Object>> cacheRef;
38     private final ReferenceCache referenceCache = new ReferenceCache() {
39         @Override
40         public <T> T getSharedReference(final T object) {
41             final Cache<Object, Object> cache = SimpleBGPExtensionProviderContext.this.cacheRef.get();
42
43             @SuppressWarnings("unchecked")
44             final T ret = (T) cache.getIfPresent(object);
45             if (ret == null) {
46                 cache.put(object, object);
47                 return object;
48             }
49
50             return ret;
51         }
52     };
53     private final int maximumCachedObjects;
54
55     public SimpleBGPExtensionProviderContext() {
56         this(DEFAULT_MAXIMUM_CACHED_OBJECTS);
57     }
58
59     public SimpleBGPExtensionProviderContext(final int maximumCachedObjects) {
60         this.maximumCachedObjects = maximumCachedObjects;
61
62         final Cache<Object, Object> cache = CacheBuilder.newBuilder().maximumSize(maximumCachedObjects).build();
63         this.cacheRef = new AtomicReference<Cache<Object,Object>>(cache);
64     }
65
66     @Override
67     public AutoCloseable registerAddressFamily(final Class<? extends AddressFamily> clazz, final int number) {
68         return this.getAddressFamilyRegistry().registerAddressFamily(clazz, number);
69     }
70
71     @Override
72     public AutoCloseable registerAttributeParser(final int attributeType, final AttributeParser parser) {
73         return this.getAttributeRegistry().registerAttributeParser(attributeType, parser);
74     }
75
76     @Override
77     public AutoCloseable registerAttributeSerializer(final Class<? extends DataObject> attributeClass, final AttributeSerializer serializer) {
78         return this.getAttributeRegistry().registerAttributeSerializer(attributeClass, serializer);
79     }
80
81     @Override
82     public AutoCloseable registerCapabilityParser(final int capabilityType, final CapabilityParser parser) {
83         return this.getCapabilityRegistry().registerCapabilityParser(capabilityType, parser);
84     }
85
86     @Override
87     public AutoCloseable registerCapabilitySerializer(final Class<? extends CParameters> capabilityClass, final CapabilitySerializer serializer) {
88         return this.getCapabilityRegistry().registerCapabilitySerializer(capabilityClass, serializer);
89     }
90
91     @Override
92     public AutoCloseable registerMessageParser(final int messageType, final MessageParser parser) {
93         return this.getMessageRegistry().registerMessageParser(messageType, parser);
94     }
95
96     @Override
97     public AutoCloseable registerMessageSerializer(final Class<? extends Notification> messageClass, final MessageSerializer serializer) {
98         return this.getMessageRegistry().registerMessageSerializer(messageClass, serializer);
99     }
100
101     @Override
102     public AutoCloseable registerNlriParser(final Class<? extends AddressFamily> afi, final Class<? extends SubsequentAddressFamily> safi,
103             final NlriParser parser) {
104         return this.getNlriRegistry().registerNlriParser(afi, safi, parser);
105     }
106
107     @Override
108     public AutoCloseable registerNlriSerializer(final Class<? extends DataObject> nlriClass, final NlriSerializer serializer) {
109         return this.getNlriRegistry().registerNlriSerializer(nlriClass,serializer);
110     }
111
112     @Override
113     public AutoCloseable registerParameterParser(final int parameterType, final ParameterParser parser) {
114         return this.getParameterRegistry().registerParameterParser(parameterType, parser);
115     }
116
117     @Override
118     public AutoCloseable registerParameterSerializer(final Class<? extends BgpParameters> paramClass, final ParameterSerializer serializer) {
119         return this.getParameterRegistry().registerParameterSerializer(paramClass, serializer);
120     }
121
122     @Override
123     public AutoCloseable registerSubsequentAddressFamily(final Class<? extends SubsequentAddressFamily> clazz, final int number) {
124         return this.getSubsequentAddressFamilyRegistry().registerSubsequentAddressFamily(clazz, number);
125     }
126
127     @Override
128     public ReferenceCache getReferenceCache() {
129         return this.referenceCache;
130     }
131
132     public final synchronized int getMaximumCachedObjects() {
133         return this.maximumCachedObjects;
134     }
135
136     public final synchronized void setMaximumCachedObjects(final int maximumCachedObjects) {
137         Preconditions.checkArgument(maximumCachedObjects >= 0);
138
139         Cache<Object, Object> newCache = CacheBuilder.newBuilder().maximumSize(maximumCachedObjects).build();
140         newCache.putAll(this.cacheRef.get().asMap());
141         this.cacheRef.set(newCache);
142     }
143 }