AWS Elastic Beanstalk を使う その12

StandardSessionクラスがSerializableインタフェースを持っているので、Base64エンコードして直列化した文字列をSimpleDBに書き込むような流れになっています。

オブジェクトの文字列化に使ったのはこれ。
ちゃんとテストしていませんがw。
http://www.source-code.biz/base64coder/java/

道半ば。。

package jp.cm.aws.tomcat.session;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.apache.catalina.Session;
import org.apache.catalina.Store;
import org.apache.catalina.session.StandardSession;
import org.apache.catalina.session.StoreBase;

import biz.source_code.base64Coder.Base64Coder;

import com.amazonaws.auth.PropertiesCredentials;
import com.amazonaws.services.simpledb.AmazonSimpleDB;
import com.amazonaws.services.simpledb.AmazonSimpleDBClient;
import com.amazonaws.services.simpledb.model.Attribute;
import com.amazonaws.services.simpledb.model.DeleteAttributesRequest;
import com.amazonaws.services.simpledb.model.GetAttributesRequest;
import com.amazonaws.services.simpledb.model.GetAttributesResult;
import com.amazonaws.services.simpledb.model.Item;
import com.amazonaws.services.simpledb.model.PutAttributesRequest;
import com.amazonaws.services.simpledb.model.ReplaceableAttribute;
import com.amazonaws.services.simpledb.model.SelectRequest;

public class SimpleDBStore extends StoreBase implements Store {

	private AmazonSimpleDB sdb = null;
	private String myDomain = "SessionPersistence";
	private String mySession = "Session";

	public SimpleDBStore() throws IOException {
		sdb = new AmazonSimpleDBClient(new PropertiesCredentials(
				SimpleDBStore.class
						.getResourceAsStream("AwsCredentials.properties")));

	}

	@Override
	public int getSize() throws IOException {
		String selectExpression = "select * from `" + myDomain + "`";
		SelectRequest selectRequest = new SelectRequest(selectExpression);
		int count = 0;
		for (Item item : sdb.select(selectRequest).getItems()) {
			System.out.println("  Item");
			System.out.println("    Name: " + item.getName());
			for (Attribute attribute : item.getAttributes()) {
				System.out.println("      Attribute");
				System.out.println("        Name:  " + attribute.getName());
				System.out.println("        Value: " + attribute.getValue());
			}
			count++;
		}
		return count;
	}

	@Override
	public String[] keys() throws IOException {
		String selectExpression = "select * from `" + myDomain + "`";
		SelectRequest selectRequest = new SelectRequest(selectExpression);

		List<Item> items = sdb.select(selectRequest).getItems();
		List<String> keyNames = new ArrayList<String>();

		for (Item item : items) {
			keyNames.add(item.getName());
		}
		return (String[]) keyNames.toArray();
	}

	@Override
	public Session load(String id) throws ClassNotFoundException, IOException {
		System.out.println("load : " + id);

		GetAttributesResult result = sdb
				.getAttributes(new GetAttributesRequest().withDomainName(
						myDomain).withItemName(id));

		List<Attribute> list = result.getAttributes();

		StandardSession session = null;
		for (int i = 0; i < list.size(); i++) {
			Attribute attribute = list.get(i);
			if (attribute.getName().equals(mySession)) {
				String value = attribute.getValue();
				session = (StandardSession) fromString(value);
			}
		}

		System.out.println(session.toString());

		return session;
	}

	@Override
	public void remove(String id) throws IOException {
		System.out.println("remove : " + id);

		sdb.deleteAttributes(new DeleteAttributesRequest().withDomainName(
				myDomain).withItemName(id));
	}

	@Override
	public void clear() throws IOException {
		System.out.println("clear");
	}

	@Override
	public void save(Session session) throws IOException {
		System.out.println(session.toString());
		System.out.println("save");

		String id = session.getId();

		sdb.putAttributes(new PutAttributesRequest()
				.withDomainName(myDomain)
				.withItemName(id)
				.withAttributes(
						new ReplaceableAttribute(mySession,
								toString((StandardSession) session), true)));

		System.out.println(toString((StandardSession) session));
	}

	private Object fromString(String s) throws IOException,
			ClassNotFoundException {
		byte[] data = Base64Coder.decode(s);
		ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(
				data));
		Object o = ois.readObject();
		ois.close();
		return o;
	}

	private String toString(Serializable o) throws IOException {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(baos);
		oos.writeObject(o);
		oos.close();
		return new String(Base64Coder.encode(baos.toByteArray()));
	}

}