2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.protocol.pcep.impl;
11 import java.util.concurrent.ConcurrentHashMap;
13 import org.opendaylight.protocol.concepts.AbstractRegistration;
14 import org.opendaylight.protocol.pcep.spi.HandlerRegistry;
15 import org.opendaylight.protocol.pcep.spi.MessageParser;
16 import org.opendaylight.protocol.pcep.spi.MessageSerializer;
17 import org.opendaylight.protocol.pcep.spi.ObjectParser;
18 import org.opendaylight.protocol.pcep.spi.ObjectSerializer;
19 import org.opendaylight.protocol.pcep.spi.TlvParser;
20 import org.opendaylight.protocol.pcep.spi.TlvSerializer;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Tlv;
25 import com.google.common.base.Preconditions;
27 public class HandlerRegistryImpl implements HandlerRegistry {
28 public static final HandlerRegistry INSTANCE;
31 final HandlerRegistry reg = new HandlerRegistryImpl();
33 // FIXME: fill this in
35 // reg.registerMessageHandler(PCEPOpenMessage.class, 1, new PCEPOpenMessageParser());
36 // reg.registerMessageHandler(PCEPNotificationMessage.class, 5, new PCEPNotificationMessageParser());
37 // reg.registerMessageHandler(PCEPKeepAliveMessage.class, 2, new PCEPKeepAliveMessageParser());
38 // reg.registerMessageHandler(PCEPReplyMessage.class, 4, new PCEPReplyMessageParser());
39 // reg.registerMessageHandler(PCEPRequestMessage.class, 3, new PCEPRequestMessageParser());
40 // reg.registerMessageHandler(PCEPErrorMessage.class, 6, new PCEPErrorMessageParser());
41 // reg.registerMessageHandler(PCEPCloseMessage.class, 7, new PCEPCloseMessageParser());
42 // reg.registerMessageHandler(PCEPUpdateRequestMessage.class, 11, new PCEPUpdateRequestMessageParser());
43 // reg.registerMessageHandler(PCEPReportMessage.class, 10, new PCEPReportMessageParser());
44 // reg.registerMessageHandler(PCCreateMessage.class, 12, new PCCreateMessageParser());
49 private final Map<Integer, MessageParser> msgParsers = new ConcurrentHashMap<>();
50 private final Map<Class<? extends Message>, MessageSerializer> msgSerializers = new ConcurrentHashMap<>();
52 private final Map<Integer, ObjectParser> objParsers = new ConcurrentHashMap<>();
53 private final Map<Class<? extends Object>, ObjectSerializer> objSerializers = new ConcurrentHashMap<>();
55 private final Map<Integer, TlvParser> tlvParsers = new ConcurrentHashMap<>();
56 private final Map<Class<? extends Tlv>, TlvSerializer> tlvSerializers = new ConcurrentHashMap<>();
58 private HandlerRegistryImpl() {
63 public MessageParser getMessageParser(final int messageType) {
64 Preconditions.checkArgument(messageType >= 0 && messageType <= 255);
65 return msgParsers.get(messageType);
69 public MessageSerializer getMessageSerializer(final Message message) {
70 final Class<? extends Message> c = message.getClass();
71 for (Map.Entry<Class<? extends Message>, MessageSerializer> s : msgSerializers.entrySet()) {
72 if (s.getKey().isAssignableFrom(c)) {
81 public synchronized ObjectParser getObjectParser(final int objectClass, final int objectType) {
82 Preconditions.checkArgument(objectClass >= 0 && objectClass <= 255);
83 Preconditions.checkArgument(objectType >= 0 && objectType <= 15);
85 return objParsers.get((objectClass << 4) + objectType);
89 public ObjectSerializer getObjectSerializer(final Object object) {
90 final Class<? extends Object> c = object.getClass();
91 for (Map.Entry<Class<? extends Object>, ObjectSerializer> s : objSerializers.entrySet()) {
92 if (s.getKey().isAssignableFrom(c)) {
101 public TlvParser getTlvParser(final int tlvType) {
102 Preconditions.checkArgument(tlvType >= 0 && tlvType <= 65535);
103 return tlvParsers.get(tlvType);
107 public TlvSerializer getTlvSerializer(final Tlv tlv) {
108 final Class<? extends Tlv> c = tlv.getClass();
109 for (Map.Entry<Class<? extends Tlv>, TlvSerializer> s : tlvSerializers.entrySet()) {
110 if (s.getKey().isAssignableFrom(c)) {
118 private synchronized void unregisterMessageParser(final Integer msgType) {
119 msgParsers.remove(msgType);
123 public synchronized AutoCloseable registerMessageParser(final int msgType, final MessageParser parser) {
124 Preconditions.checkArgument(msgType >= 0 && msgType <= 255);
125 Preconditions.checkArgument(!msgParsers.containsKey(msgType), "Message type %s already registered", msgType);
126 msgParsers.put(msgType, parser);
128 return new AbstractRegistration() {
130 protected void removeRegistration() {
131 unregisterMessageParser(msgType);
136 private synchronized void unregisterMessageSerializer(final Class<? extends Message> msgClass) {
137 msgSerializers.remove(msgClass);
141 public synchronized AutoCloseable registerMessageSerializer(final Class<? extends Message> msgClass, final MessageSerializer serializer) {
142 Preconditions.checkArgument(!msgSerializers.containsKey(msgClass), "Message class %s already registered", msgClass);
143 msgSerializers.put(msgClass, serializer);
145 return new AbstractRegistration() {
147 protected void removeRegistration() {
148 unregisterMessageSerializer(msgClass);
153 private synchronized void unregisterObjectParser(final Integer key) {
154 objParsers.remove(key);
158 public synchronized AutoCloseable registerObjectParser(final int objectClass, final int objectType,
159 final ObjectParser parser) {
160 Preconditions.checkArgument(objectClass >= 0 && objectClass <= 255);
161 Preconditions.checkArgument(objectType >= 0 && objectType <= 15);
163 final Integer key = (objectClass << 4) + objectType;
164 Preconditions.checkArgument(!objParsers.containsKey(key), "Object class %s type %s already registered", objectClass, objectType);
165 objParsers.put(key, parser);
167 return new AbstractRegistration() {
169 protected void removeRegistration() {
170 unregisterObjectParser(key);
175 private synchronized void unregisterObjectSerializer(final Class<? extends Object> objClass) {
176 objSerializers.remove(objClass);
180 public synchronized AutoCloseable registerObjectSerializer(final Class<? extends Object> objClass, final ObjectSerializer serializer) {
181 Preconditions.checkArgument(!objSerializers.containsKey(objClass), "Object class %s already registered", objClass);
182 objSerializers.put(objClass, serializer);
184 return new AbstractRegistration() {
186 protected void removeRegistration() {
187 unregisterObjectSerializer(objClass);
192 private synchronized void unregisterTlvParser(final int tlvType) {
193 tlvParsers.remove(tlvType);
197 public synchronized AutoCloseable registerTlvParser(final int tlvType, final TlvParser parser) {
198 Preconditions.checkArgument(tlvType >= 0 && tlvType <= 65535);
199 Preconditions.checkArgument(!tlvParsers.containsKey(tlvType), "TLV type %s already registered", tlvType);
201 tlvParsers.put(tlvType, parser);
203 return new AbstractRegistration() {
205 protected void removeRegistration() {
206 unregisterTlvParser(tlvType);
211 private synchronized void unregisterTlvSerializer(final Class<? extends Tlv> tlvClass) {
212 tlvSerializers.remove(tlvClass);
216 public synchronized AutoCloseable registerTlvSerializer(final Class<? extends Tlv> tlvClass, final TlvSerializer serializer) {
217 Preconditions.checkArgument(!tlvSerializers.containsKey(tlvClass), "TLV class %s already registered", tlvClass);
218 tlvSerializers.put(tlvClass, serializer);
220 return new AbstractRegistration() {
222 protected void removeRegistration() {
223 unregisterTlvSerializer(tlvClass);