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