*/
package org.opendaylight.yangtools.yang.parser.builder.impl;
+import com.google.common.base.Splitter;
+
import java.util.Comparator;
import java.util.Date;
+import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
+
import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.parser.util.YangParseException;
public final class GroupingUtils {
+ private static final Splitter COLON_SPLITTER = Splitter.on(':');
+ private static final Splitter SLASH_SPLITTER = Splitter.on('/');
private GroupingUtils() {
}
+ /**
+ * Common string splitter. Given a string representation of a grouping's name, it creates a prefix/name
+ * pair and returns it.
+ *
+ * @param groupingString Grouping string reference
+ * @param module Module which we are processing
+ * @param line Module line which we are processing
+ * @return An array of two strings, first one is the module prefix, the second is the grouping name.
+ */
+ private static String[] getPrefixAndName(final String groupingString, final ModuleBuilder module, final int line) {
+ final String[] ret = new String[2];
+
+ if (groupingString.indexOf(':') != -1) {
+ if (groupingString.indexOf('/') != -1) {
+ throw new YangParseException(module.getName(), line, "Invalid name of target grouping");
+ }
+
+ final Iterator<String> split = COLON_SPLITTER.split(groupingString).iterator();
+ ret[0] = split.next();
+ ret[1] = split.next();
+ if (split.hasNext()) {
+ throw new YangParseException(module.getName(), line, "Invalid name of target grouping");
+ }
+ } else {
+ ret[0] = module.getPrefix();
+ ret[1] = groupingString;
+ }
+
+ return ret;
+ }
+
/**
* Search given modules for grouping by name defined in uses node.
*
final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {
final int line = usesBuilder.getLine();
- final String groupingString = usesBuilder.getGroupingPathAsString();
- String groupingPrefix;
- String groupingName;
-
- if (groupingString.contains(":")) {
- String[] splitted = groupingString.split(":");
- if (splitted.length != 2 || groupingString.contains("/")) {
- throw new YangParseException(module.getName(), line, "Invalid name of target grouping");
- }
- groupingPrefix = splitted[0];
- groupingName = splitted[1];
- } else {
- groupingPrefix = module.getPrefix();
- groupingName = groupingString;
- }
-
- ModuleBuilder dependentModule;
+ final String[] split = getPrefixAndName(usesBuilder.getGroupingPathAsString(), module, line);
+ final String groupingPrefix = split[0];
+ final String groupingName = split[1];
+ final ModuleBuilder dependentModule;
- if(groupingPrefix == null) {
+ if (groupingPrefix == null) {
dependentModule = module;
} else if (groupingPrefix.equals(module.getPrefix())) {
dependentModule = module;
public static GroupingDefinition getTargetGroupingFromContext(final UsesNodeBuilder usesBuilder,
final ModuleBuilder module, final SchemaContext context) {
final int line = usesBuilder.getLine();
- String groupingString = usesBuilder.getGroupingPathAsString();
- String groupingPrefix;
- String groupingName;
-
- if (groupingString.contains(":")) {
- String[] splitted = groupingString.split(":");
- if (splitted.length != 2 || groupingString.contains("/")) {
- throw new YangParseException(module.getName(), line, "Invalid name of target grouping");
- }
- groupingPrefix = splitted[0];
- groupingName = splitted[1];
- } else {
- groupingPrefix = module.getPrefix();
- groupingName = groupingString;
- }
-
- Module dependentModule = BuilderUtils.findModuleFromContext(context, module, groupingPrefix, line);
- return findGroupingDefinition(dependentModule.getGroupings(), groupingName);
+ final String[] split = getPrefixAndName(usesBuilder.getGroupingPathAsString(), module, line);
+ Module dependentModule = BuilderUtils.findModuleFromContext(context, module, split[0], line);
+ return findGroupingDefinition(dependentModule.getGroupings(), split[1]);
}
/**
for (RefineBuilder refine : usesNode.getRefines()) {
String refineTargetPath = refine.getTargetPathString();
- String[] splitted = refineTargetPath.split("/");
Builder currentNode = usesNode.getParent();
- for (String pathElement : splitted) {
+ for (String pathElement : SLASH_SPLITTER.split(refineTargetPath)) {
if (currentNode instanceof DataNodeContainerBuilder) {
currentNode = ((DataNodeContainerBuilder) currentNode).getDataChildByName(pathElement);
} else if (currentNode instanceof ChoiceBuilder) {
import static java.lang.String.format;
+import com.google.common.base.Splitter;
import com.google.common.collect.Sets;
+
import java.text.ParseException;
import java.util.Date;
-import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.ParseTree;
import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Yang_version_stmtContext;
final class BasicValidations {
static final String SUPPORTED_YANG_VERSION = "1";
+ private static final Splitter SLASH_SPLITTER = Splitter.on('/').omitEmptyStrings();
+ private static final Pattern identifierPattern = Pattern.compile("[a-zA-Z_][a-zA-Z0-9_.-]*");
+ private static final Pattern prefixedIdentifierPattern = Pattern.compile("(.+):(.+)");
/**
* It isn't desirable to create instance of this class.
}
}
- private static final Pattern identifierPattern = Pattern.compile("[a-zA-Z_][a-zA-Z0-9_.-]*");
-
static void checkIdentifier(final ParseTree statement) {
checkIdentifierInternal(statement, ValidationUtil.getName(statement));
}
}
}
- private static final Pattern prefixedIdentifierPattern = Pattern.compile("(.+):(.+)");
-
static void checkPrefixedIdentifier(final ParseTree statement) {
checkPrefixedIdentifierInternal(statement, ValidationUtil.getName(statement));
}
String id = ValidationUtil.getName(statement);
try {
- for (String oneOfId : id.split("/")) {
- if (oneOfId.isEmpty()) {
- continue;
- }
+ for (String oneOfId : SLASH_SPLITTER.split(id)) {
checkPrefixedIdentifierInternal(statement, oneOfId);
}
} catch (YangValidationException e) {
}
private static void checkPresentChildOfTypeInternal(final ParseTree parent, final Set<Class<? extends ParseTree>> expectedChildType,
- final MessageProvider message, final boolean atMostOne) {
+ final MessageProvider message, final boolean atMostOne) {
if (!checkPresentChildOfTypeSafe(parent, expectedChildType, atMostOne)) {
String str = atMostOne ? "(Expected exactly one statement) " + message.getMessage() : message.getMessage();
ValidationUtil.ex(str);
@Override
public String getMessage() {
StringBuilder childTypes = new StringBuilder();
- String orStr = " OR ";
for (Class<? extends ParseTree> type : expectedChildTypes) {
childTypes.append(ValidationUtil.getSimpleStatementName(type));
- childTypes.append(orStr);
+ childTypes.append(" OR ");
}
String message = ValidationUtil.f("Missing %s statement in %s:%s", childTypes.toString(),
ValidationUtil.getSimpleStatementName(parent.getClass()), ValidationUtil.getName(parent));
}
private static boolean checkPresentChildOfTypeSafe(final ParseTree parent, final Set<Class<? extends ParseTree>> expectedChildType,
- final boolean atMostOne) {
+ final boolean atMostOne) {
int foundChildrenOfType = ValidationUtil.countPresentChildrenOfType(parent, expectedChildType);
}
private static boolean checkPresentChildOfTypeSafe(final ParseTree parent, final Class<? extends ParseTree> expectedChildType,
- final boolean atMostOne) {
+ final boolean atMostOne) {
int foundChildrenOfType = ValidationUtil.countPresentChildrenOfType(parent, expectedChildType);
return atMostOne ? foundChildrenOfType == 1 : foundChildrenOfType != 0;
}
- static List<String> getAndCheckUniqueKeys(final ParseTree ctx) {
+ static Iterable<String> getAndCheckUniqueKeys(final ParseTree ctx) {
String key = ValidationUtil.getName(ctx);
ParseTree parent = ctx.getParent();
String rootParentName = ValidationUtil.getRootParentName(ctx);
- List<String> keyList = ValidationUtil.listKeysFromId(key);
+ Iterable<String> keyList = ValidationUtil.listKeysFromId(key);
Set<String> duplicates = ValidationUtil.getDuplicates(keyList);
if (duplicates.size() != 0) {
*/
package org.opendaylight.yangtools.yang.parser.impl;
-import java.util.Arrays;
-import java.util.Collection;
+import com.google.common.base.Splitter;
+
import java.util.HashSet;
-import java.util.List;
import java.util.Set;
+
import org.antlr.v4.runtime.tree.ParseTree;
import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Module_stmtContext;
import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Submodule_stmtContext;
* Validation utilities
*/
final class ValidationUtil {
+ private static final Splitter SPACE_SPLITTER = Splitter.on(' ');
/**
* It isn't desirable to create instance of this class
private ValidationUtil() {
}
- static void ex(String message) {
+ static void ex(final String message) {
throw new YangValidationException(message);
}
- static Set<String> getDuplicates(Collection<String> keyList) {
+ static Set<String> getDuplicates(final Iterable<String> keyList) {
Set<String> all = new HashSet<>();
Set<String> duplicates = new HashSet<>();
return duplicates;
}
- static List<String> listKeysFromId(String keys) {
- return Arrays.asList(keys.split(" "));
+ static Iterable<String> listKeysFromId(final String keys) {
+ return SPACE_SPLITTER.split(keys);
}
- static String getRootParentName(ParseTree ctx) {
+ static String getRootParentName(final ParseTree ctx) {
ParseTree root = getRootParent(ctx);
return ValidationUtil.getName(root);
}
- private static ParseTree getRootParent(ParseTree ctx) {
+ private static ParseTree getRootParent(final ParseTree ctx) {
ParseTree root = ctx;
while (root.getParent() != null) {
if (root.getClass().equals(Module_stmtContext.class) || root.getClass().equals(Submodule_stmtContext.class)) {
return root;
}
- static String getName(ParseTree child) {
+ static String getName(final ParseTree child) {
return ParserListenerUtils.stringFromNode(child);
}
- static String f(String base, Object... args) {
+ static String f(final String base, final Object... args) {
return String.format(base, args);
}
/**
* Get simple name from statement class e.g. Module from Module_stmt_context
*/
- static String getSimpleStatementName(Class<? extends ParseTree> typeOfStatement) {
+ static String getSimpleStatementName(final Class<? extends ParseTree> typeOfStatement) {
String className = typeOfStatement.getSimpleName();
int lastIndexOf = className.indexOf('$');
return className.substring(0, index).replace('_', '-');
}
- static int countPresentChildrenOfType(ParseTree parent, Set<Class<? extends ParseTree>> expectedChildTypes) {
+ static int countPresentChildrenOfType(final ParseTree parent, final Set<Class<? extends ParseTree>> expectedChildTypes) {
int foundChildrenOfType = 0;
for (Class<? extends ParseTree> type : expectedChildTypes) {
return foundChildrenOfType;
}
- static int countPresentChildrenOfType(ParseTree parent, Class<? extends ParseTree> expectedChildType) {
+ static int countPresentChildrenOfType(final ParseTree parent, final Class<? extends ParseTree> expectedChildType) {
int foundChildrenOfType = 0;
for (int i = 0; i < parent.getChildCount(); i++) {
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
+import com.google.common.base.Splitter;
import com.google.common.collect.HashBiMap;
import com.google.common.io.ByteSource;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
@Immutable
public final class YangParserImpl implements YangContextParser {
private static final Logger LOG = LoggerFactory.getLogger(YangParserImpl.class);
-
private static final String FAIL_DEVIATION_TARGET = "Failed to find deviation target.";
+ private static final Splitter COLON_SPLITTER = Splitter.on(':');
private static final YangParserImpl INSTANCE = new YangParserImpl();
public static YangParserImpl getInstance() {
return INSTANCE;
}
-
-
@Override
@Deprecated
public Set<Module> parseYangModels(final File yangFile, final File directory) {
ModuleBuilder targetModule;
String prefix = qname.getPrefix();
- if (prefix == null || prefix.equals("")) {
+ if (prefix == null || prefix.isEmpty()) {
targetModule = module;
} else {
targetModule = findModuleFromBuilders(modules, module, qname.getPrefix(), line);
if (baseIdentityName != null) {
IdentitySchemaNodeBuilder result = null;
- if (baseIdentityName.contains(":")) {
- String[] splittedBase = baseIdentityName.split(":");
- if (splittedBase.length > 2) {
+ if (baseIdentityName.indexOf(':') != -1) {
+ final Iterator<String> split = COLON_SPLITTER.split(baseIdentityName).iterator();
+ final String prefix = split.next();
+ final String name = split.next();
+ if (split.hasNext()) {
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 = BuilderUtils.findIdentity(dependentModule.getAddedIdentities(), name);
import static org.opendaylight.yangtools.yang.parser.impl.ParserListenerUtils.parseYinValue;
import static org.opendaylight.yangtools.yang.parser.impl.ParserListenerUtils.stringFromNode;
+import com.google.common.base.Splitter;
import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+
import java.net.URI;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
+import java.util.Iterator;
import java.util.List;
import java.util.Stack;
+
import org.antlr.v4.runtime.tree.ParseTree;
import org.opendaylight.yangtools.antlrv4.code.gen.YangParser;
import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Argument_stmtContext;
public final class YangParserListenerImpl extends YangParserBaseListener {
private static final Logger LOGGER = LoggerFactory.getLogger(YangParserListenerImpl.class);
+ private static final Splitter COLON_SPLITTER = Splitter.on(':');
private static final String AUGMENT_STR = "augment";
+ private final DateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
+ private final Stack<Stack<QName>> actualPath = new Stack<>();
private final String sourcePath;
private ModuleBuilder moduleBuilder;
private String moduleName;
private URI namespace;
private String yangModelPrefix;
private Date revision = new Date(0L);
-
- private final DateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
- private final Stack<Stack<QName>> actualPath = new Stack<>();
private int augmentOrder;
private void addNodeToPath(final QName name) {
@Override
public void enterModule_stmt(final YangParser.Module_stmtContext ctx) {
moduleName = stringFromNode(ctx);
- LOGGER.trace("entering module " + moduleName);
+ LOGGER.trace("entering module {}", moduleName);
enterLog("module", moduleName, 0);
actualPath.push(new Stack<QName>());
@Override public void enterSubmodule_stmt(final YangParser.Submodule_stmtContext ctx) {
moduleName = stringFromNode(ctx);
- LOGGER.trace("entering submodule " + moduleName);
+ LOGGER.trace("entering submodule {}", moduleName);
enterLog("submodule", moduleName, 0);
actualPath.push(new Stack<QName>());
moduleBuilder.setReference(reference);
}
- @Override public void exitSubmodule_stmt(final YangParser.Submodule_stmtContext ctx) {
+ @Override
+ public void exitSubmodule_stmt(final YangParser.Submodule_stmtContext ctx) {
exitLog("submodule");
actualPath.pop();
}
- @Override public void enterBelongs_to_stmt(final YangParser.Belongs_to_stmtContext ctx) {
+ @Override
+ public void enterBelongs_to_stmt(final YangParser.Belongs_to_stmtContext ctx) {
moduleBuilder.setBelongsTo(stringFromNode(ctx));
}
} else {
QName qname;
switch (typeName) {
- case "union":
- qname = BaseTypes.constructQName("union");
- addNodeToPath(qname);
- UnionTypeBuilder unionBuilder = moduleBuilder.addUnionType(line, namespace, revision);
- Builder parent = moduleBuilder.getActualNode();
- unionBuilder.setParent(parent);
- moduleBuilder.enterNode(unionBuilder);
- break;
- case "identityref":
- qname = BaseTypes.constructQName("identityref");
- addNodeToPath(qname);
- SchemaPath path = createActualSchemaPath(actualPath.peek());
- moduleBuilder.addIdentityrefType(line, path, getIdentityrefBase(typeBody));
- break;
- default:
- type = parseTypeWithBody(typeName, typeBody, actualPath.peek(), namespace, revision,
- yangModelPrefix, moduleBuilder.getActualNode());
- moduleBuilder.setType(type);
- addNodeToPath(type.getQName());
+ case "union":
+ qname = BaseTypes.constructQName("union");
+ addNodeToPath(qname);
+ UnionTypeBuilder unionBuilder = moduleBuilder.addUnionType(line, namespace, revision);
+ Builder parent = moduleBuilder.getActualNode();
+ unionBuilder.setParent(parent);
+ moduleBuilder.enterNode(unionBuilder);
+ break;
+ case "identityref":
+ qname = BaseTypes.constructQName("identityref");
+ addNodeToPath(qname);
+ SchemaPath path = createActualSchemaPath(actualPath.peek());
+ moduleBuilder.addIdentityrefType(line, path, getIdentityrefBase(typeBody));
+ break;
+ default:
+ type = parseTypeWithBody(typeName, typeBody, actualPath.peek(), namespace, revision,
+ yangModelPrefix, moduleBuilder.getActualNode());
+ moduleBuilder.setType(type);
+ addNodeToPath(type.getQName());
}
}
} else {
}
private QName parseQName(final String typeName) {
- QName typeQName;
- if (typeName.contains(":")) {
- String[] splittedName = typeName.split(":");
- String prefix = splittedName[0];
- String name = splittedName[1];
+ final QName typeQName;
+ if (typeName.indexOf(':') != -1) {
+ final Iterator<String> split = COLON_SPLITTER.split(typeName).iterator();
+ final String prefix = split.next();
+ final String name = split.next();
if (prefix.equals(yangModelPrefix)) {
typeQName = new QName(namespace, revision, prefix, name);
} else {
final String nodeParameter = stringFromNode(ctx);
enterLog("unknown-node", nodeParameter, line);
- QName nodeType;
final String nodeTypeStr = ctx.getChild(0).getText();
- final String[] splittedElement = nodeTypeStr.split(":");
- if (splittedElement.length == 1) {
- nodeType = new QName(namespace, revision, yangModelPrefix, splittedElement[0]);
+ final Iterator<String> splittedElement = COLON_SPLITTER.split(nodeTypeStr).iterator();
+ final String e0 = splittedElement.next();
+ final QName nodeType;
+ if (splittedElement.hasNext()) {
+ nodeType = new QName(namespace, revision, e0, splittedElement.next());
} else {
- nodeType = new QName(namespace, revision, splittedElement[0], splittedElement[1]);
+ nodeType = new QName(namespace, revision, yangModelPrefix, e0);
}
QName qname;
try {
if (!Strings.isNullOrEmpty(nodeParameter)) {
- String[] splittedName = nodeParameter.split(":");
- if (splittedName.length == 2) {
- qname = new QName(null, null, splittedName[0], splittedName[1]);
+ final Iterable<String> splittedName = COLON_SPLITTER.split(nodeParameter);
+ final Iterator<String> it = splittedName.iterator();
+
+ if (Iterables.size(splittedName) == 2) {
+ qname = new QName(null, null, it.next(), it.next());
} else {
- qname = new QName(namespace, revision, yangModelPrefix, splittedName[0]);
+ qname = new QName(namespace, revision, yangModelPrefix, it.next());
}
} else {
qname = nodeType;
}
} catch (IllegalArgumentException e) {
qname = nodeType;
-
}
addNodeToPath(qname);
SchemaPath path = createActualSchemaPath(actualPath.peek());