2 * Copyright (c) 2014 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.openflowplugin.openflow.md.core.extension;
11 import java.util.concurrent.ConcurrentHashMap;
12 import org.opendaylight.openflowjava.protocol.api.keys.ActionSerializerKey;
13 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey;
14 import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
15 import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey;
16 import org.opendaylight.openflowplugin.extension.api.ConvertorActionFromOFJava;
17 import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava;
18 import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava;
19 import org.opendaylight.openflowplugin.extension.api.ConvertorMessageFromOFJava;
20 import org.opendaylight.openflowplugin.extension.api.ConvertorMessageToOFJava;
21 import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava;
22 import org.opendaylight.openflowplugin.extension.api.TypeVersionKey;
23 import org.opendaylight.openflowplugin.extension.api.path.ActionPath;
24 import org.opendaylight.openflowplugin.extension.api.path.AugmentationPath;
25 import org.opendaylight.openflowplugin.extension.api.path.MatchPath;
26 import org.opendaylight.openflowplugin.extension.api.path.MessagePath;
27 import org.opendaylight.openflowplugin.openflow.md.core.extension.RegistrationCloser.RegistrationCloserActionFromOFJava;
28 import org.opendaylight.openflowplugin.openflow.md.core.extension.RegistrationCloser.RegistrationCloserActionToOFJava;
29 import org.opendaylight.openflowplugin.openflow.md.core.extension.RegistrationCloser.RegistrationCloserFromOFJava;
30 import org.opendaylight.openflowplugin.openflow.md.core.extension.RegistrationCloser.RegistrationCloserMessageFromOFJava;
31 import org.opendaylight.openflowplugin.openflow.md.core.extension.RegistrationCloser.RegistrationCloserMessageToOFJava;
32 import org.opendaylight.openflowplugin.openflow.md.core.extension.RegistrationCloser.RegistrationCloserToOFJava;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmClassBase;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.experimenter.types.rev151020.experimenter.core.message.ExperimenterMessageOfChoice;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey;
40 import org.opendaylight.yangtools.concepts.ObjectRegistration;
41 import org.opendaylight.yangtools.yang.binding.DataContainer;
44 * simple map-based registration engine implementation
46 public class ExtensionConverterManagerImpl implements ExtensionConverterManager {
48 private final Map<MessageTypeKey<?>, ConvertorFromOFJava<?, ?>> registryFromOFJAva;
49 private final Map<ConverterExtensionKey<?>, ConvertorToOFJava<?>> registryToOFJAva;
50 private final Map<TypeVersionKey<? extends Action>, ConvertorActionToOFJava<? extends Action, ? extends DataContainer>> registryActionToOFJAva;
51 private final Map<MessageTypeKey<?>, ConvertorActionFromOFJava<?, ?>> registryActionFromOFJAva;
52 private final Map<TypeVersionKey<?>, ConvertorMessageToOFJava<ExperimenterMessageOfChoice, DataContainer>> registryMessageToOFJAva;
53 private final Map<MessageTypeKey<?>, ConvertorMessageFromOFJava<ExperimenterDataOfChoice, MessagePath>> registryMessageFromOFJAva;
58 public ExtensionConverterManagerImpl() {
59 registryFromOFJAva = new ConcurrentHashMap<>();
60 registryToOFJAva = new ConcurrentHashMap<>();
61 registryActionToOFJAva = new ConcurrentHashMap<>();
62 registryActionFromOFJAva = new ConcurrentHashMap<>();
63 registryMessageToOFJAva = new ConcurrentHashMap<>();
64 registryMessageFromOFJAva = new ConcurrentHashMap<>();
72 private <FROM extends DataContainer, PATH extends AugmentationPath, KEY extends MessageTypeKey<?>>
73 RegistrationCloserFromOFJava<FROM, PATH> hireJanitor(
74 final KEY key, final ConvertorFromOFJava<FROM, PATH> extConvertor) {
75 RegistrationCloserFromOFJava<FROM, PATH> janitor = new RegistrationCloser.RegistrationCloserFromOFJava<>();
76 janitor.setConverter(extConvertor);
78 janitor.setRegistrator(this);
87 private <FROM extends DataContainer, PATH extends AugmentationPath, KEY extends MessageTypeKey<?>>
88 RegistrationCloserActionFromOFJava<FROM, PATH> hireJanitor(
89 final KEY key, final ConvertorActionFromOFJava<FROM, PATH> extConvertor) {
90 RegistrationCloserActionFromOFJava<FROM, PATH> janitor = new RegistrationCloser.RegistrationCloserActionFromOFJava<>();
91 janitor.setConverter(extConvertor);
93 janitor.setRegistrator(this);
102 private <TO extends DataContainer> RegistrationCloserToOFJava<TO> hireJanitor(
103 final ConverterExtensionKey<? extends ExtensionKey> key, final ConvertorToOFJava<TO> extConvertor) {
104 RegistrationCloserToOFJava<TO> janitor = new RegistrationCloser.RegistrationCloserToOFJava<>();
105 janitor.setConverter(extConvertor);
107 janitor.setRegistrator(this);
113 * @param extConvertor
116 private <TO extends DataContainer> RegistrationCloserActionToOFJava<TO> hireJanitor(
117 final TypeVersionKey<? extends Action> key, final ConvertorActionToOFJava<Action, TO> extConvertor) {
118 RegistrationCloserActionToOFJava<TO> janitor = new RegistrationCloser.RegistrationCloserActionToOFJava<>();
119 janitor.setConverter(extConvertor);
121 janitor.setRegistrator(this);
127 * @param extConvertor
130 private <TO extends DataContainer> RegistrationCloserMessageToOFJava<TO> hireMessageJanitor(
131 final TypeVersionKey<? extends ExperimenterMessageOfChoice> key,
132 final ConvertorMessageToOFJava<ExperimenterMessageOfChoice, TO> extConvertor) {
133 RegistrationCloserMessageToOFJava<TO> janitor = new RegistrationCloserMessageToOFJava<>();
134 janitor.setConverter(extConvertor);
136 janitor.setRegistrator(this);
142 * @param extConvertor
145 private <FROM extends DataContainer, PATH extends AugmentationPath, KEY extends MessageTypeKey<?>>
146 RegistrationCloserMessageFromOFJava<FROM, PATH> hireMessageJanitor(
147 final KEY key, final ConvertorMessageFromOFJava<FROM, PATH> extConvertor) {
148 RegistrationCloserMessageFromOFJava<FROM, PATH> janitor = new RegistrationCloserMessageFromOFJava<>();
149 janitor.setConverter(extConvertor);
151 janitor.setRegistrator(this);
156 * cancel registration of given converter
161 public void unregister(final ConverterExtensionKey<?> key, final ConvertorToOFJava<?> converter) {
162 ConvertorToOFJava<?> registeredConverter = registryToOFJAva.get(key);
163 if (registeredConverter != null && registeredConverter == converter) {
164 registryToOFJAva.remove(key);
169 * cancel registration of given converter
174 public void unregister(final TypeVersionKey<? extends Action> key, final ConvertorActionToOFJava<?, ?> converter) {
175 ConvertorActionToOFJava<?, ?> registeredConverter = registryActionToOFJAva.get(key);
176 if (registeredConverter != null && registeredConverter == converter) {
177 registryActionToOFJAva.remove(key);
182 * cancel registration of given converter
187 public void unregister(final MessageTypeKey<?> key, final ConvertorFromOFJava<?, ?> converter) {
188 ConvertorFromOFJava<?, ?> registeredConverter = registryFromOFJAva.get(key);
189 if (registeredConverter != null && registeredConverter == converter) {
190 registryFromOFJAva.remove(key);
195 * cancel registration of given converter
200 public void unregister(final MessageTypeKey<?> key, final ConvertorActionFromOFJava<?, ?> converter) {
201 ConvertorActionFromOFJava<?, ?> registeredConverter = registryActionFromOFJAva.get(key);
202 if (registeredConverter != null && registeredConverter == converter) {
203 registryActionFromOFJAva.remove(key);
208 * cancel registration of given converter
213 public void unregister(final MessageTypeKey<?> key, final ConvertorMessageFromOFJava<?, ?> converter) {
214 ConvertorMessageFromOFJava<?, ?> registeredConverter = registryMessageFromOFJAva.get(key);
215 if (registeredConverter != null && registeredConverter == converter) {
216 registryMessageFromOFJAva.remove(key);
221 * cancel registration of given converter
226 public void unregister(final TypeVersionKey<?> key, final ConvertorMessageToOFJava<?, ?> converter) {
227 ConvertorMessageToOFJava<?, ?> registeredConverter = registryMessageToOFJAva.get(key);
228 if (registeredConverter != null && registeredConverter == converter) {
229 registryMessageToOFJAva.remove(key);
233 @SuppressWarnings("unchecked")
235 public <FROM extends DataContainer> ConvertorToOFJava<FROM> getConverter(
236 final ConverterExtensionKey<?> key) {
237 return (ConvertorToOFJava<FROM>) registryToOFJAva.get(key);
240 @SuppressWarnings("unchecked")
242 public <FROM extends Action, TO extends DataContainer> ConvertorActionToOFJava<FROM, TO> getConverter(
243 final TypeVersionKey<FROM> key) {
244 return (ConvertorActionToOFJava<FROM, TO>) registryActionToOFJAva.get(key);
247 @SuppressWarnings("unchecked")
249 public <FROM extends DataContainer, PATH extends AugmentationPath> ConvertorFromOFJava<FROM, PATH> getConverter(
250 final MessageTypeKey<?> key) {
251 return (ConvertorFromOFJava<FROM, PATH>) registryFromOFJAva.get(key);
254 @SuppressWarnings("unchecked")
256 public <FROM extends DataContainer, PATH extends AugmentationPath> ConvertorActionFromOFJava<FROM, PATH> getActionConverter(
257 final MessageTypeKey<?> key) {
258 return (ConvertorActionFromOFJava<FROM, PATH>) registryActionFromOFJAva.get(key);
262 public ObjectRegistration<ConvertorActionToOFJava<Action, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action>>
263 registerActionConvertor(
264 final TypeVersionKey<? extends Action> key,
265 final ConvertorActionToOFJava<Action, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action> convertor) {
266 registryActionToOFJAva.put(key, convertor);
267 return hireJanitor(key, convertor);
271 public ObjectRegistration<ConvertorActionFromOFJava<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action, ActionPath>>
272 registerActionConvertor(
273 final ActionSerializerKey<?> key,
274 final ConvertorActionFromOFJava<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action, ActionPath> convertor) {
275 registryActionFromOFJAva.put(key, convertor);
276 return hireJanitor(key, convertor);
280 public ObjectRegistration<ConvertorToOFJava<MatchEntry>> registerMatchConvertor(final ConverterExtensionKey<? extends ExtensionKey> key,
281 final ConvertorToOFJava<MatchEntry> convertor) {
282 registryToOFJAva.put(key, convertor);
283 return hireJanitor(key, convertor);
287 public ObjectRegistration<ConvertorFromOFJava<MatchEntry, MatchPath>> registerMatchConvertor(
288 final MatchEntrySerializerKey<? extends OxmClassBase, ? extends MatchField> key,
289 final ConvertorFromOFJava<MatchEntry, MatchPath> convertor) {
290 registryFromOFJAva.put(key, convertor);
291 return hireJanitor(key, convertor);
295 public ObjectRegistration<ConvertorMessageToOFJava<ExperimenterMessageOfChoice, DataContainer>> registerMessageConvertor(
296 TypeVersionKey<? extends ExperimenterMessageOfChoice> key, ConvertorMessageToOFJava<ExperimenterMessageOfChoice, DataContainer> convertor) {
297 registryMessageToOFJAva.put(key, convertor);
298 return hireMessageJanitor(key, convertor);
302 public ObjectRegistration<ConvertorMessageFromOFJava<ExperimenterDataOfChoice, MessagePath>> registerMessageConvertor(
303 MessageTypeKey<?> key, ConvertorMessageFromOFJava<ExperimenterDataOfChoice, MessagePath> convertor) {
304 registryMessageFromOFJAva.put(key, convertor);
305 return hireMessageJanitor(key, convertor);