Package com.aelitis.azureus.core.metasearch.impl

Source Code of com.aelitis.azureus.core.metasearch.impl.DateParserClassic

/*
* Created on May 6, 2008
* Created by Paul Gardner
*
* Copyright 2008 Vuze, Inc.  All rights reserved.
*
* This program 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; version 2 of the License only.
*
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/

package com.aelitis.azureus.core.metasearch.impl;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.StringTokenizer;
import java.util.TimeZone;

public class DateParserClassic extends DateParser {
 
  static boolean DEBUG = false;
 
  TimeZone timeZone;
  DateFormat ddMMMyyyyFormat;
  DateFormat ddMMMyyFormat;
  DateFormat MMddyyyyFormat;
 
  DateFormat userDateFormat;
 
  boolean auto;
 
  public DateParserClassic() {
    this("GMT",true,null);
  }
 
  public DateParserClassic(String timeZone,boolean auto, String dateFormat) {
   
    this.timeZone = TimeZone.getTimeZone(timeZone);
    this.auto = auto;
   
    if(!auto) {
      if(dateFormat != null) {
        userDateFormat = new SimpleDateFormat(dateFormat);
        userDateFormat.setTimeZone(this.timeZone);
      } else {
        //TODO : in debug mode throw an Exception telling the user he needs to provide a dateFormat in manual mode
      }
    }
   
    ddMMMyyyyFormat = new SimpleDateFormat("dd MMM yyyy");
    ddMMMyyyyFormat.setTimeZone(this.timeZone);
   
    ddMMMyyFormat = new SimpleDateFormat("dd MMM yy");
    ddMMMyyFormat.setTimeZone(this.timeZone);
   
    MMddyyyyFormat = new SimpleDateFormat("MM-dd yyyy");
    MMddyyyyFormat.setTimeZone(this.timeZone);
   
  }
 
  public Date parseDate(String date) {
    Date result =  null;
    if(auto) {
       result = parseDateInternal(date);
    } else {
      if(userDateFormat != null) {
        try {
          result = userDateFormat.parse(date);
        } catch(Exception e) {
          //TODO : in debug mode, throw an exception to tell the user that his dateFormat is invalid / didn't parse a date
        }
      }
    }
    if(DEBUG) {
      System.out.println(date + " > " + result.toString());
    }
   
    return result;
  }
 
  private Date parseDateInternal(String s) {
    if(s == null) {
      return null;
    }
    s = s.toLowerCase().trim();
   
   
    //"Today hh:mm" and "Y-day hh:mm" cases
    if(s.startsWith("today ") || s.startsWith("y-day ")) {
      try {
        Calendar calendar = new GregorianCalendar();
        calendar.setTimeZone(timeZone);
        String time = s.substring(6);
        StringTokenizer st = new StringTokenizer(time,":");
        int hours = Integer.parseInt(st.nextToken());
        int minutes = Integer.parseInt(st.nextToken());
        calendar.set(Calendar.HOUR_OF_DAY, hours);
        calendar.set(Calendar.MINUTE,minutes);
        if(s.startsWith("y-day ")) {
          calendar.add(Calendar.DATE, -1);
        }
        return calendar.getTime();
      } catch(Exception e) {
        e.printStackTrace();
        return null;
      }
    }
   
    //"07-25 2006", "02-01 02:53" and "03 Mar 2006" cases
    if(s.length() > 3) {
      String thirdCharacter = s.substring(2,3);
     
      //"07-25 2006" and "02-01 02:53" cases
      if(thirdCharacter.equals("-")) {
        if(s.length() > 9) {
          String ninthCharacter = s.substring(8,9);
          //"02-01 02:53" case
          if(ninthCharacter.equals(":")) {
            try {
              int month = Integer.parseInt(s.substring(0,2));
              int day = Integer.parseInt(s.substring(3,5));
              int hours = Integer.parseInt(s.substring(6,8));
              int minutes = Integer.parseInt(s.substring(9,11));
              Calendar calendar = new GregorianCalendar();
              calendar.setTimeZone(timeZone);
              calendar.set(Calendar.MONTH, month-1);
              calendar.set(Calendar.DAY_OF_MONTH,day);
              calendar.set(Calendar.HOUR_OF_DAY, hours);
              calendar.set(Calendar.MINUTE,minutes);
              return calendar.getTime();
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
          //"07-25 2006"
          else {
            try {
              return MMddyyyyFormat.parse(s);
            } catch (Exception e) {
              e.printStackTrace();
           
          }
        } else {
          //"03-25" case
          try {
            int month = Integer.parseInt(s.substring(0,2));
            int day = Integer.parseInt(s.substring(3,5));
            Calendar calendar = new GregorianCalendar();
            calendar.setTimeZone(timeZone);
            calendar.set(Calendar.MONTH, month);
            calendar.set(Calendar.DAY_OF_MONTH,day);
            return calendar.getTime();
          } catch (Exception e) {
            e.printStackTrace();
          }
        }
       
      } else if(s.length() == 9 && s.indexOf(" ") != -1){
        //"21 Mar 08" case
        try {
          return ddMMMyyFormat.parse(s);
        } catch (Exception e) {
          if(DEBUG) {e.printStackTrace();}
        } 
      }
     
      //"03 Mar 2006" case
      if(thirdCharacter.equals(" ")) {
        try {
          return ddMMMyyyyFormat.parse(s);
        } catch (Exception e) {
          if(DEBUG) {e.printStackTrace();}
        }
      }
    }
   
    //Age based stuff
    if(    s.endsWith(" ago") ||
        s.indexOf("month")!= -1 ||
        s.indexOf("hour") != -1 ||
        s.indexOf("day") != -1 ||
        s.indexOf("week") != -1 ||
        s.indexOf("year") != -1) {
     
      s= s.replaceAll(" ago", "");
      StringTokenizer st = new StringTokenizer(s," ");
      if(st.countTokens() >= 2) {
        try {
          Calendar calendar = new GregorianCalendar();
          while(st.hasMoreTokens()) {
            float value = Float.parseFloat(st.nextToken());
            String unit = st.nextToken();
           
            calendar.setTimeZone(timeZone);
            if(unit.startsWith("min")) {
              calendar.add(Calendar.MINUTE, -(int)value);
            }
            if(unit.startsWith("hour")) {
              calendar.add(Calendar.HOUR_OF_DAY, -(int)value);
            }
            if(unit.startsWith("day")) {
              calendar.add(Calendar.DATE, -(int)value);
            }
            if(unit.startsWith("week")) {
              calendar.add(Calendar.WEEK_OF_YEAR, -(int)value);
            }
            if(unit.startsWith("month")) {
              calendar.add(Calendar.MONTH, -(int)value);
            }
            if(unit.startsWith("year")) {
              calendar.add(Calendar.YEAR, -(int)value);
            }
          }
          return calendar.getTime();
        } catch (Exception e) {
          if(DEBUG) {e.printStackTrace();}
        }
      }
    }
   
    if(s.equals("today")) {
      Calendar calendar = new GregorianCalendar();
      calendar.setTimeZone(timeZone);
      //calendar.set(Calendar.HOUR_OF_DAY,12);
      //calendar.set(Calendar.MINUTE,0);
      return calendar.getTime();
    }
   
    if(s.equals("yesterday")) {
      Calendar calendar = new GregorianCalendar();
      calendar.setTimeZone(timeZone);
      calendar.add(Calendar.DATE, -1);
      //calendar.set(Calendar.HOUR_OF_DAY,12);
      //calendar.set(Calendar.MINUTE,0);
      return calendar.getTime();
    }
   
    try {
      StringTokenizer st = new StringTokenizer(s," ");
      Calendar calendar = new GregorianCalendar();
      calendar.setTimeZone(timeZone);
      while(st.hasMoreTokens()) {
          String element = st.nextToken();
          int field = -1;
          int end_offset = -1;
          if(element.endsWith("h")) {
            field = Calendar.HOUR_OF_DAY;
            end_offset = 1;
          }
          if(element.endsWith("d")) {
            field = Calendar.DAY_OF_MONTH;
            end_offset = 1;
          }
          if(element.endsWith("w")) {
            field = Calendar.WEEK_OF_YEAR;
            end_offset = 1;
          }
          if(element.endsWith("m")) {
            field = Calendar.MONTH;
            end_offset = 1;
          }
          if(element.endsWith("mon")) {
            field = Calendar.MONTH;
            end_offset = 3;
          }
          if(element.endsWith("y")) {
            field = Calendar.YEAR;
            end_offset = 1;
          }
          if(field != -1 && end_offset != -1) {
            int value = (int) (Float.parseFloat(element.substring(0,element.length() - end_offset)));
            calendar.add(field,-value);
          }
      }
     
      return calendar.getTime();
     
    } catch (Exception e) {
      if(DEBUG) {e.printStackTrace();}
    }
   
    return null;
  }
 
 
  public static void main(String args[]) {
    DEBUG = true;
    DateParserClassic dateParser = new DateParserClassic();
   
    dateParser.parseDate("Today 05:34");
    dateParser.parseDate("Y-Day 21:55");
    dateParser.parseDate("07-25 2006");
    dateParser.parseDate("02-01 02:53");
    dateParser.parseDate("03 Mar 2006");
    dateParser.parseDate("0 minute ago");
    dateParser.parseDate("3 hours ago");
    dateParser.parseDate("2 days ago");
    dateParser.parseDate("10 months ago");
    dateParser.parseDate("45 mins ago");
    dateParser.parseDate("Today");
    dateParser.parseDate("Yesterday");
    dateParser.parseDate("16.9w");
    dateParser.parseDate("22.6h");
    dateParser.parseDate("1.7d");
    dateParser.parseDate("2d 7h");
    dateParser.parseDate("1w");
    dateParser.parseDate("1w 4d");
    dateParser.parseDate("1mon 1w");
   
  }
 

}
TOP

Related Classes of com.aelitis.azureus.core.metasearch.impl.DateParserClassic

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.