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