/*
* Copyright 2004-2015 the Seasar Foundation and the Others.
*
* 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.seasar.extension.jdbc.types;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.seasar.extension.jdbc.ValueType;
import org.seasar.extension.jdbc.util.BindVariableUtil;
import org.seasar.framework.exception.SSQLException;
/**
* オブジェクトをシリアライズしたバイト配列用の {@link ValueType}です。
*
* @author higa
*/
public class SerializableType extends BytesType {
/**
* インスタンスを構築します。
*
* @param trait
* トレイト
*/
public SerializableType(Trait trait) {
super(trait);
}
public Object getValue(final ResultSet resultSet, final int index)
throws SQLException {
return deserialize(super.getValue(resultSet, index));
}
public Object getValue(final ResultSet resultSet, final String columnName)
throws SQLException {
return deserialize(super.getValue(resultSet, columnName));
}
public Object getValue(final CallableStatement cs, final int index)
throws SQLException {
return deserialize(super.getValue(cs, index));
}
public Object getValue(final CallableStatement cs,
final String parameterName) throws SQLException {
return deserialize(super.getValue(cs, parameterName));
}
public void bindValue(final PreparedStatement ps, final int index,
final Object value) throws SQLException {
super.bindValue(ps, index, serialize(value));
}
public void bindValue(final CallableStatement cs,
final String parameterName, final Object value) throws SQLException {
super.bindValue(cs, parameterName, serialize(value));
}
/**
* オブジェクトをシリアライズしてバイト配列に変換します。
*
* @param o
* オブジェクト
* @return オブジェクトをシリアライズしたバイト配列
* @throws SQLException
* SQL例外が発生した場合
*/
protected byte[] serialize(final Object o) throws SQLException {
if (o == null) {
return null;
}
try {
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(o);
try {
return baos.toByteArray();
} finally {
oos.close();
}
} catch (final Exception e) {
throw new SSQLException("ESSR0017", new Object[] { e }, e);
}
}
/**
* バイト配列をデシリアライズしてオブジェクトに変換します。
*
* @param bytes
* バイト配列
* @return バイト配列をデシリアライズしたオブジェクト
* @throws SQLException
* SQL例外が発生した場合
*/
protected Object deserialize(final Object bytes) throws SQLException {
if (bytes == null) {
return null;
}
try {
final ByteArrayInputStream bais = new ByteArrayInputStream(
(byte[]) bytes);
final ObjectInputStream ois = new ObjectInputStream(bais);
try {
return ois.readObject();
} finally {
ois.close();
}
} catch (final Exception e) {
throw new SSQLException("ESSR0017", new Object[] { e }, e);
}
}
public String toText(Object value) {
if (value == null) {
return BindVariableUtil.nullText();
}
return BindVariableUtil.toText(value);
}
}