b149abca017b9e8a065acd5f019157559c08c473
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / schema / builder / impl / ImmutableMapNodeBuilder.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 package org.opendaylight.yangtools.yang.data.impl.schema.builder.impl;
9
10 import java.util.List;
11 import java.util.Map;
12
13 import org.opendaylight.yangtools.concepts.Immutable;
14 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
15 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
16 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
17 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
18 import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableNormalizedNode;
19
20 import com.google.common.base.Optional;
21 import com.google.common.collect.Maps;
22
23 public class ImmutableMapNodeBuilder
24         implements CollectionNodeBuilder<MapEntryNode, MapNode> {
25
26     protected Map<InstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> value = Maps.newLinkedHashMap();
27     protected InstanceIdentifier.NodeIdentifier nodeIdentifier;
28
29     public static CollectionNodeBuilder<MapEntryNode, MapNode> create() {
30         return new ImmutableMapNodeBuilder();
31     }
32
33     @Override
34     public CollectionNodeBuilder<MapEntryNode, MapNode> withChild(final MapEntryNode child) {
35         this.value.put(child.getIdentifier(), child);
36         return this;
37     }
38
39     @Override
40     public CollectionNodeBuilder<MapEntryNode, MapNode> withValue(final List<MapEntryNode> value) {
41         // TODO replace or putAll ?
42         for (MapEntryNode mapEntryNode : value) {
43             withChild(mapEntryNode);
44         }
45
46         return this;
47     }
48
49     @Override
50     public CollectionNodeBuilder<MapEntryNode, MapNode> withNodeIdentifier(final InstanceIdentifier.NodeIdentifier nodeIdentifier) {
51         this.nodeIdentifier = nodeIdentifier;
52         return this;
53     }
54
55     @Override
56     public MapNode build() {
57         return new ImmutableMapNode(nodeIdentifier, value);
58     }
59
60     @Override
61     public CollectionNodeBuilder<MapEntryNode, MapNode> addChild(
62             final MapEntryNode child) {
63         return withChild(child);
64     }
65
66     static final class ImmutableMapNode extends AbstractImmutableNormalizedNode<InstanceIdentifier.NodeIdentifier, Iterable<MapEntryNode>> implements Immutable,MapNode {
67
68         private final Map<InstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> mappedChildren;
69
70         ImmutableMapNode(final InstanceIdentifier.NodeIdentifier nodeIdentifier,
71                          final Map<InstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> children) {
72             super(nodeIdentifier, children.values());
73             this.mappedChildren = children;
74         }
75
76         @Override
77         public Optional<MapEntryNode> getChild(final InstanceIdentifier.NodeIdentifierWithPredicates child) {
78             return Optional.fromNullable(mappedChildren.get(child));
79         }
80
81         @Override
82         public String toString() {
83             final StringBuffer sb = new StringBuffer("ImmutableMapNode{");
84             sb.append("nodeIdentifier=").append(nodeIdentifier);
85             sb.append(", children=").append(mappedChildren);
86             sb.append('}');
87             return sb.toString();
88         }
89     }
90 }