https://hal.archives-ouvertes.fr/hal-02404862
Raw File
Tip revision: 759bd8995e51c4e40aa72fd5657d5e6e04c6da89 authored by Software Heritage on 04 February 2020, 13:44:27 UTC
hal: Deposit 405 in collection hal
Tip revision: 759bd89
Parser.java.bak
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package net.rationalminds;

import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
	
import net.rationalminds.model.DateElement;
import net.rationalminds.util.Dictionary;
import net.rationalminds.util.Helper;
import net.rationalminds.util.PredictionModelNode;

/**
 *
 * @author Vaibhav Singh
 */
public class Parser {

	String delim = "-.\\/|:, ";
	String learnedPatternString = null;
	boolean learnPattern = false;

	/**
	 * Provides the {@link List} of {@link LocalDateModel} as output
	 * 
	 * @param text
	 *            source text
	 * @return
	 */
	public List<LocalDateModel> parse(String text) {
		List<LocalDateModel> dateGroups = new ArrayList<LocalDateModel>();
		List<DateElement> groups = getDateGroups(text);
		// System.out.println(groups);
		if (groups == null) {
			return dateGroups;
		}
		for (DateElement element : groups) {
			LocalDateModel localdate = getDateFromPhrase(element);
			if (localdate != null) {
				localdate.setStart(element.getStartPos());
				localdate.setEnd(element.getEndPos());
				if (element.getTimeFragment() != null) {
					localdate = putTimeInDate(localdate, element);
				}
				String delims = element.getDateFragment().replaceAll("[A-Za-z0-9]", "");
				String foundFormat = localdate.getIdentifiedDateFormat();
				if(delims.length()==2) {
					foundFormat=foundFormat.replaceAll("\\$", String.valueOf(delims.charAt(0)));
					foundFormat=foundFormat.replaceAll("&", String.valueOf(delims.charAt(1)));
				}				
				if(delims.length()==3) {
					foundFormat=foundFormat.replaceAll("\\$", String.valueOf(delims.charAt(0)));
					foundFormat=foundFormat.replaceAll("&", String.valueOf(delims.charAt(1))+String.valueOf(delims.charAt(2)));
				}
				if(element.isIsAlphaNumeric() && Helper.isFullMonth(element.getData())) {
					foundFormat = foundFormat.replaceAll("MMM", "MMMMM");
				}
				if(element.isHasAmPm()) {
					foundFormat = foundFormat+" "+"a";
				}
				localdate.setIdentifiedDateFormat(foundFormat);
				dateGroups.add(localdate);
			}
		}
		return dateGroups;
	}

	/**
	 *
	 * @param element
	 * @return
	 */
	private LocalDateModel getDateFromPhrase(DateElement element) {
		boolean notFound = true;
		String s = null;
		String presentDateFormat="";
		if (element.getTimeFragment() == null) {
			s = element.getData();
		} else {
			s = element.getDateFragment();
		}
		if (element.isIsAlphaNumeric()) {
			StringTokenizer tokenizer = new StringTokenizer(s, delim);
			String t1 = tokenizer.nextToken();
			String t2 = tokenizer.nextToken();
			String t3 = tokenizer.nextToken();

			int day;
			int month;
			int year;

			// scenario detemisnistic where t1>31 & t1< 9999
			// YYYY MM DD
			// YYYY DD MM
			// YY DD MM
			// YY MM DD
			// in case of YY (MM/DD) if YY<32, date can not be detrmined
			if (Helper.isDigit(t1)) {
				year = Integer.parseInt(t1);
				if (year > 31) {
					/*determine the format of year to find out present date format*/
					if(year < 99) {
						presentDateFormat ="YY$";
					}
					else if(year > 999 && year < 10000) {
						presentDateFormat ="YYYY$";
					}
					if (Helper.isDigit(t2)) {
						presentDateFormat = presentDateFormat +"DD&MMM";
						day = Integer.parseInt(t2);
						month = monthToDigit(t3);
					} else {
						presentDateFormat = presentDateFormat +"MMM&DD";
						month = monthToDigit(t2);
						day = Integer.parseInt(t3);
					}
					LocalDateModel localDate = getYyyyMmDdProbable(year, month, day);
					if (localDate == null) {
						notFound = true;
					} else {
						localDate.setOriginalText(element.getData());
					}
					localDate.setIdentifiedDateFormat(presentDateFormat);
					return localDate;
				}
			}

			// scenario detemisnistic where t1>31 & t1< 9999
			// DD MM YYYY
			// DD MM YY
			// MM DD YYYY
			// MM DD YY
			// in case of (MM/DD) YY if YY<32, date can not be detrmined
			if (Helper.isDigit(t3)) {
				year = Integer.parseInt(t3);
				if (year > 31) {
					/*determine the format of year to find out present date format*/
					if(year < 99) {
						presentDateFormat ="YY";
					}
					else if(year > 999 && year < 10000) {
						presentDateFormat ="YYYY";
					}
					if (Helper.isDigit(t1)) {
						presentDateFormat = "DD$MMM&" + presentDateFormat;
						day = Integer.parseInt(t1);
						month = monthToDigit(t2);
					} else {
						presentDateFormat = "MMM$DD&" + presentDateFormat;
						month = monthToDigit(t1);
						day = Integer.parseInt(t2);
					}
					LocalDateModel localDate = getYyyyMmDdProbable(year, month, day);
					if (localDate == null) {
						notFound = true;
					} else {
						localDate.setOriginalText(element.getData());
					}
					localDate.setIdentifiedDateFormat(presentDateFormat);
					return localDate;
				}
			}

		} else {
			StringTokenizer tokenizer = new StringTokenizer(s, delim);
			int d1 = Integer.parseInt(tokenizer.nextToken());
			int d2 = Integer.parseInt(tokenizer.nextToken());
			int d3 = Integer.parseInt(tokenizer.nextToken());
			// supported formats
			// YYYY MM DD
			// YY MM DD
			// DD MM YYYY
			// DD MM YY
			// MM DD YYYY
			// MM DD YY
			// if d1 = year then d2 = month & d3 = day given d1>999 or 4 digit,
			// detrmining YYYY MM DD
			if (d1 > 999) {
				LocalDateModel localDate = getYyyyMmDdProbable(d1, d2, d3);
				if (localDate != null) {
					localDate.setOriginalText(s);
					if (learnPattern && learnedPatternString != null) {
						learnedPatternString = localDate.getConDateFormat();
					}
					notFound = false;
					return localDate;
				}
			}
			// determined that 2 digit date is not a month or day as its between
			// 31 & 99 , deteremining YY MM DD
			if (notFound && d1 > 31 && d1 < 100) {
				LocalDateModel localDate = getYyMmDdProbable(d1, d2, d3);
				if (localDate != null) {
					localDate.setOriginalText(s);
					if (learnPattern && learnedPatternString != null) {
						learnedPatternString = localDate.getConDateFormat();
					}
					notFound = false;
					return localDate;
				}
			}
			// if d3= year in YYYY format, then date and month not determinstic
			// if d1 & d2 <= 12
			// determine in case one position is dterministic
			//TODO
			if (d3 > 999 && ((d1 > 0 && d1 < 32) || (d2 > 0 && d2 < 32)) && (d1 > 0 && d2 > 0)) {
				LocalDateModel localDate = getDetemintaionForYyyyPrefix(d1, d2, d3);
				if (localDate != null) {
					localDate.setOriginalText(s);
					if (learnPattern && learnedPatternString != null) {
						learnedPatternString = localDate.getConDateFormat();
					}
					notFound = false;
					return localDate;
				}
			}
			// if d3=year in YY format i.e. d3>31 & d3< 100, possible date with
			// month and day not determinsitic
			//TODO
			if ((d3 > 31 && d3 < 100) && ((d1 > 0 && d1 < 32) || (d2 > 0 && d2 < 32))) {
				LocalDateModel localDate = getDetemintaionForYyyyPrefix(d1, d2, d3);
				if (localDate != null) {
					localDate.setOriginalText(s);
					if (learnPattern && learnedPatternString != null) {
						learnedPatternString = localDate.getConDateFormat();
					}
					notFound = false;
					return localDate;
				}
			}
		}
		return null;
	}

	private LocalDateModel putTimeInDate(LocalDateModel localdate, DateElement element) {
		// supported time format is HH(24):MI:SS.SSS (AM/PM)
		String format = "HH:mm:ss";
		String s = element.getTimeFragment();
		int hour;
		int min;
		int sec;
		int mils = 0;
		String probableTimeFormat=format;

		StringTokenizer tokenizer = null;
		// time has miliseconds in it
		if (s.contains(".") || s.contains(",")) {
			tokenizer = new StringTokenizer(s, ":., ");
			hour = Integer.parseInt(tokenizer.nextToken());
			min = Integer.parseInt(tokenizer.nextToken());
			sec = Integer.parseInt(tokenizer.nextToken());
			mils = Integer.parseInt(tokenizer.nextToken());
			//format = format + ".SSS";
			if(s.contains(".")) {
				probableTimeFormat = format + ".SSS";	
			}
			if(s.contains(",")) {
				probableTimeFormat = format + ",SSS";	
			}
		} else {
			tokenizer = new StringTokenizer(s, ": ");
			hour = Integer.parseInt(tokenizer.nextToken());
			min = Integer.parseInt(tokenizer.nextToken());
			sec = Integer.parseInt(tokenizer.nextToken());
		}

		if (element.isHasAmPm()) {
			if (s.contains("pm")) {
				hour = hour + 12;
				probableTimeFormat = probableTimeFormat+" aaa";
			}
		}
		if (hour < 24 && min < 60 && sec < 60 && mils < 10000) {
			String timePiece;
			timePiece = String.format("%02d", hour) + ":" + String.format("%02d", min) + ":" + String.format("%02d", sec);
			if (mils >= 0 && (s.contains(".") || s.contains(","))) {
				timePiece = timePiece + "." + String.format("%03d", mils);
			}
			format = localdate.getConDateFormat() + " " + format;
			localdate.setConDateFormat(format);
			timePiece = localdate.getDateTimeString() + " " + timePiece;
			localdate.setDateTimeString(timePiece);
			String sep = (element.getDateTimeSeprator() == 'T')?"'T'":String.valueOf(element.getDateTimeSeprator());
			localdate.setIdentifiedDateFormat(localdate.getIdentifiedDateFormat()+sep+probableTimeFormat);
		}
		return localdate;
	}

	private LocalDateModel getDetemintaionForYyPrefix(int d1, int d2, int pYear) {
		LocalDateModel localDate = getDetemintaionForYyyyPrefix(d1, d2, pYear);
		if (localDate != null) {
			/*
			 * String format = localDate.getConDateFormat().replace("YYYY",
			 * "YY"); localDate.setConDateFormat(format);
			 */
		}
		return localDate;
	}

	private LocalDateModel getDetemintaionForYyyyPrefix(int d1, int d2, int pYear) {
		// if d1 is between 13 and 31, it can be day, depending its valid day of
		// month d2
		if (d1 > 12 && (d2>0 && d2<=12)) {
			int pDate = d1;
			int pMonth = d2;
			LocalDateModel localDate = getYyyyMmDdProbable(pYear, pMonth, pDate);
			if (localDate != null) {
				// localDate.setConDateFormat("DD-MM-YYYY");
				if(pYear > 9 & pYear < 100) {
					localDate.setIdentifiedDateFormat("DD$MM&YY");
				}
				if(pYear > 99 & pYear < 10000) {
					localDate.setIdentifiedDateFormat("DD$MM&YYYY");
				}
				return localDate;
			}
		}
		if (d2 > 12 && (d1>0 && d1<=12)) {
			int pDate = d2;
			int pMonth = d1;
			LocalDateModel localDate = getYyyyMmDdProbable(pYear, pMonth, pDate);
			if (localDate != null) {
				// localDate.setConDateFormat("MM-DD-YYYY");
				if(pYear > 9 & pYear < 100) {
					localDate.setIdentifiedDateFormat("MM$DD&YY");
				}
				if(pYear > 99 & pYear < 10000) {
					localDate.setIdentifiedDateFormat("MM$DD&YYYY");
				}
				return localDate;
			}
		}
		if(d1 <= 12 && d2 <= 12) {
			// Assumption is MM DD, i.e. Month will always be d2 and date will be d3
			int pMonth=d1;
			int pDate=d2;
			LocalDateModel localDate = getYyyyMmDdProbable(pYear, pMonth, pDate);
			if (localDate != null) {
				// localDate.setConDateFormat("MM-DD-YYYY");
				if(pYear > 9 & pYear < 100) {
					localDate.setIdentifiedDateFormat("MM$DD&YY");
				}
				if(pYear > 99 & pYear < 10000) {
					localDate.setIdentifiedDateFormat("MM$DD&YYYY");
				}
				return localDate;
			}
		}
		return null;
	}

	private LocalDateModel getYyMmDdProbable(int pYear, int pMonth, int pDay) {
		LocalDateModel localDate = getYyyyMmDdProbable(pYear, pMonth, pDay);
		if (localDate != null) {
			// localDate.setConDateFormat("YY-MM-DD");
		}
		return localDate;
	}

	private LocalDateModel getYyyyMmDdProbable(int pYear, int pMonth, int pDay) {
		boolean isDateProbable = true;
		String formatProbable="";
		int year = -100;
		int month = -100;
		int day = -100;
		// Pobabability month.max=12,day.max=12
		year = pYear;
		// month should be between 1 & 12, else its not a date
		if (pMonth > 0 && pMonth < 13) {
			month = pMonth;
			formatProbable = "MM&DD";
		}else if(pMonth > 12 && pDay < 13) {
			month=pDay;
			pDay = pMonth;
			formatProbable = "DD&MM";
		}else {
			return null;
		}
		// day should be between 1 & 31 depending on months
		if (isDateProbable && month == 2) {
			if (year % 4 > 0 && pDay < 29) {
				// in feburary day.max=28 given year is non leap
				day = pDay;
			} else if (year % 4 == 0 && pDay < 30) {
				// in feburary day.max=28 given year is leap year
				day = pDay;
			} else {
				return null;
			}
		}
		// if month=1,3,5,7,8,10,12 day.max=31
		if (isDateProbable && is31DayMonth(month)) {
			if (pDay < 32) {
				day = pDay;
			} else {
				return null;
			}
		}
		// if month=4,6,9,11 day.max=30
		if (isDateProbable && is30DayMonth(month)) {
			if (pDay < 31) {
				day = pDay;
			} else {
				return null;
			}
		}
		if (isDateProbable) {
			LocalDateModel localdate = new LocalDateModel();
			localdate.setDateTimeString(String.format("%04d", year) + "-" + String.format("%02d", month) + "-" + String.format("%02d", day));
			localdate.setConDateFormat("yyyy-MM-dd");
			if(year > 9 & year < 100 ) {
				formatProbable = "YY$" + formatProbable;
			}
			if(year > 999 & year < 10000){
				formatProbable = "YYYY$" + formatProbable;
			}
			localdate.setIdentifiedDateFormat(formatProbable);
			return localdate;
		}
		return null;
	}

	/**
	 * Parses source text to find date patterns
	 * 
	 * @param text
	 *            source text
	 * @return
	 */
	private List<DateElement> getDateGroups(String text) {
		List<DateElement> dateGroups = null;
		char possibleDate[] = new char[30];
		char possibleTime[] = new char[17];
		int i = 0;
		boolean endFoundEarlier = false;
		boolean monthDetermined = false;
		boolean searchForTimePiece = false;
		int timeFrgLength = 0;
		char marker = '0';
		boolean isAlpaNumeric = false;
		char dateTimeSeprator=32;
		/*
		 * to account number of whitespaces for determining start and end
		 * position of date fragment, as multiple spaces are ignored
		 */
		int whitespaceCount = 0;
		PredictionModelNode tree = Dictionary.patternPredictionTree;
		PredictionModelNode month = Dictionary.monthPredictionTree;
		PredictionModelNode time = Dictionary.timePredictionTree;
		int textLength = text.length();
		for (int count = 0; count < textLength; count++) {

			char c = text.charAt(count);
			
			if (i == 0) {
				tree = Dictionary.patternPredictionTree;
			}
			
			// check for whitespace series
			if ((i > 1 && possibleDate[i - 1] == 32 && c == 32)) {
				whitespaceCount++;
				continue;
			}
			if (searchForTimePiece) {
				boolean timeDetermined = time.explictDateFragment;
				// for the cases where date is detemined just to establish am/pm
				// prefix
				if (timeFrgLength > 12 && possibleTime[timeFrgLength - 1] == 32) {
					timeDetermined = true;
				}
				if (Helper.isDigit(c)) {
					time = time.getChild('D');
				} else {
					c = Character.toLowerCase(c);
					time = time.getChild(c);
				}
				if (time == null) {
					if (timeDetermined) {
						dateGroups = addTimeFragment(dateGroups, possibleDate, possibleTime, count, i, timeFrgLength, dateTimeSeprator);
					}/*if added as bug fix on date 12/15/2017*/
					if(isValidTimeFragmentWithEndingDelim(possibleTime)) {
						possibleTime[timeFrgLength -1] = ' ';
						possibleDate[i -1] = ' ';
						dateGroups = addTimeFragment(dateGroups, possibleDate, possibleTime, count, i - 1, timeFrgLength, dateTimeSeprator);
					}
					searchForTimePiece = false;
					possibleDate = nullifyBuffer(possibleDate);
					possibleTime = nullifyBuffer(possibleTime);
					endFoundEarlier = false;
					time = Dictionary.timePredictionTree;
					i = 0;
					whitespaceCount = 0;
					timeFrgLength = 0;
					continue;
				} else {
					if (timeDetermined) {
						if (count == text.length() - 1 || c == 32) {
							dateGroups = addTimeFragment(dateGroups, possibleDate, possibleTime, count, i, timeFrgLength, dateTimeSeprator);
							searchForTimePiece = false;
							possibleDate = nullifyBuffer(possibleDate);
							possibleTime = nullifyBuffer(possibleTime);
							endFoundEarlier = false;
							time = Dictionary.timePredictionTree;
							i = 0;
							whitespaceCount = 0;
							timeFrgLength = 0;
							continue;
						}/* bug fixed dated 12/15/2017*/
					}else {
						if(count == text.length() - 1 && time.explictDateFragment == true) {
							if(Helper.isDigit(c)) {
								possibleTime[timeFrgLength++] = c;
								possibleDate[i++] = c;
							}
							dateGroups = addTimeFragment(dateGroups, possibleDate, possibleTime, count, i, timeFrgLength, dateTimeSeprator);
							searchForTimePiece = false;
							possibleDate = nullifyBuffer(possibleDate);
							possibleTime = nullifyBuffer(possibleTime);
							endFoundEarlier = false;
							time = Dictionary.timePredictionTree;
							i = 0;
							whitespaceCount = 0;
							timeFrgLength = 0;
							continue;
						}
					}
					possibleTime[timeFrgLength++] = c;
					possibleDate[i++] = c;

				}
				continue;
			}
			/* if current character is Number of separator */
			if (Helper.isDigit(c) || Helper.isDelimeter(c) || Helper.isTimeSeprator(c)) {
				/*
				 * if marker was previously set for finding month and current
				 * char is delimiter or digit, then see if month is determined.
				 * If yes keep looking for pattern to complete as Month is not
				 * supporting as ending pattern in date
				 */
				if (marker == 'M') {
					/*
					 * if month is determined previously, carry on further
					 * search in this iteration
					 */
					if (monthDetermined) {
						isAlpaNumeric = true;
						tree = tree.getChild(marker);
						/*
						 * if month is determined, date pattern established and
						 * nothing else left in tree, jump to next iteration
						 */
						if (tree == null && endFoundEarlier) {
							continue;
						}
					}
					/*
					 * Month cannot be ending pattern in supported date format.
					 * Reset the buffers & criteria for establishing date
					 */
					else {
						tree = Dictionary.patternPredictionTree;
						possibleDate = nullifyBuffer(possibleDate);
						i = 0;
						whitespaceCount = 0;
						endFoundEarlier = false;
					}
					/*
					 * Month is already determined or rejected, in both cases
					 * reset month prediction tree to start again
					 */
					month = Dictionary.monthPredictionTree;
				}

				marker = Helper.isDigit(c) ? 'D' : '*';
				/* last iteration yielded valid date fragment */
				if (tree == null) {
					if (endFoundEarlier) {
						dateGroups = addDateFragment(dateGroups, possibleDate, count, timeFrgLength + i + whitespaceCount, isAlpaNumeric);
						isAlpaNumeric = false;
						if (Helper.isDigit(c)) {
							time = time.getChild('D');
							if (time != null) {
								possibleTime[timeFrgLength++] = c;
								searchForTimePiece = true;
								possibleDate[i++] = c;
							} else {
								possibleDate = nullifyBuffer(possibleDate);
								i = 0;
								whitespaceCount = 0;
								endFoundEarlier = false;
							}
						} else {
							possibleDate = nullifyBuffer(possibleDate);
							i = 0;
							whitespaceCount = 0;
							endFoundEarlier = false;
						}
						endFoundEarlier = false;
						tree = Dictionary.patternPredictionTree;
						month = Dictionary.monthPredictionTree;
						continue;
					}
					/* last iteration did not yielded valid date fragment */
					else {
						possibleDate = nullifyBuffer(possibleDate);
						i = 0;
						whitespaceCount = 0;
						endFoundEarlier = false;
						tree = Dictionary.patternPredictionTree;
						month = Dictionary.monthPredictionTree;
						continue;
					}
				}
				// redesigned flow
				tree = tree.getChild(marker);

				if (tree == null) {
					if (endFoundEarlier) {
						dateGroups = addDateFragment(dateGroups, possibleDate, count, timeFrgLength + i + whitespaceCount, isAlpaNumeric);
						endFoundEarlier = false;
						if (Helper.isTimeSeprator(c)) {
							searchForTimePiece = true;
							possibleDate[i++] = c;
							dateTimeSeprator = c;
						} else {
							possibleDate = nullifyBuffer(possibleDate);
							i = 0;
							whitespaceCount = 0;
						}
						endFoundEarlier = false;
						tree = Dictionary.patternPredictionTree;
						month = Dictionary.monthPredictionTree;
					}
					continue;
				} else {
					// redesigned flow
					possibleDate[i++] = c;

					endFoundEarlier = tree.explictDateFragment;
					// end of text is reached and date is determined, so add the
					// date in date group as loop is terminated afterwards.
					if (count == text.length() - 1 && endFoundEarlier) {
						dateGroups = addDateFragment(dateGroups, possibleDate, count, timeFrgLength + i + whitespaceCount, isAlpaNumeric);
						break;
					}
				}
			}
			/*
			 * if current char is not a digit or delimiter, it should be checked
			 * for Alphabet, for determination of month in alphabetical format
			 */
			else {
				marker = 'M';
				/*
				 * in case date occour first be sure tree is not null and
				 * traverse tree with 'M' as root
				 */
				/*if (i == 0) {
					tree = Dictionary.patternPredictionTree;
				}*/
				c = Character.toLowerCase(text.charAt(count));
				month = month.getChild(c);
				if (month == null) {
					/*
					 * if end of date fragment is determined do not nullify date
					 * fragment
					 */
					if (endFoundEarlier) {
						dateGroups = addDateFragment(dateGroups, possibleDate, count, timeFrgLength + i + whitespaceCount, isAlpaNumeric);
						endFoundEarlier = false;
					}
					possibleDate = nullifyBuffer(possibleDate);
					i = 0;
					whitespaceCount = 0;
					month = Dictionary.monthPredictionTree;
					tree = Dictionary.patternPredictionTree;
					monthDetermined = false;
					endFoundEarlier = false;
					continue;
				} else {
					monthDetermined = month.explictDateFragment;
					// redesigned flow
					possibleDate[i++] = c;
				}
			}
		}
		return dateGroups;
	}
	
	/**
	 * add the date fragment to dategroup with other details
	 * 
	 * @param dateGroups
	 * @param possibleDate
	 * @param count
	 * @param i
	 * @param isAlpaNumeric
	 */
	private List<DateElement> addDateFragment(List<DateElement> dateGroups, char[] possibleDate, int count, int patternLength, boolean isAlpaNumeric) {
		if (dateGroups == null) {
			dateGroups = new ArrayList<DateElement>();
		}
		DateElement dateElement = createDateFragment(possibleDate, count, patternLength, isAlpaNumeric);
		if (dateElement != null) {
			dateGroups.add(dateElement);
		}
		return dateGroups;
	}

	   /**
	    * 
	    * @param possibleTime
	    * @return
	    */
		private boolean isValidTimeFragmentWithEndingDelim(char[] possibleTime) {
			String s = new String(possibleTime).trim();
			String original = new String(possibleTime).trim();
			s = s.replaceAll("[0-9]", "");
			if(s.length() > 2 && s.length()<=3) {
				if(s.startsWith("::") && (original.endsWith(",") || original.endsWith("."))) {
					return true;
				}
			}
			return false;
		}

	/**
	 * 
	 * @param dateGroups
	 * @param possibleDate
	 * @param possibleTime
	 * @param count
	 * @param i
	 * @param timeFrgLength
	 * @return
	 */
	private List<DateElement> addTimeFragment(List<DateElement> dateGroups, char[] possibleDate, char[] possibleTime, int count, int i, int timeFrgLength, char dateTimeSeprator) {
		if (dateGroups == null) {
			return null;
		}
		DateElement ele = dateGroups.get(dateGroups.size() - 1);
		ele.setData(new String(possibleDate).trim());
		ele.setEndPos(count);
		//ele.setStartPos(count - i);
		ele.setTimeFragment(new String(possibleTime).trim());
		if (possibleTime[timeFrgLength - 1] == 'm') {
			ele.setHasAmPm(true);
		}
		ele.setDateTimeSeprator(dateTimeSeprator);
		return dateGroups;
	}

	/**
	 *
	 * @param buffer
	 * @param position
	 * @param length
	 * @param alphaNumType
	 * @return
	 */
	private DateElement createDateFragment(char[] buffer, int position, int length, boolean isAlpaNumeric) {
		String dateText = new String(buffer).trim();
		if (dateText == null || "".equals(dateText)) {
			return null;
		}
		DateElement ele = new DateElement(new String(buffer).trim());
		/*
		 * Decrease position by 1 as position in array position starts from '0'
		 * and length is natural number
		 */
		length--;
		ele.setEndPos(position);
		ele.setStartPos(position - length);
		ele.setIsAlphaNumeric(isAlpaNumeric);
		ele.setDateFragment(ele.getData());
		return ele;
	}

	/**
	 *
	 * @param buffer
	 * @return
	 */
	private char[] nullifyBuffer(char[] buffer) {
		for (int i = 0; i < buffer.length; i++) {
			buffer[i] = 0;
		}
		return buffer;
	}

	/**
	 *
	 * @param i
	 * @return
	 */
	private boolean is31DayMonth(int i) {
		if (i == 1) {
			return true;
		}
		if (i == 3) {
			return true;
		}
		if (i == 5) {
			return true;
		}
		if (i == 7) {
			return true;
		}
		if (i == 8) {
			return true;
		}
		if (i == 10) {
			return true;
		}
		if (i == 12) {
			return true;
		}
		return false;

	}

	/**
	 *
	 * @param i
	 * @return
	 */
	private boolean is30DayMonth(int i) {
		if (i == 4) {
			return true;
		}
		if (i == 6) {
			return true;
		}
		if (i == 9) {
			return true;
		}
		if (i == 11) {
			return true;
		}
		return false;
	}

	/**
	 *
	 * @param text
	 * @return
	 */
	private int monthToDigit(String text) {
		text = text.toLowerCase();
		if (text.equals("jan") || text.equals("january")) {
			return 1;
		}
		if (text.equals("feb") || text.equals("february")) {
			return 2;
		}
		if (text.equals("mar") || text.equals("march")) {
			return 3;
		}
		if (text.equals("apr") || text.equals("april")) {
			return 4;
		}
		if (text.equals("may")) {
			return 5;
		}
		if (text.equals("jun") || text.equals("june")) {
			return 6;
		}
		if (text.equals("jul") || text.equals("july")) {
			return 7;
		}
		if (text.equals("aug") || text.equals("august")) {
			return 8;
		}
		if (text.equals("sep") || text.equals("september")) {
			return 9;
		}
		if (text.equals("oct") || text.equals("october")) {
			return 10;
		}
		if (text.equals("nov") || text.equals("november")) {
			return 11;
		}
		if (text.equals("dec") || text.equals("december")) {
			return 12;
		}
		return -1;

	}

}
back to top