[ONOS-4650][ONOS-4726][ONOS-4727] [ONOS-4728]Implement must parser + when parser + feature + if-feature + revision defect fix

Change-Id: I0a3aee6c1c6b72ef7da7f7f565fd0f149fe3fd42
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java
index d05c8d0..e2097fc 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java
@@ -18,7 +18,7 @@
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.Calendar;
+import java.util.Date;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.regex.Pattern;
@@ -30,20 +30,18 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 
 import static org.onosproject.yangutils.utils.UtilConstants.ADD;
-import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
-import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
-import static org.onosproject.yangutils.utils.UtilConstants.COLON;
 import static org.onosproject.yangutils.utils.UtilConstants.CARET;
+import static org.onosproject.yangutils.utils.UtilConstants.COLON;
 import static org.onosproject.yangutils.utils.UtilConstants.CURRENTLY_UNSUPPORTED;
-import static org.onosproject.yangutils.utils.UtilConstants.QUOTES;
-import static org.onosproject.yangutils.utils.UtilConstants.HYPHEN;
 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
-import static org.onosproject.yangutils.utils.UtilConstants.TRUE;
 import static org.onosproject.yangutils.utils.UtilConstants.FALSE;
-import static org.onosproject.yangutils.utils.UtilConstants.YANG_FILE_ERROR;
 import static org.onosproject.yangutils.utils.UtilConstants.IDENTITYREF;
-import static org.onosproject.yangutils.utils.UtilConstants.LEAFREF;
 import static org.onosproject.yangutils.utils.UtilConstants.INSTANCE_IDENTIFIER;
+import static org.onosproject.yangutils.utils.UtilConstants.LEAFREF;
+import static org.onosproject.yangutils.utils.UtilConstants.QUOTES;
+import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
+import static org.onosproject.yangutils.utils.UtilConstants.TRUE;
+import static org.onosproject.yangutils.utils.UtilConstants.YANG_FILE_ERROR;
 
 /**
  * Represents an utility for listener.
@@ -256,17 +254,24 @@
     }
 
     /**
-     * Sets current date and makes it in usable format for revision.
+     * Returns current date and makes it in usable format for revision.
      *
      * @return usable current date format for revision
      */
-    public static String setCurrentDateForRevision() {
+    public static Date getCurrentDateForRevision() {
 
-        Calendar date = Calendar.getInstance();
         SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
-        String dateForRevision = dateFormat.format(date.getTime()).replaceAll(SLASH, HYPHEN).replaceAll(SPACE,
-                EMPTY_STRING);
-        return dateForRevision;
+
+        Date date = new Date();
+        String dateInString = dateFormat.format(date);
+        try {
+            //if not valid, it will throw ParseException
+            Date now = dateFormat.parse(dateInString);
+            return date;
+        } catch (ParseException e) {
+            ParserException parserException = new ParserException("YANG file error: Input date is not correct");
+            throw parserException;
+        }
     }
 
     /**
@@ -373,4 +378,35 @@
         parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
         throw parserException;
     }
+
+    /**
+     * Returns date and makes it in usable format for revision.
+     *
+     * @param dateInString date argument string from yang file
+     * @param ctx          yang construct's context to get the line number and character position
+     * @return date format for revision
+     */
+    public static Date getValidDateFromString(String dateInString, ParserRuleContext ctx) {
+        String dateArgument = removeQuotesAndHandleConcat(dateInString);
+        if (dateArgument == null || !dateArgument.matches(DATE_PATTERN)) {
+            ParserException parserException = new ParserException("YANG file error: Input date is not correct");
+            parserException.setLine(ctx.getStart().getLine());
+            parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
+            throw parserException;
+        }
+
+        SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
+        sdf.setLenient(false);
+
+        try {
+            //if not valid, it will throw ParseException
+            Date date = sdf.parse(dateArgument);
+            return date;
+        } catch (ParseException e) {
+            ParserException parserException = new ParserException("YANG file error: Input date is not correct");
+            parserException.setLine(ctx.getStart().getLine());
+            parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
+            throw parserException;
+        }
+    }
 }
\ No newline at end of file