/* * Copyright 2008-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package griffon.core.editors; import griffon.core.formatters.Formatter; import griffon.core.formatters.ParseException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Nullable; import java.beans.PropertyEditorSupport; import static griffon.core.GriffonExceptionHandler.sanitize; import static griffon.util.GriffonNameUtils.isBlank; /** * @author Andres Almiray * @since 2.0.0 */ public abstract class AbstractPropertyEditor extends PropertyEditorSupport implements ExtendedPropertyEditor { private static final Logger LOG = LoggerFactory.getLogger(AbstractPropertyEditor.class); private String format; @Nullable public String getFormat() { return format; } public void setFormat(@Nullable String format) { this.format = format; } @Override public String getAsText() { return isBlank(getFormat()) ? getAsTextInternal() : getFormattedValue(); } @Override public void setAsText(String str) throws IllegalArgumentException { if (isBlank(getFormat())) { setAsTextInternal(str); } else { setFormattedValue(str); } } @Override public void setValue(Object value) { if (value instanceof CharSequence) { setFormattedValue(String.valueOf(value)); } else { setValueInternal(value); } } protected void setValueInternal(Object value) { super.setValue(value); } protected Object getValueInternal() { return super.getValue(); } protected void setAsTextInternal(String str) throws IllegalArgumentException { setValueInternal(str); } protected String getAsTextInternal() { return super.getAsText(); } @SuppressWarnings({"unchecked", "rawtypes"}) public String getFormattedValue() { Object value = getValueInternal(); Formatter formatter = resolveFormatter(); if (formatter != null) { return formatter.format(value); } return value != null ? value.toString() : null; } @SuppressWarnings("ThrowableResultOfMethodCallIgnored") public void setFormattedValue(String value) { Formatter<?> formatter = resolveFormatter(); if (formatter != null) { try { setValueInternal(formatter.parse(value)); } catch (ParseException e) { e = (ParseException) sanitize(e); if (LOG.isTraceEnabled()) { LOG.trace("Cannot parse value " + value, e); } throw new ValueConversionException(value, e); } } else { setValueInternal(value); } } protected Formatter<?> resolveFormatter() { return null; } protected ValueConversionException illegalValue(Object value, Class<?> klass) { throw new ValueConversionException(value, klass); } protected ValueConversionException illegalValue(Object value, Class<?> klass, Exception e) { throw new ValueConversionException(value, klass, e); } }