2 * Copyright (c) 2013 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
9 package org.opendaylight.controller.messagebus.app.impl;
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;
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;
30 public final class Util {
31 private static final MessageDigest messageDigestTemplate = getDigestInstance();
33 private static MessageDigest getDigestInstance() {
35 return MessageDigest.getInstance("MD5");
36 } catch (NoSuchAlgorithmException e) {
37 throw new RuntimeException("Unable to get MD5 instance");
41 public static String md5String(final String inputString) {
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");
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);
58 * Extracts affected node from data change event.
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();
74 private static boolean isNode(final Map.Entry<InstanceIdentifier<?>, DataObject> changeEntry ) {
75 return Node.class.equals(changeEntry.getKey().getTargetType());
79 * Method filters qnames based on wildcard strings
81 * @param availableQnames
82 * @param patterh matching pattern
83 * @return list of filtered qnames
85 public static List<QName> expandQname(final List<QName> availableQnames, final Pattern pattern) {
86 List<QName> matchingQnames = new ArrayList<>();
88 for (QName qname : availableQnames) {
89 String namespace = qname.getNamespace().toString();
90 if (pattern.matcher(namespace).matches()) {
91 matchingQnames.add(qname);
95 return matchingQnames;
99 * CREDIT to http://www.rgagnon.com/javadetails/java-0515.html
103 static String wildcardToRegex(final String wildcard){
104 StringBuffer s = new StringBuffer(wildcard.length());
106 for (char c : wildcard.toCharArray()) {
114 // escape special regexp-characters