import java.text.DateFormat;\r
import java.text.ParseException;\r
import java.text.SimpleDateFormat;\r
-import java.util.ArrayList;\r
import java.util.Collections;\r
import java.util.Date;\r
import java.util.List;\r
import java.util.Stack;\r
-import java.util.TreeMap;\r
\r
import org.antlr.v4.runtime.tree.ParseTree;\r
import org.opendaylight.controller.antlrv4.code.gen.YangParser;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Argument_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Base_stmtContext;\r
import org.opendaylight.controller.antlrv4.code.gen.YangParser.Contact_stmtContext;\r
import org.opendaylight.controller.antlrv4.code.gen.YangParser.Container_stmtContext;\r
import org.opendaylight.controller.antlrv4.code.gen.YangParser.Description_stmtContext;\r
import org.opendaylight.controller.antlrv4.code.gen.YangParser.Revision_stmtsContext;\r
import org.opendaylight.controller.antlrv4.code.gen.YangParser.Status_stmtContext;\r
import org.opendaylight.controller.antlrv4.code.gen.YangParser.Type_body_stmtsContext;\r
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Union_specificationContext;\r
import org.opendaylight.controller.antlrv4.code.gen.YangParser.Yang_version_stmtContext;\r
import org.opendaylight.controller.antlrv4.code.gen.YangParserBaseListener;\r
-import org.opendaylight.controller.model.util.YangTypesConverter;\r
import org.opendaylight.controller.yang.common.QName;\r
import org.opendaylight.controller.yang.model.api.Status;\r
import org.opendaylight.controller.yang.model.api.TypeDefinition;\r
import org.opendaylight.controller.yang.model.parser.builder.impl.DeviationBuilder;\r
import org.opendaylight.controller.yang.model.parser.builder.impl.ExtensionBuilder;\r
import org.opendaylight.controller.yang.model.parser.builder.impl.FeatureBuilder;\r
+import org.opendaylight.controller.yang.model.parser.builder.impl.IdentitySchemaNodeBuilder;\r
import org.opendaylight.controller.yang.model.parser.builder.impl.LeafListSchemaNodeBuilder;\r
import org.opendaylight.controller.yang.model.parser.builder.impl.LeafSchemaNodeBuilder;\r
import org.opendaylight.controller.yang.model.parser.builder.impl.ListSchemaNodeBuilder;\r
import org.opendaylight.controller.yang.model.parser.builder.impl.RpcDefinitionBuilder;\r
import org.opendaylight.controller.yang.model.parser.builder.impl.TypedefBuilder;\r
import org.opendaylight.controller.yang.model.parser.builder.impl.UnknownSchemaNodeBuilder;\r
+import org.opendaylight.controller.yang.model.util.YangTypesConverter;\r
import org.slf4j.Logger;\r
import org.slf4j.LoggerFactory;\r
\r
private String moduleName;\r
private URI namespace;\r
private String yangModelPrefix;\r
- private Date revision;\r
+ private Date revision = new Date(0L);\r
\r
private final DateFormat simpleDateFormat = new SimpleDateFormat(\r
"yyyy-mm-dd");\r
private final Stack<String> actualPath = new Stack<String>();\r
\r
-\r
@Override\r
public void enterModule_stmt(YangParser.Module_stmtContext ctx) {\r
moduleName = stringFromNode(ctx);\r
public void enterModule_header_stmts(final Module_header_stmtsContext ctx) {\r
super.enterModule_header_stmts(ctx);\r
\r
+ String yangVersion = null;\r
for (int i = 0; i < ctx.getChildCount(); ++i) {\r
final ParseTree treeNode = ctx.getChild(i);\r
if (treeNode instanceof Namespace_stmtContext) {\r
yangModelPrefix = stringFromNode(treeNode);\r
moduleBuilder.setPrefix(yangModelPrefix);\r
} else if (treeNode instanceof Yang_version_stmtContext) {\r
- final String yangVersion = stringFromNode(treeNode);\r
- moduleBuilder.setYangVersion(yangVersion);\r
+ yangVersion = stringFromNode(treeNode);\r
}\r
}\r
+\r
+ if (yangVersion == null) {\r
+ yangVersion = "1";\r
+ }\r
+ moduleBuilder.setYangVersion(yangVersion);\r
}\r
\r
@Override\r
\r
@Override\r
public void enterRevision_stmts(Revision_stmtsContext ctx) {\r
- TreeMap<Date, Revision_stmtContext> revisions = new TreeMap<Date, Revision_stmtContext>();\r
-\r
- for (int i = 0; i < ctx.getChildCount(); ++i) {\r
- final ParseTree treeNode = ctx.getChild(i);\r
- if (treeNode instanceof Revision_stmtContext) {\r
- final String revisionDateStr = stringFromNode(treeNode);\r
- try {\r
- Date revision = simpleDateFormat.parse(revisionDateStr);\r
- revisions.put(revision, (Revision_stmtContext)treeNode);\r
-\r
- } catch (ParseException e) {\r
- final String message = "Failed to parse revision string: "+ revisionDateStr;\r
- logger.warn(message);\r
+ if (ctx != null) {\r
+ for (int i = 0; i < ctx.getChildCount(); ++i) {\r
+ final ParseTree treeNode = ctx.getChild(i);\r
+ if (treeNode instanceof Revision_stmtContext) {\r
+ updateRevisionForRevisionStatement(treeNode);\r
}\r
}\r
}\r
- if(revisions.size() > 0) {\r
- Revision_stmtContext revisionCtx = revisions.firstEntry().getValue();\r
- moduleBuilder.setRevision(revisions.firstKey());\r
-\r
- for(int i = 0; i < revisionCtx.getChildCount(); i++) {\r
- ParseTree child = revisionCtx.getChild(i);\r
- if(child instanceof Reference_stmtContext) {\r
- moduleBuilder.setReference(stringFromNode(child));\r
+ }\r
+\r
+ private void updateRevisionForRevisionStatement(final ParseTree treeNode) {\r
+ final String revisionDateStr = stringFromNode(treeNode);\r
+ try {\r
+ final Date revision = simpleDateFormat.parse(revisionDateStr);\r
+ if ((revision != null) && (this.revision.compareTo(revision) < 0)) {\r
+ this.revision = revision;\r
+ moduleBuilder.setRevision(this.revision);\r
+ for (int i = 0; i < treeNode.getChildCount(); ++i) {\r
+ ParseTree child = treeNode.getChild(i);\r
+ if (child instanceof Reference_stmtContext) {\r
+ moduleBuilder.setReference(stringFromNode(child));\r
+ }\r
}\r
}\r
+ } catch (ParseException e) {\r
+ final String message = "Failed to parse revision string: "\r
+ + revisionDateStr;\r
+ logger.warn(message);\r
}\r
}\r
\r
\r
@Override\r
public void enterExtension_stmt(YangParser.Extension_stmtContext ctx) {\r
- String argument = stringFromNode(ctx);\r
- QName qname = new QName(namespace, revision, yangModelPrefix, argument);\r
+ String extName = stringFromNode(ctx);\r
+ QName qname = new QName(namespace, revision, yangModelPrefix, extName);\r
ExtensionBuilder builder = moduleBuilder.addExtension(qname);\r
parseSchemaNodeArgs(ctx, builder);\r
+\r
+ String argument = null;\r
+ boolean yin = false;\r
+ for (int i = 0; i < ctx.getChildCount(); i++) {\r
+ ParseTree child = ctx.getChild(i);\r
+ if (child instanceof Argument_stmtContext) {\r
+ argument = stringFromNode(child);\r
+ yin = parseYinValue((Argument_stmtContext) child);\r
+ break;\r
+ }\r
+ }\r
+ builder.setArgument(argument);\r
+ builder.setYinElement(yin);\r
}\r
\r
@Override\r
@Override\r
public void enterType_stmt(YangParser.Type_stmtContext ctx) {\r
String typeName = stringFromNode(ctx);\r
- QName typeQName;\r
- if (typeName.contains(":")) {\r
- String[] splittedName = typeName.split(":");\r
- String prefix = splittedName[0];\r
- String name = splittedName[1];\r
- if (prefix.equals(yangModelPrefix)) {\r
- typeQName = new QName(namespace, revision, prefix, name);\r
- } else {\r
- typeQName = new QName(null, null, prefix, name);\r
- }\r
- } else {\r
- typeQName = new QName(namespace, revision, yangModelPrefix,\r
- typeName);\r
- }\r
+ QName typeQName = parseQName(typeName);\r
\r
TypeDefinition<?> type = null;\r
Type_body_stmtsContext typeBody = null;\r
}\r
}\r
\r
-\r
-\r
// if this is base yang type...\r
- if(YangTypesConverter.isBaseYangType(typeName)) {\r
+ if (YangTypesConverter.isBaseYangType(typeName)) {\r
if (typeBody == null) {\r
// if there are no constraints, just grab default base yang type\r
type = YangTypesConverter.javaTypeForBaseYangType(typeName);\r
- moduleBuilder.setType(type, actualPath);\r
+ moduleBuilder.setType(type, getActualPath());\r
} else {\r
- if(typeName.equals("union")) {\r
- List<String> types = new ArrayList<String>();\r
- for(int i = 0; i < typeBody.getChildCount(); i++) {\r
- ParseTree unionSpec = typeBody.getChild(i);\r
- if(unionSpec instanceof Union_specificationContext) {\r
- for(int j = 0; j < unionSpec.getChildCount(); j++) {\r
- ParseTree typeSpec = unionSpec.getChild(j);\r
- types.add(stringFromNode(typeSpec));\r
- }\r
- }\r
- }\r
- moduleBuilder.addUnionType(actualPath);\r
+ if ("union".equals(typeName)) {\r
+ moduleBuilder.addUnionType(getActualPath());\r
} else {\r
- type = parseTypeBody(typeName, typeBody, actualPath, namespace, revision, yangModelPrefix);\r
- moduleBuilder.setType(type, actualPath);\r
+ type = parseTypeBody(typeName, typeBody, getActualPath(),\r
+ namespace, revision, yangModelPrefix);\r
+ moduleBuilder.setType(type, getActualPath());\r
}\r
}\r
} else {\r
type = parseUnknownTypeBody(typeQName, typeBody);\r
// mark parent node of this type statement as dirty\r
- moduleBuilder.addDirtyNode(actualPath);\r
- moduleBuilder.setType(type, actualPath);\r
+ moduleBuilder.addDirtyNode(getActualPath());\r
+ moduleBuilder.setType(type, getActualPath());\r
}\r
\r
updatePath(typeName);\r
+ }\r
\r
+ private QName parseQName(String typeName) {\r
+ QName typeQName;\r
+ if (typeName.contains(":")) {\r
+ String[] splittedName = typeName.split(":");\r
+ String prefix = splittedName[0];\r
+ String name = splittedName[1];\r
+ if (prefix.equals(yangModelPrefix)) {\r
+ typeQName = new QName(namespace, revision, prefix, name);\r
+ } else {\r
+ typeQName = new QName(null, null, prefix, name);\r
+ }\r
+ } else {\r
+ typeQName = new QName(namespace, revision, yangModelPrefix,\r
+ typeName);\r
+ }\r
+ return typeQName;\r
}\r
\r
@Override\r
moduleBuilder.addConfiguration(configuration, actualPath);\r
}\r
\r
+ @Override\r
+ public void enterIdentity_stmt(YangParser.Identity_stmtContext ctx) {\r
+ final String identityName = stringFromNode(ctx);\r
+ final QName identityQName = new QName(namespace, revision,\r
+ yangModelPrefix, identityName);\r
+ IdentitySchemaNodeBuilder builder = moduleBuilder.addIdentity(identityQName);\r
+ updatePath(identityName);\r
+\r
+ builder.setPath(createActualSchemaPath(actualPath, namespace,\r
+ revision, yangModelPrefix));\r
+ parseSchemaNodeArgs(ctx, builder);\r
+\r
+ for(int i = 0; i < ctx.getChildCount(); i++) {\r
+ ParseTree child = ctx.getChild(i);\r
+ if(child instanceof Base_stmtContext) {\r
+ String baseIdentityName = stringFromNode(child);\r
+ builder.setBaseIdentityName(baseIdentityName);\r
+ }\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void exitIdentity_stmt(YangParser.Identity_stmtContext ctx) {\r
+ final String actContainer = actualPath.pop();\r
+ logger.debug("exiting " + actContainer);\r
+ }\r
+\r
public ModuleBuilder getModuleBuilder() {\r
return moduleBuilder;\r
}\r
return Collections.unmodifiableList(actualPath);\r
}\r
\r
-}
+}\r