001 /* 002 * Copyright 2007 The Kuali Foundation Licensed under the Educational Community 003 * License, Version 1.0 (the "License"); you may not use this file except in 004 * compliance with the License. You may obtain a copy of the License at 005 * http://www.opensource.org/licenses/ecl1.php Unless required by applicable law 006 * or agreed to in writing, software distributed under the License is 007 * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 008 * KIND, either express or implied. See the License for the specific language 009 * governing permissions and limitations under the License. 010 */ 011 package org.kuali.rice.krad.web.bind; 012 013 import org.kuali.rice.core.api.CoreConstants; 014 import org.kuali.rice.core.api.datetime.DateTimeService; 015 import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader; 016 import org.kuali.rice.core.util.RiceKeyConstants; 017 import org.kuali.rice.core.web.format.FormatException; 018 019 import java.beans.PropertyEditorSupport; 020 import java.sql.Date; 021 import java.text.ParseException; 022 import java.util.Calendar; 023 024 /** 025 * This PropertyEditor converts between date display strings and 026 * <code>java.sql.Date</code> objects. 027 * 028 * @author Kuali Rice Team (rice.collab@kuali.org) 029 */ 030 public class UifDateEditor extends PropertyEditorSupport { 031 032 /** The date time service. */ 033 private transient DateTimeService dateTimeService; 034 035 /** 036 * This overridden method uses the 037 * <code>org.kuali.rice.core.api.datetime.DateTimeService</code> to convert 038 * the date object to the display string. 039 * 040 * @see java.beans.PropertyEditorSupport#getAsText() 041 */ 042 @Override 043 public String getAsText() { 044 if (this.getValue() == null) { 045 return null; 046 } 047 if ("".equals(this.getValue())) { 048 return null; 049 } 050 return getDateTimeService().toDateString((java.util.Date) this.getValue()); 051 } 052 053 /** 054 * Gets the date time service. 055 * 056 * @return the date time service 057 */ 058 protected DateTimeService getDateTimeService() { 059 if (this.dateTimeService == null) { 060 this.dateTimeService = GlobalResourceLoader.getService(CoreConstants.Services.DATETIME_SERVICE); 061 } 062 return this.dateTimeService; 063 } 064 065 /** 066 * This overridden method converts the display string to a 067 * <code>java.sql.Date</code> object using the 068 * <code>org.kuali.rice.core.api.datetime.DateTimeService</code>. 069 * 070 * @see java.beans.PropertyEditorSupport#setAsText(java.lang.String) 071 */ 072 @Override 073 public void setAsText(String text) throws IllegalArgumentException { 074 this.setValue(convertToObject(text)); 075 } 076 077 /** 078 * Convert display text to <code>java.sql.Date</code> object using the 079 * <code>org.kuali.rice.core.api.datetime.DateTimeService</code>. 080 * 081 * @param text 082 * the display text 083 * @return the <code>java.sql.Date</code> object 084 * @throws IllegalArgumentException 085 * the illegal argument exception 086 */ 087 protected Object convertToObject(String text) throws IllegalArgumentException { 088 try { 089 Date result = getDateTimeService().convertToSqlDate(text); 090 Calendar calendar = Calendar.getInstance(); 091 calendar.setTime(result); 092 if (calendar.get(Calendar.YEAR) < 1000 && verbatimYear(text).length() < 4) { 093 throw new FormatException("illegal year format", RiceKeyConstants.ERROR_DATE, text); 094 } 095 return result; 096 } catch (ParseException e) { 097 throw new FormatException("parsing", RiceKeyConstants.ERROR_DATE, text, e); 098 } 099 } 100 101 /** 102 * For a given user input date, this method returns the exact string the 103 * user entered after the last slash. This allows the formatter to 104 * distinguish between ambiguous values such as "/06" "/6" and "/0006" 105 * 106 * @param date 107 * @return 108 */ 109 private String verbatimYear(String date) { 110 String result = ""; 111 112 int pos = date.lastIndexOf("/"); 113 if (pos >= 0) { 114 result = date.substring(pos); 115 } 116 117 return result; 118 } 119 120 }