import org.opendaylight.yangtools.yang.model.api.*;
import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder;
import org.opendaylight.yangtools.yang.parser.util.Comparators;
-import org.opendaylight.yangtools.yang.parser.util.YangParseException;
public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
private boolean isBuilt;
instance = new IdentitySchemaNodeImpl(qname, path, derivedIdentities);
}
+ IdentitySchemaNodeBuilder(final String moduleName, IdentitySchemaNode base) {
+ super(moduleName, 0, base.getQName());
+ schemaPath = base.getPath();
+ derivedIdentities.addAll(base.getDerivedIdentities());
+ unknownNodes.addAll(base.getUnknownSchemaNodes());
+ instance = new IdentitySchemaNodeImpl(qname, schemaPath, derivedIdentities);
+ }
+
@Override
public IdentitySchemaNode build() {
if (!isBuilt) {
- if (!(parentBuilder instanceof ModuleBuilder)) {
- throw new YangParseException(moduleName, line, "Identity can be defined only under module (was" + parentBuilder + ")");
- }
- if (baseIdentity == null) {
- if(baseIdentityBuilder != null) {
- baseIdentityBuilder.addDerivedIdentity(instance);
- baseIdentity = baseIdentityBuilder.build();
- }
- } else {
- if(baseIdentity instanceof IdentitySchemaNodeImpl) {
- ((IdentitySchemaNodeImpl)baseIdentity).toBuilder().addDerivedIdentity(instance);
- }
+ if(baseIdentityBuilder != null) {
+ baseIdentityBuilder.addDerivedIdentity(instance);
+ baseIdentity = baseIdentityBuilder.build();
}
instance.setBaseIdentity(baseIdentity);
this.baseIdentityBuilder = baseType;
}
- public void setBaseIdentity(final IdentitySchemaNode baseType) {
- this.baseIdentity = baseType;
- }
-
public void addDerivedIdentity(IdentitySchemaNode derivedIdentity) {
if (derivedIdentity != null) {
derivedIdentities.add(derivedIdentity);
return "identity " + qname.getLocalName();
}
- private final class IdentitySchemaNodeImpl implements IdentitySchemaNode {
+ private static final class IdentitySchemaNodeImpl implements IdentitySchemaNode {
private final QName qname;
private final SchemaPath path;
private IdentitySchemaNode baseIdentity;
}
}
- public IdentitySchemaNodeBuilder toBuilder() {
- return IdentitySchemaNodeBuilder.this;
- }
-
@Override
public int hashCode() {
final int prime = 31;
package org.opendaylight.yangtools.yang.parser.impl;
import com.google.common.base.Preconditions;
+
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
-import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
import org.opendaylight.yangtools.yang.model.api.ModuleImport;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.opendaylight.yangtools.yang.parser.util.ParserUtils.fillAugmentTarget;
import static org.opendaylight.yangtools.yang.parser.util.ParserUtils.findBaseIdentity;
-import static org.opendaylight.yangtools.yang.parser.util.ParserUtils.findBaseIdentityFromContext;
import static org.opendaylight.yangtools.yang.parser.util.ParserUtils.findModuleFromBuilders;
import static org.opendaylight.yangtools.yang.parser.util.ParserUtils.findModuleFromContext;
import static org.opendaylight.yangtools.yang.parser.util.ParserUtils.findSchemaNode;
resolveUsesForGroupings(modules, null);
resolveUsesForNodes(modules, null);
resolveAugments(modules, null);
+ resolveIdentities(modules);
resolveDeviations(modules);
// build
resolveUsesForGroupings(modules, context);
resolveUsesForNodes(modules, context);
resolveAugments(modules, context);
+ resolveIdentitiesWithContext(modules, context);
resolveDeviationsWithContext(modules, context);
// build
for (Map.Entry<Date, ModuleBuilder> childEntry : entry.getValue().entrySet()) {
final ModuleBuilder module = childEntry.getValue();
resolveUnknownNodes(modules, module);
- resolveIdentities(modules, module);
resolveDirtyNodes(modules, module);
}
}
for (Map.Entry<Date, ModuleBuilder> childEntry : entry.getValue().entrySet()) {
final ModuleBuilder module = childEntry.getValue();
resolveUnknownNodesWithContext(modules, module, context);
- resolveIdentitiesWithContext(modules, module, context);
resolveDirtyNodesWithContext(modules, module, context);
}
}
return targetModule;
}
+ private ModuleBuilder findTargetModule(final String prefix, final ModuleBuilder module,
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules, final SchemaContext context, final int line) {
+ ModuleBuilder targetModule = null;
+
+ if (prefix == null || prefix.equals("")) {
+ targetModule = module;
+ } else {
+ targetModule = findModuleFromBuilders(modules, module, prefix, line);
+ }
+
+ if (targetModule == null && context != null) {
+ Module m = findModuleFromContext(context, module, prefix, line);
+ if (m != null) {
+ targetModule = new ModuleBuilder(m);
+ TreeMap<Date, ModuleBuilder> map = new TreeMap<>();
+ map.put(targetModule.getRevision(), targetModule);
+ modules.put(targetModule.getModuleName(), map);
+ }
+ }
+
+ return targetModule;
+ }
+
/**
* Go through identity statements defined in current module and resolve
* their 'base' statement if present.
* @param module
* module being resolved
*/
- private void resolveIdentities(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {
- final Set<IdentitySchemaNodeBuilder> identities = module.getAddedIdentities();
- for (IdentitySchemaNodeBuilder identity : identities) {
- final String baseIdentityName = identity.getBaseIdentityName();
- final int line = identity.getLine();
- if (baseIdentityName != null) {
- IdentitySchemaNodeBuilder baseIdentity = findBaseIdentity(modules, module, baseIdentityName, line);
- if (baseIdentity == null) {
- throw new YangParseException(module.getName(), identity.getLine(), "Failed to find base identity");
- } else {
- identity.setBaseIdentity(baseIdentity);
+ private void resolveIdentities(final Map<String, TreeMap<Date, ModuleBuilder>> modules) {
+ for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
+ for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {
+ ModuleBuilder module = inner.getValue();
+ final Set<IdentitySchemaNodeBuilder> identities = module.getAddedIdentities();
+ for (IdentitySchemaNodeBuilder identity : identities) {
+ final String baseIdentityName = identity.getBaseIdentityName();
+ final int line = identity.getLine();
+ if (baseIdentityName != null) {
+ IdentitySchemaNodeBuilder baseIdentity = findBaseIdentity(modules, module, baseIdentityName, line);
+ if (baseIdentity == null) {
+ throw new YangParseException(module.getName(), identity.getLine(), "Failed to find base identity");
+ } else {
+ identity.setBaseIdentity(baseIdentity);
+ }
+ }
}
+
}
}
}
* SchemaContext containing already resolved modules
*/
private void resolveIdentitiesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
- final ModuleBuilder module, final SchemaContext context) {
- final Set<IdentitySchemaNodeBuilder> identities = module.getAddedIdentities();
- for (IdentitySchemaNodeBuilder identity : identities) {
- final String baseIdentityName = identity.getBaseIdentityName();
- final int line = identity.getLine();
- if (baseIdentityName != null) {
- IdentitySchemaNodeBuilder baseIdentity = findBaseIdentity(modules, module, baseIdentityName, line);
- if (baseIdentity == null) {
- IdentitySchemaNode baseId = findBaseIdentityFromContext(modules, module, baseIdentityName, line,
- context);
- identity.setBaseIdentity(baseId);
- } else {
- identity.setBaseIdentity(baseIdentity);
+ final SchemaContext context) {
+ for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
+ for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {
+ ModuleBuilder module = inner.getValue();
+ final Set<IdentitySchemaNodeBuilder> identities = module.getAddedIdentities();
+ for (IdentitySchemaNodeBuilder identity : identities) {
+ final String baseIdentityName = identity.getBaseIdentityName();
+ final int line = identity.getLine();
+ if (baseIdentityName != null) {
+
+ IdentitySchemaNodeBuilder result = null;
+ if (baseIdentityName.contains(":")) {
+ String[] splittedBase = baseIdentityName.split(":");
+ if (splittedBase.length > 2) {
+ throw new YangParseException(module.getName(), line,
+ "Failed to parse identityref base: " + baseIdentityName);
+ }
+ String prefix = splittedBase[0];
+ String name = splittedBase[1];
+ ModuleBuilder dependentModule = findTargetModule(prefix, module, modules, context, line);
+ if (dependentModule != null) {
+ result = ParserUtils.findIdentity(dependentModule.getAddedIdentities(), name);
+ }
+ } else {
+ result = ParserUtils.findIdentity(module.getAddedIdentities(), baseIdentityName);
+ }
+ identity.setBaseIdentity(result);
+ }
}
}
}
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
-import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.ModuleImport;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
return result;
}
- public static IdentitySchemaNode findBaseIdentityFromContext(Map<String, TreeMap<Date, ModuleBuilder>> modules,
- ModuleBuilder module, String baseString, int line, SchemaContext context) {
- IdentitySchemaNode result = null;
-
- String[] splittedBase = baseString.split(":");
- if (splittedBase.length > 2) {
- throw new YangParseException(module.getName(), line, "Failed to parse identityref base: " + baseString);
- }
- String prefix = splittedBase[0];
- String name = splittedBase[1];
- Module dependentModule = findModuleFromContext(context, module, prefix, line);
- result = findIdentityNode(dependentModule.getIdentities(), name);
-
- if (result == null) {
- throw new YangParseException(module.getName(), line, "Failed to find base identity");
- }
- return result;
- }
-
- private static IdentitySchemaNodeBuilder findIdentity(Set<IdentitySchemaNodeBuilder> identities, String name) {
+ public static IdentitySchemaNodeBuilder findIdentity(Set<IdentitySchemaNodeBuilder> identities, String name) {
for (IdentitySchemaNodeBuilder identity : identities) {
if (identity.getQName().getLocalName().equals(name)) {
return identity;
return null;
}
- private static IdentitySchemaNode findIdentityNode(Set<IdentitySchemaNode> identities, String name) {
- for (IdentitySchemaNode identity : identities) {
- if (identity.getQName().getLocalName().equals(name)) {
- return identity;
- }
- }
- return null;
- }
-
/**
* Get module in which this node is defined.
*