View Javadoc

1   /*
2    * Copyright 2007 The Kuali Foundation Licensed under the Educational Community
3    * License, Version 1.0 (the "License"); you may not use this file except in
4    * compliance with the License. You may obtain a copy of the License at
5    * http://www.opensource.org/licenses/ecl1.php Unless required by applicable law
6    * or agreed to in writing, software distributed under the License is
7    * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
8    * KIND, either express or implied. See the License for the specific language
9    * governing permissions and limitations under the License.
10   */
11  package org.kuali.rice.krad.web.bind;
12  
13  import org.kuali.rice.core.api.CoreConstants;
14  import org.kuali.rice.core.api.datetime.DateTimeService;
15  import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader;
16  import org.kuali.rice.core.util.RiceKeyConstants;
17  import org.kuali.rice.core.web.format.FormatException;
18  
19  import java.beans.PropertyEditorSupport;
20  import java.sql.Date;
21  import java.text.ParseException;
22  import java.util.Calendar;
23  
24  /**
25   * This PropertyEditor converts between date display strings and
26   * <code>java.sql.Date</code> objects.
27   * 
28   * @author Kuali Rice Team (rice.collab@kuali.org)
29   */
30  public class UifDateEditor extends PropertyEditorSupport {
31  
32      /** The date time service. */
33      private transient DateTimeService dateTimeService;
34  
35      /**
36       * This overridden method uses the
37       * <code>org.kuali.rice.core.api.datetime.DateTimeService</code> to convert
38       * the date object to the display string.
39       * 
40       * @see java.beans.PropertyEditorSupport#getAsText()
41       */
42      @Override
43      public String getAsText() {
44          if (this.getValue() == null) {
45              return null;
46          }
47          if ("".equals(this.getValue())) {
48              return null;
49          }
50          return getDateTimeService().toDateString((java.util.Date) this.getValue());
51      }
52  
53      /**
54       * Gets the date time service.
55       * 
56       * @return the date time service
57       */
58      protected DateTimeService getDateTimeService() {
59          if (this.dateTimeService == null) {
60              this.dateTimeService = GlobalResourceLoader.getService(CoreConstants.Services.DATETIME_SERVICE);
61          }
62          return this.dateTimeService;
63      }
64  
65      /**
66       * This overridden method converts the display string to a
67       * <code>java.sql.Date</code> object using the
68       * <code>org.kuali.rice.core.api.datetime.DateTimeService</code>.
69       * 
70       * @see java.beans.PropertyEditorSupport#setAsText(java.lang.String)
71       */
72      @Override
73      public void setAsText(String text) throws IllegalArgumentException {
74          this.setValue(convertToObject(text));
75      }
76  
77      /**
78       * Convert display text to <code>java.sql.Date</code> object using the
79       * <code>org.kuali.rice.core.api.datetime.DateTimeService</code>.
80       * 
81       * @param text
82       *            the display text
83       * @return the <code>java.sql.Date</code> object
84       * @throws IllegalArgumentException
85       *             the illegal argument exception
86       */
87      protected Object convertToObject(String text) throws IllegalArgumentException {
88          try {
89              Date result = getDateTimeService().convertToSqlDate(text);
90              Calendar calendar = Calendar.getInstance();
91              calendar.setTime(result);
92              if (calendar.get(Calendar.YEAR) < 1000 && verbatimYear(text).length() < 4) {
93                  throw new FormatException("illegal year format", RiceKeyConstants.ERROR_DATE, text);
94              }
95              return result;
96          } catch (ParseException e) {
97              throw new FormatException("parsing", RiceKeyConstants.ERROR_DATE, text, e);
98          }
99      }
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 }