/**
  * Translates to java code corresponding to the YANG schema.
  *
  * @param yangFileInfo YANG file information
  * @param yangPlugin YANG plugin config
  * @throws IOException when fails to generate java code file the current node
  */
 public static void translateToJava(List<YangFileInfo> yangFileInfo, YangPluginConfig yangPlugin)
     throws IOException {
   Iterator<YangFileInfo> yangFileIterator = yangFileInfo.iterator();
   while (yangFileIterator.hasNext()) {
     YangFileInfo yangFile = yangFileIterator.next();
     generateJavaCode(yangFile.getRootNode(), yangPlugin, yangFile.getYangFileName());
   }
 }
 /**
  * Resolves sub-module linking.
  *
  * @param yangFileInfo YANG file information
  * @throws DataModelException when belongs-to module node is not found
  */
 public static void resolveLinkingForSubModule(List<YangFileInfo> yangFileInfo)
     throws DataModelException {
   Iterator<YangFileInfo> yangFileIterator = yangFileInfo.iterator();
   while (yangFileIterator.hasNext()) {
     YangFileInfo yangFile = yangFileIterator.next();
     YangNode yangNode = yangFile.getRootNode();
     if (yangNode instanceof YangSubModule) {
       String belongsToModuleName =
           ((YangSubModule) yangNode).getBelongsTo().getBelongsToModuleName();
       YangNode moduleNode = findBelongsToModuleNode(yangFileInfo, belongsToModuleName);
       ((YangSubModule) yangNode).getBelongsTo().setModuleNode(moduleNode);
     }
   }
 }
  @Override
  public void execute() throws MojoExecutionException, MojoFailureException {

    try {

      /*
       * For deleting the generated code in previous build.
       */
      deleteDirectory(getDirectory(baseDir, genFilesDir) + DEFAULT_PKG);
      deleteDirectory(getDirectory(baseDir, outputDirectory));

      String searchDir = getDirectory(baseDir, yangFilesDir);
      String codeGenDir = getDirectory(baseDir, genFilesDir) + SLASH;
      YangToJavaNamingConflictUtil conflictResolver = new YangToJavaNamingConflictUtil();
      conflictResolver.setReplacementForPeriod(replacementForPeriod);
      conflictResolver.setReplacementForHyphen(replacementForHyphen);
      conflictResolver.setReplacementForUnderscore(replacementForUnderscore);
      List<YangFileInfo> yangFileInfo = YangFileScanner.getYangFiles(searchDir);
      if (yangFileInfo == null || yangFileInfo.isEmpty()) {
        // no files to translate
        return;
      }
      YangPluginConfig yangPlugin = new YangPluginConfig();
      yangPlugin.setCodeGenDir(codeGenDir);
      yangPlugin.setConflictResolver(conflictResolver);

      Iterator<YangFileInfo> yangFileIterator = yangFileInfo.iterator();
      while (yangFileIterator.hasNext()) {
        YangFileInfo yangFile = yangFileIterator.next();
        try {
          YangNode yangNode = yangUtilsParser.getDataModel(yangFile.getYangFileName());
          yangFile.setRootNode(yangNode);
          setRootNode(yangNode);
        } catch (ParserException e) {
          String logInfo = "Error in file: " + e.getFileName();
          if (e.getLineNumber() != 0) {
            logInfo =
                logInfo
                    + " at line: "
                    + e.getLineNumber()
                    + " at position: "
                    + e.getCharPositionInLine();
          }
          if (e.getMessage() != null) {
            logInfo = logInfo + NEW_LINE + e.getMessage();
          }
          getLog().info(logInfo);
          throw e;
        }
      }

      resolveLinkingForSubModule(yangFileInfo);

      translateToJava(yangFileInfo, yangPlugin);

      addToSource(getDirectory(baseDir, genFilesDir) + DEFAULT_PKG, project, context);
      copyYangFilesToTarget(yangFileInfo, getDirectory(baseDir, outputDirectory), project);
    } catch (Exception e) {
      String fileName = "";
      if (e instanceof TranslatorException) {
        fileName = ((TranslatorException) e).getFileName();
      }
      try {
        translatorErrorHandler(getRootNode());
        deleteDirectory(getDirectory(baseDir, genFilesDir) + DEFAULT_PKG);
      } catch (IOException ex) {
        throw new MojoExecutionException(
            "Error handler failed to delete files for data model node.");
      }
      throw new MojoExecutionException(
          "Exception occured due to "
              + e.getLocalizedMessage()
              + " in "
              + fileName
              + " YANG file.");
    }
  }