refactoring of listmappingservice into Northbound (future REST) and Southbound (LISP...
[lispflowmapping.git] / mappingservice / implementation / src / main / java / org / opendaylight / lispflowmapping / implementation / dao / ClusterDAOService.java
1 /*
2  * Copyright (c) 2013 Contextream, 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
9 package org.opendaylight.lispflowmapping.implementation.dao;
10
11 import java.lang.reflect.ParameterizedType;
12 import java.util.EnumSet;
13 import java.util.HashMap;
14 import java.util.Map;
15 import java.util.concurrent.ConcurrentMap;
16
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;
27
28 public class ClusterDAOService implements ILispDAO, IQueryAll {
29
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";
34
35     void setClusterContainerService(IClusterContainerServices s) {
36         logger.debug("Cluster Service set");
37         this.clusterContainerService = s;
38         allocateCache();
39         retrieveCache();
40     }
41
42     void unsetClusterContainerService(IClusterContainerServices s) {
43         logger.debug("Cluster Service unset");
44         if (this.clusterContainerService == s) {
45             this.clusterContainerService = null;
46
47         }
48     }
49
50     @SuppressWarnings("deprecation")
51     private void allocateCache() {
52         if (this.clusterContainerService == null) {
53             logger.error("un-initialized clusterContainerService, can't create cache");
54             return;
55         }
56         logger.debug("Creating Cache for ClusterDAOService");
57         try {
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");
63         }
64         logger.debug("Cache successfully created for ClusterDAOService");
65     }
66
67     @SuppressWarnings( { "unchecked", "deprecation" })
68     private void retrieveCache() {
69         if (this.clusterContainerService == null) {
70             logger.error("un-initialized clusterContainerService, can't retrieve cache");
71             return;
72         }
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");
77         }
78         logger.debug("Cache was successfully retrieved for ClusterDAOService");
79     }
80
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());
86                 }
87             }
88         }
89     }
90
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());
96         }
97         keysToValues.put(key, keyToValues);
98     }
99
100     private <K> Map<Object, Map<String, Object>> getTypeMap(K key) {
101         if (key == null) {
102             throw new IllegalArgumentException("Illegal null key.");
103         }
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.");
107         }
108         return keysToValues;
109     }
110
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) {
116             return null;
117         }
118         return (V) keyToValues.get(valueKey.getKey());
119     }
120
121     public <K> Object getSpecific(K key, String valueKey) {
122         return getSpecific(key, new MappingValueKey<Object>(valueKey));
123     }
124
125     public <K> Map<String, ?> get(K key) {
126         Map<Object, Map<String, Object>> keysToValues = getTypeMap(key);
127         return keysToValues.get(key);
128     }
129
130     public <K> boolean remove(K key) {
131         Map<Object, Map<String, Object>> keysToValues = getTypeMap(key);
132         return keysToValues.remove(key) != null;
133     }
134
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>>());
138     }
139
140     public void clearAll() {
141         typeToKeysToValues.clear();
142     }
143 }