2 * Copyright (c) 2014 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
8 package org.opendaylight.yangtools.yang.data.codec.gson;
10 import static org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter.UNKNOWN_SIZE;
12 import java.io.IOException;
13 import java.util.HashMap;
14 import java.util.List;
17 import org.opendaylight.yangtools.yang.common.QName;
18 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
19 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
20 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
21 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
22 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
24 class ListEntryNodeDataWithSchema extends CompositeNodeDataWithSchema {
26 private final Map<QName, SimpleNodeDataWithSchema> qNameToKeys = new HashMap<>();
28 public ListEntryNodeDataWithSchema(final DataSchemaNode schema) {
33 public void addChild(final AbstractNodeDataWithSchema newChild) {
34 DataSchemaNode childSchema = newChild.getSchema();
35 if (childSchema instanceof LeafSchemaNode && isPartOfKey((LeafSchemaNode) childSchema)) {
36 qNameToKeys.put(childSchema.getQName(), (SimpleNodeDataWithSchema)newChild);
38 super.addChild(newChild);
41 private boolean isPartOfKey(final LeafSchemaNode potentialKey) {
42 List<QName> keys = ((ListSchemaNode) getSchema()).getKeyDefinition();
43 for (QName qName : keys) {
44 if (qName.equals(potentialKey.getQName())) {
52 protected void writeToStream(final NormalizedNodeStreamWriter nnStreamWriter) throws IOException {
53 int keyCount = ((ListSchemaNode) getSchema()).getKeyDefinition().size();
55 nnStreamWriter.startUnkeyedListItem(provideNodeIdentifier(), UNKNOWN_SIZE);
56 super.writeToStream(nnStreamWriter);
57 nnStreamWriter.endNode();
58 } else if (keyCount == qNameToKeys.size()) {
59 nnStreamWriter.startMapEntryNode(provideNodeIdentifierWithPredicates(), UNKNOWN_SIZE);
60 super.writeToStream(nnStreamWriter);
61 nnStreamWriter.endNode();
63 throw new IllegalStateException("Some of keys of " + getSchema().getQName() + " are missing in input.");
67 private NodeIdentifierWithPredicates provideNodeIdentifierWithPredicates() {
68 Map<QName, Object> qNameToPredicateValues = new HashMap<>();
70 for (SimpleNodeDataWithSchema simpleNodeDataWithSchema : qNameToKeys.values()) {
71 qNameToPredicateValues.put(simpleNodeDataWithSchema.getSchema().getQName(), simpleNodeDataWithSchema.getValue());
74 return new NodeIdentifierWithPredicates(getSchema().getQName(), qNameToPredicateValues);