# HG changeset patch # User one # Date 1385415790 -32400 # Node ID f9e29a52efd3fece70a75640c9c9e284cf84e115 # Parent 03bf62bb699e08824141986a8c4860025d23efa2 Move some files diff -r 03bf62bb699e -r f9e29a52efd3 .classpath --- a/.classpath Mon Nov 25 18:13:03 2013 +0900 +++ b/.classpath Tue Nov 26 06:43:10 2013 +0900 @@ -1,9 +1,10 @@ - + + - + @@ -44,7 +45,7 @@ + - diff -r 03bf62bb699e -r f9e29a52efd3 .project --- a/.project Mon Nov 25 18:13:03 2013 +0900 +++ b/.project Tue Nov 26 06:43:10 2013 +0900 @@ -1,25 +1,20 @@ - jungle-network - NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. - - Alice - jungle-core - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.m2e.core.maven2Nature - org.eclipse.jdt.core.javanature - - + jungle-network + NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. + + jungle-core + + + + org.eclipse.jdt.core.javabuilder + + + org.eclipse.m2e.core.maven2Builder + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jdt.core.javanature + + \ No newline at end of file diff -r 03bf62bb699e -r f9e29a52efd3 pom.xml --- a/pom.xml Mon Nov 25 18:13:03 2013 +0900 +++ b/pom.xml Tue Nov 26 06:43:10 2013 +0900 @@ -4,7 +4,8 @@ jungle-network 0.0.2-SNAPSHOT - src + src/main/java + src/test/java maven-compiler-plugin @@ -46,11 +47,12 @@ UTF-8 - - junit - junit - 3.8.1 - + + junit + junit + 4.7 + test + org.mortbay.jetty jetty diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/core/NetworkDefaultJungle.java --- a/src/alice/jungle/core/NetworkDefaultJungle.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -package alice.jungle.core; - -import java.util.Iterator; -import java.util.concurrent.ConcurrentHashMap; - -import alice.jungle.transaction.NetworkDefaultJungleTree; - -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.persistent.ChangeList; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Journal; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; -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.DefaultTreeNode; -import fj.data.List; - -public class NetworkDefaultJungle implements Jungle { - private Journal journal; - private ConcurrentHashMap trees; - private String uuid; - private TreeEditor editor; - - public NetworkDefaultJungle(Journal _journal,String _uuid,TreeEditor _editor) - { - journal = _journal; - trees = new ConcurrentHashMap(); - uuid = _uuid; - editor = _editor; - } - - @Override - public JungleTree getTreeByName(String _name) - { - return trees.get(_name); - } - - @Override - public JungleTree createNewTree(final String _name) - { - ChangeList list = new ChangeList(){ - @Override - public Iterator iterator() { - List nil = List.nil(); - return nil.iterator(); - } - @Override - public String uuid() { - return uuid; - } - @Override - public String getTreeName() { - return _name; - } - }; - DefaultTreeNode root = new DefaultTreeNode(); - ChangeSet set = new DefaultChangeSet(root.getAsNode(),null,list,uuid,_name, 0); - DefaultTreeContext tc = new DefaultTreeContext(root,set); - JungleTree newTree = new NetworkDefaultJungleTree(_name, tc,uuid,journal.getWriter(),editor); - if(trees.putIfAbsent(_name,newTree) != null){ - return null; - } - return newTree; - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/datasegment/HashSetDataSegment.java --- a/src/alice/jungle/datasegment/HashSetDataSegment.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -package alice.jungle.datasegment; - -import java.util.HashSet; - -import org.msgpack.annotation.Message; - -@Message -public class HashSetDataSegment { - public HashSet hash = new HashSet(); - public HashSetDataSegment() {} -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/datasegment/store/container/DefaultNodeOperationContainer.java --- a/src/alice/jungle/datasegment/store/container/DefaultNodeOperationContainer.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -package alice.jungle.datasegment.store.container; - -import java.io.IOException; -import java.nio.ByteBuffer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.AppendChildAtOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteAttributeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteChildAtOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.PutAttributeOperation; - -import org.msgpack.MessagePack; -import org.msgpack.annotation.Message; -import org.msgpack.template.OrdinalEnumTemplate; -import org.msgpack.type.Value; - -import alice.codesegment.SingletonMessage; - -@Message -public class DefaultNodeOperationContainer { - - public int pos; - public String key; - public Value value; - public Value commandValue; - - public static void main(String[] args) throws IOException { - String key = "hoge"; - ByteBuffer b = ByteBuffer.wrap("messagepack value".getBytes()); - PutAttributeOperation op = new PutAttributeOperation(key, b); - DefaultNodeOperationContainer container = new DefaultNodeOperationContainer(); - container.unconvert(op); - NodeOperation convertedOp = container.convert(); - System.out.println("pos : "+convertedOp.getPosition()); - System.out.println("Command : "+convertedOp.getCommand()); - System.out.println("key : "+convertedOp.getKey()); - System.out.println("value : "+new String(convertedOp.getValue().array())); - - } - - public DefaultNodeOperationContainer() { - - } - - public void unconvert(NodeOperation op) throws IOException { -// MessagePack msgpack = new MessagePack(); - MessagePack msgpack = SingletonMessage.getInstance(); - pos = op.getPosition(); - key = op.getKey(); - value = null; - if (op.getValue() != null) { - ByteBuffer b = op.getValue(); - byte[] bytes = b.array(); - Value v = msgpack.unconvert(bytes); - value = v; - } - Command c = op.getCommand(); - msgpack.register(Command.class, new OrdinalEnumTemplate(Command.class)); - Value cValue = msgpack.unconvert(c); - commandValue = cValue; - } - - public NodeOperation convert() throws IOException{ -// MessagePack msgpack = new MessagePack(); - MessagePack msgpack = SingletonMessage.getInstance(); - msgpack.register(Command.class, new OrdinalEnumTemplate(Command.class)); - Command c = msgpack.convert(commandValue, Command.class); - ByteBuffer b = null; - if (value != null) { - b = ByteBuffer.wrap(msgpack.convert(value, byte[].class)); - } - if (c == Command.PUT_ATTRIBUTE) { - return new PutAttributeOperation(key, b); - } else if (c == Command.APPEND_CHILD) { - return new AppendChildAtOperation(pos); - } else if (c == Command.DELETE_CHILD) { - return new DeleteChildAtOperation(pos); - } else if (c == Command.DELETE_ATTRIBUTE){ - return new DeleteAttributeOperation(key); - } - return null; - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/datasegment/store/container/DefaultNodePathContainer.java --- a/src/alice/jungle/datasegment/store/container/DefaultNodePathContainer.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -package alice.jungle.datasegment.store.container; - -import java.io.IOException; -import java.util.LinkedList; -import java.util.List; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; - -import org.msgpack.MessagePack; -import org.msgpack.annotation.Message; -import org.msgpack.template.IntegerTemplate; -import org.msgpack.template.ListTemplate; -import org.msgpack.type.Value; - -@Message -public class DefaultNodePathContainer { - - public Value pathValue; - - public static void main(String[] args) throws IOException { - DefaultNodePath p = new DefaultNodePath(); - p = p.add(1).add(2).add(3); - DefaultNodePathContainer pathContainer = new DefaultNodePathContainer(); - pathContainer.unconvert(p); - NodePath convertedPath = pathContainer.convert(); - for (int i : convertedPath) { - System.out.println(i); - } - } - - public DefaultNodePathContainer() { - - } - - public void unconvert(NodePath path) throws IOException { - MessagePack msgpack = new MessagePack(); - List list = new LinkedList(); - for(Integer i : path) { - list.add(i); - } - /* Remove first Element(-1). */ - list.remove(0); - Value v = msgpack.unconvert(list); - pathValue = v; - } - - public DefaultNodePath convert() throws IOException { - MessagePack msgpack = new MessagePack(); - msgpack.register(List.class, new ListTemplate(IntegerTemplate.getInstance())); - List convertedList = (List)msgpack.convert(pathValue, List.class); - DefaultNodePath path = new DefaultNodePath(); - for (int i: convertedList) { - path = path.add(i); - } - return path; - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/datasegment/store/container/DefaultTreeOperationContainer.java --- a/src/alice/jungle/datasegment/store/container/DefaultTreeOperationContainer.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -package alice.jungle.datasegment.store.container; - -import java.io.IOException; -import java.nio.ByteBuffer; - -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.DefaultNodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DefaultTreeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.PutAttributeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; - -import org.msgpack.MessagePack; -import org.msgpack.annotation.Message; -import org.msgpack.type.Value; - -import alice.codesegment.SingletonMessage; - -@Message -public class DefaultTreeOperationContainer { - - Value pathValue; - Value opValue; - - public static void main(String[] args) throws IOException { - String key = "hoge"; - ByteBuffer b = ByteBuffer.wrap("messagepack value".getBytes()); - PutAttributeOperation op = new PutAttributeOperation(key, b); - - DefaultNodePath p = new DefaultNodePath(); - p = p.add(1).add(2).add(3); - DefaultTreeOperation treeOp = new DefaultTreeOperation(p, op); - - DefaultTreeOperationContainer treeOperationContainer = new DefaultTreeOperationContainer(); - treeOperationContainer.unconvert(treeOp); - - TreeOperation treeOperation = treeOperationContainer.convert(); - NodePath nodePath = treeOperation.getNodePath(); - NodeOperation nodeOp = treeOperation.getNodeOperation(); - Command c = nodeOp.getCommand(); - String str = ""; - switch (c) { - case PUT_ATTRIBUTE: - String k = nodeOp.getKey(); - ByteBuffer value = nodeOp.getValue(); - if (value.limit() < 100) { - str = String.format("key:%s,value:%s", k, - new String(value.array())); - } else { - str = String.format("key:%s,value:%d", k, value.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, nodePath, str)); - for (int i: nodePath ) { - System.out.println(i); - } - } - - public DefaultTreeOperationContainer() { - - } - - public void unconvert(DefaultTreeOperation _op) throws IOException { - NodeOperation nodeOp = _op.getNodeOperation(); - NodePath nodePath = _op.getNodePath(); - DefaultNodeOperationContainer opContainer = new DefaultNodeOperationContainer(); - opContainer.unconvert(nodeOp); - DefaultNodePathContainer pathContainer = new DefaultNodePathContainer(); - pathContainer.unconvert(nodePath); - unconvert(opContainer, pathContainer); - } - - public void unconvert(DefaultNodeOperationContainer _op, - DefaultNodePathContainer _path) throws IOException { -// MessagePack msgpack = new MessagePack(); - MessagePack msgpack = SingletonMessage.getInstance(); - pathValue = msgpack.unconvert(_path); - opValue = msgpack.unconvert(_op); - } - - public TreeOperation convert() throws IOException { -// MessagePack msgpack = new MessagePack(); - MessagePack msgpack = SingletonMessage.getInstance(); - DefaultNodePathContainer pathContainer = msgpack.convert(pathValue, DefaultNodePathContainer.class); - DefaultNodeOperationContainer opContainer = msgpack.convert(opValue, DefaultNodeOperationContainer.class); - return new DefaultTreeOperation(pathContainer.convert(), opContainer.convert()); - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/datasegment/store/container/DefaultTreeOperationLogContainer.java --- a/src/alice/jungle/datasegment/store/container/DefaultTreeOperationLogContainer.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,114 +0,0 @@ -package alice.jungle.datasegment.store.container; - -import java.io.IOException; -import java.util.LinkedList; -import java.util.List; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultTreeOperationLog; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DefaultTreeOperation; -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 org.msgpack.MessagePack; -import org.msgpack.annotation.Message; -import org.msgpack.template.ListTemplate; -import org.msgpack.template.ValueTemplate; -import org.msgpack.type.Value; - -import alice.codesegment.SingletonMessage; - -@Message -public class DefaultTreeOperationLogContainer { - - Value logValue; - String treeName; - String uuid; - String updaterName; - String revision; - long timestamp; - - public DefaultTreeOperationLogContainer() { - logValue = null; - treeName = ""; - uuid = ""; - updaterName = ""; - revision = ""; - timestamp = Long.MAX_VALUE; - } - - public void setTreeName(String _treeName) { - treeName = _treeName; - } - - public String getTreeName() { - return treeName; - } - - public void setUUID(String _uuid) { - uuid = _uuid; - } - - public String getUUID() { - return uuid; - } - - public void setUpdaterName(String _updaterName) { - updaterName = _updaterName; - } - - public String getServerName() { - return updaterName; - } - - public void setRevision(String _revision) { - revision = _revision; - } - - public String getRevision() { - return revision; - } - - public void setTimeStamp(long t) { - timestamp = t; - } - - public long getTimeStamp() { - return timestamp; - } - - public void unconvert(Iterable _log) throws IOException { - MessagePack msgpack = SingletonMessage.getInstance(); - List list = new LinkedList(); - for(TreeOperation op : _log) { - NodeOperation nOp = op.getNodeOperation(); - NodePath nodePath = op.getNodePath(); - DefaultTreeOperation treeOp = new DefaultTreeOperation(nodePath, nOp); - DefaultTreeOperationContainer container = new DefaultTreeOperationContainer(); - container.unconvert(treeOp); - Value v = msgpack.unconvert(container); - list.add(v); - } - Value listValue = msgpack.unconvert(list); - logValue = listValue; - } - - public DefaultTreeOperationLog convert() throws IOException { - MessagePack msgpack = SingletonMessage.getInstance(); - msgpack.register(List.class, new ListTemplate(ValueTemplate.getInstance())); - List listValue = msgpack.convert(logValue, List.class); - List logList = new LinkedList(); - for(Value v: listValue) { - DefaultTreeOperationContainer container = msgpack.convert(v, DefaultTreeOperationContainer.class); - logList.add(container.convert()); - } - DefaultTreeOperationLog log = new DefaultTreeOperationLog(logList, logList.size()); - return log; - } - - public String getHashLogString() { - return treeName + revision + updaterName; - } - - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/datasegment/store/transformer/NetworkAppendChildAt.java --- a/src/alice/jungle/datasegment/store/transformer/NetworkAppendChildAt.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -package alice.jungle.datasegment.store.transformer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; -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; - -import org.msgpack.annotation.Message; - - -/* - * This code same AppendChildAt. - */ - -@Message -public class NetworkAppendChildAt implements NodeEditor { - - private final int pos; - - public NetworkAppendChildAt(int _pos) { - pos = _pos; - } - - @Override - public > Either edit(T _e) { - Either either = _e.getChildren().addNewChildAt(pos); - if(either.isA()){ - // error - return either; - } - return DefaultEither.newB(either.b()); - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/operations/NetworkAppendChildAtOperation.java --- a/src/alice/jungle/operations/NetworkAppendChildAtOperation.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -package alice.jungle.operations; - -import java.nio.ByteBuffer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -import org.msgpack.annotation.Message; - -import alice.jungle.datasegment.store.transformer.NetworkAppendChildAt; - - -@Message -public class NetworkAppendChildAtOperation implements NodeOperation { - - /* MessagePack cannot handle final.*/ - // private final int pos; - private int pos; - - /* Position -1 represent root position. */ - public NetworkAppendChildAtOperation() { pos = -2; } - - public NetworkAppendChildAtOperation(int _pos) { - pos = _pos; - } - - @Override - public Command getCommand() { - return Command.APPEND_CHILD; - } - - @Override - public > Either invoke(T _target) { - NetworkAppendChildAt appendChildAt = new NetworkAppendChildAt(pos); - return appendChildAt.edit(_target); - } - - @Override - public int getPosition() { - return pos; - } - - @Override - public String getKey() { - return null; - } - - @Override - public ByteBuffer getValue() { - return null; - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/operations/NetworkDeleteAttributeOperation.java --- a/src/alice/jungle/operations/NetworkDeleteAttributeOperation.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -package alice.jungle.operations; - -import java.nio.ByteBuffer; - -import org.msgpack.annotation.Message; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteAttribute; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -@Message -public class NetworkDeleteAttributeOperation implements NodeOperation -{ - /* MessagePack cannot handle final.*/ - //private final String key; - private String key; - - public NetworkDeleteAttributeOperation() - { - key = null; - } - - public NetworkDeleteAttributeOperation(String _key) - { - key = _key; - } - - @Override - public Command getCommand() - { - return Command.DELETE_ATTRIBUTE; - } - - @Override - public > Either invoke(T _target) - { - DeleteAttribute deleteAttribute = new DeleteAttribute(key); - return deleteAttribute.edit(_target); - } - - @Override - public int getPosition() - { - return -1; - } - - @Override - public String getKey() - { - return key; - } - - @Override - public ByteBuffer getValue() - { - return null; - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/operations/NetworkDeleteChildAtOperation.java --- a/src/alice/jungle/operations/NetworkDeleteChildAtOperation.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -package alice.jungle.operations; - -import java.nio.ByteBuffer; - -import org.msgpack.annotation.Message; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteChildAt; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -@Message -public class NetworkDeleteChildAtOperation implements NodeOperation -{ - /* MessagePack cannot handle final.*/ - //private final int pos; - private int pos; - - - /* Position -1 represent root position. */ - public NetworkDeleteChildAtOperation(int _pos) - { - pos = _pos; - } - - @Override - public Command getCommand() - { - return Command.DELETE_CHILD; - } - - @Override - public > Either invoke(T _target) - { - DeleteChildAt deleteChildAt = new DeleteChildAt(pos); - return deleteChildAt.edit(_target); - } - - @Override - public int getPosition() - { - return pos; - } - - @Override - public String getKey() - { - return null; - } - - @Override - public ByteBuffer getValue() - { - return null; - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/operations/NetworkNodeOperation.java --- a/src/alice/jungle/operations/NetworkNodeOperation.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,114 +0,0 @@ -package alice.jungle.operations; - -import java.nio.ByteBuffer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteAttribute; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteChildAt; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -import org.msgpack.annotation.Message; - -import alice.jungle.datasegment.store.transformer.NetworkAppendChildAt; - -@Message -public class NetworkNodeOperation implements NodeOperation{ - - public int pos; - public String key; - 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; - value = null; - commandType = 0; - } - - public NetworkNodeOperation(NodeOperation _op) { - pos = _op.getPosition(); - key = _op.getKey(); - value = _op.getValue(); - commandType = getCommandType(_op.getCommand()); - } - - public static int getCommandType(Command c) { - switch(c) { - case PUT_ATTRIBUTE: - return NUM_PUT_ATTRIBUTE; - case APPEND_CHILD: - return NUM_APPEND_CHILD; - case DELETE_CHILD: - return NUM_DELETE_CHILD; - case DELETE_ATTRIBUTE: - return NUM_DELETE_ATTRIBUTE; - default: - break; - } - return 0; - } - - public static Command getCommand(int num) { - switch(num) { - case NUM_PUT_ATTRIBUTE: - return Command.PUT_ATTRIBUTE; - case NUM_APPEND_CHILD: - return Command.APPEND_CHILD; - case NUM_DELETE_CHILD: - return Command.DELETE_CHILD; - case NUM_DELETE_ATTRIBUTE: - return Command.DELETE_ATTRIBUTE; - default: - break; - } - return null; - } - - public Command getCommand() { - return getCommand(commandType); - } - - public int getPosition() { - return pos; - } - - public String getKey() { - return key; - } - - public ByteBuffer getValue() { - return value; - } - - @Override - public > Either invoke(T _target) { - switch(getCommand(commandType)) { - case PUT_ATTRIBUTE: - PutAttribute putAttribute = new PutAttribute(key,value); - return putAttribute.edit(_target); - case APPEND_CHILD: - NetworkAppendChildAt appendChildAt = new NetworkAppendChildAt(pos); - return appendChildAt.edit(_target); - case DELETE_CHILD: - DeleteChildAt deleteChildAt = new DeleteChildAt(pos); - return deleteChildAt.edit(_target); - case DELETE_ATTRIBUTE: - DeleteAttribute deleteAttribute = new DeleteAttribute(key); - return deleteAttribute.edit(_target); - default: - break; - } - return null; - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/operations/NetworkNodePath.java --- a/src/alice/jungle/operations/NetworkNodePath.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +0,0 @@ -package alice.jungle.operations; - -import java.util.Iterator; -import java.util.LinkedList; - -import org.msgpack.annotation.Message; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; - -@Message -public class NetworkNodePath implements NodePath -{ - LinkedList path; - - public NetworkNodePath() { - path = new LinkedList(); - path.add(-1); - } - - public NetworkNodePath(NodePath _p) { - path = new LinkedList(); - for(Integer pos: _p) { - path.add(pos); - } - } - - private NetworkNodePath(LinkedList _path) { - path = _path; - } - - @Override - public Iterator iterator() { - return path.iterator(); - } - - @Override - public NetworkNodePath add(int _pos) { - LinkedList newPath = copyPath(); - newPath.add(_pos); - return new NetworkNodePath(newPath); - } - - @Override - public Pair pop() { - LinkedList cPath = copyPath(); - int e = cPath.getFirst(); - cPath.remove(); - return new Pair(e, new NetworkNodePath(cPath)); - } - - @Override - public int size() { - return path.size(); - } - - private LinkedList copyPath() { - LinkedList newPath = new LinkedList(); - for (Integer i : path) { - newPath.add(i); - } - return newPath; - } - - @Override - public String toString() { - return path.toString(); - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/operations/NetworkPutAttributeOperation.java --- a/src/alice/jungle/operations/NetworkPutAttributeOperation.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -package alice.jungle.operations; - -import java.nio.ByteBuffer; - -import org.msgpack.annotation.Message; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -@Message -public class NetworkPutAttributeOperation implements NodeOperation -{ - -/* MessagePack cannot handle final. - * - * private final String key; - * private final ByteBuffer value; - */ - private String key; - private ByteBuffer value; - - public NetworkPutAttributeOperation() - { - key = null; - value = null; - } - - public NetworkPutAttributeOperation(String _key,ByteBuffer _value) - { - key = _key; - value = _value; - } - - @Override - public Command getCommand() - { - return Command.PUT_ATTRIBUTE; - } - - @Override - public > Either invoke(T _target) - { - PutAttribute putAttribute = new PutAttribute(key,value); - return putAttribute.edit(_target); - } - - @Override - public int getPosition() - { - return -1; - } - - @Override - public String getKey() - { - return key; - } - - @Override - public ByteBuffer getValue() - { - return value; - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/operations/NetworkTreeOperation.java --- a/src/alice/jungle/operations/NetworkTreeOperation.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -package alice.jungle.operations; - -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.operations.AppendChildAtOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteAttributeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteChildAtOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.PutAttributeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; - -import org.msgpack.annotation.Message; - -@Message -public class NetworkTreeOperation implements TreeOperation { - - public NetworkNodePath path; - public NetworkNodeOperation operation; - - public NetworkTreeOperation() { - path = null; - operation = null; - } - - public NetworkTreeOperation(TreeOperation treeOp) { - path = new NetworkNodePath(treeOp.getNodePath()); - operation = new NetworkNodeOperation(treeOp.getNodeOperation()); - } - - public NetworkTreeOperation(NodePath _p, NodeOperation _op) { - path = new NetworkNodePath(_p); - operation = new NetworkNodeOperation(_op); - } - - public NetworkTreeOperation(NetworkNodePath _p, NodeOperation _op) { - path = _p; - operation = new NetworkNodeOperation(_op); - } - - public NetworkTreeOperation(NodePath _p, NetworkNodeOperation _op) { - path = new NetworkNodePath(_p); - operation = _op; - } - - public NetworkTreeOperation(NetworkNodePath _p, NetworkNodeOperation _op) { - path = _p; - operation = _op; - } - - @Override - public NodePath getNodePath() { - return path; - } - - @Override - public NodeOperation getNodeOperation() { - Command c = operation.getCommand(); - switch(c) { - case PUT_ATTRIBUTE: - return new PutAttributeOperation(operation.getKey(), operation.getValue()); - case APPEND_CHILD: - return new AppendChildAtOperation(operation.getPosition()); - case DELETE_CHILD: - return new DeleteChildAtOperation(operation.getPosition()); - case DELETE_ATTRIBUTE: - return new DeleteAttributeOperation(operation.getKey()); - default: - break; - } - return null; - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/operations/NetworkTreeOperationLog.java --- a/src/alice/jungle/operations/NetworkTreeOperationLog.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,103 +0,0 @@ -package alice.jungle.operations; - -import java.util.Date; -import java.util.Iterator; -import java.util.LinkedList; - -import org.msgpack.annotation.Message; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; - -@Message -public class NetworkTreeOperationLog implements TreeOperationLog -{ - public LinkedList list; - public int size; - String uuid; - String treeName; - long timestamp; - - public NetworkTreeOperationLog() { - list = new LinkedList(); - size = 0; - treeName = ""; - timestamp = new Date().getTime(); - } - - public NetworkTreeOperationLog(String _uuid, String _treeName, Iterable _list) - { - this(_uuid, _treeName, _list, new Date().getTime()); - } - - public NetworkTreeOperationLog(String _uuid, String _treeName, Iterable _list, long _timestamp) - { - uuid = _uuid; - treeName = _treeName; - list = new LinkedList(); - timestamp = _timestamp; - for(TreeOperation op: _list) { - NetworkTreeOperation nOp = new NetworkTreeOperation(op); - list.add(nOp); - } - size = list.size(); - } - - public NetworkTreeOperationLog(Iterable _list) - { - this("", "", _list); - } - - - @Override - public Iterator iterator() { - LinkedList opList = new LinkedList(); - for(NetworkTreeOperation op : list) { - opList.add(op); - } - return opList.iterator(); - } - - @Override - public NetworkTreeOperationLog add(NodePath _p, NodeOperation _op) - { - NetworkTreeOperation op = new NetworkTreeOperation(_p, _op); - list.add(op); - return this; - } - - @Override - public NetworkTreeOperationLog append(TreeOperationLog _log) - { - for (TreeOperation o : _log) { - NetworkTreeOperation op = new NetworkTreeOperation(o); - list.add(op); - } - return this; - } - - @Override - public int length() - { - return size; - } - - public String getUUID() { - return uuid; - } - - public String getTreeName() { - return treeName; - } - - public long getTimeStamp() { - return timestamp; - } - - public void setTimeStamp(long _timestamp) { - timestamp = _timestamp; - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/persistence/AliceJournal.java --- a/src/alice/jungle/persistence/AliceJournal.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -package alice.jungle.persistence; - -import java.nio.ByteBuffer; - -import alice.jungle.datasegment.store.container.DefaultNodeOperationContainer; -import alice.jungle.datasegment.store.container.DefaultTreeOperationContainer; - -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.Command; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; - -public class AliceJournal implements Journal { - - private static final AliceChangeListWriter ALICE_WRITER = new AliceChangeListWriter(); - private static final AliceChangeListReader ALICE_READER = new AliceChangeListReader(); - @Override - public ChangeListReader getReader() { - return ALICE_READER; - } - @Override - public ChangeListWriter getWriter() { - return ALICE_WRITER; - } - - private static class AliceChangeListWriter implements ChangeListWriter - { - @Override - public Result write(ChangeList _operations) - { - /* - for(TreeOperation op : _operations){ - NodePath p = op.getNodePath(); - NodeOperation nodeOp = op.getNodeOperation(); - Command c = nodeOp.getCommand(); - String args = ""; - switch(c){ - case PUT_ATTRIBUTE: - String key = nodeOp.getKey(); - ByteBuffer value = nodeOp.getValue(); - if(value.limit() < 100){ - args = String.format("key:%s,value:%s",key,new String(value.array())); - }else{ - args = String.format("key:%s,value:%d",key,value.limit()); - } - break; - case DELETE_ATTRIBUTE: - args = String.format("key:%s",nodeOp.getKey()); - break; - case APPEND_CHILD: - args = String.format("pos:%d",nodeOp.getPosition()); - break; - case DELETE_CHILD: - args = String.format("pos:%d",nodeOp.getPosition()); - break; - } - System.out.println(String.format("[%s:%s:%s]",c,p,args)); - } - */ - return Result.SUCCESS; - } - } - - private static class AliceChangeListReader implements ChangeListReader - { - @Override - public ChangeListReader newReader() - { - return this; - } - - @Override - public ChangeList read() - { - return null; - } - } - - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/persistence/JungleUpdater.java --- a/src/alice/jungle/persistence/JungleUpdater.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -package alice.jungle.persistence; - -import java.nio.ByteBuffer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; -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.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public class JungleUpdater { - - public JungleUpdater() { - - } - - public static Either edit(JungleTreeEditor _editor ,TreeOperationLog _log) { - JungleTreeEditor editor = _editor; - Either either = null; - for (TreeOperation op : _log) { - either = _edit(editor, op); - if(either.isA()) { - return either; - } - editor = either.b(); - } - return either; - } - - private static Either _edit(JungleTreeEditor editor, - TreeOperation op) { - DefaultNodePath path = new DefaultNodePath(); - NodeOperation nodeOp = op.getNodeOperation(); - int pos = nodeOp.getPosition(); - Command c = nodeOp.getCommand(); - String key = ""; - switch (c) { - case PUT_ATTRIBUTE: - key = nodeOp.getKey(); - ByteBuffer value = nodeOp.getValue(); - return editor.putAttribute(path, key, value); - case DELETE_ATTRIBUTE: - key = nodeOp.getKey(); - return editor.deleteAttribute(path, key); - case APPEND_CHILD: - return editor.addNewChildAt(path, pos); - case DELETE_CHILD: - return editor.deleteChildAt(path, 0); - } - return null; - } - - - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/persistence/PersistentChangeList.java --- a/src/alice/jungle/persistence/PersistentChangeList.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -package alice.jungle.persistence; - -import java.util.Iterator; - -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.store.ChangeSet; -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; - -public class PersistentChangeList implements ChangeList { - - public NetworkTreeOperationLog log; - public String treeName; - public String uuid; - - public PersistentChangeList(String _uuid, String _treeName, TreeOperationLog _log) { - uuid = _uuid; - treeName = _treeName; - log = new NetworkTreeOperationLog(_log); - } - - public PersistentChangeList(NetworkTreeOperationLog _log) { - log = _log; - treeName = _log.getTreeName(); - uuid = _log.getUUID(); - } - - public PersistentChangeList(ChangeSet cs) { - treeName = cs.getTreeName(); - uuid = cs.uuid(); - log = new NetworkTreeOperationLog(cs.getChangeList()); - } - - @Override - public Iterator iterator() { - return log.iterator(); - } - - public NetworkTreeOperationLog getTreeOperationLog() { - return log; - } - - public String getTreeName() { - return treeName; - } - - public String uuid() { - return uuid; - } - - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/persistence/PersistentChangeListReader.java --- a/src/alice/jungle/persistence/PersistentChangeListReader.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -package alice.jungle.persistence; - -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; - -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; - -public class PersistentChangeListReader implements ChangeListReader { - - private static InputStream in; - MessagePack msgpack = PersistentJournal.getMessagePack(); - - public PersistentChangeListReader() { - in = null; - } - - public PersistentChangeListReader(InputStream _in) { - in = _in; - } - - @Override - public ChangeListReader newReader() - { - return new PersistentChangeListReader(); - } - - @Override - public ChangeList read() - { - try { - final NetworkTreeOperationLog readLog = msgpack.read(in, NetworkTreeOperationLog.class); - PersistentChangeList cl = new PersistentChangeList(readLog); - return cl; - } catch (EOFException e){ - - } catch (IOException e) { - } - return null; - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/persistence/PersistentChangeListWriter.java --- a/src/alice/jungle/persistence/PersistentChangeListWriter.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -package alice.jungle.persistence; - -import java.io.IOException; -import java.io.OutputStream; - -import org.msgpack.MessagePack; - -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 alice.jungle.operations.NetworkTreeOperationLog; - -public class PersistentChangeListWriter implements ChangeListWriter { - - MessagePack msgpack = PersistentJournal.getMessagePack(); - OutputStream out; - - public PersistentChangeListWriter(OutputStream _out) { - out = _out; - } - - @Override - public Result write(ChangeList cs) - { - NetworkTreeOperationLog log = new NetworkTreeOperationLog(cs.uuid(), cs.getTreeName(), cs); - try { - msgpack.write(out, log); - out.flush(); - return Result.SUCCESS; - } catch (IOException e) { - } - return null; - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/persistence/PersistentChangeSet.java --- a/src/alice/jungle/persistence/PersistentChangeSet.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -package alice.jungle.persistence; - -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.store.ChangeSet; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; - -public class PersistentChangeSet implements ChangeSet -{ - private final Node root; - private final ChangeSet previous; - private final ChangeList changeList; - private final String uuid; - private final long revision; - private final String treeName; - - public PersistentChangeSet(Node _node,ChangeSet _prev,ChangeList _log,String _uuid, String _treeName, long _revision) - { - root = _node; - previous = _prev; - changeList = _log; - uuid = _uuid; - revision = _revision; - treeName = _treeName; - } - - @Override - public Node getRoot() - { - return root; - } - - @Override - public ChangeSet prev() - { - return previous; - } - - @Override - public ChangeList getChangeList() - { - return changeList; - } - - @Override - public String uuid() - { - return uuid; - } - - @Override - public long revision() - { - return revision; - } - - @Override - public Iterable getOperations() - { - return changeList; - } - - public String getTreeName() { - return treeName; - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/persistence/PersistentJournal.java --- a/src/alice/jungle/persistence/PersistentJournal.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -package alice.jungle.persistence; - -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 org.msgpack.MessagePack; - -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; - -public class PersistentJournal implements Journal { - - private static ChangeListWriter WRITER; - private static ChangeListReader READER; - private static MessagePack msgpack; - private static OutputStream out = null; - private static InputStream in = null; - - public PersistentJournal() { - msgpack = new MessagePack(); - } - - public PersistentJournal(File file) throws FileNotFoundException { - out = new FileOutputStream(file); - in = new FileInputStream(file); - WRITER = new PersistentChangeListWriter(out); - READER = new PersistentChangeListReader(in); - msgpack = new MessagePack(); - } - - @Override - public ChangeListReader getReader() { - return READER; - } - - @Override - public ChangeListWriter getWriter() { - return WRITER; - } - - public void setOutputFile(File file) throws FileNotFoundException { - out = new FileOutputStream(file); - WRITER = new PersistentChangeListWriter(out); - } - - public void setInputFile(File file) throws FileNotFoundException { - in = new FileInputStream(file); - READER = new PersistentChangeListReader(in); - } - - 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; - } - - public static MessagePack getMessagePack() { - return msgpack; - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/persistence/PersistentJungle.java --- a/src/alice/jungle/persistence/PersistentJungle.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -package alice.jungle.persistence; - -import java.util.Iterator; -import java.util.concurrent.ConcurrentHashMap; - -import fj.data.List; - -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.persistent.ChangeList; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; - -public class PersistentJungle implements Jungle { - private PersistentJournal journal; - private ConcurrentHashMap trees; - final private String uuid; - private TreeEditor editor; - - public PersistentJungle(PersistentJournal _journal,String _uuid,TreeEditor _editor) - { - journal = _journal; - trees = new ConcurrentHashMap(); - uuid = _uuid; - editor = _editor; - } - - @Override - public JungleTree getTreeByName(String _name) - { - return trees.get(_name); - } - - @Override - public JungleTree createNewTree(final String _name) - { - ChangeList list = new ChangeList(){ - @Override - public Iterator iterator() { - List nil = List.nil(); - return nil.iterator(); - } - @Override - public String uuid() { - return uuid; - } - @Override - public String getTreeName() { - return _name; - } - }; - DefaultTreeNode root = new DefaultTreeNode(); - ChangeSet set = new PersistentChangeSet(root.getAsNode(),null,list,uuid,_name,0); - DefaultTreeContext tc = new DefaultTreeContext(root,set); - JungleTree newTree = new PersistentJungleTree(_name, tc,uuid, journal.getWriter(),editor); - if(trees.putIfAbsent(_name,newTree) != null){ - return null; - } - return newTree; - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/persistence/PersistentJungleTree.java --- a/src/alice/jungle/persistence/PersistentJungleTree.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +0,0 @@ -package alice.jungle.persistence; - -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.ChangeListWriter; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultJungleTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext; - -public class PersistentJungleTree > implements JungleTree { - private final AtomicReservableReference> repository; - private final String uuid; - private final String treeName; - private final ChangeListWriter writer; - private final TreeEditor editor; - - public PersistentJungleTree(String _treeName, TreeContext _tc,String _uuid, ChangeListWriter _writer,TreeEditor _editor) - { - treeName = _treeName; - repository = new AtomicReservableReference>(_tc); - uuid = _uuid; - writer = _writer; - editor = _editor; - } - - @Override - public JungleTreeEditor getTreeEditor() - { - TreeContext tc = repository.get(); - PersistentTransactionManager txManager = new PersistentTransactionManager(treeName, writer,tc,repository,uuid); - T root = tc.getTreeNode(); - return new DefaultJungleTreeEditor(root,txManager,editor); - } - - @Override - public Node getRootNode() - { - TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); - return cs.getRoot(); - } - - @Override - public JungleTreeEditor getLocalTreeEditor() { - return getTreeEditor(); - } - - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/persistence/PersistentTransactionManager.java --- a/src/alice/jungle/persistence/PersistentTransactionManager.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -package alice.jungle.persistence; - -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.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.transaction.AtomicReservableReference; -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.transaction.AtomicReservableReference.Reservation; -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 PersistentTransactionManager> implements TransactionManager { - private final AtomicReservableReference> repository; - private final TreeContext tip; - private final ChangeListWriter writer; - private final String uuid; - private final String treeName; - - public PersistentTransactionManager(String _treeName, ChangeListWriter _writer,TreeContext _tip, - AtomicReservableReference> _repository,String _uuid) - { - repository = _repository; - tip = _tip; - writer = _writer; - uuid = _uuid; - treeName = _treeName; - } - - @Override - public Either> commit(T _newRoot,final TreeOperationLog _log) { - ChangeSet cs = tip.getChangeSet(); - long currentRevision = cs.revision(); - long nextRevision = currentRevision + 1; - - PersistentChangeList list = new PersistentChangeList(uuid, treeName, _log); - Node root = _newRoot.getAsNode(); - PersistentChangeSet newCs = new PersistentChangeSet(root, cs, list, uuid, treeName, nextRevision); - DefaultTreeContext newContext = new DefaultTreeContext(_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) { - return DefaultEither.newA((Error)new DefaultError()); - } - reservation.confirm(); - TransactionManager txManager = new PersistentTransactionManager(treeName, writer, newContext, repository, uuid); - return DefaultEither.newB(txManager); - } - - @Override - public long getRevision() - { - ChangeSet cs = tip.getChangeSet(); - return cs.revision(); - } - - @Override - public String getUUID() { - return uuid; - } - - - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/remote/RemoteConfig.java --- a/src/alice/jungle/remote/RemoteConfig.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -package alice.jungle.remote; -import alice.topology.node.TopologyNodeConfig; - - -public class RemoteConfig extends TopologyNodeConfig { - - public int bbsPort = 8080; - - public RemoteConfig(String[] args) { - super(args); - for (int i = 0; i< args.length; i++) { - if ("-bbsPort".equals(args[i])) { - bbsPort = Integer.parseInt(args[++i]); - } else if("-bp".equals(args[i])) { - bbsPort = Integer.parseInt(args[++i]); - } - } - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/transaction/NetworkDefaultJungleTree.java --- a/src/alice/jungle/transaction/NetworkDefaultJungleTree.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -package alice.jungle.transaction; - -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.ChangeListWriter; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext; - -public class NetworkDefaultJungleTree> implements JungleTree { - private final AtomicReservableReference> repository; - private final String uuid; - private final String treeName; - private final ChangeListWriter writer; - private final TreeEditor editor; - - public NetworkDefaultJungleTree(String _treeName, TreeContext _tc,String _uuid,ChangeListWriter _writer,TreeEditor _editor) - { - treeName = _treeName; - repository = new AtomicReservableReference>(_tc); - uuid = _uuid; - writer = _writer; - editor = _editor; - } - - @Override - public JungleTreeEditor getTreeEditor() - { - TreeContext tc = repository.get(); - NetworkTransactionManager txManager = new NetworkTransactionManager(treeName, writer,tc,repository,uuid); - T root = tc.getTreeNode(); - return new NetworkDefaultJungleTreeEditor(treeName, root,txManager,editor); - } - - @Override - public JungleTreeEditor getLocalTreeEditor() - { - TreeContext tc = repository.get(); - NetworkTransactionManager txManager = new NetworkTransactionManager(treeName, writer,tc,repository,uuid); - T root = tc.getTreeNode(); - return NetworkDefaultJungleTreeEditor.NewLocalJungleTreeEditor(treeName,root,txManager, editor); - } - - @Override - public Node getRootNode() - { - TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); - return cs.getRoot(); - } - - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/transaction/NetworkDefaultJungleTreeEditor.java --- a/src/alice/jungle/transaction/NetworkDefaultJungleTreeEditor.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,194 +0,0 @@ -package alice.jungle.transaction; - - -import java.io.IOException; -import java.nio.ByteBuffer; - -import alice.jungle.operations.NetworkTreeOperationLog; -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.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultTreeOperationLog; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNodeHook; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DefaultTreeOperation; -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.store.trasnformer.AppendChildAt; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteAttribute; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteChildAt; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager; -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; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter; -import jungle.app.bbs.codesegment.NullCodeSegment; - -public class NetworkDefaultJungleTreeEditor> implements JungleTreeEditor { - - private final TransactionManager txManager; - private final T root; - private final TreeEditor editor; - private final String treeName; - private final TreeOperationLog log; - private boolean exportLog; - - public NetworkDefaultJungleTreeEditor(String _treeName, T _root,TransactionManager _txManager,TreeEditor _editor) - { - this(_treeName, _root,_txManager,_editor,new DefaultTreeOperationLog()); - } - - public NetworkDefaultJungleTreeEditor(String _treeName, T _root,TransactionManager _txManager,TreeEditor _editor, TreeOperationLog _log) - { - treeName = _treeName; - root = _root; - txManager = _txManager; - editor = _editor; - log = _log; - exportLog = true; - } - - public static > NetworkDefaultJungleTreeEditor NewLocalJungleTreeEditor(String _treeName, T1 _root,TransactionManager _txManager,TreeEditor _editor) { - NetworkDefaultJungleTreeEditor treeEditor = new NetworkDefaultJungleTreeEditor(_treeName, _root,_txManager,_editor,new DefaultTreeOperationLog()); - treeEditor.exportLog = false; - return treeEditor; - } - - public static > NetworkDefaultJungleTreeEditor NewLocalJungleTreeEditor(String _treeName, T1 _root,TransactionManager _txManager,TreeEditor _editor, TreeOperationLog _log) { - NetworkDefaultJungleTreeEditor treeEditor = new NetworkDefaultJungleTreeEditor(_treeName, _root,_txManager,_editor,_log); - treeEditor.exportLog = false; - return treeEditor; - } - - private Either _edit(final NodePath _path,NodeEditor _e) - { - LoggingNodeHook hook = new LoggingNodeHook(_e); - Either either = editor.edit(root,_path,hook); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - - T newNode = either.b(); - OperationLog newLog = hook.getLog(); - - IterableConverter.Converter converter = new IterableConverter.Converter(){ - @Override - public TreeOperation conv(NodeOperation _b){ - return new DefaultTreeOperation(_path,_b); - } - }; - - Iterable iterable = new IterableConverter(newLog,converter); - DefaultTreeOperationLog treeOperationLog = new DefaultTreeOperationLog(iterable,newLog.length()); - TreeOperationLog newTreeOpLog = log.append(treeOperationLog); - - JungleTreeEditor newEditor; - if(exportLog) { - newEditor = new NetworkDefaultJungleTreeEditor(treeName, newNode,txManager,editor,newTreeOpLog); - } else { - newEditor = NetworkDefaultJungleTreeEditor.NewLocalJungleTreeEditor(treeName, newNode, txManager, editor, newTreeOpLog); - } - return DefaultEither.newB(newEditor); - } - - @Override - public Either addNewChildAt(NodePath _path, int _pos) - { - AppendChildAt appendChildAt = new AppendChildAt(_pos); - return _edit(_path,appendChildAt); - } - - @Override - public Either deleteChildAt(NodePath _path, int _pos) - { - DeleteChildAt deleteChildAt = new DeleteChildAt(_pos); - return _edit(_path,deleteChildAt); - } - - @Override - public Either putAttribute(NodePath _path,String _key,ByteBuffer _value) - { - PutAttribute putAttribute = new PutAttribute(_key,_value); - return _edit(_path,putAttribute); - } - - @Override - public Either deleteAttribute(NodePath _path, String _key) - { - DeleteAttribute deleteAttribute = new DeleteAttribute(_key); - return _edit(_path,deleteAttribute); - } - - @Override - public Either edit(NodePath _path,NodeEditor _editor) - { - return _edit(_path,_editor); - } - - @Override - public Either success() - { - Either> either = txManager.commit(root,log); - if(either.isA()){ - return DefaultEither.newA(either.a()); - } - if(exportLog) { - try { - putTreeOperationLog(log); - } catch (IOException e) { - return DefaultEither.newA(either.a()); - } - } - - TransactionManager newTxManager = either.b(); - JungleTreeEditor newTreeEditor = new NetworkDefaultJungleTreeEditor(treeName, root,newTxManager,editor); - - return DefaultEither.newB(newTreeEditor); - } - - @Override - public String getID() - { - return txManager.getUUID(); - } - - @Override - public String getRevision() - { - return Long.toString(txManager.getRevision()); - } - - @Override - public Node getRoot() - { - return root.getAsNode(); - } - - public String getTreeName() { - return treeName; - } - - public TreeOperationLog getTreeOperationLog() { - return log; - } - - public void putTreeOperationLog(Iterable newLog) throws IOException { - String uuid = getID(); - String treeName = getTreeName(); - String updaterName = getID(); - String revision = getRevision(); - putDataSegment(uuid, treeName, updaterName, newLog, revision); - } - - public void putDataSegment(String _uuid, String _treeName, String _updaterName, Iterable newLog, String nextRevision) throws IOException { - NetworkTreeOperationLog netLog = new NetworkTreeOperationLog(_uuid, _treeName,newLog); - NullCodeSegment cs = new NullCodeSegment(); - cs.ods.put("log", netLog); - cs.execute(); /* Do nothing CodeSegment */ - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/alice/jungle/transaction/NetworkTransactionManager.java --- a/src/alice/jungle/transaction/NetworkTransactionManager.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ -package alice.jungle.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> implements TransactionManager -{ - - private final AtomicReservableReference> repository; - private final TreeContext tip; - private final ChangeListWriter writer; - private final String uuid; - private final String treeName; - - public NetworkTransactionManager(String _treeName, ChangeListWriter _writer,TreeContext _tip, - AtomicReservableReference> _repository,String _uuid) - { - repository = _repository; - tip = _tip; - writer = _writer; - uuid = _uuid; - treeName = _treeName; - } - - @Override - public Either> 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 iterator(){ - return _log.iterator(); - } - @Override - public String uuid() { - return uuid; - } - @Override - public String getTreeName() { - return treeName; - } - }; - - Node root = _newRoot.getAsNode(); - DefaultChangeSet newCs = new DefaultChangeSet(root, cs, list, uuid, treeName, nextRevision); - DefaultTreeContext newContext = new DefaultTreeContext(_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) { - return DefaultEither.newA((Error)new DefaultError()); - } - reservation.confirm(); - TransactionManager txManager = new NetworkTransactionManager(treeName, writer, newContext, repository, uuid); - return DefaultEither.newB(txManager); - } - - @Override - public long getRevision() - { - ChangeSet cs = tip.getChangeSet(); - return cs.revision(); - } - - @Override - public String getUUID() { - return uuid; - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/jungle/app/bbs/BoardMessage.java --- a/src/jungle/app/bbs/BoardMessage.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -package jungle.app.bbs; - -public interface BoardMessage -{ - public String getUUID(); - public String getAuthor(); - public String getMessage(); -} diff -r 03bf62bb699e -r f9e29a52efd3 src/jungle/app/bbs/BulletinBoard.java --- a/src/jungle/app/bbs/BulletinBoard.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -package jungle.app.bbs; - -public interface BulletinBoard -{ - public Iterable getBoards(); - public void createBoards(String _name,String _author,String _initMessage,String _editKey); - public void createBoardMessage(String _board,String _author,String _message,String _editKey); - public void editMessage(String _board,String _uuid,String _author,String _message,String _editKey); - - public Iterable getMessages(String _boardName); -} diff -r 03bf62bb699e -r f9e29a52efd3 src/jungle/app/bbs/CassandraBulletinBoard.java --- a/src/jungle/app/bbs/CassandraBulletinBoard.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,192 +0,0 @@ -package jungle.app.bbs; - -import java.util.Collections; -import java.util.List; -import java.util.UUID; - -import org.apache.cassandra.locator.SimpleStrategy; - -import me.prettyprint.cassandra.serializers.StringSerializer; -import me.prettyprint.cassandra.serializers.UUIDSerializer; -import me.prettyprint.cassandra.service.CassandraHost; -import me.prettyprint.cassandra.service.template.SuperCfResult; -import me.prettyprint.cassandra.service.template.SuperCfUpdater; -import me.prettyprint.cassandra.service.template.ThriftSuperCfTemplate; -import me.prettyprint.cassandra.utils.TimeUUIDUtils; -import me.prettyprint.hector.api.Cluster; -import me.prettyprint.hector.api.Keyspace; -import me.prettyprint.hector.api.beans.HSuperColumn; -import me.prettyprint.hector.api.beans.OrderedSuperRows; -import me.prettyprint.hector.api.beans.SuperRow; -import me.prettyprint.hector.api.beans.SuperSlice; -import me.prettyprint.hector.api.ddl.ColumnFamilyDefinition; -import me.prettyprint.hector.api.ddl.ColumnType; -import me.prettyprint.hector.api.ddl.ComparatorType; -import me.prettyprint.hector.api.ddl.KeyspaceDefinition; -import me.prettyprint.hector.api.factory.HFactory; -import me.prettyprint.hector.api.query.QueryResult; -import me.prettyprint.hector.api.query.RangeSuperSlicesQuery; -import me.prettyprint.hector.api.query.SuperSliceQuery; - -public class CassandraBulletinBoard implements BulletinBoard -{ - private final String address; - private final String clusterName; - private final Cluster cluster; - private final String keyspace; - - private static final String COLUMN_FAMILY_BOARD = "boards"; - - public CassandraBulletinBoard(String _clusterName,String _address,String _keyspaceName) - { - address = _address; - clusterName = _clusterName; - keyspace = _keyspaceName; - cluster = HFactory.getOrCreateCluster(clusterName,address); - - initialize(); - } - - private void initialize() - { - if(cluster.describeKeyspace(keyspace) == null){ - KeyspaceDefinition keyspaceDefinition = HFactory.createKeyspaceDefinition(keyspace, - SimpleStrategy.class.getName(),1,Collections. emptyList()); - cluster.addKeyspace(keyspaceDefinition,false); - ColumnFamilyDefinition columnFamilyDefinition = HFactory.createColumnFamilyDefinition(keyspace,COLUMN_FAMILY_BOARD,ComparatorType.UUIDTYPE); - columnFamilyDefinition.setColumnType(ColumnType.SUPER); - cluster.addColumnFamily(columnFamilyDefinition); - } - } - - public Iterable getBoards() - { - Keyspace ksp = HFactory.createKeyspace(keyspace, cluster); - RangeSuperSlicesQuery query = HFactory.createRangeSuperSlicesQuery(ksp,StringSerializer.get(), - UUIDSerializer.get(),StringSerializer.get(),StringSerializer.get()); - query.setColumnFamily(COLUMN_FAMILY_BOARD).setKeys(null,null).setRange(null,null,false,0); - - QueryResult> result = query.execute(); - OrderedSuperRows rows = result.get(); - List> list = rows.getList(); - - IterableConverter.Converter> converter - = new IterableConverter.Converter>(){ - public String conv(SuperRow _b) { - return _b.getKey(); - } - }; - - return new IterableConverter>(list,converter); - } - - private static final String COLUMN_MESSAGE_AUTHOR = "author"; - private static final String COLUMN_MESSAGE_BODY = "message"; - private static final String COLUMN_MESSAGE_EDIT_KEY = "edit"; - - public void createBoardMessage(UUID _time,String _name,String _author,String _message,String _editKey) - { - Keyspace ksp = HFactory.createKeyspace(keyspace,cluster); - ThriftSuperCfTemplate template = - new ThriftSuperCfTemplate(ksp,COLUMN_FAMILY_BOARD,StringSerializer.get(), - UUIDSerializer.get(),StringSerializer.get()); - - SuperCfUpdater updater = template.createUpdater(_name,_time); - updater.setString(COLUMN_MESSAGE_AUTHOR,_author); - updater.setString(COLUMN_MESSAGE_BODY,_message); - updater.setString(COLUMN_MESSAGE_EDIT_KEY,_editKey); - - template.update(updater); - } - - public void createBoards(String _name,String _author,String _initMessage,String _editKey) - { - UUID time = TimeUUIDUtils.getTimeUUID(0); - createBoardMessage(time,_name,_author,_initMessage,_editKey); - } - - public Iterable getMessages(String _boardName) - { - Keyspace ksp = HFactory.createKeyspace(keyspace,cluster); - SuperSliceQuery query = HFactory.createSuperSliceQuery(ksp, StringSerializer.get(), UUIDSerializer.get(), StringSerializer.get(), StringSerializer.get()); - - UUID start = TimeUUIDUtils.getTimeUUID(0); - query.setKey(_boardName).setColumnFamily(COLUMN_FAMILY_BOARD).setRange(start,null,false,100); - - QueryResult> result = query.execute(); - SuperSlice ss = result.get(); - List> list = ss.getSuperColumns(); - - IterableConverter.Converter> converter = - new IterableConverter.Converter>(){ - public BoardMessage conv(HSuperColumn _b){ - UUID uuid = _b.getName(); - String author = _b.getSubColumnByName(COLUMN_MESSAGE_AUTHOR).getValue(); - String message = _b.getSubColumnByName(COLUMN_MESSAGE_BODY).getValue(); - BoardMessageImpl bm = new BoardMessageImpl(author,message,uuid.toString()); - return bm; - } - }; - - - return new IterableConverter>(list,converter); - } - - private static class BoardMessageImpl implements BoardMessage - { - private final String author; - private final String message; - private final String uuid; - - public BoardMessageImpl(String _author,String _message,String _uuid) - { - author = _author; - message = _message; - uuid = _uuid; - } - - public String getAuthor() - { - return author; - } - - public String getMessage() - { - return message; - } - - public String getUUID() - { - return uuid; - } - } - - public void createBoardMessage(String _board, String _author, String _message,String _editKey) - { - UUID time = TimeUUIDUtils.getUniqueTimeUUIDinMillis(); - createBoardMessage(time,_board,_author,_message,_editKey); - } - - public void editMessage(String _board,String _uuid,String _author,String _message,String _editKey) - { - Keyspace ksp = HFactory.createKeyspace(keyspace, cluster); - UUID time = UUID.fromString(_uuid); - ThriftSuperCfTemplate template = - new ThriftSuperCfTemplate(ksp,COLUMN_FAMILY_BOARD,StringSerializer.get(), - UUIDSerializer.get(),StringSerializer.get()); - - SuperCfResult result = template.querySuperColumn(_board,time); - String editKey = result.getString(COLUMN_MESSAGE_EDIT_KEY); - if(!editKey.equals(editKey)){ - return; - } - - SuperCfUpdater updater = template.createUpdater(_board,time); - updater.setString(COLUMN_MESSAGE_AUTHOR,_author); - updater.setString(COLUMN_MESSAGE_BODY,_message); - updater.setString(COLUMN_MESSAGE_EDIT_KEY,_editKey); - - template.update(updater); - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/jungle/app/bbs/CreateBoardMessageServlet.java --- a/src/jungle/app/bbs/CreateBoardMessageServlet.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -package jungle.app.bbs; - -import java.io.PrintWriter; - -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public class CreateBoardMessageServlet extends HttpServlet -{ - private final BulletinBoard bbs; - private static final String PARAM_BOARD_NAME = "bname"; - private static final String PARAM_BOARD_AUTHOR = "author"; - private static final String PARAM_BOARD_MESSAGE= "msg"; - private static final String PARAM_BOARD_EDITKEY = "key"; - - private static final long serialVersionUID = 1L; - - public CreateBoardMessageServlet(BulletinBoard _bbs) - { - bbs = _bbs; - } - - @Override - public void doPost(HttpServletRequest _req,HttpServletResponse _res) - { - String boardName = _req.getParameter(PARAM_BOARD_NAME); - String author = _req.getParameter(PARAM_BOARD_AUTHOR); - String msg = _req.getParameter(PARAM_BOARD_MESSAGE); - String key = _req.getParameter(PARAM_BOARD_EDITKEY); - - try{ - bbs.createBoardMessage(boardName,author,msg,key); - PrintWriter pw = _res.getWriter(); - pw.write("successfully written"); - }catch(Exception _e){ - _res.setStatus(500); - } - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/jungle/app/bbs/CreateBoardServlet.java --- a/src/jungle/app/bbs/CreateBoardServlet.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -package jungle.app.bbs; - -import java.io.PrintWriter; - -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public class CreateBoardServlet extends HttpServlet -{ - private final BulletinBoard bbs; - private static final String PARAM_BOARD_NAME = "bname"; - private static final String PARAM_BOARD_AUTHOR = "author"; - private static final String PARAM_BOARD_INITMESSAGE= "msg"; - private static final String PARAM_BOARD_EDITKEY = "key"; - - private static final long serialVersionUID = 1L; - - public CreateBoardServlet(BulletinBoard _bbs) - { - bbs = _bbs; - } - - public void doPost(HttpServletRequest _req,HttpServletResponse _res) - { - String boardName = _req.getParameter(PARAM_BOARD_NAME); - String author = _req.getParameter(PARAM_BOARD_AUTHOR); - String msg = _req.getParameter(PARAM_BOARD_INITMESSAGE); - String key = _req.getParameter(PARAM_BOARD_EDITKEY); - - try{ - bbs.createBoards(boardName,author,msg,key); - PrintWriter pw = _res.getWriter(); - pw.write("successfully written"); - }catch(Exception _e){ - _res.setStatus(500); - } - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/jungle/app/bbs/DistributeApp.java --- a/src/jungle/app/bbs/DistributeApp.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -package jungle.app.bbs; - - -import jungle.app.bbs.codesegment.StartBBSCodeSegment; - - -import alice.jungle.remote.RemoteConfig; -import alice.topology.node.TopologyNode; - - -public class DistributeApp -{ - public static void main( String[] args ) throws Exception - { - RemoteConfig conf = new RemoteConfig(args); - new TopologyNode(conf, new StartBBSCodeSegment(conf.bbsPort)); - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/jungle/app/bbs/EditMessageServlet.java --- a/src/jungle/app/bbs/EditMessageServlet.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -package jungle.app.bbs; - -import java.io.PrintWriter; - -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public class EditMessageServlet extends HttpServlet -{ - private final BulletinBoard bbs; - private static final String PARAM_BOARD_NAME = "bname"; - private static final String PARAM_BOARD_MSGID = "uuid"; - private static final String PARAM_BOARD_AUTHOR = "author"; - private static final String PARAM_BOARD_MESSAGE= "msg"; - private static final String PARAM_BOARD_EDITKEY = "key"; - - private static final long serialVersionUID = 1L; - - public EditMessageServlet(BulletinBoard _bbs) - { - bbs = _bbs; - } - - public void doGet(HttpServletRequest _req,HttpServletResponse _res) - { - String bname = _req.getParameter(PARAM_BOARD_NAME); - String uuid = _req.getParameter(PARAM_BOARD_MSGID); - - - try{ - PrintWriter pw = _res.getWriter(); - pw.write("

edit message

"); - pw.write("
Author : " + - "" + - "\n"); - pw.write("

Message

\n"); - pw.write("

\n"); - pw.write(""); - pw.flush(); - }catch(Exception _e){ - _res.setStatus(500); - } - } - - public void doPost(HttpServletRequest _req,HttpServletResponse _res) - { - String boardName = _req.getParameter(PARAM_BOARD_NAME); - String author = _req.getParameter(PARAM_BOARD_AUTHOR); - String msg = _req.getParameter(PARAM_BOARD_MESSAGE); - String key = _req.getParameter(PARAM_BOARD_EDITKEY); - String uuid = _req.getParameter(PARAM_BOARD_MSGID); - - try{ - bbs.editMessage(boardName, uuid, author, msg, key); - PrintWriter pw = _res.getWriter(); - pw.write("successfully written"); - pw.flush(); - }catch(Exception _e){ - _res.setStatus(500); - } - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/jungle/app/bbs/HectorSample.java --- a/src/jungle/app/bbs/HectorSample.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +0,0 @@ -package jungle.app.bbs; - -import java.util.List; -import java.util.UUID; -import me.prettyprint.cassandra.serializers.StringSerializer; -import me.prettyprint.cassandra.serializers.UUIDSerializer; -import me.prettyprint.cassandra.service.template.SuperCfUpdater; -import me.prettyprint.cassandra.service.template.ThriftSuperCfTemplate; -import me.prettyprint.cassandra.utils.TimeUUIDUtils; -import me.prettyprint.hector.api.*; -import me.prettyprint.hector.api.beans.HColumn; -import me.prettyprint.hector.api.beans.HSuperColumn; -import me.prettyprint.hector.api.beans.OrderedSuperRows; -import me.prettyprint.hector.api.beans.SuperRow; -import me.prettyprint.hector.api.beans.SuperSlice; -import me.prettyprint.hector.api.factory.HFactory; -import me.prettyprint.hector.api.query.QueryResult; -import me.prettyprint.hector.api.query.RangeSuperSlicesQuery; -import me.prettyprint.hector.api.query.SuperSliceQuery; - -public class HectorSample -{ - public static void main(String _args[]) - { - Cluster myCluster = HFactory.getOrCreateCluster("test-cluster","localhost:9160"); - - Keyspace ksp = HFactory.createKeyspace("cassaBBS",myCluster); - /* - ColumnFamilyDefinition newCF = HFactory.createColumnFamilyDefinition("DEMO","ccc",ComparatorType.UUIDTYPE); - newCF.setColumnType(ColumnType.SUPER); - myCluster.addColumnFamily(newCF); - */ - - ThriftSuperCfTemplate template = - new ThriftSuperCfTemplate(ksp,"boards",StringSerializer.get(), - UUIDSerializer.get(),StringSerializer.get()); - UUID time = TimeUUIDUtils.getUniqueTimeUUIDinMillis(); - SuperCfUpdater updater = template.createUpdater("board1",TimeUUIDUtils.getTimeUUID(0)); - updater.setString("name","peter"); - updater.setString("message",time.toString()); - - template.update(updater); - - UUID start = TimeUUIDUtils.getTimeUUID(0); - - SuperSliceQuery sq = HFactory.createSuperSliceQuery(ksp, StringSerializer.get(), UUIDSerializer.get(), StringSerializer.get(), StringSerializer.get()); - sq.setKey("board1").setColumnFamily("ccc").setRange(start,null,false,100); - - QueryResult> results = sq.execute(); - - SuperSlice ss = results.get(); - List> list = ss.getSuperColumns(); - for(HSuperColumn sc : list){ - HColumn sub = sc.getSubColumnByName("name"); - System.out.println(sub.getValue()); - sub = sc.getSubColumnByName("message"); - System.out.println(sub.getValue()); - } - - RangeSuperSlicesQuery rsq = HFactory.createRangeSuperSlicesQuery(ksp,StringSerializer.get(), - UUIDSerializer.get(),StringSerializer.get(),StringSerializer.get()); - rsq.setKeys(null,null).setRange(null,null,false,0).setColumnFamily("ccc"); - - QueryResult> rsqResult = rsq.execute(); - OrderedSuperRows rows = rsqResult.get(); - for(SuperRow row : rows.getList()){ - System.out.println(row.getKey()); - } - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/jungle/app/bbs/IterableConverter.java --- a/src/jungle/app/bbs/IterableConverter.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -package jungle.app.bbs; - -import java.util.Iterator; - -public class IterableConverter implements Iterable -{ - private final Iterable iterable; - private final Converter converter; - - public IterableConverter(Iterable _iterable,Converter _converter) - { - iterable = _iterable; - converter = _converter; - } - - public Iterator iterator() - { - return new IteratorConverter(iterable.iterator(),converter); - } - - private static final class IteratorConverter implements Iterator - { - private final Iterator iterator; - private final Converter converter; - - public IteratorConverter(Iterator _iterator,Converter _converter) - { - iterator = _iterator; - converter = _converter; - } - - public boolean hasNext() - { - return iterator.hasNext(); - } - - public A next() - { - return converter.conv(iterator.next()); - } - - public void remove() - { - iterator.remove(); - } - } - - public static interface Converter - { - public A conv(B _b); - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/jungle/app/bbs/JungleManager.java --- a/src/jungle/app/bbs/JungleManager.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,127 +0,0 @@ -package jungle.app.bbs; - -import java.nio.ByteBuffer; -import java.util.Iterator; - -import alice.jungle.operations.NetworkTreeOperationLog; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; -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.store.Command; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; -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; - -public class JungleManager { - private static JungleManager jm = new JungleManager(); - private Jungle jungle; - private static int NOT_CHANGE_POSITION = 0; - - private JungleManager() { - jungle = new DefaultJungle(null,"hogehoge",new DefaultTreeEditor(new DefaultTraverser())); - } - - public static void setJungle(Jungle _j) { - jm.jungle = _j; - } - - public static Jungle getJungle() { - return jm.jungle; - } - - public static JungleTree createNewTree(String name) { - return jm.jungle.createNewTree(name); - } - - public static Either edit(JungleTreeEditor _editor ,TreeOperationLog _log, int pos) { - JungleTreeEditor editor = _editor; - Either either = null; - for (TreeOperation op : _log) { - either = _edit(editor, op, pos); - if(either.isA()) { - return either; - } - editor = either.b(); - } - return either; - } - - private static Either _edit(JungleTreeEditor editor, - TreeOperation op, int _pos) { - NodePath path = new DefaultNodePath(); - NodeOperation nodeOp = op.getNodeOperation(); - int pos = _pos; - if (_pos == NOT_CHANGE_POSITION ) { - pos = nodeOp.getPosition(); - } - Command c = nodeOp.getCommand(); - String key = ""; - switch (c) { - case PUT_ATTRIBUTE: - path = op.getNodePath(); - key = nodeOp.getKey(); - ByteBuffer value = nodeOp.getValue(); - return editor.putAttribute(path, key, value); - case DELETE_ATTRIBUTE: - key = nodeOp.getKey(); - return editor.deleteAttribute(path, key); - case APPEND_CHILD: - return editor.addNewChildAt(path, pos); - case DELETE_CHILD: - return editor.deleteChildAt(path, 0); - } - return null; - } - - public static Either update(NetworkTreeOperationLog netLog) { - String treeName = netLog.getTreeName(); - Jungle jungle = JungleManager.getJungle(); - if (jungle.getTreeByName(treeName) == null) { - if(null == jungle.createNewTree(treeName)){ - throw new IllegalStateException(); - } - } - JungleTree tree = jungle.getTreeByName(treeName); - JungleTreeEditor editor = tree.getLocalTreeEditor(); - - // int pos = calculatePosition(tree.getRootNode(), netLog.getTimeStamp()); - int pos = 0; - Either either = JungleManager.edit(editor, netLog, pos); - if(either.isA()) { - throw new IllegalStateException(); - } - editor = either.b(); - either = editor.success(); - if(either.isA()) { - throw new IllegalStateException(); - } - return either; - } - - private static int calculatePosition(Node node, long newNodeTimeStamp) { - int count = 0; - long childTimeStamp = 0; - for(Iterator iter = node.getChildren().iterator();iter.hasNext();) { - Node n = iter.next(); - if(n.getAttributes().get("timestamp") == null) { - return NOT_CHANGE_POSITION; - } - if(n.getAttributes().get("timestamp") != null) { - childTimeStamp = n.getAttributes().get("timestamp").getLong(); - if (newNodeTimeStamp < childTimeStamp) { - break; - } - } - count++; - } - return count; - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/jungle/app/bbs/NetworkJungleBulletinBoard.java --- a/src/jungle/app/bbs/NetworkJungleBulletinBoard.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,231 +0,0 @@ -package jungle.app.bbs; - -import java.nio.ByteBuffer; -import java.util.Date; -import java.util.concurrent.atomic.AtomicInteger; - -import alice.jungle.core.NetworkDefaultJungle; -import alice.jungle.persistence.AliceJournal; -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.Children; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; -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; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter; - -public class NetworkJungleBulletinBoard implements BulletinBoard -{ - private final Jungle jungle; - - public NetworkJungleBulletinBoard(String _uuid) - { - jungle = new NetworkDefaultJungle(new AliceJournal(), _uuid,new DefaultTreeEditor(new DefaultTraverser())); - jungle.createNewTree("boards"); - JungleManager.setJungle(jungle); - } - - public Iterable getBoards() - { - JungleTree tree = jungle.getTreeByName("boards"); - Node node = tree.getRootNode(); - Children chs = node.getChildren(); - - IterableConverter.Converter converter = new IterableConverter.Converter(){ - public String conv(Node _b) { - ByteBuffer e = _b.getAttributes().get("name"); - return new String(e.array()); - } - }; - - return new IterableConverter(chs,converter); - } - - public void createBoards(final String _name,final String _author,final String _initMessage,final String _editKey) - { - if(null == jungle.createNewTree(_name)){ - throw new IllegalStateException(); - } - - JungleTree tree = jungle.getTreeByName("boards"); - JungleTreeEditor editor = tree.getTreeEditor(); - DefaultNodePath root = new DefaultNodePath(); - Either either = editor.addNewChildAt(root,0); - if(either.isA()){ - throw new IllegalStateException(); - } - editor = either.b(); - - either = editor.putAttribute(root.add(0),"name",ByteBuffer.wrap(_name.getBytes())); - if(either.isA()){ - throw new IllegalStateException(); - } - editor = either.b(); - Either result = editor.success(); - if(result.isA()){ - throw new IllegalStateException(); - } - final long timestamp = new Date().getTime(); - - - tree = jungle.getTreeByName(_name); - editor = tree.getTreeEditor(); - either = editor.addNewChildAt(root,0); - if(either.isA()){ - throw new IllegalStateException(); - } - editor = either.b(); - - NodeEditor e = new NodeEditor(){ - public > Either edit(T _e){ - _e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b(); - _e = _e.getAttributes().put("mes",ByteBuffer.wrap(_initMessage.getBytes())).b(); - _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b(); - ByteBuffer tBuffer = ByteBuffer.allocate(16); - _e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b(); - return DefaultEither.newB(_e); - } - }; - - either = editor.edit(root.add(0),e); - if(either.isA()){ - throw new IllegalStateException(); - } - editor = either.b(); - editor.success(); - - } - - public void createBoardMessage(final String _board,final String _author,final String _message,final String _editKey) - { - JungleTree tree = jungle.getTreeByName(_board); - if(tree == null){ - throw new IllegalStateException(); - } - - Either either; - do{ - Node node = tree.getRootNode(); - int size = node.getChildren().size(); - DefaultNodePath path = new DefaultNodePath(); - - JungleTreeEditor editor = tree.getTreeEditor(); - either = editor.addNewChildAt(path,size); - if(either.isA()){ - throw new IllegalStateException(); - } - editor = either.b(); - final long timestamp = new Date().getTime(); - NodeEditor e = new NodeEditor(){ - public > Either edit(T _e){ - _e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b(); - _e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b(); - _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b(); - ByteBuffer tBuffer = ByteBuffer.allocate(16); - _e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b(); - return DefaultEither.newB(_e); - } - }; - path = path.add(size); - either = editor.edit(path,e); - if(either.isA()){ - throw new IllegalStateException(); - } - editor = either.b(); - either = editor.success(); - - }while(either.isA()); - /* Put DataSegment */ - } - - public void editMessage(String _board,String _uuid,final String _author,final String _message,final String _editKey) - { - for(;;) { - DefaultNodePath path = new DefaultNodePath(); - path = path.add(Integer.parseInt(_uuid)); - - JungleTree tree = jungle.getTreeByName(_board); - JungleTreeEditor editor = tree.getTreeEditor(); - final long timestamp = new Date().getTime(); - NodeEditor e = new NodeEditor(){ - public > Either edit(T _e){ - _e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b(); - _e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b(); - _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b(); - ByteBuffer tBuffer = ByteBuffer.allocate(16); - _e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b(); - return DefaultEither.newB(_e); - } - }; - - Either either = editor.edit(path,e); - if(either.isA()){ - throw new IllegalStateException(); - } - editor = either.b(); - either = editor.success(); - if(!either.isA()) { - return; - } - } - - } - - public Iterable getMessages(String _boardName) - { - JungleTree tree = jungle.getTreeByName(_boardName); - Node node = tree.getRootNode(); - Children chs = node.getChildren(); - - final AtomicInteger counter = new AtomicInteger(0); - IterableConverter.Converter converter = new IterableConverter.Converter(){ - public BoardMessage conv(Node _b) { - String uuid = Integer.toString(counter.get()); - String author = new String(_b.getAttributes().get("author").array()); - String message = new String(_b.getAttributes().get("mes").array()); - counter.incrementAndGet(); - return new BoardMessageImpl(author,message,uuid); - } - }; - - return new IterableConverter(chs,converter); - } - - - - private static class BoardMessageImpl implements BoardMessage - { - private final String author; - private final String message; - private final String uuid; - - public BoardMessageImpl(String _author,String _message,String _uuid) - { - author = _author; - message = _message; - uuid = _uuid; - } - - public String getAuthor() - { - return author; - } - - public String getMessage() - { - return message; - } - - public String getUUID() - { - return uuid; - } - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/jungle/app/bbs/ShowBoardMessageServlet.java --- a/src/jungle/app/bbs/ShowBoardMessageServlet.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -package jungle.app.bbs; - -import java.io.PrintWriter; - -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public class ShowBoardMessageServlet extends HttpServlet -{ - /** - * - */ - private static final long serialVersionUID = 1L; - private final BulletinBoard bbs; - private final String createBoardMessagePath; - private final String editMessagePath; - - private static final String PARAM_BOARD_NAME = "bname"; - - public ShowBoardMessageServlet(BulletinBoard _bbs,String _createBoardMessagePath, String _editMessagePath) - { - bbs = _bbs; - createBoardMessagePath = _createBoardMessagePath; - editMessagePath = _editMessagePath; - } - - public void doGet(HttpServletRequest _req,HttpServletResponse _res) - { - String bname = _req.getParameter(PARAM_BOARD_NAME); - - try{ - printBoard(bname,_res.getWriter()); - }catch(Exception _e){ - _res.setStatus(500); - } - - } - - private void printBoard(String _bname,PrintWriter _pw) throws Exception - { - _pw.write("\n"); - _pw.write("

"+_bname+"

\n"); - - _pw.write("Author : EditKey :

\n"); - _pw.write("

Message

\n"); - _pw.write("

\n"); - - for(BoardMessage msg : bbs.getMessages(_bname)){ - _pw.write("
"); - _pw.write("

"+msg.getAuthor()+"

"); - _pw.write("

"+msg.getMessage()+"

"); - _pw.write("
edit"); - } - - _pw.write(""); - _pw.flush(); - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/jungle/app/bbs/ShowBoardsServlet.java --- a/src/jungle/app/bbs/ShowBoardsServlet.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -package jungle.app.bbs; - -import java.io.PrintWriter; - -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public class ShowBoardsServlet extends HttpServlet -{ - /** - * - */ - private static final long serialVersionUID = 1L; - private final BulletinBoard bbs; - private final String createBoardPath; - private final String showBoardMessagePath; - - public ShowBoardsServlet(BulletinBoard _bbs, String _createBoardPath,String _showBoardMessagePath) - { - bbs = _bbs; - createBoardPath = _createBoardPath; - showBoardMessagePath = _showBoardMessagePath; - } - - public void doGet(HttpServletRequest _req,HttpServletResponse _res) - { - try{ - printBoard(_res.getWriter()); - }catch(Exception _e){ - _res.setStatus(500); - } - - } - - private void printBoard(PrintWriter _pw) throws Exception - { - _pw.write("\n"); - _pw.write("

BBS

\n"); - _pw.write("Create new board.

"); - _pw.write("

BoardName :

\n"); - _pw.write("

Author : EditKey :

\n"); - _pw.write("

Message

\n"); - _pw.write("


\n"); - - _pw.write("

list of boards

"); - for(String board : bbs.getBoards()){ - _pw.write("

"+board+"

"); - } - - _pw.write(""); - _pw.flush(); - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/jungle/app/bbs/codesegment/LogUpdateCodeSegment.java --- a/src/jungle/app/bbs/codesegment/LogUpdateCodeSegment.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -package jungle.app.bbs.codesegment; - - - -import java.util.List; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import jungle.app.bbs.JungleManager; -import alice.codesegment.CodeSegment; -import alice.datasegment.CommandType; -import alice.datasegment.Receiver; -import alice.jungle.operations.NetworkTreeOperationLog; - -public class LogUpdateCodeSegment extends CodeSegment { - - Receiver log = ids.create(CommandType.PEEK); - Receiver clist = ids.create(CommandType.PEEK); - - - public LogUpdateCodeSegment() { - log.setKey("log"); - clist.setKey("_CLIST");; - } - - public LogUpdateCodeSegment(int index) { - log.setKey("log", index); - clist.setKey("_CLIST");; - } - - public void run() { - int index = log.index; - NetworkTreeOperationLog netLog = log.asClass(NetworkTreeOperationLog.class); - @SuppressWarnings("unchecked") - List list = clist.asClass(List.class); - if (!log.from.equals("local")) { - Either either = JungleManager.update(netLog); - if(either.isA()) { - /* Should throw after new LogUpdateCodeSegment */ - throw new IllegalStateException(); - } - } - for (String node : list) { - if (!node.equals(log.from)) { - ods.put(node, log.key, log.getVal()); - } - } - new LogUpdateCodeSegment(index); - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/jungle/app/bbs/codesegment/NullCodeSegment.java --- a/src/jungle/app/bbs/codesegment/NullCodeSegment.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -package jungle.app.bbs.codesegment; - -import alice.codesegment.CodeSegment; - -public class NullCodeSegment extends CodeSegment { - - @Override - public void run() { - - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/jungle/app/bbs/codesegment/StartBBSCodeSegment.java --- a/src/jungle/app/bbs/codesegment/StartBBSCodeSegment.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -package jungle.app.bbs.codesegment; - -import java.util.regex.Pattern; -import java.util.regex.Matcher; - -import javax.servlet.Servlet; - -import jungle.app.bbs.BulletinBoard; -import jungle.app.bbs.CreateBoardMessageServlet; -import jungle.app.bbs.CreateBoardServlet; -import jungle.app.bbs.EditMessageServlet; -import jungle.app.bbs.NetworkJungleBulletinBoard; -import jungle.app.bbs.ShowBoardMessageServlet; -import jungle.app.bbs.ShowBoardsServlet; - -import org.mortbay.jetty.Server; -import org.mortbay.jetty.servlet.ServletHandler; -import org.mortbay.jetty.servlet.ServletHolder; - -import alice.codesegment.CodeSegment; -import alice.datasegment.CommandType; -import alice.datasegment.Receiver; -import alice.jungle.datasegment.HashSetDataSegment; - -public class StartBBSCodeSegment extends CodeSegment { - - int bbsPort = 8080; - Receiver host = ids.create(CommandType.PEEK); - private Pattern pattern = Pattern.compile("^(node|cli)([0-9]+)$"); - - public StartBBSCodeSegment(int p) { - bbsPort = p; - host.setKey("host"); - } - - public StartBBSCodeSegment() { - host.setKey("host"); - } - - public void run() { - System.out.println("StartBBSCodeSegment"); - String name = host.asString(); - System.out.println("name : "+ name); - Matcher matcher = pattern.matcher(name); - matcher.find(); -// String type = matcher.group(1); - - /* Jetty registration */ - BulletinBoard cassaBBS = new NetworkJungleBulletinBoard(name); - String createBoardMessagePath = "/createBoardMessage"; - String createBoardPath = "/createBoard"; - String editMessagePath = "/editMessage"; - String showBoardMessagePath = "/showBoardMessage"; - - Servlet createBoardMessage = new CreateBoardMessageServlet(cassaBBS); - Servlet createBoard = new CreateBoardServlet(cassaBBS); - Servlet editBoardMessage = new EditMessageServlet(cassaBBS); - Servlet index = new ShowBoardsServlet(cassaBBS,createBoardPath,showBoardMessagePath); - Servlet board = new ShowBoardMessageServlet(cassaBBS,createBoardMessagePath,editMessagePath); - - Server serv = new Server(bbsPort); - ServletHandler context = new ServletHandler(); - context.addServletWithMapping(new ServletHolder(createBoardMessage),createBoardMessagePath); - context.addServletWithMapping(new ServletHolder(createBoard),createBoardPath); - context.addServletWithMapping(new ServletHolder(editBoardMessage),editMessagePath); - context.addServletWithMapping(new ServletHolder(index),"/"); - context.addServletWithMapping(new ServletHolder(board),showBoardMessagePath); - serv.addHandler(context); - try { - serv.start(); - } catch (Exception e) { - e.printStackTrace(); - } - new LogUpdateCodeSegment(); - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/jungle/app/bbs/transformer/MergeBBS.java --- a/src/jungle/app/bbs/transformer/MergeBBS.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -package jungle.app.bbs.transformer; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public class MergeBBS implements NodeEditor { - - - public MergeBBS() { - - } - - @Override - public > Either edit(T _e) - { - return _e.getChildren().deleteChildAt(0); - } - - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/core/NetworkDefaultJungle.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/core/NetworkDefaultJungle.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,66 @@ +package alice.jungle.core; + +import java.util.Iterator; +import java.util.concurrent.ConcurrentHashMap; + +import alice.jungle.transaction.NetworkDefaultJungleTree; +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.persistent.ChangeList; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Journal; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; +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.DefaultTreeNode; +import fj.data.List; + +public class NetworkDefaultJungle implements Jungle { + private Journal journal; + private ConcurrentHashMap trees; + private String uuid; + private TreeEditor editor; + + public NetworkDefaultJungle(Journal _journal,String _uuid,TreeEditor _editor) + { + journal = _journal; + trees = new ConcurrentHashMap(); + uuid = _uuid; + editor = _editor; + } + + @Override + public JungleTree getTreeByName(String _name) + { + return trees.get(_name); + } + + @Override + public JungleTree createNewTree(final String _name) + { + ChangeList list = new ChangeList(){ + @Override + public Iterator iterator() { + List nil = List.nil(); + return nil.iterator(); + } + @Override + public String uuid() { + return uuid; + } + @Override + public String getTreeName() { + return _name; + } + }; + DefaultTreeNode root = new DefaultTreeNode(); + ChangeSet set = new DefaultChangeSet(root.getAsNode(),null,list,uuid,_name, 0); + DefaultTreeContext tc = new DefaultTreeContext(root,set); + JungleTree newTree = new NetworkDefaultJungleTree(_name, tc,uuid,journal.getWriter(),editor); + if(trees.putIfAbsent(_name,newTree) != null){ + return null; + } + return newTree; + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/datasegment/container/DefaultNodeOperationContainer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/datasegment/container/DefaultNodeOperationContainer.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,85 @@ +package alice.jungle.datasegment.container; + +import java.io.IOException; +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.AppendChildAtOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteAttributeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteChildAtOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.PutAttributeOperation; + +import org.msgpack.MessagePack; +import org.msgpack.annotation.Message; +import org.msgpack.template.OrdinalEnumTemplate; +import org.msgpack.type.Value; + +import alice.codesegment.SingletonMessage; + +@Message +public class DefaultNodeOperationContainer { + + public int pos; + public String key; + public Value value; + public Value commandValue; + + public static void main(String[] args) throws IOException { + String key = "hoge"; + ByteBuffer b = ByteBuffer.wrap("messagepack value".getBytes()); + PutAttributeOperation op = new PutAttributeOperation(key, b); + DefaultNodeOperationContainer container = new DefaultNodeOperationContainer(); + container.unconvert(op); + NodeOperation convertedOp = container.convert(); + System.out.println("pos : "+convertedOp.getPosition()); + System.out.println("Command : "+convertedOp.getCommand()); + System.out.println("key : "+convertedOp.getKey()); + System.out.println("value : "+new String(convertedOp.getValue().array())); + + } + + public DefaultNodeOperationContainer() { + + } + + public void unconvert(NodeOperation op) throws IOException { +// MessagePack msgpack = new MessagePack(); + MessagePack msgpack = SingletonMessage.getInstance(); + pos = op.getPosition(); + key = op.getKey(); + value = null; + if (op.getValue() != null) { + ByteBuffer b = op.getValue(); + byte[] bytes = b.array(); + Value v = msgpack.unconvert(bytes); + value = v; + } + Command c = op.getCommand(); + msgpack.register(Command.class, new OrdinalEnumTemplate(Command.class)); + Value cValue = msgpack.unconvert(c); + commandValue = cValue; + } + + public NodeOperation convert() throws IOException{ +// MessagePack msgpack = new MessagePack(); + MessagePack msgpack = SingletonMessage.getInstance(); + msgpack.register(Command.class, new OrdinalEnumTemplate(Command.class)); + Command c = msgpack.convert(commandValue, Command.class); + ByteBuffer b = null; + if (value != null) { + b = ByteBuffer.wrap(msgpack.convert(value, byte[].class)); + } + if (c == Command.PUT_ATTRIBUTE) { + return new PutAttributeOperation(key, b); + } else if (c == Command.APPEND_CHILD) { + return new AppendChildAtOperation(pos); + } else if (c == Command.DELETE_CHILD) { + return new DeleteChildAtOperation(pos); + } else if (c == Command.DELETE_ATTRIBUTE){ + return new DeleteAttributeOperation(key); + } + return null; + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/datasegment/container/DefaultNodePathContainer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/datasegment/container/DefaultNodePathContainer.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,58 @@ +package alice.jungle.datasegment.container; + +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; + +import org.msgpack.MessagePack; +import org.msgpack.annotation.Message; +import org.msgpack.template.IntegerTemplate; +import org.msgpack.template.ListTemplate; +import org.msgpack.type.Value; + +@Message +public class DefaultNodePathContainer { + + public Value pathValue; + + public static void main(String[] args) throws IOException { + DefaultNodePath p = new DefaultNodePath(); + p = p.add(1).add(2).add(3); + DefaultNodePathContainer pathContainer = new DefaultNodePathContainer(); + pathContainer.unconvert(p); + NodePath convertedPath = pathContainer.convert(); + for (int i : convertedPath) { + System.out.println(i); + } + } + + public DefaultNodePathContainer() { + + } + + public void unconvert(NodePath path) throws IOException { + MessagePack msgpack = new MessagePack(); + List list = new LinkedList(); + for(Integer i : path) { + list.add(i); + } + /* Remove first Element(-1). */ + list.remove(0); + Value v = msgpack.unconvert(list); + pathValue = v; + } + + public DefaultNodePath convert() throws IOException { + MessagePack msgpack = new MessagePack(); + msgpack.register(List.class, new ListTemplate(IntegerTemplate.getInstance())); + List convertedList = (List)msgpack.convert(pathValue, List.class); + DefaultNodePath path = new DefaultNodePath(); + for (int i: convertedList) { + path = path.add(i); + } + return path; + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/datasegment/container/DefaultTreeOperationContainer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/datasegment/container/DefaultTreeOperationContainer.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,100 @@ +package alice.jungle.datasegment.container; + +import java.io.IOException; +import java.nio.ByteBuffer; + +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.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DefaultTreeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.PutAttributeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; + +import org.msgpack.MessagePack; +import org.msgpack.annotation.Message; +import org.msgpack.type.Value; + +import alice.codesegment.SingletonMessage; + +@Message +public class DefaultTreeOperationContainer { + + Value pathValue; + Value opValue; + + public static void main(String[] args) throws IOException { + String key = "hoge"; + ByteBuffer b = ByteBuffer.wrap("messagepack value".getBytes()); + PutAttributeOperation op = new PutAttributeOperation(key, b); + + DefaultNodePath p = new DefaultNodePath(); + p = p.add(1).add(2).add(3); + DefaultTreeOperation treeOp = new DefaultTreeOperation(p, op); + + DefaultTreeOperationContainer treeOperationContainer = new DefaultTreeOperationContainer(); + treeOperationContainer.unconvert(treeOp); + + TreeOperation treeOperation = treeOperationContainer.convert(); + NodePath nodePath = treeOperation.getNodePath(); + NodeOperation nodeOp = treeOperation.getNodeOperation(); + Command c = nodeOp.getCommand(); + String str = ""; + switch (c) { + case PUT_ATTRIBUTE: + String k = nodeOp.getKey(); + ByteBuffer value = nodeOp.getValue(); + if (value.limit() < 100) { + str = String.format("key:%s,value:%s", k, + new String(value.array())); + } else { + str = String.format("key:%s,value:%d", k, value.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, nodePath, str)); + for (int i: nodePath ) { + System.out.println(i); + } + } + + public DefaultTreeOperationContainer() { + + } + + public void unconvert(DefaultTreeOperation _op) throws IOException { + NodeOperation nodeOp = _op.getNodeOperation(); + NodePath nodePath = _op.getNodePath(); + DefaultNodeOperationContainer opContainer = new DefaultNodeOperationContainer(); + opContainer.unconvert(nodeOp); + DefaultNodePathContainer pathContainer = new DefaultNodePathContainer(); + pathContainer.unconvert(nodePath); + unconvert(opContainer, pathContainer); + } + + public void unconvert(DefaultNodeOperationContainer _op, + DefaultNodePathContainer _path) throws IOException { +// MessagePack msgpack = new MessagePack(); + MessagePack msgpack = SingletonMessage.getInstance(); + pathValue = msgpack.unconvert(_path); + opValue = msgpack.unconvert(_op); + } + + public TreeOperation convert() throws IOException { +// MessagePack msgpack = new MessagePack(); + MessagePack msgpack = SingletonMessage.getInstance(); + DefaultNodePathContainer pathContainer = msgpack.convert(pathValue, DefaultNodePathContainer.class); + DefaultNodeOperationContainer opContainer = msgpack.convert(opValue, DefaultNodeOperationContainer.class); + return new DefaultTreeOperation(pathContainer.convert(), opContainer.convert()); + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/datasegment/container/DefaultTreeOperationLogContainer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/datasegment/container/DefaultTreeOperationLogContainer.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,114 @@ +package alice.jungle.datasegment.container; + +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultTreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DefaultTreeOperation; +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 org.msgpack.MessagePack; +import org.msgpack.annotation.Message; +import org.msgpack.template.ListTemplate; +import org.msgpack.template.ValueTemplate; +import org.msgpack.type.Value; + +import alice.codesegment.SingletonMessage; + +@Message +public class DefaultTreeOperationLogContainer { + + Value logValue; + String treeName; + String uuid; + String updaterName; + String revision; + long timestamp; + + public DefaultTreeOperationLogContainer() { + logValue = null; + treeName = ""; + uuid = ""; + updaterName = ""; + revision = ""; + timestamp = Long.MAX_VALUE; + } + + public void setTreeName(String _treeName) { + treeName = _treeName; + } + + public String getTreeName() { + return treeName; + } + + public void setUUID(String _uuid) { + uuid = _uuid; + } + + public String getUUID() { + return uuid; + } + + public void setUpdaterName(String _updaterName) { + updaterName = _updaterName; + } + + public String getServerName() { + return updaterName; + } + + public void setRevision(String _revision) { + revision = _revision; + } + + public String getRevision() { + return revision; + } + + public void setTimeStamp(long t) { + timestamp = t; + } + + public long getTimeStamp() { + return timestamp; + } + + public void unconvert(Iterable _log) throws IOException { + MessagePack msgpack = SingletonMessage.getInstance(); + List list = new LinkedList(); + for(TreeOperation op : _log) { + NodeOperation nOp = op.getNodeOperation(); + NodePath nodePath = op.getNodePath(); + DefaultTreeOperation treeOp = new DefaultTreeOperation(nodePath, nOp); + DefaultTreeOperationContainer container = new DefaultTreeOperationContainer(); + container.unconvert(treeOp); + Value v = msgpack.unconvert(container); + list.add(v); + } + Value listValue = msgpack.unconvert(list); + logValue = listValue; + } + + public DefaultTreeOperationLog convert() throws IOException { + MessagePack msgpack = SingletonMessage.getInstance(); + msgpack.register(List.class, new ListTemplate(ValueTemplate.getInstance())); + List listValue = msgpack.convert(logValue, List.class); + List logList = new LinkedList(); + for(Value v: listValue) { + DefaultTreeOperationContainer container = msgpack.convert(v, DefaultTreeOperationContainer.class); + logList.add(container.convert()); + } + DefaultTreeOperationLog log = new DefaultTreeOperationLog(logList, logList.size()); + return log; + } + + public String getHashLogString() { + return treeName + revision + updaterName; + } + + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/datasegment/store/HashSetDataSegment.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/datasegment/store/HashSetDataSegment.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,11 @@ +package alice.jungle.datasegment.store; + +import java.util.HashSet; + +import org.msgpack.annotation.Message; + +@Message +public class HashSetDataSegment { + public HashSet hash = new HashSet(); + public HashSetDataSegment() {} +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/datasegment/transformer/NetworkAppendChildAt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/datasegment/transformer/NetworkAppendChildAt.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,35 @@ +package alice.jungle.datasegment.transformer; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; +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; + +import org.msgpack.annotation.Message; + + +/* + * This code same AppendChildAt. + */ + +@Message +public class NetworkAppendChildAt implements NodeEditor { + + private final int pos; + + public NetworkAppendChildAt(int _pos) { + pos = _pos; + } + + @Override + public > Either edit(T _e) { + Either either = _e.getChildren().addNewChildAt(pos); + if(either.isA()){ + // error + return either; + } + return DefaultEither.newB(either.b()); + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/operations/NetworkAppendChildAtOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/operations/NetworkAppendChildAtOperation.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,54 @@ +package alice.jungle.operations; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; +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.datasegment.transformer.NetworkAppendChildAt; + +import org.msgpack.annotation.Message; + + +@Message +public class NetworkAppendChildAtOperation implements NodeOperation { + + /* MessagePack cannot handle final.*/ + // private final int pos; + private int pos; + + /* Position -1 represent root position. */ + public NetworkAppendChildAtOperation() { pos = -2; } + + public NetworkAppendChildAtOperation(int _pos) { + pos = _pos; + } + + @Override + public Command getCommand() { + return Command.APPEND_CHILD; + } + + @Override + public > Either invoke(T _target) { + NetworkAppendChildAt appendChildAt = new NetworkAppendChildAt(pos); + return appendChildAt.edit(_target); + } + + @Override + public int getPosition() { + return pos; + } + + @Override + public String getKey() { + return null; + } + + @Override + public ByteBuffer getValue() { + return null; + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/operations/NetworkDeleteAttributeOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/operations/NetworkDeleteAttributeOperation.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,61 @@ +package alice.jungle.operations; + +import java.nio.ByteBuffer; + +import org.msgpack.annotation.Message; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteAttribute; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; + +@Message +public class NetworkDeleteAttributeOperation implements NodeOperation +{ + /* MessagePack cannot handle final.*/ + //private final String key; + private String key; + + public NetworkDeleteAttributeOperation() + { + key = null; + } + + public NetworkDeleteAttributeOperation(String _key) + { + key = _key; + } + + @Override + public Command getCommand() + { + return Command.DELETE_ATTRIBUTE; + } + + @Override + public > Either invoke(T _target) + { + DeleteAttribute deleteAttribute = new DeleteAttribute(key); + return deleteAttribute.edit(_target); + } + + @Override + public int getPosition() + { + return -1; + } + + @Override + public String getKey() + { + return key; + } + + @Override + public ByteBuffer getValue() + { + return null; + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/operations/NetworkDeleteChildAtOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/operations/NetworkDeleteChildAtOperation.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,58 @@ +package alice.jungle.operations; + +import java.nio.ByteBuffer; + +import org.msgpack.annotation.Message; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteChildAt; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; + +@Message +public class NetworkDeleteChildAtOperation implements NodeOperation +{ + /* MessagePack cannot handle final.*/ + //private final int pos; + private int pos; + + + /* Position -1 represent root position. */ + public NetworkDeleteChildAtOperation(int _pos) + { + pos = _pos; + } + + @Override + public Command getCommand() + { + return Command.DELETE_CHILD; + } + + @Override + public > Either invoke(T _target) + { + DeleteChildAt deleteChildAt = new DeleteChildAt(pos); + return deleteChildAt.edit(_target); + } + + @Override + public int getPosition() + { + return pos; + } + + @Override + public String getKey() + { + return null; + } + + @Override + public ByteBuffer getValue() + { + return null; + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/operations/NetworkNodeOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/operations/NetworkNodeOperation.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,113 @@ +package alice.jungle.operations; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteAttribute; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteChildAt; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute; +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.datasegment.transformer.NetworkAppendChildAt; + +import org.msgpack.annotation.Message; + +@Message +public class NetworkNodeOperation implements NodeOperation{ + + public int pos; + public String key; + 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; + value = null; + commandType = 0; + } + + public NetworkNodeOperation(NodeOperation _op) { + pos = _op.getPosition(); + key = _op.getKey(); + value = _op.getValue(); + commandType = getCommandType(_op.getCommand()); + } + + public static int getCommandType(Command c) { + switch(c) { + case PUT_ATTRIBUTE: + return NUM_PUT_ATTRIBUTE; + case APPEND_CHILD: + return NUM_APPEND_CHILD; + case DELETE_CHILD: + return NUM_DELETE_CHILD; + case DELETE_ATTRIBUTE: + return NUM_DELETE_ATTRIBUTE; + default: + break; + } + return 0; + } + + public static Command getCommand(int num) { + switch(num) { + case NUM_PUT_ATTRIBUTE: + return Command.PUT_ATTRIBUTE; + case NUM_APPEND_CHILD: + return Command.APPEND_CHILD; + case NUM_DELETE_CHILD: + return Command.DELETE_CHILD; + case NUM_DELETE_ATTRIBUTE: + return Command.DELETE_ATTRIBUTE; + default: + break; + } + return null; + } + + public Command getCommand() { + return getCommand(commandType); + } + + public int getPosition() { + return pos; + } + + public String getKey() { + return key; + } + + public ByteBuffer getValue() { + return value; + } + + @Override + public > Either invoke(T _target) { + switch(getCommand(commandType)) { + case PUT_ATTRIBUTE: + PutAttribute putAttribute = new PutAttribute(key,value); + return putAttribute.edit(_target); + case APPEND_CHILD: + NetworkAppendChildAt appendChildAt = new NetworkAppendChildAt(pos); + return appendChildAt.edit(_target); + case DELETE_CHILD: + DeleteChildAt deleteChildAt = new DeleteChildAt(pos); + return deleteChildAt.edit(_target); + case DELETE_ATTRIBUTE: + DeleteAttribute deleteAttribute = new DeleteAttribute(key); + return deleteAttribute.edit(_target); + default: + break; + } + return null; + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/operations/NetworkNodePath.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/operations/NetworkNodePath.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,70 @@ +package alice.jungle.operations; + +import java.util.Iterator; +import java.util.LinkedList; + +import org.msgpack.annotation.Message; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; + +@Message +public class NetworkNodePath implements NodePath +{ + LinkedList path; + + public NetworkNodePath() { + path = new LinkedList(); + path.add(-1); + } + + public NetworkNodePath(NodePath _p) { + path = new LinkedList(); + for(Integer pos: _p) { + path.add(pos); + } + } + + private NetworkNodePath(LinkedList _path) { + path = _path; + } + + @Override + public Iterator iterator() { + return path.iterator(); + } + + @Override + public NetworkNodePath add(int _pos) { + LinkedList newPath = copyPath(); + newPath.add(_pos); + return new NetworkNodePath(newPath); + } + + @Override + public Pair pop() { + LinkedList cPath = copyPath(); + int e = cPath.getFirst(); + cPath.remove(); + return new Pair(e, new NetworkNodePath(cPath)); + } + + @Override + public int size() { + return path.size(); + } + + private LinkedList copyPath() { + LinkedList newPath = new LinkedList(); + for (Integer i : path) { + newPath.add(i); + } + return newPath; + } + + @Override + public String toString() { + return path.toString(); + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/operations/NetworkPutAttributeOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/operations/NetworkPutAttributeOperation.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,67 @@ +package alice.jungle.operations; + +import java.nio.ByteBuffer; + +import org.msgpack.annotation.Message; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; +@Message +public class NetworkPutAttributeOperation implements NodeOperation +{ + +/* MessagePack cannot handle final. + * + * private final String key; + * private final ByteBuffer value; + */ + private String key; + private ByteBuffer value; + + public NetworkPutAttributeOperation() + { + key = null; + value = null; + } + + public NetworkPutAttributeOperation(String _key,ByteBuffer _value) + { + key = _key; + value = _value; + } + + @Override + public Command getCommand() + { + return Command.PUT_ATTRIBUTE; + } + + @Override + public > Either invoke(T _target) + { + PutAttribute putAttribute = new PutAttribute(key,value); + return putAttribute.edit(_target); + } + + @Override + public int getPosition() + { + return -1; + } + + @Override + public String getKey() + { + return key; + } + + @Override + public ByteBuffer getValue() + { + return value; + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/operations/NetworkTreeOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/operations/NetworkTreeOperation.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,73 @@ +package alice.jungle.operations; + +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.operations.AppendChildAtOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteAttributeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteChildAtOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.PutAttributeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; + +import org.msgpack.annotation.Message; + +@Message +public class NetworkTreeOperation implements TreeOperation { + + public NetworkNodePath path; + public NetworkNodeOperation operation; + + public NetworkTreeOperation() { + path = null; + operation = null; + } + + public NetworkTreeOperation(TreeOperation treeOp) { + path = new NetworkNodePath(treeOp.getNodePath()); + operation = new NetworkNodeOperation(treeOp.getNodeOperation()); + } + + public NetworkTreeOperation(NodePath _p, NodeOperation _op) { + path = new NetworkNodePath(_p); + operation = new NetworkNodeOperation(_op); + } + + public NetworkTreeOperation(NetworkNodePath _p, NodeOperation _op) { + path = _p; + operation = new NetworkNodeOperation(_op); + } + + public NetworkTreeOperation(NodePath _p, NetworkNodeOperation _op) { + path = new NetworkNodePath(_p); + operation = _op; + } + + public NetworkTreeOperation(NetworkNodePath _p, NetworkNodeOperation _op) { + path = _p; + operation = _op; + } + + @Override + public NodePath getNodePath() { + return path; + } + + @Override + public NodeOperation getNodeOperation() { + Command c = operation.getCommand(); + switch(c) { + case PUT_ATTRIBUTE: + return new PutAttributeOperation(operation.getKey(), operation.getValue()); + case APPEND_CHILD: + return new AppendChildAtOperation(operation.getPosition()); + case DELETE_CHILD: + return new DeleteChildAtOperation(operation.getPosition()); + case DELETE_ATTRIBUTE: + return new DeleteAttributeOperation(operation.getKey()); + default: + break; + } + return null; + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/operations/NetworkTreeOperationLog.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/operations/NetworkTreeOperationLog.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,103 @@ +package alice.jungle.operations; + +import java.util.Date; +import java.util.Iterator; +import java.util.LinkedList; + +import org.msgpack.annotation.Message; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; + +@Message +public class NetworkTreeOperationLog implements TreeOperationLog +{ + public LinkedList list; + public int size; + String uuid; + String treeName; + long timestamp; + + public NetworkTreeOperationLog() { + list = new LinkedList(); + size = 0; + treeName = ""; + timestamp = new Date().getTime(); + } + + public NetworkTreeOperationLog(String _uuid, String _treeName, Iterable _list) + { + this(_uuid, _treeName, _list, new Date().getTime()); + } + + public NetworkTreeOperationLog(String _uuid, String _treeName, Iterable _list, long _timestamp) + { + uuid = _uuid; + treeName = _treeName; + list = new LinkedList(); + timestamp = _timestamp; + for(TreeOperation op: _list) { + NetworkTreeOperation nOp = new NetworkTreeOperation(op); + list.add(nOp); + } + size = list.size(); + } + + public NetworkTreeOperationLog(Iterable _list) + { + this("", "", _list); + } + + + @Override + public Iterator iterator() { + LinkedList opList = new LinkedList(); + for(NetworkTreeOperation op : list) { + opList.add(op); + } + return opList.iterator(); + } + + @Override + public NetworkTreeOperationLog add(NodePath _p, NodeOperation _op) + { + NetworkTreeOperation op = new NetworkTreeOperation(_p, _op); + list.add(op); + return this; + } + + @Override + public NetworkTreeOperationLog append(TreeOperationLog _log) + { + for (TreeOperation o : _log) { + NetworkTreeOperation op = new NetworkTreeOperation(o); + list.add(op); + } + return this; + } + + @Override + public int length() + { + return size; + } + + public String getUUID() { + return uuid; + } + + public String getTreeName() { + return treeName; + } + + public long getTimeStamp() { + return timestamp; + } + + public void setTimeStamp(long _timestamp) { + timestamp = _timestamp; + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/persistent/AliceJournal.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/persistent/AliceJournal.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,76 @@ +package alice.jungle.persistent; + +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; + +public class AliceJournal implements Journal { + + private static final AliceChangeListWriter ALICE_WRITER = new AliceChangeListWriter(); + private static final AliceChangeListReader ALICE_READER = new AliceChangeListReader(); + @Override + public ChangeListReader getReader() { + return ALICE_READER; + } + @Override + public ChangeListWriter getWriter() { + return ALICE_WRITER; + } + + private static class AliceChangeListWriter implements ChangeListWriter + { + @Override + public Result write(ChangeList _operations) + { + /* + for(TreeOperation op : _operations){ + NodePath p = op.getNodePath(); + NodeOperation nodeOp = op.getNodeOperation(); + Command c = nodeOp.getCommand(); + String args = ""; + switch(c){ + case PUT_ATTRIBUTE: + String key = nodeOp.getKey(); + ByteBuffer value = nodeOp.getValue(); + if(value.limit() < 100){ + args = String.format("key:%s,value:%s",key,new String(value.array())); + }else{ + args = String.format("key:%s,value:%d",key,value.limit()); + } + break; + case DELETE_ATTRIBUTE: + args = String.format("key:%s",nodeOp.getKey()); + break; + case APPEND_CHILD: + args = String.format("pos:%d",nodeOp.getPosition()); + break; + case DELETE_CHILD: + args = String.format("pos:%d",nodeOp.getPosition()); + break; + } + System.out.println(String.format("[%s:%s:%s]",c,p,args)); + } + */ + return Result.SUCCESS; + } + } + + private static class AliceChangeListReader implements ChangeListReader + { + @Override + public ChangeListReader newReader() + { + return this; + } + + @Override + public ChangeList read() + { + return null; + } + } + + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/persistent/JungleUpdater.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/persistent/JungleUpdater.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,58 @@ +package alice.jungle.persistent; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; +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.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; + +public class JungleUpdater { + + public JungleUpdater() { + + } + + public static Either edit(JungleTreeEditor _editor ,TreeOperationLog _log) { + JungleTreeEditor editor = _editor; + Either either = null; + for (TreeOperation op : _log) { + either = _edit(editor, op); + if(either.isA()) { + return either; + } + editor = either.b(); + } + return either; + } + + private static Either _edit(JungleTreeEditor editor, + TreeOperation op) { + DefaultNodePath path = new DefaultNodePath(); + NodeOperation nodeOp = op.getNodeOperation(); + int pos = nodeOp.getPosition(); + Command c = nodeOp.getCommand(); + String key = ""; + switch (c) { + case PUT_ATTRIBUTE: + key = nodeOp.getKey(); + ByteBuffer value = nodeOp.getValue(); + return editor.putAttribute(path, key, value); + case DELETE_ATTRIBUTE: + key = nodeOp.getKey(); + return editor.deleteAttribute(path, key); + case APPEND_CHILD: + return editor.addNewChildAt(path, pos); + case DELETE_CHILD: + return editor.deleteChildAt(path, 0); + } + return null; + } + + + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/persistent/PersistentChangeList.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/persistent/PersistentChangeList.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,53 @@ +package alice.jungle.persistent; + +import java.util.Iterator; + +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.store.ChangeSet; +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; + +public class PersistentChangeList implements ChangeList { + + public NetworkTreeOperationLog log; + public String treeName; + public String uuid; + + public PersistentChangeList(String _uuid, String _treeName, TreeOperationLog _log) { + uuid = _uuid; + treeName = _treeName; + log = new NetworkTreeOperationLog(_log); + } + + public PersistentChangeList(NetworkTreeOperationLog _log) { + log = _log; + treeName = _log.getTreeName(); + uuid = _log.getUUID(); + } + + public PersistentChangeList(ChangeSet cs) { + treeName = cs.getTreeName(); + uuid = cs.uuid(); + log = new NetworkTreeOperationLog(cs.getChangeList()); + } + + @Override + public Iterator iterator() { + return log.iterator(); + } + + public NetworkTreeOperationLog getTreeOperationLog() { + return log; + } + + public String getTreeName() { + return treeName; + } + + public String uuid() { + return uuid; + } + + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/persistent/PersistentChangeListReader.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/persistent/PersistentChangeListReader.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,46 @@ +package alice.jungle.persistent; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; + +import alice.jungle.operations.NetworkTreeOperationLog; + +import org.msgpack.MessagePack; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListReader; + +public class PersistentChangeListReader implements ChangeListReader { + + private static InputStream in; + MessagePack msgpack = PersistentJournal.getMessagePack(); + + public PersistentChangeListReader() { + in = null; + } + + public PersistentChangeListReader(InputStream _in) { + in = _in; + } + + @Override + public ChangeListReader newReader() + { + return new PersistentChangeListReader(); + } + + @Override + public ChangeList read() + { + try { + final NetworkTreeOperationLog readLog = msgpack.read(in, NetworkTreeOperationLog.class); + PersistentChangeList cl = new PersistentChangeList(readLog); + return cl; + } catch (EOFException e){ + + } catch (IOException e) { + } + return null; + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/persistent/PersistentChangeListWriter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/persistent/PersistentChangeListWriter.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,35 @@ +package alice.jungle.persistent; + +import java.io.IOException; +import java.io.OutputStream; + +import alice.jungle.operations.NetworkTreeOperationLog; + +import org.msgpack.MessagePack; + +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; + +public class PersistentChangeListWriter implements ChangeListWriter { + + MessagePack msgpack = PersistentJournal.getMessagePack(); + OutputStream out; + + public PersistentChangeListWriter(OutputStream _out) { + out = _out; + } + + @Override + public Result write(ChangeList cs) + { + NetworkTreeOperationLog log = new NetworkTreeOperationLog(cs.uuid(), cs.getTreeName(), cs); + try { + msgpack.write(out, log); + out.flush(); + return Result.SUCCESS; + } catch (IOException e) { + } + return null; + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/persistent/PersistentChangeSet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/persistent/PersistentChangeSet.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,67 @@ +package alice.jungle.persistent; + +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.store.ChangeSet; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; + +public class PersistentChangeSet implements ChangeSet +{ + private final Node root; + private final ChangeSet previous; + private final ChangeList changeList; + private final String uuid; + private final long revision; + private final String treeName; + + public PersistentChangeSet(Node _node,ChangeSet _prev,ChangeList _log,String _uuid, String _treeName, long _revision) + { + root = _node; + previous = _prev; + changeList = _log; + uuid = _uuid; + revision = _revision; + treeName = _treeName; + } + + @Override + public Node getRoot() + { + return root; + } + + @Override + public ChangeSet prev() + { + return previous; + } + + @Override + public ChangeList getChangeList() + { + return changeList; + } + + @Override + public String uuid() + { + return uuid; + } + + @Override + public long revision() + { + return revision; + } + + @Override + public Iterable getOperations() + { + return changeList; + } + + public String getTreeName() { + return treeName; + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/persistent/PersistentJournal.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/persistent/PersistentJournal.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,82 @@ +package alice.jungle.persistent; + +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 org.msgpack.MessagePack; + +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; + +public class PersistentJournal implements Journal { + + private static ChangeListWriter WRITER; + private static ChangeListReader READER; + private static MessagePack msgpack; + private static OutputStream out = null; + private static InputStream in = null; + + public PersistentJournal() { + msgpack = new MessagePack(); + } + + public PersistentJournal(File file) throws FileNotFoundException { + out = new FileOutputStream(file); + in = new FileInputStream(file); + WRITER = new PersistentChangeListWriter(out); + READER = new PersistentChangeListReader(in); + msgpack = new MessagePack(); + } + + @Override + public ChangeListReader getReader() { + return READER; + } + + @Override + public ChangeListWriter getWriter() { + return WRITER; + } + + public void setOutputFile(File file) throws FileNotFoundException { + out = new FileOutputStream(file); + WRITER = new PersistentChangeListWriter(out); + } + + public void setInputFile(File file) throws FileNotFoundException { + in = new FileInputStream(file); + READER = new PersistentChangeListReader(in); + } + + 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; + } + + public static MessagePack getMessagePack() { + return msgpack; + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/persistent/PersistentJungle.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/persistent/PersistentJungle.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,65 @@ +package alice.jungle.persistent; + +import java.util.Iterator; +import java.util.concurrent.ConcurrentHashMap; + +import fj.data.List; + +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.persistent.ChangeList; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; + +public class PersistentJungle implements Jungle { + private PersistentJournal journal; + private ConcurrentHashMap trees; + final private String uuid; + private TreeEditor editor; + + public PersistentJungle(PersistentJournal _journal,String _uuid,TreeEditor _editor) + { + journal = _journal; + trees = new ConcurrentHashMap(); + uuid = _uuid; + editor = _editor; + } + + @Override + public JungleTree getTreeByName(String _name) + { + return trees.get(_name); + } + + @Override + public JungleTree createNewTree(final String _name) + { + ChangeList list = new ChangeList(){ + @Override + public Iterator iterator() { + List nil = List.nil(); + return nil.iterator(); + } + @Override + public String uuid() { + return uuid; + } + @Override + public String getTreeName() { + return _name; + } + }; + DefaultTreeNode root = new DefaultTreeNode(); + ChangeSet set = new PersistentChangeSet(root.getAsNode(),null,list,uuid,_name,0); + DefaultTreeContext tc = new DefaultTreeContext(root,set); + JungleTree newTree = new PersistentJungleTree(_name, tc,uuid, journal.getWriter(),editor); + if(trees.putIfAbsent(_name,newTree) != null){ + return null; + } + return newTree; + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/persistent/PersistentJungleTree.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/persistent/PersistentJungleTree.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,53 @@ +package alice.jungle.persistent; + +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.ChangeListWriter; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultJungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext; + +public class PersistentJungleTree > implements JungleTree { + private final AtomicReservableReference> repository; + private final String uuid; + private final String treeName; + private final ChangeListWriter writer; + private final TreeEditor editor; + + public PersistentJungleTree(String _treeName, TreeContext _tc,String _uuid, ChangeListWriter _writer,TreeEditor _editor) + { + treeName = _treeName; + repository = new AtomicReservableReference>(_tc); + uuid = _uuid; + writer = _writer; + editor = _editor; + } + + @Override + public JungleTreeEditor getTreeEditor() + { + TreeContext tc = repository.get(); + PersistentTransactionManager txManager = new PersistentTransactionManager(treeName, writer,tc,repository,uuid); + T root = tc.getTreeNode(); + return new DefaultJungleTreeEditor(root,txManager,editor); + } + + @Override + public Node getRootNode() + { + TreeContext tc = repository.get(); + ChangeSet cs = tc.getChangeSet(); + return cs.getRoot(); + } + + @Override + public JungleTreeEditor getLocalTreeEditor() { + return getTreeEditor(); + } + + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/persistent/PersistentTransactionManager.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/persistent/PersistentTransactionManager.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,77 @@ +package alice.jungle.persistent; + +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.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.transaction.AtomicReservableReference; +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.transaction.AtomicReservableReference.Reservation; +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 PersistentTransactionManager> implements TransactionManager { + private final AtomicReservableReference> repository; + private final TreeContext tip; + private final ChangeListWriter writer; + private final String uuid; + private final String treeName; + + public PersistentTransactionManager(String _treeName, ChangeListWriter _writer,TreeContext _tip, + AtomicReservableReference> _repository,String _uuid) + { + repository = _repository; + tip = _tip; + writer = _writer; + uuid = _uuid; + treeName = _treeName; + } + + @Override + public Either> commit(T _newRoot,final TreeOperationLog _log) { + ChangeSet cs = tip.getChangeSet(); + long currentRevision = cs.revision(); + long nextRevision = currentRevision + 1; + + PersistentChangeList list = new PersistentChangeList(uuid, treeName, _log); + Node root = _newRoot.getAsNode(); + PersistentChangeSet newCs = new PersistentChangeSet(root, cs, list, uuid, treeName, nextRevision); + DefaultTreeContext newContext = new DefaultTreeContext(_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) { + return DefaultEither.newA((Error)new DefaultError()); + } + reservation.confirm(); + TransactionManager txManager = new PersistentTransactionManager(treeName, writer, newContext, repository, uuid); + return DefaultEither.newB(txManager); + } + + @Override + public long getRevision() + { + ChangeSet cs = tip.getChangeSet(); + return cs.revision(); + } + + @Override + public String getUUID() { + return uuid; + } + + + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/remote/RemoteConfig.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/remote/RemoteConfig.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,19 @@ +package alice.jungle.remote; +import alice.topology.node.TopologyNodeConfig; + + +public class RemoteConfig extends TopologyNodeConfig { + + public int bbsPort = 8080; + + public RemoteConfig(String[] args) { + super(args); + for (int i = 0; i< args.length; i++) { + if ("-bbsPort".equals(args[i])) { + bbsPort = Integer.parseInt(args[++i]); + } else if("-bp".equals(args[i])) { + bbsPort = Integer.parseInt(args[++i]); + } + } + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/transaction/NetworkDefaultJungleTree.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/transaction/NetworkDefaultJungleTree.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,56 @@ +package alice.jungle.transaction; + +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.ChangeListWriter; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext; + +public class NetworkDefaultJungleTree> implements JungleTree { + private final AtomicReservableReference> repository; + private final String uuid; + private final String treeName; + private final ChangeListWriter writer; + private final TreeEditor editor; + + public NetworkDefaultJungleTree(String _treeName, TreeContext _tc,String _uuid,ChangeListWriter _writer,TreeEditor _editor) + { + treeName = _treeName; + repository = new AtomicReservableReference>(_tc); + uuid = _uuid; + writer = _writer; + editor = _editor; + } + + @Override + public JungleTreeEditor getTreeEditor() + { + TreeContext tc = repository.get(); + NetworkTransactionManager txManager = new NetworkTransactionManager(treeName, writer,tc,repository,uuid); + T root = tc.getTreeNode(); + return new NetworkDefaultJungleTreeEditor(treeName, root,txManager,editor); + } + + @Override + public JungleTreeEditor getLocalTreeEditor() + { + TreeContext tc = repository.get(); + NetworkTransactionManager txManager = new NetworkTransactionManager(treeName, writer,tc,repository,uuid); + T root = tc.getTreeNode(); + return NetworkDefaultJungleTreeEditor.NewLocalJungleTreeEditor(treeName,root,txManager, editor); + } + + @Override + public Node getRootNode() + { + TreeContext tc = repository.get(); + ChangeSet cs = tc.getChangeSet(); + return cs.getRoot(); + } + + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/transaction/NetworkDefaultJungleTreeEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/transaction/NetworkDefaultJungleTreeEditor.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,194 @@ +package alice.jungle.transaction; + + +import java.io.IOException; +import java.nio.ByteBuffer; + +import alice.jungle.operations.NetworkTreeOperationLog; +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.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultTreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNodeHook; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DefaultTreeOperation; +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.store.trasnformer.AppendChildAt; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteAttribute; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteChildAt; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager; +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; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter; +import jungle.app.bbs.codesegment.NullCodeSegment; + +public class NetworkDefaultJungleTreeEditor> implements JungleTreeEditor { + + private final TransactionManager txManager; + private final T root; + private final TreeEditor editor; + private final String treeName; + private final TreeOperationLog log; + private boolean exportLog; + + public NetworkDefaultJungleTreeEditor(String _treeName, T _root,TransactionManager _txManager,TreeEditor _editor) + { + this(_treeName, _root,_txManager,_editor,new DefaultTreeOperationLog()); + } + + public NetworkDefaultJungleTreeEditor(String _treeName, T _root,TransactionManager _txManager,TreeEditor _editor, TreeOperationLog _log) + { + treeName = _treeName; + root = _root; + txManager = _txManager; + editor = _editor; + log = _log; + exportLog = true; + } + + public static > NetworkDefaultJungleTreeEditor NewLocalJungleTreeEditor(String _treeName, T1 _root,TransactionManager _txManager,TreeEditor _editor) { + NetworkDefaultJungleTreeEditor treeEditor = new NetworkDefaultJungleTreeEditor(_treeName, _root,_txManager,_editor,new DefaultTreeOperationLog()); + treeEditor.exportLog = false; + return treeEditor; + } + + public static > NetworkDefaultJungleTreeEditor NewLocalJungleTreeEditor(String _treeName, T1 _root,TransactionManager _txManager,TreeEditor _editor, TreeOperationLog _log) { + NetworkDefaultJungleTreeEditor treeEditor = new NetworkDefaultJungleTreeEditor(_treeName, _root,_txManager,_editor,_log); + treeEditor.exportLog = false; + return treeEditor; + } + + private Either _edit(final NodePath _path,NodeEditor _e) + { + LoggingNodeHook hook = new LoggingNodeHook(_e); + Either either = editor.edit(root,_path,hook); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + T newNode = either.b(); + OperationLog newLog = hook.getLog(); + + IterableConverter.Converter converter = new IterableConverter.Converter(){ + @Override + public TreeOperation conv(NodeOperation _b){ + return new DefaultTreeOperation(_path,_b); + } + }; + + Iterable iterable = new IterableConverter(newLog,converter); + DefaultTreeOperationLog treeOperationLog = new DefaultTreeOperationLog(iterable,newLog.length()); + TreeOperationLog newTreeOpLog = log.append(treeOperationLog); + + JungleTreeEditor newEditor; + if(exportLog) { + newEditor = new NetworkDefaultJungleTreeEditor(treeName, newNode,txManager,editor,newTreeOpLog); + } else { + newEditor = NetworkDefaultJungleTreeEditor.NewLocalJungleTreeEditor(treeName, newNode, txManager, editor, newTreeOpLog); + } + return DefaultEither.newB(newEditor); + } + + @Override + public Either addNewChildAt(NodePath _path, int _pos) + { + AppendChildAt appendChildAt = new AppendChildAt(_pos); + return _edit(_path,appendChildAt); + } + + @Override + public Either deleteChildAt(NodePath _path, int _pos) + { + DeleteChildAt deleteChildAt = new DeleteChildAt(_pos); + return _edit(_path,deleteChildAt); + } + + @Override + public Either putAttribute(NodePath _path,String _key,ByteBuffer _value) + { + PutAttribute putAttribute = new PutAttribute(_key,_value); + return _edit(_path,putAttribute); + } + + @Override + public Either deleteAttribute(NodePath _path, String _key) + { + DeleteAttribute deleteAttribute = new DeleteAttribute(_key); + return _edit(_path,deleteAttribute); + } + + @Override + public Either edit(NodePath _path,NodeEditor _editor) + { + return _edit(_path,_editor); + } + + @Override + public Either success() + { + Either> either = txManager.commit(root,log); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + if(exportLog) { + try { + putTreeOperationLog(log); + } catch (IOException e) { + return DefaultEither.newA(either.a()); + } + } + + TransactionManager newTxManager = either.b(); + JungleTreeEditor newTreeEditor = new NetworkDefaultJungleTreeEditor(treeName, root,newTxManager,editor); + + return DefaultEither.newB(newTreeEditor); + } + + @Override + public String getID() + { + return txManager.getUUID(); + } + + @Override + public String getRevision() + { + return Long.toString(txManager.getRevision()); + } + + @Override + public Node getRoot() + { + return root.getAsNode(); + } + + public String getTreeName() { + return treeName; + } + + public TreeOperationLog getTreeOperationLog() { + return log; + } + + public void putTreeOperationLog(Iterable newLog) throws IOException { + String uuid = getID(); + String treeName = getTreeName(); + String updaterName = getID(); + String revision = getRevision(); + putDataSegment(uuid, treeName, updaterName, newLog, revision); + } + + public void putDataSegment(String _uuid, String _treeName, String _updaterName, Iterable newLog, String nextRevision) throws IOException { + NetworkTreeOperationLog netLog = new NetworkTreeOperationLog(_uuid, _treeName,newLog); + NullCodeSegment cs = new NullCodeSegment(); + cs.ods.put("log", netLog); + cs.execute(); /* Do nothing CodeSegment */ + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/alice/jungle/transaction/NetworkTransactionManager.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/transaction/NetworkTransactionManager.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,94 @@ +package alice.jungle.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> implements TransactionManager +{ + + private final AtomicReservableReference> repository; + private final TreeContext tip; + private final ChangeListWriter writer; + private final String uuid; + private final String treeName; + + public NetworkTransactionManager(String _treeName, ChangeListWriter _writer,TreeContext _tip, + AtomicReservableReference> _repository,String _uuid) + { + repository = _repository; + tip = _tip; + writer = _writer; + uuid = _uuid; + treeName = _treeName; + } + + @Override + public Either> 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 iterator(){ + return _log.iterator(); + } + @Override + public String uuid() { + return uuid; + } + @Override + public String getTreeName() { + return treeName; + } + }; + + Node root = _newRoot.getAsNode(); + DefaultChangeSet newCs = new DefaultChangeSet(root, cs, list, uuid, treeName, nextRevision); + DefaultTreeContext newContext = new DefaultTreeContext(_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) { + return DefaultEither.newA((Error)new DefaultError()); + } + reservation.confirm(); + TransactionManager txManager = new NetworkTransactionManager(treeName, writer, newContext, repository, uuid); + return DefaultEither.newB(txManager); + } + + @Override + public long getRevision() + { + ChangeSet cs = tip.getChangeSet(); + return cs.revision(); + } + + @Override + public String getUUID() { + return uuid; + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/jungle/app/bbs/BoardMessage.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/app/bbs/BoardMessage.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,8 @@ +package jungle.app.bbs; + +public interface BoardMessage +{ + public String getUUID(); + public String getAuthor(); + public String getMessage(); +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/jungle/app/bbs/BulletinBoard.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/app/bbs/BulletinBoard.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,11 @@ +package jungle.app.bbs; + +public interface BulletinBoard +{ + public Iterable getBoards(); + public void createBoards(String _name,String _author,String _initMessage,String _editKey); + public void createBoardMessage(String _board,String _author,String _message,String _editKey); + public void editMessage(String _board,String _uuid,String _author,String _message,String _editKey); + + public Iterable getMessages(String _boardName); +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/jungle/app/bbs/CassandraBulletinBoard.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/app/bbs/CassandraBulletinBoard.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,192 @@ +package jungle.app.bbs; + +import java.util.Collections; +import java.util.List; +import java.util.UUID; + +import org.apache.cassandra.locator.SimpleStrategy; + +import me.prettyprint.cassandra.serializers.StringSerializer; +import me.prettyprint.cassandra.serializers.UUIDSerializer; +import me.prettyprint.cassandra.service.CassandraHost; +import me.prettyprint.cassandra.service.template.SuperCfResult; +import me.prettyprint.cassandra.service.template.SuperCfUpdater; +import me.prettyprint.cassandra.service.template.ThriftSuperCfTemplate; +import me.prettyprint.cassandra.utils.TimeUUIDUtils; +import me.prettyprint.hector.api.Cluster; +import me.prettyprint.hector.api.Keyspace; +import me.prettyprint.hector.api.beans.HSuperColumn; +import me.prettyprint.hector.api.beans.OrderedSuperRows; +import me.prettyprint.hector.api.beans.SuperRow; +import me.prettyprint.hector.api.beans.SuperSlice; +import me.prettyprint.hector.api.ddl.ColumnFamilyDefinition; +import me.prettyprint.hector.api.ddl.ColumnType; +import me.prettyprint.hector.api.ddl.ComparatorType; +import me.prettyprint.hector.api.ddl.KeyspaceDefinition; +import me.prettyprint.hector.api.factory.HFactory; +import me.prettyprint.hector.api.query.QueryResult; +import me.prettyprint.hector.api.query.RangeSuperSlicesQuery; +import me.prettyprint.hector.api.query.SuperSliceQuery; + +public class CassandraBulletinBoard implements BulletinBoard +{ + private final String address; + private final String clusterName; + private final Cluster cluster; + private final String keyspace; + + private static final String COLUMN_FAMILY_BOARD = "boards"; + + public CassandraBulletinBoard(String _clusterName,String _address,String _keyspaceName) + { + address = _address; + clusterName = _clusterName; + keyspace = _keyspaceName; + cluster = HFactory.getOrCreateCluster(clusterName,address); + + initialize(); + } + + private void initialize() + { + if(cluster.describeKeyspace(keyspace) == null){ + KeyspaceDefinition keyspaceDefinition = HFactory.createKeyspaceDefinition(keyspace, + SimpleStrategy.class.getName(),1,Collections. emptyList()); + cluster.addKeyspace(keyspaceDefinition,false); + ColumnFamilyDefinition columnFamilyDefinition = HFactory.createColumnFamilyDefinition(keyspace,COLUMN_FAMILY_BOARD,ComparatorType.UUIDTYPE); + columnFamilyDefinition.setColumnType(ColumnType.SUPER); + cluster.addColumnFamily(columnFamilyDefinition); + } + } + + public Iterable getBoards() + { + Keyspace ksp = HFactory.createKeyspace(keyspace, cluster); + RangeSuperSlicesQuery query = HFactory.createRangeSuperSlicesQuery(ksp,StringSerializer.get(), + UUIDSerializer.get(),StringSerializer.get(),StringSerializer.get()); + query.setColumnFamily(COLUMN_FAMILY_BOARD).setKeys(null,null).setRange(null,null,false,0); + + QueryResult> result = query.execute(); + OrderedSuperRows rows = result.get(); + List> list = rows.getList(); + + IterableConverter.Converter> converter + = new IterableConverter.Converter>(){ + public String conv(SuperRow _b) { + return _b.getKey(); + } + }; + + return new IterableConverter>(list,converter); + } + + private static final String COLUMN_MESSAGE_AUTHOR = "author"; + private static final String COLUMN_MESSAGE_BODY = "message"; + private static final String COLUMN_MESSAGE_EDIT_KEY = "edit"; + + public void createBoardMessage(UUID _time,String _name,String _author,String _message,String _editKey) + { + Keyspace ksp = HFactory.createKeyspace(keyspace,cluster); + ThriftSuperCfTemplate template = + new ThriftSuperCfTemplate(ksp,COLUMN_FAMILY_BOARD,StringSerializer.get(), + UUIDSerializer.get(),StringSerializer.get()); + + SuperCfUpdater updater = template.createUpdater(_name,_time); + updater.setString(COLUMN_MESSAGE_AUTHOR,_author); + updater.setString(COLUMN_MESSAGE_BODY,_message); + updater.setString(COLUMN_MESSAGE_EDIT_KEY,_editKey); + + template.update(updater); + } + + public void createBoards(String _name,String _author,String _initMessage,String _editKey) + { + UUID time = TimeUUIDUtils.getTimeUUID(0); + createBoardMessage(time,_name,_author,_initMessage,_editKey); + } + + public Iterable getMessages(String _boardName) + { + Keyspace ksp = HFactory.createKeyspace(keyspace,cluster); + SuperSliceQuery query = HFactory.createSuperSliceQuery(ksp, StringSerializer.get(), UUIDSerializer.get(), StringSerializer.get(), StringSerializer.get()); + + UUID start = TimeUUIDUtils.getTimeUUID(0); + query.setKey(_boardName).setColumnFamily(COLUMN_FAMILY_BOARD).setRange(start,null,false,100); + + QueryResult> result = query.execute(); + SuperSlice ss = result.get(); + List> list = ss.getSuperColumns(); + + IterableConverter.Converter> converter = + new IterableConverter.Converter>(){ + public BoardMessage conv(HSuperColumn _b){ + UUID uuid = _b.getName(); + String author = _b.getSubColumnByName(COLUMN_MESSAGE_AUTHOR).getValue(); + String message = _b.getSubColumnByName(COLUMN_MESSAGE_BODY).getValue(); + BoardMessageImpl bm = new BoardMessageImpl(author,message,uuid.toString()); + return bm; + } + }; + + + return new IterableConverter>(list,converter); + } + + private static class BoardMessageImpl implements BoardMessage + { + private final String author; + private final String message; + private final String uuid; + + public BoardMessageImpl(String _author,String _message,String _uuid) + { + author = _author; + message = _message; + uuid = _uuid; + } + + public String getAuthor() + { + return author; + } + + public String getMessage() + { + return message; + } + + public String getUUID() + { + return uuid; + } + } + + public void createBoardMessage(String _board, String _author, String _message,String _editKey) + { + UUID time = TimeUUIDUtils.getUniqueTimeUUIDinMillis(); + createBoardMessage(time,_board,_author,_message,_editKey); + } + + public void editMessage(String _board,String _uuid,String _author,String _message,String _editKey) + { + Keyspace ksp = HFactory.createKeyspace(keyspace, cluster); + UUID time = UUID.fromString(_uuid); + ThriftSuperCfTemplate template = + new ThriftSuperCfTemplate(ksp,COLUMN_FAMILY_BOARD,StringSerializer.get(), + UUIDSerializer.get(),StringSerializer.get()); + + SuperCfResult result = template.querySuperColumn(_board,time); + String editKey = result.getString(COLUMN_MESSAGE_EDIT_KEY); + if(!editKey.equals(editKey)){ + return; + } + + SuperCfUpdater updater = template.createUpdater(_board,time); + updater.setString(COLUMN_MESSAGE_AUTHOR,_author); + updater.setString(COLUMN_MESSAGE_BODY,_message); + updater.setString(COLUMN_MESSAGE_EDIT_KEY,_editKey); + + template.update(updater); + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/jungle/app/bbs/CreateBoardMessageServlet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/app/bbs/CreateBoardMessageServlet.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,40 @@ +package jungle.app.bbs; + +import java.io.PrintWriter; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class CreateBoardMessageServlet extends HttpServlet +{ + private final BulletinBoard bbs; + private static final String PARAM_BOARD_NAME = "bname"; + private static final String PARAM_BOARD_AUTHOR = "author"; + private static final String PARAM_BOARD_MESSAGE= "msg"; + private static final String PARAM_BOARD_EDITKEY = "key"; + + private static final long serialVersionUID = 1L; + + public CreateBoardMessageServlet(BulletinBoard _bbs) + { + bbs = _bbs; + } + + @Override + public void doPost(HttpServletRequest _req,HttpServletResponse _res) + { + String boardName = _req.getParameter(PARAM_BOARD_NAME); + String author = _req.getParameter(PARAM_BOARD_AUTHOR); + String msg = _req.getParameter(PARAM_BOARD_MESSAGE); + String key = _req.getParameter(PARAM_BOARD_EDITKEY); + + try{ + bbs.createBoardMessage(boardName,author,msg,key); + PrintWriter pw = _res.getWriter(); + pw.write("successfully written"); + }catch(Exception _e){ + _res.setStatus(500); + } + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/jungle/app/bbs/CreateBoardServlet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/app/bbs/CreateBoardServlet.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,39 @@ +package jungle.app.bbs; + +import java.io.PrintWriter; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class CreateBoardServlet extends HttpServlet +{ + private final BulletinBoard bbs; + private static final String PARAM_BOARD_NAME = "bname"; + private static final String PARAM_BOARD_AUTHOR = "author"; + private static final String PARAM_BOARD_INITMESSAGE= "msg"; + private static final String PARAM_BOARD_EDITKEY = "key"; + + private static final long serialVersionUID = 1L; + + public CreateBoardServlet(BulletinBoard _bbs) + { + bbs = _bbs; + } + + public void doPost(HttpServletRequest _req,HttpServletResponse _res) + { + String boardName = _req.getParameter(PARAM_BOARD_NAME); + String author = _req.getParameter(PARAM_BOARD_AUTHOR); + String msg = _req.getParameter(PARAM_BOARD_INITMESSAGE); + String key = _req.getParameter(PARAM_BOARD_EDITKEY); + + try{ + bbs.createBoards(boardName,author,msg,key); + PrintWriter pw = _res.getWriter(); + pw.write("successfully written"); + }catch(Exception _e){ + _res.setStatus(500); + } + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/jungle/app/bbs/DistributeApp.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/app/bbs/DistributeApp.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,16 @@ +package jungle.app.bbs; + + +import alice.jungle.remote.RemoteConfig; +import jungle.app.bbs.codesegment.StartBBSCodeSegment; +import alice.topology.node.TopologyNode; + + +public class DistributeApp +{ + public static void main( String[] args ) throws Exception + { + RemoteConfig conf = new RemoteConfig(args); + new TopologyNode(conf, new StartBBSCodeSegment(conf.bbsPort)); + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/jungle/app/bbs/EditMessageServlet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/app/bbs/EditMessageServlet.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,64 @@ +package jungle.app.bbs; + +import java.io.PrintWriter; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class EditMessageServlet extends HttpServlet +{ + private final BulletinBoard bbs; + private static final String PARAM_BOARD_NAME = "bname"; + private static final String PARAM_BOARD_MSGID = "uuid"; + private static final String PARAM_BOARD_AUTHOR = "author"; + private static final String PARAM_BOARD_MESSAGE= "msg"; + private static final String PARAM_BOARD_EDITKEY = "key"; + + private static final long serialVersionUID = 1L; + + public EditMessageServlet(BulletinBoard _bbs) + { + bbs = _bbs; + } + + public void doGet(HttpServletRequest _req,HttpServletResponse _res) + { + String bname = _req.getParameter(PARAM_BOARD_NAME); + String uuid = _req.getParameter(PARAM_BOARD_MSGID); + + + try{ + PrintWriter pw = _res.getWriter(); + pw.write("

edit message

"); + pw.write("Author : " + + "" + + "\n"); + pw.write("

Message

\n"); + pw.write("

\n"); + pw.write(""); + pw.flush(); + }catch(Exception _e){ + _res.setStatus(500); + } + } + + public void doPost(HttpServletRequest _req,HttpServletResponse _res) + { + String boardName = _req.getParameter(PARAM_BOARD_NAME); + String author = _req.getParameter(PARAM_BOARD_AUTHOR); + String msg = _req.getParameter(PARAM_BOARD_MESSAGE); + String key = _req.getParameter(PARAM_BOARD_EDITKEY); + String uuid = _req.getParameter(PARAM_BOARD_MSGID); + + try{ + bbs.editMessage(boardName, uuid, author, msg, key); + PrintWriter pw = _res.getWriter(); + pw.write("successfully written"); + pw.flush(); + }catch(Exception _e){ + _res.setStatus(500); + } + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/jungle/app/bbs/HectorSample.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/app/bbs/HectorSample.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,70 @@ +package jungle.app.bbs; + +import java.util.List; +import java.util.UUID; +import me.prettyprint.cassandra.serializers.StringSerializer; +import me.prettyprint.cassandra.serializers.UUIDSerializer; +import me.prettyprint.cassandra.service.template.SuperCfUpdater; +import me.prettyprint.cassandra.service.template.ThriftSuperCfTemplate; +import me.prettyprint.cassandra.utils.TimeUUIDUtils; +import me.prettyprint.hector.api.*; +import me.prettyprint.hector.api.beans.HColumn; +import me.prettyprint.hector.api.beans.HSuperColumn; +import me.prettyprint.hector.api.beans.OrderedSuperRows; +import me.prettyprint.hector.api.beans.SuperRow; +import me.prettyprint.hector.api.beans.SuperSlice; +import me.prettyprint.hector.api.factory.HFactory; +import me.prettyprint.hector.api.query.QueryResult; +import me.prettyprint.hector.api.query.RangeSuperSlicesQuery; +import me.prettyprint.hector.api.query.SuperSliceQuery; + +public class HectorSample +{ + public static void main(String _args[]) + { + Cluster myCluster = HFactory.getOrCreateCluster("test-cluster","localhost:9160"); + + Keyspace ksp = HFactory.createKeyspace("cassaBBS",myCluster); + /* + ColumnFamilyDefinition newCF = HFactory.createColumnFamilyDefinition("DEMO","ccc",ComparatorType.UUIDTYPE); + newCF.setColumnType(ColumnType.SUPER); + myCluster.addColumnFamily(newCF); + */ + + ThriftSuperCfTemplate template = + new ThriftSuperCfTemplate(ksp,"boards",StringSerializer.get(), + UUIDSerializer.get(),StringSerializer.get()); + UUID time = TimeUUIDUtils.getUniqueTimeUUIDinMillis(); + SuperCfUpdater updater = template.createUpdater("board1",TimeUUIDUtils.getTimeUUID(0)); + updater.setString("name","peter"); + updater.setString("message",time.toString()); + + template.update(updater); + + UUID start = TimeUUIDUtils.getTimeUUID(0); + + SuperSliceQuery sq = HFactory.createSuperSliceQuery(ksp, StringSerializer.get(), UUIDSerializer.get(), StringSerializer.get(), StringSerializer.get()); + sq.setKey("board1").setColumnFamily("ccc").setRange(start,null,false,100); + + QueryResult> results = sq.execute(); + + SuperSlice ss = results.get(); + List> list = ss.getSuperColumns(); + for(HSuperColumn sc : list){ + HColumn sub = sc.getSubColumnByName("name"); + System.out.println(sub.getValue()); + sub = sc.getSubColumnByName("message"); + System.out.println(sub.getValue()); + } + + RangeSuperSlicesQuery rsq = HFactory.createRangeSuperSlicesQuery(ksp,StringSerializer.get(), + UUIDSerializer.get(),StringSerializer.get(),StringSerializer.get()); + rsq.setKeys(null,null).setRange(null,null,false,0).setColumnFamily("ccc"); + + QueryResult> rsqResult = rsq.execute(); + OrderedSuperRows rows = rsqResult.get(); + for(SuperRow row : rows.getList()){ + System.out.println(row.getKey()); + } + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/jungle/app/bbs/IterableConverter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/app/bbs/IterableConverter.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,52 @@ +package jungle.app.bbs; + +import java.util.Iterator; + +public class IterableConverter implements Iterable +{ + private final Iterable iterable; + private final Converter converter; + + public IterableConverter(Iterable _iterable,Converter _converter) + { + iterable = _iterable; + converter = _converter; + } + + public Iterator iterator() + { + return new IteratorConverter(iterable.iterator(),converter); + } + + private static final class IteratorConverter implements Iterator + { + private final Iterator iterator; + private final Converter converter; + + public IteratorConverter(Iterator _iterator,Converter _converter) + { + iterator = _iterator; + converter = _converter; + } + + public boolean hasNext() + { + return iterator.hasNext(); + } + + public A next() + { + return converter.conv(iterator.next()); + } + + public void remove() + { + iterator.remove(); + } + } + + public static interface Converter + { + public A conv(B _b); + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/jungle/app/bbs/JungleManager.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/app/bbs/JungleManager.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,127 @@ +package jungle.app.bbs; + +import java.nio.ByteBuffer; +import java.util.Iterator; + +import alice.jungle.operations.NetworkTreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; +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.store.Command; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; +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; + +public class JungleManager { + private static JungleManager jm = new JungleManager(); + private Jungle jungle; + private static int NOT_CHANGE_POSITION = 0; + + private JungleManager() { + jungle = new DefaultJungle(null,"hogehoge",new DefaultTreeEditor(new DefaultTraverser())); + } + + public static void setJungle(Jungle _j) { + jm.jungle = _j; + } + + public static Jungle getJungle() { + return jm.jungle; + } + + public static JungleTree createNewTree(String name) { + return jm.jungle.createNewTree(name); + } + + public static Either edit(JungleTreeEditor _editor ,TreeOperationLog _log, int pos) { + JungleTreeEditor editor = _editor; + Either either = null; + for (TreeOperation op : _log) { + either = _edit(editor, op, pos); + if(either.isA()) { + return either; + } + editor = either.b(); + } + return either; + } + + private static Either _edit(JungleTreeEditor editor, + TreeOperation op, int _pos) { + NodePath path = new DefaultNodePath(); + NodeOperation nodeOp = op.getNodeOperation(); + int pos = _pos; + if (_pos == NOT_CHANGE_POSITION ) { + pos = nodeOp.getPosition(); + } + Command c = nodeOp.getCommand(); + String key = ""; + switch (c) { + case PUT_ATTRIBUTE: + path = op.getNodePath(); + key = nodeOp.getKey(); + ByteBuffer value = nodeOp.getValue(); + return editor.putAttribute(path, key, value); + case DELETE_ATTRIBUTE: + key = nodeOp.getKey(); + return editor.deleteAttribute(path, key); + case APPEND_CHILD: + return editor.addNewChildAt(path, pos); + case DELETE_CHILD: + return editor.deleteChildAt(path, 0); + } + return null; + } + + public static Either update(NetworkTreeOperationLog netLog) { + String treeName = netLog.getTreeName(); + Jungle jungle = JungleManager.getJungle(); + if (jungle.getTreeByName(treeName) == null) { + if(null == jungle.createNewTree(treeName)){ + throw new IllegalStateException(); + } + } + JungleTree tree = jungle.getTreeByName(treeName); + JungleTreeEditor editor = tree.getLocalTreeEditor(); + + // int pos = calculatePosition(tree.getRootNode(), netLog.getTimeStamp()); + int pos = 0; + Either either = JungleManager.edit(editor, netLog, pos); + if(either.isA()) { + throw new IllegalStateException(); + } + editor = either.b(); + either = editor.success(); + if(either.isA()) { + throw new IllegalStateException(); + } + return either; + } + + private static int calculatePosition(Node node, long newNodeTimeStamp) { + int count = 0; + long childTimeStamp = 0; + for(Iterator iter = node.getChildren().iterator();iter.hasNext();) { + Node n = iter.next(); + if(n.getAttributes().get("timestamp") == null) { + return NOT_CHANGE_POSITION; + } + if(n.getAttributes().get("timestamp") != null) { + childTimeStamp = n.getAttributes().get("timestamp").getLong(); + if (newNodeTimeStamp < childTimeStamp) { + break; + } + } + count++; + } + return count; + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/jungle/app/bbs/NetworkJungleBulletinBoard.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/app/bbs/NetworkJungleBulletinBoard.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,231 @@ +package jungle.app.bbs; + +import java.nio.ByteBuffer; +import java.util.Date; +import java.util.concurrent.atomic.AtomicInteger; + +import alice.jungle.core.NetworkDefaultJungle; +import alice.jungle.persistent.AliceJournal; +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.Children; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; +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; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter; + +public class NetworkJungleBulletinBoard implements BulletinBoard +{ + private final Jungle jungle; + + public NetworkJungleBulletinBoard(String _uuid) + { + jungle = new NetworkDefaultJungle(new AliceJournal(), _uuid,new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("boards"); + JungleManager.setJungle(jungle); + } + + public Iterable getBoards() + { + JungleTree tree = jungle.getTreeByName("boards"); + Node node = tree.getRootNode(); + Children chs = node.getChildren(); + + IterableConverter.Converter converter = new IterableConverter.Converter(){ + public String conv(Node _b) { + ByteBuffer e = _b.getAttributes().get("name"); + return new String(e.array()); + } + }; + + return new IterableConverter(chs,converter); + } + + public void createBoards(final String _name,final String _author,final String _initMessage,final String _editKey) + { + if(null == jungle.createNewTree(_name)){ + throw new IllegalStateException(); + } + + JungleTree tree = jungle.getTreeByName("boards"); + JungleTreeEditor editor = tree.getTreeEditor(); + DefaultNodePath root = new DefaultNodePath(); + Either either = editor.addNewChildAt(root,0); + if(either.isA()){ + throw new IllegalStateException(); + } + editor = either.b(); + + either = editor.putAttribute(root.add(0),"name",ByteBuffer.wrap(_name.getBytes())); + if(either.isA()){ + throw new IllegalStateException(); + } + editor = either.b(); + Either result = editor.success(); + if(result.isA()){ + throw new IllegalStateException(); + } + final long timestamp = new Date().getTime(); + + + tree = jungle.getTreeByName(_name); + editor = tree.getTreeEditor(); + either = editor.addNewChildAt(root,0); + if(either.isA()){ + throw new IllegalStateException(); + } + editor = either.b(); + + NodeEditor e = new NodeEditor(){ + public > Either edit(T _e){ + _e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b(); + _e = _e.getAttributes().put("mes",ByteBuffer.wrap(_initMessage.getBytes())).b(); + _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b(); + ByteBuffer tBuffer = ByteBuffer.allocate(16); + _e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b(); + return DefaultEither.newB(_e); + } + }; + + either = editor.edit(root.add(0),e); + if(either.isA()){ + throw new IllegalStateException(); + } + editor = either.b(); + editor.success(); + + } + + public void createBoardMessage(final String _board,final String _author,final String _message,final String _editKey) + { + JungleTree tree = jungle.getTreeByName(_board); + if(tree == null){ + throw new IllegalStateException(); + } + + Either either; + do{ + Node node = tree.getRootNode(); + int size = node.getChildren().size(); + DefaultNodePath path = new DefaultNodePath(); + + JungleTreeEditor editor = tree.getTreeEditor(); + either = editor.addNewChildAt(path,size); + if(either.isA()){ + throw new IllegalStateException(); + } + editor = either.b(); + final long timestamp = new Date().getTime(); + NodeEditor e = new NodeEditor(){ + public > Either edit(T _e){ + _e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b(); + _e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b(); + _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b(); + ByteBuffer tBuffer = ByteBuffer.allocate(16); + _e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b(); + return DefaultEither.newB(_e); + } + }; + path = path.add(size); + either = editor.edit(path,e); + if(either.isA()){ + throw new IllegalStateException(); + } + editor = either.b(); + either = editor.success(); + + }while(either.isA()); + /* Put DataSegment */ + } + + public void editMessage(String _board,String _uuid,final String _author,final String _message,final String _editKey) + { + for(;;) { + DefaultNodePath path = new DefaultNodePath(); + path = path.add(Integer.parseInt(_uuid)); + + JungleTree tree = jungle.getTreeByName(_board); + JungleTreeEditor editor = tree.getTreeEditor(); + final long timestamp = new Date().getTime(); + NodeEditor e = new NodeEditor(){ + public > Either edit(T _e){ + _e = _e.getAttributes().put("author",ByteBuffer.wrap(_author.getBytes())).b(); + _e = _e.getAttributes().put("mes",ByteBuffer.wrap(_message.getBytes())).b(); + _e = _e.getAttributes().put("key",ByteBuffer.wrap(_editKey.getBytes())).b(); + ByteBuffer tBuffer = ByteBuffer.allocate(16); + _e = _e.getAttributes().put("timestamp",tBuffer.putLong(timestamp)).b(); + return DefaultEither.newB(_e); + } + }; + + Either either = editor.edit(path,e); + if(either.isA()){ + throw new IllegalStateException(); + } + editor = either.b(); + either = editor.success(); + if(!either.isA()) { + return; + } + } + + } + + public Iterable getMessages(String _boardName) + { + JungleTree tree = jungle.getTreeByName(_boardName); + Node node = tree.getRootNode(); + Children chs = node.getChildren(); + + final AtomicInteger counter = new AtomicInteger(0); + IterableConverter.Converter converter = new IterableConverter.Converter(){ + public BoardMessage conv(Node _b) { + String uuid = Integer.toString(counter.get()); + String author = new String(_b.getAttributes().get("author").array()); + String message = new String(_b.getAttributes().get("mes").array()); + counter.incrementAndGet(); + return new BoardMessageImpl(author,message,uuid); + } + }; + + return new IterableConverter(chs,converter); + } + + + + private static class BoardMessageImpl implements BoardMessage + { + private final String author; + private final String message; + private final String uuid; + + public BoardMessageImpl(String _author,String _message,String _uuid) + { + author = _author; + message = _message; + uuid = _uuid; + } + + public String getAuthor() + { + return author; + } + + public String getMessage() + { + return message; + } + + public String getUUID() + { + return uuid; + } + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/jungle/app/bbs/ShowBoardMessageServlet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/app/bbs/ShowBoardMessageServlet.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,60 @@ +package jungle.app.bbs; + +import java.io.PrintWriter; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class ShowBoardMessageServlet extends HttpServlet +{ + /** + * + */ + private static final long serialVersionUID = 1L; + private final BulletinBoard bbs; + private final String createBoardMessagePath; + private final String editMessagePath; + + private static final String PARAM_BOARD_NAME = "bname"; + + public ShowBoardMessageServlet(BulletinBoard _bbs,String _createBoardMessagePath, String _editMessagePath) + { + bbs = _bbs; + createBoardMessagePath = _createBoardMessagePath; + editMessagePath = _editMessagePath; + } + + public void doGet(HttpServletRequest _req,HttpServletResponse _res) + { + String bname = _req.getParameter(PARAM_BOARD_NAME); + + try{ + printBoard(bname,_res.getWriter()); + }catch(Exception _e){ + _res.setStatus(500); + } + + } + + private void printBoard(String _bname,PrintWriter _pw) throws Exception + { + _pw.write("\n"); + _pw.write("

"+_bname+"

\n"); + + _pw.write("Author : EditKey :

\n"); + _pw.write("

Message

\n"); + _pw.write("

\n"); + + for(BoardMessage msg : bbs.getMessages(_bname)){ + _pw.write("
"); + _pw.write("

"+msg.getAuthor()+"

"); + _pw.write("

"+msg.getMessage()+"

"); + _pw.write("
edit"); + } + + _pw.write(""); + _pw.flush(); + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/jungle/app/bbs/ShowBoardsServlet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/app/bbs/ShowBoardsServlet.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,55 @@ +package jungle.app.bbs; + +import java.io.PrintWriter; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class ShowBoardsServlet extends HttpServlet +{ + /** + * + */ + private static final long serialVersionUID = 1L; + private final BulletinBoard bbs; + private final String createBoardPath; + private final String showBoardMessagePath; + + public ShowBoardsServlet(BulletinBoard _bbs, String _createBoardPath,String _showBoardMessagePath) + { + bbs = _bbs; + createBoardPath = _createBoardPath; + showBoardMessagePath = _showBoardMessagePath; + } + + public void doGet(HttpServletRequest _req,HttpServletResponse _res) + { + try{ + printBoard(_res.getWriter()); + }catch(Exception _e){ + _res.setStatus(500); + } + + } + + private void printBoard(PrintWriter _pw) throws Exception + { + _pw.write("\n"); + _pw.write("

BBS

\n"); + _pw.write("Create new board.

"); + _pw.write("

BoardName :

\n"); + _pw.write("

Author : EditKey :

\n"); + _pw.write("

Message

\n"); + _pw.write("


\n"); + + _pw.write("

list of boards

"); + for(String board : bbs.getBoards()){ + _pw.write("

"+board+"

"); + } + + _pw.write(""); + _pw.flush(); + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/jungle/app/bbs/codesegment/LogUpdateCodeSegment.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/app/bbs/codesegment/LogUpdateCodeSegment.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,51 @@ +package jungle.app.bbs.codesegment; + + + +import java.util.List; + +import alice.jungle.operations.NetworkTreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; +import jungle.app.bbs.JungleManager; +import alice.codesegment.CodeSegment; +import alice.datasegment.CommandType; +import alice.datasegment.Receiver; + +public class LogUpdateCodeSegment extends CodeSegment { + + Receiver log = ids.create(CommandType.PEEK); + Receiver clist = ids.create(CommandType.PEEK); + + + public LogUpdateCodeSegment() { + log.setKey("log"); + clist.setKey("_CLIST");; + } + + public LogUpdateCodeSegment(int index) { + log.setKey("log", index); + clist.setKey("_CLIST");; + } + + public void run() { + int index = log.index; + NetworkTreeOperationLog netLog = log.asClass(NetworkTreeOperationLog.class); + @SuppressWarnings("unchecked") + List list = clist.asClass(List.class); + if (!log.from.equals("local")) { + Either either = JungleManager.update(netLog); + if(either.isA()) { + /* Should throw after new LogUpdateCodeSegment */ + throw new IllegalStateException(); + } + } + for (String node : list) { + if (!node.equals(log.from)) { + ods.put(node, log.key, log.getVal()); + } + } + new LogUpdateCodeSegment(index); + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/jungle/app/bbs/codesegment/NullCodeSegment.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/app/bbs/codesegment/NullCodeSegment.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,12 @@ +package jungle.app.bbs.codesegment; + +import alice.codesegment.CodeSegment; + +public class NullCodeSegment extends CodeSegment { + + @Override + public void run() { + + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/jungle/app/bbs/codesegment/StartBBSCodeSegment.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/app/bbs/codesegment/StartBBSCodeSegment.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,77 @@ +package jungle.app.bbs.codesegment; + +import java.util.regex.Pattern; +import java.util.regex.Matcher; + +import javax.servlet.Servlet; + +import jungle.app.bbs.BulletinBoard; +import jungle.app.bbs.CreateBoardMessageServlet; +import jungle.app.bbs.CreateBoardServlet; +import jungle.app.bbs.EditMessageServlet; +import jungle.app.bbs.NetworkJungleBulletinBoard; +import jungle.app.bbs.ShowBoardMessageServlet; +import jungle.app.bbs.ShowBoardsServlet; +import alice.jungle.datasegment.store.HashSetDataSegment; + +import org.mortbay.jetty.Server; +import org.mortbay.jetty.servlet.ServletHandler; +import org.mortbay.jetty.servlet.ServletHolder; + +import alice.codesegment.CodeSegment; +import alice.datasegment.CommandType; +import alice.datasegment.Receiver; + +public class StartBBSCodeSegment extends CodeSegment { + + int bbsPort = 8080; + Receiver host = ids.create(CommandType.PEEK); + private Pattern pattern = Pattern.compile("^(node|cli)([0-9]+)$"); + + public StartBBSCodeSegment(int p) { + bbsPort = p; + host.setKey("host"); + } + + public StartBBSCodeSegment() { + host.setKey("host"); + } + + public void run() { + System.out.println("StartBBSCodeSegment"); + String name = host.asString(); + System.out.println("name : "+ name); + Matcher matcher = pattern.matcher(name); + matcher.find(); +// String type = matcher.group(1); + + /* Jetty registration */ + BulletinBoard cassaBBS = new NetworkJungleBulletinBoard(name); + String createBoardMessagePath = "/createBoardMessage"; + String createBoardPath = "/createBoard"; + String editMessagePath = "/editMessage"; + String showBoardMessagePath = "/showBoardMessage"; + + Servlet createBoardMessage = new CreateBoardMessageServlet(cassaBBS); + Servlet createBoard = new CreateBoardServlet(cassaBBS); + Servlet editBoardMessage = new EditMessageServlet(cassaBBS); + Servlet index = new ShowBoardsServlet(cassaBBS,createBoardPath,showBoardMessagePath); + Servlet board = new ShowBoardMessageServlet(cassaBBS,createBoardMessagePath,editMessagePath); + + Server serv = new Server(bbsPort); + ServletHandler context = new ServletHandler(); + context.addServletWithMapping(new ServletHolder(createBoardMessage),createBoardMessagePath); + context.addServletWithMapping(new ServletHolder(createBoard),createBoardPath); + context.addServletWithMapping(new ServletHolder(editBoardMessage),editMessagePath); + context.addServletWithMapping(new ServletHolder(index),"/"); + context.addServletWithMapping(new ServletHolder(board),showBoardMessagePath); + serv.addHandler(context); + try { + serv.start(); + } catch (Exception e) { + e.printStackTrace(); + } + new LogUpdateCodeSegment(); + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/main/java/jungle/app/bbs/transformer/MergeBBS.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/app/bbs/transformer/MergeBBS.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,22 @@ +package jungle.app.bbs.transformer; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; + +public class MergeBBS implements NodeEditor { + + + public MergeBBS() { + + } + + @Override + public > Either edit(T _e) + { + return _e.getChildren().deleteChildAt(0); + } + + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/alice/jungle/PersistenJournalTest.java --- a/src/test/alice/jungle/PersistenJournalTest.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -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.operations.NetworkNodePath; -import alice.jungle.persistence.JungleUpdater; -import alice.jungle.persistence.PersistentChangeList; -import alice.jungle.persistence.PersistentJournal; -import alice.jungle.persistence.PersistentJungle; - -public class PersistenJournalTest { - - public static void main(String[] args) throws IOException { - PersistentJournal journal = new PersistentJournal( - new File("./log/commit.log")); - Jungle jungle = new PersistentJungle(journal, "uuid",new DefaultTreeEditor(new DefaultTraverser())); - 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 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(); - - PersistentJournal journal2 = new PersistentJournal(); - journal2.setInputFile(new File("./log/commit.log")); - journal2.setOutputFile(new File("./log/commit2.log")); - Jungle jungle2 = new PersistentJungle(journal, "uuid2", new DefaultTreeEditor(new DefaultTraverser())); - ChangeListReader reader = journal2.getReader(); - PersistentChangeList chList = (PersistentChangeList) reader.read(); - for (; chList != null; chList = (PersistentChangeList) reader.read()) { - String treeName = chList.getTreeName(); - JungleTree tree2 = jungle2.getTreeByName(treeName); - if(tree2 == null) { - tree2 = jungle2.createNewTree(treeName); - } - System.out.println("Tree name :"+treeName); - JungleTreeEditor editor2 = tree2.getTreeEditor(); - Either either2 = JungleUpdater.edit(editor2, chList.getTreeOperationLog()); - if (either2.isA()) { - System.err.println("JungleUpdater Error"); - System.exit(0); - } - editor2 = either2.b(); - editor2.success(); - printChangeList(chList); - System.out.println(); - } - JungleTree tree2 = jungle2.getTreeByName("hoge"); - Node node = tree2.getRootNode(); - System.out.println("Children size : "+node.getChildren().size()); - - journal2.close(); - - } - - public static void printChangeList(ChangeList chList) { - 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 (opValue.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)); - } - - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/alice/jungle/core/operations/NetworkAppendChildOperationTest.java --- a/src/test/alice/jungle/core/operations/NetworkAppendChildOperationTest.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -package test.alice.jungle.core.operations; - -import java.io.IOException; - -import org.msgpack.MessagePack; -import org.msgpack.type.Value; - -import alice.jungle.operations.NetworkAppendChildAtOperation; -import junit.framework.TestCase; - -public class NetworkAppendChildOperationTest extends TestCase { - - public void testMsgpackConvert() throws IOException { - NetworkAppendChildAtOperation op = new NetworkAppendChildAtOperation(1); - MessagePack msgpack = new MessagePack(); - Value v = msgpack.unconvert(op); - NetworkAppendChildAtOperation mOp = msgpack.convert(v, NetworkAppendChildAtOperation.class); -// NodeOperation mOp = msgpack.convert(v, NodeOperation.class); - assertEquals(op.getCommand(), mOp.getCommand()); - assertEquals(op.getPosition(), 1); - assertEquals(op.getPosition(), mOp.getPosition()); - } -} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/alice/jungle/core/operations/NetworkDeleteAttributeOprationTest.java --- a/src/test/alice/jungle/core/operations/NetworkDeleteAttributeOprationTest.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -package test.alice.jungle.core.operations; - -import java.io.IOException; - -import org.msgpack.MessagePack; -import org.msgpack.type.Value; - -import alice.jungle.operations.NetworkDeleteAttributeOperation; -import junit.framework.TestCase; - -public class NetworkDeleteAttributeOprationTest extends TestCase { - - public void testMsgpackConvert() throws IOException { - NetworkDeleteAttributeOperation op = new NetworkDeleteAttributeOperation("hoge"); - MessagePack msgpack = new MessagePack(); - Value v = msgpack.unconvert(op); - NetworkDeleteAttributeOperation mOp = msgpack.convert(v, NetworkDeleteAttributeOperation.class); - assertEquals(op.getCommand(), mOp.getCommand()); - assert(mOp.getKey().equals("hoge")); - - } - - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/alice/jungle/core/operations/NetworkDeleteChildAtOperationTest.java --- a/src/test/alice/jungle/core/operations/NetworkDeleteChildAtOperationTest.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -package test.alice.jungle.core.operations; - -import java.io.IOException; - -import org.msgpack.MessagePack; -import org.msgpack.type.Value; - -import alice.jungle.operations.NetworkDeleteChildAtOperation; -import junit.framework.TestCase; - -public class NetworkDeleteChildAtOperationTest extends TestCase { - - - public void testMsgpackConvert() throws IOException { - NetworkDeleteChildAtOperation op = new NetworkDeleteChildAtOperation(1); - MessagePack msgpack = new MessagePack(); - Value v = msgpack.unconvert(op); - NetworkDeleteChildAtOperation mOp = msgpack.convert(v, NetworkDeleteChildAtOperation.class); - assertEquals(op.getCommand(), mOp.getCommand()); - assertEquals(op.getPosition(), mOp.getPosition()); - - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/alice/jungle/core/operations/NetworkNodeOperationTest.java --- a/src/test/alice/jungle/core/operations/NetworkNodeOperationTest.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -package test.alice.jungle.core.operations; - -import java.io.IOException; - -import org.msgpack.MessagePack; -import org.msgpack.type.Value; - -import alice.jungle.operations.NetworkAppendChildAtOperation; -import alice.jungle.operations.NetworkNodeOperation; -import junit.framework.TestCase; - -public class NetworkNodeOperationTest extends TestCase { - - public void testMsgpackConvert() throws IOException { - NetworkAppendChildAtOperation op = new NetworkAppendChildAtOperation(1); - NetworkNodeOperation nOp = new NetworkNodeOperation(op); - MessagePack msgpack = new MessagePack(); - Value v = msgpack.unconvert(nOp); - NetworkNodeOperation mOp = msgpack.convert(v, NetworkNodeOperation.class); - assertEquals(op.getCommand(), mOp.getCommand()); - assertEquals(op.getPosition(), 1); - assertEquals(op.getPosition(), mOp.getPosition()); - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/alice/jungle/core/operations/NetworkPutAttributeOperationTest.java --- a/src/test/alice/jungle/core/operations/NetworkPutAttributeOperationTest.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -package test.alice.jungle.core.operations; - -import java.io.IOException; -import java.nio.ByteBuffer; - -import org.msgpack.MessagePack; -import org.msgpack.type.Value; - -import alice.jungle.operations.NetworkPutAttributeOperation; -import junit.framework.TestCase; - -public class NetworkPutAttributeOperationTest extends TestCase { - - public void testMsgpackConvert() throws IOException { - ByteBuffer value = ByteBuffer.allocate(16); - value.put( "fuga".getBytes()); - NetworkPutAttributeOperation op = new NetworkPutAttributeOperation("hoge", value); - MessagePack msgpack = new MessagePack(); - Value v = msgpack.unconvert(op); - NetworkPutAttributeOperation mOp = msgpack.convert(v, NetworkPutAttributeOperation.class); -// NodeOperation mOp = msgpack.convert(v, NodeOperation.class); - assertEquals(op.getCommand(), mOp.getCommand()); - System.out.println(new String(op.getValue().array())); - assert((new String(op.getValue().array())).equals(new String(mOp.getValue().array()))); - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/alice/jungle/core/operations/NetworkTreeOperationLogTest.java --- a/src/test/alice/jungle/core/operations/NetworkTreeOperationLogTest.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -package test.alice.jungle.core.operations; - -import java.io.IOException; - -import org.msgpack.MessagePack; -import org.msgpack.type.Value; - -import alice.jungle.operations.NetworkAppendChildAtOperation; -import alice.jungle.operations.NetworkNodePath; -import alice.jungle.operations.NetworkTreeOperationLog; -import junit.framework.TestCase; - -public class NetworkTreeOperationLogTest extends TestCase { - - public void testMsgpackConvert() throws IOException { - NetworkAppendChildAtOperation op = new NetworkAppendChildAtOperation(1); - NetworkNodePath path = new NetworkNodePath(); - path.add(1).add(2); - NetworkTreeOperationLog log = new NetworkTreeOperationLog(); - log.add(path, op); - log.add(path, op); - MessagePack msgpack = new MessagePack(); - Value v = msgpack.unconvert(log); - NetworkTreeOperationLog mLog = msgpack.convert(v, NetworkTreeOperationLog.class); - assertNotNull(mLog); - - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/alice/jungle/core/operations/NetworkTreeOperationTest.java --- a/src/test/alice/jungle/core/operations/NetworkTreeOperationTest.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -package test.alice.jungle.core.operations; - -import java.io.IOException; - -import org.msgpack.MessagePack; -import org.msgpack.type.Value; - -import alice.jungle.operations.NetworkAppendChildAtOperation; -import alice.jungle.operations.NetworkNodePath; -import alice.jungle.operations.NetworkTreeOperation; -import junit.framework.TestCase; - -public class NetworkTreeOperationTest extends TestCase { - - public void testMsgpackConvert() throws IOException { - NetworkAppendChildAtOperation op = new NetworkAppendChildAtOperation(1); - NetworkNodePath path = new NetworkNodePath(); - path.add(1).add(2); - NetworkTreeOperation treeOp = new NetworkTreeOperation(path, op); - MessagePack msgpack = new MessagePack(); - Value v = msgpack.unconvert(treeOp); - NetworkTreeOperation mOp = msgpack.convert(v, NetworkTreeOperation.class); - assertNotNull(mOp.getNodePath()); - assertEquals(op.getCommand(), mOp.getNodeOperation().getCommand()); - } - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/alice/jungle/datasegment/NetworkNodePathTest.java --- a/src/test/alice/jungle/datasegment/NetworkNodePathTest.java Mon Nov 25 18:13:03 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +0,0 @@ -package test.alice.jungle.datasegment; - -import java.io.IOException; -import java.util.Iterator; - -import org.msgpack.MessagePack; -import org.msgpack.type.Value; - -import alice.jungle.operations.NetworkNodePath; -import junit.framework.TestCase; - -public class NetworkNodePathTest extends TestCase { - - public void testMsgpackConvert() throws IOException { - NetworkNodePath path = new NetworkNodePath(); - path = path.add(1).add(2).add(3); - MessagePack msgpack = new MessagePack(); - Value value = msgpack.unconvert(path); - NetworkNodePath mPath = msgpack.convert(value, NetworkNodePath.class); - assertEquals(path.size(), mPath.size()); - Iterator iter1 = path.iterator(); - Iterator iter2 = mPath.iterator(); - while(iter1.hasNext() & iter2.hasNext()) { - int i1 = iter1.next(); - int i2 = iter2.next(); - assertEquals(i1, i2); - } - } - - - -} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/codesegment/local/HasFieldCodeSegment.java --- a/src/test/java/alice/codesegment/local/HasFieldCodeSegment.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/codesegment/local/HasFieldCodeSegment.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,4 +1,4 @@ -package test.java.alice.codesegment.local; +package alice.codesegment.local; import alice.codesegment.CodeSegment; import alice.datasegment.CommandType; diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/codesegment/local/StartLocalCodeSegment.java --- a/src/test/java/alice/codesegment/local/StartLocalCodeSegment.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/codesegment/local/StartLocalCodeSegment.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,4 +1,4 @@ -package test.java.alice.codesegment.local; +package alice.codesegment.local; public class StartLocalCodeSegment { diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/codesegment/remote/ClientCodeSegment.java --- a/src/test/java/alice/codesegment/remote/ClientCodeSegment.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/codesegment/remote/ClientCodeSegment.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,4 +1,4 @@ -package test.java.alice.codesegment.remote; +package alice.codesegment.remote; import alice.codesegment.CodeSegment; import alice.datasegment.CommandType; diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/codesegment/remote/ClientFirstSetKey.java --- a/src/test/java/alice/codesegment/remote/ClientFirstSetKey.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/codesegment/remote/ClientFirstSetKey.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,4 +1,4 @@ -package test.java.alice.codesegment.remote; +package alice.codesegment.remote; import alice.codesegment.CodeSegment; diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/codesegment/remote/HostCodeSegment.java --- a/src/test/java/alice/codesegment/remote/HostCodeSegment.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/codesegment/remote/HostCodeSegment.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,4 +1,4 @@ -package test.java.alice.codesegment.remote; +package alice.codesegment.remote; import alice.codesegment.CodeSegment; import alice.datasegment.CommandType; diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/codesegment/remote/HostFirstPut.java --- a/src/test/java/alice/codesegment/remote/HostFirstPut.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/codesegment/remote/HostFirstPut.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,4 +1,4 @@ -package test.java.alice.codesegment.remote; +package alice.codesegment.remote; import alice.codesegment.CodeSegment; diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/codesegment/remote/StartHostCodeSegment.java --- a/src/test/java/alice/codesegment/remote/StartHostCodeSegment.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/codesegment/remote/StartHostCodeSegment.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,7 +1,7 @@ -package test.java.alice.codesegment.remote; +package alice.codesegment.remote; +import alice.jungle.remote.RemoteConfig; import alice.daemon.AliceDaemon; -import alice.jungle.remote.RemoteConfig; public class StartHostCodeSegment { diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/CheckDoubleTreeAttr.java --- a/src/test/java/alice/jungle/CheckDoubleTreeAttr.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/jungle/CheckDoubleTreeAttr.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,4 +1,4 @@ -package test.java.alice.jungle; +package alice.jungle; import java.nio.ByteBuffer; import java.util.Iterator; diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/CopyAttrJungle2.java --- a/src/test/java/alice/jungle/CopyAttrJungle2.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/jungle/CopyAttrJungle2.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,20 +1,17 @@ -package test.java.alice.jungle; +package alice.jungle; import java.io.IOException; -import test.java.alice.jungle.log.example.PrintChildrenAttribute; - +import alice.jungle.datasegment.container.DefaultTreeOperationLogContainer; 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.store.impl.logger.DefaultTreeOperationLog; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -import jungle.app.bbs.JungleManager; import alice.codesegment.CodeSegment; import alice.datasegment.CommandType; import alice.datasegment.Receiver; -import alice.jungle.datasegment.store.container.DefaultTreeOperationLogContainer; public class CopyAttrJungle2 extends CodeSegment { diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/DoubleJungleManager.java --- a/src/test/java/alice/jungle/DoubleJungleManager.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/jungle/DoubleJungleManager.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,4 +1,4 @@ -package test.java.alice.jungle; +package alice.jungle; import java.nio.ByteBuffer; @@ -7,12 +7,9 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; 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.DefaultNodePath; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DefaultTreeOperation; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.PutAttributeOperation; 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; diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/HashSetConvertTest.java --- a/src/test/java/alice/jungle/HashSetConvertTest.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/jungle/HashSetConvertTest.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,4 +1,4 @@ -package test.java.alice.jungle; +package alice.jungle; import java.util.HashSet; diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/LocalDoubleJungleTree.java --- a/src/test/java/alice/jungle/LocalDoubleJungleTree.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/jungle/LocalDoubleJungleTree.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,4 +1,4 @@ -package test.java.alice.jungle; +package alice.jungle; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/PersistenJournalTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/alice/jungle/PersistenJournalTest.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,116 @@ +package alice.jungle; + +import java.io.File; +import java.io.IOException; +import java.nio.ByteBuffer; + +import alice.jungle.operations.NetworkNodePath; +import alice.jungle.persistent.JungleUpdater; +import alice.jungle.persistent.PersistentChangeList; +import alice.jungle.persistent.PersistentJournal; +import alice.jungle.persistent.PersistentJungle; +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; + +public class PersistenJournalTest { + + public static void main(String[] args) throws IOException { + PersistentJournal journal = new PersistentJournal( + new File("./log/commit.log")); + Jungle jungle = new PersistentJungle(journal, "uuid",new DefaultTreeEditor(new DefaultTraverser())); + 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 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(); + + PersistentJournal journal2 = new PersistentJournal(); + journal2.setInputFile(new File("./log/commit.log")); + journal2.setOutputFile(new File("./log/commit2.log")); + Jungle jungle2 = new PersistentJungle(journal, "uuid2", new DefaultTreeEditor(new DefaultTraverser())); + ChangeListReader reader = journal2.getReader(); + PersistentChangeList chList = (PersistentChangeList) reader.read(); + for (; chList != null; chList = (PersistentChangeList) reader.read()) { + String treeName = chList.getTreeName(); + JungleTree tree2 = jungle2.getTreeByName(treeName); + if(tree2 == null) { + tree2 = jungle2.createNewTree(treeName); + } + System.out.println("Tree name :"+treeName); + JungleTreeEditor editor2 = tree2.getTreeEditor(); + Either either2 = JungleUpdater.edit(editor2, chList.getTreeOperationLog()); + if (either2.isA()) { + System.err.println("JungleUpdater Error"); + System.exit(0); + } + editor2 = either2.b(); + editor2.success(); + printChangeList(chList); + System.out.println(); + } + JungleTree tree2 = jungle2.getTreeByName("hoge"); + Node node = tree2.getRootNode(); + System.out.println("Children size : "+node.getChildren().size()); + + journal2.close(); + + } + + public static void printChangeList(ChangeList chList) { + 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 (opValue.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)); + } + + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/PutAttrJungle1.java --- a/src/test/java/alice/jungle/PutAttrJungle1.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/jungle/PutAttrJungle1.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,4 +1,4 @@ -package test.java.alice.jungle; +package alice.jungle; import java.nio.ByteBuffer; diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/core/operations/NetworkAppendChildOperationTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/alice/jungle/core/operations/NetworkAppendChildOperationTest.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,24 @@ +package alice.jungle.core.operations; + +import java.io.IOException; + +import alice.jungle.operations.NetworkAppendChildAtOperation; + +import org.msgpack.MessagePack; +import org.msgpack.type.Value; + +import junit.framework.TestCase; + +public class NetworkAppendChildOperationTest extends TestCase { + + public void testMsgpackConvert() throws IOException { + NetworkAppendChildAtOperation op = new NetworkAppendChildAtOperation(1); + MessagePack msgpack = new MessagePack(); + Value v = msgpack.unconvert(op); + NetworkAppendChildAtOperation mOp = msgpack.convert(v, NetworkAppendChildAtOperation.class); +// NodeOperation mOp = msgpack.convert(v, NodeOperation.class); + assertEquals(op.getCommand(), mOp.getCommand()); + assertEquals(op.getPosition(), 1); + assertEquals(op.getPosition(), mOp.getPosition()); + } +} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/core/operations/NetworkDeleteAttributeOprationTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/alice/jungle/core/operations/NetworkDeleteAttributeOprationTest.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,25 @@ +package alice.jungle.core.operations; + +import java.io.IOException; + +import alice.jungle.operations.NetworkDeleteAttributeOperation; + +import org.msgpack.MessagePack; +import org.msgpack.type.Value; + +import junit.framework.TestCase; + +public class NetworkDeleteAttributeOprationTest extends TestCase { + + public void testMsgpackConvert() throws IOException { + NetworkDeleteAttributeOperation op = new NetworkDeleteAttributeOperation("hoge"); + MessagePack msgpack = new MessagePack(); + Value v = msgpack.unconvert(op); + NetworkDeleteAttributeOperation mOp = msgpack.convert(v, NetworkDeleteAttributeOperation.class); + assertEquals(op.getCommand(), mOp.getCommand()); + assert(mOp.getKey().equals("hoge")); + + } + + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/core/operations/NetworkDeleteChildAtOperationTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/alice/jungle/core/operations/NetworkDeleteChildAtOperationTest.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,25 @@ +package alice.jungle.core.operations; + +import java.io.IOException; + +import alice.jungle.operations.NetworkDeleteChildAtOperation; + +import org.msgpack.MessagePack; +import org.msgpack.type.Value; + +import junit.framework.TestCase; + +public class NetworkDeleteChildAtOperationTest extends TestCase { + + + public void testMsgpackConvert() throws IOException { + NetworkDeleteChildAtOperation op = new NetworkDeleteChildAtOperation(1); + MessagePack msgpack = new MessagePack(); + Value v = msgpack.unconvert(op); + NetworkDeleteChildAtOperation mOp = msgpack.convert(v, NetworkDeleteChildAtOperation.class); + assertEquals(op.getCommand(), mOp.getCommand()); + assertEquals(op.getPosition(), mOp.getPosition()); + + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/core/operations/NetworkNodeOperationTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/alice/jungle/core/operations/NetworkNodeOperationTest.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,26 @@ +package alice.jungle.core.operations; + +import java.io.IOException; + +import alice.jungle.operations.NetworkAppendChildAtOperation; +import alice.jungle.operations.NetworkNodeOperation; + +import org.msgpack.MessagePack; +import org.msgpack.type.Value; + +import junit.framework.TestCase; + +public class NetworkNodeOperationTest extends TestCase { + + public void testMsgpackConvert() throws IOException { + NetworkAppendChildAtOperation op = new NetworkAppendChildAtOperation(1); + NetworkNodeOperation nOp = new NetworkNodeOperation(op); + MessagePack msgpack = new MessagePack(); + Value v = msgpack.unconvert(nOp); + NetworkNodeOperation mOp = msgpack.convert(v, NetworkNodeOperation.class); + assertEquals(op.getCommand(), mOp.getCommand()); + assertEquals(op.getPosition(), 1); + assertEquals(op.getPosition(), mOp.getPosition()); + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/core/operations/NetworkPutAttributeOperationTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/alice/jungle/core/operations/NetworkPutAttributeOperationTest.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,28 @@ +package alice.jungle.core.operations; + +import java.io.IOException; +import java.nio.ByteBuffer; + +import alice.jungle.operations.NetworkPutAttributeOperation; + +import org.msgpack.MessagePack; +import org.msgpack.type.Value; + +import junit.framework.TestCase; + +public class NetworkPutAttributeOperationTest extends TestCase { + + public void testMsgpackConvert() throws IOException { + ByteBuffer value = ByteBuffer.allocate(16); + value.put( "fuga".getBytes()); + NetworkPutAttributeOperation op = new NetworkPutAttributeOperation("hoge", value); + MessagePack msgpack = new MessagePack(); + Value v = msgpack.unconvert(op); + NetworkPutAttributeOperation mOp = msgpack.convert(v, NetworkPutAttributeOperation.class); +// NodeOperation mOp = msgpack.convert(v, NodeOperation.class); + assertEquals(op.getCommand(), mOp.getCommand()); + System.out.println(new String(op.getValue().array())); + assert((new String(op.getValue().array())).equals(new String(mOp.getValue().array()))); + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/core/operations/NetworkTreeOperationLogTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/alice/jungle/core/operations/NetworkTreeOperationLogTest.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,30 @@ +package alice.jungle.core.operations; + +import java.io.IOException; + +import alice.jungle.operations.NetworkAppendChildAtOperation; +import alice.jungle.operations.NetworkNodePath; +import alice.jungle.operations.NetworkTreeOperationLog; + +import org.msgpack.MessagePack; +import org.msgpack.type.Value; + +import junit.framework.TestCase; + +public class NetworkTreeOperationLogTest extends TestCase { + + public void testMsgpackConvert() throws IOException { + NetworkAppendChildAtOperation op = new NetworkAppendChildAtOperation(1); + NetworkNodePath path = new NetworkNodePath(); + path.add(1).add(2); + NetworkTreeOperationLog log = new NetworkTreeOperationLog(); + log.add(path, op); + log.add(path, op); + MessagePack msgpack = new MessagePack(); + Value v = msgpack.unconvert(log); + NetworkTreeOperationLog mLog = msgpack.convert(v, NetworkTreeOperationLog.class); + assertNotNull(mLog); + + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/core/operations/NetworkTreeOperationTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/alice/jungle/core/operations/NetworkTreeOperationTest.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,28 @@ +package alice.jungle.core.operations; + +import java.io.IOException; + +import alice.jungle.operations.NetworkAppendChildAtOperation; +import alice.jungle.operations.NetworkNodePath; +import alice.jungle.operations.NetworkTreeOperation; + +import org.msgpack.MessagePack; +import org.msgpack.type.Value; + +import junit.framework.TestCase; + +public class NetworkTreeOperationTest extends TestCase { + + public void testMsgpackConvert() throws IOException { + NetworkAppendChildAtOperation op = new NetworkAppendChildAtOperation(1); + NetworkNodePath path = new NetworkNodePath(); + path.add(1).add(2); + NetworkTreeOperation treeOp = new NetworkTreeOperation(path, op); + MessagePack msgpack = new MessagePack(); + Value v = msgpack.unconvert(treeOp); + NetworkTreeOperation mOp = msgpack.convert(v, NetworkTreeOperation.class); + assertNotNull(mOp.getNodePath()); + assertEquals(op.getCommand(), mOp.getNodeOperation().getCommand()); + } + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/datasegment/NetworkNodePathTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/alice/jungle/datasegment/NetworkNodePathTest.java Tue Nov 26 06:43:10 2013 +0900 @@ -0,0 +1,33 @@ +package alice.jungle.datasegment; + +import java.io.IOException; +import java.util.Iterator; + +import alice.jungle.operations.NetworkNodePath; + +import org.msgpack.MessagePack; +import org.msgpack.type.Value; + +import junit.framework.TestCase; + +public class NetworkNodePathTest extends TestCase { + + public void testMsgpackConvert() throws IOException { + NetworkNodePath path = new NetworkNodePath(); + path = path.add(1).add(2).add(3); + MessagePack msgpack = new MessagePack(); + Value value = msgpack.unconvert(path); + NetworkNodePath mPath = msgpack.convert(value, NetworkNodePath.class); + assertEquals(path.size(), mPath.size()); + Iterator iter1 = path.iterator(); + Iterator iter2 = mPath.iterator(); + while(iter1.hasNext() & iter2.hasNext()) { + int i1 = iter1.next(); + int i2 = iter2.next(); + assertEquals(i1, i2); + } + } + + + +} diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/log/example/ListTest.java --- a/src/test/java/alice/jungle/log/example/ListTest.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/jungle/log/example/ListTest.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,4 +1,4 @@ -package test.java.alice.jungle.log.example; +package alice.jungle.log.example; import java.util.Iterator; import java.util.concurrent.atomic.AtomicInteger; diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/log/example/LogReadCodeSegment.java --- a/src/test/java/alice/jungle/log/example/LogReadCodeSegment.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/jungle/log/example/LogReadCodeSegment.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,8 +1,9 @@ -package test.java.alice.jungle.log.example; +package alice.jungle.log.example; import java.io.IOException; import java.nio.ByteBuffer; +import alice.jungle.datasegment.container.DefaultTreeOperationLogContainer; 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; @@ -18,7 +19,6 @@ import alice.codesegment.CodeSegment; import alice.datasegment.CommandType; import alice.datasegment.Receiver; -import alice.jungle.datasegment.store.container.DefaultTreeOperationLogContainer; public class LogReadCodeSegment extends CodeSegment { diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/log/example/LogSendTest.java --- a/src/test/java/alice/jungle/log/example/LogSendTest.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/jungle/log/example/LogSendTest.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,11 +1,10 @@ -package test.java.alice.jungle.log.example; +package alice.jungle.log.example; import java.io.IOException; import java.nio.ByteBuffer; -import alice.jungle.datasegment.store.container.DefaultTreeOperationLogContainer; +import alice.jungle.datasegment.container.DefaultTreeOperationLogContainer; import alice.jungle.transaction.NetworkDefaultJungleTreeEditor; - 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.store.impl.DefaultNodePath; diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/log/example/PrintChildrenAttribute.java --- a/src/test/java/alice/jungle/log/example/PrintChildrenAttribute.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/jungle/log/example/PrintChildrenAttribute.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,4 +1,4 @@ -package test.java.alice.jungle.log.example; +package alice.jungle.log.example; import java.nio.ByteBuffer; diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/log/example/StartCodeSegment.java --- a/src/test/java/alice/jungle/log/example/StartCodeSegment.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/jungle/log/example/StartCodeSegment.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,10 +1,11 @@ -package test.java.alice.jungle.log.example; +package alice.jungle.log.example; import java.io.IOException; import java.nio.ByteBuffer; import java.util.LinkedList; import java.util.List; +import alice.jungle.datasegment.container.DefaultTreeOperationLogContainer; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultTreeOperationLog; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.AppendChildAtOperation; @@ -14,7 +15,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.PutAttributeOperation; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; import alice.codesegment.CodeSegment; -import alice.jungle.datasegment.store.container.DefaultTreeOperationLogContainer; public class StartCodeSegment extends CodeSegment { diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/log/example/TestCodeSegment.java --- a/src/test/java/alice/jungle/log/example/TestCodeSegment.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/jungle/log/example/TestCodeSegment.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,4 +1,4 @@ -package test.java.alice.jungle.log.example; +package alice.jungle.log.example; import java.io.IOException; import java.nio.ByteBuffer; @@ -16,7 +16,7 @@ import alice.datasegment.CommandType; import alice.datasegment.Receiver; import alice.jungle.core.NetworkDefaultJungle; -import alice.jungle.datasegment.store.container.DefaultTreeOperationLogContainer; +import alice.jungle.datasegment.container.DefaultTreeOperationLogContainer; import alice.jungle.transaction.NetworkDefaultJungleTreeEditor; import org.msgpack.type.Value; diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/log/example/TestLocalAlice.java --- a/src/test/java/alice/jungle/log/example/TestLocalAlice.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/jungle/log/example/TestLocalAlice.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,4 +1,4 @@ -package test.java.alice.jungle.log.example; +package alice.jungle.log.example; import alice.daemon.AliceDaemon; import alice.daemon.Config; diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/log/example/codesement/operation/ShowAttribute.java --- a/src/test/java/alice/jungle/log/example/codesement/operation/ShowAttribute.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/jungle/log/example/codesement/operation/ShowAttribute.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,4 +1,4 @@ -package test.java.alice.jungle.log.example.codesement.operation; +package alice.jungle.log.example.codesement.operation; import java.nio.ByteBuffer; diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/log/example/codesement/operation/StartJungleCodeSegment.java --- a/src/test/java/alice/jungle/log/example/codesement/operation/StartJungleCodeSegment.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/jungle/log/example/codesement/operation/StartJungleCodeSegment.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,16 +1,13 @@ -package test.java.alice.jungle.log.example.codesement.operation; +package alice.jungle.log.example.codesement.operation; import java.io.IOException; -import java.nio.ByteBuffer; +import alice.jungle.datasegment.container.DefaultTreeOperationContainer; 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.store.impl.DefaultNodePath; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DefaultTreeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.PutAttributeOperation; import jungle.app.bbs.JungleManager; -import alice.codesegment.CodeSegment; -import alice.jungle.datasegment.store.container.DefaultTreeOperationContainer; public class StartJungleCodeSegment { diff -r 03bf62bb699e -r f9e29a52efd3 src/test/java/alice/jungle/log/example/codesement/operation/TestPutAttributeCodeSegment.java --- a/src/test/java/alice/jungle/log/example/codesement/operation/TestPutAttributeCodeSegment.java Mon Nov 25 18:13:03 2013 +0900 +++ b/src/test/java/alice/jungle/log/example/codesement/operation/TestPutAttributeCodeSegment.java Tue Nov 26 06:43:10 2013 +0900 @@ -1,4 +1,4 @@ -package test.java.alice.jungle.log.example.codesement.operation; +package alice.jungle.log.example.codesement.operation; import java.io.IOException; import java.nio.ByteBuffer; @@ -8,9 +8,7 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; 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.TreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DefaultTreeOperation; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.PutAttributeOperation; @@ -18,15 +16,13 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; import jungle.app.bbs.JungleManager; +import alice.jungle.datasegment.container.DefaultTreeOperationContainer; +import alice.jungle.transaction.NetworkDefaultJungleTreeEditor; -import org.msgpack.type.Value; import alice.codesegment.CodeSegment; import alice.datasegment.CommandType; import alice.datasegment.Receiver; -import alice.jungle.datasegment.store.container.DefaultTreeOperationContainer; -import alice.jungle.datasegment.store.container.DefaultTreeOperationLogContainer; -import alice.jungle.transaction.NetworkDefaultJungleTreeEditor; public class TestPutAttributeCodeSegment extends CodeSegment {