Added response data to operational datastore, refactored data validation
[packetcable.git] / packetcable-policy-server / src / main / java / org / opendaylight / controller / packetcable / provider / DataChangeUtils.java
1 /*
2  * Copyright (c) 2015 CableLabs 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.controller.packetcable.provider;
10
11 import com.google.common.collect.Maps;
12 import com.google.common.collect.Sets;
13 import java.util.Map;
14 import java.util.Set;
15 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
16 import org.opendaylight.yangtools.yang.binding.DataObject;
17 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
18 import org.slf4j.Logger;
19
20 /**
21  * @author rvail
22  */
23 public class DataChangeUtils {
24
25     @SuppressWarnings("unchecked")
26     public static <T extends DataObject> Map<InstanceIdentifier<T>, T> collectTypeFromMap(Class<T> tClass,
27             Map<InstanceIdentifier<?>, DataObject> map) {
28         Map<InstanceIdentifier<T>, T> result = Maps.newHashMap();
29
30         for (Map.Entry<InstanceIdentifier<?>, DataObject> entry : map.entrySet()) {
31             if (tClass.isAssignableFrom(entry.getValue().getImplementedInterface())) {
32                 final InstanceIdentifier<T> tIID = (InstanceIdentifier<T>) entry.getKey();
33                 final T tObj = (T) entry.getValue();
34                 result.put(tIID, tObj);
35             }
36         }
37
38         return result;
39     }
40
41     public static <T extends DataObject> Set<InstanceIdentifier<T>> collectTypeFromSet(Class<T> tClass,
42             Set<InstanceIdentifier<?>> set) {
43         Set<InstanceIdentifier<T>> result = Sets.newHashSet();
44
45         for (InstanceIdentifier<?> iid : set) {
46             if (tClass.isAssignableFrom(iid.getTargetType())) {
47                 @SuppressWarnings("unchecked")
48                 final InstanceIdentifier<T> tIID = (InstanceIdentifier<T>) iid;
49                 result.add(tIID);
50             }
51         }
52
53         return result;
54     }
55
56     /**
57      * Computes the relative complement of A in B. (aka get everything in B that is not in A)
58      * @param setA The first set
59      * @param setB The second set
60      * @return the relative complement
61      */
62     public static Map<InstanceIdentifier<?>, DataObject> relativeComplement(Map<InstanceIdentifier<?>, DataObject> setA,
63             Map<InstanceIdentifier<?>, DataObject> setB){
64
65         Map<InstanceIdentifier<?>, DataObject> result = Maps.newHashMap();
66
67         for (InstanceIdentifier<?> iid: setB.keySet()) {
68             if (!setA.containsKey(iid)) {
69                 result.put(iid, setB.get(iid));
70             }
71         }
72
73         return result;
74     }
75
76
77
78     public static void logChange(final Logger logger, final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
79         if (!logger.isDebugEnabled()) {
80             return;
81         }
82
83         StringBuilder sb = new StringBuilder();
84
85         appendMap(sb, "CREATED", change.getCreatedData());
86         appendSet(sb, "REMOVED", change.getRemovedPaths());
87         appendMap(sb, "UPDATED", change.getUpdatedData());
88         appendMap(sb, "ORIGINAL", change.getOriginalData());
89
90         logger.debug("onDataChanged data:\n{}", sb.toString());
91     }
92
93
94     private static <E> void appendSet(StringBuilder sb, String name, Set<E> set) {
95         sb.append("====").append(name).append("====\n");
96         if (set == null || set.isEmpty()) {
97             sb.append("None\n");
98         } else {
99             for (E data : set) {
100                 sb.append(data).append("\n");
101                 sb.append("----------\n");
102             }
103         }
104         sb.append("===============\n");
105     }
106
107     private static void appendMap(StringBuilder sb, String name, Map<InstanceIdentifier<?>, DataObject> dataMap) {
108         sb.append("====").append(name).append("====\n");
109         if (dataMap == null || dataMap.isEmpty()) {
110             sb.append("None\n");
111         } else {
112             for (Map.Entry<InstanceIdentifier<?>, DataObject> entry : dataMap.entrySet()) {
113                 sb.append(entry.getValue()).append("\n");
114                 sb.append("----------\n");
115             }
116         }
117         sb.append("===============\n");
118     }
119 }