ほげにっき

hogedigoの日記

どうせだから

一つ俺々機能をSAStrutsにリクエストしてみようかしら。


EntityやDTOなどをhiddenに保存する仕組みが欲しい。もちろんsubmit時はActionにpopulateされる様に。セッション使いたくない(または使えない)ときにセッションに入れるのと同じ感覚でBeanを保存出来る。しかもセッションよりスレッドセーフ。※セキュリティ的には怖い面もあるけど


実装は何でもいいけど、自分はSerialize&Base64 encode(populate時は逆)でやってます。ホントは暗号化もしたいところだがそれは置いといて。
以前StrutsベースだったときはBeanUtilsに独自Converter追加してたんだけど、SAStrutsって多分BeanUtilsつかってないよね。
ソース眺めててtoStringとvalueOfメソッド(static)で双方向変換してくれるのを見つけたので、とりあえず・・

public class B64Utils {

	public static String b64Encode(Object bean) {
		if (bean == null) return null;
		
		try {
			ByteArrayOutputStream bout = new ByteArrayOutputStream(2048);
			ObjectOutputStream oout = new ObjectOutputStream(bout);
			oout.writeObject(bean);
			oout.close();
			
			return Base64.encode(bout.toByteArray());
		} catch (IOException e) {
			throw new IllegalStateException(e);
		}
	}
	
	public static Object b64Decode(String strB64) {
		if (StringUtils.isBlank(strB64)) return null;
		
		try {
			ObjectInputStream oin = 
				new ObjectInputStream(
					new ByteArrayInputStream(
						Base64.decode(strB64)));
			
			return oin.readObject();
		} catch (IOException e) {
			throw new IllegalStateException(e);
		} catch (ClassNotFoundException e) {
			throw new IllegalStateException(e);
		}
	}
}
public class Hoge implements Serializable {

〜〜略〜〜

	@Override
	public String toString() {
		return B64Utils.b64Encode(this);
	}
	
	public static Book valueOf(String str) {
		return (Book)B64Utils.b64Decode(str);
	}
}

みたいな感じでお茶を濁しているが、toStringメソッドがBase64の文字列返すのはチョットアレだし、Bean毎にメソッド用意するのはもっとアレなので、他にもっと良いextension pointがあれば・・・