Update the API generation code and code generation sample
[controller.git] / opendaylight / sal / yang-prototype / code-generator / binding-generator-impl / src / main / java / org / opendaylight / controller / sal / binding / generator / impl / BindingGeneratorImpl.java
index 4f87adb0078742fdbe9889bb85cad9691cddebbd..3a9398a13a1ff0dc01ca1d419de48d93ed65bd49 100644 (file)
-/*
- * 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