view src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingAttributes.java @ 25:1b448f9249ee

mark
author Shoshi TAMAKI
date Sun, 13 Jan 2013 20:52:19 +0900
parents 3ef2a66a8c5d
children 418088ca2b30
line wrap: on
line source

package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger;

import java.nio.ByteBuffer;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteAttributeOperation;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.Operation;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.SetAttributeOperation;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableAttributes;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;

public class LoggingAttributes implements EditableAttributes
{
	private final EditableAttributes wrap;
	private final Logger log;
	
	public LoggingAttributes(EditableAttributes _wrap,Logger _log)
	{
		wrap = _wrap;
		log = _log;
	}

	@Override
	public ByteBuffer get(String _key)
	{
		return wrap.get(_key);
	}

	@Override
	public Either<Error,EditableNode> delete(final String _key)
	{
		
		Either<Error,EditableNode> either = wrap.delete(_key);
		if(either.isA()){
			return either;
		}
		
		Operation opDelete = new DeleteAttributeOperation(){
			@Override
			public String getKey(){
				return _key;
			}
		};
		
		Logger newLog = log.add(opDelete);
		EditableNode newWrap = either.b();
		EditableNode newLoggingNode = new LoggingNode(newWrap,newLog);
		
		return DefaultEither.newB(newLoggingNode);
	}

	@Override
	public Either<Error,EditableNode> put(final String _key,final ByteBuffer _value)
	{
		Either<Error,EditableNode> either = wrap.put(_key,_value);
		if(either.isA()){
			return either;
		}
		
		Operation opPut = new SetAttributeOperation(){
			@Override
			public String getKey(){
				return _key;
			}

			@Override
			public ByteBuffer getValue(){
				return _value;
			}
		};
		
		Logger newLog = log.add(opPut);
		EditableNode newLoggingNode = new LoggingNode(either.b(),newLog);
		
		return DefaultEither.newB(newLoggingNode);
	}
}