-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.controller.sal.binding.generator.impl;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.opendaylight.controller.binding.generator.util.CodeGeneratorHelper;
-import org.opendaylight.controller.binding.generator.util.Types;
-import org.opendaylight.controller.sal.binding.generator.api.BindingGenerator;
-import org.opendaylight.controller.sal.binding.generator.spi.TypeProvider;
-import org.opendaylight.controller.sal.binding.model.api.GeneratedTransferObject;
-import org.opendaylight.controller.sal.binding.model.api.GeneratedType;
-import org.opendaylight.controller.sal.binding.model.api.Type;
-import org.opendaylight.controller.sal.binding.model.api.type.builder.GeneratedPropertyBuilder;
-import org.opendaylight.controller.sal.binding.model.api.type.builder.GeneratedTOBuilder;
-import org.opendaylight.controller.sal.binding.model.api.type.builder.GeneratedTypeBuilder;
-import org.opendaylight.controller.sal.binding.model.api.type.builder.MethodSignatureBuilder;
-import org.opendaylight.controller.sal.binding.yang.types.TypeProviderImpl;
-import org.opendaylight.controller.yang.common.QName;
-import org.opendaylight.controller.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.controller.yang.model.api.DataNodeContainer;
-import org.opendaylight.controller.yang.model.api.DataSchemaNode;
-import org.opendaylight.controller.yang.model.api.LeafListSchemaNode;
-import org.opendaylight.controller.yang.model.api.LeafSchemaNode;
-import org.opendaylight.controller.yang.model.api.ListSchemaNode;
-import org.opendaylight.controller.yang.model.api.Module;
-import org.opendaylight.controller.yang.model.api.SchemaContext;
-import org.opendaylight.controller.yang.model.api.SchemaPath;
-import org.opendaylight.controller.yang.model.api.TypeDefinition;
-
-public class BindingGeneratorImpl implements BindingGenerator {
-
- private static Calendar calendar = new GregorianCalendar();
- private final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders;
- private final List<ContainerSchemaNode> schemaContainers;
- private final List<ListSchemaNode> schemaLists;
-
- private final TypeProvider typeProvider;
-
- private String basePackageName;
-
- public BindingGeneratorImpl() {
- super();
- genTypeBuilders = new HashMap<String, Map<String, GeneratedTypeBuilder>>();
- schemaContainers = new ArrayList<ContainerSchemaNode>();
- schemaLists = new ArrayList<ListSchemaNode>();
-
- // TODO: reimplement in better way
- typeProvider = new TypeProviderImpl();
- }
-
- @Override
- public List<Type> generateTypes(final SchemaContext context) {
- final List<Type> genTypes = new ArrayList<Type>();
-
- if (context != null) {
- final Set<Module> modules = context.getModules();
-
- if (modules != null) {
- for (final Module module : modules) {
- basePackageName = resolveBasePackageName(module.getNamespace(),
- module.getYangVersion());
-
- traverseModule(module);
- if (schemaContainers.size() > 0) {
- for (final ContainerSchemaNode container : schemaContainers) {
- genTypes.add(containerToGenType(container));
- }
- }
-
- if (schemaLists.size() > 0) {
- for (final ListSchemaNode list : schemaLists) {
- genTypes.addAll(listToGenType(list));
- }
- }
- }
- }
- }
-
- return genTypes;
- }
-
- private String resolveGeneratedTypePackageName(final SchemaPath schemaPath) {
- final StringBuilder builder = new StringBuilder();
- builder.append(basePackageName);
- if ((schemaPath != null) && (schemaPath.getPath() != null)) {
- final List<QName> pathToNode = schemaPath.getPath();
- for (int i = 0; i < pathToNode.size(); ++i) {
- builder.append(".");
- String nodeLocalName = pathToNode.get(i).getLocalName();
-
- // TODO: create method
- nodeLocalName = nodeLocalName.replace(":", ".");
- nodeLocalName = nodeLocalName.replace("-", ".");
- builder.append(nodeLocalName);
- }
- return builder.toString();
- }
- return null;
- }
-
- private GeneratedType containerToGenType(ContainerSchemaNode container) {
- if (container == null) {
- return null;
- }
- final Set<DataSchemaNode> schemaNodes = container.getChildNodes();
- final GeneratedTypeBuilder typeBuilder = addRawInterfaceDefinition(container);
-
- for (final DataSchemaNode node : schemaNodes) {
- if (node instanceof LeafSchemaNode) {
- resolveLeafSchemaNodeAsMethod(typeBuilder,
- (LeafSchemaNode) node);
- } else if (node instanceof LeafListSchemaNode) {
- resolveLeafListSchemaNode(typeBuilder,
- (LeafListSchemaNode) node);
-
- } else if (node instanceof ContainerSchemaNode) {
- resolveContainerSchemaNode(typeBuilder,
- (ContainerSchemaNode) node);
- } else if (node instanceof ListSchemaNode) {
- resolveListSchemaNode(typeBuilder, (ListSchemaNode) node);
- }
- }
- return typeBuilder.toInstance();
- }
-
- private boolean resolveLeafSchemaNodeAsMethod(
- final GeneratedTypeBuilder typeBuilder, final LeafSchemaNode leaf) {
- if ((leaf != null) && (typeBuilder != null)) {
- final String leafName = leaf.getQName().getLocalName();
- String leafDesc = leaf.getDescription();
- if (leafDesc == null) {
- leafDesc = "";
- }
-
- if (leafName != null) {
- final TypeDefinition<?> typeDef = leaf.getType();
- final Type javaType = typeProvider
- .javaTypeForSchemaDefinitionType(typeDef);
-
- constructGetter(typeBuilder, leafName, leafDesc, javaType);
- if (!leaf.isConfiguration()) {
- constructSetter(typeBuilder, leafName, leafDesc, javaType);
- }
- return true;
- }
- }
- return false;
- }
-
- private boolean resolveLeafSchemaNodeAsProperty(
- final GeneratedTOBuilder toBuilder, final LeafSchemaNode leaf,
- boolean isReadOnly) {
- if ((leaf != null) && (toBuilder != null)) {
- final String leafName = leaf.getQName().getLocalName();
- String leafDesc = leaf.getDescription();
- if (leafDesc == null) {
- leafDesc = "";
- }
-
- if (leafName != null) {
- final TypeDefinition<?> typeDef = leaf.getType();
- final Type javaType = typeProvider
- .javaTypeForSchemaDefinitionType(typeDef);
-
- final GeneratedPropertyBuilder propBuilder = toBuilder
- .addProperty(CodeGeneratorHelper
- .parseToClassName(leafName));
-
- propBuilder.setReadOnly(isReadOnly);
- propBuilder.addReturnType(javaType);
- propBuilder.addComment(leafDesc);
-
- toBuilder.addEqualsIdentity(propBuilder);
- toBuilder.addHashIdentity(propBuilder);
- toBuilder.addToStringProperty(propBuilder);
-
- return true;
- }
- }
- return false;
- }
-
- private boolean resolveLeafListSchemaNode(
- final GeneratedTypeBuilder typeBuilder,
- final LeafListSchemaNode node) {
- if ((node != null) && (typeBuilder != null)) {
- final String nodeName = node.getQName().getLocalName();
- String nodeDesc = node.getDescription();
- if (nodeDesc == null) {
- nodeDesc = "";
- }
-
- if (nodeName != null) {
- final TypeDefinition<?> type = node.getType();
- final Type listType = Types.listTypeFor(typeProvider
- .javaTypeForSchemaDefinitionType(type));
-
- constructGetter(typeBuilder, nodeName, nodeDesc, listType);
- if (!node.isConfiguration()) {
- constructSetter(typeBuilder, nodeName, nodeDesc, listType);
- }
- return true;
- }
- }
- return false;
- }
-
- private boolean resolveContainerSchemaNode(
- final GeneratedTypeBuilder typeBuilder,
- final ContainerSchemaNode node) {
- if ((node != null) && (typeBuilder != null)) {
- final String nodeName = node.getQName().getLocalName();
-
- if (nodeName != null) {
- final GeneratedTypeBuilder rawGenType = addRawInterfaceDefinition(node);
- constructGetter(typeBuilder, nodeName, "", rawGenType);
-
- return true;
- }
- }
- return false;
- }
-
- private boolean resolveListSchemaNode(
- final GeneratedTypeBuilder typeBuilder, final ListSchemaNode node) {
- if ((node != null) && (typeBuilder != null)) {
- final String nodeName = node.getQName().getLocalName();
-
- if (nodeName != null) {
- final GeneratedTypeBuilder rawGenType = addRawInterfaceDefinition(node);
- constructGetter(typeBuilder, nodeName, "",
- Types.listTypeFor(rawGenType));
- if (!node.isConfiguration()) {
- constructSetter(typeBuilder, nodeName, "",
- Types.listTypeFor(rawGenType));
- }
- return true;
- }
- }
- return false;
- }
-
- private GeneratedTypeBuilder addRawInterfaceDefinition(
- final DataSchemaNode schemaNode) {
- if (schemaNode == null) {
- return null;
- }
-
- final String packageName = resolveGeneratedTypePackageName(schemaNode
- .getPath());
- final String schemaNodeName = schemaNode.getQName().getLocalName();
-
- if ((packageName != null) && (schemaNode != null)
- && (schemaNodeName != null)) {
- final String genTypeName = CodeGeneratorHelper
- .parseToClassName(schemaNodeName);
- final GeneratedTypeBuilder newType = new GeneratedTypeBuilderImpl(
- packageName, genTypeName);
-
- if (!genTypeBuilders.containsKey(packageName)) {
- final Map<String, GeneratedTypeBuilder> builders = new HashMap<String, GeneratedTypeBuilder>();
- builders.put(genTypeName, newType);
- genTypeBuilders.put(packageName, builders);
- } else {
- final Map<String, GeneratedTypeBuilder> builders = genTypeBuilders
- .get(packageName);
- if (!builders.containsKey(genTypeName)) {
- builders.put(genTypeName, newType);
- }
- }
-
- return newType;
- }
- return null;
- }
-
- private String getterMethodName(final String methodName) {
- final StringBuilder method = new StringBuilder();
- method.append("get");
- method.append(CodeGeneratorHelper.parseToClassName(methodName));
- return method.toString();
- }
-
- private String setterMethodName(final String methodName) {
- final StringBuilder method = new StringBuilder();
- method.append("set");
- method.append(CodeGeneratorHelper.parseToClassName(methodName));
- return method.toString();
- }
-
- private MethodSignatureBuilder constructGetter(
- final GeneratedTypeBuilder interfaceBuilder,
- final String schemaNodeName, final String comment,
- final Type returnType) {
- final MethodSignatureBuilder getMethod = interfaceBuilder
- .addMethod(getterMethodName(schemaNodeName));
-
- getMethod.addComment(comment);
- getMethod.addReturnType(returnType);
-
- return getMethod;
- }
-
- private MethodSignatureBuilder constructSetter(
- final GeneratedTypeBuilder interfaceBuilder,
- final String schemaNodeName, final String comment,
- final Type parameterType) {
- final MethodSignatureBuilder setMethod = interfaceBuilder
- .addMethod(setterMethodName(schemaNodeName));
-
- setMethod.addComment(comment);
- setMethod.addParameter(parameterType,
- CodeGeneratorHelper.parseToParamName(schemaNodeName));
- setMethod.addReturnType(Types.voidType());
-
- return setMethod;
- }
-
- private String resolveBasePackageName(final URI moduleNamespace,
- final String yangVersion) {
- final StringBuilder packageNameBuilder = new StringBuilder();
-
- packageNameBuilder.append("com.cisco.yang.gen.v");
- packageNameBuilder.append(yangVersion);
- packageNameBuilder.append(".rev");
- packageNameBuilder.append(calendar.get(Calendar.YEAR));
- packageNameBuilder.append((calendar.get(Calendar.MONTH) + 1));
- packageNameBuilder.append(calendar.get(Calendar.DAY_OF_MONTH));
- packageNameBuilder.append(".");
-
- String namespace = moduleNamespace.toString();
- namespace = namespace.replace(":", ".");
- namespace = namespace.replace("-", ".");
-
- packageNameBuilder.append(namespace);
-
- return packageNameBuilder.toString();
- }
-
- private List<Type> listToGenType(final ListSchemaNode list) {
- if (list == null) {
- return null;
- }
- final GeneratedTypeBuilder typeBuilder = resolveListTypeBuilder(list);
- final List<String> listKeys = listKeys(list);
- GeneratedTOBuilder genTOBuilder = null;
- if (listKeys.size() > 0) {
- genTOBuilder = resolveListKey(list);
- }
-
- final Set<DataSchemaNode> schemaNodes = list.getChildNodes();
- for (final DataSchemaNode node : schemaNodes) {
-
- if (node instanceof LeafSchemaNode) {
- final LeafSchemaNode leaf = (LeafSchemaNode) node;
- if (!isPartOfListKey(leaf, listKeys)) {
- resolveLeafSchemaNodeAsMethod(typeBuilder, leaf);
- } else {
- resolveLeafSchemaNodeAsProperty(genTOBuilder, leaf, true);
- }
- } else if (node instanceof LeafListSchemaNode) {
- resolveLeafListSchemaNode(typeBuilder,
- (LeafListSchemaNode) node);
- } else if (node instanceof ContainerSchemaNode) {
- resolveContainerSchemaNode(typeBuilder,
- (ContainerSchemaNode) node);
- } else if (node instanceof ListSchemaNode) {
- resolveListSchemaNode(typeBuilder, (ListSchemaNode) node);
- }
- }
-
- final List<Type> genTypes = new ArrayList<Type>();
- if (genTOBuilder != null) {
- final GeneratedTransferObject genTO = genTOBuilder.toInstance();
- constructGetter(typeBuilder, genTO.getName(), "Returns Primary Key of Yang List Type", genTO);
- genTypes.add(genTO);
- }
- genTypes.add(typeBuilder.toInstance());
- return genTypes;
- }
-
- /**
- * @param list
- * @return
- */
- private GeneratedTOBuilder resolveListKey(final ListSchemaNode list) {
- final String packageName = resolveGeneratedTypePackageName(list
- .getPath());
- final String listName = list.getQName().getLocalName() + "Key";
-
- if ((packageName != null) && (list != null) && (listName != null)) {
- final String genTOName = CodeGeneratorHelper
- .parseToClassName(listName);
- final GeneratedTOBuilder newType = new GeneratedTOBuilderImpl(
- packageName, genTOName);
-
- return newType;
- }
- return null;
- }
-
- private boolean isPartOfListKey(final LeafSchemaNode leaf,
- final List<String> keys) {
- if ((leaf != null) && (keys != null) && (leaf.getQName() != null)) {
- final String leafName = leaf.getQName().getLocalName();
- if (keys.contains(leafName)) {
- return true;
- }
- }
- return false;
- }
-
- private List<String> listKeys(final ListSchemaNode list) {
- final List<String> listKeys = new ArrayList<String>();
-
- if (list.getKeyDefinition() != null) {
- final List<QName> keyDefinitions = list.getKeyDefinition();
-
- for (final QName keyDefinition : keyDefinitions) {
- listKeys.add(keyDefinition.getLocalName());
- }
- }
- return listKeys;
- }
-
- private GeneratedTypeBuilder resolveListTypeBuilder(
- final ListSchemaNode list) {
- final String packageName = resolveGeneratedTypePackageName(list
- .getPath());
- final String schemaNodeName = list.getQName().getLocalName();
- final String genTypeName = CodeGeneratorHelper
- .parseToClassName(schemaNodeName);
-
- GeneratedTypeBuilder typeBuilder = null;
- if (genTypeBuilders.containsKey(packageName)) {
- final Map<String, GeneratedTypeBuilder> builders = new HashMap<String, GeneratedTypeBuilder>();
- typeBuilder = builders.get(genTypeName);
-
- if (null == typeBuilder) {
- typeBuilder = addRawInterfaceDefinition(list);
- }
- }
- return typeBuilder;
- }
-
- private void traverseModule(final Module module) {
- final Set<DataSchemaNode> schemaNodes = module.getChildNodes();
-
- for (DataSchemaNode node : schemaNodes) {
- if (node instanceof ContainerSchemaNode) {
- schemaContainers.add((ContainerSchemaNode) node);
- traverse((ContainerSchemaNode) node);
- }
- }
- }
-
- private void traverse(final DataNodeContainer dataNode) {
- if (!containChildDataNodeContainer(dataNode)) {
- return;
- }
-
- final Set<DataSchemaNode> childs = dataNode.getChildNodes();
- if (childs != null) {
- for (DataSchemaNode childNode : childs) {
- if (childNode instanceof ContainerSchemaNode) {
- final ContainerSchemaNode container = (ContainerSchemaNode) childNode;
- schemaContainers.add(container);
- traverse(container);
- }
-
- if (childNode instanceof ListSchemaNode) {
- final ListSchemaNode list = (ListSchemaNode) childNode;
- schemaLists.add(list);
- traverse(list);
- }
- }
- }
- }
-
- /**
- * Returns <code>true</code> if and only if the child node contain at least
- * one child container schema node or child list schema node, otherwise will
- * always returns <code>false</code>
- *
- * @param container
- * @return <code>true</code> if and only if the child node contain at least
- * one child container schema node or child list schema node,
- * otherwise will always returns <code>false</code>
- */
- private boolean containChildDataNodeContainer(
- final DataNodeContainer container) {
- if (container != null) {
- final Set<DataSchemaNode> childs = container.getChildNodes();
- if ((childs != null) && (childs.size() > 0)) {
- for (final DataSchemaNode childNode : childs) {
- if (childNode instanceof DataNodeContainer) {
- return true;
- }
- }
- }
- }
- return false;
- }
-}
+/*\r
+ * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+package org.opendaylight.controller.sal.binding.generator.impl;\r
+\r
+import java.net.URI;\r
+import java.util.ArrayList;\r
+import java.util.Calendar;\r
+import java.util.GregorianCalendar;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import org.opendaylight.controller.binding.generator.util.CodeGeneratorHelper;\r
+import org.opendaylight.controller.binding.generator.util.Types;\r
+import org.opendaylight.controller.sal.binding.generator.api.BindingGenerator;\r
+import org.opendaylight.controller.sal.binding.generator.spi.TypeProvider;\r
+import org.opendaylight.controller.sal.binding.model.api.GeneratedTransferObject;\r
+import org.opendaylight.controller.sal.binding.model.api.GeneratedType;\r
+import org.opendaylight.controller.sal.binding.model.api.Type;\r
+import org.opendaylight.controller.sal.binding.model.api.type.builder.GeneratedPropertyBuilder;\r
+import org.opendaylight.controller.sal.binding.model.api.type.builder.GeneratedTOBuilder;\r
+import org.opendaylight.controller.sal.binding.model.api.type.builder.GeneratedTypeBuilder;\r
+import org.opendaylight.controller.sal.binding.model.api.type.builder.MethodSignatureBuilder;\r
+import org.opendaylight.controller.sal.binding.yang.types.TypeProviderImpl;\r
+import org.opendaylight.controller.yang.common.QName;\r
+import org.opendaylight.controller.yang.model.api.ContainerSchemaNode;\r
+import org.opendaylight.controller.yang.model.api.DataNodeContainer;\r
+import org.opendaylight.controller.yang.model.api.DataSchemaNode;\r
+import org.opendaylight.controller.yang.model.api.LeafListSchemaNode;\r
+import org.opendaylight.controller.yang.model.api.LeafSchemaNode;\r
+import org.opendaylight.controller.yang.model.api.ListSchemaNode;\r
+import org.opendaylight.controller.yang.model.api.Module;\r
+import org.opendaylight.controller.yang.model.api.SchemaContext;\r
+import org.opendaylight.controller.yang.model.api.SchemaPath;\r
+import org.opendaylight.controller.yang.model.api.TypeDefinition;\r
+\r
+public class BindingGeneratorImpl implements BindingGenerator {\r
+\r
+ private static Calendar calendar = new GregorianCalendar();\r
+ private Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders;\r
+ private List<ContainerSchemaNode> schemaContainers;\r
+ private List<ListSchemaNode> schemaLists;\r
+ private TypeProvider typeProvider;\r
+ private String basePackageName;\r
+\r
+ public BindingGeneratorImpl() {\r
+ super();\r
+ }\r
+\r
+ @Override\r
+ public List<Type> generateTypes(final SchemaContext context) {\r
+ final List<Type> genTypes = new ArrayList<Type>();\r
+ \r
+ typeProvider = new TypeProviderImpl(context);\r
+ if (context != null) {\r
+ final Set<Module> modules = context.getModules();\r
+ \r
+ if (modules != null) {\r
+ for (final Module module : modules) {\r
+ genTypeBuilders = new HashMap<String, Map<String, GeneratedTypeBuilder>>();\r
+ schemaContainers = new ArrayList<ContainerSchemaNode>();\r
+ schemaLists = new ArrayList<ListSchemaNode>();\r
+ \r
+ basePackageName = resolveBasePackageName(module.getNamespace(),\r
+ module.getYangVersion());\r
+\r
+ traverseModule(module);\r
+ if (schemaContainers.size() > 0) {\r
+ for (final ContainerSchemaNode container : schemaContainers) {\r
+ genTypes.add(containerToGenType(container));\r
+ }\r
+ }\r
+\r
+ if (schemaLists.size() > 0) {\r
+ for (final ListSchemaNode list : schemaLists) {\r
+ genTypes.addAll(listToGenType(list));\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return genTypes;\r
+ }\r
+ \r
+ private String resolveGeneratedTypePackageName(final SchemaPath schemaPath) {\r
+ final StringBuilder builder = new StringBuilder();\r
+ builder.append(basePackageName);\r
+ if ((schemaPath != null) && (schemaPath.getPath() != null)) {\r
+ final List<QName> pathToNode = schemaPath.getPath();\r
+ final int traversalSteps = (pathToNode.size() - 1); \r
+ for (int i = 0; i < traversalSteps; ++i) {\r
+ builder.append(".");\r
+ String nodeLocalName = pathToNode.get(i).getLocalName();\r
+\r
+ // TODO: create method\r
+ nodeLocalName = nodeLocalName.replace(":", ".");\r
+ nodeLocalName = nodeLocalName.replace("-", ".");\r
+ builder.append(nodeLocalName);\r
+ }\r
+ return builder.toString();\r
+ }\r
+ return null;\r
+ }\r
+\r
+ private GeneratedType containerToGenType(ContainerSchemaNode container) {\r
+ if (container == null) {\r
+ return null;\r
+ }\r
+ final Set<DataSchemaNode> schemaNodes = container.getChildNodes();\r
+ final GeneratedTypeBuilder typeBuilder = addRawInterfaceDefinition(container);\r
+\r
+ for (final DataSchemaNode node : schemaNodes) {\r
+ if (node instanceof LeafSchemaNode) {\r
+ resolveLeafSchemaNodeAsMethod(typeBuilder,\r
+ (LeafSchemaNode) node);\r
+ } else if (node instanceof LeafListSchemaNode) {\r
+ resolveLeafListSchemaNode(typeBuilder,\r
+ (LeafListSchemaNode) node);\r
+\r
+ } else if (node instanceof ContainerSchemaNode) {\r
+ resolveContainerSchemaNode(typeBuilder,\r
+ (ContainerSchemaNode) node);\r
+ } else if (node instanceof ListSchemaNode) {\r
+ resolveListSchemaNode(typeBuilder, (ListSchemaNode) node);\r
+ }\r
+ }\r
+ return typeBuilder.toInstance();\r
+ }\r
+\r
+ private boolean resolveLeafSchemaNodeAsMethod(\r
+ final GeneratedTypeBuilder typeBuilder, final LeafSchemaNode leaf) {\r
+ if ((leaf != null) && (typeBuilder != null)) {\r
+ final String leafName = leaf.getQName().getLocalName();\r
+ String leafDesc = leaf.getDescription();\r
+ if (leafDesc == null) {\r
+ leafDesc = "";\r
+ }\r
+\r
+ if (leafName != null) {\r
+ final TypeDefinition<?> typeDef = leaf.getType();\r
+ final Type javaType = typeProvider\r
+ .javaTypeForSchemaDefinitionType(typeDef);\r
+\r
+ constructGetter(typeBuilder, leafName, leafDesc, javaType);\r
+ if (!leaf.isConfiguration()) {\r
+ constructSetter(typeBuilder, leafName, leafDesc, javaType);\r
+ }\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+\r
+ private boolean resolveLeafSchemaNodeAsProperty(\r
+ final GeneratedTOBuilder toBuilder, final LeafSchemaNode leaf,\r
+ boolean isReadOnly) {\r
+ if ((leaf != null) && (toBuilder != null)) {\r
+ final String leafName = leaf.getQName().getLocalName();\r
+ String leafDesc = leaf.getDescription();\r
+ if (leafDesc == null) {\r
+ leafDesc = "";\r
+ }\r
+\r
+ if (leafName != null) {\r
+ final TypeDefinition<?> typeDef = leaf.getType();\r
+ \r
+ //TODO: properly resolve enum types\r
+ final Type javaType = typeProvider\r
+ .javaTypeForSchemaDefinitionType(typeDef);\r
+\r
+ final GeneratedPropertyBuilder propBuilder = toBuilder\r
+ .addProperty(CodeGeneratorHelper\r
+ .parseToClassName(leafName));\r
+\r
+ propBuilder.setReadOnly(isReadOnly);\r
+ propBuilder.addReturnType(javaType);\r
+ propBuilder.addComment(leafDesc);\r
+\r
+ toBuilder.addEqualsIdentity(propBuilder);\r
+ toBuilder.addHashIdentity(propBuilder);\r
+ toBuilder.addToStringProperty(propBuilder);\r
+\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+\r
+ private boolean resolveLeafListSchemaNode(\r
+ final GeneratedTypeBuilder typeBuilder,\r
+ final LeafListSchemaNode node) {\r
+ if ((node != null) && (typeBuilder != null)) {\r
+ final String nodeName = node.getQName().getLocalName();\r
+ String nodeDesc = node.getDescription();\r
+ if (nodeDesc == null) {\r
+ nodeDesc = "";\r
+ }\r
+\r
+ if (nodeName != null) {\r
+ final TypeDefinition<?> type = node.getType();\r
+ final Type listType = Types.listTypeFor(typeProvider\r
+ .javaTypeForSchemaDefinitionType(type));\r
+\r
+ constructGetter(typeBuilder, nodeName, nodeDesc, listType);\r
+ if (!node.isConfiguration()) {\r
+ constructSetter(typeBuilder, nodeName, nodeDesc, listType);\r
+ }\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+\r
+ private boolean resolveContainerSchemaNode(\r
+ final GeneratedTypeBuilder typeBuilder,\r
+ final ContainerSchemaNode node) {\r
+ if ((node != null) && (typeBuilder != null)) {\r
+ final String nodeName = node.getQName().getLocalName();\r
+\r
+ if (nodeName != null) {\r
+ final GeneratedTypeBuilder rawGenType = addRawInterfaceDefinition(node);\r
+ constructGetter(typeBuilder, nodeName, "", rawGenType);\r
+\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+\r
+ private boolean resolveListSchemaNode(\r
+ final GeneratedTypeBuilder typeBuilder, final ListSchemaNode node) {\r
+ if ((node != null) && (typeBuilder != null)) {\r
+ final String nodeName = node.getQName().getLocalName();\r
+\r
+ if (nodeName != null) {\r
+ final GeneratedTypeBuilder rawGenType = addRawInterfaceDefinition(node);\r
+ constructGetter(typeBuilder, nodeName, "",\r
+ Types.listTypeFor(rawGenType));\r
+ if (!node.isConfiguration()) {\r
+ constructSetter(typeBuilder, nodeName, "",\r
+ Types.listTypeFor(rawGenType));\r
+ }\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+\r
+ private GeneratedTypeBuilder addRawInterfaceDefinition(\r
+ final DataSchemaNode schemaNode) {\r
+ if (schemaNode == null) {\r
+ return null;\r
+ }\r
+\r
+ final String packageName = resolveGeneratedTypePackageName(schemaNode\r
+ .getPath());\r
+ final String schemaNodeName = schemaNode.getQName().getLocalName();\r
+\r
+ if ((packageName != null) && (schemaNode != null)\r
+ && (schemaNodeName != null)) {\r
+ final String genTypeName = CodeGeneratorHelper\r
+ .parseToClassName(schemaNodeName);\r
+ final GeneratedTypeBuilder newType = new GeneratedTypeBuilderImpl(\r
+ packageName, genTypeName);\r
+\r
+ if (!genTypeBuilders.containsKey(packageName)) {\r
+ final Map<String, GeneratedTypeBuilder> builders = new HashMap<String, GeneratedTypeBuilder>();\r
+ builders.put(genTypeName, newType);\r
+ genTypeBuilders.put(packageName, builders);\r
+ } else {\r
+ final Map<String, GeneratedTypeBuilder> builders = genTypeBuilders\r
+ .get(packageName);\r
+ if (!builders.containsKey(genTypeName)) {\r
+ builders.put(genTypeName, newType);\r
+ }\r
+ }\r
+ return newType;\r
+ }\r
+ return null;\r
+ }\r
+\r
+ private String getterMethodName(final String methodName) {\r
+ final StringBuilder method = new StringBuilder();\r
+ method.append("get");\r
+ method.append(CodeGeneratorHelper.parseToClassName(methodName));\r
+ return method.toString();\r
+ }\r
+\r
+ private String setterMethodName(final String methodName) {\r
+ final StringBuilder method = new StringBuilder();\r
+ method.append("set");\r
+ method.append(CodeGeneratorHelper.parseToClassName(methodName));\r
+ return method.toString();\r
+ }\r
+\r
+ private MethodSignatureBuilder constructGetter(\r
+ final GeneratedTypeBuilder interfaceBuilder,\r
+ final String schemaNodeName, final String comment,\r
+ final Type returnType) {\r
+ final MethodSignatureBuilder getMethod = interfaceBuilder\r
+ .addMethod(getterMethodName(schemaNodeName));\r
+\r
+ getMethod.addComment(comment);\r
+ getMethod.addReturnType(returnType);\r
+\r
+ return getMethod;\r
+ }\r
+\r
+ private MethodSignatureBuilder constructSetter(\r
+ final GeneratedTypeBuilder interfaceBuilder,\r
+ final String schemaNodeName, final String comment,\r
+ final Type parameterType) {\r
+ final MethodSignatureBuilder setMethod = interfaceBuilder\r
+ .addMethod(setterMethodName(schemaNodeName));\r
+\r
+ setMethod.addComment(comment);\r
+ setMethod.addParameter(parameterType,\r
+ CodeGeneratorHelper.parseToParamName(schemaNodeName));\r
+ setMethod.addReturnType(Types.voidType());\r
+\r
+ return setMethod;\r
+ }\r
+\r
+ private String resolveBasePackageName(final URI moduleNamespace,\r
+ final String yangVersion) {\r
+ final StringBuilder packageNameBuilder = new StringBuilder();\r
+\r
+ packageNameBuilder.append("org.opendaylight.yang.gen.v");\r
+ packageNameBuilder.append(yangVersion);\r
+ packageNameBuilder.append(".rev");\r
+ packageNameBuilder.append(calendar.get(Calendar.YEAR));\r
+ packageNameBuilder.append((calendar.get(Calendar.MONTH) + 1));\r
+ packageNameBuilder.append(calendar.get(Calendar.DAY_OF_MONTH));\r
+ packageNameBuilder.append(".");\r
+\r
+ String namespace = moduleNamespace.toString();\r
+ namespace = namespace.replace(":", ".");\r
+ namespace = namespace.replace("-", ".");\r
+\r
+ packageNameBuilder.append(namespace);\r
+\r
+ return packageNameBuilder.toString();\r
+ }\r
+\r
+ private List<Type> listToGenType(final ListSchemaNode list) {\r
+ if (list == null) {\r
+ return null;\r
+ }\r
+ final GeneratedTypeBuilder typeBuilder = resolveListTypeBuilder(list);\r
+ final List<String> listKeys = listKeys(list);\r
+ GeneratedTOBuilder genTOBuilder = null;\r
+ if (listKeys.size() > 0) {\r
+ genTOBuilder = resolveListKey(list);\r
+ }\r
+\r
+ final Set<DataSchemaNode> schemaNodes = list.getChildNodes();\r
+ for (final DataSchemaNode node : schemaNodes) {\r
+\r
+ if (node instanceof LeafSchemaNode) {\r
+ final LeafSchemaNode leaf = (LeafSchemaNode) node;\r
+ if (!isPartOfListKey(leaf, listKeys)) {\r
+ resolveLeafSchemaNodeAsMethod(typeBuilder, leaf);\r
+ } else {\r
+ resolveLeafSchemaNodeAsProperty(genTOBuilder, leaf, true);\r
+ }\r
+ } else if (node instanceof LeafListSchemaNode) {\r
+ resolveLeafListSchemaNode(typeBuilder,\r
+ (LeafListSchemaNode) node);\r
+ } else if (node instanceof ContainerSchemaNode) {\r
+ resolveContainerSchemaNode(typeBuilder,\r
+ (ContainerSchemaNode) node);\r
+ } else if (node instanceof ListSchemaNode) {\r
+ resolveListSchemaNode(typeBuilder, (ListSchemaNode) node);\r
+ }\r
+ }\r
+\r
+ final List<Type> genTypes = new ArrayList<Type>();\r
+ if (genTOBuilder != null) {\r
+ final GeneratedTransferObject genTO = genTOBuilder.toInstance();\r
+ constructGetter(typeBuilder, genTO.getName(), "Returns Primary Key of Yang List Type", genTO);\r
+ genTypes.add(genTO);\r
+ }\r
+ genTypes.add(typeBuilder.toInstance());\r
+ return genTypes;\r
+ }\r
+\r
+ /**\r
+ * @param list\r
+ * @return\r
+ */\r
+ private GeneratedTOBuilder resolveListKey(final ListSchemaNode list) {\r
+ final String packageName = resolveGeneratedTypePackageName(list\r
+ .getPath());\r
+ final String listName = list.getQName().getLocalName() + "Key";\r
+\r
+ if ((packageName != null) && (list != null) && (listName != null)) {\r
+ final String genTOName = CodeGeneratorHelper\r
+ .parseToClassName(listName);\r
+ final GeneratedTOBuilder newType = new GeneratedTOBuilderImpl(\r
+ packageName, genTOName);\r
+\r
+ return newType;\r
+ }\r
+ return null;\r
+ }\r
+\r
+ private boolean isPartOfListKey(final LeafSchemaNode leaf,\r
+ final List<String> keys) {\r
+ if ((leaf != null) && (keys != null) && (leaf.getQName() != null)) {\r
+ final String leafName = leaf.getQName().getLocalName();\r
+ if (keys.contains(leafName)) {\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+\r
+ private List<String> listKeys(final ListSchemaNode list) {\r
+ final List<String> listKeys = new ArrayList<String>();\r
+\r
+ if (list.getKeyDefinition() != null) {\r
+ final List<QName> keyDefinitions = list.getKeyDefinition();\r
+ \r
+ for (final QName keyDefinition : keyDefinitions) {\r
+ listKeys.add(keyDefinition.getLocalName());\r
+ }\r
+ }\r
+ return listKeys;\r
+ }\r
+\r
+ private GeneratedTypeBuilder resolveListTypeBuilder(\r
+ final ListSchemaNode list) {\r
+ final String packageName = resolveGeneratedTypePackageName(list\r
+ .getPath());\r
+ final String schemaNodeName = list.getQName().getLocalName();\r
+ final String genTypeName = CodeGeneratorHelper\r
+ .parseToClassName(schemaNodeName);\r
+\r
+ GeneratedTypeBuilder typeBuilder = null;\r
+ if (genTypeBuilders.containsKey(packageName)) {\r
+ final Map<String, GeneratedTypeBuilder> builders = new HashMap<String, GeneratedTypeBuilder>();\r
+ typeBuilder = builders.get(genTypeName);\r
+\r
+ if (null == typeBuilder) {\r
+ typeBuilder = addRawInterfaceDefinition(list);\r
+ }\r
+ }\r
+ return typeBuilder;\r
+ }\r
+\r
+ private void traverseModule(final Module module) {\r
+ final Set<DataSchemaNode> schemaNodes = module.getChildNodes();\r
+\r
+ for (DataSchemaNode node : schemaNodes) {\r
+ if (node instanceof ContainerSchemaNode) {\r
+ schemaContainers.add((ContainerSchemaNode) node);\r
+ traverse((ContainerSchemaNode) node);\r
+ }\r
+ }\r
+ }\r
+\r
+ private void traverse(final DataNodeContainer dataNode) {\r
+ if (!containChildDataNodeContainer(dataNode)) {\r
+ return;\r
+ }\r
+\r
+ final Set<DataSchemaNode> childs = dataNode.getChildNodes();\r
+ if (childs != null) {\r
+ for (DataSchemaNode childNode : childs) {\r
+ if (childNode instanceof ContainerSchemaNode) {\r
+ final ContainerSchemaNode container = (ContainerSchemaNode) childNode;\r
+ schemaContainers.add(container);\r
+ traverse(container);\r
+ }\r
+\r
+ if (childNode instanceof ListSchemaNode) {\r
+ final ListSchemaNode list = (ListSchemaNode) childNode;\r
+ schemaLists.add(list);\r
+ traverse(list);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Returns <code>true</code> if and only if the child node contain at least\r
+ * one child container schema node or child list schema node, otherwise will\r
+ * always returns <code>false</code>\r
+ * \r
+ * @param container\r
+ * @return <code>true</code> if and only if the child node contain at least\r
+ * one child container schema node or child list schema node,\r
+ * otherwise will always returns <code>false</code>\r
+ */\r
+ private boolean containChildDataNodeContainer(\r
+ final DataNodeContainer container) {\r
+ if (container != null) {\r
+ final Set<DataSchemaNode> childs = container.getChildNodes();\r
+ if ((childs != null) && (childs.size() > 0)) {\r
+ for (final DataSchemaNode childNode : childs) {\r
+ if (childNode instanceof DataNodeContainer) {\r
+ return true;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+}\r