All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jp.co.future.uroborosql.mapping.mapper.PropertyMapperManager Maven / Gradle / Ivy

/**
 * Copyright (c) 2017-present, Future Corporation
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */
package jp.co.future.uroborosql.mapping.mapper;

import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.Clock;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.ServiceLoader;
import java.util.concurrent.CopyOnWriteArrayList;

import jp.co.future.uroborosql.mapping.JavaType;

/**
 * プロパティ変換クラス
* Entityに渡す値を調整する * * @author ota */ public final class PropertyMapperManager { /** デフォルトMapper */ private static final PropertyMapper[] DEFAULT_MAPPERS = { new BigIntegerPropertyMapper(), new OptionalPropertyMapper(), new OptionalIntPropertyMapper(), new OptionalLongPropertyMapper(), new OptionalDoublePropertyMapper(), new DomainPropertyMapper(), new EnumPropertyMapper(), // DomainPropertyMapper・DateTimeApiPropertyMapperより後に設定 new ArrayPropertyMapper() }; /** Serviceに登録されたMapper */ private static final List> LOADED_MAPPERS = load(); private static List> load() { var list = new ArrayList>(); ServiceLoader.load(PropertyMapper.class).forEach(list::add); return list; } /** プロパティMapperのリスト */ private final List> mappers; /** DateTimeApiPropertyMapper */ private final DateTimeApiPropertyMapper dateTimeApiPropertyMapper; /** * コンストラクタ. * * @param clock Clock */ public PropertyMapperManager(final Clock clock) { this.mappers = new CopyOnWriteArrayList<>(LOADED_MAPPERS); this.dateTimeApiPropertyMapper = new DateTimeApiPropertyMapper(clock); } /** * コピーコンストラクタ * * @param parameterMapperManager コピー元のパラメータ変換クラス * @param clock Clock */ public PropertyMapperManager(final PropertyMapperManager parameterMapperManager, final Clock clock) { this.mappers = new CopyOnWriteArrayList<>(parameterMapperManager.mappers); this.dateTimeApiPropertyMapper = new DateTimeApiPropertyMapper(clock); } /** * {@link PropertyMapper}を追加 * * @param propertyMapper {@link PropertyMapper} */ public void addMapper(final PropertyMapper propertyMapper) { this.mappers.add(propertyMapper); } /** * {@link PropertyMapper}をremove * * @param propertyMapper {@link PropertyMapper} */ public void removeMapper(final PropertyMapper propertyMapper) { this.mappers.remove(propertyMapper); } /** * プロパティの型に変換した値を取得 * * @param type 変換対象の型 * @param rs ResultSet * @param columnIndex 変換対象データのカラムIndex * @return プロパティの型に変換した値 * @throws SQLException SQL例外 */ public Object getValue(final JavaType type, final ResultSet rs, final int columnIndex) throws SQLException { Class rawType = type.getRawType(); for (var propertyMapper : this.mappers) { if (propertyMapper.canAccept(rawType) && propertyMapper.canAcceptTest(type, rs, columnIndex, this)) { return propertyMapper.getValue(type, rs, columnIndex, this); } } if (String.class.equals(rawType)) { return rs.getString(columnIndex); } if (Boolean.class.equals(rawType)) { var result = rs.getBoolean(columnIndex); if (rs.wasNull()) { return null; } return result; } if (boolean.class.equals(rawType)) { return rs.getBoolean(columnIndex); } if (Byte.class.equals(rawType)) { var result = rs.getByte(columnIndex); if (rs.wasNull()) { return null; } return result; } if (byte.class.equals(rawType)) { return rs.getByte(columnIndex); } if (Short.class.equals(rawType)) { var result = rs.getShort(columnIndex); if (rs.wasNull()) { return null; } return result; } if (short.class.equals(rawType)) { return rs.getShort(columnIndex); } if (Integer.class.equals(rawType)) { var result = rs.getInt(columnIndex); if (rs.wasNull()) { return null; } return result; } if (int.class.equals(rawType)) { return rs.getInt(columnIndex); } if (Long.class.equals(rawType)) { var result = rs.getLong(columnIndex); if (rs.wasNull()) { return null; } return result; } if (long.class.equals(rawType)) { return rs.getLong(columnIndex); } if (Float.class.equals(rawType)) { var result = rs.getFloat(columnIndex); if (rs.wasNull()) { return null; } return result; } if (float.class.equals(rawType)) { return rs.getFloat(columnIndex); } if (Double.class.equals(rawType)) { var result = rs.getDouble(columnIndex); if (rs.wasNull()) { return null; } return result; } if (double.class.equals(rawType)) { return rs.getDouble(columnIndex); } if (BigDecimal.class.equals(rawType)) { return rs.getBigDecimal(columnIndex); } if (byte[].class.equals(rawType)) { return rs.getBytes(columnIndex); } if (java.sql.Timestamp.class.equals(rawType)) { return rs.getTimestamp(columnIndex); } if (java.sql.Time.class.equals(rawType)) { return rs.getTime(columnIndex); } if (java.sql.Date.class.equals(rawType)) { return rs.getDate(columnIndex); } if (Date.class.equals(rawType)) { return rs.getTimestamp(columnIndex); } if (java.sql.Array.class.equals(rawType)) { return rs.getArray(columnIndex); } if (java.sql.Blob.class.equals(rawType)) { return rs.getBlob(columnIndex); } if (java.sql.Clob.class.equals(rawType)) { return rs.getClob(columnIndex); } if (java.sql.NClob.class.equals(rawType)) { return rs.getNClob(columnIndex); } if (java.sql.Ref.class.equals(rawType)) { return rs.getRef(columnIndex); } if (java.sql.SQLXML.class.equals(rawType)) { return rs.getSQLXML(columnIndex); } if (dateTimeApiPropertyMapper.canAccept(rawType) && dateTimeApiPropertyMapper.canAcceptTest(type, rs, columnIndex, this)) { return dateTimeApiPropertyMapper.getValue(type, rs, columnIndex, this); } for (var propertyMapper : DEFAULT_MAPPERS) { if (propertyMapper.canAccept(rawType) && propertyMapper.canAcceptTest(type, rs, columnIndex, this)) { return propertyMapper.getValue(type, rs, columnIndex, this); } } return rs.getObject(columnIndex); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy