diff src/jungle/test/transaction/NetworkTransactionManager.java @ 30:8593c2525aa7

add NeworkTransactionManager
author one
date Mon, 01 Jul 2013 20:31:29 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jungle/test/transaction/NetworkTransactionManager.java	Mon Jul 01 20:31:29 2013 +0900
@@ -0,0 +1,87 @@
+package jungle.test.transaction;
+
+import java.util.Iterator;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Result;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference.Reservation;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultChangeSet;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
+
+public class NetworkTransactionManager<T extends TreeNode<T>> implements TransactionManager<T> 
+{
+
+	private final AtomicReservableReference<TreeContext<T>> repository;
+	private final TreeContext<T> tip;
+	private final ChangeListWriter writer;
+	private final String uuid;	
+	private final String treeName;	
+	
+	public NetworkTransactionManager(ChangeListWriter _writer,TreeContext<T> _tip,
+			AtomicReservableReference<TreeContext<T>> _repository,String _uuid, String _treeName)
+	{
+		repository = _repository;
+		tip = _tip;
+		writer = _writer;
+		uuid = _uuid;
+		treeName = _treeName;
+	}
+	
+	@Override
+	public Either<Error, TransactionManager<T>> commit(T _newRoot,final TreeOperationLog _log) {
+		ChangeSet cs = tip.getChangeSet();
+		long currentRevision = cs.revision();
+		long nextRevision = currentRevision + 1;
+		
+		ChangeList list = new ChangeList() {
+			@Override
+			public Iterator<TreeOperation> iterator(){
+				return _log.iterator();
+			}
+		};
+		
+		Node root = _newRoot.getAsNode();
+		DefaultChangeSet newCs = new DefaultChangeSet(root, cs, list, uuid, nextRevision);
+		DefaultTreeContext<T> newContext = new DefaultTreeContext<T>(_newRoot,newCs);
+		
+		@SuppressWarnings("rawtypes")
+		Reservation reservation = repository.makeReservation(tip, newContext);
+		if(reservation == null) {
+			return DefaultEither.newA((Error)new DefaultError());
+		}
+		Result r = writer.write(list);
+		if(r == Result.SUCCESS){
+			reservation.confirm();
+			TransactionManager<T> txManager = new NetworkTransactionManager<T>(writer, newContext, repository, uuid, treeName);
+			return DefaultEither.newB(txManager);
+		}
+
+		return DefaultEither.newA((Error)new DefaultError());
+	}
+
+	@Override
+	public long getRevision() 
+	{
+		ChangeSet cs = tip.getChangeSet();
+		return cs.revision();
+	}
+
+	@Override
+	public String getUUID() {
+		return uuid;
+	}
+
+}