content: /**
   * Persian Calendar see: http://code.google.com/p/persian-calendar/
     Copyright (C) 2012  Mortezaadi@gmail.com
     PersianDateParser.java
     
     Persian Calendar is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 3 of the License, or
     (at your option) any later version.
  
     This program is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.
  
     You should have received a copy of the GNU General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
   */
  package ir.smartlab.persiandatepicker.util;
  
  /**
   * Parses text from the beginning of the given string to produce a
   * PersianCalendar.
   * 
   * <p>
   * See the {@link #getPersianDate()} method for more information on date
   * parsing.
   * 
   * <pre>
   *                Example
   *                     
   *  {@code
   *    PersianCalendar pCal =
   *     new PersianDateParser("1361/3/1").getPersianDate();             
   *  }
   * </pre>
   * 
   * @author Morteza contact: <a
   *         href="mailto:Mortezaadi@gmail.com">Mortezaadi@gmail.com</a>
   * @version 1.0
   */
  public class PersianDateParser {
  
  	private String dateString;
  	private String delimiter = "/";
  
  	/**
  	 * <pre>
  	 * construct parser with date string assigned
  	 * the default delimiter is '/'.
  	 * 
  	 * To assign deferment delimiter use:
  	 * {@link #PersianDateParser(String dateString, String delimiter)}
  	 * 
  	 *                     Example
  	 *                     
  	 *  {@code
  	 *    PersianCalendar pCal =
  	 *     new PersianDateParser("1361/3/1").getPersianDate();             
  	 *  }
  	 * </pre>
  	 * 
  	 * @param dateString
  	 */
  	public PersianDateParser(String dateString) {
  		this.dateString = dateString;
  	}
  
  	/**
  	 * <pre>
  	 * construct parser with date string assigned
  	 * the default delimiter is '/'. with this constructor
  	 * you can set different delimiter to parse the date
  	 * based on this delimiter.
  	 * see also:
  	 * {@link #PersianDateParser(String dateString)}
  	 * 
  	 *                     Example
  	 *                     
  	 *  {@code
  	 *    PersianCalendar pCal =
  	 *     new PersianDateParser("1361-3-1","-").getPersianDate();             
  	 *  }
  	 * </pre>
  	 * 
  	 * @param dateString
  	 * @param delimiter
  	 */
  	public PersianDateParser(String dateString, String delimiter) {
  		this(dateString);
  		this.delimiter = delimiter;
  	}
  
  	/**
  	 * Produce the PersianCalendar object from given DateString throws Exception
  	 * if couldn't parse the text.
  	 * 
  	 * @return PersianCalendar object
  	 * @exception RuntimeException
  	 */
  	public PersianCalendar getPersianDate() {
  
  		checkDateStringInitialValidation();
  
  		String tokens[] = splitDateString(normalizeDateString(dateString));
  		int year = Integer.parseInt(tokens[0]);
  		int month = Integer.parseInt(tokens[1]);
  		int day = Integer.parseInt(tokens[2]);
  
  		checkPersianDateValidation(year, month, day);
  
  		PersianCalendar pCal = new PersianCalendar();
  		pCal.setPersianDate(year, month, day);
  
  		return pCal;
  	}
  
  	/**
  	 * validate the given date
  	 * 
  	 * @param year
  	 * @param month
  	 * @param day
  	 */
  	private void checkPersianDateValidation(int year, int month, int day) {
  		if (year < 1)
  			throw new RuntimeException("year is not valid");
  		if (month < 1 || month > 12)
  			throw new RuntimeException("month is not valid");
  		if (day < 1 || day > 31)
  			throw new RuntimeException("day is not valid");
  		if (month > 6 && day == 31)
  			throw new RuntimeException("day is not valid");
  		if (month == 12 && day == 30 && !PersianCalendarUtils.isPersianLeapYear(year))
  			throw new RuntimeException("day is not valid " + year + " is not a leap year");
  	}
  
  	/**
  	 * planned for further calculation before parsing the text
  	 * 
  	 * @param dateString
  	 * @return
  	 */
  	private String normalizeDateString(String dateString) {
  		// dateString = dateString.replace("-", delimiter);
  		return dateString;
  	}
  
  	private String[] splitDateString(String dateString) {
  		String tokens[] = dateString.split(delimiter);
  		if (tokens.length != 3)
  			throw new RuntimeException("wrong date:" + dateString + " is not a Persian Date or can not be parsed");
  		return tokens;
  	}
  
  	private void checkDateStringInitialValidation() {
  		if (dateString == null)
  			throw new RuntimeException("input didn't assing please use setDateString()");
  		// if(dateString.length()>10)
  		// throw new RuntimeException("wrong date:" + dateString +
  		// " is not a Persian Date or can not be parsed" );
  	}
  
  	public String getDateString() {
  		return dateString;
  	}
  
  	public void setDateString(String dateString) {
  		this.dateString = dateString;
  	}
  
  	public String getDelimiter() {
  		return delimiter;
  	}
  
  	public void setDelimiter(String delimiter) {
  		this.delimiter = delimiter;
  	}
  
  }
  