org.jdal.text.FormatUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.jdal.text.FormatUtils.java

Source

/*
 * Copyright 2009-2012 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 org.jdal.text;

import java.beans.PropertyDescriptor;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.format.AnnotationFormatterFactory;
import org.springframework.format.Formatter;
import org.springframework.format.Parser;
import org.springframework.format.Printer;
import org.springframework.format.annotation.NumberFormat;
import org.springframework.format.number.NumberFormatAnnotationFormatterFactory;

/**
 * Utility class for getting Printers an Parsers for Format annotated properties.
 * 
 * @author Jose Luis Martin - (jlm@joseluismartin.info)
 */
public abstract class FormatUtils {

    private static final Log log = LogFactory.getLog(FormatUtils.class);
    private static AnnotationFormatterFactory<NumberFormat> numberFormatFactory = new NumberFormatAnnotationFormatterFactory();

    /**
     * Get Printer for class and property name
     * @param clazz the class
     * @param propertyName the property name
     * @return Printer or null if none
     */
    public static Printer<?> getPrinter(Class<?> clazz, String propertyName) {
        return getFormatter(clazz, propertyName);
    }

    /**
     * Get Parser for property name
     * @param clazz Class
     * @param propertyName the property name
     * @return Parser or null if none
     */
    public static Parser<?> getParser(Class<?> clazz, String propertyName) {
        return getFormatter(clazz, propertyName);
    }

    /**
     * Get a formatter for class and property name
     * @param clazz the class
     * @param propertyName the property name
     * @return the formatter or null if none
     */
    public static Formatter<?> getFormatter(Class<?> clazz, String propertyName) {
        PropertyDescriptor pd = BeanUtils.getPropertyDescriptor(clazz, propertyName);
        if (pd != null) {
            NumberFormat format = getAnnotation(pd, NumberFormat.class);
            if (format != null) {
                return (Formatter<?>) numberFormatFactory.getPrinter(format, pd.getPropertyType());
            }

            PeriodFormat periodFormat = getAnnotation(pd, PeriodFormat.class);
            if (periodFormat != null)
                return new PeriodFormatter();
        }

        return null;
    }

    public static <A extends Annotation> A getAnnotation(PropertyDescriptor pd, Class<A> annotationType) {
        A annotation = AnnotationUtils.getAnnotation(pd.getReadMethod(), annotationType);
        if (annotation != null)
            return annotation;

        Field field = getDeclaredField(pd);

        if (field != null)
            annotation = AnnotationUtils.getAnnotation(field, annotationType);

        return annotation;
    }

    /**
     * Field for property name, if any
     * @param pd PropertyDescriptor
     * @return property field or null if none.
     */
    public static Field getDeclaredField(PropertyDescriptor pd) {

        try {
            return pd.getReadMethod().getDeclaringClass().getDeclaredField(pd.getName());
        } catch (Exception e) {
            if (log.isDebugEnabled())
                log.debug("Cannot access to field: " + pd.getName());

            return null;
        }
    }

}