LocalTimePropertyEditor.java
001 /*
002  * Copyright 2008-2017 the original author or authors.
003  *
004  * Licensed under the Apache License, Version 2.0 (the "License");
005  * you may not use this file except in compliance with the License.
006  * You may obtain a copy of the License at
007  *
008  *     http://www.apache.org/licenses/LICENSE-2.0
009  *
010  * Unless required by applicable law or agreed to in writing, software
011  * distributed under the License is distributed on an "AS IS" BASIS,
012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013  * See the License for the specific language governing permissions and
014  * limitations under the License.
015  */
016 package griffon.core.editors;
017 
018 import griffon.core.formatters.Formatter;
019 import griffon.core.formatters.LocalTimeFormatter;
020 import griffon.metadata.PropertyEditorFor;
021 
022 import java.time.LocalDateTime;
023 import java.time.LocalTime;
024 import java.time.format.DateTimeParseException;
025 import java.util.ArrayList;
026 import java.util.Calendar;
027 import java.util.Date;
028 import java.util.List;
029 
030 import static griffon.util.GriffonNameUtils.isBlank;
031 
032 /**
033  @author Andres Almiray
034  @since 2.4.0
035  */
036 @PropertyEditorFor(LocalTime.class)
037 public class LocalTimePropertyEditor extends AbstractPropertyEditor {
038     @Override
039     protected void setValueInternal(Object value) {
040         if (null == value) {
041             super.setValueInternal(null);
042         else if (value instanceof CharSequence) {
043             handleAsString(String.valueOf(value));
044         else if (value instanceof LocalTime) {
045             super.setValueInternal(value);
046         else if (value instanceof LocalDateTime) {
047             super.setValueInternal(((LocalDateTimevalue).toLocalTime());
048         else if (value instanceof Date) {
049             handleAsDate((Datevalue);
050         else if (value instanceof Calendar) {
051             handleAsCalendar((Calendarvalue);
052         else if (value instanceof Number) {
053             handleAsDate(new Date(((Numbervalue).longValue()));
054         else if (value instanceof List) {
055             handleAsList((Listvalue);
056         else {
057             throw illegalValue(value, LocalTime.class);
058         }
059     }
060 
061     protected void handleAsDate(Date date) {
062         Calendar c = Calendar.getInstance();
063         c.setTime(date);
064         handleAsCalendar(c);
065     }
066 
067     protected void handleAsCalendar(Calendar value) {
068         int h = value.get(Calendar.HOUR);
069         int i = value.get(Calendar.MINUTE);
070         int s = value.get(Calendar.SECOND);
071         int n = value.get(Calendar.MILLISECOND1000;
072         super.setValueInternal(LocalTime.of(h, i, s, n));
073     }
074 
075     protected void handleAsString(String str) {
076         if (isBlank(str)) {
077             super.setValueInternal(null);
078             return;
079         }
080 
081         try {
082             super.setValueInternal(LocalTime.parse(str));
083         catch (DateTimeParseException dtpe) {
084             throw illegalValue(str, LocalTime.class, dtpe);
085         }
086     }
087 
088     @Override
089     protected Formatter<LocalTime> resolveFormatter() {
090         return isBlank(getFormat()) null new LocalTimeFormatter(getFormat());
091     }
092 
093     protected void handleAsList(List<?> list) {
094         if (list.isEmpty()) {
095             super.setValueInternal(null);
096             return;
097         }
098 
099         List<Object> values = new ArrayList<>();
100         values.addAll(list);
101         switch (values.size()) {
102             case 4:
103                 // ok
104                 break;
105             case 3:
106                 values.add(0);
107                 break;
108             default:
109                 throw illegalValue(list, LocalTime.class);
110         }
111 
112         for (int i = 0, valuesSize = values.size(); i < valuesSize; i++) {
113             Object val = values.get(i);
114             if (val instanceof Number) {
115                 values.set(i, parse((Numberval));
116             else if (val instanceof CharSequence) {
117                 values.set(i, parse(String.valueOf(val)));
118             else {
119                 throw illegalValue(list, LocalTime.class);
120             }
121         }
122         super.setValueInternal(
123             LocalTime.of(
124                 (Integervalues.get(0),
125                 (Integervalues.get(1),
126                 (Integervalues.get(2),
127                 (Integervalues.get(3)
128             )
129         );
130     }
131 
132     protected int parse(String val) {
133         try {
134             return Integer.parseInt(val.trim());
135         catch (NumberFormatException e) {
136             throw illegalValue(val, LocalTime.class, e);
137         }
138     }
139 
140     protected int parse(Number val) {
141         return val.intValue();
142     }
143 }