1 /**
2 * Copyright 2005-2014 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.io.Serializable;
26 import java.sql.Date;
27 import java.text.ParseException;
28 import java.util.Calendar;
29
30 /**
31 * PropertyEditor converts between date display strings and <code>java.sql.Date</code> objects
32 *
33 * @author Kuali Rice Team (rice.collab@kuali.org)
34 */
35 public class UifDateEditor extends PropertyEditorSupport implements Serializable {
36 private static final long serialVersionUID = 8122469337264797008L;
37
38 /** The date time service. */
39 private transient DateTimeService dateTimeService;
40
41 /**
42 * This overridden method uses the
43 * <code>org.kuali.rice.core.api.datetime.DateTimeService</code> to convert
44 * the date object to the display string.
45 *
46 * @see java.beans.PropertyEditorSupport#getAsText()
47 */
48 @Override
49 public String getAsText() {
50 if (this.getValue() == null) {
51 return null;
52 }
53 if ("".equals(this.getValue())) {
54 return null;
55 }
56 return getDateTimeService().toDateString((java.util.Date) this.getValue());
57 }
58
59 /**
60 * Gets the date time service.
61 *
62 * @return the date time service
63 */
64 protected DateTimeService getDateTimeService() {
65 if (this.dateTimeService == null) {
66 this.dateTimeService = GlobalResourceLoader.getService(CoreConstants.Services.DATETIME_SERVICE);
67 }
68 return this.dateTimeService;
69 }
70
71 /**
72 * This overridden method converts the display string to a
73 * <code>java.sql.Date</code> object using the
74 * <code>org.kuali.rice.core.api.datetime.DateTimeService</code>.
75 *
76 * @see java.beans.PropertyEditorSupport#setAsText(java.lang.String)
77 */
78 @Override
79 public void setAsText(String text) throws IllegalArgumentException {
80 this.setValue(convertToObject(text));
81 }
82
83 /**
84 * Convert display text to <code>java.sql.Date</code> object using the
85 * <code>org.kuali.rice.core.api.datetime.DateTimeService</code>.
86 *
87 * @param text
88 * the display text
89 * @return the <code>java.sql.Date</code> object
90 * @throws IllegalArgumentException
91 * the illegal argument exception
92 */
93 protected Object convertToObject(String text) throws IllegalArgumentException {
94 try {
95 // Allow user to clear dates
96 if (text == null || text.equals("")) {
97 return null;
98 }
99
100 Date result = getDateTimeService().convertToSqlDate(text);
101 Calendar calendar = Calendar.getInstance();
102 calendar.setTime(result);
103 if (calendar.get(Calendar.YEAR) < 1000 && verbatimYear(text).length() < 4) {
104 throw new FormatException("illegal year format", RiceKeyConstants.ERROR_DATE, text);
105 }
106 return result;
107 } catch (ParseException e) {
108 throw new FormatException("parsing", RiceKeyConstants.ERROR_DATE, text, e);
109 }
110 }
111
112 /**
113 * For a given user input date, this method returns the exact string the
114 * user entered after the last slash. This allows the formatter to
115 * distinguish between ambiguous values such as "/06" "/6" and "/0006"
116 *
117 * @param date
118 * @return
119 */
120 private String verbatimYear(String date) {
121 String result = "";
122
123 int pos = date.lastIndexOf("/");
124 if (pos >= 0) {
125 result = date.substring(pos);
126 }
127
128 return result;
129 }
130
131 }