2 * Copyright (c) 2013 Contextream, 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
9 package org.opendaylight.lispflowmapping.implementation.dao;
11 import java.lang.reflect.ParameterizedType;
12 import java.util.EnumSet;
13 import java.util.HashMap;
15 import java.util.concurrent.ConcurrentMap;
17 import org.opendaylight.controller.clustering.services.CacheConfigException;
18 import org.opendaylight.controller.clustering.services.CacheExistException;
19 import org.opendaylight.controller.clustering.services.IClusterContainerServices;
20 import org.opendaylight.controller.clustering.services.IClusterServices;
21 import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO;
22 import org.opendaylight.lispflowmapping.interfaces.dao.ILispTypeConverter;
23 import org.opendaylight.lispflowmapping.interfaces.dao.IQueryAll;
24 import org.opendaylight.lispflowmapping.interfaces.dao.IRowVisitor;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
28 public class ClusterDAOService implements ILispDAO, IQueryAll {
30 protected static final Logger logger = LoggerFactory.getLogger(ClusterDAOService.class);
31 private IClusterContainerServices clusterContainerService = null;
32 private ConcurrentMap<Class<?>, Map<Object, Map<String, Object>>> typeToKeysToValues;
33 private final String CACHE_NAME = "mappingServiceCache";
35 void setClusterContainerService(IClusterContainerServices s) {
36 logger.debug("Cluster Service set");
37 this.clusterContainerService = s;
42 void unsetClusterContainerService(IClusterContainerServices s) {
43 logger.debug("Cluster Service unset");
44 if (this.clusterContainerService == s) {
45 this.clusterContainerService = null;
50 @SuppressWarnings("deprecation")
51 private void allocateCache() {
52 if (this.clusterContainerService == null) {
53 logger.error("un-initialized clusterContainerService, can't create cache");
56 logger.debug("Creating Cache for ClusterDAOService");
58 this.clusterContainerService.createCache(CACHE_NAME, EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL));
59 } catch (CacheConfigException cce) {
60 logger.error("Cache couldn't be created for ClusterDAOService - check cache mode");
61 } catch (CacheExistException cce) {
62 logger.error("Cache for ClusterDAOService already exists, destroy and recreate");
64 logger.debug("Cache successfully created for ClusterDAOService");
67 @SuppressWarnings( { "unchecked", "deprecation" })
68 private void retrieveCache() {
69 if (this.clusterContainerService == null) {
70 logger.error("un-initialized clusterContainerService, can't retrieve cache");
73 logger.debug("Retrieving cache for ClusterDAOService");
74 typeToKeysToValues = (ConcurrentMap<Class<?>, Map<Object, Map<String, Object>>>) this.clusterContainerService.getCache(CACHE_NAME);
75 if (typeToKeysToValues == null) {
76 logger.error("Cache couldn't be retrieved for ClusterDAOService");
78 logger.debug("Cache was successfully retrieved for ClusterDAOService");
81 public void getAll(IRowVisitor visitor) {
82 for (Map.Entry<Class<?>, Map<Object, Map<String, Object>>> typeEntry : typeToKeysToValues.entrySet()) {
83 for (Map.Entry<Object, Map<String, Object>> keyEntry : typeEntry.getValue().entrySet()) {
84 for (Map.Entry<String, Object> valueEntry : keyEntry.getValue().entrySet()) {
85 visitor.visitRow(typeEntry.getKey(), keyEntry.getKey(), valueEntry.getKey(), valueEntry.getValue());
91 public <K> void put(K key, MappingEntry<?>... values) {
92 Map<Object, Map<String, Object>> keysToValues = getTypeMap(key);
93 Map<String, Object> keyToValues = new HashMap<String, Object>();
94 for (MappingEntry<?> entry : values) {
95 keyToValues.put(entry.getKey(), entry.getValue());
97 keysToValues.put(key, keyToValues);
100 private <K> Map<Object, Map<String, Object>> getTypeMap(K key) {
102 throw new IllegalArgumentException("Illegal null key.");
104 Map<Object, Map<String, Object>> keysToValues = typeToKeysToValues.get(key.getClass());
105 if (keysToValues == null) {
106 throw new IllegalArgumentException("Unknown key type " + key.getClass() + ". must register with IConverter first.");
111 @SuppressWarnings("unchecked")
112 public <K, V> V getSpecific(K key, MappingValueKey<V> valueKey) {
113 Map<Object, Map<String, Object>> keysToValues = getTypeMap(key);
114 Map<String, Object> keyToValues = keysToValues.get(key);
115 if (keyToValues == null) {
118 return (V) keyToValues.get(valueKey.getKey());
121 public <K> Object getSpecific(K key, String valueKey) {
122 return getSpecific(key, new MappingValueKey<Object>(valueKey));
125 public <K> Map<String, ?> get(K key) {
126 Map<Object, Map<String, Object>> keysToValues = getTypeMap(key);
127 return keysToValues.get(key);
130 public <K> boolean remove(K key) {
131 Map<Object, Map<String, Object>> keysToValues = getTypeMap(key);
132 return keysToValues.remove(key) != null;
135 public <UserType, DbType> void register(Class<? extends ILispTypeConverter<UserType, DbType>> userType) {
136 Class<?> eidType = (Class<?>) ((ParameterizedType) userType.getGenericInterfaces()[0]).getActualTypeArguments()[0];
137 typeToKeysToValues.put(eidType, new HashMap<Object, Map<String, Object>>());
140 public void clearAll() {
141 typeToKeysToValues.clear();