org.lightadmin.core.persistence.metamodel.PersistentPropertyType.java Source code

Java tutorial

Introduction

Here is the source code for org.lightadmin.core.persistence.metamodel.PersistentPropertyType.java

Source

/*
 * Copyright 2012-2014 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.lightadmin.core.persistence.metamodel;

import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.joda.time.LocalTime;
import org.lightadmin.api.config.annotation.FileReference;
import org.springframework.data.mapping.PersistentProperty;
import org.springframework.util.ClassUtils;

import javax.persistence.Embedded;
import javax.persistence.EmbeddedId;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;
import java.util.UUID;

import static org.lightadmin.core.util.NumberUtils.isNumberFloat;
import static org.lightadmin.core.util.NumberUtils.isNumberInteger;

public enum PersistentPropertyType {

    STRING, NUMBER_INTEGER, NUMBER_FLOAT, BOOL, DATE, TIME, DATE_TIME, FILE, ASSOC, ASSOC_MULTI, ENUM, EMBEDDED, MAP, UNKNOWN;

    public static PersistentPropertyType forPersistentProperty(PersistentProperty persistentProperty) {
        final Class<?> attrType = persistentProperty.getType();

        if (persistentProperty.isAnnotationPresent(Embedded.class)
                || persistentProperty.isAnnotationPresent(EmbeddedId.class)) {
            return PersistentPropertyType.EMBEDDED;
        }

        if (persistentProperty.isAssociation()) {
            if (persistentProperty.isCollectionLike()) {
                return PersistentPropertyType.ASSOC_MULTI;
            }
            return PersistentPropertyType.ASSOC;
        }

        if (persistentProperty.isMap()) {
            return PersistentPropertyType.MAP;
        }

        if (ClassUtils.isAssignable(Enum.class, attrType)) {
            return ENUM;
        }

        if (forType(attrType) == STRING && persistentProperty.isAnnotationPresent(FileReference.class)) {
            return PersistentPropertyType.FILE;
        }

        if (isOfDateType(persistentProperty)) {
            return DATE;
        }

        if (isOfTimeType(persistentProperty)) {
            return TIME;
        }

        if (isOfDateTimeType(persistentProperty)) {
            return DATE_TIME;
        }

        return forType(attrType);
    }

    private static boolean isOfTimeType(PersistentProperty persistentProperty) {
        Class attrType = persistentProperty.getType();

        if (java.sql.Time.class.equals(attrType)) {
            return true;
        }

        if (LocalTime.class.equals(attrType)) {
            return true;
        }

        if (Date.class.equals(attrType) || Calendar.class.equals(attrType)) {
            return hasTemporalType(persistentProperty, TemporalType.TIME);
        }

        return false;
    }

    private static boolean isOfDateType(PersistentProperty persistentProperty) {
        Class<?> attrType = persistentProperty.getType();

        if (java.sql.Date.class.equals(attrType)) {
            return true;
        }

        if (LocalDate.class.equals(attrType)) {
            return true;
        }

        if (Date.class.equals(attrType) || Calendar.class.equals(attrType)) {
            return hasTemporalType(persistentProperty, TemporalType.DATE);
        }

        return false;
    }

    private static boolean isOfDateTimeType(PersistentProperty persistentProperty) {
        Class<?> attrType = persistentProperty.getType();

        if (Timestamp.class.equals(attrType)) {
            return true;
        }

        if (DateTime.class.equals(attrType) || LocalDateTime.class.equals(attrType)) {
            return true;
        }

        if (Date.class.equals(attrType) || Calendar.class.equals(attrType)) {
            return hasTemporalType(persistentProperty, TemporalType.TIMESTAMP);
        }

        return false;
    }

    public static boolean isSupportedAttributeType(PersistentPropertyType attributeType) {
        return attributeType != UNKNOWN;
    }

    public static boolean isOfBinaryFileType(PersistentProperty persistentProperty) {
        return forType(persistentProperty.getType()) == FILE;
    }

    public static boolean isOfFileReferenceType(PersistentProperty persistentProperty) {
        if (forType(persistentProperty.getType()) == STRING
                && persistentProperty.isAnnotationPresent(FileReference.class)) {
            return true;
        }
        return false;
    }

    public static boolean isOfFileType(PersistentProperty persistentProperty) {
        return isOfBinaryFileType(persistentProperty) || isOfFileReferenceType(persistentProperty);
    }

    private static PersistentPropertyType forType(Class<?> attrType) {
        if (Boolean.class.equals(attrType) || boolean.class.equals(attrType)) {
            return BOOL;
        }

        if (isNumberInteger(attrType)) {
            return NUMBER_INTEGER;
        }

        if (isNumberFloat(attrType)) {
            return NUMBER_FLOAT;
        }

        if (String.class.equals(attrType) || UUID.class.equals(attrType)) {
            return STRING;
        }

        if (byte[].class.equals(attrType)) {
            return FILE;
        }

        return UNKNOWN;
    }

    private static boolean hasTemporalType(PersistentProperty persistentProperty, TemporalType temporalType) {
        Temporal temporal = (Temporal) persistentProperty.findAnnotation(Temporal.class);
        return temporal != null && temporal.value() == temporalType;
    }
}