645183394f58a2d01ef63f0885dcc7d4263bdebb
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / entityownership / EntityOwnersModel.java
1 /*
2  * Copyright (c) 2015 Brocade Communications 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 package org.opendaylight.controller.cluster.datastore.entityownership;
9
10 import java.util.Map.Entry;
11 import org.opendaylight.mdsal.eos.dom.api.DOMEntity;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.clustering.entity.owners.rev150804.EntityOwners;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.clustering.entity.owners.rev150804.entity.owners.EntityType;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.clustering.entity.owners.rev150804.entity.owners.entity.type.Entity;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.clustering.entity.owners.rev150804.entity.owners.entity.type.entity.Candidate;
16 import org.opendaylight.yangtools.util.SharedSingletonMapTemplate;
17 import org.opendaylight.yangtools.yang.common.QName;
18 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
19 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
20 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
21 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
22 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
23 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
24 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
25 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
26 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
27 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
28 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedMapNodeBuilder;
29
30 /**
31  * Utility methods for entity-owners yang model.
32  *
33  * @author Thomas Pantelis
34  */
35 public final class EntityOwnersModel {
36     static final QName ENTITY_QNAME = Entity.QNAME;
37     static final QName CANDIDATE_NAME_QNAME = QName.create(Candidate.QNAME, "name");
38     static final QName ENTITY_ID_QNAME = QName.create(ENTITY_QNAME, "id");
39     static final QName ENTITY_OWNER_QNAME = QName.create(ENTITY_QNAME, "owner");
40     static final QName ENTITY_TYPE_QNAME = QName.create(EntityType.QNAME, "type");
41
42     static final NodeIdentifier ENTITY_OWNERS_NODE_ID = new NodeIdentifier(EntityOwners.QNAME);
43     static final NodeIdentifier ENTITY_OWNER_NODE_ID = new NodeIdentifier(ENTITY_OWNER_QNAME);
44     static final NodeIdentifier ENTITY_NODE_ID = new NodeIdentifier(ENTITY_QNAME);
45     static final NodeIdentifier ENTITY_ID_NODE_ID = new NodeIdentifier(ENTITY_ID_QNAME);
46     static final NodeIdentifier ENTITY_TYPE_NODE_ID = new NodeIdentifier(ENTITY_TYPE_QNAME);
47     static final NodeIdentifier CANDIDATE_NODE_ID = new NodeIdentifier(Candidate.QNAME);
48     static final NodeIdentifier CANDIDATE_NAME_NODE_ID = new NodeIdentifier(CANDIDATE_NAME_QNAME);
49     static final YangInstanceIdentifier ENTITY_OWNERS_PATH = YangInstanceIdentifier.of(EntityOwners.QNAME);
50     static final YangInstanceIdentifier ENTITY_TYPES_PATH =
51             YangInstanceIdentifier.of(EntityOwners.QNAME).node(EntityType.QNAME);
52
53     private static final SharedSingletonMapTemplate<QName> NODE_KEY_TEMPLATE = SharedSingletonMapTemplate.ordered(
54         CANDIDATE_NAME_QNAME);
55
56     private EntityOwnersModel() {
57     }
58
59     static YangInstanceIdentifier entityPath(final String entityType, final YangInstanceIdentifier entityId) {
60         return YangInstanceIdentifier.builder(ENTITY_OWNERS_PATH).node(EntityType.QNAME)
61                 .nodeWithKey(EntityType.QNAME, ENTITY_TYPE_QNAME, entityType).node(ENTITY_QNAME)
62                         .nodeWithKey(ENTITY_QNAME, ENTITY_ID_QNAME, entityId).build();
63
64     }
65
66     static YangInstanceIdentifier candidatePath(final String entityType, final YangInstanceIdentifier entityId,
67             final String candidateName) {
68         return YangInstanceIdentifier.builder(ENTITY_OWNERS_PATH).node(EntityType.QNAME)
69                 .nodeWithKey(EntityType.QNAME, ENTITY_TYPE_QNAME, entityType).node(ENTITY_QNAME)
70                         .nodeWithKey(ENTITY_QNAME, ENTITY_ID_QNAME, entityId).node(Candidate.QNAME)
71                                 .nodeWithKey(Candidate.QNAME, CANDIDATE_NAME_QNAME, candidateName).build();
72     }
73
74     static YangInstanceIdentifier candidatePath(final YangInstanceIdentifier entityPath, final String candidateName) {
75         return YangInstanceIdentifier.builder(entityPath).node(Candidate.QNAME).nodeWithKey(
76                 Candidate.QNAME, CANDIDATE_NAME_QNAME, candidateName).build();
77     }
78
79     static NodeIdentifierWithPredicates candidateNodeKey(final String candidateName) {
80         return new NodeIdentifierWithPredicates(Candidate.QNAME, NODE_KEY_TEMPLATE.instantiateWithValue(candidateName));
81     }
82
83     static NormalizedNode<?, ?> entityOwnersWithCandidate(final String entityType,
84             final YangInstanceIdentifier entityId, final String candidateName) {
85         return entityOwnersWithEntityTypeEntry(entityTypeEntryWithEntityEntry(entityType,
86                 entityEntryWithCandidateEntry(entityId, candidateName)));
87     }
88
89     static ContainerNode entityOwnersWithEntityTypeEntry(final MapEntryNode entityTypeNode) {
90         return ImmutableContainerNodeBuilder.create().withNodeIdentifier(
91                 ENTITY_OWNERS_NODE_ID).addChild(ImmutableNodes.mapNodeBuilder(EntityType.QNAME)
92                         .addChild(entityTypeNode).build()).build();
93     }
94
95     static MapEntryNode entityTypeEntryWithEntityEntry(final String entityType, final MapEntryNode entityNode) {
96         return ImmutableNodes.mapEntryBuilder(EntityType.QNAME,
97                 ENTITY_TYPE_QNAME, entityType).addChild(ImmutableNodes.mapNodeBuilder(
98                         ENTITY_QNAME).addChild(entityNode).build()).build();
99     }
100
101     static MapEntryNode entityEntryWithCandidateEntry(final YangInstanceIdentifier entityId,
102             final String candidateName) {
103         return ImmutableNodes.mapEntryBuilder(ENTITY_QNAME, ENTITY_ID_QNAME, entityId).addChild(
104                 candidateEntry(candidateName)).build();
105     }
106
107     static MapNode candidateEntry(final String candidateName) {
108         return ImmutableOrderedMapNodeBuilder.create().withNodeIdentifier(new NodeIdentifier(Candidate.QNAME))
109                 .addChild(candidateMapEntry(candidateName)).build();
110     }
111
112     static MapEntryNode candidateMapEntry(final String candidateName) {
113         return ImmutableNodes.mapEntry(Candidate.QNAME, CANDIDATE_NAME_QNAME, candidateName);
114     }
115
116     static MapEntryNode entityEntryWithOwner(final YangInstanceIdentifier entityId, final String owner) {
117         return ImmutableNodes.mapEntryBuilder(ENTITY_QNAME, ENTITY_ID_QNAME, entityId)
118                 .addChild(ImmutableNodes.leafNode(ENTITY_OWNER_QNAME, owner != null ? owner : ""))
119                 .build();
120     }
121
122     public static String entityTypeFromEntityPath(final YangInstanceIdentifier entityPath) {
123         YangInstanceIdentifier parent = entityPath;
124         while (!parent.isEmpty()) {
125             if (EntityType.QNAME.equals(parent.getLastPathArgument().getNodeType())) {
126                 YangInstanceIdentifier.NodeIdentifierWithPredicates entityTypeLastPathArgument =
127                         (YangInstanceIdentifier.NodeIdentifierWithPredicates) parent.getLastPathArgument();
128                 return (String) entityTypeLastPathArgument.getKeyValues().get(ENTITY_TYPE_QNAME);
129             }
130             parent = parent.getParent();
131         }
132         return null;
133     }
134
135     static DOMEntity createEntity(final YangInstanceIdentifier entityPath) {
136         String entityType = null;
137         YangInstanceIdentifier entityId = null;
138         for (PathArgument pathArg: entityPath.getPathArguments()) {
139             if (pathArg instanceof NodeIdentifierWithPredicates) {
140                 NodeIdentifierWithPredicates nodeKey = (NodeIdentifierWithPredicates) pathArg;
141                 Entry<QName, Object> key = nodeKey.getKeyValues().entrySet().iterator().next();
142                 if (ENTITY_TYPE_QNAME.equals(key.getKey())) {
143                     entityType = key.getValue().toString();
144                 } else if (ENTITY_ID_QNAME.equals(key.getKey())) {
145                     entityId = (YangInstanceIdentifier) key.getValue();
146                 }
147             }
148         }
149
150         return new DOMEntity(entityType, entityId);
151     }
152 }