package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.firstAttributeOf;
+
import com.google.common.base.CharMatcher;
import com.google.common.base.Preconditions;
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMap.Builder;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import org.opendaylight.yangtools.yang.model.api.Deviation.Deviate;
import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
+import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping;
import org.opendaylight.yangtools.yang.model.api.Status;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement;
private static final CharMatcher QUESTION_MARK_MATCHER = CharMatcher.is('?');
private static final Splitter SLASH_SPLITTER = Splitter.on('/').omitEmptyStrings().trimResults();
private static final Splitter SPACE_SPLITTER = Splitter.on(' ').omitEmptyStrings().trimResults();
+ private static final Splitter COLON_SPLITTER = Splitter.on(":").omitEmptyStrings().trimResults();
private static final Pattern PATH_ABS = Pattern.compile("/[^/].*");
private static final Pattern BETWEEN_CURLY_BRACES_PATTERN = Pattern.compile("\\{(.+?)\\}");
private static final Set<String> JAVA_UNICODE_BLOCKS = ImmutableSet.<String>builder()
return keyNodes;
}
+ static Collection<SchemaNodeIdentifier.Relative> parseUniqueConstraintArgument(final StmtContext<?, ?, ?> ctx,
+ final String argumentValue) {
+ final Set<SchemaNodeIdentifier.Relative> uniqueConstraintNodes = new HashSet<>();
+ for (String uniqueArgToken : SPACE_SPLITTER.split(argumentValue)) {
+ final SchemaNodeIdentifier nodeIdentifier = Utils.nodeIdentifierFromPath(ctx, uniqueArgToken);
+ SourceException.throwIf(nodeIdentifier.isAbsolute(), ctx.getStatementSourceReference(),
+ "Unique statement argument '%s' contains schema node identifier '%s' "
+ + "which is not in the descendant node identifier form.", argumentValue, uniqueArgToken);
+ uniqueConstraintNodes.add((SchemaNodeIdentifier.Relative) nodeIdentifier);
+ }
+ return ImmutableSet.copyOf(uniqueConstraintNodes);
+ }
+
private static String trimSingleLastSlashFromXPath(final String path) {
return path.endsWith("/") ? path.substring(0, path.length() - 1) : path;
}
return identifier;
}
+ public static String trimPrefix(final String identifier) {
+ List<String> namesParts = COLON_SPLITTER.splitToList(identifier);
+ if (namesParts.size() == 2) {
+ return namesParts.get(1);
+ }
+ return identifier;
+ }
+
/**
*
* Based on identifier read from source and collections of relevant prefixes and statement definitions mappings
* @return valid QName for declared statement to be written
*
*/
- public static QName getValidStatementDefinition(final PrefixToModule prefixes, final QNameToStatementDefinition
- stmtDef, final QName identifier) {
+ public static QName getValidStatementDefinition(final PrefixToModule prefixes,
+ final QNameToStatementDefinition stmtDef, final QName identifier) {
if (stmtDef.get(identifier) != null) {
return stmtDef.get(identifier).getStatementName();
} else {
if (namesParts.length == 2) {
String prefix = namesParts[0];
String localName = namesParts[1];
- if (prefixes != null && prefixes.get(prefix) != null
- && stmtDef.get(QName.create(prefixes.get(prefix), localName)) != null) {
- return QName.create(prefixes.get(prefix), localName);
+
+ if (prefixes == null) {
+ return null;
+ }
+
+ QNameModule qNameModule = prefixes.get(prefix);
+ if (qNameModule == null) {
+ return null;
+ }
+
+ if (prefixes.isPreLinkageMap()) {
+ StatementDefinition foundStmtDef = stmtDef.getByNamespaceAndLocalName(qNameModule.getNamespace(),
+ localName);
+ return foundStmtDef != null ? foundStmtDef.getStatementName() : null;
+ } else {
+ QName qName = QName.create(qNameModule, localName);
+ return stmtDef.get(qName) != null ? qName : null;
}
}
}
}
return result.toString();
}
+
+ public static boolean belongsToTheSameModule(QName targetStmtQName, QName sourceStmtQName) {
+ if (targetStmtQName.getModule().equals(sourceStmtQName.getModule())) {
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean isPresenceContainer(StatementContextBase<?, ?, ?> targetCtx) {
+ if (!targetCtx.getPublicDefinition().equals(Rfc6020Mapping.CONTAINER)) {
+ return false;
+ }
+
+ final List<StatementContextBase<?, ?, ?>> targetSubStatements = new ImmutableList.Builder<StatementContextBase<?, ?, ?>>()
+ .addAll(targetCtx.declaredSubstatements()).addAll(targetCtx.effectiveSubstatements()).build();
+ for (final StatementContextBase<?, ?, ?> subStatement : targetSubStatements) {
+ if (subStatement.getPublicDefinition().equals(Rfc6020Mapping.PRESENCE)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
}