# HG changeset patch # User one # Date 1373853593 -32400 # Node ID 8a532ca5df806789ad291a70799e43d78c810d93 # Parent 4851344e120e4b7f858add69fe0a826bd5437288 refactoring LogUpdateCodeSegment and ChildLogCheckCodeSegment diff -r 4851344e120e -r 8a532ca5df80 src/alice/jungle/codesegment/HashLogUpdateCodeSegment.java --- a/src/alice/jungle/codesegment/HashLogUpdateCodeSegment.java Mon Jul 15 10:13:34 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -package alice.jungle.codesegment; - -import alice.codesegment.CodeSegment; -import alice.datasegment.CommandType; -import alice.datasegment.Receiver; -import alice.jungle.datasegment.HashSetDataSegment; - -public class HashLogUpdateCodeSegment extends CodeSegment { - - Receiver hashLog = ids.create(CommandType.PEEK); - Receiver logString = ids.create(CommandType.TAKE); - - public HashLogUpdateCodeSegment() { - hashLog.setKey("hashLog"); - logString.setKey("logString"); - } - - public void run() { - HashSetDataSegment ds = hashLog.asClass(HashSetDataSegment.class); - String str = logString.asString(); - System.out.println("HashLogUpdateCodeSegment : "+ str); - ds.hash.add(str); - ods.put("hashLog", ds); - } -} diff -r 4851344e120e -r 8a532ca5df80 src/alice/jungle/codesegment/LogUpdateCodeSegment.java --- a/src/alice/jungle/codesegment/LogUpdateCodeSegment.java Mon Jul 15 10:13:34 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,105 +0,0 @@ -package alice.jungle.codesegment; - -import java.io.IOException; -import java.util.Iterator; - -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.impl.logger.DefaultTreeOperationLog; -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; -import jungle.test.bbs.JungleManager; -import alice.codesegment.CodeSegment; -import alice.datasegment.CommandType; -import alice.datasegment.Receiver; -import alice.jungle.datasegment.HashSetDataSegment; -import alice.jungle.datasegment.store.operations.DefaultTreeOperationLogContainer; -import alice.jungle.transaction.NetworkDefaultJungleTreeEditor; - -public class LogUpdateCodeSegment extends CodeSegment { - - Receiver parentLog = ids.create(CommandType.PEEK); - Receiver host = ids.create(CommandType.PEEK); - Receiver hashLog = ids.create(CommandType.PEEK); - - public LogUpdateCodeSegment() { - parentLog.setKey("parent", "log"); - host.setKey("host"); - hashLog.setKey("hashLog"); - } - - public LogUpdateCodeSegment(int index) { - parentLog.setKey("parent", "log", index); - host.setKey("host"); - hashLog.setKey("hashLog"); - } - - public void run() { - System.out.println("--LogUpdateCodeSegment--"); - int index = parentLog.index; - String h = host.asString(); - DefaultTreeOperationLogContainer container = parentLog.asClass(DefaultTreeOperationLogContainer.class); - HashSetDataSegment ds = hashLog.asClass(HashSetDataSegment.class); - if(ds.hash.contains(container.getHashLogString())) { - ods.update("hashLog", ds); - new LogUpdateCodeSegment(index); - return; - } - DefaultTreeOperationLog log = null; - try { - log = container.convert(); - } catch (IOException e) { - e.printStackTrace(); - } - String treeName = container.getTreeName(); - if (JungleManager.getJungle().getTreeByName(treeName) == null) { - if(null == JungleManager.getJungle().createNewTree(treeName)){ - throw new IllegalStateException(); - } - } - JungleTree tree = JungleManager.getJungle().getTreeByName(treeName); - JungleTreeEditor editor = tree.getTreeEditor(); - Either e = checkTimeStamp(tree.getRootNode(), container.getTimeStamp()); - Either either; - if(e.isA()) { - either = JungleManager.edit(editor, log, container.getPosition()); - } else { - either = JungleManager.edit(editor, log, e.b()); - } - if(either.isA()) { - throw new IllegalStateException(); - } - editor = either.b(); - either = editor.success(); - if(either.isA()) { - throw new IllegalStateException(); - } - ds.hash.add(container.getHashLogString()); - ods.update("hashLog", ds); - ods.put("log", container); - new LogUpdateCodeSegment(index); - } - - - private DefaultEither checkTimeStamp(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 DefaultEither.newA(new DefaultError()); - } - if(n.getAttributes().get("timestamp") != null) { - childTimeStamp = n.getAttributes().get("timestamp").getLong(); - if (newNodeTimeStamp < childTimeStamp) { - break; - } - } - count++; - } - return DefaultEither.newB(count); - } -} diff -r 4851344e120e -r 8a532ca5df80 src/alice/jungle/transaction/NetworkTransactionManager.java --- a/src/alice/jungle/transaction/NetworkTransactionManager.java Mon Jul 15 10:13:34 2013 +0900 +++ b/src/alice/jungle/transaction/NetworkTransactionManager.java Mon Jul 15 10:59:53 2013 +0900 @@ -3,7 +3,6 @@ import java.io.IOException; import java.util.Iterator; -import alice.jungle.codesegment.LogUpdateCodeSegment; import alice.jungle.datasegment.store.operations.DefaultTreeOperationLogContainer; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; @@ -24,6 +23,7 @@ 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; +import jungle.test.bbs.codesegment.LogUpdateCodeSegment; import jungle.test.bbs.codesegment.NullCodeSegmentForUpdate; public class NetworkTransactionManager> implements TransactionManager diff -r 4851344e120e -r 8a532ca5df80 src/jungle/test/bbs/DistributeApp.java --- a/src/jungle/test/bbs/DistributeApp.java Mon Jul 15 10:13:34 2013 +0900 +++ b/src/jungle/test/bbs/DistributeApp.java Mon Jul 15 10:59:53 2013 +0900 @@ -2,8 +2,7 @@ import javax.servlet.Servlet; -import jungle.test.bbs.codesegment.PutAnotherLogCodeSegment; -import jungle.test.bbs.codesegment.PutHostLogCodeSegment; +import jungle.test.bbs.codesegment.LogUpdateCodeSegment; import jungle.test.bbs.codesegment.StartBBSCodeSegment; import org.mortbay.jetty.Server; @@ -12,7 +11,6 @@ import alice.daemon.AliceDaemon; import alice.datasegment.DataSegment; -import alice.jungle.codesegment.LogUpdateCodeSegment; import alice.jungle.remote.RemoteConfig; import alice.topology.node.StartTopologyNode; import alice.topology.node.TopologyNode; diff -r 4851344e120e -r 8a532ca5df80 src/jungle/test/bbs/JungleManager.java --- a/src/jungle/test/bbs/JungleManager.java Mon Jul 15 10:13:34 2013 +0900 +++ b/src/jungle/test/bbs/JungleManager.java Mon Jul 15 10:59:53 2013 +0900 @@ -1,20 +1,27 @@ package jungle.test.bbs; +import java.io.IOException; import java.nio.ByteBuffer; +import java.util.Iterator; import alice.jungle.core.NetworkDefaultJungle; +import alice.jungle.datasegment.store.operations.DefaultTreeOperationLogContainer; 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.DefaultTreeOperationLog; 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.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; @@ -38,45 +45,7 @@ return jm.jungle.createNewTree(name); } - - 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) { - NodePath path = op.getNodePath(); - NodeOperation nodeOp = op.getNodeOperation(); - 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, 0); - case DELETE_CHILD: - return editor.deleteChildAt(path, 0); - } - return null; - } - - public static Either edit(JungleTreeEditor _editor ,TreeOperationLog _log, int pos) { - System.out.println("--path editor--"); JungleTreeEditor editor = _editor; Either either = null; for (TreeOperation op : _log) { @@ -111,6 +80,53 @@ } return null; } - + public static Either update(DefaultTreeOperationLogContainer container) { + DefaultTreeOperationLog log = null; + try { + log = container.convert(); + } catch (IOException e) { + e.printStackTrace(); + } + String treeName = container.getTreeName(); + if (JungleManager.getJungle().getTreeByName(treeName) == null) { + if(null == JungleManager.getJungle().createNewTree(treeName)){ + throw new IllegalStateException(); + } + } + JungleTree tree = JungleManager.getJungle().getTreeByName(treeName); + JungleTreeEditor editor = tree.getTreeEditor(); + int pos = checkTimeStamp(tree.getRootNode(), container.getTimeStamp(), container.getPosition()); + Either either = JungleManager.edit(editor, log, pos); + if(either.isA()) { + throw new IllegalStateException(); + } + editor = either.b(); + either = editor.success(); + if(either.isA()) { + throw new IllegalStateException(); + } + return either; + } + + + + private static int checkTimeStamp(Node node, long newNodeTimeStamp, int containerPosition) { + 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 containerPosition; + } + if(n.getAttributes().get("timestamp") != null) { + childTimeStamp = n.getAttributes().get("timestamp").getLong(); + if (newNodeTimeStamp < childTimeStamp) { + break; + } + } + count++; + } + return count; + } } diff -r 4851344e120e -r 8a532ca5df80 src/jungle/test/bbs/NetworkJungleBulletinBoard.java --- a/src/jungle/test/bbs/NetworkJungleBulletinBoard.java Mon Jul 15 10:13:34 2013 +0900 +++ b/src/jungle/test/bbs/NetworkJungleBulletinBoard.java Mon Jul 15 10:59:53 2013 +0900 @@ -5,7 +5,6 @@ import java.util.Date; import java.util.concurrent.atomic.AtomicInteger; -import alice.jungle.codesegment.HashLogUpdateCodeSegment; import alice.jungle.core.NetworkDefaultJungle; import alice.jungle.datasegment.store.operations.DefaultTreeOperationLogContainer; import alice.jungle.transaction.NetworkDefaultJungleTreeEditor; @@ -25,6 +24,7 @@ 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.test.bbs.codesegment.HashLogUpdateCodeSegment; import jungle.test.bbs.codesegment.NullCodeSegmentForUpdate; public class NetworkJungleBulletinBoard implements BulletinBoard diff -r 4851344e120e -r 8a532ca5df80 src/jungle/test/bbs/codesegment/ChildLogCheckCodeSegment.java --- a/src/jungle/test/bbs/codesegment/ChildLogCheckCodeSegment.java Mon Jul 15 10:13:34 2013 +0900 +++ b/src/jungle/test/bbs/codesegment/ChildLogCheckCodeSegment.java Mon Jul 15 10:59:53 2013 +0900 @@ -1,23 +1,14 @@ package jungle.test.bbs.codesegment; -import java.io.IOException; -import java.util.Iterator; -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.NodePath; -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.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; import jungle.test.bbs.JungleManager; import alice.codesegment.CodeSegment; import alice.datasegment.CommandType; import alice.datasegment.Receiver; -import alice.jungle.codesegment.HashLogUpdateCodeSegment; import alice.jungle.datasegment.HashSetDataSegment; import alice.jungle.datasegment.store.operations.DefaultTreeOperationLogContainer; @@ -39,39 +30,17 @@ hashLog.setKey("hashLog"); } - public void run() { - System.out.println("--ChildLogCheckCodeSegment--"); int index = childLog.index; - HashSetDataSegment ds = hashLog.asClass(HashSetDataSegment.class); String hostName = host.asString(); DefaultTreeOperationLogContainer container = childLog.asClass(DefaultTreeOperationLogContainer.class); - DefaultTreeOperationLog log = null; - try { - log = container.convert(); - } catch (IOException e) { - e.printStackTrace(); - } - String treeName = container.getTreeName(); - if (JungleManager.getJungle().getTreeByName(treeName) == null) { - if(null == JungleManager.getJungle().createNewTree(treeName)){ - throw new IllegalStateException(); - } + HashSetDataSegment ds = hashLog.asClass(HashSetDataSegment.class); + if(ds.hash.contains(container.getHashLogString())) { + ods.update("hashLog", ds); + new LogUpdateCodeSegment(index); + return; } - JungleTree tree = JungleManager.getJungle().getTreeByName(treeName); - JungleTreeEditor editor = tree.getTreeEditor(); - Either e = checkTimeStamp(tree.getRootNode(), container.getTimeStamp()); - Either either; - if(e.isA()) { - either = JungleManager.edit(editor, log, container.getPosition()); - } else { - either = JungleManager.edit(editor, log, e.b()); - } - if(either.isA()) { - throw new IllegalStateException(); - } - editor = either.b(); - either = editor.success(); + Either either = JungleManager.update(container); if(either.isA()) { throw new IllegalStateException(); } @@ -83,23 +52,4 @@ ods.put("parent", "childLog", container); } } - - private DefaultEither checkTimeStamp(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 DefaultEither.newA(new DefaultError()); - } - if(n.getAttributes().get("timestamp") != null) { - childTimeStamp = n.getAttributes().get("timestamp").getLong(); - if (newNodeTimeStamp < childTimeStamp) { - break; - } - } - count++; - } - return DefaultEither.newB(count); - } } diff -r 4851344e120e -r 8a532ca5df80 src/jungle/test/bbs/codesegment/HashLogUpdateCodeSegment.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jungle/test/bbs/codesegment/HashLogUpdateCodeSegment.java Mon Jul 15 10:59:53 2013 +0900 @@ -0,0 +1,25 @@ +package jungle.test.bbs.codesegment; + +import alice.codesegment.CodeSegment; +import alice.datasegment.CommandType; +import alice.datasegment.Receiver; +import alice.jungle.datasegment.HashSetDataSegment; + +public class HashLogUpdateCodeSegment extends CodeSegment { + + Receiver hashLog = ids.create(CommandType.PEEK); + Receiver logString = ids.create(CommandType.TAKE); + + public HashLogUpdateCodeSegment() { + hashLog.setKey("hashLog"); + logString.setKey("logString"); + } + + public void run() { + HashSetDataSegment ds = hashLog.asClass(HashSetDataSegment.class); + String str = logString.asString(); + System.out.println("HashLogUpdateCodeSegment : "+ str); + ds.hash.add(str); + ods.put("hashLog", ds); + } +} diff -r 4851344e120e -r 8a532ca5df80 src/jungle/test/bbs/codesegment/LogUpdateCodeSegment.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jungle/test/bbs/codesegment/LogUpdateCodeSegment.java Mon Jul 15 10:59:53 2013 +0900 @@ -0,0 +1,52 @@ +package jungle.test.bbs.codesegment; + + + +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.test.bbs.JungleManager; +import alice.codesegment.CodeSegment; +import alice.datasegment.CommandType; +import alice.datasegment.Receiver; +import alice.jungle.datasegment.HashSetDataSegment; +import alice.jungle.datasegment.store.operations.DefaultTreeOperationLogContainer; + +public class LogUpdateCodeSegment extends CodeSegment { + + Receiver parentLog = ids.create(CommandType.PEEK); + Receiver host = ids.create(CommandType.PEEK); + Receiver hashLog = ids.create(CommandType.PEEK); + + public LogUpdateCodeSegment() { + parentLog.setKey("parent", "log"); + host.setKey("host"); + hashLog.setKey("hashLog"); + } + + public LogUpdateCodeSegment(int index) { + parentLog.setKey("parent", "log", index); + host.setKey("host"); + hashLog.setKey("hashLog"); + } + + public void run() { + int index = parentLog.index; + String hostName = host.asString(); + DefaultTreeOperationLogContainer container = parentLog.asClass(DefaultTreeOperationLogContainer.class); + HashSetDataSegment ds = hashLog.asClass(HashSetDataSegment.class); + if(ds.hash.contains(container.getHashLogString())) { + ods.update("hashLog", ds); + new LogUpdateCodeSegment(index); + return; + } + Either either = JungleManager.update(container); + if(either.isA()) { + throw new IllegalStateException(); + } + ds.hash.add(container.getHashLogString()); + ods.update("hashLog", ds); + ods.put("log", container); + new LogUpdateCodeSegment(index); + } +} diff -r 4851344e120e -r 8a532ca5df80 src/jungle/test/bbs/codesegment/PutAnotherLogCodeSegment.java --- a/src/jungle/test/bbs/codesegment/PutAnotherLogCodeSegment.java Mon Jul 15 10:13:34 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -package jungle.test.bbs.codesegment; - -import org.msgpack.type.Value; - -import alice.codesegment.CodeSegment; -import alice.datasegment.CommandType; -import alice.datasegment.Receiver; -import alice.jungle.codesegment.LogUpdateCodeSegment; - -public class PutAnotherLogCodeSegment extends CodeSegment { - - public Receiver arg1 = ids.create(CommandType.TAKE); - - public void run() { - System.out.println("Client: PutAnotherLogCodeSegment"); - Value v = (Value)arg1.getVal(); - ods.put("remote", "anotherLog", v); - PutAnotherLogCodeSegment cs = new PutAnotherLogCodeSegment(); - cs.arg1.setKey("local", "log"); - } - -} diff -r 4851344e120e -r 8a532ca5df80 src/jungle/test/bbs/codesegment/PutHostLogCodeSegment.java --- a/src/jungle/test/bbs/codesegment/PutHostLogCodeSegment.java Mon Jul 15 10:13:34 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -package jungle.test.bbs.codesegment; - -import org.msgpack.type.Value; - -import alice.codesegment.CodeSegment; -import alice.datasegment.CommandType; -import alice.datasegment.Receiver; - -public class PutHostLogCodeSegment extends CodeSegment { - - public Receiver arg1 = ids.create(CommandType.TAKE); - - public void run() { - System.out.println("Host: PutHostLogCodeSegment"); - Value v = (Value) arg1.getVal(); - ods.put("local", "hostLog", v); - PutHostLogCodeSegment cs = new PutHostLogCodeSegment(); - cs.arg1.setKey("local", "log"); - } -} diff -r 4851344e120e -r 8a532ca5df80 src/jungle/test/bbs/codesegment/StartBBSCodeSegment.java --- a/src/jungle/test/bbs/codesegment/StartBBSCodeSegment.java Mon Jul 15 10:13:34 2013 +0900 +++ b/src/jungle/test/bbs/codesegment/StartBBSCodeSegment.java Mon Jul 15 10:59:53 2013 +0900 @@ -20,7 +20,6 @@ import alice.codesegment.CodeSegment; import alice.datasegment.CommandType; import alice.datasegment.Receiver; -import alice.jungle.codesegment.LogUpdateCodeSegment; import alice.jungle.datasegment.HashSetDataSegment; public class StartBBSCodeSegment extends CodeSegment {