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.binding.data.codec.impl;
10 import com.google.common.base.Optional;
11 import com.google.common.base.Preconditions;
12 import com.google.common.collect.ImmutableMap;
13 import com.google.common.collect.Iterables;
14 import java.util.HashMap;
16 import org.opendaylight.yangtools.yang.binding.DataObject;
17 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
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.schema.NormalizedNode;
21 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer;
22 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
23 import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
24 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
28 final class ChoiceNodeCodecContext extends DataContainerCodecContext<ChoiceNode> {
29 private static final Logger LOG = LoggerFactory.getLogger(ChoiceNodeCodecContext.class);
30 private final ImmutableMap<YangInstanceIdentifier.PathArgument, DataContainerCodecPrototype<?>> byYangCaseChild;
31 private final ImmutableMap<Class<?>, DataContainerCodecPrototype<?>> byClass;
32 private final ImmutableMap<Class<?>, DataContainerCodecPrototype<?>> byCaseChildClass;
34 public ChoiceNodeCodecContext(final DataContainerCodecPrototype<ChoiceNode> prototype) {
36 Map<YangInstanceIdentifier.PathArgument, DataContainerCodecPrototype<?>> byYangCaseChildBuilder = new HashMap<>();
37 Map<Class<?>, DataContainerCodecPrototype<?>> byClassBuilder = new HashMap<>();
38 Map<Class<?>, DataContainerCodecPrototype<?>> byCaseChildClassBuilder = new HashMap<>();
40 for (Class<?> caze : factory().getRuntimeContext().getCases(bindingClass())) {
41 DataContainerCodecPrototype<ChoiceCaseNode> cazeDef = loadCase(caze);
42 if (cazeDef != null) {
43 byClassBuilder.put(cazeDef.getBindingClass(), cazeDef);
44 for (Class<? extends DataObject> cazeChild : BindingReflections.getChildrenClasses((Class) caze)) {
45 byCaseChildClassBuilder.put(cazeChild, cazeDef);
47 for (DataSchemaNode cazeChild : cazeDef.getSchema().getChildNodes()) {
48 byYangCaseChildBuilder.put(new NodeIdentifier(cazeChild.getQName()), cazeDef);
53 byYangCaseChild = ImmutableMap.copyOf(byYangCaseChildBuilder);
54 byClass = ImmutableMap.copyOf(byClassBuilder);
55 byCaseChildClass = ImmutableMap.copyOf(byCaseChildClassBuilder);
59 protected DataContainerCodecContext<?> getStreamChild(final Class<?> childClass) {
60 DataContainerCodecPrototype<?> child = byClass.get(childClass);
61 Preconditions.checkArgument(child != null,"Supplied class is not valid case",childClass);
66 protected Optional<DataContainerCodecContext<?>> getPossibleStreamChild(final Class<?> childClass) {
67 DataContainerCodecPrototype<?> child = byClass.get(childClass);
69 return Optional.<DataContainerCodecContext<?>>of(child.get());
71 return Optional.absent();
74 Iterable<Class<?>> getCaseChildrenClasses() {
75 return byCaseChildClass.keySet();
78 protected DataContainerCodecPrototype<ChoiceCaseNode> loadCase(final Class<?> childClass) {
79 Optional<ChoiceCaseNode> childSchema = factory().getRuntimeContext().getCaseSchemaDefinition(schema(), childClass);
80 if (childSchema.isPresent()) {
81 return DataContainerCodecPrototype.from(childClass, childSchema.get(), factory());
84 LOG.debug("Supplied class %s is not valid case in schema %s", childClass, schema());
89 protected NodeCodecContext getYangIdentifierChild(final YangInstanceIdentifier.PathArgument arg) {
90 DataContainerCodecPrototype<?> cazeProto = byYangCaseChild.get(arg);
91 Preconditions.checkArgument(cazeProto != null, "Argument %s is not valid child of %s", arg, schema());
92 return cazeProto.get().getYangIdentifierChild(arg);
96 protected Object dataFromNormalizedNode(final NormalizedNode<?, ?> data) {
98 .checkArgument(data instanceof org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode);
99 NormalizedNodeContainer<?, ?, NormalizedNode<?,?>> casted = (NormalizedNodeContainer<?, ?, NormalizedNode<?,?>>) data;
100 NormalizedNode<?, ?> first = Iterables.getFirst(casted.getValue(), null);
105 DataContainerCodecPrototype<?> caze = byYangCaseChild.get(first.getIdentifier());
106 return caze.get().dataFromNormalizedNode(data);
109 public DataContainerCodecContext<?> getCazeByChildClass(final Class<? extends DataObject> type) {
110 return byCaseChildClass.get(type).get();