IdentityIdGenerator.java

package com.github.mygreen.sqlmapper.core.id;

import java.util.List;

import org.springframework.dao.DataIntegrityViolationException;

import com.github.mygreen.sqlmapper.core.util.NumberConvertUtils;

import lombok.RequiredArgsConstructor;

/**
 * IDENTITYによる生成は、実際にはJdbcTemplateで行います。
 * <p>このクラスでは、{@link #generateValue(Number)} による変換だけ行います。
 *
 * @version 0.3
 * @author T.TSUCHIE
 *
 */
@RequiredArgsConstructor
public class IdentityIdGenerator implements IdGenerator {

    /**
     * サポートしているクラスタイプ
     */
    private static final List<Class<?>> SUPPORTED_TYPE_LIST = List.of(
            long.class, Long.class, int.class, Integer.class);

    /**
     * 生成する識別子のタイプ
     */
    private final Class<?> requiredType;

    @Override
    public boolean isSupportedType(Class<?> type) {
        return SUPPORTED_TYPE_LIST.contains(type);
    }

    @Override
    public Class<?>[] getSupportedTypes() {
        return SUPPORTED_TYPE_LIST.toArray(new Class[SUPPORTED_TYPE_LIST.size()]);
    }

    /**
     * {@inheritDoc}
     * @throws UnsupportedOperationException このメソッドを呼び出したときに必ずスローされます。
     */
    @Override
    public Object generateValue(final IdGenerationContext context) {
        throw new UnsupportedOperationException("this method is not supported.");
    }

    /**
     * 生成したIDをプロパティのクラス型に変換する。
     * @param value 生成したID
     * @return プロパティのクラス型に変換したID。
     * @throws DataIntegrityViolationException サポート対象外のクラスタイプの場合にスローされます。
     */
    public Object generateValue(final Number value) {

        if(requiredType == long.class || requiredType == Long.class
                || requiredType == int.class || requiredType == Integer.class) {
            return NumberConvertUtils.convertNumber(requiredType, value);

        }

        throw new DataIntegrityViolationException("not supported java type : " + requiredType.getName());

    }
}