1 package org.opendaylight.yangtools.sal.binding.generator.impl;
3 import java.util.HashSet;
4 import java.util.Iterator;
7 import org.opendaylight.yangtools.yang.binding.Augmentation;
8 import org.opendaylight.yangtools.yang.binding.BindingMapping;
9 import org.opendaylight.yangtools.yang.binding.ChildOf;
10 import org.opendaylight.yangtools.yang.binding.DataObject;
11 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
12 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
13 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
14 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
15 import org.opendaylight.yangtools.yang.common.QName;
16 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
17 import org.opendaylight.yangtools.yang.model.api.AugmentationTarget;
18 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
19 import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
20 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
21 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
22 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
23 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
24 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
26 import com.google.common.base.Optional;
27 import com.google.common.base.Preconditions;
29 public class BindingSchemaContextUtils {
31 // FIXME: THis method does not search in case augmentations.
32 public static Optional<DataNodeContainer> findDataNodeContainer(final SchemaContext ctx,
33 final InstanceIdentifier<?> path) {
34 Iterator<PathArgument> pathArguments = path.getPathArguments().iterator();
35 PathArgument currentArg = pathArguments.next();
36 Preconditions.checkArgument(currentArg != null);
37 QName currentQName = BindingReflections.findQName(currentArg.getType());
39 Optional<DataNodeContainer> currentContainer = Optional.absent();
40 if (BindingReflections.isNotification(currentArg.getType())) {
41 currentContainer = findNotification(ctx, currentQName);
42 } else if (BindingReflections.isRpcType(currentArg.getType())) {
43 currentContainer = findFirstDataNodeContainerInRpc(ctx, currentArg.getType());
44 if(currentQName == null && currentContainer.isPresent()) {
45 currentQName = ((DataSchemaNode) currentContainer.get()).getQName();
48 currentContainer = findDataNodeContainer(ctx, currentQName);
51 while (currentContainer.isPresent() && pathArguments.hasNext()) {
52 currentArg = pathArguments.next();
53 if (Augmentation.class.isAssignableFrom(currentArg.getType())) {
54 currentQName = BindingReflections.findQName(currentArg.getType());
55 if(pathArguments.hasNext()) {
56 currentArg = pathArguments.next();
58 return Optional.absent();
61 if(ChildOf.class.isAssignableFrom(currentArg.getType()) && BindingReflections.isAugmentationChild(currentArg.getType())) {
62 currentQName = BindingReflections.findQName(currentArg.getType());
64 currentQName = QName.create(currentQName, BindingReflections.findQName(currentArg.getType()).getLocalName());
66 Optional<DataNodeContainer> potential = findDataNodeContainer(currentContainer.get(), currentQName);
67 if (potential.isPresent()) {
68 currentContainer = potential;
70 return Optional.absent();
73 return currentContainer;
76 private static Optional<DataNodeContainer> findNotification(final SchemaContext ctx, final QName notificationQName) {
77 for (NotificationDefinition notification : ctx.getNotifications()) {
78 if (notification.getQName().equals(notificationQName)) {
79 return Optional.<DataNodeContainer> of(notification);
82 return Optional.absent();
85 private static Optional<DataNodeContainer> findDataNodeContainer(final DataNodeContainer ctx,
86 final QName targetQName) {
88 for (DataSchemaNode child : ctx.getChildNodes()) {
89 if (child instanceof ChoiceNode) {
90 DataNodeContainer potential = findInCases(((ChoiceNode) child), targetQName);
91 if (potential != null) {
92 return Optional.of(potential);
94 } else if (child instanceof DataNodeContainer && child.getQName().equals(targetQName)) {
95 return Optional.of((DataNodeContainer) child);
96 } else if (child instanceof DataNodeContainer //
97 && child.isAddedByUses() //
98 && child.getQName().getLocalName().equals(targetQName.getLocalName())) {
99 return Optional.of((DataNodeContainer) child);
103 return Optional.absent();
106 private static DataNodeContainer findInCases(final ChoiceNode choiceNode, final QName targetQName) {
107 for (ChoiceCaseNode caze : choiceNode.getCases()) {
108 Optional<DataNodeContainer> potential = findDataNodeContainer(caze, targetQName);
109 if (potential.isPresent()) {
110 return potential.get();
116 private static Optional<DataNodeContainer> findFirstDataNodeContainerInRpc(final SchemaContext ctx,
117 final Class<? extends DataObject> targetType) {
118 final YangModuleInfo moduleInfo;
120 moduleInfo = BindingReflections.getModuleInfo(targetType);
121 } catch (Exception e) {
122 throw new IllegalArgumentException(
123 String.format("Failed to load module information for class %s", targetType), e);
126 for(RpcDefinition rpc : ctx.getOperations()) {
127 String rpcNamespace = rpc.getQName().getNamespace().toString();
128 String rpcRevision = rpc.getQName().getFormattedRevision();
129 if(moduleInfo.getNamespace().equals(rpcNamespace) && moduleInfo.getRevision().equals(rpcRevision)) {
130 Optional<DataNodeContainer> potential = findInputOutput(rpc,targetType.getSimpleName());
131 if(potential.isPresent()) {
136 return Optional.absent();
139 private static Optional<DataNodeContainer> findInputOutput(final RpcDefinition rpc, final String targetType) {
140 String rpcName = BindingMapping.getClassName(rpc.getQName());
141 String rpcInputName = rpcName + BindingMapping.RPC_INPUT_SUFFIX;
142 String rpcOutputName = rpcName + BindingMapping.RPC_OUTPUT_SUFFIX;
143 if(targetType.equals(rpcInputName)) {
144 return Optional.<DataNodeContainer>of(rpc.getInput());
145 } else if (targetType.equals(rpcOutputName)) {
146 return Optional.<DataNodeContainer>of(rpc.getOutput());
148 return Optional.absent();
151 public static Set<AugmentationSchema> collectAllAugmentationDefinitions(final SchemaContext currentSchema, final AugmentationTarget ctxNode) {
152 HashSet<AugmentationSchema> augmentations = new HashSet<>();
153 augmentations.addAll(ctxNode.getAvailableAugmentations());
154 if(ctxNode instanceof DataSchemaNode && ((DataSchemaNode) ctxNode).isAddedByUses()) {
156 System.out.println(ctxNode);
160 // TODO Auto-generated method stub
161 return augmentations;