BUG 2854 : Do not add empty read write transactions to the replicable journal
[controller.git] / opendaylight / md-sal / messagebus-impl / src / main / java / org / opendaylight / controller / messagebus / app / impl / Util.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, 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.controller.messagebus.app.impl;
10
11 import com.google.common.util.concurrent.Futures;
12 import java.math.BigInteger;
13 import java.security.MessageDigest;
14 import java.security.NoSuchAlgorithmException;
15 import java.util.ArrayList;
16 import java.util.Collections;
17 import java.util.List;
18 import java.util.Map;
19 import java.util.concurrent.Future;
20 import java.util.regex.Pattern;
21 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
22 import org.opendaylight.controller.sal.common.util.Rpcs;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
24 import org.opendaylight.yangtools.yang.binding.DataObject;
25 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
26 import org.opendaylight.yangtools.yang.common.QName;
27 import org.opendaylight.yangtools.yang.common.RpcError;
28 import org.opendaylight.yangtools.yang.common.RpcResult;
29
30 public final class Util {
31     private static final MessageDigest messageDigestTemplate = getDigestInstance();
32
33     private static MessageDigest getDigestInstance() {
34         try {
35             return MessageDigest.getInstance("MD5");
36         } catch (NoSuchAlgorithmException e) {
37             throw new RuntimeException("Unable to get MD5 instance");
38         }
39     }
40
41     public static String md5String(final String inputString) {
42
43         try {
44             MessageDigest md = (MessageDigest)messageDigestTemplate.clone();
45             md.update(inputString.getBytes("UTF-8"), 0, inputString.length());
46             return new BigInteger(1, md.digest()).toString(16);
47         } catch (Exception e) {
48             throw new RuntimeException("Unable to get MD5 instance");
49         }
50     }
51
52     public static <T> Future<RpcResult<T>> resultFor(final T output) {
53         RpcResult<T> result = Rpcs.getRpcResult(true, output, Collections.<RpcError>emptyList());
54         return Futures.immediateFuture(result);
55     }
56
57     /**
58      * Extracts affected node from data change event.
59      * @param event
60      * @return
61      */
62     public static Node getAffectedNode(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> event) {
63         // TODO: expect listener method to be called even when change impact node
64         // TODO: test with change.getCreatedData()
65         for (Map.Entry<InstanceIdentifier<?>, DataObject> changeEntry : event.getUpdatedData().entrySet()) {
66             if (isNode(changeEntry)) {
67                 return (Node) changeEntry.getValue();
68             }
69         }
70
71         return null;
72     }
73
74     private static boolean isNode(final Map.Entry<InstanceIdentifier<?>, DataObject> changeEntry )  {
75         return Node.class.equals(changeEntry.getKey().getTargetType());
76     }
77
78     /**
79      * Method filters qnames based on wildcard strings
80      *
81      * @param availableQnames
82      * @param patterh matching pattern
83      * @return list of filtered qnames
84      */
85     public static List<QName> expandQname(final List<QName> availableQnames, final Pattern pattern) {
86         List<QName> matchingQnames = new ArrayList<>();
87
88         for (QName qname : availableQnames) {
89             String namespace = qname.getNamespace().toString();
90             if (pattern.matcher(namespace).matches()) {
91                 matchingQnames.add(qname);
92             }
93         }
94
95         return matchingQnames;
96     }
97
98     /**
99      * CREDIT to http://www.rgagnon.com/javadetails/java-0515.html
100      * @param wildcard
101      * @return
102      */
103     static String wildcardToRegex(final String wildcard){
104         StringBuffer s = new StringBuffer(wildcard.length());
105         s.append('^');
106         for (char c : wildcard.toCharArray()) {
107             switch(c) {
108                 case '*':
109                     s.append(".*");
110                     break;
111                 case '?':
112                     s.append('.');
113                     break;
114                 // escape special regexp-characters
115                 case '(':
116                 case ')':
117                 case '[':
118                 case ']':
119                 case '$':
120                 case '^':
121                 case '.':
122                 case '{':
123                 case '}':
124                 case '|':
125                 case '\\':
126                     s.append("\\");
127                     s.append(c);
128                     break;
129                 default:
130                     s.append(c);
131                     break;
132             }
133         }
134         s.append('$');
135         return s.toString();
136     }
137 }