[ONOS-3906],[ONOS-3910] Implementation of YANG module and leaf/leaf-list translator.

Change-Id: If1a8a991ffafa14b51211f97c435176ee1bf856f
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
new file mode 100644
index 0000000..604caf6
--- /dev/null
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
@@ -0,0 +1,432 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yangutils.translator.tojava.utils;
+
+import java.util.List;
+
+import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.translator.GeneratedFileType;
+import org.onosproject.yangutils.translator.tojava.AttributeInfo;
+import org.onosproject.yangutils.translator.tojava.GeneratedMethodTypes;
+import org.onosproject.yangutils.utils.UtilConstants;
+import org.onosproject.yangutils.utils.io.impl.JavaDocGen;
+
+/**
+ * Generated methods for generated files based on the file type.
+ */
+public final class MethodsGenerator {
+
+    private static String builderClassName;
+    private static List<AttributeInfo> attrInfo;
+
+    /**
+     * Sets the builder class name for setter methods of builder class.
+     *
+     * @param name builder class name
+     */
+    public static void setBuilderClassName(String name) {
+        builderClassName = name;
+    }
+
+    /**
+     * Sets the attribute info for the impl class's constructor method.
+     *
+     * @param attr list of attribute info
+     */
+    public static void setAttrInfo(List<AttributeInfo> attr) {
+        attrInfo = attr;
+    }
+
+    /**
+     * Returns attribute info for the impl class's constructor method.
+     *
+     * @return list of attribute info
+     */
+    public static List<AttributeInfo> getAttrInfo() {
+        return attrInfo;
+    }
+
+    /**
+     * Return the class name.
+     *
+     * @return class name
+     */
+    public static String getBuilderClassName() {
+        return builderClassName;
+    }
+
+    /**
+     * Default constructor.
+     */
+    private MethodsGenerator() {
+    }
+
+    /**
+     * Return method strings.
+     *
+     * @param attr attribute info.
+     * @param type generated file type
+     * @return method string
+     */
+    public static String getMethodString(AttributeInfo attr, GeneratedFileType type) {
+
+        if (type.equals(GeneratedFileType.BUILDER_CLASS)) {
+
+            return parseBuilderMethodString(attr);
+        } else if (type.equals(GeneratedFileType.INTERFACE)) {
+
+            return getGetterString(attr);
+        } else if (type.equals(GeneratedFileType.BUILDER_INTERFACE)) {
+
+            return parseBuilderInterfaceMethodString(attr);
+        } else if (type.equals(GeneratedFileType.IMPL)) {
+
+            return parseImplMethodString(attr);
+        }
+        return null;
+    }
+
+    /**
+     * Returns constructed method impl for specific generated file type.
+     *
+     * @param genFileTypes generated file type
+     * @param yangName class name
+     * @param methodTypes method types
+     * @param returnType return type of method
+     * @return constructed method impl
+     */
+    public static String constructMethodInfo(GeneratedFileType genFileTypes, String yangName,
+            GeneratedMethodTypes methodTypes, YangType<?> returnType) {
+
+        if (genFileTypes.equals(GeneratedFileType.INTERFACE)) {
+
+            /**
+             * If interface, only getter will be there.
+             */
+            return getGetterForInterface(yangName, returnType);
+        } else if (genFileTypes.equals(GeneratedFileType.BUILDER_INTERFACE)) {
+
+            /**
+             * If builder interface, getters and setters will be there.
+             */
+            if (methodTypes.equals(GeneratedMethodTypes.GETTER)) {
+
+                return getGetterForInterface(yangName, returnType);
+            } else if (methodTypes.equals(GeneratedMethodTypes.SETTER)) {
+
+                return getSetterForInterface(yangName, returnType);
+            } else if (methodTypes.equals(GeneratedMethodTypes.BUILD)) {
+
+                return getBuildForInterface(yangName);
+            }
+        } else if (genFileTypes.equals(GeneratedFileType.BUILDER_CLASS)) {
+
+            /**
+             * If Builder class , getters, setters ,build and default constructor impls will be there.
+             */
+            if (methodTypes.equals(GeneratedMethodTypes.GETTER)) {
+
+                return getGetterForClass(yangName, returnType);
+            } else if (methodTypes.equals(GeneratedMethodTypes.SETTER)) {
+
+                return getSetterForClass(yangName, returnType);
+            } else if (methodTypes.equals(GeneratedMethodTypes.BUILD)) {
+
+                return getBuild(yangName);
+            } else if (methodTypes.equals(GeneratedMethodTypes.DEFAULT_CONSTRUCTOR)) {
+
+                return getDefaultConstructor(yangName + UtilConstants.BUILDER);
+            }
+        } else if (genFileTypes.equals(GeneratedFileType.IMPL)) {
+
+            if (methodTypes.equals(GeneratedMethodTypes.GETTER)) {
+
+                return getGetterForClass(yangName, returnType);
+            } else if (methodTypes.equals(GeneratedMethodTypes.CONSTRUCTOR)) {
+
+                return getConstructor(yangName);
+            } else if (methodTypes.equals(GeneratedMethodTypes.DEFAULT_CONSTRUCTOR)) {
+
+                return getDefaultConstructor(yangName + UtilConstants.IMPL);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns the methods strings for builder class.
+     *
+     * @param attr attribute info.
+     * @return method string for builder class.
+     */
+    private static String parseBuilderMethodString(AttributeInfo attr) {
+
+        String overrideString = UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.OVERRIDE
+                + UtilConstants.NEW_LINE;
+
+        String getterString = JavaCodeSnippetGen.getJavaMethodInfo(GeneratedFileType.BUILDER_CLASS,
+                attr.getAttributeName(), GeneratedMethodTypes.GETTER, attr.getAttributeType());
+        String setterString = JavaCodeSnippetGen.getJavaMethodInfo(GeneratedFileType.BUILDER_CLASS,
+                attr.getAttributeName(), GeneratedMethodTypes.SETTER, attr.getAttributeType());
+
+        return overrideString + getterString + UtilConstants.NEW_LINE + overrideString + setterString
+                + UtilConstants.NEW_LINE;
+    }
+
+    /**
+     * Returns the methods strings for builder class.
+     *
+     * @param attr attribute info.
+     * @return method string for builder class.
+     */
+    private static String parseImplMethodString(AttributeInfo attr) {
+
+        return UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.OVERRIDE
+                + UtilConstants.NEW_LINE + JavaCodeSnippetGen.getJavaMethodInfo(GeneratedFileType.BUILDER_CLASS,
+                        attr.getAttributeName(), GeneratedMethodTypes.GETTER, attr.getAttributeType())
+                + UtilConstants.NEW_LINE;
+    }
+
+    /**
+     * Returns the methods strings for builder interface.
+     *
+     * @param attr attribute info.
+     * @return method string for builder interface.
+     */
+    private static String parseBuilderInterfaceMethodString(AttributeInfo attr) {
+
+        return getGetterString(attr) + UtilConstants.NEW_LINE + getSetterString(attr);
+    }
+
+    /**
+     * Returns the methods strings for builder interface.
+     *
+     * @param name attribute name.
+     * @return method string for builder interface.
+     */
+    public static String parseBuilderInterfaceBuildMethodString(String name) {
+
+        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.BUILD, name) + JavaCodeSnippetGen
+                .getJavaMethodInfo(GeneratedFileType.BUILDER_INTERFACE, name, GeneratedMethodTypes.BUILD, null);
+    }
+
+    /**
+     * Returns getter string.
+     *
+     * @param attr attribute info.
+     * @return getter string
+     */
+    public static String getGetterString(AttributeInfo attr) {
+
+        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.GETTER, attr.getAttributeName())
+                + JavaCodeSnippetGen.getJavaMethodInfo(GeneratedFileType.INTERFACE, attr.getAttributeName(),
+                        GeneratedMethodTypes.GETTER, attr.getAttributeType())
+                + UtilConstants.NEW_LINE;
+    }
+
+    /**
+     * Returns setter string.
+     *
+     * @param attr attribute info.
+     * @return setter string
+     */
+    private static String getSetterString(AttributeInfo attr) {
+
+        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.SETTER, attr.getAttributeName())
+                + JavaCodeSnippetGen.getJavaMethodInfo(GeneratedFileType.BUILDER_INTERFACE, attr.getAttributeName(),
+                        GeneratedMethodTypes.SETTER, attr.getAttributeType());
+    }
+
+    /**
+     * Returns constructor method string.
+     *
+     * @param name class name
+     * @return constructor string
+     */
+    public static String getConstructorString(String name) {
+
+        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.CONSTRUCTOR, name) + JavaCodeSnippetGen
+                .getJavaMethodInfo(GeneratedFileType.IMPL, name, GeneratedMethodTypes.CONSTRUCTOR, null);
+    }
+
+    /**
+     * Returns default constructor method string.
+     *
+     * @param type generated file type
+     * @param name class name
+     * @return default constructor string
+     */
+    public static String getDefaultConstructorString(GeneratedFileType type, String name) {
+
+        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.DEFAULT_CONSTRUCTOR, name)
+                + JavaCodeSnippetGen.getJavaMethodInfo(type, name, GeneratedMethodTypes.DEFAULT_CONSTRUCTOR, null);
+    }
+
+    /**
+     * Returns build method string.
+     *
+     * @param name class name
+     * @return build string
+     */
+    public static String getBuildString(String name) {
+
+        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.OVERRIDE + UtilConstants.NEW_LINE
+                + JavaCodeSnippetGen.getJavaMethodInfo(GeneratedFileType.BUILDER_CLASS, name,
+                        GeneratedMethodTypes.BUILD, null);
+    }
+
+    /**
+     * Returns the getter method strings for class file.
+     *
+     * @param yangName name of the attribute.
+     * @param returnType return type of attribute
+     * @return getter method for class.
+     */
+    private static String getGetterForClass(String yangName, YangType<?> returnType) {
+
+        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE
+                + returnType.getDataTypeName() + UtilConstants.SPACE + UtilConstants.GET_METHOD_PREFIX + yangName
+                + UtilConstants.OPEN_PARENTHESIS + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SPACE
+                + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE + UtilConstants.EIGHT_SPACE_INDENTATION
+                + UtilConstants.RETURN + UtilConstants.SPACE + yangName + UtilConstants.SEMI_COLAN
+                + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET;
+    }
+
+    /**
+     * Returns the setter method strings for class file.
+     *
+     * @param yangName name of the attribute.
+     * @param returnType return type of attribute
+     * @return setter method for class.
+     */
+    private static String getSetterForClass(String yangName, YangType<?> returnType) {
+
+        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE + getBuilderClassName()
+        + UtilConstants.SPACE + UtilConstants.SET_METHOD_PREFIX + yangName + UtilConstants.OPEN_PARENTHESIS
+        + returnType.getDataTypeName() + UtilConstants.SPACE + yangName + UtilConstants.CLOSE_PARENTHESIS
+        + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE
+        + UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.THIS + UtilConstants.PERIOD + yangName
+        + UtilConstants.SPACE + UtilConstants.EQUAL + UtilConstants.SPACE + yangName + UtilConstants.SEMI_COLAN
+        + UtilConstants.NEW_LINE + UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.RETURN
+        + UtilConstants.SPACE + UtilConstants.THIS + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE
+        + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET;
+    }
+
+    /**
+     * Returns the getter method strings for interface file.
+     *
+     * @param yangName name of the attribute.
+     * @param returnType return type of attribute
+     * @return getter method for interface.
+     */
+    private static String getGetterForInterface(String yangName, YangType<?> returnType) {
+        returnType.setDataTypeName(returnType.getDataTypeName().replace("\"", ""));
+        return UtilConstants.FOUR_SPACE_INDENTATION + returnType.getDataTypeName() + UtilConstants.SPACE
+                + UtilConstants.GET_METHOD_PREFIX + yangName + UtilConstants.OPEN_PARENTHESIS
+                + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SEMI_COLAN;
+    }
+
+    /**
+     * Returns the setter method strings for interface file.
+     *
+     * @param yangName name of the attribute.
+     * @param returnType return type of attribute
+     * @return setter method for interface.
+     */
+    private static String getSetterForInterface(String yangName, YangType<?> returnType) {
+        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.BUILDER + UtilConstants.SPACE
+                + UtilConstants.SET_METHOD_PREFIX + yangName + UtilConstants.OPEN_PARENTHESIS
+                + returnType.getDataTypeName() + UtilConstants.SPACE + yangName + UtilConstants.CLOSE_PARENTHESIS
+                + UtilConstants.SEMI_COLAN;
+    }
+
+    /**
+     * Returns the build method strings for interface file.
+     *
+     * @param yangName name of the attribute.
+     * @param returnType return type of attribute
+     * @return build method for interface.
+     */
+    private static String getBuildForInterface(String yangName) {
+
+        return UtilConstants.FOUR_SPACE_INDENTATION + yangName + UtilConstants.SPACE + UtilConstants.BUILD
+                + UtilConstants.OPEN_PARENTHESIS + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SEMI_COLAN;
+    }
+
+    /**
+     * Returns the constructor strings for class file.
+     *
+     * @param yangName name of the class.
+     * @return constructor for class
+     */
+    private static String getConstructor(String yangName) {
+
+        String builderAttribute = (yangName.substring(0, 1).toLowerCase() + yangName.substring(1));
+        String constructor = UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE
+                + yangName + UtilConstants.IMPL + UtilConstants.OPEN_PARENTHESIS + yangName + UtilConstants.BUILDER
+                + UtilConstants.SPACE + builderAttribute + UtilConstants.OBJECT + UtilConstants.CLOSE_PARENTHESIS
+                + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE;
+
+        if (getAttrInfo() != null) {
+            for (AttributeInfo attribute : getAttrInfo()) {
+                attribute.setAttributeName(JavaIdentifierSyntax.getCamelCase(attribute.getAttributeName()));
+                constructor = constructor + UtilConstants.TWELVE_SPACE_INDENTATION + UtilConstants.THIS
+                        + UtilConstants.PERIOD + attribute.getAttributeName() + UtilConstants.SPACE
+                        + UtilConstants.EQUAL + UtilConstants.SPACE + builderAttribute + UtilConstants.OBJECT
+                        + UtilConstants.PERIOD + UtilConstants.GET_METHOD_PREFIX + attribute.getAttributeName()
+                        + UtilConstants.OPEN_PARENTHESIS + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SEMI_COLAN
+                        + UtilConstants.NEW_LINE;
+            }
+            getAttrInfo().clear();
+        }
+        return constructor + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET
+                + UtilConstants.NEW_LINE;
+    }
+
+    /**
+     * Returns the build method strings for class file.
+     *
+     * @param yangName class name
+     * @return build method string for class.
+     */
+    private static String getBuild(String yangName) {
+
+        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE + yangName
+                + UtilConstants.SPACE + UtilConstants.BUILD + UtilConstants.OPEN_PARENTHESIS
+                + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET
+                + UtilConstants.NEW_LINE + UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.RETURN
+                + UtilConstants.SPACE + UtilConstants.NEW + UtilConstants.SPACE + yangName + UtilConstants.IMPL
+                + UtilConstants.OPEN_PARENTHESIS + UtilConstants.THIS + UtilConstants.CLOSE_PARENTHESIS
+                + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
+                + UtilConstants.CLOSE_CURLY_BRACKET;
+    }
+
+    /**
+     * Returns the Default constructor strings for class file.
+     *
+     * @param yangName name of the class.
+     * @return Default constructor for class
+     */
+    private static String getDefaultConstructor(String name) {
+
+        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE + name
+                + UtilConstants.OPEN_PARENTHESIS + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SPACE
+                + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
+                + UtilConstants.CLOSE_CURLY_BRACKET + UtilConstants.NEW_LINE;
+    }
+
+}