[ONOS-4303, ONOS-4508, ONOS-4509, ONOS-4510, ONOS-4351]notification,rpc,union,sub-module,augment

Change-Id: Ibeed9ff965c13fd66743c1080cb1350d93a3a435
diff --git a/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java b/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
index eeee061..965367c 100644
--- a/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
+++ b/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
@@ -41,6 +41,18 @@
     public static final String INTERFACE_JAVA_DOC = " * Abstraction of an entity which represents the"
             + " functionality of ";
 
+
+    /**
+     * JavaDocs for event.
+     */
+    public static final String EVENT_JAVA_DOC = " * Represents event implementation of ";
+
+    /**
+     * JavaDocs for event listener.
+     */
+    public static final String EVENT_LISTENER_JAVA_DOC = " * Abstraction for event listener of ";
+
+
     /**
      * JavaDocs for builder interface class.
      */
@@ -97,6 +109,11 @@
     public static final String JAVA_DOC_SETTERS = " * Returns the builder object of ";
 
     /**
+     * JavaDocs's description for setter method.
+     */
+    public static final String JAVA_DOC_MANAGER_SETTERS = " * Sets the value to attribute ";
+
+    /**
      * JavaDocs's description for OF method.
      */
     public static final String JAVA_DOC_OF = " * Returns the object of ";
@@ -677,6 +694,17 @@
     public static final String BUILDER = "Builder";
 
     /**
+     * Static attribute for manager syntax.
+     */
+    public static final String MANAGER = "Manager";
+
+    /**
+     * Static attribute for service syntax.
+     */
+    public static final String SERVICE = "Service";
+
+
+    /**
      * Static attribute for interface syntax.
      */
     public static final String INTERFACE = "interface";
@@ -742,6 +770,16 @@
     public static final String SERVICE_METHOD_STRING = "Service";
 
     /**
+     * For event file generation.
+     */
+    public static final String EVENT_STRING = "Event";
+
+    /**
+     * For event listener file generation.
+     */
+    public static final String EVENT_LISTENER_STRING = "Listener";
+
+    /**
      * Static attribute for impl syntax.
      */
     public static final String IMPL = "Impl";
@@ -837,6 +875,11 @@
     public static final String ARRAY_LIST = "ArrayList";
 
     /**
+     * comment to be added for autogenerated impl methods.
+     */
+    public static final String YANG_UTILS_TODO = "//TODO: YANG utils generated code";
+
+    /**
      * Creates an instance of util constants.
      */
     private UtilConstants() {
diff --git a/src/main/java/org/onosproject/yangutils/utils/io/impl/FileSystemUtil.java b/src/main/java/org/onosproject/yangutils/utils/io/impl/FileSystemUtil.java
index c259a7f..1dced05 100644
--- a/src/main/java/org/onosproject/yangutils/utils/io/impl/FileSystemUtil.java
+++ b/src/main/java/org/onosproject/yangutils/utils/io/impl/FileSystemUtil.java
@@ -23,17 +23,24 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 
+import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
+import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
+
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getJavaPackageFromPackagePath;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getPackageDirPathFromJavaJPackage;
+import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getParentNodeInGenCode;
 import static org.onosproject.yangutils.utils.UtilConstants.EIGHT_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.MULTIPLE_NEW_LINE;
 import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
+import static org.onosproject.yangutils.utils.UtilConstants.PACKAGE_INFO_JAVADOC_OF_CHILD;
 import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
 import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.addPackageInfo;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.createDirectories;
+import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getAbsolutePackagePath;
 
 /**
  * Represents utility to handle file system operations.
@@ -61,15 +68,29 @@
     /**
      * Creates a package structure with package info java file if not present.
      *
-     * @param pkg java package string
-     * @param pkgInfo description of package
+     * @param yangNode YANG node for which code is being generated
      * @throws IOException any IO exception
      */
-    public static void createPackage(String pkg, String pkgInfo) throws IOException {
-        if (!doesPackageExist(pkg)) {
+    public static void createPackage(YangNode yangNode)
+            throws IOException {
+
+        YangNode parent = getParentNodeInGenCode(yangNode);
+        JavaFileInfo javaFileInfo = ((JavaFileInfoContainer) yangNode).getJavaFileInfo();
+        String absolutePath = getAbsolutePackagePath(javaFileInfo.getBaseCodeGenPath(),
+                javaFileInfo.getPackageFilePath());
+
+        String pkgInfo;
+        if (parent != null) {
+            pkgInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo().getJavaName()
+                    + PACKAGE_INFO_JAVADOC_OF_CHILD;
+        } else {
+            pkgInfo = javaFileInfo.getJavaName();
+        }
+
+        if (!doesPackageExist(absolutePath)) {
             try {
-                File pack = createDirectories(pkg);
-                addPackageInfo(pack, pkgInfo, getJavaPackageFromPackagePath(pkg));
+                File pack = createDirectories(absolutePath);
+                addPackageInfo(pack, pkgInfo, getJavaPackageFromPackagePath(absolutePath));
             } catch (IOException e) {
                 throw new IOException("failed to create package-info file");
             }
@@ -81,12 +102,13 @@
      * file.
      *
      * @param toAppend destination file in which the contents of source file is
-     *            appended
+     * appended
      * @param srcFile source file from which data is read and added to to append
-     *            file
+     * file
      * @throws IOException any IO errors
      */
-    public static void appendFileContents(File toAppend, File srcFile) throws IOException {
+    public static void appendFileContents(File toAppend, File srcFile)
+            throws IOException {
         updateFileHandle(srcFile, NEW_LINE + readAppendFile(toAppend.toString(), FOUR_SPACE_INDENTATION), false);
     }
 
@@ -98,7 +120,8 @@
      * @return string of file
      * @throws IOException when fails to convert to string
      */
-    public static String readAppendFile(String toAppend, String spaces) throws IOException {
+    public static String readAppendFile(String toAppend, String spaces)
+            throws IOException {
         FileReader fileReader = new FileReader(toAppend);
         BufferedReader bufferReader = new BufferedReader(fileReader);
         try {
@@ -131,9 +154,10 @@
      * @param contentTobeAdded content to be appended to the file
      * @param isClose when close of file is called.
      * @throws IOException if the named file exists but is a directory rather than a regular file,
-     * does not exist but cannot be created, or cannot be opened for any other reason
+     *                     does not exist but cannot be created, or cannot be opened for any other reason
      */
-    public static void updateFileHandle(File inputFile, String contentTobeAdded, boolean isClose) throws IOException {
+    public static void updateFileHandle(File inputFile, String contentTobeAdded, boolean isClose)
+            throws IOException {
         FileWriter fileWriter = new FileWriter(inputFile, true);
         PrintWriter outputPrintWriter = new PrintWriter(fileWriter, true);
         if (!isClose) {
diff --git a/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java b/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
index e2fe7fd..fdf876d 100644
--- a/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
+++ b/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
@@ -26,6 +26,8 @@
 import static org.onosproject.yangutils.utils.UtilConstants.BUILDER_OBJECT;
 import static org.onosproject.yangutils.utils.UtilConstants.ENUM_ATTRIBUTE_JAVADOC;
 import static org.onosproject.yangutils.utils.UtilConstants.ENUM_CLASS_JAVADOC;
+import static org.onosproject.yangutils.utils.UtilConstants.EVENT_JAVA_DOC;
+import static org.onosproject.yangutils.utils.UtilConstants.EVENT_LISTENER_JAVA_DOC;
 import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.FROM_STRING_METHOD_NAME;
 import static org.onosproject.yangutils.utils.UtilConstants.FROM_STRING_PARAM_NAME;
@@ -39,6 +41,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_DOC_END_LINE;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_DOC_FIRST_LINE;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_DOC_GETTERS;
+import static org.onosproject.yangutils.utils.UtilConstants.JAVA_DOC_MANAGER_SETTERS;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_DOC_OF;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_DOC_PARAM;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_DOC_RETURN;
@@ -110,6 +113,16 @@
         RPC_INTERFACE,
 
         /**
+         * For event.
+         */
+        EVENT,
+
+        /**
+         * For event listener.
+         */
+        EVENT_LISTENER,
+
+        /**
          * For setters.
          */
         SETTER_METHOD,
@@ -157,14 +170,19 @@
         /**
          * For enum's attributes.
          */
-        ENUM_ATTRIBUTE
+        ENUM_ATTRIBUTE,
+
+        /**
+         * For manager setters.
+         */
+        MANAGER_SETTER_METHOD
     }
 
     /**
      * Returns java docs.
      *
-     * @param type   java doc type
-     * @param name   name of the YangNode
+     * @param type java doc type
+     * @param name name of the YangNode
      * @param isList is list attribute
      * @return javadocs.
      */
@@ -196,6 +214,9 @@
             case SETTER_METHOD: {
                 return generateForSetters(name, isList);
             }
+            case MANAGER_SETTER_METHOD: {
+                return generateForManagerSetters(name, isList);
+            }
             case OF_METHOD: {
                 return generateForOf(name);
             }
@@ -220,6 +241,12 @@
             case RPC_INTERFACE: {
                 return generateForRpcInterface(name);
             }
+            case EVENT: {
+                return generateForEvent(name);
+            }
+            case EVENT_LISTENER: {
+                return generateForEventListener(name);
+            }
             default: {
                 return generateForConstructors(name);
             }
@@ -240,8 +267,8 @@
     /**
      * Generates javaDocs for rpc method.
      *
-     * @param rpcName    name of the rpc
-     * @param inputName  name of input
+     * @param rpcName name of the rpc
+     * @param inputName name of input
      * @param outputName name of output
      * @return javaDocs of rpc method
      */
@@ -260,7 +287,7 @@
      * Returns output string of rpc.
      *
      * @param outputName name of output
-     * @param rpcName    name of rpc
+     * @param rpcName name of rpc
      * @return javaDocs for output string of rpc
      */
     private static String getOutputString(String outputName, String rpcName) {
@@ -271,7 +298,7 @@
      * Returns input string of rpc.
      *
      * @param inputName name of input
-     * @param rpcName   name of rpc
+     * @param rpcName name of rpc
      * @return javaDocs for input string of rpc
      */
     private static String getInputString(String inputName, String rpcName) {
@@ -294,10 +321,32 @@
     }
 
     /**
+     * Generates javaDoc for the event.
+     *
+     * @param eventClassName event class name
+     * @return javaDocs
+     */
+    private static String generateForEvent(String eventClassName) {
+        return NEW_LINE + JAVA_DOC_FIRST_LINE + EVENT_JAVA_DOC + eventClassName + PERIOD + NEW_LINE
+                + JAVA_DOC_END_LINE;
+    }
+
+    /**
+     * Generates javaDoc for the event listener.
+     *
+     * @param eventListenerInterfaceName event class name
+     * @return javaDocs
+     */
+    private static String generateForEventListener(String eventListenerInterfaceName) {
+        return NEW_LINE + JAVA_DOC_FIRST_LINE + EVENT_LISTENER_JAVA_DOC + eventListenerInterfaceName
+                + PERIOD + NEW_LINE + JAVA_DOC_END_LINE;
+    }
+
+    /**
      * Generates javaDocs for getter method.
      *
      * @param attribute attribute
-     * @param isList    is list attribute
+     * @param isList is list attribute
      * @return javaDocs
      */
     private static String generateForGetters(String attribute, boolean isList) {
@@ -320,7 +369,7 @@
      * Generates javaDocs for setter method.
      *
      * @param attribute attribute
-     * @param isList    is list attribute
+     * @param isList is list attribute
      * @return javaDocs
      */
     private static String generateForSetters(String attribute, boolean isList) {
@@ -340,6 +389,29 @@
     }
 
     /**
+     * Generates javaDocs for setter method.
+     *
+     * @param attribute attribute
+     * @param isList is list attribute
+     * @return javaDocs
+     */
+    private static String generateForManagerSetters(String attribute, boolean isList) {
+
+        String setter = NEW_LINE + FOUR_SPACE_INDENTATION + JAVA_DOC_FIRST_LINE + FOUR_SPACE_INDENTATION
+                + JAVA_DOC_MANAGER_SETTERS + attribute + PERIOD + NEW_LINE + FOUR_SPACE_INDENTATION + NEW_LINE_ASTERISK
+                + FOUR_SPACE_INDENTATION + JAVA_DOC_PARAM + attribute + SPACE;
+        if (isList) {
+            String listAttribute = LIST.toLowerCase() + SPACE + OF + SPACE;
+            setter = setter + listAttribute;
+        } else {
+            setter = setter + VALUE + SPACE + OF + SPACE;
+        }
+        setter = setter + attribute
+                + NEW_LINE + FOUR_SPACE_INDENTATION + JAVA_DOC_END_LINE;
+        return setter;
+    }
+
+    /**
      * Generates javaDocs for of method.
      *
      * @param attribute attribute
diff --git a/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java b/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
index 51ca81c..192df4e 100644
--- a/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
+++ b/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
@@ -25,12 +25,12 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.commons.io.FileUtils;
 import org.apache.maven.model.Resource;
 import org.apache.maven.project.MavenProject;
 import org.slf4j.Logger;
 import org.sonatype.plexus.build.incremental.BuildContext;
 
-import static org.apache.commons.io.FileUtils.deleteDirectory;
 import static org.onosproject.yangutils.utils.UtilConstants.COMMA;
 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
@@ -113,11 +113,11 @@
      * @param dir generated directory in previous build
      * @throws IOException when failed to delete directory
      */
-    public static void clean(String dir) throws IOException {
+    public static void deleteDirectory(String dir) throws IOException {
         File generatedDirectory = new File(dir);
         if (generatedDirectory.exists()) {
             try {
-                deleteDirectory(generatedDirectory);
+                FileUtils.deleteDirectory(generatedDirectory);
             } catch (IOException e) {
                 throw new IOException("Failed to delete the generated files in " + generatedDirectory + " directory");
             }