package railo.runtime.op.date; import java.util.HashMap; import java.util.Map; import railo.runtime.op.Constants; /** * helper class to convert a string to a Object */ public final class DateString { private static int[][] ints= { {0,1,2,3,4,5,6,7,8,9}, {0,10,20,30,40,50,60,70,80,90}, {0,100,200,300,400,500,600,700,800,900}, {0,1000,2000,3000,4000,5000,6000,7000,8000,9000} }; private String str; private int pos; private static Map months=new HashMap(); static{ months.put("january",Constants.INTEGER_1); months.put("januar",Constants.INTEGER_1); months.put("janua",Constants.INTEGER_1); months.put("janu",Constants.INTEGER_1); months.put("jan",Constants.INTEGER_1); months.put("february",Constants.INTEGER_2); months.put("februar",Constants.INTEGER_2); months.put("februa",Constants.INTEGER_2); months.put("febru",Constants.INTEGER_2); months.put("febr",Constants.INTEGER_2); months.put("feb",Constants.INTEGER_2); months.put("march",Constants.INTEGER_3); months.put("marc",Constants.INTEGER_3); months.put("mar",Constants.INTEGER_3); months.put("april",Constants.INTEGER_4); months.put("apri",Constants.INTEGER_4); months.put("apr",Constants.INTEGER_4); months.put("may",Constants.INTEGER_5); months.put("june",Constants.INTEGER_6); months.put("jun",Constants.INTEGER_6); months.put("july",Constants.INTEGER_7); months.put("jul",Constants.INTEGER_7); months.put("august",Constants.INTEGER_8); months.put("augus",Constants.INTEGER_8); months.put("augu",Constants.INTEGER_8); months.put("aug",Constants.INTEGER_8); months.put("september",Constants.INTEGER_9); months.put("septembe",Constants.INTEGER_9); months.put("septemb",Constants.INTEGER_9); months.put("septem",Constants.INTEGER_9); months.put("septe",Constants.INTEGER_9); months.put("sept",Constants.INTEGER_9); months.put("sep",Constants.INTEGER_9); months.put("october",Constants.INTEGER_10); months.put("octobe",Constants.INTEGER_10); months.put("octob",Constants.INTEGER_10); months.put("octo",Constants.INTEGER_10); months.put("oct",Constants.INTEGER_10); months.put("november",Constants.INTEGER_11); months.put("novembe",Constants.INTEGER_11); months.put("novemb",Constants.INTEGER_11); months.put("novem",Constants.INTEGER_11); months.put("nove",Constants.INTEGER_11); months.put("nov",Constants.INTEGER_11); months.put("december",Constants.INTEGER_12); months.put("decembe",Constants.INTEGER_12); months.put("decemb",Constants.INTEGER_12); months.put("decem",Constants.INTEGER_12); months.put("dece",Constants.INTEGER_12); months.put("dec",Constants.INTEGER_12); } /** * constructor of the class * @param str Date String */ public DateString(String str) { this.str=str; } /** * check if char a actuell position of the inner cursor is same value like given value * @param c char to compare * @return is same or not */ public boolean isNext(char c) { return str.length()>pos+1 && str.charAt(pos+1)==c; } /** * check if char a actuell position of the inner cursor is same value like given value * @param c char to compare * @return is same or not */ public boolean isCurrent(char c) { return str.length()>pos && str.charAt(pos)==c; } /** * check if last char has same value than given char * @param c char to check * @return is same or not */ public boolean isLast(char c) { return str.charAt(str.length()-1)==c; } /** * set inner cursor one forward */ public void next() { pos++; } /** * set inner cursor [count] forward * @param count forward count */ public void next(int count) { pos+=count; } /** * @return the length of the inner String */ public int length() { return str.length(); } /** * forward inner cursor if value at actuell position is same as given. * @param c char to compare * @return has forwared or not */ public boolean fwIfCurrent(char c) { if(isCurrent(c)) { pos++; return true; } return false; } /** * forward inner cursor if value at the next position is same as given. * @param c char to compare * @return has forwared or not */ public boolean fwIfNext(char c) { if(isNext(c)) { pos++; return true; } return false; } /* * read in the next four digits from current position * @return value from the 4 digits * public int read4Digit() { // first char c=str.charAt(pos++); if(!isDigit(c)) return -1; int value=ints[3][c-48]; // second c=str.charAt(pos++); if(!isDigit(c)) return -1; value+=ints[2][c-48]; // third c=str.charAt(pos++); if(!isDigit(c)) return -1; value+=ints[1][c-48]; // fourt c=str.charAt(pos++); if(!isDigit(c)) return -1; value+=ints[0][c-48]; return value; }*/ /* * read in the next four digits from current position * @return value from the 4 digits * public int read2Digit() { // first char c=str.charAt(pos++); if(!isDigit(c)) return -1; int value=ints[1][c-48]; // second c=str.charAt(pos++); if(!isDigit(c)) return -1; value+=ints[0][c-48]; return value; }*/ /** * read in the next digits from current position * @return value from the digits */ public int readDigits() { int value=0; char c; if(isValidIndex() && isDigit(c=str.charAt(pos))) { value=ints[0][c-48]; pos++; } else return -1; while(isValidIndex() && isDigit(c=str.charAt(pos))) { value*=10; value+=ints[0][c-48]; pos++; } return value; } public boolean removeWhitespace() { boolean rtn=false; while(isValidIndex() && Character.isWhitespace(str.charAt(pos))) { pos++; } return rtn; } public int readMonthString() { char c; int start=pos; StringBuilder sb=new StringBuilder(); while(isValidIndex() && isMonthChar(c=str.charAt(pos))) { pos++; sb.append(Character.toLowerCase(c)); } Integer month=(Integer) months.get(sb.toString().trim()); if(month!=null) return month.intValue(); pos=start; return -1; } private boolean isMonthChar(char c) { return c>='a' && c<='z' || c>='A' && c<='Z'; } /** * returns if c is a digit or not * @param c char to check * @return is digit */ public boolean isDigit(char c) { return c>='0' && c<='9'; } /** * returns if value at cursor position is a digit or not * @return is dgit */ public boolean isDigit() { return isValidIndex() && isDigit(str.charAt(pos)); } /** * returns if last char is a digit or not * @return is dgit */ public boolean isLastDigit() { return isDigit(str.charAt(str.length()-1)); } /** * return char at given position * @param pos postion to get value * @return character from given position */ public char charAt(int pos) { return str.charAt(pos); } /** * returns if cursor is on the last position * @return is on last */ public boolean isLast() { return pos+1==str.length(); } /** * returns if cursor is after the last position * @return is after the last */ public boolean isAfterLast() { return pos>=str.length(); } /** * returns if cursor is on a valid position * @return is after the last */ public boolean isValidIndex() { return pos<str.length(); } public char current() { return str.charAt(pos); } public int getPos() { return pos; } public void reset(){ pos=0; } }