[ONOS-5632] inter jar linking for buck plugin.

Change-Id: I2270a23622ab7013c661ff34d794ee7152e572fb
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNode.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNode.java
index b138fc1..f2ff214 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNode.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNode.java
@@ -153,6 +153,7 @@
      * node type.
      *
      * @return true if empty data-type is present, false otherwise
+     * @throws DataModelException when fails to do data model operations
      */
     boolean isEmptyDataType() throws DataModelException;
 }
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
index edf0216..e179903 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
@@ -1191,7 +1191,7 @@
      * @return interface of add augmentation
      */
     static String getAddAugmentInfoMethodInterface(String className) {
-        StringBuilder builder = new StringBuilder(generateForAddAugmentation());
+        StringBuilder builder = new StringBuilder(generateForAddAugmentation(className));
         LinkedHashMap<String, String> map = new LinkedHashMap<>();
         map.put(VALUE, OBJECT_STRING);
         map.put(CLASS + OBJECT_STRING, CLASS_STRING);
diff --git a/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java b/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
index ecc70b6..cd359cd 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
@@ -228,6 +228,21 @@
     public static final String PERIOD = ".";
 
     /**
+     * Static attribute for lib.
+     */
+    public static final String LIB = "lib__";
+
+    /**
+     * Static attribute for lib path.
+     */
+    public static final String LIB_PATH = "//lib:";
+
+    /**
+     * Static attribute for output.
+     */
+    public static final String OUT = "__output";
+
+    /**
      * Static attribute for period.
      */
     public static final String ENTRY = "Entry";
diff --git a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
index 5c499db..8c8e794 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
@@ -585,16 +585,17 @@
     /**
      * Generates javaDocs for add augmentation method.
      *
+     * @param name builder class name
      * @return javaDocs
      */
-    public static String generateForAddAugmentation() {
+    public static String generateForAddAugmentation(String name) {
         return getJavaDocStartLine(YANG_AUGMENTED_INFO_LOWER_CASE,
                                    JAVA_DOC_SETTERS_COMMON) +
                 getJavaDocEmptyAsteriskLine() +
                 getJavaDocParamLine(YANG_AUGMENTED_INFO_LOWER_CASE, VALUE) +
                 getJavaDocParamLine(YANG_AUGMENTED_INFO_LOWER_CASE, CLASS +
                         OBJECT_STRING) +
-                getJavaDocEndLine();
+                getJavaDocReturnLine(name) + getJavaDocEndLine();
     }
 
     /**
@@ -667,7 +668,9 @@
                     break;
             }
         }
-        javadoc.append(getJavaDocReturnLine(BUILDER_OBJECT + attribute))
+        javadoc.append(getJavaDocParamLine(
+                attribute, ADD_STRING + TO_CAPS))
+                .append(getJavaDocReturnLine(BUILDER_OBJECT + attribute))
                 .append(getJavaDocEndLine());
         return javadoc.toString();
     }
diff --git a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangGenerator.java b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangGenerator.java
index 49b583c..b14a54a 100644
--- a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangGenerator.java
+++ b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangGenerator.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.yangutils.plugin.buck;
 
+import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.tool.CallablePlugin;
 import org.onosproject.yangutils.tool.YangToolManager;
 import org.onosproject.yangutils.utils.io.YangPluginConfig;
@@ -26,6 +27,7 @@
 import java.util.List;
 
 import static java.util.stream.Collectors.toList;
+import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.parseJarFile;
 import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
 import static org.onosproject.yangutils.utils.UtilConstants.YANG_RESOURCES;
 
@@ -35,12 +37,14 @@
 public class YangGenerator implements CallablePlugin {
 
     private final List<File> models;
+    private final List<String> depJar;
     private String outputDirectory;
     private final String DEFAULT_JAR_RES_PATH = SLASH + YANG_RESOURCES + SLASH;
 
-    YangGenerator(List<File> models, String outputDirectory) {
+    YangGenerator(List<File> models, String outputDirectory, List<String> depJar) {
         this.models = models;
-        this.outputDirectory = outputDirectory + "/";
+        this.depJar = depJar;
+        this.outputDirectory = outputDirectory + SLASH;
     }
 
     public void execute() throws YangParsingException {
@@ -50,11 +54,15 @@
                 YangPluginConfig config = new YangPluginConfig();
                 config.setCodeGenDir(outputDirectory);
                 config.resourceGenDir(outputDirectory + DEFAULT_JAR_RES_PATH);
-
+                //for inter-jar linking.
+                List<YangNode> dependentSchema = new ArrayList<>();
+                for (String jar : depJar) {
+                    dependentSchema.addAll(parseJarFile(jar, outputDirectory));
+                }
                 //intra jar file linking.
                 YangToolManager manager = new YangToolManager();
                 manager.compileYangFiles(manager.createYangFileInfoSet(files),
-                                         null, config, this);
+                                         dependentSchema, config, this);
             } catch (Exception e) {
                 throw new YangParsingException(e);
             }
diff --git a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibrary.java b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibrary.java
index 8db806b..5d0550c 100644
--- a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibrary.java
+++ b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibrary.java
@@ -16,13 +16,6 @@
 
 package org.onosproject.yangutils.plugin.buck;
 
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import javax.annotation.Nullable;
-
 import com.facebook.buck.jvm.java.JarDirectoryStep;
 import com.facebook.buck.model.BuildTargets;
 import com.facebook.buck.rules.AbstractBuildRule;
@@ -39,6 +32,16 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSortedSet;
 
+import javax.annotation.Nullable;
+import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
+import static org.onosproject.yangutils.utils.UtilConstants.YANG;
+
 /**
  * Buck rule to define a library built form a Yang model.
  */
@@ -46,7 +49,8 @@
 
     @AddToRuleKey
     private final ImmutableSortedSet<SourcePath> srcs;
-    
+    private final BuildRuleParams params;
+
     private final Path genSrcsDirectory;
     private final Path outputDirectory;
     private final Path output;
@@ -57,7 +61,7 @@
             ImmutableSortedSet<SourcePath> srcs) {
         super(params, resolver);
         this.srcs = srcs;
-
+        this.params = params;
         genSrcsDirectory = BuildTargets.getGenPath(getProjectFilesystem(),
                                                    params.getBuildTarget(),
                                                    "%s__yang-gen");
@@ -91,7 +95,8 @@
                 .map(s -> getResolver().getRelativePath(s))
                 .collect(Collectors.toList());
 
-        steps.add(new YangStep(getProjectFilesystem(), sourcePaths, genSrcsDirectory));
+        steps.add(new YangStep(getProjectFilesystem(), sourcePaths, genSrcsDirectory,
+                               params.getDeps()));
 
         steps.add(new JarDirectoryStep(
                 getProjectFilesystem(),
@@ -108,4 +113,17 @@
     public Path getPathToOutput() {
         return output;
     }
+
+
+    /**
+     * Returns generated sources directory.
+     *
+     * @return generated sources directory
+     */
+    public Path getGenSrcsDirectory() {
+        File dir = new File(genSrcsDirectory.toString() + SLASH + YANG);
+        dir.mkdirs();
+        return genSrcsDirectory;
+    }
+
 }
diff --git a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibraryDescription.java b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibraryDescription.java
index 29d4225..83b1370 100644
--- a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibraryDescription.java
+++ b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibraryDescription.java
@@ -16,10 +16,6 @@
 
 package org.onosproject.yangutils.plugin.buck;
 
-import java.nio.file.Path;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
 import com.facebook.buck.cli.BuckConfig;
 import com.facebook.buck.jvm.java.CalculateAbi;
 import com.facebook.buck.jvm.java.DefaultJavaLibrary;
@@ -43,6 +39,7 @@
 import com.facebook.buck.rules.BuildRuleType;
 import com.facebook.buck.rules.BuildTargetSourcePath;
 import com.facebook.buck.rules.Description;
+import com.facebook.buck.rules.PathSourcePath;
 import com.facebook.buck.rules.SourcePath;
 import com.facebook.buck.rules.SourcePathResolver;
 import com.facebook.buck.rules.SourcePaths;
@@ -53,6 +50,14 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSortedSet;
 
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
+import static org.onosproject.yangutils.utils.UtilConstants.YANG;
+
 /**
  * Description of a Buck Yang Library.
  */
@@ -94,7 +99,6 @@
         BuildRuleParams yangParams = params.copyWithBuildTarget(
                 BuildTargets.createFlavoredBuildTarget(
                         unflavoredBuildTarget, SOURCES));
-
         BuildRule yangLib = resolver.addToIndex(new YangLibrary(yangParams, pathResolver, args.srcs));
 
         if (params.getBuildTarget().getFlavors().contains(SOURCES)) {
@@ -126,13 +130,21 @@
 
         BuildTarget abiJarTarget = params.getBuildTarget().withAppendedFlavors(CalculateAbi.FLAVOR);
 
+        //Add yang meta data resources to generated jar file resources.
+
+        Path rscRoot = ((YangLibrary) yangLib).getGenSrcsDirectory();
+        Path resPath = Paths.get(rscRoot + SLASH + YANG);
+
+        SourcePath path = new PathSourcePath(params.getProjectFilesystem(),
+                                             resPath);
+
         DefaultJavaLibrary library =
                 resolver.addToIndex(
                         new DefaultJavaLibrary(
                                 javaParams,
                                 pathResolver,
                                 ImmutableSet.of(SourcePaths.getToBuildTargetSourcePath().apply(yangLib)),
-                                /* resources */ ImmutableSet.<SourcePath>of(),
+                                /* resources */ImmutableSet.of(path),
                                 javacOptions.getGeneratedSourceFolderName(),
                                 /* proguardConfig */ Optional.<SourcePath>absent(),
                                 /* postprocessClassesCommands */ ImmutableList.<String>of(),
@@ -142,7 +154,7 @@
                                 javacOptions.trackClassUsage(),
                                 /* additionalClasspathEntries */ ImmutableSet.<Path>of(),
                                 new JavacToJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY),
-                                /* resourcesRoot */ Optional.<Path>absent(),
+                                /* resourcesRoot */ Optional.<Path>of(rscRoot),
                                 /* manifestFile */ Optional.absent(),
                                 /* mavenCoords */ Optional.<String>absent(),
                                 /* tests */ ImmutableSortedSet.<BuildTarget>of(),
@@ -169,4 +181,5 @@
 
         //TODO other params here
     }
+
 }
diff --git a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangStep.java b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangStep.java
index ae84cc3..d795d8c 100644
--- a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangStep.java
+++ b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangStep.java
@@ -15,16 +15,27 @@
  */
 package org.onosproject.yangutils.plugin.buck;
 
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.List;
-import java.util.stream.Collectors;
-
 import com.facebook.buck.io.ProjectFilesystem;
+import com.facebook.buck.model.UnflavoredBuildTarget;
+import com.facebook.buck.rules.BuildRule;
 import com.facebook.buck.step.AbstractExecutionStep;
 import com.facebook.buck.step.ExecutionContext;
 import com.facebook.buck.step.StepExecutionResult;
+import com.google.common.collect.ImmutableSortedSet;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.onosproject.yangutils.utils.UtilConstants.JAR;
+import static org.onosproject.yangutils.utils.UtilConstants.LIB;
+import static org.onosproject.yangutils.utils.UtilConstants.LIB_PATH;
+import static org.onosproject.yangutils.utils.UtilConstants.OUT;
+import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
+import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
 
 /**
  * Buck build step to trigger Yang Java source file generation.
@@ -32,17 +43,18 @@
 public class YangStep extends AbstractExecutionStep {
 
     private static final String DESCRIPTION = "yang-compile";
-
+    private final ImmutableSortedSet<BuildRule> deps;
     private final ProjectFilesystem filesystem;
     private final List<Path> srcs;
     private final Path output;
 
     YangStep(ProjectFilesystem filesystem,
              List<Path> srcs,
-             Path genSourcesDirectory) {
+             Path genSourcesDirectory, ImmutableSortedSet<BuildRule> deps) {
         super(DESCRIPTION);
         this.filesystem = filesystem;
         this.srcs = srcs;
+        this.deps = deps;
         this.output = genSourcesDirectory;
     }
 
@@ -52,13 +64,42 @@
 
         List<File> sourceFiles = srcs.stream().map(Path::toFile)
                 .collect(Collectors.toList());
-
         try {
-            new YangGenerator(sourceFiles, output.toString()).execute();
+            new YangGenerator(sourceFiles, output.toString(), getJarPaths())
+                    .execute();
             return StepExecutionResult.SUCCESS;
-        } catch(YangParsingException e) {
+        } catch (YangParsingException e) {
             executionContext.getConsole().printErrorText(e.getMessage());
             return StepExecutionResult.ERROR;
         }
     }
+
+    private List<String> getJarPaths() {
+        StringBuilder builder;
+        List<String> depJarPaths = new ArrayList<>();
+        String[] array;
+        UnflavoredBuildTarget uBt;
+        if (deps != null) {
+            for (BuildRule rule : deps) {
+                if (!rule.getBuildTarget().getFullyQualifiedName()
+                        .contains(LIB_PATH)) {
+                    builder = new StringBuilder();
+                    //build absolute path for jar file
+                    builder.append(filesystem.getRootPath().toString()).append(SLASH)
+                            .append(filesystem.getBuckPaths().getGenDir())
+                            .append(SLASH);
+                    uBt = rule.getBuildTarget().getUnflavoredBuildTarget();
+                    array = uBt.getBaseName().split(SLASH);
+                    for (int i = 2; i < array.length; i++) {
+                        builder.append(array[i]).append(SLASH);
+                    }
+                    builder.append(LIB).append(uBt.getShortName())
+                            .append(OUT).append(SLASH)
+                            .append(uBt.getShortName()).append(PERIOD + JAR);
+                    depJarPaths.add(builder.toString());
+                }
+            }
+        }
+        return depJarPaths;
+    }
 }
diff --git a/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java b/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
index 9285edd..33e8f64 100644
--- a/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
+++ b/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
@@ -230,13 +230,9 @@
             List<YangNode> interJarResolvedNodes =
                     resolveInterJarDependencies(project, localRepository,
                                                 remoteRepository, outputDir);
-            System.out.println("going to call tool manager");
             toolManager.compileYangFiles(yangFileInfoSet,
                                          interJarResolvedNodes, yangPlugin,
                                          this);
-            System.out.println("called tool manager");
-
-
         } catch (YangToolException e) {
             String fileName = EMPTY_STRING;
             if (e.getCurYangFile() != null) {
diff --git a/plugin/tool/src/main/java/org/onosproject/yangutils/tool/CallablePlugin.java b/plugin/tool/src/main/java/org/onosproject/yangutils/tool/CallablePlugin.java
index 3f44863..21dd05b 100644
--- a/plugin/tool/src/main/java/org/onosproject/yangutils/tool/CallablePlugin.java
+++ b/plugin/tool/src/main/java/org/onosproject/yangutils/tool/CallablePlugin.java
@@ -23,6 +23,7 @@
  * will be used in by tool to be plugin agnostic.
  */
 public interface CallablePlugin {
+
     /**
      * Adds generated source directory to the compilation root.
      */
@@ -32,6 +33,7 @@
      * serialize the compiled schema and place it in the appropriate location
      * so that it will be part of the generated OSGi bundle.
      *
+     * @throws IOException when fails to do IO operations
      */
     void addCompiledSchemaToBundle()
             throws IOException;
@@ -41,6 +43,7 @@
      * Add the YANG files in the bundle, to support YANG display in protocols
      * like RESTCONF.
      *
+     * @throws IOException when fails to do IO operations
      */
     void addYangFilesToBundle() throws IOException;
 }
diff --git a/plugin/tool/src/main/java/org/onosproject/yangutils/tool/YangToolManager.java b/plugin/tool/src/main/java/org/onosproject/yangutils/tool/YangToolManager.java
index ac0123b..4e5d44e 100644
--- a/plugin/tool/src/main/java/org/onosproject/yangutils/tool/YangToolManager.java
+++ b/plugin/tool/src/main/java/org/onosproject/yangutils/tool/YangToolManager.java
@@ -97,6 +97,7 @@
      * Creates a YANG file info set.
      *
      * @param yangFileList YANG files list
+     * @return yang file info set
      */
     public Set<YangFileInfo> createYangFileInfoSet(List<String> yangFileList) {
         if (yangFileInfoSet == null) {
@@ -114,9 +115,11 @@
      * Compile te YANG files and generate the corresponding Java files.
      * Update the generated bundle with the schema metadata.
      *
-     * @param yangFiles Application YANG files
-     * @param config    tool configuration
-     * @param plugin    invoking plugin
+     * @param yangFiles       Application YANG files
+     * @param dependentSchema inter jar linked schema nodes
+     * @param config          tool configuration
+     * @param plugin          invoking plugin
+     * @throws IOException when fails to do IO operations
      */
     public void compileYangFiles(Set<YangFileInfo> yangFiles,
                                  List<YangNode> dependentSchema,
@@ -126,7 +129,7 @@
         synchronized (yangFiles) {
             try {
 
-                if (config == null || yangFiles == null) {
+                if (config == null) {
                     throw new YangToolException(E_MISSING_INPUT);
                 }
                 yangFileInfoSet = yangFiles;