Add hooking into NormalizedNodeParsers.
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / schema / transform / base / parser / LeafSetEntryNodeBaseParser.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.transform.base.parser;
9
10 import com.google.common.base.Preconditions;
11 import com.google.common.collect.Iterables;
12 import java.util.Map;
13 import org.opendaylight.yangtools.yang.common.QName;
14 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
15 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
16 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
17 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
18 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeAttrBuilder;
19 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeBuilder;
20 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
21
22 /**
23  * Abstract(base) parser for LeafSetEntryNodes, parses elements of type E.
24  *
25  * @param <E> type of elements to be parsed
26  */
27 public abstract class LeafSetEntryNodeBaseParser<E> implements ExtensibleParser<YangInstanceIdentifier.NodeWithValue, E, LeafSetEntryNode<?>, LeafListSchemaNode> {
28
29     private final BuildingStrategy<YangInstanceIdentifier.NodeWithValue, LeafSetEntryNode<?>> buildingStrategy;
30
31     public LeafSetEntryNodeBaseParser() {
32         buildingStrategy = new SimpleLeafSetEntryBuildingStrategy();
33     }
34
35     public LeafSetEntryNodeBaseParser(final BuildingStrategy<YangInstanceIdentifier.NodeWithValue, LeafSetEntryNode<?>> buildingStrategy) {
36         this.buildingStrategy = buildingStrategy;
37     }
38
39     @SuppressWarnings("unchecked")
40     @Override
41     public final LeafSetEntryNode<?> parse(Iterable<E> elements, LeafListSchemaNode schema) {
42         final int size = Iterables.size(elements);
43         Preconditions.checkArgument(size == 1, "Xml elements mapped to leaf node illegal count: %s", size);
44
45         final E e = elements.iterator().next();
46         Object value = parseLeafListEntry(e,schema);
47
48         NormalizedNodeAttrBuilder<YangInstanceIdentifier.NodeWithValue, Object, LeafSetEntryNode<Object>> leafEntryBuilder = Builders
49                 .leafSetEntryBuilder(schema);
50         leafEntryBuilder.withAttributes(getAttributes(e));
51         leafEntryBuilder.withValue(value);
52
53         final BuildingStrategy rawBuildingStrat = buildingStrategy;
54         return (LeafSetEntryNode<?>) rawBuildingStrat.build(leafEntryBuilder);
55     }
56
57     @Override
58     public BuildingStrategy<NodeWithValue, LeafSetEntryNode<?>> getBuildingStrategy() {
59         return buildingStrategy;
60     }
61
62     /**
63      *
64      * Parse the inner value of a LeafSetEntryNode from element of type E.
65      *
66      * @param element to be parsed
67      * @param schema schema for leaf-list
68      * @return parsed element as an Object
69      */
70     protected abstract Object parseLeafListEntry(E element, LeafListSchemaNode schema);
71
72     /**
73      *
74      * @param e
75      * @return attributes mapped to QNames
76      */
77     protected abstract Map<QName, String> getAttributes(E e);
78
79     public static class SimpleLeafSetEntryBuildingStrategy implements BuildingStrategy<YangInstanceIdentifier.NodeWithValue, LeafSetEntryNode<?>> {
80
81         @Override
82         public LeafSetEntryNode<?> build(final NormalizedNodeBuilder<NodeWithValue, ?, LeafSetEntryNode<?>> builder) {
83             return builder.build();
84         }
85
86         @Override
87         public void prepareAttributes(final Map<QName, String> attributes, final NormalizedNodeBuilder<NodeWithValue, ?, LeafSetEntryNode<?>> containerBuilder) {
88         }
89     }
90 }