2 * Copyright (c) 2016 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.cluster.datastore.utils;
11 import akka.cluster.ddata.Key;
12 import akka.cluster.ddata.ORMap;
13 import akka.cluster.ddata.ORMapKey;
15 import org.opendaylight.controller.cluster.access.concepts.MemberName;
16 import org.opendaylight.controller.cluster.datastore.config.PrefixShardConfiguration;
17 import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier;
18 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
19 import org.opendaylight.yangtools.yang.common.QName;
20 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
21 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
24 * Utils for encoding prefix shard name.
26 public class ClusterUtils {
28 // key for replicated configuration key
29 public static final Key<ORMap<PrefixShardConfiguration>> CONFIGURATION_KEY =
30 ORMapKey.create("prefix-shard-configuration");
32 public static ShardIdentifier getShardIdentifier(final MemberName memberName, final DOMDataTreeIdentifier prefix) {
34 switch (prefix.getDatastoreType()) {
42 type = prefix.getDatastoreType().name();
45 return ShardIdentifier.create(getCleanShardName(prefix.getRootIdentifier()), memberName, type);
49 * Returns an encoded shard name based on the provided path that should doesn't contain characters that cannot be
50 * present in akka actor paths.
52 * @param path Path on which to base the shard name
53 * @return encoded name that doesn't contain characters that cannot be in actor path.
55 public static String getCleanShardName(final YangInstanceIdentifier path) {
60 final StringBuilder builder = new StringBuilder();
61 // TODO need a better mapping that includes namespace, but we'll need to cleanup the string beforehand
62 // we have to fight both javax and akka url path restrictions..
63 path.getPathArguments().forEach(p -> {
64 builder.append(p.getNodeType().getLocalName());
65 if (p instanceof NodeIdentifierWithPredicates) {
66 builder.append("-key_");
67 final Map<QName, Object> key = ((NodeIdentifierWithPredicates) p).getKeyValues();
68 key.entrySet().forEach(e -> {
69 builder.append(e.getKey().getLocalName());
70 builder.append(e.getValue());
77 return builder.toString();