*/
package org.opendaylight.yangtools.sal.binding.generator.util;
-import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
+import com.google.common.base.Preconditions;
import java.net.URI;
import java.util.Date;
-import java.util.List;
-
+import java.util.Iterator;
+import javax.annotation.Nullable;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
+import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
import org.opendaylight.yangtools.yang.model.api.NamespaceRevisionAware;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
public static QName getAugmentationQName(final AugmentationSchema augmentation) {
checkNotNull(augmentation, "Augmentation must not be null.");
- QName identifier = getAugmentationIdentifier(augmentation);
+ final QName identifier = getAugmentationIdentifier(augmentation);
if(identifier != null) {
return identifier;
}
revision = ((NamespaceRevisionAware) augmentation).getRevision();
}
if(namespace == null || revision == null) {
- for(DataSchemaNode child : augmentation.getChildNodes()) {
+ for(final DataSchemaNode child : augmentation.getChildNodes()) {
// Derive QName from child nodes
if(!child.isAugmenting()) {
namespace = child.getQName().getNamespace();
}
public static QName getAugmentationIdentifier(final AugmentationSchema augmentation) {
- for(UnknownSchemaNode extension : augmentation.getUnknownSchemaNodes()) {
+ for(final UnknownSchemaNode extension : augmentation.getUnknownSchemaNodes()) {
if(AUGMENT_IDENTIFIER.equals(extension.getNodeType().getLocalName())) {
return extension.getQName();
}
return null;
}
+ @Nullable
public static TypeDefinition<?> findTypeDefinition(final SchemaContext context, final SchemaPath path) {
- List<QName> arguments = path.getPath();
- QName first = arguments.get(0);
- QName typeQName = arguments.get(arguments.size() -1);
- DataNodeContainer previous = context.findModuleByNamespaceAndRevision(first.getNamespace(), first.getRevision());
- if(previous == null) {
+ final Iterator<QName> arguments = path.getPathFromRoot().iterator();
+ Preconditions.checkArgument(arguments.hasNext(), "Type Definition path must contain at least one element.");
+
+ QName currentArg = arguments.next();
+ DataNodeContainer currentNode = context.findModuleByNamespaceAndRevision(currentArg.getNamespace(), currentArg.getRevision());
+ if(currentNode == null) {
return null;
}
- checkArgument(arguments.size() == 1);
- for(TypeDefinition<?> typedef : previous.getTypeDefinitions()) {
- if(typedef.getQName().equals(typeQName)) {
+ // Last argument is type definition, so we need to cycle until we hit last argument.
+ while(arguments.hasNext()) {
+ // Nested private type - we need to find container/grouping to which type belongs.
+ final DataSchemaNode child = currentNode.getDataChildByName(currentArg);
+ if(child instanceof DataNodeContainer) {
+ currentNode = (DataNodeContainer) child;
+ } else if (child instanceof ChoiceNode) {
+ final QName caseQName = arguments.next();
+ Preconditions.checkArgument(arguments.hasNext(), "Path must not refer case only.");
+ currentNode = ((ChoiceNode) child).getCaseNodeByName(caseQName);
+ } else {
+ // Search in grouping
+ for( final GroupingDefinition grouping : currentNode.getGroupings()) {
+ if(currentArg.equals(grouping.getQName())) {
+ currentNode = grouping;
+ break;
+ }
+ }
+ }
+ currentArg = arguments.next();
+ }
+
+ for(final TypeDefinition<?> typedef : currentNode.getTypeDefinitions()) {
+ if(typedef.getQName().equals(currentArg)) {
return typedef;
}
}