changeset 83:b3ccefdf2b43

Added PersistentExample
author one
date Fri, 25 Oct 2013 18:44:29 +0900
parents 60d28fedcbf2
children 82d1d3dac7bc
files src/alice/jungle/core/NetworkDefaultJungle.java src/alice/jungle/operations/NetworkNodeOperation.java src/alice/jungle/operations/NetworkNodePath.java src/alice/jungle/operations/NetworkTreeOperationLog.java src/alice/jungle/persistence/NetworkJournal.java src/jungle/app/bbs/NetworkJungleBulletinBoard.java src/test/alice/jungle/PersistentExample.java
diffstat 7 files changed, 208 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/alice/jungle/core/NetworkDefaultJungle.java	Wed Oct 16 20:53:44 2013 +0900
+++ b/src/alice/jungle/core/NetworkDefaultJungle.java	Fri Oct 25 18:44:29 2013 +0900
@@ -27,7 +27,7 @@
 	
 	public NetworkDefaultJungle(Journal _journal,String _uuid,TreeEditor _editor, String _serverName)
 	{
-		journal = new AliceJournal();
+		journal = _journal;
 		trees = new ConcurrentHashMap<String,JungleTree>();
 		uuid = _uuid;
 		editor = _editor;
--- a/src/alice/jungle/operations/NetworkNodeOperation.java	Wed Oct 16 20:53:44 2013 +0900
+++ b/src/alice/jungle/operations/NetworkNodeOperation.java	Fri Oct 25 18:44:29 2013 +0900
@@ -23,6 +23,11 @@
 	public ByteBuffer value;
 	public int commandType;
 
+	public final static int NUM_PUT_ATTRIBUTE = 1;
+	public final static int NUM_APPEND_CHILD = 2;
+	public final static int NUM_DELETE_CHILD = 3;
+	public final static int NUM_DELETE_ATTRIBUTE = 4;
+	
 	public NetworkNodeOperation() {
 		pos = -2;
 		key = null;
@@ -40,13 +45,13 @@
 	public static int getCommandType(Command c) {
 		switch(c) {
 		case PUT_ATTRIBUTE:
-			return 1;
+			return NUM_PUT_ATTRIBUTE;
 		case APPEND_CHILD:
-			return 2;
+			return NUM_APPEND_CHILD;
 		case DELETE_CHILD:
-			return 3;
+			return NUM_DELETE_CHILD;
 		case DELETE_ATTRIBUTE:
-			return 4;
+			return NUM_DELETE_ATTRIBUTE;
 		default:
 			break;
 		}
@@ -55,13 +60,13 @@
 	
 	public static Command getCommand(int num) {
 		switch(num) {
-		case 1:
+		case NUM_PUT_ATTRIBUTE:
 			return Command.PUT_ATTRIBUTE;
-		case 2:
-			return Command.APPEND_CHILD;
-		case 3:
+		case NUM_APPEND_CHILD:
+ 			return Command.APPEND_CHILD;
+		case NUM_DELETE_CHILD:
 			return Command.DELETE_CHILD;
-		case 4:
+		case NUM_DELETE_ATTRIBUTE:
 			return Command.DELETE_ATTRIBUTE;
 		default:
 			break;
--- a/src/alice/jungle/operations/NetworkNodePath.java	Wed Oct 16 20:53:44 2013 +0900
+++ b/src/alice/jungle/operations/NetworkNodePath.java	Fri Oct 25 18:44:29 2013 +0900
@@ -15,6 +15,7 @@
 	
 	public NetworkNodePath() {
 		path = new LinkedList<Integer>();
+		path.add(-1);
 	}
 	
 	public NetworkNodePath(NodePath _p) {
--- a/src/alice/jungle/operations/NetworkTreeOperationLog.java	Wed Oct 16 20:53:44 2013 +0900
+++ b/src/alice/jungle/operations/NetworkTreeOperationLog.java	Fri Oct 25 18:44:29 2013 +0900
@@ -13,17 +13,27 @@
 @Message
 public class NetworkTreeOperationLog implements TreeOperationLog
 {
-	public LinkedList<TreeOperation> list;
+	public LinkedList<NetworkTreeOperation> list;
 	public int size;
 	
 	public NetworkTreeOperationLog() {
-		list = new LinkedList<TreeOperation>();
+		list = new LinkedList<NetworkTreeOperation>();
 		size = 0;
 	}
-	
+
+	public NetworkTreeOperationLog(Iterable<TreeOperation> _list)
+	{
+		list = new LinkedList<NetworkTreeOperation>();
+		for(TreeOperation op: _list) {
+			NetworkTreeOperation nOp = new NetworkTreeOperation(op);
+			list.add(nOp);
+		}
+		size = list.size();
+	}
+
 	public NetworkTreeOperationLog(Iterable<TreeOperation> _list, int _size)
 	{
-		list = new LinkedList<TreeOperation>();
+		list = new LinkedList<NetworkTreeOperation>();
 		for(TreeOperation op: _list) {
 			NetworkTreeOperation nOp = new NetworkTreeOperation(op);
 			list.add(nOp);
@@ -33,7 +43,11 @@
 	
 	@Override
 	public Iterator<TreeOperation> iterator() {
-		return list.iterator();
+		LinkedList<TreeOperation> opList = new LinkedList<TreeOperation>();
+		for(NetworkTreeOperation op : list) {
+			opList.add(op);
+		}
+		return opList.iterator();
 	}
 
 	@Override
@@ -41,7 +55,7 @@
 	{
 		NetworkTreeOperation op = new NetworkTreeOperation(_p, _op);
 		list.add(op);
-		return new NetworkTreeOperationLog(list, size+1);
+		return this;
 	}
 
 	@Override
@@ -51,7 +65,7 @@
 			NetworkTreeOperation op = new NetworkTreeOperation(o);
 			list.add(op);
 		}
-		return new NetworkTreeOperationLog(list, size+_log.length());
+		return this;
 	}
 
 	@Override
--- a/src/alice/jungle/persistence/NetworkJournal.java	Wed Oct 16 20:53:44 2013 +0900
+++ b/src/alice/jungle/persistence/NetworkJournal.java	Fri Oct 25 18:44:29 2013 +0900
@@ -1,15 +1,43 @@
 package alice.jungle.persistence;
 
+import java.io.EOFException;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Iterator;
+
+import org.msgpack.MessagePack;
+
+import alice.jungle.operations.NetworkTreeOperationLog;
+
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListReader;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Journal;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Result;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
 
 public class NetworkJournal  implements Journal {
 	
 	private static final NetworkChangeListWriter WRITER = new NetworkChangeListWriter();
 	private static final NetworkChangeListReader READER = new NetworkChangeListReader();
+	private static MessagePack msgpack = new MessagePack();
+	private static OutputStream out = null;
+	private static InputStream in = null;
+	
+	public NetworkJournal() {
+		
+	}
+	
+	public NetworkJournal(File file) throws FileNotFoundException {
+		out = new FileOutputStream(file, true);
+		in = new FileInputStream(file);
+	}
+	
 	@Override
 	public ChangeListReader getReader() {
 		return READER;
@@ -19,20 +47,51 @@
 		return WRITER;
 	}
 	
+	public void close() throws IOException {
+		out.close();
+		in.close();
+	}
+	
+	public void setOutputStream(OutputStream _out) {
+		out = _out;
+	}
+	
+	public OutputStream getOutputStream() {
+		return out;
+	}
+	
+	public void setInputStream(InputStream _in) {
+		in = _in;
+	}
+	
+	public InputStream getInputStream() {
+		return in;
+	}
+	
 	private static class NetworkChangeListWriter implements ChangeListWriter
 	{
 		@Override
 		public Result write(ChangeList _operations)
 		{
-			
+			NetworkTreeOperationLog log = new NetworkTreeOperationLog(_operations);
+			try {
+				msgpack.write(out, log);
+				out.flush();
+			} catch (IOException e) {
+				return null;
+			}
 			return Result.SUCCESS;
 		}
-e
 	}
 	
-	
+	public MessagePack getMessagePack() {
+		return msgpack;
+	}
+
 	private static class NetworkChangeListReader implements ChangeListReader
 	{
+		
+		
 		@Override
 		public ChangeListReader newReader()
 		{
@@ -40,8 +99,22 @@
 		}
 		
 		@Override 
-		public ChangeList read() 
+		public ChangeList read()
 		{
+			try {
+				final NetworkTreeOperationLog readLog = msgpack.read(in, NetworkTreeOperationLog.class);
+				ChangeList cl = new ChangeList() {
+					@Override
+					public Iterator<TreeOperation> iterator() {
+						return readLog.iterator();
+					}
+				};
+				return cl;
+			} catch (EOFException e){
+//				e.printStackTrace();
+			} catch (IOException e) {
+//				e.printStackTrace();
+			}
 			return null;
 		}
 
--- a/src/jungle/app/bbs/NetworkJungleBulletinBoard.java	Wed Oct 16 20:53:44 2013 +0900
+++ b/src/jungle/app/bbs/NetworkJungleBulletinBoard.java	Fri Oct 25 18:44:29 2013 +0900
@@ -7,6 +7,7 @@
 
 import alice.jungle.core.NetworkDefaultJungle;
 import alice.jungle.datasegment.store.container.DefaultTreeOperationLogContainer;
+import alice.jungle.persistence.AliceJournal;
 import alice.jungle.transaction.NetworkDefaultJungleTreeEditor;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
@@ -32,7 +33,7 @@
 	
 	public NetworkJungleBulletinBoard(String _serverName)
 	{
-		jungle = new NetworkDefaultJungle(null,"hoge",new DefaultTreeEditor(new DefaultTraverser()), _serverName);	
+		jungle = new NetworkDefaultJungle(new AliceJournal(),"hoge",new DefaultTreeEditor(new DefaultTraverser()), _serverName);	
 		jungle.createNewTree("boards");
 		JungleManager.setJungle(jungle);
 	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/alice/jungle/PersistentExample.java	Fri Oct 25 18:44:29 2013 +0900
@@ -0,0 +1,92 @@
+package test.alice.jungle;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
+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.ChangeListReader;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
+import alice.jungle.core.NetworkDefaultJungle;
+import alice.jungle.operations.NetworkNodePath;
+import alice.jungle.persistence.NetworkJournal;
+
+/*
+ * Hello World
+ */
+
+public class PersistentExample {
+
+	public static void main(String[] args) throws IOException {
+		NetworkJournal journal = new NetworkJournal(
+				new File("./log/commit.log"));
+		Jungle jungle = new NetworkDefaultJungle(journal, "uuid",
+				new DefaultTreeEditor(new DefaultTraverser()), "node00");
+		jungle.createNewTree("hoge");
+		JungleTree tree = jungle.getTreeByName("hoge");
+		JungleTreeEditor editor = tree.getTreeEditor();
+		NetworkNodePath path = new NetworkNodePath();
+		String key = "key";
+		ByteBuffer value = ByteBuffer.wrap("value".getBytes());
+		int pos = 0;
+		Either<Error, JungleTreeEditor> either = editor.addNewChildAt(path, pos);
+		if(either.isA()){
+			System.out.println("Failed addNewChildAt");
+			System.exit(0);
+		}
+		editor = either.b();
+		either = editor.putAttribute(path, key,	value);
+
+		JungleTreeEditor e = either.b();
+		e.success();
+		journal.close();
+
+		NetworkJournal journal2 = new NetworkJournal(new File("./log/commit.log"));
+		ChangeListReader reader = journal2.getReader();
+		ChangeList chList = reader.read();
+		for (; chList != null; chList = reader.read()) {
+			for (TreeOperation op : chList) {
+				NodePath p = op.getNodePath();
+				NodeOperation nodeOp = op.getNodeOperation();
+				Command c = nodeOp.getCommand();
+				String str = "";
+				switch (c) {
+				case PUT_ATTRIBUTE:
+					String opKey = nodeOp.getKey();
+					ByteBuffer opValue = nodeOp.getValue();
+					if (value.limit() < 100) {
+						str = String.format("key:%s,value:%s", opKey,
+								new String(opValue.array()));
+					} else {
+						str = String.format("key:%s,value:%d", opKey,
+								opValue.limit());
+					}
+					break;
+				case DELETE_ATTRIBUTE:
+					str = String.format("key:%s", nodeOp.getKey());
+					break;
+				case APPEND_CHILD:
+					str = String.format("pos:%d", nodeOp.getPosition());
+					break;
+				case DELETE_CHILD:
+					str = String.format("pos:%d", nodeOp.getPosition());
+					break;
+				}
+				System.out.println(String.format("[%s:%s:%s]", c, p, str));
+			}
+		}
+
+	}
+
+}