# HG changeset patch # User Kazuma # Date 1480438075 -32400 # Node ID 44465893e8b8b85c1b32c31960c80726e64bcce4 first Commit diff -r 000000000000 -r 44465893e8b8 LICENSE --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LICENSE Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,22 @@ +Copyright (c) 2014-2014 Shinji KONO, Kazuki Akamine, Shoshi Tamaki, Nobuyasu Ohoshiro, Yu Sugimoto, Tatsuki Kanagawa + Information Engineeering, University of the Ryukyus + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff -r 000000000000 -r 44465893e8b8 benchmark/find.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/benchmark/find.js Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,16 @@ +function findDataLoop () { +var date_obj = new Date(); +var milliseconds = date_obj.getTime(); +for (var i = 1; i<= 50000; i++) { + var personData = db.person1.find({PersonId:"p:9"}).next(); + var roleId = personData.roleId +} +date_obj = new Date(); +print(date_obj.getTime() - milliseconds) +} + +function findData () { + var personVer = db.config.find({configVer:"v:1"}).next().PersonVer; + var personCollection = db.getCollection(personVer); + db.person1.find({PersonId:"p:9"}).next(); +} diff -r 000000000000 -r 44465893e8b8 benchmark/insert.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/benchmark/insert.js Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,13 @@ +function insertData(personCount) { +db.person1.drop(); +for (var i = 1; i<= personCount ; i++) { + + var user = { + + PersonId: "p:" + String(i), + roleRefIds:"r:" + String(i)} + db.person1.insert(user); +} + +db.person1.createIndex({PersonId:1}); +} diff -r 000000000000 -r 44465893e8b8 build.gradle --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/build.gradle Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,48 @@ +apply plugin: "java" + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 +[compileJava, compileTestJava]*.options*.encoding = 'UTF-8' +version = '1.0' + +repositories { + mavenCentral() + maven { url "http://eaio.com/maven2" } + maven { url "http://repo.maven.apache.org/maven2" } +} + +dependencies { + compile group: 'org.mongodb', name: 'mongo-java-driver', version: '3.0.0' + compile "commons-collections:commons-collections:3.2.1" + compile "org.apache.maven.surefire:surefire-junit4:2.13" + compile "com.google.guava:guava:12.0" + compile fileTree(dir: 'lib', include: '*.jar') + compile "junit:junit:4.7" + compile group: 'org.eclipse.jetty', name: 'jetty-server', version:'9.1.1.v20140108' + compile group: 'org.eclipse.jetty', name: 'jetty-servlet', version:'9.2.1.v20140609' + compile group: 'org.hectorclient', name: 'hector-core', version:'1.1-2' + compile group: 'com.github.stephenc.eaio-uuid', name: 'uuid', version:'3.3.0' + compile(group: 'org.apache.cassandra', name: 'cassandra-all', version:'1.2.1') { + exclude(module: 'slf4j-log4j12') + exclude(module: 'log4j') + } +} + + + + +jar { + manifest { + attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version + } + from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } + archiveName = 'jungle-core.jar' +} + +uploadArchives { + repositories { + flatDir { + dirs '.' + } + } +} diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/DefaultJungle$1.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/DefaultJungle$1.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/DefaultJungle.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/DefaultJungle.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/DefaultJungleTree.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/DefaultJungleTree.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/Jungle.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/Jungle.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/JungleTree.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/JungleTree.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/JungleTreeEditor.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/JungleTreeEditor.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/App.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/App.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/BoardMessage.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/BoardMessage.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/BulletinBoard.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/BulletinBoard.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CassandraBulletinBoard$1.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CassandraBulletinBoard$1.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CassandraBulletinBoard$2.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CassandraBulletinBoard$2.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CassandraBulletinBoard$BoardMessageImpl.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CassandraBulletinBoard$BoardMessageImpl.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CassandraBulletinBoard.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CassandraBulletinBoard.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CreateBoardMessageServlet.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CreateBoardMessageServlet.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CreateBoardServlet.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CreateBoardServlet.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/EditMessageServlet.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/EditMessageServlet.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/EditMessageUseGetServlet.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/EditMessageUseGetServlet.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/GetAttributeImp.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/GetAttributeImp.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/HectorSample.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/HectorSample.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/IterableConverter$Converter.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/IterableConverter$Converter.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/IterableConverter$IteratorConverter.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/IterableConverter$IteratorConverter.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/IterableConverter.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/IterableConverter.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/JungleBulletinBoard$1.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/JungleBulletinBoard$1.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/JungleBulletinBoard$2.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/JungleBulletinBoard$2.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/JungleBulletinBoard$BoardMessageImpl.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/JungleBulletinBoard$BoardMessageImpl.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/JungleBulletinBoard.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/JungleBulletinBoard.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/ShowBoardMessageServlet.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/ShowBoardMessageServlet.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/ShowBoardsServlet.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/bbs/ShowBoardsServlet.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/benchMark/Data/TreeMapBenchMark.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/benchMark/Data/TreeMapBenchMark.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/benchMark/JungleBenchMark.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/benchMark/JungleBenchMark.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/core/App.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/core/App.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/core/Attributes.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/core/Attributes.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/core/Children.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/core/Children.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/list/DefaultNode.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/list/DefaultNode.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/list/List$1.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/list/List$1.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/list/List$2.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/list/List$2.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/list/List.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/list/List.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/list/Node.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/list/Node.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/list/TailNode.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/list/TailNode.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/list/headNode.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/list/headNode.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/BlackNode.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/BlackNode.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/DefaultComparator.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/DefaultComparator.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/EmptyNode.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/EmptyNode.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/Node.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/Node.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/RedNode.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/RedNode.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/Rotate.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/Rotate.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/RotateParent.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/RotateParent.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/TreeMap$1.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/TreeMap$1.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/TreeMap.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/TreeMap.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/rebuildNode.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/rebuildNode.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/error/BasicErrors.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/error/BasicErrors.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeList.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeList.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeListReader.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeListReader.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeListWriter.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeListWriter.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultChangeListReader.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultChangeListReader.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultChangeListWriter.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultChangeListWriter.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultJournal.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultJournal.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultJournalWriter.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultJournalWriter.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/Journal.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/Journal.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/NullJournal$1.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/NullJournal$1.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/NullJournal$NullChangeListReader.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/NullJournal$NullChangeListReader.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/NullJournal$NullChangeListWriter.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/NullJournal$NullChangeListWriter.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/NullJournal.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/NullJournal.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/Result.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/persistent/Result.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/query/PathNodeIterator.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/query/PathNodeIterator.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/query/Query.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/query/Query.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/Command.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/Command.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/Constants.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/Constants.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/NodePath.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/NodePath.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/NulIterator.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/NulIterator.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/Transaction.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/Transaction.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeContext.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeContext.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeEditor.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeEditor.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeEditorError.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeEditorError.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/DefaultNodePath.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/DefaultNodePath.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/DefaultTreeEditor.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/DefaultTreeEditor.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/IndexTreeEditor.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/IndexTreeEditor.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNode.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNode.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNodeAttributes.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNodeAttributes.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNodeChildren.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNodeChildren.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/DefaultOperationLog.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/DefaultOperationLog.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/DefaultTreeOperationLog.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/DefaultTreeOperationLog.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingAttributes.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingAttributes.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingChildren.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingChildren.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingNode.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingNode.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/OperationLog.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/OperationLog.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/TreeOperationLog.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/TreeOperationLog.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/index/IndexCreater.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/index/IndexCreater.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/index/ParentIndex.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/index/ParentIndex.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/AppendChildAtOperation.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/AppendChildAtOperation.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DefaultTreeOperation.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DefaultTreeOperation.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DeleteAttributeOperation.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DeleteAttributeOperation.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DeleteChildAtOperation.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DeleteChildAtOperation.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/NodeOperation.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/NodeOperation.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/PutAttributeOperation.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/PutAttributeOperation.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/ReplaceRootNodeOperation.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/ReplaceRootNodeOperation.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/TreeOperation.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/TreeOperation.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/AppendChildAt.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/AppendChildAt.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/DeleteAttribute.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/DeleteAttribute.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/DeleteChildAt.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/DeleteChildAt.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/NodeEditor.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/NodeEditor.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/NodeEditorError.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/NodeEditorError.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/PutAttribute.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/PutAttribute.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/replaceRootNodeAt.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/replaceRootNodeAt.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/AbstractTreeMapThread.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/AbstractTreeMapThread.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/DataBaseBenchMark.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/DataBaseBenchMark.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/DataBaseBenchMarkThread.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/DataBaseBenchMarkThread.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/JungleWriteThread.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/JungleWriteThread.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/TatsukiTreeMapGetThread.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/TatsukiTreeMapGetThread.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/TreeMapBenchMark.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/TreeMapBenchMark.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/UtilTreeMapGetThread.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/UtilTreeMapGetThread.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/findMongoAttributeThread.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/findMongoAttributeThread.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/findTreeAttributeThread.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/findTreeAttributeThread.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/readTreeAttributeThread.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/test/readTreeAttributeThread.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultJungleTreeEditor$1.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultJungleTreeEditor$1.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultJungleTreeEditor.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultJungleTreeEditor.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTransactionManager$1.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTransactionManager$1.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTransactionManager.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTransactionManager.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeContext.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeContext.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNode.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNode.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNodeAttribute.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNodeAttribute.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNodeChildren.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNodeChildren.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/TransactionManager.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/transaction/TransactionManager.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultEvaluation.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultEvaluation.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultEvaluator.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultEvaluator.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultTraverser$1.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultTraverser$1.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultTraverser$2.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultTraverser$2.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultTraverser$3.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultTraverser$3.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultTraverser$4.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultTraverser$4.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultTraverser.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultTraverser.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Direction.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Direction.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Evaluation.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Evaluation.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Evaluator.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Evaluator.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/InterfaceTraverser$1.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/InterfaceTraverser$1.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/InterfaceTraverser.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/InterfaceTraverser.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Result.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Result.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Traversal.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Traversal.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Traverser.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Traverser.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/TraverserError.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/traverser/TraverserError.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/DefaultEither.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/DefaultEither.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/DefaultError.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/DefaultError.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/Either.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/Either.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/Error.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/Error.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/GetOldTreeError.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/GetOldTreeError.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/IterableConverter$Converter.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/IterableConverter$Converter.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/IterableConverter$IteratorConverter.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/IterableConverter$IteratorConverter.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/IterableConverter.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/IterableConverter.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/Pair.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/Pair.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/Triple.class Binary file build/classes/main/jp/ac/u_ryukyu/ie/cr/jungle/util/Triple.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/DefaultJungleTreeTest.class Binary file build/classes/test/DefaultJungleTreeTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/JDBCTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/JDBCTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/JungleTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/JungleTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/data/list/appendTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/data/list/appendTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/data/list/deleteTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/data/list/deleteTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/data/list/listAdd.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/data/list/listAdd.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/data/list/listIterator.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/data/list/listIterator.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/data/list/replaceTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/data/list/replaceTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/data/treemap/TreeMapDelete.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/data/treemap/TreeMapDelete.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/data/treemap/TreeMapTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/data/treemap/TreeMapTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/data/treemap/TreeNodeIteratorTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/data/treemap/TreeNodeIteratorTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/DefaultTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/DefaultTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/AttributesTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/AttributesTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/ChildrenTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/ChildrenTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/GetNodeOfPathTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/GetNodeOfPathTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/GetOldTreeTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/GetOldTreeTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/impl/treeeditor/DefaultTreeEditorTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/impl/treeeditor/DefaultTreeEditorTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/AppendChildAtTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/AppendChildAtTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/DeleteAttributeAtTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/DeleteAttributeAtTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/DeleteChildAtTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/DeleteChildAtTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/PutAttributeTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/PutAttributeTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/ReplaceRootNodeAt.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/ReplaceRootNodeAt.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/impl/node/DefaultAttributesTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/impl/node/DefaultAttributesTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/impl/node/DefaultChildrenTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/impl/node/DefaultChildrenTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/index/parentIndexTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/index/parentIndexTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/tests/util/TestUtil.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/tests/util/TestUtil.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/traverse/InterfaceTraverserTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/traverse/InterfaceTraverserTest.class has changed diff -r 000000000000 -r 44465893e8b8 build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/traverse/TraverserTest.class Binary file build/classes/test/jp/ac/u_ryukyu/ie/cr/jungle/traverse/TraverserTest.class has changed diff -r 000000000000 -r 44465893e8b8 document/JungleMindmap.mm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/JungleMindmap.mm Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,240 @@ + + + + + + + + +

+ Jungle +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ orderBy +

+ + +
+
+ + + + + + + + + + + + + + + + + + + + +

+ output +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff -r 000000000000 -r 44465893e8b8 document/XACML.mm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/XACML.mm Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 000000000000 -r 44465893e8b8 document/basic_api_architecture.graffle --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/basic_api_architecture.graffle Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,1131 @@ + + + + + ActiveLayerIndex + 0 + ApplicationVersion + + com.omnigroup.OmniGraffle + 139.16.0.171715 + + AutoAdjust + + BackgroundGraphic + + Bounds + {{0, 0}, {559, 783}} + Class + SolidGraphic + ID + 2 + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + BaseZoom + 0 + CanvasOrigin + {0, 0} + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2012-12-07 10:37:40 +0000 + Creator + shoshi + DisplayScale + 1 0/72 in = 1 0/72 in + GraphDocumentVersion + 8 + GraphicsList + + + Bounds + {{279.5, 250.5}, {48, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 104 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<use>>} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{255.5, 370}, {48, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 102 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<use>>} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{441, 491.25}, {71, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 103 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<extends>>} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{23.5, 10}, {57, 32}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 55 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;\f1\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 \'8a\'ee\'96\'7b +\f1 API\ +Read Only} + VerticalPad + 0 + + Wrap + NO + + + Class + LineGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 13 + + Head + + ID + 34 + + ID + 52 + Points + + {268.99999385152552, 228.5} + {268.99999385152552, 286.5} + + Style + + stroke + + HeadArrow + Arrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 51 + + + + Class + TableGroup + Graphics + + + Bounds + {{181, 174}, {176, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 13 + + ID + 50 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<inteface>>\ +Tree} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{181, 210}, {176, 18}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 13 + + ID + 51 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ Node getRoot()} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 50 + 51 + + + ID + 49 + + + Class + LineGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 13 + + Head + + ID + 35 + + ID + 47 + Points + + {396.4405562316386, 410.26124406682794} + {302.55881283802307, 359.23875942269564} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + Arrow + + + Tail + + ID + 40 + + + + Class + LineGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 13 + + Head + + ID + 35 + + ID + 46 + Points + + {146.71805539866665, 410.25360103626548} + {236.78255255712509, 359.24640251709661} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + Arrow + + + Tail + + ID + 37 + + + + Class + LineGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 13 + + Head + + ID + 42 + + ID + 54 + Points + + {430.03104574657306, 464.99999733370157} + {430.25, 531.99999100000002} + + Style + + stroke + + HeadArrow + FilledArrow + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + 0 + + + Tail + + ID + 53 + + + + Bounds + {{460.25, 538}, {83, 28}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 13 + + ID + 43 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<interface>>\ +Iterable<Node>} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{412, 532}, {36.5, 36}} + Class + ShapedGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 13 + + ID + 42 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Circle + Style + + shadow + + Draws + NO + + + Text + + VerticalPad + 0 + + + + Class + TableGroup + Graphics + + + Bounds + {{337.5, 410.5}, {185, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 13 + + ID + 40 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<inteface>>\ +Children} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{337.5, 446.5}, {185, 18}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 13 + + ID + 53 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ Iterator<Node> iterator()} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 40 + 53 + + + ID + 39 + + + Class + TableGroup + Graphics + + + Bounds + {{22, 410.5}, {185, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 13 + + ID + 37 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<inteface>>\ +Attributes} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{22, 446.5}, {185, 18}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 13 + + ID + 38 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ ByteBuffer get(String key)} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 37 + 38 + + + ID + 36 + + + Class + TableGroup + Graphics + + + Bounds + {{181, 287}, {176, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 13 + + ID + 34 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<inteface>>\ +Node} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{181, 323}, {176, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 13 + + ID + 35 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ Attributes getAttribute()\ ++ Children getChildren()} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 34 + 35 + + + ID + 33 + + + GridInfo + + GuidesLocked + NO + GuidesVisible + YES + HPages + 1 + ImageCounter + 1 + KeepToScale + + Layers + + + Lock + NO + Name + レイヤー 1 + Print + YES + View + YES + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2012-12-10 11:32:24 +0000 + Modifier + shoshi + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + PageBreaks + YES + PrintInfo + + NSBottomMargin + + float + 41 + + NSHorizonalPagination + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {595, 842} + + NSPrintReverseOrientation + + int + 0 + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + PrintOnePage + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + キャンバス 1 + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + ExpandedCanvases + + Frame + {{-1477, 368}, {892, 1006}} + ListView + + OutlineWidth + 142 + RightSidebar + + ShowRuler + + Sidebar + + SidebarWidth + 120 + VisibleRegion + {{-99, -42}, {757, 867}} + Zoom + 1 + ZoomValues + + + キャンバス 1 + 1 + 1 + + + + + diff -r 000000000000 -r 44465893e8b8 document/basic_api_architecture.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/basic_api_architecture.svg Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,3 @@ + + +2012-12-10 11:32Zキャンバス 1レイヤー 1+ Attributes getAttribute()+ Children getChildren()<<inteface>>Node+ ByteBuffer get(String key)<<inteface>>Attributes+ Iterator<Node> iterator()<<inteface>>Children<<interface>>Iterable<Node>+ Node getRoot()<<inteface>>Tree基本 APIRead Only<<extends>><<use>><<use>> diff -r 000000000000 -r 44465893e8b8 document/jungle_artitecture.graffle --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/jungle_artitecture.graffle Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,644 @@ + + + + + ActiveLayerIndex + 0 + ApplicationVersion + + com.omnigroup.OmniGraffle + 139.16.0.171715 + + AutoAdjust + + BackgroundGraphic + + Bounds + {{0, 0}, {559, 783}} + Class + SolidGraphic + ID + 2 + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + BaseZoom + 0 + CanvasOrigin + {0, 0} + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2012-12-10 15:06:13 +0000 + Creator + shoshi + DisplayScale + 1 0/72 in = 1.0000 in + GraphDocumentVersion + 8 + GraphicsList + + + Bounds + {{290, 243.5}, {48, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 49 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<use>>} + VerticalPad + 0 + + Wrap + NO + + + Class + LineGraphic + Head + + ID + 41 + + ID + 48 + Points + + {275.5, 429.99999100000002} + {275.5, 355.49999999086265} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + FilledArrow + + + Tail + + ID + 44 + Info + 2 + + + + Bounds + {{239, 483}, {73, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 43 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs20 \cf0 <<interface>>\ +TraversableTree} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{257.25, 430}, {36.5, 36}} + Class + ShapedGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 44 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Circle + Style + + shadow + + Draws + NO + + + Text + + VerticalPad + 0 + + + + Class + LineGraphic + Head + + ID + 40 + + ID + 42 + Points + + {275.50001356530873, 218.5} + {275.50003223584122, 282.5} + + Style + + stroke + + HeadArrow + Arrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 35 + + + + Class + TableGroup + Graphics + + + Bounds + {{148, 283}, {255, 18}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 40 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 JungleTree} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{148, 301}, {255, 54}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 41 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;\f1\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ MergeResult push(JungleDB remote)\ ++ MergeResult pull(JungleDB remote) +\f1 \kerning1\expnd0\expndtw0 \ + +\f0 \expnd0\expndtw0\kerning0 ++ TreeEditor getEditor()} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 40 + 41 + + + ID + 39 + + + Class + TableGroup + Graphics + + + Bounds + {{91.75, 103}, {367.5, 23}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 14 + + ID + 34 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs30 \cf0 JungleDB} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{91.75, 126}, {367.5, 92}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 14 + + ID + 35 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs30 \cf0 \expnd0\expndtw0\kerning0 ++ Iterable<JungleTree> getTrees()\ ++ JungleTree getTreeByName(String name)\ ++ JungleTree createNewTree(String name)\ ++ void deleteTree(String name)} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 34 + 35 + + + ID + 33 + + + GridInfo + + GuidesLocked + NO + GuidesVisible + YES + HPages + 1 + ImageCounter + 1 + KeepToScale + + Layers + + + Lock + NO + Name + レイヤー 1 + Print + YES + View + YES + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2012-12-11 08:21:25 +0000 + Modifier + shoshi + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + PageBreaks + YES + PrintInfo + + NSBottomMargin + + float + 41 + + NSHorizonalPagination + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {595, 842} + + NSPrintReverseOrientation + + int + 0 + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + PrintOnePage + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + キャンバス 1 + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + ExpandedCanvases + + Frame + {{-1683, 185}, {693, 922}} + ListView + + OutlineWidth + 142 + RightSidebar + + ShowRuler + + Sidebar + + SidebarWidth + 120 + VisibleRegion + {{0, 0}, {558, 783}} + Zoom + 1 + ZoomValues + + + キャンバス 1 + 1 + 1 + + + + + diff -r 000000000000 -r 44465893e8b8 document/jungle_artitecture.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/jungle_artitecture.svg Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,3 @@ + + +2012-12-11 08:21Zキャンバス 1レイヤー 1+ Iterable<JungleTree> getTrees()+ JungleTree getTreeByName(String name)+ JungleTree createNewTree(String name)+ void deleteTree(String name)JungleDB+ MergeResult push(JungleDB remote)+ MergeResult pull(JungleDB remote)+ TreeEditor getEditor()JungleTree<<interface>>TraversableTree<<use>> diff -r 000000000000 -r 44465893e8b8 document/node_transform_architecture.graffle --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/node_transform_architecture.graffle Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,1621 @@ + + + + + ActiveLayerIndex + 0 + ApplicationVersion + + com.omnigroup.OmniGraffle + 139.16.0.171715 + + AutoAdjust + + BackgroundGraphic + + Bounds + {{0, 0}, {559, 783}} + Class + SolidGraphic + ID + 2 + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + BaseZoom + 0 + CanvasOrigin + {0, 0} + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2012-12-10 15:16:19 +0000 + Creator + shoshi + DisplayScale + 1 0/72 in = 1 0/72 in + GraphDocumentVersion + 8 + GraphicsList + + + Class + LineGraphic + Head + + ID + 101 + + ID + 128 + Points + + {80.750009124999949, 468} + {151.50000632809025, 467.6440251549617} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + FilledArrow + + + Tail + + ID + 126 + + + + Bounds + {{31.5, 418}, {62, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 127 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs20 \cf0 <<interface>>\ +Node} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{44.25, 450}, {36.5, 36}} + Class + ShapedGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 126 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Circle + Style + + shadow + + Draws + NO + + + Text + + VerticalPad + 0 + + + + Bounds + {{252.5, 513}, {54, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 125 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<uses>>} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{215, 346}, {54, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 124 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<uses>>} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{386.25, 277}, {54, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 123 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<uses>>} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{289, 166}, {54, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 122 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<uses>>} + VerticalPad + 0 + + Wrap + NO + + + Class + LineGraphic + Head + + ID + 118 + + ID + 120 + Points + + {319.5296010388048, 272.20701208539185} + {394.47039896119531, 306.29298791460815} + + Style + + stroke + + HeadArrow + Arrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 98 + + + + Class + TableGroup + Graphics + + + Bounds + {{338, 306.5}, {193, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 118 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<enum>>\ +TransformResult} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{338, 342.5}, {193, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 119 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ TransformResult SUCCESS\ ++ TransformResult FAIL} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 118 + 119 + + + ID + 117 + + + Class + LineGraphic + Head + + ID + 108 + + ID + 116 + Points + + {413.25, 705.99999100000002} + {413.44803370822137, 635.49999800241471} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + FilledArrow + + + Tail + + ID + 113 + Info + 2 + + + + Class + LineGraphic + Head + + ID + 105 + + ID + 115 + Points + + {139.25, 711.99999100000002} + {139.45131578944796, 635.49999825715258} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + FilledArrow + + + Tail + + ID + 42 + + + + Bounds + {{446.75, 712}, {62, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 114 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs20 \cf0 <<interface>>\ +Children} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{395, 706}, {36.5, 36}} + Class + ShapedGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 113 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Circle + Style + + shadow + + Draws + NO + + + Text + + VerticalPad + 0 + + + + Bounds + {{172.75, 718}, {62, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 43 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs20 \cf0 <<interface>>\ +Attributes} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{121, 712}, {36.5, 36}} + Class + ShapedGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 42 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Circle + Style + + shadow + + Draws + NO + + + Text + + VerticalPad + 0 + + + + Class + LineGraphic + Head + + ID + 100 + + ID + 112 + Points + + {279.50001186443728, 272.5} + {279.50001186443728, 412.5} + + Style + + stroke + + HeadArrow + Arrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 98 + + + + Class + LineGraphic + Head + + ID + 97 + + ID + 111 + Points + + {279.50000826457716, 143.5} + {279.50000826457716, 199.5} + + Style + + stroke + + HeadArrow + Arrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 35 + + + + Class + LineGraphic + Head + + ID + 107 + + ID + 110 + Points + + {301.03872412585957, 485.32398918170145} + {391.96127587414048, 562.67601081829866} + + Style + + stroke + + HeadArrow + Arrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + Arrow + + + Tail + + ID + 101 + + + + Class + LineGraphic + Head + + ID + 104 + + ID + 109 + Points + + {257.00701890738134, 485.31571317541813} + {161.99298109261875, 562.68428682458193} + + Style + + stroke + + HeadArrow + Arrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + Arrow + + + Tail + + ID + 101 + + + + Class + TableGroup + Graphics + + + Bounds + {{284, 563}, {259, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 107 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<inteface>>\ +EditableChildren} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{284, 599}, {259, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 108 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ EditableNode newChildAt(int pos)\ ++ EditableNode deleteChildAt(int pos)} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 107 + 108 + + + ID + 106 + + + Class + TableGroup + Graphics + + + Bounds + {{10, 563}, {259, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 104 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<inteface>>\ +EditableAttributes} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{10, 599}, {259, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 105 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ EditableNode put(String k,ByteBuffer v)\ ++ EditableNode delete(String k)} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 104 + 105 + + + ID + 103 + + + Bounds + {{61, 513}, {72, 18}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 102 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 \'8f\'7a\'8a\'c2\'8e\'51\'8f\'c6\'82\'a0\'82\'e8} + VerticalPad + 0 + + Wrap + NO + + + Class + TableGroup + Graphics + + + Bounds + {{152, 413}, {255, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 100 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<inteface>>\ +EditableNode} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{152, 449}, {255, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 101 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ EditableAttributes getAttributes()\ ++ EditableChildren getChildren()} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 100 + 101 + + + ID + 99 + + + Class + TableGroup + Graphics + + + Bounds + {{171, 200}, {217, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 97 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<inteface>>\ +Transformation} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{171, 236}, {217, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 98 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ EditableNode getEditableNode()\ ++ TransformResult getResult()} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 97 + 98 + + + ID + 96 + + + Class + TableGroup + Graphics + + + Bounds + {{121, 89}, {317, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 34 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<interface>>\ +NodeTransformer} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{121, 125}, {317, 18}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 35 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ Transformation transform(EditableNode target)} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 34 + 35 + + + ID + 33 + + + Bounds + {{10, 11}, {105, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 95 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 NodeTransform API} + VerticalPad + 0 + + Wrap + NO + + + GridInfo + + GuidesLocked + NO + GuidesVisible + YES + HPages + 1 + ImageCounter + 1 + KeepToScale + + Layers + + + Lock + NO + Name + レイヤー 1 + Print + YES + View + YES + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2012-12-10 15:30:23 +0000 + Modifier + shoshi + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + PageBreaks + YES + PrintInfo + + NSBottomMargin + + float + 41 + + NSHorizonalPagination + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {595, 842} + + NSPrintReverseOrientation + + int + 0 + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + PrintOnePage + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + キャンバス 1 + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + ExpandedCanvases + + Frame + {{-1702, 314}, {693, 922}} + ListView + + OutlineWidth + 142 + RightSidebar + + ShowRuler + + Sidebar + + SidebarWidth + 120 + VisibleRegion + {{0, 0}, {558, 783}} + Zoom + 1 + ZoomValues + + + キャンバス 1 + 1 + 1 + + + + + diff -r 000000000000 -r 44465893e8b8 document/node_transform_architecture.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/node_transform_architecture.svg Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,3 @@ + + +2012-12-10 15:30Zキャンバス 1レイヤー 1NodeTransform API+ Transformation transform(EditableNode target)<<interface>>NodeTransformer+ EditableNode getEditableNode()+ TransformResult getResult()<<inteface>>Transformation+ EditableAttributes getAttributes()+ EditableChildren getChildren()<<inteface>>EditableNode循環参照あり+ EditableNode put(String k,ByteBuffer v)+ EditableNode delete(String k)<<inteface>>EditableAttributes+ EditableNode newChildAt(int pos)+ EditableNode deleteChildAt(int pos)<<inteface>>EditableChildren<<interface>>Attributes<<interface>>Children+ TransformResult SUCCESS+ TransformResult FAIL<<enum>>TransformResult<<uses>><<uses>><<uses>><<uses>><<interface>>Node diff -r 000000000000 -r 44465893e8b8 document/traverser_api_architecture.graffle --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/traverser_api_architecture.graffle Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,1999 @@ + + + + + ActiveLayerIndex + 0 + ApplicationVersion + + com.omnigroup.OmniGraffle + 139.16.0.171715 + + AutoAdjust + + BackgroundGraphic + + Bounds + {{0, 0}, {559, 783}} + Class + SolidGraphic + ID + 2 + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + BaseZoom + 0 + CanvasOrigin + {0, 0} + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2012-12-10 11:11:43 +0000 + Creator + shoshi + DisplayScale + 1 0/72 in = 1 0/72 in + GraphDocumentVersion + 8 + GraphicsList + + + Bounds + {{284.75, 136.25000000000006}, {71, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 104 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<extends>>} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{382.75, 639}, {71, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 103 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<extends>>} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{284.75, 560.125}, {48, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 102 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<use>>} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{284.75, 442.25}, {48, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 101 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<use>>} + VerticalPad + 0 + + Wrap + NO + + + Class + LineGraphic + Head + + ID + 67 + + ID + 100 + Points + + {273.01271064717207, 530.68742818315377} + {273.98728935282793, 588.18757181684623} + + Style + + stroke + + HeadArrow + Arrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 65 + + + + Class + LineGraphic + Head + + ID + 64 + + ID + 99 + Points + + {272.75001471756116, 427.59375} + {272.75001471756116, 469.6875} + + Style + + stroke + + HeadArrow + Arrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 62 + + + + Bounds + {{210.75, 230.5}, {48, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 98 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<use>>} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{280.25, 358.09375}, {48, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 97 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<use>>} + VerticalPad + 0 + + Wrap + NO + + + Class + LineGraphic + Head + + ID + 61 + + ID + 96 + Points + + {274.0376134121887, 339.4998750839743} + {273.09652724919926, 381.5938749160257} + + Style + + stroke + + HeadArrow + Arrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 59 + + + + Bounds + {{9, 16}, {73, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 95 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 Traverser API} + VerticalPad + 0 + + Wrap + NO + + + Class + LineGraphic + Head + + ID + 42 + + ID + 94 + Points + + {274.41847796176307, 164.50002953953299} + {275, 111.00000899999995} + + Style + + stroke + + HeadArrow + FilledArrow + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + 0 + + + Tail + + ID + 89 + + + + Bounds + {{305, 81}, {69, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 43 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs20 \cf0 <<interface>>\ +Iterable<Node>} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{256.75, 75}, {36.5, 36}} + Class + ShapedGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 42 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Circle + Style + + shadow + + Draws + NO + + + Text + + VerticalPad + 0 + + + + Class + LineGraphic + Head + + ID + 58 + + ID + 91 + Points + + {274.25000858890604, 225.5} + {274.25000858890604, 284.5} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + Arrow + + + Tail + + ID + 90 + + + + Class + TableGroup + Graphics + + + Bounds + {{126.25, 165}, {296, 30}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 89 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs20 \cf0 <<inteface>>\ +TraverseResult} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{126.25, 195}, {296, 30}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 90 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs20 \cf0 \expnd0\expndtw0\kerning0 ++ Iterator<Node> itrerator()\ ++ Node target()} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 89 + 90 + + + ID + 88 + + + Class + LineGraphic + Head + + ID + 70 + + ID + 84 + Points + + {302.80471084639845, 633.81655985169823} + {467.69528915360155, 677.87094014830177} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + FilledArrow + + + Tail + + ID + 68 + + + + Class + LineGraphic + Head + + ID + 73 + + ID + 83 + Points + + {284.65534452587542, 633.98739885865393} + {342.96965547412458, 677.70010114134607} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + FilledArrow + + + Tail + + ID + 68 + + + + Class + LineGraphic + Head + + ID + 76 + + ID + 82 + Points + + {265.8228188208621, 634.02808327353125} + {218.92718117913796, 677.65941672646875} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + FilledArrow + + + Tail + + ID + 68 + + + + Class + LineGraphic + Head + + ID + 79 + + ID + 81 + Points + + {247.02463170015864, 633.822510199926} + {89.975368299841378, 677.864989800074} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + FilledArrow + + + Tail + + ID + 68 + + + + Class + TableGroup + Graphics + + + Bounds + {{0.75, 678}, {124, 15}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 79 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs20 \cf0 ACCEPT_CONTINUE} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{0.75, 693}, {124, 15}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 80 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs20 \cf0 \expnd0\expndtw0\kerning0 ++ ???} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 79 + 80 + + + ID + 78 + + + Class + TableGroup + Graphics + + + Bounds + {{148.5, 678}, {124, 15}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 76 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs20 \cf0 ACCEPT_BREAK} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{148.5, 693}, {124, 15}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 77 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs20 \cf0 \expnd0\expndtw0\kerning0 ++ ???} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 76 + 77 + + + ID + 75 + + + Class + TableGroup + Graphics + + + Bounds + {{291.375, 678}, {124, 15}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 73 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs20 \cf0 DENY_CONTINUE} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{291.375, 693}, {124, 15}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 74 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs20 \cf0 \expnd0\expndtw0\kerning0 ++ ???} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 73 + 74 + + + ID + 72 + + + Class + TableGroup + Graphics + + + Bounds + {{434.25, 678}, {124, 15}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 70 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs20 \cf0 DENY_BREAK} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{434.25, 693}, {124, 15}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 71 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs20 \cf0 \expnd0\expndtw0\kerning0 ++ ???} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 70 + 71 + + + ID + 69 + + + Class + TableGroup + Graphics + + + Bounds + {{212.25, 588.6875}, {124, 30}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 67 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs20 \cf0 <<enum>>\ +EvaluationResult} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{212.25, 618.6875}, {124, 15}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 68 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs20 \cf0 \expnd0\expndtw0\kerning0 ++ ???} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 67 + 68 + + + ID + 66 + + + Class + TableGroup + Graphics + + + Bounds + {{182.75, 470.1875}, {180, 30}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 64 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs20 \cf0 <<inteface>>\ +Evaluation} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{182.75, 500.1875}, {180, 30}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 65 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs20 \cf0 \expnd0\expndtw0\kerning0 ++ EvaluationResult result()\ ++ TraverseEvaluator evaluator()} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 64 + 65 + + + ID + 63 + + + Class + TableGroup + Graphics + + + Bounds + {{124.75, 382.09375}, {296, 30}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 61 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs20 \cf0 <<inteface>>\ +TraverseEvaluator} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{124.75, 412.09375}, {296, 15}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 62 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs20 \cf0 \expnd0\expndtw0\kerning0 ++ Evaluation eval(Iterable<Node> path,Node child,int pos)} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 61 + 62 + + + ID + 60 + + + Class + TableGroup + Graphics + + + Bounds + {{84.5, 285}, {379.5, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 13 + + ID + 58 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<inteface>>\ +Traversable} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{84.5, 321}, {379.5, 18}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 13 + + ID + 59 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + shadow + + Draws + NO + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ Iterable<TraverseResult> traverse(TraverseEvaluator e)} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 58 + 59 + + + ID + 57 + + + GridInfo + + GuidesLocked + NO + GuidesVisible + YES + HPages + 1 + ImageCounter + 1 + KeepToScale + + Layers + + + Lock + NO + Name + レイヤー 1 + Print + YES + View + YES + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2012-12-10 13:35:08 +0000 + Modifier + shoshi + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + PageBreaks + YES + PrintInfo + + NSBottomMargin + + float + 41 + + NSHorizonalPagination + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {595, 842} + + NSPrintReverseOrientation + + int + 0 + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + PrintOnePage + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + キャンバス 1 + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + ExpandedCanvases + + Frame + {{-1302, 501}, {706, 939}} + ListView + + OutlineWidth + 142 + RightSidebar + + ShowRuler + + Sidebar + + SidebarWidth + 120 + VisibleRegion + {{-6, -8}, {571, 800}} + Zoom + 1 + ZoomValues + + + キャンバス 1 + 1 + 1 + + + + + diff -r 000000000000 -r 44465893e8b8 document/traverser_api_architecture.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/traverser_api_architecture.svg Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,3 @@ + + +2012-12-10 13:35Zキャンバス 1レイヤー 1+ Iterable<TraverseResult> traverse(TraverseEvaluator e)<<inteface>>Traversable+ Evaluation eval(Iterable<Node> path,Node child,int pos)<<inteface>>TraverseEvaluator+ EvaluationResult result()+ TraverseEvaluator evaluator()<<inteface>>Evaluation+ ???<<enum>>EvaluationResult+ ???DENY_BREAK+ ???DENY_CONTINUE+ ???ACCEPT_BREAK+ ???ACCEPT_CONTINUE+ Iterator<Node> itrerator()+ Node target()<<inteface>>TraverseResult<<interface>>Iterable<Node>Traverser API<<use>><<use>><<use>><<use>><<extends>><<extends>> diff -r 000000000000 -r 44465893e8b8 document/tree_store_api_b.graffle --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/tree_store_api_b.graffle Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,1389 @@ + + + + + ActiveLayerIndex + 0 + ApplicationVersion + + com.omnigroup.OmniGraffle + 139.16.0.171715 + + AutoAdjust + + BackgroundGraphic + + Bounds + {{0, 0}, {559, 783}} + Class + SolidGraphic + ID + 2 + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + BaseZoom + 0 + CanvasOrigin + {0, 0} + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2012-12-10 11:52:27 +0000 + Creator + shoshi + DisplayScale + 1 0/72 in = 1.0000 in + GraphDocumentVersion + 8 + GraphicsList + + + Class + LineGraphic + Head + + ID + 61 + + ID + 72 + Points + + {329.20990925272872, 492.33892342450167} + {371.85932151650201, 531.66107657549833} + + Style + + stroke + + HeadArrow + Arrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 58 + + + + Class + LineGraphic + Head + + ID + 58 + + ID + 71 + Points + + {150.88502781235991, 531.62735921205035} + {186.00340193970618, 492.37264078794965} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + Arrow + + + Tail + + ID + 34 + + + + Class + LineGraphic + Head + + ID + 57 + + ID + 70 + Points + + {214.7861962173489, 170.20408980090042} + {27.375, 254} + {197.37204229916, 311.83894891879646} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + Arrow + + + Tail + + ID + 35 + + + + Class + LineGraphic + Head + + ID + 57 + + ID + 69 + Points + + {250.7499948051904, 278.5} + {250.7499948051904, 311.5} + + Style + + stroke + + HeadArrow + Arrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 55 + + + + Bounds + {{43.875, 656}, {82, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 68 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs20 \cf0 <<interface>>\ +TraverseEvaluator} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{164.125, 656}, {77, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 67 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs20 \cf0 <<interface>>\ +Iterable<Integer>} + VerticalPad + 0 + + Wrap + NO + + + Class + LineGraphic + Head + + ID + 59 + + ID + 66 + Points + + {201.875, 613.99999100000002} + {166.1289581205294, 586.30622081488389} + + Style + + stroke + + HeadArrow + FilledArrow + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + 0 + + + Tail + + ID + 64 + Info + 2 + + + + Class + LineGraphic + Head + + ID + 59 + + ID + 65 + Points + + {87.135666842446952, 613.68177223831776} + {120.29906669391403, 586.31821677435846} + + Style + + stroke + + HeadArrow + FilledArrow + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + 0 + + + Tail + + ID + 63 + Info + 2 + + + + Bounds + {{183.625, 614}, {36.5, 36}} + Class + ShapedGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 64 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Circle + Style + + shadow + + Draws + NO + + + Text + + VerticalPad + 0 + + + + Bounds + {{68.5, 614}, {36.5, 36}} + Class + ShapedGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 63 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Circle + Style + + shadow + + Draws + NO + + + Text + + VerticalPad + 0 + + + + Class + TableGroup + Graphics + + + Bounds + {{311.25, 532}, {161, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 61 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<inteface>>\ +Result} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{311.25, 568}, {161, 18}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 62 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ TreeEditor getEditor()} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 61 + 62 + + + ID + 60 + + + Class + TableGroup + Graphics + + + Bounds + {{25.5, 532}, {234, 18}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 34 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 NodePath} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{25.5, 550}, {234, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 59 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ Evaluation eval(Iterable<Node> path,Node child,int pos)} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 34 + 59 + + + ID + 33 + + + Class + TableGroup + Graphics + + + Bounds + {{68.25, 312}, {365, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 57 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<interface>>\ +TreeEditor} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{68.25, 348}, {365, 144}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 58 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ TraversableTree getTree()\ ++ Result appendChildBehindOf(NodePath p)\ ++ Result appendChildInfrontOf(NodePath p)\ ++ Result deleteChild(NodePath p)\ ++ Result putAttribute(NodePath p,String k,ByteBuffer v)\ ++ Result deleteAttribute(NodePath p,String k)\ ++ boolean success()\ ++ void fail()} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 57 + 58 + + + ID + 56 + + + Class + TableGroup + Graphics + + + Bounds + {{153, 224}, {195.5, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 54 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<interface>>\ +TreeStore} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{153, 260}, {195.5, 18}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 55 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ TreeEditor getCurrentTree()} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 54 + 55 + + + ID + 53 + + + Class + LineGraphic + Head + + ID + 50 + + ID + 52 + Points + + {337.57701026311656, 64.266620666800307} + {284.48068520343776, 97.733389457544291} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + FilledArrow + + + Tail + + ID + 45 + Info + 1 + + + + Class + LineGraphic + Head + + ID + 50 + + ID + 51 + Points + + {152, 64.000008999999949} + {219.22628960402827, 97.775530298288515} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + FilledArrow + + + Tail + + ID + 42 + Info + 1 + + + + Class + TableGroup + Graphics + + + Bounds + {{77.5, 98}, {356, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 50 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<interface>>\ +TraversableTree} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{77.5, 134}, {356, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 35 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ Node getRoot()\ ++ Iterable<TraverseResult> traverse(TraverseEvaluator e)} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 50 + 35 + + + ID + 49 + + + Bounds + {{371.5, 34}, {62, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 46 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs20 \cf0 <<interface>>\ +Tree} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{319.75, 28}, {36.5, 36}} + Class + ShapedGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 45 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Circle + Style + + shadow + + Draws + NO + + + Text + + VerticalPad + 0 + + + + Bounds + {{185.5, 34}, {62, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 43 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs20 \cf0 <<interface>>\ +Traversable} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{133.75, 28}, {36.5, 36}} + Class + ShapedGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 42 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Circle + Style + + shadow + + Draws + NO + + + Text + + VerticalPad + 0 + + + + Bounds + {{10, 14}, {95, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 3 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 TreeStore API "B"} + VerticalPad + 0 + + Wrap + NO + + + GridInfo + + GuidesLocked + NO + GuidesVisible + YES + HPages + 1 + ImageCounter + 1 + KeepToScale + + Layers + + + Lock + NO + Name + レイヤー 1 + Print + YES + View + YES + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2012-12-11 08:44:26 +0000 + Modifier + shoshi + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + PageBreaks + YES + PrintInfo + + NSBottomMargin + + float + 41 + + NSHorizonalPagination + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {595, 842} + + NSPrintReverseOrientation + + int + 0 + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + PrintOnePage + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + キャンバス 1 + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + ExpandedCanvases + + Frame + {{-1461, 413}, {693, 922}} + ListView + + OutlineWidth + 142 + RightSidebar + + ShowRuler + + Sidebar + + SidebarWidth + 120 + VisibleRegion + {{0, 0}, {558, 783}} + Zoom + 1 + ZoomValues + + + キャンバス 1 + 1 + 1 + + + + + diff -r 000000000000 -r 44465893e8b8 document/tree_store_api_b.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/tree_store_api_b.svg Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,3 @@ + + +2012-12-11 08:44Zキャンバス 1レイヤー 1TreeStore API "B"<<interface>>Traversable<<interface>>Tree+ Node getRoot()+ Iterable<TraverseResult> traverse(TraverseEvaluator e)<<interface>>TraversableTree+ TreeEditor getCurrentTree()<<interface>>TreeStore+ TraversableTree getTree()+ Result appendChildBehindOf(NodePath p)+ Result appendChildInfrontOf(NodePath p)+ Result deleteChild(NodePath p)+ Result putAttribute(NodePath p,String k,ByteBuffer v)+ Result deleteAttribute(NodePath p,String k)+ boolean success()+ void fail()<<interface>>TreeEditor+ Evaluation eval(Iterable<Node> path,Node child,int pos)NodePath+ TreeEditor getEditor()<<inteface>>Result<<interface>>Iterable<Integer><<interface>>TraverseEvaluator diff -r 000000000000 -r 44465893e8b8 document/tree_store_api_type_a.graffle --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/tree_store_api_type_a.graffle Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,1384 @@ + + + + + ActiveLayerIndex + 0 + ApplicationVersion + + com.omnigroup.OmniGraffle + 139.16.0.171715 + + AutoAdjust + + BackgroundGraphic + + Bounds + {{0, 0}, {559, 783}} + Class + SolidGraphic + ID + 2 + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + BaseZoom + 0 + CanvasOrigin + {0, 0} + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2012-12-10 13:30:22 +0000 + Creator + shoshi + DisplayScale + 1 0/72 in = 1.0000 in + GraphDocumentVersion + 8 + GraphicsList + + + Class + LineGraphic + Head + + ID + 80 + + ID + 82 + Points + + {304.34595495094356, 509.36099409918046} + {401.75, 610.99999100000002} + + Style + + stroke + + HeadArrow + FilledArrow + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + 0 + + + Tail + + ID + 58 + + + + Bounds + {{363.5, 653}, {78, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 81 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs20 \cf0 <<interface>>\ +NodeTransformer} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{383.5, 611}, {36.5, 36}} + Class + ShapedGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 80 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Circle + Style + + shadow + + Draws + NO + + + Text + + VerticalPad + 0 + + + + Bounds + {{53.375, 716.5}, {82, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 68 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs20 \cf0 <<interface>>\ +TraverseEvaluator} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{173.625, 716.5}, {77, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 67 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs20 \cf0 <<interface>>\ +Iterable<Integer>} + VerticalPad + 0 + + Wrap + NO + + + Class + LineGraphic + Head + + ID + 58 + + ID + 71 + Points + + {161.03305272955481, 585.39022296759765} + {234.4094828370566, 509.35977724764678} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + FilledArrow + + + Tail + + ID + 34 + + + + Class + LineGraphic + Head + + ID + 57 + + ID + 70 + Points + + {235.80100933867519, 193.73798381002658} + {45, 297} + {235.93772800235965, 400.76125976074781} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + Arrow + + + Tail + + ID + 35 + + + + Class + LineGraphic + Head + + ID + 57 + + ID + 69 + Points + + {269.49999174219897, 324.75} + {269.49999174219897, 400.5} + + Style + + stroke + + HeadArrow + Arrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 55 + + + + Class + LineGraphic + Head + + ID + 59 + + ID + 66 + Points + + {206.625, 664.24999100000002} + {175.52992651577071, 640.0570327716415} + + Style + + stroke + + HeadArrow + FilledArrow + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + 0 + + + Tail + + ID + 64 + Info + 2 + + + + Class + LineGraphic + Head + + ID + 59 + + ID + 65 + Points + + {94.528010424639959, 663.9540438825901} + {127.08522135341524, 640.0459458876345} + + Style + + stroke + + HeadArrow + FilledArrow + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + 0 + + + Tail + + ID + 63 + Info + 2 + + + + Bounds + {{188.375, 664.25}, {36.5, 36}} + Class + ShapedGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 64 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Circle + Style + + shadow + + Draws + NO + + + Text + + VerticalPad + 0 + + + + Bounds + {{75.875, 664.25}, {36.5, 36}} + Class + ShapedGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 63 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Circle + Style + + shadow + + Draws + NO + + + Text + + VerticalPad + 0 + + + + Class + TableGroup + Graphics + + + Bounds + {{35, 585.75}, {234, 18}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 34 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 NodePath} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{35, 603.75}, {234, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 59 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ Evaluation eval(Iterable<Node> path,Node child,int pos)} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 34 + 59 + + + ID + 33 + + + Class + TableGroup + Graphics + + + Bounds + {{87, 401}, {365, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 57 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<interface>>\ +TreeEditor} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{87, 437}, {365, 72}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 58 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ TraversableTree getTree()\ ++ TreeEditor edit(NodePath p,NodeTransformer t)\ ++ boolean success()\ ++ void fail()} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 57 + 58 + + + ID + 56 + + + Class + TableGroup + Graphics + + + Bounds + {{171.75, 270.25}, {195.5, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 54 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<interface>>\ +TreeStore} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{171.75, 306.25}, {195.5, 18}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 55 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ TreeEditor getCurrentTree()} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 54 + 55 + + + ID + 53 + + + Class + LineGraphic + Head + + ID + 50 + + ID + 52 + Points + + {351.57701026311662, 87.766620666800279} + {298.48068520343776, 121.23338945754429} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + FilledArrow + + + Tail + + ID + 45 + Info + 1 + + + + Class + LineGraphic + Head + + ID + 50 + + ID + 51 + Points + + {166, 87.500008999999949} + {233.22628960402827, 121.27553029828852} + + Style + + stroke + + HeadArrow + 0 + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + FilledArrow + + + Tail + + ID + 42 + Info + 1 + + + + Class + TableGroup + Graphics + + + Bounds + {{91.5, 121.5}, {356, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 50 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<interface>>\ +TraversableTree} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{91.5, 157.5}, {356, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 35 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ Node getRoot()\ ++ Iterable<TraverseResult> traverse(TraverseEvaluator e)} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 50 + 35 + + + ID + 49 + + + Bounds + {{385.5, 57.5}, {62, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 46 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs20 \cf0 <<interface>>\ +Tree} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{333.75, 51.5}, {36.5, 36}} + Class + ShapedGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 45 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Circle + Style + + shadow + + Draws + NO + + + Text + + VerticalPad + 0 + + + + Bounds + {{199.5, 57.5}, {62, 24}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 43 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs20 \cf0 <<interface>>\ +Traversable} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{147.75, 51.5}, {36.5, 36}} + Class + ShapedGraphic + FontInfo + + Font + HiraKakuProN-W6 + Size + 11 + + ID + 42 + Magnets + + {0, 1} + {0, -1} + {1, 0} + {-1, 0} + + Shape + Circle + Style + + shadow + + Draws + NO + + + Text + + VerticalPad + 0 + + + + Bounds + {{15, 16}, {95, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 3 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 TreeStore API "A"} + VerticalPad + 0 + + Wrap + NO + + + GridInfo + + GuidesLocked + NO + GuidesVisible + YES + HPages + 1 + ImageCounter + 1 + KeepToScale + + Layers + + + Lock + NO + Name + レイヤー 1 + Print + YES + View + YES + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2012-12-11 08:46:02 +0000 + Modifier + shoshi + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + PageBreaks + YES + PrintInfo + + NSBottomMargin + + float + 41 + + NSHorizonalPagination + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {595, 842} + + NSPrintReverseOrientation + + int + 0 + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + PrintOnePage + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + キャンバス 1 + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + ExpandedCanvases + + Frame + {{-1364, 479}, {693, 922}} + ListView + + OutlineWidth + 142 + RightSidebar + + ShowRuler + + Sidebar + + SidebarWidth + 120 + VisibleRegion + {{0, 0}, {558, 783}} + Zoom + 1 + ZoomValues + + + キャンバス 1 + 1 + 1 + + + + + diff -r 000000000000 -r 44465893e8b8 document/tree_store_api_type_a.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/tree_store_api_type_a.svg Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,3 @@ + + +2012-12-11 08:46Zキャンバス 1レイヤー 1TreeStore API "A"<<interface>>Traversable<<interface>>Tree+ Node getRoot()+ Iterable<TraverseResult> traverse(TraverseEvaluator e)<<interface>>TraversableTree+ TreeEditor getCurrentTree()<<interface>>TreeStore+ TraversableTree getTree()+ TreeEditor edit(NodePath p,NodeTransformer t)+ boolean success()+ void fail()<<interface>>TreeEditor+ Evaluation eval(Iterable<Node> path,Node child,int pos)NodePath<<interface>>Iterable<Integer><<interface>>TraverseEvaluator<<interface>>NodeTransformer diff -r 000000000000 -r 44465893e8b8 document/version_control_api.graffle --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/version_control_api.graffle Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,1224 @@ + + + + + ActiveLayerIndex + 0 + ApplicationVersion + + com.omnigroup.OmniGraffle + 139.16.0.171715 + + AutoAdjust + + BackgroundGraphic + + Bounds + {{0, 0}, {559, 783}} + Class + SolidGraphic + ID + 2 + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + BaseZoom + 0 + CanvasOrigin + {0, 0} + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2012-12-10 14:12:27 +0000 + Creator + shoshi + DisplayScale + 1 0/72 in = 1 0/72 in + GraphDocumentVersion + 8 + GraphicsList + + + Bounds + {{297, 639.25}, {54, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 67 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<uses>>} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{292, 532.75}, {54, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 66 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<uses>>} + VerticalPad + 0 + + Wrap + NO + + + Class + LineGraphic + Head + + ID + 61 + + ID + 65 + Points + + {279.49998867250389, 620.5} + {279.49998867250389, 665.5} + + Style + + stroke + + HeadArrow + Arrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 59 + + + + Class + LineGraphic + Head + + ID + 58 + + ID + 64 + Points + + {279.5000141916604, 514} + {279.5000141916604, 565.5} + + Style + + stroke + + HeadArrow + Arrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 41 + + + + Class + LineGraphic + Head + + ID + 35 + + ID + 63 + Points + + {279.49998069032409, 459} + {279.49998069032409, 160.5} + + Style + + stroke + + HeadArrow + FilledArrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 40 + + + + Class + TableGroup + Graphics + + + Bounds + {{167.25, 666}, {224.5, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 61 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<enum>>\ +MergeResult.Status} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{167.25, 702}, {224.5, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 62 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ MergeResult.Status SUCCESS\ ++ MergeResult.Status CONFLICT} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 61 + 62 + + + ID + 60 + + + Class + TableGroup + Graphics + + + Bounds + {{146.5, 566}, {266, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 58 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<inteface>>\ +MergeResult} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{146.5, 602}, {266, 18}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 59 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ MergeResult.Status getStatus()} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 58 + 59 + + + ID + 57 + + + Bounds + {{167.25, 429}, {54, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 56 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<uses>>} + VerticalPad + 0 + + Wrap + NO + + + Class + LineGraphic + Head + + ID + 49 + + ID + 54 + Points + + {267.44511071737571, 459.08164128769772} + {142.16435336472233, 267.66835871230228} + + Style + + stroke + + HeadArrow + FilledArrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 40 + + + + Bounds + {{395, 201}, {54, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 53 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 <<uses>>} + VerticalPad + 0 + + Wrap + NO + + + Class + LineGraphic + Head + + ID + 37 + + ID + 52 + Points + + {323.25495102031016, 160.35986235117099} + {391.28974171712002, 230.89013764882901} + + Style + + stroke + + HeadArrow + FilledArrow + HeadScale + 1.0142860412597656 + Legacy + + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 35 + + + + Class + LineGraphic + Head + + ID + 48 + + ID + 51 + Points + + {227.55150227594322, 160.32873362648911} + {146.65053390666884, 230.92054293761089} + + Style + + stroke + + HeadArrow + FilledArrow + HeadScale + 1.0142860412597656 + Legacy + + TailArrow + 0 + + + Tail + + ID + 35 + + + + Class + TableGroup + Graphics + + + Bounds + {{34, 231.25}, {204, 18}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 48 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 TipChangeSet} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{34, 249.25}, {204, 18}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 49 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ TreeEditor getEditor()} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 48 + 49 + + + ID + 47 + + + Class + TableGroup + Graphics + + + Bounds + {{87.5, 459.5}, {384, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 40 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<inteface>>\ +Merger} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{87.5, 495.5}, {384, 18}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 41 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ MergeResult merge(TipChangeSet local,ChangeSet remote)} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 40 + 41 + + + ID + 39 + + + Class + TableGroup + Graphics + + + Bounds + {{297, 231.25}, {224, 36}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 37 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 <<enum>>\ +Command} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{297, 267.25}, {224, 84}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 46 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs24 \cf0 + Command APPEND_CHILD\ ++ Command DELETE_CHILD\ ++ Command PUT_ATTRIBUTE\ ++ Command DELETE_ATTRIBUTE\ +\ ++ NodePath getPath()} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 37 + 46 + + + ID + 36 + + + Class + TableGroup + Graphics + + + Bounds + {{153.5, 52}, {252, 18}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 34 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 ChangeSet} + VerticalPad + 0 + + TextPlacement + 0 + + + Bounds + {{153.5, 70}, {252, 90}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 35 + Shape + Rectangle + Style + + fill + + GradientCenter + {-0.29411799999999999, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;} +{\colortbl;\red255\green255\blue255;} +\deftab720 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardeftab720\ri-380 + +\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 ++ Tree getTree()\ ++ ChangeSet previous()\ ++ String ownerid()\ ++ long revision()\ ++ Iterable<Command> getCommands()} + VerticalPad + 0 + + TextPlacement + 0 + + + GridH + + 34 + 35 + + + ID + 33 + + + Bounds + {{11, 11}, {131, 28}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 3 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg932\cocoartf1187\cocoasubrtf340 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc + +\f0\fs24 \cf0 Version Control & Merge\ +API} + VerticalPad + 0 + + Wrap + NO + + + GridInfo + + GuidesLocked + NO + GuidesVisible + YES + HPages + 1 + ImageCounter + 1 + KeepToScale + + Layers + + + Lock + NO + Name + レイヤー 1 + Print + YES + View + YES + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2012-12-10 15:05:11 +0000 + Modifier + shoshi + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + PageBreaks + YES + PrintInfo + + NSBottomMargin + + float + 41 + + NSHorizonalPagination + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {595, 842} + + NSPrintReverseOrientation + + int + 0 + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + PrintOnePage + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + キャンバス 1 + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + ExpandedCanvases + + Frame + {{-2394, 90}, {693, 922}} + ListView + + OutlineWidth + 142 + RightSidebar + + ShowRuler + + Sidebar + + SidebarWidth + 120 + VisibleRegion + {{0, 0}, {558, 783}} + Zoom + 1 + ZoomValues + + + キャンバス 1 + 1 + 1 + + + + + diff -r 000000000000 -r 44465893e8b8 document/version_control_api.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/document/version_control_api.svg Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,3 @@ + + +2012-12-10 15:05Zキャンバス 1レイヤー 1Version Control & MergeAPI+ Tree getTree()+ ChangeSet previous()+ String ownerid()+ long revision()+ Iterable<Command> getCommands()ChangeSet+ Command APPEND_CHILD+ Command DELETE_CHILD+ Command PUT_ATTRIBUTE+ Command DELETE_ATTRIBUTE+ NodePath getPath()<<enum>>Command+ MergeResult merge(TipChangeSet local,ChangeSet remote)<<inteface>>Merger+ TreeEditor getEditor()TipChangeSet<<uses>><<uses>>+ MergeResult.Status getStatus()<<inteface>>MergeResult+ MergeResult.Status SUCCESS+ MergeResult.Status CONFLICT<<enum>>MergeResult.Status<<uses>><<uses>> diff -r 000000000000 -r 44465893e8b8 jungle-core.iml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jungle-core.iml Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r 000000000000 -r 44465893e8b8 pom.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pom.xml Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,58 @@ + + 4.0.0 + + jungle + jungle-core + 0.0.3-SNAPSHOT + jar + + jungle-core + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 4.7 + test + + + com.google.guava + guava + 12.0 + + + commons-collections + commons-collections + 3.2.1 + + + org.functionaljava + functionaljava + 4.2-beta-1 + + + + org.apache.maven.surefire + surefire-junit4 + 2.13 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/DefaultJungle.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/DefaultJungle.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,92 @@ +package jp.ac.u_ryukyu.ie.cr.jungle; + + +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.Journal; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.DefaultTreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.TreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeList; +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.NullJournal; +import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeContext; +import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeContext; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +import java.util.Iterator; +import java.util.concurrent.ConcurrentHashMap; + +public class DefaultJungle implements Jungle { + private Journal journal; + private ConcurrentHashMap trees; + private String uuid; + private TreeEditor editor; + + public static void main(String args[]) { + DefaultJungle j = new DefaultJungle(null, "hoge", new DefaultTreeEditor(new DefaultTraverser())); + JungleTree t = j.createNewTree("fuga"); + + JungleTreeEditor e1 = t.getTreeEditor(); + + DefaultNodePath root = new DefaultNodePath(); + + Either either = e1.addNewChildAt(root, 0); + e1 = either.b(); + either = e1.addNewChildAt(root.add(0), 0); + e1 = either.b(); + e1.success(); + } + + public DefaultJungle(Journal journal, String uuid, TreeEditor editor) { + this.journal = new NullJournal(); + this.trees = new ConcurrentHashMap(); + this.uuid = uuid; + this.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 = new List<>(); + return nil.iterator(); + } + + @Override + public String uuid() { + return uuid; + } + + @Override + public String getTreeName() { + return name; + } + + @Override + public TreeOperationLog getLog() { + return new DefaultTreeOperationLog(); + } + + }; + DefaultTreeNode root = new DefaultTreeNode(); + InterfaceTraverser traverser = new InterfaceTraverser(root, true); + TreeContext tc = new DefaultTreeContext(root, null, list, uuid, name, 0, traverser); + JungleTree newTree = new DefaultJungleTree(tc, uuid, journal.getWriter(), editor); + if (trees.putIfAbsent(name, newTree) != null) { + return null; + } + return newTree; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/DefaultJungleTree.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/DefaultJungleTree.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,113 @@ +package jp.ac.u_ryukyu.ie.cr.jungle; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeListWriter; +import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeContext; +import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultJungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTransactionManager; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.GetOldTreeError; +import jp.ac.u_ryukyu.ie.cr.jungle.store.index.ParentIndex; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.util.concurrent.atomic.AtomicReference; + +public class DefaultJungleTree implements JungleTree { + + private final AtomicReference repository; + private final String uuid; + private final ChangeListWriter writer; + private final TreeEditor treeEditor; + + public DefaultJungleTree(TreeContext tc, String uuid, ChangeListWriter writer, TreeEditor editor) { + this.repository = new AtomicReference(tc); + this.uuid = uuid; + this.writer = writer; + this.treeEditor = editor; + } + + @Override + public JungleTreeEditor getTreeEditor() { + TreeContext tc = repository.get(); + DefaultTransactionManager txManager = new DefaultTransactionManager(writer, tc, repository, uuid); + TreeNode root = tc.getRoot(); + return new DefaultJungleTreeEditor(root, txManager, treeEditor); + } + + @Override + public JungleTreeEditor getLocalTreeEditor() { + return getTreeEditor(); + } + + @Override + public TreeNode getRootNode() { + TreeContext tc = repository.get(); + return tc.getRoot(); + } + + @Override + public InterfaceTraverser getTraverser(boolean useIndex) { + TreeContext tc = repository.get(); + return tc.getTraverser(); + } + + @Override + public ParentIndex getParentIndex() { + TreeContext tc = repository.get(); + return tc.getParentIndex(); + } + + @Override + public TreeMap>> getIndex() { + TreeContext tc = repository.get(); + return tc.getIndex(); + } + + @Override + public long revision() { + TreeContext tc = repository.get(); + return tc.revision(); + } + + @Override + public Either getOldTree(long revision) { + TreeContext tc = repository.get(); + + for (; tc.revision() != revision; ) { + tc = tc.prev(); + if (tc == null) + return DefaultEither.newA(GetOldTreeError.OLD_TREE_NOT_FOUND); + } + + + String oldTreeUuid = uuid + revision; + JungleTree oldTree = new DefaultJungleTree(tc, oldTreeUuid, writer, treeEditor); + return DefaultEither.newB(oldTree); + } + + @Override + public Either getNodeOfPath(NodePath path) { + TreeNode node = repository.get().getRoot(); + for (int num : path) { + if (num == -1) + continue; + Either either = node.getChildren().at(num); + if (either.isA()) + return either; + node = either.b(); + } + return DefaultEither.newB(node); + } + + @Override + public void setBufferSize(int _bufferSize) { + // not use + } + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/Jungle.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/Jungle.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,8 @@ +package jp.ac.u_ryukyu.ie.cr.jungle; + + +public interface Jungle +{ + public JungleTree getTreeByName(String name); + public JungleTree createNewTree(String name); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/JungleTree.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/JungleTree.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,33 @@ +package jp.ac.u_ryukyu.ie.cr.jungle; + + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.store.index.ParentIndex; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +public interface JungleTree { + public JungleTreeEditor getTreeEditor(); + + public JungleTreeEditor getLocalTreeEditor(); + + public TreeNode getRootNode(); + + public long revision(); + + public Either getOldTree(long revision); + + public TreeMap>> getIndex(); + + public ParentIndex getParentIndex(); + + public InterfaceTraverser getTraverser(boolean useIndex); + + public Either getNodeOfPath(NodePath path); + + public void setBufferSize(int _bufferSize); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/JungleTreeEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/JungleTreeEditor.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,23 @@ +package jp.ac.u_ryukyu.ie.cr.jungle; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +import java.nio.ByteBuffer; + +public interface JungleTreeEditor +{ + + public Either addNewChildAt(NodePath path,int pos); + public Either deleteChildAt(NodePath path,int pos); + public Either putAttribute(NodePath path,String key,ByteBuffer value); + public Either deleteAttribute(NodePath path,String key); + public Either replaceNewRootNode(); + public Either edit(NodePath path,NodeEditor editor); + public Either success(); + public Either flushSuccess(); + + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/App.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/App.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,83 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.bbs; + +import me.prettyprint.hector.api.HConsistencyLevel; +import org.mortbay.jetty.Connector; +import org.mortbay.jetty.Server; +import org.mortbay.jetty.nio.SelectChannelConnector; +import org.mortbay.jetty.servlet.ServletHandler; +import org.mortbay.jetty.servlet.ServletHolder; +import org.mortbay.thread.QueuedThreadPool; + +import javax.servlet.Servlet; + + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) throws Exception + { + BulletinBoard cassaBBS = null; + if(args.length == 0){ + cassaBBS = new JungleBulletinBoard(); + }else{ + HConsistencyLevel cLevel = HConsistencyLevel.QUORUM; + int rep_factor = 1; + int i=0; + while(i 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 String sanitize(String str); + GetAttributeImp getAttribute(String _bname, String _nodeNum, String revisionStr); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CassandraBulletinBoard.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CassandraBulletinBoard.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,219 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.bbs; + +import me.prettyprint.cassandra.model.ConfigurableConsistencyLevel; +import me.prettyprint.cassandra.serializers.StringSerializer; +import me.prettyprint.cassandra.serializers.UUIDSerializer; +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.HConsistencyLevel; +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; +import org.apache.cassandra.locator.SimpleStrategy; + +import java.util.*; + +public class CassandraBulletinBoard implements BulletinBoard +{ + private final String address; + private final String clusterName; + private final Cluster cluster; + private final String keyspace; + private final ConfigurableConsistencyLevel configurableConsistencyLevel = new ConfigurableConsistencyLevel(); + + private static final String COLUMN_FAMILY_BOARD = "boards"; + private final int REP_FACTOR; + + public CassandraBulletinBoard(String _clusterName,String _address,String _keyspaceName, HConsistencyLevel cLevel,int rep_factor ) + { + address = _address; + clusterName = _clusterName; + keyspace = _keyspaceName; + cluster = HFactory.getOrCreateCluster(clusterName,address); + Map clmap = new HashMap(); + clmap.put(COLUMN_FAMILY_BOARD, cLevel); + configurableConsistencyLevel.setReadCfConsistencyLevels(clmap); + configurableConsistencyLevel.setWriteCfConsistencyLevels(clmap); + REP_FACTOR = rep_factor; + initialize(); + } + + public CassandraBulletinBoard(String _clusterName,String _address,String _keyspaceName, HConsistencyLevel cLevel) + { + this(_clusterName, _address, _keyspaceName, cLevel, 1); + } + + + + private void initialize() + { + if(cluster.describeKeyspace(keyspace) == null){ + KeyspaceDefinition keyspaceDefinition = HFactory.createKeyspaceDefinition(keyspace, + SimpleStrategy.class.getName(),REP_FACTOR,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, configurableConsistencyLevel); + 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, configurableConsistencyLevel); + 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, configurableConsistencyLevel); + 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, configurableConsistencyLevel); + 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); + } + + public String sanitize( String str ) { + if(str==null) { + return str; + } + str = str.replaceAll("&" , "&" ); + str = str.replaceAll("<" , "<" ); + str = str.replaceAll(">" , ">" ); + str = str.replaceAll("\"", """); + str = str.replaceAll("'" , "'" ); + return str; + } + + public GetAttributeImp getAttribute(String _bname, String _nodeNum, String revisionStr) { + return null; // 未実装 使うときに実装する + } + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CreateBoardMessageServlet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CreateBoardMessageServlet.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,39 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.bbs; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; + +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 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CreateBoardServlet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/CreateBoardServlet.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,40 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.bbs; + +import org.apache.commons.lang.StringEscapeUtils; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; + +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 = StringEscapeUtils.unescapeHtml(_req.getParameter(PARAM_BOARD_NAME)); + String author = StringEscapeUtils.unescapeHtml(_req.getParameter(PARAM_BOARD_AUTHOR)); + String msg = StringEscapeUtils.unescapeHtml(_req.getParameter(PARAM_BOARD_INITMESSAGE)); + String key = StringEscapeUtils.unescapeHtml(_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 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/EditMessageServlet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/EditMessageServlet.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,63 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.bbs; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; + +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); + System.out.println("write"); + + 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 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/EditMessageUseGetServlet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/EditMessageUseGetServlet.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,40 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.bbs; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; + +public class EditMessageUseGetServlet 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 EditMessageUseGetServlet(BulletinBoard _bbs) + { + bbs = _bbs; + } + + public void doGet(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 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/GetAttributeImp.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/GetAttributeImp.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,23 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.bbs; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; + +import java.util.Iterator; + +public class GetAttributeImp { + private final TreeNode node; + + public GetAttributeImp(TreeNode _node) { + node = _node; + } + + public String getMessage(String key) { + return node.getAttributes().getString(key); + } + + public Iterator getKeys() { + return node.getAttributes().getKeys(); + } + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/HectorSample.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/HectorSample.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,62 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.bbs; + +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.*; +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; + +import java.util.List; +import java.util.UUID; + +public class HectorSample +{ + public static void main(String _args[]) + { + Cluster myCluster = HFactory.getOrCreateCluster("test-cluster","localhost:9160"); + + Keyspace ksp = HFactory.createKeyspace("cassaBBS",myCluster); + + 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 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/IterableConverter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/IterableConverter.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,52 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.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 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/JungleBulletinBoard.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/JungleBulletinBoard.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,219 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.bbs; + + +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.core.Children; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultEvaluator; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traversal; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; + +import java.nio.ByteBuffer; +import java.util.concurrent.atomic.AtomicInteger; + +public class JungleBulletinBoard implements + BulletinBoard { + private final Jungle jungle; + + public JungleBulletinBoard() { + jungle = new DefaultJungle(null, "hoge", new DefaultTreeEditor( + new DefaultTraverser())); + jungle.createNewTree("boards"); + } + + public Iterable getBoards() { + JungleTree tree = jungle.getTreeByName("boards"); + TreeNode node = tree.getRootNode(); + Children chs = node.getChildren(); + + IterableConverter.Converter converter = new IterableConverter.Converter() { + public String conv(TreeNode _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(); + } + + tree = jungle.getTreeByName(_name); + editor = tree.getTreeEditor(); + editor = editor.putAttribute(root,"author", ByteBuffer.wrap(_author.getBytes())).b(); + editor = editor.putAttribute(root,"key", ByteBuffer.wrap(_editKey.getBytes())).b(); + either = editor.putAttribute(root,"mes", ByteBuffer.wrap(_initMessage.getBytes())); + + 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(); + } + + JungleTreeEditor editor; + do { + TreeNode node = tree.getRootNode(); + int size = node.getChildren().size(); + DefaultNodePath path = new DefaultNodePath(); + + editor = tree.getTreeEditor(); + Either either = editor.addNewChildAt(path, + size); + if (either.isA()) { + throw new IllegalStateException(); + } + editor = either.b(); + editor = editor.putAttribute(path.add(size),"author", ByteBuffer.wrap(_author.getBytes())).b(); + editor = editor.putAttribute(path.add(size),"key", ByteBuffer.wrap(_editKey.getBytes())).b(); + either = editor.putAttribute(path.add(size),"mes", ByteBuffer.wrap(_message.getBytes())); + + if (either.isA()) { + throw new IllegalStateException(); + } + editor = either.b(); + }while (editor.success().isA()); + } + + public void editMessage(String _board, String _uuid, final String _author, + final String _message, final String _editKey) { + JungleTreeEditor editor = null; + do { + DefaultNodePath path = new DefaultNodePath(); + path = path.add(Integer.parseInt(_uuid)); + + JungleTree tree = jungle.getTreeByName(_board); + editor = tree.getTreeEditor(); + + editor = editor.putAttribute(path,"author", ByteBuffer.wrap(_author.getBytes())).b(); + editor = editor.putAttribute(path,"key", ByteBuffer.wrap(_editKey.getBytes())).b(); + Either either = editor.putAttribute(path,"mes", ByteBuffer.wrap(_message.getBytes())); + + if (either.isA()) { + throw new IllegalStateException(); + } + editor = either.b(); + }while (editor.success().isA()); + } + + public Iterable getMessages(String _boardName) { + JungleTree tree = jungle.getTreeByName(_boardName); + TreeNode node = tree.getRootNode(); + Children chs = node.getChildren(); + + final AtomicInteger counter = new AtomicInteger(0); + IterableConverter.Converter converter = new IterableConverter.Converter() { + public BoardMessage conv(TreeNode _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; + } + } + + public String sanitize(String str) { + if (str == null) { + return str; + } + str = str.replaceAll("&", "&"); + str = str.replaceAll("<", "<"); + str = str.replaceAll(">", ">"); + str = str.replaceAll("\"", """); + str = str.replaceAll("'", "'"); + return str; + } + + public GetAttributeImp getAttribute(String _bname, String _nodeNum, String revisionStr) { + + DefaultNodePath path = new DefaultNodePath(); + try { + for (int count = 0; _nodeNum.substring(count, count + 1) != null; count++) { + if (!_nodeNum.substring(count, count + 1).equals("/")) + path = path.add(Integer.parseInt(_nodeNum.substring(count, count + 1))); + } + } catch (Exception _e) { + } + JungleTree tree = jungle.getTreeByName(_bname); + System.out.println(tree.revision()); + Long revision = Long.parseLong(revisionStr); + JungleTree oldTree = tree.getOldTree(revision).b(); + System.out.println(oldTree.revision()); + TreeNode node = oldTree.getRootNode(); + + DefaultTraverser traverser = new DefaultTraverser(); + DefaultEvaluator evaluator = new DefaultEvaluator(path); + Either ret = traverser.traverse(node, evaluator); + if (ret.isA()) { + Assert.fail(); + } + + Traversal traversal = ret.b(); + TreeNode target = traversal.destination(); + return new GetAttributeImp(target); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/ShowBoardMessageServlet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/ShowBoardMessageServlet.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,55 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.bbs; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; +import java.util.Iterator; + +public class ShowBoardMessageServlet extends HttpServlet { + /** + * + */ + private static final long serialVersionUID = 1L; + private final BulletinBoard bbs; + private final String createBoardMessagePath; + + private static final String PARAM_BOARD_NAME = "bname"; + + public ShowBoardMessageServlet(BulletinBoard _bbs, String _createBoardMessagePath, String _editMessagePath) { + bbs = _bbs; + createBoardMessagePath = _createBoardMessagePath; + } + + 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("

" + bbs.sanitize(_bname) + "

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

\n"); + _pw.write("

Message

\n"); + _pw.write("

\n"); + GetAttributeImp attribute = bbs.getAttribute(_bname, "[-1]", "1"); + Iterator keys = attribute.getKeys(); + + do { + String key = keys.next(); + String mesage = attribute.getMessage(key); + _pw.write("

" + key + " = " + mesage + "

\n"); + }while(keys.hasNext()); + + _pw.write(""); + _pw.flush(); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/ShowBoardsServlet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/bbs/ShowBoardsServlet.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,55 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.bbs; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; + +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{ + _res.setCharacterEncoding("UTF-8"); + 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("
"); + } + + _pw.write(""); + _pw.flush(); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/benchMark/Data/TreeMapBenchMark.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/benchMark/Data/TreeMapBenchMark.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,29 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.benchMark.Data; + + +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.util.ArrayList; +import java.util.Collections; + +public class TreeMapBenchMark { + public static void main(String[] args) { + for (int i = 1; i <= 10; i++) { + TreeMap map = new TreeMap<>(); + ArrayList list = new ArrayList<>(); + + for (int count = 1; count < 100000 * i; count++) { + map = map.put(count, count); + list.add(count); + } + + Collections.shuffle(list); + long t1 = System.currentTimeMillis(); + for (Integer num : list) { + map = map.delete(num); + } + long t2 = System.currentTimeMillis(); + System.out.println((i * 100000) + " time = " + (t2 - t1)); + } + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/benchMark/JungleBenchMark.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/benchMark/JungleBenchMark.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,58 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.benchMark; + +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeAttributes; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; + +import java.nio.ByteBuffer; +import java.util.Iterator; + + +/** + * Created by e115731 on 15/05/07. + */ +public class JungleBenchMark { + public static void main(String args[]) { + DefaultJungle jungle = new DefaultJungle(null, "sample", new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("tree"); + JungleTree tree = jungle.getTreeByName("tree"); + JungleTreeEditor editor = tree.getTreeEditor(); + NodePath path = new DefaultNodePath(); + path = path.add(0); + for (int count = 1; count <= 10; count++) { + for (int personCount = 0; personCount < 1000 * count; personCount++) { + editor = editor.replaceNewRootNode().b(); + ByteBuffer value = ByteBuffer.wrap(("p:" + personCount).getBytes()); + editor = editor.putAttribute(path, "personId", value).b(); + ByteBuffer value2 = ByteBuffer.wrap(("r:" + personCount).getBytes()); + editor = editor.putAttribute(path, "roleId", value2).b(); + } + editor.success(); + long t1 = System.currentTimeMillis(); + for (int findCount = 0; findCount < 50000; ) { + InterfaceTraverser traverser = tree.getTraverser(true); + Iterator it = traverser.find(null, "personId", "p:100"); + if (it.hasNext()) { + TreeNode targetNode = it.next(); + TreeNodeAttributes attribute = targetNode.getAttributes(); + String targetRoleId = attribute.getString("roleId"); + if (targetRoleId.equals("r:100")) + findCount++; + } else { + System.out.println("find miss"); + System.exit(1); + } + } + long t2 = System.currentTimeMillis(); + System.out.println("time = " + (t2 - t1)); + } + + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/core/App.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/core/App.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,42 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core; + +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +import java.nio.ByteBuffer; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + DefaultJungle jungle = new DefaultJungle(null,"sample", new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("hoge"); + JungleTree tree = jungle.getTreeByName("hoge"); + JungleTreeEditor editor = tree.getTreeEditor(); + DefaultNodePath path = new DefaultNodePath(); + + String key = "key"; + ByteBuffer value = ByteBuffer.wrap(key.getBytes()); + + Either either = editor.putAttribute(path,"key",value); + JungleTreeEditor e = either.b(); + e.success(); + + + TreeNode root = tree.getRootNode(); + ByteBuffer v = root.getAttributes().get(key); + String str = new String(v.array()); + System.out.println(str); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/core/Attributes.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/core/Attributes.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,9 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core; + +import java.nio.ByteBuffer; + +public interface Attributes +{ + public ByteBuffer get(String key); + public String getString(String key); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/core/AttributesContainer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/core/AttributesContainer.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,6 @@ +//package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; +// +//public interface AttributesContainer +//{ +// public Attributes getAttributes(); +//} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/core/Children.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/core/Children.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,11 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public interface Children extends Iterable +{ + public Either at(int pos); + public int size(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/DefaultNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/DefaultNode.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,70 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.list; + + +public class DefaultNode implements Node { + private final T attribute; + private final Node next; + + public DefaultNode(T attribute, Node next) { + this.attribute = attribute; + this.next = next; + } + + + public Node getNext() { + return next; + } + + public T getAttribute() { + return attribute; + } + + public Node addLast(T attribute) { + Node node = next.addLast(attribute); + return new DefaultNode<>(this.attribute, node); + } + + public Node add(int currentNum, int num, T attribute) { + if (currentNum == num) { + Node newNode = new DefaultNode<>(attribute, this.next); + return new DefaultNode<>(this.attribute, newNode); + } + + Node newNode = next.add(currentNum + 1, num, attribute); + if (newNode == null) + return null; + + return new DefaultNode<>(this.attribute, newNode); + } + + @Override + public Node delete(int currentNum, int deleteNum) { + if (currentNum == deleteNum) { + return new DefaultNode<>(this.attribute, this.next.getNext()); + } + + Node newNode = next.delete(currentNum + 1, deleteNum); + if (newNode == null) + return null; + + return new DefaultNode<>(this.attribute, newNode); + } + + @Override + public Node replaceNode(int currentNum, int num, T attribute) { + if (currentNum == num) { + return new DefaultNode<>(attribute, this.getNext()); + } + + Node newNode = next.replaceNode(currentNum + 1, num, attribute); + if (newNode == null) + return null; + + return new DefaultNode<>(this.attribute, newNode); + } + + @Override + public int length() { + return next.length() + 1; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/List.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/List.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,158 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.list; + +import java.util.Iterator; +import java.util.Stack; + + + +public class List implements Iterable { + final private Node head; + + public List() { + this.head = new headNode<>(); + } + + + @SafeVarargs + public List(T... attributes) { + List list = new List<>(); + for (T attribute : attributes) { + list = list.addLast(attribute); + } + this.head = list.getHead(); + } + + private List(Node head) { + this.head = head; + } + + public Node getHead() { + return head; + } + + public List add(int num, T attribute) { + Node newHead = head.add(0, num, attribute); + if (newHead == null) + return this; + return new List<>(newHead); + } + + public List addLast(T attribute) { + Node newHead = head.addLast(attribute); + return new List<>(newHead); + } + + + public T index(int num) { + int count = 0; + Node currentNode = head.getNext(); + while (currentNode != null) { + if (count == num) + return currentNode.getAttribute(); + currentNode = currentNode.getNext(); + count++; + } + return null; + } + + public Iterator iterator() { + return new Iterator() { + Node currentNode = head.getNext(); + + @Override + public boolean hasNext() { + return currentNode.getAttribute() != null; + } + + @Override + public T next() { + T attribute = currentNode.getAttribute(); + currentNode = currentNode.getNext(); + return attribute; + } + }; + } + + public Iterator reverseIterator() { + Node currentNode = head.getNext(); + Stack stack = new Stack<>(); + while (currentNode.getAttribute() != null) { + stack.push(currentNode.getAttribute()); + currentNode = currentNode.getNext(); + } + return new Iterator() { + + @Override + public boolean hasNext() { + return !stack.isEmpty(); + } + + @Override + public T next() { + return stack.pop(); + } + }; + } + + + public List delete(int num) { + Node newNode = head.delete(0, num); + if (newNode == null) + return this; + return new List<>(newNode); + } + + public List replace(int num, T attribute) { + Node newHead = head.replaceNode(0, num, attribute); + if (newHead == null) + return this; + return new List<>(newHead); + } + + public T tail() { + return index(length() - 1); + } + + public T head() { + return index(0); + } + + public List deleteLast() { + return delete(head.length() - 1); + } + + public List deleteHead() { + return delete(0); + } + + public int length() { + return head.length(); + } + + @Override + public String toString() { + String pathString = "<"; + Iterator iterator = reverseIterator(); + while (true) { + pathString += iterator.next(); + if (iterator.hasNext()) + pathString += ","; + else + break; + } + pathString += ">"; + return pathString; + } + + public List append(List list) { + Iterator iterator = list.iterator(); + List newList = this; + while (iterator.hasNext()) { + T attribute = iterator.next(); + newList = newList.addLast(attribute); + } + return newList; + } + + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/Node.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/Node.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,19 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.list; + + +public interface Node { + + public Node getNext(); + + public T getAttribute(); + + public Node add(int currentNum, int num, T attribute); + + public Node addLast(T attribute); + + public Node delete(int currentNum, int num); + + public Node replaceNode(int currentNum, int num, T attribute); + + public int length(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/TailNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/TailNode.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,39 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.list; + + +public class TailNode implements Node { + @Override + public Node getNext() { + return null; + } + + @Override + public T getAttribute() { + return null; + } + + @Override + public Node add(int currentNum, int num, T attribute) { + return null; + } + + @Override + public Node delete(int CurentNum, int num) { + return null; + } + + @Override + public Node replaceNode(int currentNum, int num, T attribute) { + return null; + } + + @Override + public Node addLast(T attribute) { + return new DefaultNode<>(attribute, this); + } + + @Override + public int length() { + return 0; + } +} \ No newline at end of file diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/headNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/list/headNode.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,63 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.list; + +public class headNode implements Node { + private final Node next; + + + public headNode() { + this.next = new TailNode<>(); + } + + public headNode(Node next) { + this.next = next; + } + + public Node getNext() { + return next; + } + + public T getAttribute() { + return null; + } + + public Node add(int currentNum, int num, T attribute) { + if (num == 0) { + Node newNode = new DefaultNode<>(attribute, next); + return new headNode<>(newNode); + } + Node newNode = next.add(currentNum + 1, num, attribute); + if (newNode == null) + return this; + return new headNode<>(newNode); + } + + public Node addLast(T attribute) { + Node node = next.addLast(attribute); + return new headNode<>(node); + } + + public Node delete(int currentNum, int deleteNum) { + if (currentNum == deleteNum) { + return new headNode<>(this.next.getNext()); + } + + Node newNode = next.delete(currentNum + 1, deleteNum); + if (newNode == null) + return this; + return new headNode<>(newNode); + } + + @Override + public Node replaceNode(int currentNum, int num, T attribute) { + Node nextNode = getNext(); + Node newNode = nextNode.replaceNode(currentNum, num, attribute); + if (newNode == null) + return this; + return new headNode<>(newNode); + } + + @Override + public int length() { + return next.length(); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/BlackNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/BlackNode.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,131 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.treemap; + +import org.junit.Test; + +import java.util.Comparator; + + +public class BlackNode extends Node { + + + public BlackNode(K key, V value, Node left, Node right) { + super(key, value, left, right); + } + + + @Override + public rebuildNode deleteNode() { + EmptyNode emptyNode = new EmptyNode<>(key); + return new rebuildNode<>(true, emptyNode); + } + + @Override + @Test + protected int checkDepth(int count, int minCount) { // test method + count++; + minCount = left().checkDepth(count, minCount); + minCount = right().checkDepth(count, minCount); + return minCount; + } + + + @Override + protected boolean isNotEmpty() { + return true; + } + + @Override + public Node createNode(K key, V value, Node left, Node right) { + return new BlackNode<>(key, value, left, right); + } + + + @Override + Node insBalance() { + Rotate spin = left.checkRotate(Rotate.L); + + if (spin == Rotate.R) { + Node leftChild = new BlackNode<>(left.left().getKey(), left.left().getValue(), left.left().left(), left.left().right()); + Node rightChild = new BlackNode<>(getKey(), getValue(), left.right(), right); + return new RedNode<>(left.getKey(), left.getValue(), leftChild, rightChild); + + } else if (spin == Rotate.LR) { + Node leftChild = new BlackNode<>(left.getKey(), left.getValue(), left.left(), left.right().left()); + Node rightChild = new BlackNode<>(getKey(), getValue(), left.right().right(), right); + return new RedNode<>(left.right().getKey(), left.right().getValue(), leftChild, rightChild); + + } + + spin = right.checkRotate(Rotate.R); + if (spin == Rotate.L) { + Node leftChild = new BlackNode<>(getKey(), getValue(), left, right.left()); + Node rightChild = new BlackNode<>(right.right().getKey(), right.right().getValue(), right.right().left(), right.right().right()); + return new RedNode<>(right.getKey(), right.getValue(), leftChild, rightChild); + + } else if (spin == Rotate.RL) { + Node leftChild = new BlackNode<>(getKey(), getValue(), left, right.left().left()); + Node rightChild = new BlackNode<>(right.getKey(), right.getValue(), right.left().right(), right.right()); + return new RedNode<>(right.left().getKey(), right.left().getValue(), leftChild, rightChild); + + } + + return this; + } + + + @Override + Rotate checkRotate(Rotate side) { + return Rotate.N; + } + + @Override + boolean isRed() { + return false; + } + + @Override + @SuppressWarnings("unchecked") + public rebuildNode replaceNode(Node parent, Comparator ctr) { + Node newNode; + if (!this.left().isNotEmpty() && !this.right().isNotEmpty()) { //自身を削除する + return deleteNode();//黒が1つ減るので木のバランスを取る + } else if (this.left().isNotEmpty() && !this.right().isNotEmpty()) { //左の部分木を昇格させる + newNode = createNode(left().getKey(), left().getValue(), left().left(), left().right()); + if (!this.left().isRed()) //昇格させる木のrootが黒だったらバランスを取る + return new rebuildNode(true, newNode); + return new rebuildNode(false, newNode); + } else if (!this.left().isNotEmpty() && this.right().isNotEmpty()) { //右の部分木を昇格させる + newNode = createNode(right().getKey(), right().getValue(), right().left(), right().right()); + if (!this.right().isRed()) //昇格させる木のrootが黒だったらバランスを取る + return new rebuildNode(true, newNode); + return new rebuildNode(false, newNode); + } else {//子ノードが左右にある場合 二回目はここには入らない + //左の部分木の最大の値を持つNodeと自身を置き換える + Node cur = this.left(); + while (cur.right().isNotEmpty()) { //左の部分期の最大値を持つNodeを取得する + cur = cur.right(); + } + if (this.left().right().isNotEmpty()) { //左の部分木が右の子を持っているか + rebuildNode leftSubTreeNodeRebuildNode = this.left().deleteSubTreeMaxNode(null, ctr, Rotate.L);//最大値を削除した左の部分木を返す。rootはthisと同じ。 + if (leftSubTreeNodeRebuildNode.rebuild()) { + Node leftSubTreeNode = leftSubTreeNodeRebuildNode.getNode(); + Node newParent = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.right()); + return leftSubTreeNode.deleteBalance(newParent, ctr); + } + Node leftSubTreeNode = leftSubTreeNodeRebuildNode.getNode(); + newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.right()); //rootをcurと入れ替えることでNodeの削除は完了する + return new rebuildNode(false, newNode); + } else { + rebuildNode leftSubTreeNodeRebuildNode = this.left().replaceNode(this, ctr);//右の子がいなかった場合、左の子を昇格させるだけで良い。 + if (leftSubTreeNodeRebuildNode.rebuild()) { + Node node = leftSubTreeNodeRebuildNode.getNode(); + Node newParent = createNode(this.left().getKey(), this.left().getValue(), node, this.right()); + return node.deleteBalance(newParent, ctr); + } + Node leftSubTreeNode = leftSubTreeNodeRebuildNode.getNode(); + newNode = createNode(this.left().getKey(), this.left().getValue(), leftSubTreeNode, this.right()); + return new rebuildNode(false, newNode); + } + } + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/DefaultComparator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/DefaultComparator.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,11 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.treemap; + +import java.util.Comparator; + +public class DefaultComparator implements Comparator{ + @Override + @SuppressWarnings("unchecked") + public int compare(K key, K compareKey) { + return ((Comparable)key).compareTo(compareKey); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/EmptyNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/EmptyNode.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,82 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.treemap; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Comparator; + + +public class EmptyNode extends Node { + + public EmptyNode() { + super(null, null); + } + + public EmptyNode(K key) { //keyは削除時の回転処理に使用する + super(key, null); + } + + @Override // 回転処理時にEmptyNodeの子を見ることがあるのでleft rightでEmptyNodeを返すようにする + public Node left() { + return new EmptyNode<>(); + } + + @Override + public Node right() { + return new EmptyNode<>(); + } + + + @Override + protected boolean isNotEmpty() { + return false; + } + + + @Override + public Node createNode(K key, V value, Node left, Node right) { + return new RedNode<>(key, value, new EmptyNode<>(), new EmptyNode<>()); + } + + + public Node put(K k, V value) { + return new RedNode<>(k, value, new EmptyNode<>(), new EmptyNode<>()); + } + + @Override + public rebuildNode replaceNode(Node parent, Comparator ctr) { // not use method + return new rebuildNode<>(false, this); + } + + @Override + protected rebuildNode deleteNode() { //not use method + return new rebuildNode<>(false, this); + } + + @Override + Node insBalance() { + return this; + } + + @Override + Rotate checkRotate(Rotate side) { + return Rotate.N; + } + + @Override + boolean isRed() { + return false; + } + + @Override + @Test + protected int checkDepth(int count, int minCount) { // test method + if (count < minCount | minCount == 0) + minCount = count; + System.out.println("depth = " + count); + + Assert.assertTrue(count <= 2 * minCount); + return minCount; + } + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/Node.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/Node.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,309 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.treemap; + +import org.junit.Test; + +import java.util.Comparator; +import java.util.Optional; + + +public abstract class Node { + + protected K key; + protected V value; + protected Node right; + protected Node left; + + public Node(K key, V value) { + this.key = key; + this.value = value; + } + + public Node(K key, V value, Node left, Node right) { + this.key = key; + this.value = value; + this.right = right; + this.left = left; + } + + public Node left() { + return left; + } + + @SuppressWarnings("unchecked") + public int compare(K compareKey, Comparator ctr) { + return ctr.compare(compareKey, this.getKey()); + } + + public Optional get(K key, Comparator ctr) { + Node cur = this; + while (cur.isNotEmpty()) { + int result = cur.compare(key, ctr); + if (result > 0) + cur = cur.right(); + else if (result < 0) + cur = cur.left(); + else if (result == 0) + return Optional.ofNullable(cur.getValue()); + } + return Optional.ofNullable(null); + } + + + public Node right() { + return right; + } + + public K getKey() { + return key; + } + + public V getValue() { + return value; + } + + + public Node put(K k, V value, Comparator ctr) { + if (!isNotEmpty()) { + return createNode(k, value, left, right); + } + int result = compare(k, ctr); + if (result > 0) { + Node node = right.put(k, value, ctr); + node = createNode(key, this.value, left, node); + return node.insBalance(); + } else if (result < 0) { + Node node = left.put(k, value, ctr); + return createNode(key, this.value, node, right).insBalance(); + } + return createNode(key, value, left, right); // equals + + } + + @SuppressWarnings("unchecked") + public rebuildNode delete(K key, Node parent, Comparator ctr, Rotate side) { + if (this.isNotEmpty()) { + rebuildNode rebuildNode; + int result = compare(key, ctr); + if (result > 0) { + rebuildNode = right.delete(key, this, ctr, Rotate.R); + } else if (result < 0) { + rebuildNode = left.delete(key, this, ctr, Rotate.L); + } else { //Equal + rebuildNode = replaceNode(parent, ctr); + } + if (parent == null) + return rebuildNode; + Node node = rebuildNode.getNode(); + if (rebuildNode.rebuild()) { + return node.deleteBalance(parent, ctr); + } + + Node newParent; + if (side == Rotate.L) + newParent = parent.createNode(parent.getKey(), parent.getValue(), node, parent.right()); + else + newParent = parent.createNode(parent.getKey(), parent.getValue(), parent.left(), node); + + return new rebuildNode<>(false, newParent); + } + return null; + } + + @SuppressWarnings("unchecked") + public rebuildNode deleteSubTreeMaxNode(Node parent, Comparator ctr, Rotate side) { + rebuildNode rebuildNode; + Node node; + if (right().isNotEmpty()) {//最大値のノードが取得できるまで潜る + rebuildNode = right().deleteSubTreeMaxNode(this, ctr, Rotate.R); + } else { + rebuildNode = this.replaceNode(parent, ctr); + } + if (parent == null) + return rebuildNode; + + if (rebuildNode.rebuild()) { + node = rebuildNode.getNode(); + return node.deleteBalance(parent, ctr); + } + if (side == Rotate.R) + node = parent.createNode(parent.getKey(), parent.getValue(), parent.left(), rebuildNode.getNode()); + else + node = parent.createNode(parent.getKey(), parent.getValue(), rebuildNode.getNode(), parent.right()); + return new rebuildNode<>(false, node); + } + + public rebuildNode deleteBalance(Node parent, Comparator ctr) { + Node newNode = null; + if (!isRed()) { + if (0 > compare(parent.getKey(), ctr)) { //自身がどちらの子かを調べる + boolean rightChild = parent.left().right().isRed(); + boolean leftChild = parent.left().left().isRed(); + + if (!parent.isRed()) { //親が黒 + if (!parent.left().isRed()) { //左の子が黒 + if (!rightChild && !leftChild) { + newNode = rebuildThree(parent, Rotate.R); + return new rebuildNode<>(true, newNode); + } + if (rightChild) { + newNode = rebuildfive(parent, Rotate.R); + return new rebuildNode<>(false, newNode); + } else { + newNode = rebuildsix(parent, Rotate.R); + return new rebuildNode<>(false, newNode); + } + } else { //左の子が赤 + newNode = rebuildTwo(parent, ctr, Rotate.R); + return new rebuildNode<>(false, newNode); + } + } else { //親が赤 + if (!rightChild && !leftChild) { + newNode = rebuildFour(parent, Rotate.R); + return new rebuildNode<>(false, newNode); + } + if (rightChild) { + newNode = rebuildfive(parent, Rotate.R); + return new rebuildNode<>(false, newNode); + } else { + newNode = rebuildsix(parent, Rotate.R); + return new rebuildNode<>(false, newNode); + } + } + } else { + boolean rightChild = parent.right().right().isRed(); + boolean leftChild = parent.right().left().isRed(); + + if (!parent.isRed()) { //親が黒 + if (!parent.right().isRed()) { //左の子が黒 + if (!rightChild && !leftChild) { + newNode = rebuildThree(parent, Rotate.L); + return new rebuildNode<>(true, newNode); + } + if (rightChild) { + newNode = rebuildsix(parent, Rotate.L); + return new rebuildNode<>(false, newNode); + } else { + newNode = rebuildfive(parent, Rotate.L); + return new rebuildNode<>(false, newNode); + } + } else { //左の子が赤 + newNode = rebuildTwo(parent, ctr, Rotate.L); + return new rebuildNode<>(false, newNode); + } + } else { //親が赤 + if (!rightChild && !leftChild) { + newNode = rebuildFour(parent, Rotate.L); + return new rebuildNode<>(false, newNode); + } + if (rightChild) { + newNode = rebuildsix(parent, Rotate.L); + return new rebuildNode<>(false, newNode); + } else { + newNode = rebuildfive(parent, Rotate.L); + return new rebuildNode<>(false, newNode); + } + } + } + } + if (0 > (compare(parent.getKey(), ctr))) { + newNode = parent.createNode(parent.getKey(), parent.getValue(), parent.left(), this); + return new rebuildNode<>(false, newNode); + } else { + newNode = parent.createNode(parent.getKey(), parent.getValue(), this, parent.right()); + return new rebuildNode<>(false, newNode); + } + } + + protected Node rebuildTwo(Node parent, Comparator ctr, Rotate side) { // case2 + if (side == Rotate.L) { // rotate Left + Node node = parent.right(); + Node leftSubTreeRoot = node.createNode(parent.getKey(), parent.getValue(), this, node.left()); // check + rebuildNode rebuildNode = new rebuildNode<>(false, leftSubTreeRoot); + rebuildNode leftNodeRebuildNode = this.deleteBalance(rebuildNode.getNode(), ctr); + Node rightNode = node.right(); + return parent.createNode(node.getKey(), node.getValue(), leftNodeRebuildNode.getNode(), rightNode); + } else { // rotate Right + Node node = parent.left(); + Node rightSubTreeRoot = node.createNode(parent.getKey(), parent.getValue(), node.right(), this); + rebuildNode rightSubTreeRebuildNode = new rebuildNode<>(false, rightSubTreeRoot); + rebuildNode rightNodeRebuildNode = this.deleteBalance(rightSubTreeRebuildNode.getNode(), ctr); + Node leftNode = node.left(); + return parent.createNode(node.getKey(), node.getValue(), leftNode, rightNodeRebuildNode.getNode()); + } + } + + protected Node rebuildThree(Node parent, Rotate side) { // case3 再帰 + if (side == Rotate.L) { + Node rightNode; + if (parent.right().isNotEmpty()) + rightNode = new RedNode<>(parent.right().getKey(), parent.right().getValue(), parent.right().left(), parent.right().right()); // check + else + rightNode = new EmptyNode<>(); + return parent.createNode(parent.getKey(), parent.getValue(), this, rightNode); + } else { + Node leftNode; + if (parent.left().isNotEmpty()) + leftNode = new RedNode<>(parent.left().getKey(), parent.left().getValue(), parent.left().left(), parent.left().right()); // check + else + leftNode = new EmptyNode<>(); + return parent.createNode(parent.getKey(), parent.getValue(), leftNode, this); + } + } + + protected Node rebuildFour(Node parent, Rotate side) { //case 4 + if (side == Rotate.R) { + Node leftNode = new RedNode<>(parent.left().getKey(), parent.left().getValue(), parent.left().left(), parent.left().right()); + return new BlackNode<>(parent.getKey(), parent.getValue(), leftNode, this); + } else { + Node rightNode = new RedNode<>(parent.right().getKey(), parent.right().getValue(), parent.right().left(), parent.right().right()); + return new BlackNode<>(parent.getKey(), parent.getValue(), this, rightNode); + } + } + + protected Node rebuildfive(Node parent, Rotate side) { //case5 + if (side == Rotate.R) { // rotate Left + Node leftChild = new RedNode<>(parent.left().getKey(), parent.left().getValue(), parent.left().left(), parent.left().right().left()); + Node rightChild = parent.left().right().right(); + Node leftSubTreeRoot = new BlackNode<>(parent.left().right().getKey(), parent.left().right().getValue(), leftChild, rightChild); + Node newParent = parent.createNode(parent.getKey(), parent.getValue(), leftSubTreeRoot, this); + return this.rebuildsix(newParent, Rotate.R); + } else { // rotate Right 修正済み + Node leftChild = parent.right().left().left(); + Node rightChild = new RedNode<>(parent.right().getKey(), parent.right().getValue(), parent.right().left().right(), parent.right().right()); + Node rightSubTreeRoot = new BlackNode<>(parent.right().left().getKey(), parent.right().left().getValue(), leftChild, rightChild); + Node newParent = parent.createNode(parent.getKey(), parent.getValue(), this, rightSubTreeRoot); + return this.rebuildsix(newParent, Rotate.L); + } + } + + protected Node rebuildsix(Node parent, Rotate side) { //case6 + if (side == Rotate.L) { // rotate Left + Node leftChild = parent.right().createNode(parent.getKey(), parent.getValue(), this, parent.right().left()); //check + Node rightChild = new BlackNode<>(parent.right().right().getKey(), parent.right().right().getValue(), parent.right().right().left(), parent.right().right().right()); + return parent.createNode(parent.right().getKey(), parent.right().getValue(), leftChild, rightChild); + } else { // rotate Right + Node leftChild = new BlackNode<>(parent.left().left().getKey(), parent.left().left().getValue(), parent.left().left().left(), parent.left().left().right()); + Node rightChild = parent.left().createNode(parent.getKey(), parent.getValue(), parent.left().right(), this); + return parent.createNode(parent.left().getKey(), parent.left().getValue(), leftChild, rightChild); + } + } + + + protected abstract boolean isNotEmpty(); + + public abstract Node createNode(K key, V value, Node left, Node right); + + abstract Node insBalance(); + + abstract Rotate checkRotate(Rotate side); + + abstract boolean isRed(); + + public abstract rebuildNode replaceNode(Node parent, Comparator ctr); + + protected abstract rebuildNode deleteNode(); + + @Test + // test method + protected abstract int checkDepth(int count, int minCount); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/RedNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/RedNode.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,112 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.treemap; + +import org.junit.Test; + +import java.util.Comparator; + + +public class RedNode extends Node { + + + public RedNode(K key, V value, Node left, Node right) { + super(key, value, left, right); + } + + + @Override + protected boolean isNotEmpty() { + return true; + } + + @Override + public Node createNode(K key, V value, Node left, Node right) { + return new RedNode<>(key, value, left, right); + } + + @Override + protected Node insBalance() { + return this; + } + + @Override + protected rebuildNode deleteNode() { + Node emptyNode = new EmptyNode<>(this.getKey()); + return new rebuildNode(false, emptyNode); + } + + @Override + Rotate checkRotate(Rotate side) { + if (side == Rotate.L) { + if (left.isRed()) + return Rotate.R; + else if (right.isRed()) + return Rotate.LR; + return Rotate.N; + } else { + if (left.isRed()) + return Rotate.RL; + else if (right.isRed()) + return Rotate.L; + return Rotate.N; + } + } + + @Override + boolean isRed() { + return true; + } + + @SuppressWarnings("unchecked") + @Override + public rebuildNode replaceNode(Node parent, Comparator ctr) { + Node newNode; + if (!this.left().isNotEmpty() && !this.right().isNotEmpty()) { //自身を削除する + return deleteNode(); + } else if (this.left().isNotEmpty() && !this.right().isNotEmpty()) { //左の部分木を昇格させる + newNode = left().createNode(left().getKey(), left().getValue(), left().left(), left().right()); + return new rebuildNode(false, newNode); + } else if (!this.left().isNotEmpty() && this.right().isNotEmpty()) { //右の部分木を昇格させる + newNode = right().createNode(right().getKey(), right().getValue(), right().left(), right().right()); + return new rebuildNode(false, newNode); + } else {//子ノードが左右にある場合 + //左の部分木の最大の値を持つNodeと自身を置き換える + Node cur = this.left(); + + while (cur.right().isNotEmpty()) { + cur = cur.right(); + } + if (this.left().right().isNotEmpty()) { + rebuildNode leftSubTreeNodeRebuildNode = this.left().deleteSubTreeMaxNode(null, ctr, Rotate.L); + if (leftSubTreeNodeRebuildNode.rebuild()) { + Node node = leftSubTreeNodeRebuildNode.getNode(); + Node newParent = createNode(cur.getKey(), cur.getValue(), node, this.right()); + return node.deleteBalance(newParent, ctr); + } + Node leftSubTreeNode = leftSubTreeNodeRebuildNode.getNode(); + newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.right()); + return new rebuildNode<>(false, newNode); + } else { + rebuildNode leftSubTreeNodeRebuildNode = this.left().replaceNode(this, ctr); + if (leftSubTreeNodeRebuildNode.rebuild()) { + Node node = leftSubTreeNodeRebuildNode.getNode(); + Node newParent = createNode(this.left().getKey(), this.left().getValue(), node, this.right()); + return node.deleteBalance(newParent, ctr); + } + Node leftSubTreeNode = leftSubTreeNodeRebuildNode.getNode(); + newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.right()); + return new rebuildNode<>(false, newNode); + } + + } + } + + + @Override + @Test + protected int checkDepth(int count, int minCount) { // test method + count++; + minCount = left().checkDepth(count, minCount); + minCount = right().checkDepth(count, minCount); + return minCount; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/Rotate.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/Rotate.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,5 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.treemap; + +public enum Rotate { + R, L, RL, LR, N +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/RotateParent.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/RotateParent.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,16 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.treemap; + +/** + * Generic Exception not support + **/ +public class RotateParent extends Exception { + + Node parent; + public RotateParent(Node node) { + this.parent = node; + } + + public Node getParent() { + return parent; + } +} \ No newline at end of file diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/TreeMap.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/TreeMap.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,110 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.treemap; + + +import org.junit.Test; + +import java.util.Comparator; +import java.util.Iterator; +import java.util.Optional; +import java.util.Stack; + + +public class TreeMap { + final Node root; + final Comparator comparator; + + public TreeMap() { + this.root = new EmptyNode<>(); + this.comparator = new DefaultComparator(); + } + + public TreeMap(Comparator comparator) { + this.root = new EmptyNode<>(); + this.comparator = comparator; + } + + public TreeMap(Node root, Comparator comparator) { + this.root = root; + this.comparator = comparator; + } + + public Node getRoot() { + return root; + } + + public Optional get(final K key) { + return root.get(key, this.comparator); + } + + public TreeMap put(K key, V value) { + if (isEmpty()) { + Node newRoot = new BlackNode<>(key, value, new EmptyNode<>(), new EmptyNode<>()); + return new TreeMap<>(newRoot, this.comparator); + } + Node newEntry = root.put(key, value, this.comparator); + Node newRoot = new BlackNode<>(newEntry.getKey(), newEntry.getValue(), newEntry.left(), newEntry.right()); + return new TreeMap<>(newRoot, this.comparator); + } + + + public boolean isEmpty() { + return !root.isNotEmpty(); + } + + + public TreeMap delete(K key) { + if (key == null) + return this; + rebuildNode rootRebuildNode = root.delete(key, null, comparator, Rotate.N); + if (!rootRebuildNode.notEmpty()) + return this; // not key + Node root = rootRebuildNode.getNode(); + if (!root.isNotEmpty()) + return new TreeMap<>(new EmptyNode<>(), this.comparator); + Node newRoot = new BlackNode<>(root.getKey(), root.getValue(), root.left(), root.right()); + return new TreeMap<>(newRoot, this.comparator); + } + + public Iterator keys() { + return new Iterator() { + Stack> nodeStack = new Stack<>(); + Node currentNode = root; + + @Override + public boolean hasNext() { + return currentNode != null; + } + + @Override + public K next() { + K key = currentNode.getKey(); + + if (currentNode.left().isNotEmpty()) { + nodeStack.push(currentNode); + currentNode = currentNode.left(); + return key; + } else if (currentNode.right().isNotEmpty()) { + currentNode = currentNode.right(); + return key; + } else if (nodeStack.isEmpty()) { + currentNode = null; + return key; + } + + do { + currentNode = nodeStack.pop().right(); + if (currentNode.isNotEmpty()) + return key; + + } while (!nodeStack.isEmpty()); + return key; + } + }; + } + + @Test + public void checkDepth() { + root.checkDepth(0, 0); + System.out.println("-----------------------------------"); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/rebuildNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/data/treemap/rebuildNode.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,24 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.data.treemap; + + +public class rebuildNode { + private final Boolean rebuild; + private final Node node; + + public rebuildNode(Boolean l, Node node){ + this.rebuild = l; + this.node = node; + } + + public boolean rebuild(){ + return rebuild; + } + + public Node getNode(){ + return node; + } + + public Boolean notEmpty(){ + return node != null; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/error/BasicErrors.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/error/BasicErrors.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,10 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.error; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultError; + +public class BasicErrors +{ + public static final jp.ac.u_ryukyu.ie.cr.jungle.util.Error NULL_VALUE_NOT_ALLOWED = new DefaultError(); + public static final Error INDEX_OUT_OF_BOUNDS = new DefaultError(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeList.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeList.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,11 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.TreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; + +public interface ChangeList extends Iterable +{ + public String uuid(); + public String getTreeName(); + public TreeOperationLog getLog(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeListReader.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeListReader.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,8 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +public interface ChangeListReader extends Iterable +{ + public ChangeListReader newReader(); + public ChangeList read(); + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeListWriter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/ChangeListWriter.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,6 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +public interface ChangeListWriter +{ + public Result write(ChangeList operations); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultChangeListReader.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultChangeListReader.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,46 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; + +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.util.Iterator; +import java.util.LinkedList; + +// not thread safe +public class DefaultChangeListReader implements ChangeListReader { + private long pos; + private ByteBuffer buf; + private FileChannel ch; + + DefaultChangeListReader(FileChannel ch, ByteBuffer buf, long pos) { + this.pos = pos; + this.buf = buf; + this.ch = ch; + } + + @Override + public ChangeListReader newReader() { + ByteBuffer readByteBuffer = buf.asReadOnlyBuffer(); + return new DefaultChangeListReader(ch, readByteBuffer, pos); + } + + @Override + public ChangeList read() { + LinkedList list = new LinkedList(); + + int size = buf.getInt(); + if (size == 0) { + + } + + return null; + } + + @Override + public Iterator iterator() { + return null; + } + + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultChangeListWriter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultChangeListWriter.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,29 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +import java.nio.ByteBuffer; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; + +public class DefaultChangeListWriter implements ChangeListWriter +{ + public DefaultChangeListWriter(ByteBuffer buf) + { + + } + + @Override + public synchronized Result write(ChangeList operations) + { + for(TreeOperation op : operations){ + ByteBuffer treeOpBuf = serializeTreeOperation(op); + } + return null; + } + + private ByteBuffer serializeTreeOperation(TreeOperation op) + { + + return null; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultJournal.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultJournal.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,114 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.channels.FileChannel.MapMode; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +/* + * text based journal. + * + * non terminal symbols + * + * JOURNAL => CHANGELISTS + * CHANGE_LISTS => CHANGE_LIST | CHANGE_LISTS + * CHANGE_LISTS => *EMPTY* + * + * CHANGE_LIST => OPERATIONS + * OPERATIONS => OPERATION CR | OPERATIONS + * OPERATIONS => *EMPTY* + + * OPERATION => APPEND_CHILD | DELETE_CHILD | PUT_ATTRIBUTE | DELETE_ATTRIBUTE | COMMIT + * APPEND_CHILD => APPEND_CHILD_ID NODE_PATH INSERT_POSITION + * DELETE_CHILD => DELETE_CHILD_ID NODE_PATH DELETE_POSITION + * PUT_ATTRIBUTE => PUT_ATTRIBUTE_ID NODE_PATH KEY VALUE + * DELETE_ATTRIBUTE => DELTE_ATTRIBUTE_ID NODE_PATH KEY + * COMMIT => COMMIT_ID + * + * NODE_PATH => POSITION "." NODE_PATH | POSITION + * + * terminal symbols + * + * APPEND_CHILD_ID = "APPEND_CHILD" + * DELETE_CHILD_ID = "DELETE_CHILD" + * PUT_ATTRIBUTE_ID = "PUT_ATTRIBUTE" + * SET_ATTRIBUTE_ID = "SET_ATTRIBUTE" + * COMMIT_ID => "COMMIT" + * CR => \n + * INSERT_POSITION => INTEGER + * DELETE_POSITION => INTEGER + * KEY => "*" + * VALUE => "*" + * + */ + +public class DefaultJournal implements Journal +{ + private final ChangeListWriter writer; + + public static void main(String args[]) throws Exception + { + RandomAccessFile f = new RandomAccessFile("./miscs/1.dat","rw"); + MappedByteBuffer a = f.getChannel().map(MapMode.READ_WRITE,10,10); + MappedByteBuffer b = f.getChannel().map(MapMode.READ_WRITE,10,10); + MappedByteBuffer c = f.getChannel().map(MapMode.READ_WRITE,20,10); + + a.putInt(5); + System.out.println(b.getInt()); + c.putInt(2); + a.force(); + b.force(); + c.force(); + + System.out.println(b.capacity()); + MappedByteBuffer d = f.getChannel().map(MapMode.READ_WRITE,50,10); + d.putInt(2); + d.force(); + System.out.println(d.getInt()); + } + + public static final int READ_BUFFER_SIZE = 1000000; // 1MB + public static final int WRITE_BUFFER_SIZE = 1000000; // 1MB + + private DefaultJournal() + { + writer = null; + } + + public static Either newInstance(String fileName) + { + RandomAccessFile journal = null; + try{ + journal = new RandomAccessFile(fileName,"rw"); + FileChannel ch = journal.getChannel(); + long length = journal.length(); + ByteBuffer readBuf = ch.map(MapMode.READ_ONLY,0,READ_BUFFER_SIZE); + ByteBuffer writeBuf = ch.map(MapMode.READ_WRITE,length,WRITE_BUFFER_SIZE); + + }catch(FileNotFoundException _e){ + _e.printStackTrace(); + return null; // should return Error here. + }catch(IOException _e){ + _e.printStackTrace(); + } + return null; + } + + @Override + public ChangeListReader getReader() + { + return null; + } + + @Override + public ChangeListWriter getWriter() + { + return writer; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultJournalWriter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/DefaultJournalWriter.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,31 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + +public class DefaultJournalWriter +{ + public DefaultJournalWriter(String _fileName) + { + + } + + public static Either newInstance(String fileName) + { + RandomAccessFile journal = null; + try{ + journal = new RandomAccessFile(fileName,"rw"); + //FileChannel ch = journal.getChannel(); + long length = journal.length(); + }catch(FileNotFoundException e){ + + }catch(IOException e){ + + } + + return null; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/Journal.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/Journal.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,7 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +public interface Journal +{ + public ChangeListReader getReader(); + public ChangeListWriter getWriter(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/NullJournal.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/NullJournal.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,82 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + + +import java.util.Iterator; + + + +public class NullJournal implements Journal +{ + private static final NullChangeListWriter NULL_WRITER = new NullChangeListWriter(); + private static final NullChangeListReader NULL_READER = new NullChangeListReader(); + + @Override + public ChangeListReader getReader() + { + return NULL_READER; + } + + @Override + public ChangeListWriter getWriter() + { + return NULL_WRITER; + } + + private static class NullChangeListWriter 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 NullChangeListReader implements ChangeListReader + { + @Override + public ChangeListReader newReader() + { + return this; + } + + @Override + public ChangeList read() + { + return null; + } + + @Override + public Iterator iterator() { + return null; + } + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/Result.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/persistent/Result.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,6 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.persistent; + +public class Result +{ + public static Result SUCCESS = new Result(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/query/PathNodeIterator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/query/PathNodeIterator.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,80 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.query; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeChildren; + +import java.util.Iterator; +import java.util.Stack; + +public class PathNodeIterator implements Iterator { + + TreeNode root; + TreeNode node; + int childNumber; + private TreeNodeChildren children; + private Stack nodeStack = new Stack<>(); + private Stack searchStack = new Stack<>(); + + /* + * get queryIndexCondition from query + * if already index exists, use index + * otherwise traverse tree and create index + * + * */ + public PathNodeIterator(TreeNode root) { + this.root = root; + this.node = root; + } + + @Override + public boolean hasNext() { + return node != null; + } + + @Override + public TreeNode next() { + TreeNode now = node; + if (node.getChildren().size() > 0) { + nodeStack.push(node); + children = node.getChildren(); + node = children.at(0).b(); + childNumber = 1; + searchStack.push(childNumber); + } else if (node == root) { + node = null; // no more node + children = null; + return now; + }else if (children != null && children.size() > childNumber) { + childNumber = searchStack.pop(); + node = children.at(childNumber).b(); + searchStack.push(++childNumber); + } else { + node = nodeStack.pop(); + children = node.getChildren(); + childNumber = searchStack.pop(); + for (; children.size() == childNumber;) { + if (node == root) { + node = null; // no more node + children = null; + return now; + } + node = nodeStack.pop(); + children = node.getChildren(); + childNumber = searchStack.pop(); + } + if (node != null && childNumber < children.size()) { + nodeStack.push(node); + node = children.at(childNumber).b(); + searchStack.push(++childNumber); + } + } + return now; + } + + @Override + public void remove() { + // TODO Auto-generated method stub + + } + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/query/Query.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/query/Query.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,7 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.query; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; + +public interface Query { + boolean condition(TreeNode _node); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/Command.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/Command.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,10 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store; + +public enum Command +{ + APPEND_CHILD, + DELETE_CHILD, + PUT_ATTRIBUTE, + DELETE_ATTRIBUTE, + REPLACE_ROOT; +} \ No newline at end of file diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/Constants.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/Constants.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,7 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store; + +public class Constants +{ + public static final String DEFAULT_OWNER = "default"; + public static final long DEFAULT_REVISION_START_NUMBER = 0; +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/NodePath.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/NodePath.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,12 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Pair; + +public interface NodePath extends Iterable +{ + public NodePath add(int pos); + public Pair pop(); + public NodePath tail(); + public int size(); + public Pair last(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/NulIterator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/NulIterator.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,19 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store; + +import java.util.Iterator; + +public class NulIterator implements Iterator { + + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return false; + } + + @Override + public T next() { + // TODO Auto-generated method stub + return null; + } + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/Transaction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/Transaction.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,9 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public interface Transaction +{ + public Either success(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeContext.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeContext.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,32 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store; + + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeList; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.store.index.ParentIndex; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +public interface TreeContext { + public TreeNode getRoot(); + + public TreeContext prev(); + + public ChangeList getChangeList(); + + public String uuid(); + + public String getTreeName(); + + public long revision(); + + public TreeMap>> getIndex(); + + public Iterable getOperations(); + + public ParentIndex getParentIndex(); + + public InterfaceTraverser getTraverser(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeEditor.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,12 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public interface TreeEditor +{ + public Either edit(TreeNode root,NodePath path,NodeEditor transformer); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeEditorError.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/TreeEditorError.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,9 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultError; + +public class TreeEditorError +{ + public static final Error NODEPATH_NOTFOUND = new DefaultError(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/DefaultNodePath.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/DefaultNodePath.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,81 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Pair; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; + +import java.util.Iterator; + +public class DefaultNodePath implements NodePath { + private final List path; + + public static void main(String args[]) { + DefaultNodePath p = new DefaultNodePath(); + p = p.add(1).add(2).add(3).add(4); + System.out.println(p.toString()); + } + + public DefaultNodePath() { + path = new List().addLast(-1); + } + + private DefaultNodePath(List path) { + this.path = path; + } + + @Override + public Iterator iterator() { + return path.iterator(); + } + + @Override + public DefaultNodePath add(int pos) { + List newPath = path.addLast(pos); + return new DefaultNodePath(newPath); + } + + @Override + public Pair pop() { + Integer head = path.head(); + List tail = path.deleteHead(); + return new Pair<>(head, new DefaultNodePath(tail)); + } + + @Override + public Pair last() { + Integer last = path.head(); + List list = path.deleteHead(); + return new Pair<>(last, new DefaultNodePath(list)); + } + + @Override + public String toString() { + return path.toString(); + } + + @Override + public int size() { + return path.length(); + } + + + //PATHの一番後ろを取り除いたPATHを新しく作って返す +// EXAMPLE <0,0,3> → <0,0> + @Override + public NodePath tail() { + List tail = path.deleteLast(); + return new DefaultNodePath(tail); + } + + public List inits() { + List paths = new List<>(); + List coursePath = new List<>(); + for (Integer tmpPath : path) { + List tmp = coursePath.addLast(tmpPath); + paths = paths.addLast(new DefaultNodePath(tmp)); + coursePath = tmp; + } + return paths; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/DefaultTreeEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/DefaultTreeEditor.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,80 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultEvaluator; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Direction; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traversal; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + +public class DefaultTreeEditor implements TreeEditor +{ + private final Traverser traverser; + public DefaultTreeEditor(Traverser traverser) + { + this.traverser = traverser; + } + + @Override + public Either edit(TreeNode root,NodePath path,NodeEditor editor) + { + DefaultEvaluator e = new DefaultEvaluator(path); + Either either = traverser.traverse(root,e); + + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + Traversal t = either.b(); + return clone(t,editor); + } + + private Either clone(Traversal t,NodeEditor editor) + { + // copying nodes from bottom to root + + List> path = new List<>(); + for(Direction direction : t){ + path = path.addLast(direction); + } + + // target + Direction targetDirection = path.head(); + TreeNode target = targetDirection.getTarget(); + Either either = editor.edit(target); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + LoggingNode newWrap = either.b(); + + // top + int pos = targetDirection.getPosition(); + TreeNode child = newWrap.getWrap(); + + + for(Direction parentDirection : path.deleteHead()){ + + TreeNodeChildren chs = parentDirection.getTarget().getChildren(); + + Either ret = chs.replaceNode(pos,child); + if(ret.isA()){ + return DefaultEither.newA(ret.a()); + } + + child = ret.b(); + pos = parentDirection.getPosition(); + } + + TreeNode newRoot = child; + LoggingNode logNode = editor.wrap(newRoot,newWrap.getOperationLog()); + return DefaultEither.newB(logNode); + } + +} \ No newline at end of file diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/IndexTreeEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/IndexTreeEditor.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,89 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultEvaluator; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Direction; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traversal; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + +public class IndexTreeEditor { + + private final Traverser traverser; + + + public IndexTreeEditor(Traverser traverser) + { + this.traverser = traverser; + } + + + public Either edit(TreeNode root,NodePath path,NodeEditor editor) + { + DefaultEvaluator e = new DefaultEvaluator(path); + Either either = traverser.traverse(root,e); + + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + Traversal t = either.b(); + Either ret = clone(t,editor); + + return ret; + } + + private Either clone(Traversal t,NodeEditor editor) + { + // copying nodes from bottom to root + List> path = new List(); + for (Direction direction : t) { + path = path.addLast(direction); + } + + // target + Direction targetDirection = path.head(); + TreeNode target = targetDirection.getTarget(); + + Either either = editor.edit(target); + if (either.isA()) { + return DefaultEither.newA(either.a()); + } + + LoggingNode newWrap = either.b(); + + // top + int pos = targetDirection.getPosition(); + TreeNode child = newWrap.getWrap(); + + for (Direction parentDirection : path.deleteLast()) { + TreeNode updateTargetNode = parentDirection.getTarget(); + TreeNodeChildren chs = updateTargetNode.getChildren(); + + + + Either ret = chs.replaceNode(pos, child); + if (ret.isA()) { + return DefaultEither.newA(ret.a()); + } + + TreeNode newParent = ret.b(); + + child = newParent; + pos = parentDirection.getPosition(); + } + + TreeNode newRoot = child; + LoggingNode logNode = editor.wrap(newRoot, newWrap.getOperationLog()); + + + return DefaultEither.newB(logNode); + } + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNode.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,15 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + + +public interface TreeNode extends Comparable { + public TreeNodeChildren getChildren(); + + public TreeNodeAttributes getAttributes(); + + public TreeNode createNewNode(); + + public Either appendRootNode(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNodeAttributes.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNodeAttributes.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,17 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl; + +import jp.ac.u_ryukyu.ie.cr.jungle.core.Attributes; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.nio.ByteBuffer; +import java.util.Iterator; + +public interface TreeNodeAttributes extends Attributes +{ + public Either delete(String key); + public Either put(String key,ByteBuffer value); + public TreeMap getAttributesAsRawMap(); + public Iterator getKeys(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNodeChildren.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/TreeNodeChildren.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,15 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl; + +import jp.ac.u_ryukyu.ie.cr.jungle.core.Children; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + +public interface TreeNodeChildren extends Children +{ + public Either addNewChildAt(int pos); + public Either deleteChildAt(int pos); + public Either addNewChildAt(int pos,TreeNode newChild); + public Either replaceNode(int pos,TreeNode replacement); + public List getChildrenAsRawList(); +} \ No newline at end of file diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/DefaultOperationLog.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/DefaultOperationLog.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,43 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; + +import java.util.Iterator; + +public class DefaultOperationLog implements OperationLog +{ + private final List log; + + private static final List EMPTY =new List<>(); + + public DefaultOperationLog() + { + this(EMPTY); + } + + private DefaultOperationLog(List _log) + { + log = _log; + } + + @Override + public Iterator iterator() + { + return log.iterator(); + } + + + @Override + public DefaultOperationLog add(NodeOperation _op) + { + return new DefaultOperationLog(log.addLast(_op)); + } + + @Override + public int length() + { + return log.length(); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/DefaultTreeOperationLog.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/DefaultTreeOperationLog.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,60 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger; + +import com.google.common.collect.Iterables; +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.DefaultTreeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; + +import java.util.Iterator; + +public class DefaultTreeOperationLog implements TreeOperationLog +{ + private final Iterable list; + private final int size; + + public DefaultTreeOperationLog() + { + list = new List<>(); + size = 0; + } + + public DefaultTreeOperationLog(Iterable _list,int _size) + { + list = _list; + size = _size; + } + + @Override + public Iterator iterator() + { + return list.iterator(); + } + + @Override + public TreeOperationLog add(NodePath _p, NodeOperation _op) + { + TreeOperation op = new DefaultTreeOperation(_p,_op); + List newList = new List<>(op); + Iterable concat = Iterables.concat(list,newList); + + return new DefaultTreeOperationLog(concat,size + 1); + } + + @Override + public TreeOperationLog append(TreeOperationLog _log) + { + int argumentLogSize = _log.length(); + Iterable concat = Iterables.concat(list,_log); + + return new DefaultTreeOperationLog(concat,argumentLogSize + size); + } + + @Override + public int length() + { + return size; + } + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingAttributes.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingAttributes.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,57 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeAttributes; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.DeleteAttributeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.PutAttributeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +import java.nio.ByteBuffer; + +public class LoggingAttributes //implements EditableAttributes +{ + private final TreeNode wrap; + private final OperationLog log; + + public LoggingAttributes(TreeNode _wrap,OperationLog _log) + { + wrap = _wrap; + log = _log; + } + + public ByteBuffer get(String _key) + { + TreeNodeAttributes attributes = wrap.getAttributes(); + return attributes.get(_key); + } + + private Either edit(NodeOperation _op) + { + Either either = _op.invoke(wrap); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + TreeNode newNode = either.b(); + OperationLog newLog = log.add(_op); + LoggingNode newLogNode = new LoggingNode(newNode,newLog); + + return DefaultEither.newB(newLogNode); + } + + public Either delete(final String _key) + { + + DeleteAttributeOperation deleteAttribute = new DeleteAttributeOperation(_key); + return edit(deleteAttribute); + } + + public Either put(final String _key,final ByteBuffer _value) + { + PutAttributeOperation putAttribute = new PutAttributeOperation(_key,_value); + return edit(putAttribute); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingChildren.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingChildren.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,67 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger; + + +import jp.ac.u_ryukyu.ie.cr.jungle.core.Children; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.AppendChildAtOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.DeleteChildAtOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + +public class LoggingChildren +{ + private final TreeNode wrap; + private final OperationLog log; + + public LoggingChildren(TreeNode _wrap,OperationLog _log) + { + wrap = _wrap; + log = _log; + } + + public int size() + { + Children children = wrap.getChildren(); + return children.size(); + } + + public Either edit(NodeOperation _op) + { + Either either = _op.invoke(wrap); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + TreeNode newWrap = either.b(); + OperationLog newLog = log.add(_op); + LoggingNode newLoggingNode = new LoggingNode(newWrap,newLog); + return DefaultEither.newB(newLoggingNode); + } + + public Either addNewChildAt(final int _pos) + { + NodeOperation addNewChildAt = new AppendChildAtOperation(_pos); + return edit(addNewChildAt); + } + + public Either deleteChildAt(final int _pos) + { + NodeOperation deleteChildAt = new DeleteChildAtOperation(_pos); + return edit(deleteChildAt); + } + + public Either at(int _pos) + { + Children children = wrap.getChildren(); + Either either = children.at(_pos); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + TreeNode node = either.b(); + LoggingNode logNode = new LoggingNode(node); + return DefaultEither.newB(logNode); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/LoggingNode.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,66 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.ReplaceRootNodeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + + +public class LoggingNode +{ + + private final TreeNode wrap; + private final OperationLog log; + + public LoggingNode(TreeNode _wrap) + { + this(_wrap,new DefaultOperationLog()); + } + + public LoggingNode(TreeNode _wrap,OperationLog _log) + { + wrap = _wrap; + log = _log; + } + + public LoggingAttributes getAttributes() + { + return new LoggingAttributes(wrap,log); + } + + public LoggingChildren getChildren() + { + return new LoggingChildren(wrap,log); + } + + + public OperationLog getOperationLog() + { + return log; + } + + + public Either replaceNewRootNode() { + NodeOperation replaceRootNode = new ReplaceRootNodeOperation(); + return edit(replaceRootNode); + } + + public Either edit(NodeOperation op){ + Either either = op.invoke(wrap); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + TreeNode newWrap = either.b(); + OperationLog newLog = log.add(op); + LoggingNode newLoggingNode = new LoggingNode(newWrap,newLog); + return DefaultEither.newB(newLoggingNode); + } + + public TreeNode getWrap() + { + return wrap; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/OperationLog.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/OperationLog.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,10 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.NodeOperation; + + +public interface OperationLog extends Iterable +{ + public OperationLog add(NodeOperation _op); + public int length(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/TreeOperationLog.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/impl/logger/TreeOperationLog.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,12 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; + +public interface TreeOperationLog extends Iterable +{ + public TreeOperationLog add(NodePath _p,NodeOperation _op); + public TreeOperationLog append(TreeOperationLog _log); + public int length(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/index/IndexCreater.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/index/IndexCreater.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,117 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.index; + + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeChildren; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.util.Iterator; +import java.util.Optional; +import java.util.Stack; + +public class IndexCreater { + + TreeNode node; + int childNumber; + private TreeNodeChildren children; + ParentIndex parentIndex = new ParentIndex(); + TreeMap>> indexList = new TreeMap<>(); + + public IndexCreater(TreeNode rootNode) { + Stack nodeStack = new Stack<>(); + Stack searchStack = new Stack<>(); + this.node = rootNode; + while (node != null) { + TreeNode targetNode = node; + Iterator keys = targetNode.getAttributes().getKeys(); + for (; keys.hasNext(); ) { + String key = keys.next(); + String value = targetNode.getAttributes().getString(key); + if (value != null) + indexList = set(key, value, targetNode); + } + if (node.getChildren().size() > 0) { + nodeStack.push(node); + TreeNode parent = node; + children = node.getChildren(); + node = children.at(0).b(); + parentIndex.set(parent, node); + childNumber = 1; + searchStack.push(childNumber); + } else if (node == rootNode) { + node = null; // no more node + children = null; + return; + } else if (children != null && children.size() > childNumber) { + childNumber = searchStack.pop(); + TreeNode parent = nodeStack.pop(); + nodeStack.push(parent); + node = children.at(childNumber).b(); + parentIndex.set(parent, node); + searchStack.push(++childNumber); + } else { + node = nodeStack.pop(); + children = node.getChildren(); + childNumber = searchStack.pop(); + for (; children.size() == childNumber; ) { + if (node == rootNode) { + node = null; // no more node + children = null; + return; + } + node = nodeStack.pop(); + children = node.getChildren(); + childNumber = searchStack.pop(); + } + if (node != null && childNumber < children.size()) { + nodeStack.push(node); + TreeNode parent = node; + node = children.at(childNumber).b(); + parentIndex.set(parent, node); + searchStack.push(++childNumber); + } + } + } + } + + public TreeMap>> set(String key, String value, TreeNode node) { + if (key == null) + System.out.println(""); + Optional>> indexOp = indexList.get(key); + if (!indexOp.isPresent()) { + TreeMap> index = new TreeMap<>(); + List nodeList = new List<>(); + nodeList = nodeList.addLast(node); + TreeMap newIndex = index.put(value, nodeList); + indexList = indexList.put(key, newIndex); + return indexList; + } + + TreeMap> index = indexOp.get(); + Optional> nodeListOp = index.get(value); + + List newNodeList; + + if (nodeListOp.isPresent()) { + newNodeList = nodeListOp.get().addLast(node); + + } else { + List nodeList = new List<>(); + newNodeList = nodeList.addLast(node); + + } + TreeMap newIndex = index.put(value, newNodeList); + indexList = indexList.put(key, newIndex); + + return indexList; + } + + public TreeMap>> getIndex() { + return indexList; + } + + public ParentIndex getParentIndex() { + return parentIndex; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/index/ParentIndex.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/index/ParentIndex.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,55 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.index; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeChildren; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.util.Iterator; + +public class ParentIndex { + + private TreeMap parentIndex; + + public ParentIndex() { + parentIndex = new TreeMap<>(); + } + + public boolean isEmpty(){ + return parentIndex.isEmpty(); + } + + public TreeNode get(TreeNode child) { + return parentIndex.get(child).get(); + } + + public ParentIndex set(TreeNode parent ,TreeNode child) { + parentIndex = parentIndex.put(child, parent); + return this; + } + + public ParentIndex delete(TreeNode child) { + parentIndex = parentIndex.delete(child); + return this; + } + + public ParentIndex deleteAllChildren(TreeNode parentNode) { + TreeNodeChildren children = parentNode.getChildren(); + Iterator childrenIterator = children.iterator(); + for (; childrenIterator.hasNext();) { + TreeNode child = childrenIterator.next(); + parentIndex = parentIndex.delete(child); + } + return this; + } + + public ParentIndex addAllChildren(TreeNode parentNode) { + TreeNodeChildren children = parentNode.getChildren(); + Iterator childrenIterator = children.iterator(); + for (; childrenIterator.hasNext();) { + TreeNode child = childrenIterator.next(); + parentIndex = parentIndex.put(child, parentNode); + } + return this; + } + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/AppendChildAtOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/AppendChildAtOperation.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,48 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.operations; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + + +public final class AppendChildAtOperation implements NodeOperation +{ + private final int pos; + + public AppendChildAtOperation(int _pos) + { + pos = _pos; + } + + public Command getCommand() + { + return Command.APPEND_CHILD; + } + + @Override + public Either invoke(TreeNode _target) + { + return _target.getChildren().addNewChildAt(pos); + } + + @Override + public int getPosition() + { + return pos; + } + + @Override + public String getKey() + { + return null; + } + + @Override + public ByteBuffer getValue() + { + return null; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DefaultTreeOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DefaultTreeOperation.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,27 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.operations; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; + +public class DefaultTreeOperation implements TreeOperation +{ + private final NodePath path; + private final NodeOperation operation; + + public DefaultTreeOperation(NodePath _path,NodeOperation _operation) + { + path = _path; + operation = _operation; + } + + @Override + public NodePath getNodePath() + { + return path; + } + + @Override + public NodeOperation getNodeOperation() + { + return operation; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DeleteAttributeOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DeleteAttributeOperation.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,48 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.operations; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public final class DeleteAttributeOperation implements NodeOperation +{ + private final String key; + + public DeleteAttributeOperation(String _key) + { + key = _key; + } + + @Override + public Command getCommand() + { + return Command.DELETE_ATTRIBUTE; + } + + @Override + public Either invoke(TreeNode _target) + { + return _target.getAttributes().delete(key); + } + + @Override + public int getPosition() + { + return -1; + } + + @Override + public String getKey() + { + return key; + } + + @Override + public ByteBuffer getValue() + { + return null; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DeleteChildAtOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/DeleteChildAtOperation.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,48 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.operations; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public class DeleteChildAtOperation implements NodeOperation +{ + private final int pos; + + public DeleteChildAtOperation(int _pos) + { + pos = _pos; + } + + @Override + public Command getCommand() + { + return Command.DELETE_CHILD; + } + + @Override + public Either invoke(TreeNode _target) + { + return _target.getChildren().deleteChildAt(pos); + } + + @Override + public int getPosition() + { + return pos; + } + + @Override + public String getKey() + { + return null; + } + + @Override + public ByteBuffer getValue() + { + return null; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/NodeOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/NodeOperation.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,20 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.operations; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public interface NodeOperation +{ + public Command getCommand(); + public Either invoke(TreeNode _target); + + public int getPosition(); + public String getKey(); + public ByteBuffer getValue(); +} + + diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/PutAttributeOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/PutAttributeOperation.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,50 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.operations; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + + +public class PutAttributeOperation implements NodeOperation +{ + private final String key; + private final ByteBuffer value; + + public PutAttributeOperation(String _key,ByteBuffer _value) + { + key = _key; + value = _value; + } + + @Override + public Command getCommand() + { + return Command.PUT_ATTRIBUTE; + } + + @Override + public Either invoke(TreeNode _target) + { + return _target.getAttributes().put(key,value); + } + @Override + public int getPosition() + { + return -1; + } + + @Override + public String getKey() + { + return key; + } + + @Override + public ByteBuffer getValue() + { + return value; + } +} \ No newline at end of file diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/ReplaceRootNodeOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/ReplaceRootNodeOperation.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,37 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.operations; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public class ReplaceRootNodeOperation implements NodeOperation { + + @Override + public Command getCommand() { + return Command.REPLACE_ROOT; + } + + @Override + public Either invoke(TreeNode target) { + return target.appendRootNode(); + } + + @Override + public int getPosition() { + return -1; + } + + @Override + public String getKey() { + return null; + } + + @Override + public ByteBuffer getValue() { + return null; + } + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/TreeOperation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/operations/TreeOperation.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,9 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.operations; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; + +public interface TreeOperation +{ + public NodePath getNodePath(); + public NodeOperation getNodeOperation(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/AppendChildAt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/AppendChildAt.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,44 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public class AppendChildAt implements NodeEditor +{ + private final int pos; + + public AppendChildAt(int _pos) + { + pos = _pos; + } + + public Either _edit(LoggingNode _e) + { + Either either = _e.getChildren().addNewChildAt(pos); + if(either.isA()){ + // error + return either; + } + return DefaultEither.newB(either.b()); + } + + @Override + public Either edit(TreeNode _e) { + LoggingNode logNode = wrap(_e); + return _edit(logNode); + } + + public LoggingNode wrap(TreeNode node) { + return new LoggingNode(node); + } + + @Override + public LoggingNode wrap(TreeNode node, OperationLog op) { + return new LoggingNode(node, op); + } + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/DeleteAttribute.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/DeleteAttribute.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,43 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer; + + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + +public class DeleteAttribute implements NodeEditor +{ + private final String key; + public DeleteAttribute(String _key) + { + key = _key; + } + + public Either _edit(LoggingNode logNode) + { + Either either = logNode.getAttributes().delete(key); + if(either.isA()){ + // error + return either; + } + return DefaultEither.newB(either.b()); + } + + @Override + public Either edit(TreeNode _e) { + LoggingNode logNode = wrap(_e); + return _edit(logNode); + } + + public LoggingNode wrap(TreeNode node) { + return new LoggingNode(node); + } + + @Override + public LoggingNode wrap(TreeNode node, OperationLog op) { + return new LoggingNode(node, op); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/DeleteChildAt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/DeleteChildAt.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,44 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + +public class DeleteChildAt implements NodeEditor +{ + private final int pos; + public DeleteChildAt(int _pos) + { + pos = _pos; + } + + public Either _edit(LoggingNode logNode) + { + Either either = logNode.getChildren().deleteChildAt(pos); + if(either.isA()){ + // error + return either; + } + return DefaultEither.newB(either.b()); + } + + @Override + public Either edit(TreeNode _e) { + LoggingNode logNode = wrap(_e); + return _edit(logNode); + } + + public LoggingNode wrap(TreeNode node) { + return new LoggingNode(node); + } + + @Override + public LoggingNode wrap(TreeNode node, OperationLog op) { + return new LoggingNode(node, op); + } + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/NodeEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/NodeEditor.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,14 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer; + + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public interface NodeEditor +{ + public Either edit(TreeNode _e); + public LoggingNode wrap(TreeNode node, OperationLog op); +} \ No newline at end of file diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/NodeEditorError.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/NodeEditorError.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,11 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultError; + +public class NodeEditorError +{ + public static final Error INDEX_OUT_OF_BOUNDS = new DefaultError(); + public static final Error DELETE_KEY_NOT_FOUND = new DefaultError(); + public static final Error NULL_VALUE_NOT_ALLOWED = new DefaultError(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/PutAttribute.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/PutAttribute.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,48 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public class PutAttribute implements NodeEditor +{ + private final String key; + private final ByteBuffer value; + + public PutAttribute(String _key,ByteBuffer _value) + { + key = _key; + value = _value; + } + + public Either _edit(LoggingNode _e) + { + Either either = _e.getAttributes().put(key,value); + if(either.isA()){ + // error + return either; + } + return DefaultEither.newB(either.b()); + } + + @Override + public Either edit(TreeNode _e) { + LoggingNode logNode = wrap(_e); + return _edit(logNode); + } + + public LoggingNode wrap(TreeNode node) { + return new LoggingNode(node); + } + + @Override + public LoggingNode wrap(TreeNode node, OperationLog op) { + return new LoggingNode(node, op); + } + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/replaceRootNodeAt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/trasnformer/replaceRootNodeAt.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,40 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; + +public class replaceRootNodeAt implements NodeEditor { + + + public Either _edit(LoggingNode _e) + { + Either either = _e.replaceNewRootNode(); + if(either.isA()){ + // error + return either; + } + return DefaultEither.newB(either.b()); + } + + + @Override + public Either edit(TreeNode _e) { + LoggingNode logNode = wrap(_e); + return _edit(logNode); + } + + public LoggingNode wrap(TreeNode node) { + return new LoggingNode(node); + } + + + @Override + public LoggingNode wrap(TreeNode node, OperationLog op) { + return new LoggingNode(node, op); + } + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/AbstractTreeMapThread.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/AbstractTreeMapThread.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,6 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + +public abstract class AbstractTreeMapThread extends Thread{ + public abstract void set(boolean flag); + public abstract long getFindCount(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/DataBaseBenchMark.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/DataBaseBenchMark.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,156 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + + +import com.mongodb.MongoClient; +import com.mongodb.WriteConcern; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import org.bson.Document; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import java.io.*; +import java.nio.ByteBuffer; + +public class DataBaseBenchMark { + public static void main(String[] args) throws InterruptedException, IOException, ParserConfigurationException, SAXException { + + if (args.length < 2) { + System.out.println("args[0] = jungle or mongo, args[1] = read or write" ); + System.exit(0); + } + + Runtime rt = Runtime.getRuntime(); + int cpuNum = rt.availableProcessors(); + + if (args[0].equals("jungle")) + jungleBench(args, cpuNum); + else if (args[0].equals("mongo")) + mongoBench(args, cpuNum); + } + + private static void mongoBench(String[] args, int cpuNum) throws IOException, InterruptedException { + MongoClient client = new MongoClient("localhost", 27017); + client.setWriteConcern(WriteConcern.JOURNALED); + client.dropDatabase("mydb"); + MongoDatabase database = client.getDatabase("mydb"); + MongoCollection coll = database.getCollection("mycoll"); + for (int i = 0; i < 10000; i++) { + if (i % 100 == 0) + System.out.println(i / 100); + coll.insertOne(new Document("key",String.valueOf(i))); + } + coll.createIndex(new Document("key", 1)); + for (final Document index : coll.listIndexes()) { + System.out.println(index.toJson()); + } + File file = new File("./time/" + args[0] + args[1] + "Time"); + PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); + DataBaseBenchMarkThread readThread[]; + for (int THREAD_COUNT = 1; THREAD_COUNT <= cpuNum; THREAD_COUNT++) { + readThread = new DataBaseBenchMarkThread[THREAD_COUNT]; + for (int count = 0; THREAD_COUNT > count; count++) { + readThread[count] = new findMongoAttributeThread(coll); + } + for (int count = 0; THREAD_COUNT > count; count++) { + readThread[count].start(); + } + System.out.println("StartThread"); + Thread.sleep(1000); + long readCount = 0; + for (int count = 0; THREAD_COUNT > count; count++) { + readCount = readCount + readThread[count].getFindCount(); + readThread[count].set(false); + readThread[count] = null; + } + pw.println(THREAD_COUNT + " " + readCount); + System.out.println(THREAD_COUNT + "readCount = " + readCount); + System.gc(); + System.out.println("-------------GC--------------"); + Thread.sleep(1000); + } + client.close(); + pw.close(); + } + + private static void jungleBench(String[] args, int cpuNum) throws IOException, InterruptedException { + JungleTree tree = createJungleTree(); + File file = new File("./time/" + args[0] + args[0] + "Time"); + PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); + DataBaseBenchMarkThread readThread[]; + + for (int THREAD_COUNT = 1; THREAD_COUNT <= cpuNum; THREAD_COUNT++) { + readThread = new DataBaseBenchMarkThread[THREAD_COUNT]; + for (int count = 0; THREAD_COUNT > count; count++) { + readThread[count] = new findTreeAttributeThread(tree); + } + JungleWriteThread writeThread = null; + if (args[1].equals("write")) { + writeThread = new JungleWriteThread(tree); + writeThread.start(); + } + for (int count = 0; THREAD_COUNT > count; count++) { + readThread[count].start(); + } + System.out.println("StartThread"); + Thread.sleep(1000); + if (writeThread != null) { + writeThread.set(false); + writeThread.get(); + } + long readCount = 0; + for (int count = 0; THREAD_COUNT > count; count++) { + readCount = readCount + readThread[count].getFindCount(); + readThread[count].set(false); + readThread[count] = null; + } + pw.println(THREAD_COUNT + " " + readCount); + System.out.println(THREAD_COUNT + "readCount = " + readCount); + System.gc(); + System.out.println("-------------GC--------------"); + Thread.sleep(1000); + } + pw.close(); + } + + private static JungleTree createJungleTree() { + Jungle jungle = new DefaultJungle(null, "hoge", new DefaultTreeEditor(new DefaultTraverser())); + JungleTree tree = jungle.createNewTree("tree"); + JungleTreeEditor editor = tree.getTreeEditor(); + editor = editor.putAttribute(new DefaultNodePath(), "key", ByteBuffer.wrap(String.valueOf(0).getBytes())).b(); + JungleTreeEditor newEditor = createTree(0, new DefaultNodePath(), editor); + if (newEditor.success().isA()) { + System.out.println("success faild"); + System.exit(1); + } + return tree; + } + + static Integer nodeNum = 1; + + public static JungleTreeEditor createTree(int deep, NodePath path, JungleTreeEditor editor) { + + String value1 = String.valueOf(nodeNum); + nodeNum++; + String value2 = String.valueOf(nodeNum); + nodeNum++; + editor = editor.addNewChildAt(path, 0).b(); + editor = editor.putAttribute(path.add(0), "key", ByteBuffer.wrap(value1.getBytes())).b(); + editor = editor.addNewChildAt(path, 1).b(); + editor = editor.putAttribute(path.add(1), "key", ByteBuffer.wrap(value2.getBytes())).b(); + deep++; + if (deep < 10) { + editor = createTree(deep, path.add(0), editor); + editor = createTree(deep, path.add(1), editor); + } + return editor; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/DataBaseBenchMarkThread.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/DataBaseBenchMarkThread.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,7 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + + +public abstract class DataBaseBenchMarkThread extends Thread{ + public abstract long getFindCount(); + public abstract void set(boolean flag); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/JungleWriteThread.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/JungleWriteThread.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,44 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; + +import java.nio.ByteBuffer; + + +public class JungleWriteThread extends Thread { + + JungleTree tree; + boolean loop = true; + private int writeCount; + + public JungleWriteThread(JungleTree tree) { + this.tree = tree; + } + + public void set(boolean flag) { + loop = flag; + } + + public void get() { + System.out.println("writeCount = " + writeCount); + } + + @Override + public void run() { + while (loop) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + JungleTreeEditor editor = tree.getTreeEditor(); + editor = editor.putAttribute(new DefaultNodePath(), "key", ByteBuffer.wrap(String.valueOf(0).getBytes())).b(); + if (editor.success().isA()) + System.out.println("faild"); + else + writeCount++; + } + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/TatsukiTreeMapGetThread.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/TatsukiTreeMapGetThread.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,39 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.util.Optional; + + +public class TatsukiTreeMapGetThread extends AbstractTreeMapThread { + TreeMap map; + private long findCount; + boolean loop = true; + + public TatsukiTreeMapGetThread(TreeMap map) { + this.map = map; + } + + @Override + public long getFindCount() { + System.out.println("thread count = " + findCount); + return findCount; + } + + @Override + public void set(boolean loop) { + this.loop = loop; + } + + @Override + public void run() { + while (loop) { + for (long count = 0 ; count < 1000; count++) { + Optional value = map.get(count); + if (!value.isPresent()) + System.out.println("error"); + } + findCount++; + } + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/TreeMapBenchMark.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/TreeMapBenchMark.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,82 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.io.*; + +/** + * Created by e115731 on 15/03/17. + */ +public class TreeMapBenchMark { + public static void main(String[] args) throws InterruptedException, IOException { + + if (args.length == 0) { + System.out.println("args get or getLoop or list"); + System.exit(0); + } + + Runtime rt = Runtime.getRuntime(); + int cpuNum = rt.availableProcessors(); + + File file = new File("./time/" + args[0] + "Time"); + + PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); + + AbstractTreeMapThread readThread[]; + + for (int THREAD_COUNT = 1; THREAD_COUNT <= cpuNum; THREAD_COUNT++) { + + readThread = new AbstractTreeMapThread[THREAD_COUNT]; + + switch (args[0]) { + case "util": { + java.util.TreeMap map = new java.util.TreeMap<>(); + for (long count = 0; count < 1000; count++) { + map.put(count, String.valueOf(count)); + } + + for (int count = 0; THREAD_COUNT > count; count++) { + readThread[count] = new UtilTreeMapGetThread(map); + } + break; + } + case "data": { + TreeMap map = new TreeMap<>(); + for (long count = 0; count < 1000; count++) { + map = map.put(count, String.valueOf(count)); + } + + for (int count = 0; THREAD_COUNT > count; count++) { + readThread[count] = new TatsukiTreeMapGetThread(map); + } + break; + } + default: + System.out.println("not allow args"); + System.exit(0); + } + + for (int count = 0; THREAD_COUNT > count; count++) { + readThread[count].start(); + } + + System.out.println("StartThread"); + + Thread.sleep(1000); + long readCount = 0; + + for (int count = 0; THREAD_COUNT > count; count++) { + readThread[count].set(false); + readCount = readCount + readThread[count].getFindCount(); + readThread[count].stop(); + } + + pw.println(THREAD_COUNT + " " + readCount); + System.out.println(THREAD_COUNT + "readCount = " + readCount); + Thread.sleep(1000); + } + + pw.close(); + } + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/UtilTreeMapGetThread.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/UtilTreeMapGetThread.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,37 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + +import java.util.TreeMap; + + +public class UtilTreeMapGetThread extends AbstractTreeMapThread { + TreeMap map; + private long findCount; + boolean loop = true; + + public UtilTreeMapGetThread(TreeMap map) { + this.map = map; + } + + @Override + public long getFindCount() { + System.out.println("thread count = " + findCount); + return findCount; + } + + @Override + public void set(boolean loop) { + this.loop = loop; + } + + @Override + public void run() { + while (loop) { + for (long count = 0; count < 1000; count++) { + String value = map.get(count); + if (value == null) + System.out.println("error"); + } + findCount++; + } + } +} \ No newline at end of file diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/findMongoAttributeThread.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/findMongoAttributeThread.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,39 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import org.bson.Document; + + +public class findMongoAttributeThread extends DataBaseBenchMarkThread { + private long findCount; + boolean loop = true; + MongoCollection coll; + + public findMongoAttributeThread( MongoCollection coll) { + this.coll = coll; + this.findCount = 0; + } + + @Override + public long getFindCount() { + System.out.println("thread count = " + findCount); + return findCount; + } + + public void set(boolean loop) { + this.loop = loop; + } + + @Override + public void run() { + while (loop) { + FindIterable searchResultList = coll.find(new Document("key","1")); + MongoCursor iterator = searchResultList.iterator(); + if (iterator.hasNext()) { + findCount++; + } + } + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/findTreeAttributeThread.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/findTreeAttributeThread.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,41 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import java.util.Iterator; + + +public class findTreeAttributeThread extends DataBaseBenchMarkThread { + + JungleTree tree; + private long findCount; + + boolean loop = true; + + public findTreeAttributeThread(JungleTree tree) { + this.tree = tree; + this.findCount = 0; + } + + @Override + public long getFindCount() { + System.out.println("thread count = " + findCount); + return findCount; + } + + public void set(boolean loop) { + this.loop = loop; + } + + @Override + public void run() { + while (loop) { + InterfaceTraverser traverser = tree.getTraverser(true); + Iterator it = traverser.find(null, "key", "0"); + if (it.hasNext()) { + findCount++; + } + } + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/readTreeAttributeThread.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/test/readTreeAttributeThread.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,44 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.test; + +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; + +/** + * Created by e115731 on 15/03/17. + */ +public class readTreeAttributeThread extends DataBaseBenchMarkThread { + + JungleTree tree; + private long findCount; + + boolean loop = true; + + public readTreeAttributeThread(JungleTree tree) { + this.tree = tree; + this.findCount = 0; + } + + @Override + public long getFindCount() { + System.out.println("thread couny = " + findCount); + return findCount; + } + + public void set(boolean loop) { + this.loop = loop; + } + + @Override + public void run() { + while (loop) { + TreeNode root = tree.getRootNode(); + if (root != null) { + String attribute = root.getAttributes().getString("key"); + if (attribute.equals("0")) + findCount++; + else + System.out.println("faild"); + } + } + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultJungleTreeEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultJungleTreeEditor.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,133 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.transaction; + +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.DefaultTreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.OperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.TreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.DefaultTreeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.*; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.util.IterableConverter; + +import java.nio.ByteBuffer; + +public class DefaultJungleTreeEditor implements JungleTreeEditor +{ + private final TransactionManager txManager; + private final TreeNode root; + private final TreeEditor editor; + private final TreeOperationLog log; + + + public DefaultJungleTreeEditor(TreeNode _root,TransactionManager _txManager,TreeEditor _editor) + { + this(_root,_txManager,_editor,new DefaultTreeOperationLog()); + } + + + + public DefaultJungleTreeEditor(TreeNode newNode,TransactionManager _txManager,TreeEditor _editor,TreeOperationLog _log) + { + this.root = newNode; + this.txManager = _txManager; + this.editor = _editor; + this.log = _log; + } + + private Either _edit(final NodePath _path,NodeEditor _e) + { + Either either = editor.edit(root,_path,_e); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + LoggingNode newLogging = either.b(); + OperationLog newLog = newLogging.getOperationLog(); + TreeNode newNode = newLogging.getWrap(); + + 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 = new DefaultJungleTreeEditor(newNode,txManager,editor,newTreeOpLog); + return DefaultEither.newB(newEditor); + } + + @Override + public Either replaceNewRootNode() + { + replaceRootNodeAt appendChildAt = new replaceRootNodeAt(); + return _edit(new DefaultNodePath(),appendChildAt); + } + + @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()); + } + + TransactionManager newTxManager = either.b(); + JungleTreeEditor newTreeEditor = new DefaultJungleTreeEditor(root,newTxManager,editor); + + return DefaultEither.newB(newTreeEditor); + } + + @Override + public Either flushSuccess() { + return success(); + } + + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTransactionManager.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTransactionManager.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,88 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.transaction; + + +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeListWriter; +import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeContext; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.TreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeList; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultError; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +import java.util.Iterator; +import java.util.concurrent.atomic.AtomicReference; + +public class DefaultTransactionManager implements TransactionManager { + private final AtomicReference repository; + private final TreeContext tip; + private final ChangeListWriter writer; + private final String uuid; + + public DefaultTransactionManager(ChangeListWriter _writer, TreeContext _tip, + AtomicReference _repository, String _uuid) { + repository = _repository; + tip = _tip; + writer = _writer; + uuid = _uuid; + } + + @Override + public Either commit(TreeNode newRoot, final TreeOperationLog _log) { + long currentRevision = tip.revision(); + long nextRevision = currentRevision + 1; + + final String _treeName = tip.getTreeName(); + ChangeList list = new ChangeList() { + @Override + public Iterator iterator() { + return _log.iterator(); + } + + @Override + public String getTreeName() { + return _treeName; + } + + @Override + public TreeOperationLog getLog() { + return _log; + } + + @Override + public String uuid() { + return uuid; + } + + }; + + InterfaceTraverser traverser = new InterfaceTraverser(newRoot, true); + traverser.createIndex(); + TreeContext newTreeContext = new DefaultTreeContext(newRoot , tip, list, uuid, _treeName, nextRevision,traverser); + + if (repository.compareAndSet(newTreeContext.prev(),newTreeContext)) { + TransactionManager txManager = new DefaultTransactionManager(writer, newTreeContext, repository, uuid); + return DefaultEither.newB(txManager); + } + + return DefaultEither.newA((jp.ac.u_ryukyu.ie.cr.jungle.util.Error) new DefaultError()); + } + + @Override + public Either flashCommit(TreeNode _newRoot, TreeOperationLog _log) { + return commit(_newRoot,_log); + } + + @Override + public String getUUID() { + return uuid; + } + + @Override + public long getRevision() { + return tip.revision(); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeContext.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeContext.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,82 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.transaction; + + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeList; +import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeContext; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.store.index.ParentIndex; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +public class DefaultTreeContext implements TreeContext { + private final TreeNode root; + private final TreeContext previous; + private final ChangeList changeList; + private final String uuid; + private final String treeName; + private final long revision; + private final InterfaceTraverser traverser; + + public DefaultTreeContext(TreeNode _node, TreeContext _prev, ChangeList _log, String _uuid, String _treeName, long _revision, InterfaceTraverser traverser) { + this.root = _node; + this.previous = _prev; + this.changeList = _log; + this.uuid = _uuid; + this.treeName = _treeName; + this.revision = _revision; + this.traverser = traverser; + } + + + @Override + public TreeNode getRoot() { + return root; + } + + @Override + public TreeContext prev() { + return previous; + } + + @Override + public ChangeList getChangeList() { + return changeList; + } + + @Override + public String uuid() { + return uuid; + } + + @Override + public String getTreeName() { + return treeName; + } + + @Override + public long revision() { + return revision; + } + + @Override + public Iterable getOperations() { + return changeList; + } + + @Override + public TreeMap>> getIndex() { + return traverser.getIndex(); + } + + @Override + public ParentIndex getParentIndex() { + return traverser.getParentIndex(); + } + + @Override + public InterfaceTraverser getTraverser() { + return traverser; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNode.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,60 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.transaction; + + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeChildren; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.nio.ByteBuffer; +import java.rmi.dgc.VMID; + +public class DefaultTreeNode implements TreeNode { + private List children; + private TreeMap attrs; + final String nodeId = new VMID().toString(); + + private static final List NIL_LIST = new List<>(); + + public DefaultTreeNode() { + this(NIL_LIST, new TreeMap<>()); + } + + public DefaultTreeNode(List _children, TreeMap _attrs) { + attrs = _attrs; + children = _children; + } + + @Override + public DefaultTreeNodeChildren getChildren() { + return new DefaultTreeNodeChildren(children, attrs); + } + + @Override + public DefaultTreeNodeAttribute getAttributes() { + return new DefaultTreeNodeAttribute(children, attrs); + } + + @Override + public DefaultTreeNode createNewNode() { + return new DefaultTreeNode(); + } + + public DefaultTreeNode clone() { + return new DefaultTreeNode(children, attrs); + } + + @Override + public Either appendRootNode() { + TreeNodeChildren newRootChildren = new DefaultTreeNodeChildren(NIL_LIST, new TreeMap<>()); + Either either = newRootChildren.addNewChildAt(0,this); + return either; + } + + @Override + public int compareTo(TreeNode o) { + return this.hashCode() - o.hashCode(); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNodeAttribute.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNodeAttribute.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,80 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.transaction; + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeAttributes; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditorError; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.nio.ByteBuffer; +import java.util.Iterator; +import java.util.Optional; + +public class DefaultTreeNodeAttribute implements TreeNodeAttributes { + public List children; + public TreeMap attrs; + + + public DefaultTreeNodeAttribute(List _children, TreeMap _attrs) { + children = _children; + attrs = _attrs; + } + + @Override + public TreeMap getAttributesAsRawMap() { + return attrs; + } + + @Override + public Either delete(String _key) { + if (_key == null) { + return DefaultEither.newA(NodeEditorError.NULL_VALUE_NOT_ALLOWED); + } + + if (null == attrs.get(_key)) { + return DefaultEither.newA(NodeEditorError.DELETE_KEY_NOT_FOUND); + } + + TreeMap newMap = attrs.delete(_key); + TreeNode newNode = new DefaultTreeNode(children, newMap); + return DefaultEither.newB(newNode); + } + + @Override + public Either put(String _key, ByteBuffer _value) { + if (_key == null || _value == null) { + return DefaultEither.newA(NodeEditorError.NULL_VALUE_NOT_ALLOWED); + } + + TreeMap newMap = attrs.put(_key, _value); + TreeNode newNode = new DefaultTreeNode(children, newMap); + return DefaultEither.newB(newNode); + } + + @Override + public ByteBuffer get(String _key) { + if (_key == null) { + return null; + } + Optional op = attrs.get(_key); + if (op.isPresent()) + return op.get(); + return null; + } + + @Override + public String getString(String key) { + ByteBuffer attribute = get(key); + if (attribute != null) + return new String(attribute.array()); + return null; + } + + @Override + public Iterator getKeys() { + return attrs.keys(); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNodeChildren.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTreeNodeChildren.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,108 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.transaction; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditorError; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeChildren; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.nio.ByteBuffer; +import java.util.Iterator; + +public class DefaultTreeNodeChildren implements TreeNodeChildren { + + public List children; + public TreeMap attrs; + + public DefaultTreeNodeChildren(List _children, TreeMap _attrs) { + children = _children; + attrs = _attrs; + } + + private boolean boundaryCheck(int _pos) { + int size = children.length(); + if (size < _pos) { + return false; + } + + return true; + } + + @Override + public List getChildrenAsRawList() { + return children; + } + + @Override + public Either addNewChildAt(int _pos) { + if (!boundaryCheck(_pos) || _pos < 0) { + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + List newChildren = children.add(_pos, new DefaultTreeNode()); + TreeNode newNode = new DefaultTreeNode(newChildren, attrs); + return DefaultEither.newB(newNode); + } + + @Override + public Either deleteChildAt(int _pos) { + if (!boundaryCheck(_pos) || _pos < 0 || size() == 0) { + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + List newChildren = children.delete(_pos); + TreeNode newNode = new DefaultTreeNode(newChildren, attrs); + + return DefaultEither.newB(newNode); + } + + @Override + public int size() { + return children.length(); + } + + @Override + public Iterator iterator() { + return children.iterator(); + } + + @Override + public Either replaceNode(int _pos, TreeNode _replacement) { + int size = children.length(); + if (!(0 <= _pos && _pos < size)) { + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + TreeNode replacement = _replacement; + + List newChildren = children.replace(_pos, replacement); + TreeNode node = new DefaultTreeNode(newChildren, attrs); + return DefaultEither.newB(node); + } + + @Override + public Either at(int _pos) { + if (children.length() < _pos + 1) { + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + TreeNode Node = children.index(_pos); + + return DefaultEither.newB(Node); + } + + @Override + public Either addNewChildAt(int _pos, TreeNode _newChild) { + if (!boundaryCheck(_pos) || _pos < 0) { + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + List newChildren = children.add(_pos, _newChild); + TreeNode newNode = new DefaultTreeNode(newChildren, attrs); + + return DefaultEither.newB(newNode); + } + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/TransactionManager.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/TransactionManager.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,15 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.transaction; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.TreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public interface TransactionManager +{ + public Either commit(TreeNode _newRoot,TreeOperationLog _log); + public Either flashCommit(TreeNode _newRoot,TreeOperationLog _log); + public String getUUID(); + public long getRevision(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultEvaluation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultEvaluation.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,25 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +public class DefaultEvaluation implements Evaluation +{ + private final Result result; + private final Evaluator evaluator; + + public DefaultEvaluation(Result _result,Evaluator _evaluator) + { + result = _result; + evaluator = _evaluator; + } + + @Override + public Result result() + { + return result; + } + + @Override + public Evaluator evaluator() + { + return evaluator; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultEvaluator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultEvaluator.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,38 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Pair; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; + +public class DefaultEvaluator implements Evaluator { + private final NodePath path; + + public DefaultEvaluator(NodePath _path) { + path = _path; + } + + @Override + public Evaluation evaluate(TreeNode _current, int _pos) { + Pair pop = path.pop(); + int head = pop.left(); + + if (path.size() == 1) { + if (head == _pos) { + return new DefaultEvaluation(Result.GOAL, null); + } + } + + DefaultEvaluator nextEvaluator; + Result result; + if (head == _pos) { + result = Result.ACCEPT; + nextEvaluator = new DefaultEvaluator(pop.right()); + } else { + result = Result.CONTINUE; + nextEvaluator = null; + } + + + return new DefaultEvaluation(result, nextEvaluator); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultTraverser.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/DefaultTraverser.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,137 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.core.Children; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.NodeEditorError; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +import java.util.Iterator; + + +public class DefaultTraverser implements Traverser { + @Override + public Either traverse(final TreeNode _root, Evaluator _evaluator) { + Children wrapper = new Children() { + @Override + public Iterator iterator() { + List list = new List(); + return list.addLast(_root).iterator(); + } + + @Override + public int size() { + return 1; + } + + @Override + public Either at(int _pos) { + if (_pos != 0) { + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + return DefaultEither.newB(_root); + } + }; + + //Children chs = _root.getChildren(); + Children chs = wrapper; + + Either>> ret = _traverse(chs, _evaluator, -1); + + if (ret.isA()) { + return DefaultEither.newA(ret.a()); + } + + List> list = ret.b(); + + final Iterable> iterable = list; + final TreeNode destination = ret.b().head().getTarget(); + + Traversal traversal = new Traversal() { + @Override + public Iterator> iterator() { + return iterable.iterator(); + } + + @Override + public TreeNode destination() { + return destination; + } + }; + + return DefaultEither.newB(traversal); + } + + private Either>> _traverse(Children _chs, Evaluator _evaluator, int _pos) { + int pos = _pos; + for (TreeNode ch : _chs) { + Evaluation e = _evaluator.evaluate(ch, pos); + Result r = e.result(); + if (r == Result.ACCEPT) { + return _accept(ch, pos, e.evaluator()); + } + + if (r == Result.GOAL) { + return DefaultEither.newB(_goal(ch, pos)); + } + + if (r == Result.BREAK) { + break; + } + + if (r == Result.CONTINUE) { + pos++; + continue; + } + + return DefaultEither.newA(TraverserError.UNDEFINED_OPERATOR); + } + + return DefaultEither.newA(TraverserError.PATH_NOT_FOUND); + } + + private List> _goal(final TreeNode _current, final int _pos) { + Direction d = new Direction() { + @Override + public int getPosition() { + return _pos; + } + + @Override + public TreeNode getTarget() { + return _current; + } + }; + + List> list = new List(); + List> newList = list.addLast(d); + + return newList; + } + + private Either>> _accept(final T _current, final int _pos, Evaluator _evaluator) { + Children chs = _current.getChildren(); + Either>> either = _traverse(chs, _evaluator, 0); + if (either.isA()) { + return either; + } + + List> list = either.b(); + Direction d = new Direction() { + @Override + public int getPosition() { + return _pos; + } + + @Override + public T getTarget() { + return _current; + } + }; + + List> newList = list.addLast(d); + return DefaultEither.newB(newList); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Direction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Direction.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,7 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +public interface Direction +{ + public int getPosition(); + public T getTarget(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Evaluation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Evaluation.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,7 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +public interface Evaluation +{ + public Result result(); + public Evaluator evaluator(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Evaluator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Evaluator.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,8 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; + +public interface Evaluator +{ + public Evaluation evaluate(TreeNode _current,int _pos); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/InterfaceTraverser.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/InterfaceTraverser.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,317 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NulIterator; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.query.PathNodeIterator; +import jp.ac.u_ryukyu.ie.cr.jungle.query.Query; +import jp.ac.u_ryukyu.ie.cr.jungle.store.index.IndexCreater; +import jp.ac.u_ryukyu.ie.cr.jungle.store.index.ParentIndex; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; + +import java.util.Iterator; +import java.util.Optional; + +public class InterfaceTraverser { + + TreeNode root; + TreeMap>> indexList; + ParentIndex parentIndex; + boolean parentUpdateFlag; + boolean useIndex; + + public InterfaceTraverser(TreeNode root, boolean indexFlag) { + this(root, new TreeMap<>(), new ParentIndex(), indexFlag); + } + + public InterfaceTraverser(TreeNode root, TreeMap>> index, + ParentIndex parentIndex, boolean useIndex) { + this.root = root; + this.indexList = index; + this.parentIndex = parentIndex; + if (parentIndex.isEmpty()) + parentUpdateFlag = true; + else + parentUpdateFlag = false; + this.useIndex = useIndex; + } + + public TreeMap>> getIndex() { + return indexList; + } + + public void commit() { + parentUpdateFlag = false; + } + + public ParentIndex getParentIndex() { + return parentIndex; + } + + public void createIndex() { + // long t1 = System.currentTimeMillis(); + IndexCreater creater = new IndexCreater(root); + // long t2 = System.currentTimeMillis(); + // System.out.println("createIndex time = " + (t2 - t1)); + indexList = creater.getIndex(); + parentIndex = creater.getParentIndex(); + } + + /** + * subTree以下のNodeに対してKey,Valueのペアでindexを使って探索を行う + * + * @param query + * @param subTree + * @param key + * @param searchValue + * @return + */ + // public Iterator findInSubTree(final Query query, TreeNode + // subTree, String key, String searchValue) { + // /* + // * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 + // * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す + // */ + // Iterator nodeIterator = index.get(key, searchValue); + // if (nodeIterator.hasNext() && useIndex) { + // + // // ここでNode以下にあるか調べる + // List filteredList = List.nil(); + // + // for (;nodeIterator.hasNext();) { + // TreeNode targetNode = nodeIterator.next(); + // TreeNode parent = targetNode; + // while (parent != null) { + // parent = parentIndex.get(parent); + // if (parent.equals(subTree)) + // filteredList = filteredList.cons(targetNode); + // } + // } + // + // return filteredList.iterator(); + // + // } else { + // final PathNodeIterator itNode = new PathNodeIterator(subTree); + // return new Iterator() { + // + // private TreeNode matchNode = nextmatch(itNode); + // + // private TreeNode nextmatch(PathNodeIterator itNode) { + // + // for (; itNode.hasNext();) { + // TreeNode targetNode = itNode.next(); + // if (query.condition(targetNode)) + // return targetNode; + // } + // return null; + // } + // + // @Override + // public boolean hasNext() { + // if (matchNode == null) { + // return false; + // } + // return true; + // } + // + // @Override + // public TreeNode next() { + // TreeNode currentNode = matchNode; + // matchNode = nextmatch(itNode); + // return currentNode; + // } + // + // @Override + // public void remove() { + // } + // + // }; + // } + // } + + /** + * subTree以下のNodeに対してKeyに対応する値をindexを使って探索する + */ + // public Iterator findInSubTreeAllValue(final Query query, TreeNode + // subTree, String key) { + // /* + // * indexからinnerIndexを取得 取得したinnerIndexが保有するKeyを取得 + // * そのKeyを保有するNodeとNodeのPathを取得する + // * indexを使って取ってきたNodeのPathと、subTreeのPathを先頭から1つずつ比較し、 + // * indexから取ってきたNodeのPathが一致した場合、そのNodeを返す + // */ + // Iterator NodeIterator = index.getAll(key); + // if (NodeIterator != null && useIndex) { + // List filteredList = List.nil(); + // for (; NodeIterator.hasNext();) { + // TreeNode targetNode = NodeIterator.next(); + // TreeNode parent = targetNode; + // while (parent != null) { + // parent = parentIndex.get(parent); + // if (parent.equals(subTree)) + // filteredList = filteredList.cons(targetNode); + // } + // } + // return filteredList.iterator(); + // + // } else { + // + // final PathNodeIterator itNode = new PathNodeIterator(subTree); + // return new Iterator() { + // + // private TreeNode matchPair = nextmatch(itNode); + // + // private TreeNode nextmatch(PathNodeIterator itNode) { + // + // for (; itNode.hasNext();) { + // TreeNode targetNode = itNode.next(); + // if (query.condition(targetNode)) + // return targetNode; + // } + // return null; + // } + // + // @Override + // public boolean hasNext() { + // if (matchPair == null) { + // return false; + // } + // return true; + // } + // + // @Override + // public TreeNode next() { + // TreeNode currentNode = matchPair; + // matchPair = nextmatch(itNode); + // return currentNode; + // } + // + // @Override + // public void remove() { + // } + // + // }; + // } + // } + private TreeNode nextmatch(TreeNode node, Query query) { + if (query.condition(node)) + return node; + return null; + } + + + public Iterator find(final Query query, final String key, String searchValue) { + + Iterator nodeIterator; + if (key != null && searchValue != null && useIndex) { + nodeIterator = get(key, searchValue); + ; + } else { + nodeIterator = new PathNodeIterator(root); + } + + TreeNode firstMatchNode = null; + for (; nodeIterator.hasNext(); ) { + firstMatchNode = nextmatch(nodeIterator.next(), query); + if (firstMatchNode != null) + break; + } + + final TreeNode finalFirstMatchNode = firstMatchNode; + + return new Iterator() { + + TreeNode matchNode = finalFirstMatchNode; + + @Override + public boolean hasNext() { + if (matchNode == null) { + return false; + } + return true; + } + + @Override + public TreeNode next() { + TreeNode currentPair = matchNode; + for (; nodeIterator.hasNext(); ) { + matchNode = nextmatch(nodeIterator.next(), query); + } + return currentPair; + } + + @Override + public void remove() { + } + + }; + } + + // public Iterator findAll(final Query query, final String key) { + // + // Iterator nodeList = index.getAll(key); + // if (nodeList != null && useIndex) { + // + // return nodeList; + // + // } else { + // + // final PathNodeIterator itNode = new PathNodeIterator(node); + // return new Iterator() { + // + // private TreeNode matchNode = nextmatch(itNode); + // + // private TreeNode nextmatch(PathNodeIterator itNode) { + // + // for (; itNode.hasNext();) { + // TreeNode targetNode = itNode.next(); + // String value = targetNode.getAttributes().getString(key); + // if (useIndex) { + // if (value != null) + // index = index.set(key, value, targetNode); + // } + // if (parentUpdateFlag); + // // parentIndex = parentIndex.set(targetNode); + // if (query.condition(targetNode)) + // return targetNode; + // } + // if (useIndex || parentUpdateFlag) + // commit(); + // return null; + // } + // + // @Override + // public boolean hasNext() { + // if (matchNode == null) { + // return false; + // } + // return true; + // } + // + // @Override + // public TreeNode next() { + // TreeNode currentPair = matchNode; + // matchNode = nextmatch(itNode); + // return currentPair; + // } + // + // @Override + // public void remove() { + // } + // + // }; + // } + // } + + public Iterator get(String key, String value) { + Optional>> indexOp = indexList.get(key); + if (!indexOp.isPresent()) + return null; + + Optional> nodeListOp = indexOp.get().get(value); + if (!nodeListOp.isPresent()) + return new NulIterator(); + + return nodeListOp.get().iterator(); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Result.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Result.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,22 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +public class Result +{ + + public static final Result ACCEPT = new Result("ACCEPT"); + public static final Result CONTINUE = new Result("CONTINUE"); + public static final Result BREAK = new Result("BREAK"); + public static final Result GOAL = new Result("GOAL"); + + private final String name; + + private Result(String _name) + { + name = _name; + } + + public String toString() + { + return name; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Traversal.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Traversal.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,8 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; + +public interface Traversal extends Iterable> +{ + public TreeNode destination(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Traverser.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/Traverser.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,12 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +public interface Traverser +{ + public Either traverse(final TreeNode _root,Evaluator _evaluator); + + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/TraverserError.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/traverser/TraverserError.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,10 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverser; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultError; + +public class TraverserError +{ + public static final jp.ac.u_ryukyu.ie.cr.jungle.util.Error UNDEFINED_OPERATOR = new DefaultError(); + public static final Error PATH_NOT_FOUND = new DefaultError(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/DefaultEither.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/DefaultEither.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,47 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.util; + +public class DefaultEither implements Either +{ + private final A theA; + private final B theB; + + private DefaultEither(A _theA,B _theB) + { + theA = _theA; + theB = _theB; + } + + public static final DefaultEither newA(A _theA) + { + return new DefaultEither(_theA,null); + } + + public static final DefaultEither newB(B _theB) + { + return new DefaultEither(null,_theB); + } + + @Override + public A a() + { + return theA; + } + + @Override + public boolean isA() + { + return theA != null; + } + + @Override + public B b() + { + return theB; + } + + @Override + public boolean isB() + { + return theB != null; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/DefaultError.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/DefaultError.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,5 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.util; + +public class DefaultError implements Error +{ +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Either.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Either.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,9 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.util; + +public interface Either +{ + public A a(); + public boolean isA(); + public B b(); + public boolean isB(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Error.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Error.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,5 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.util; + +public interface Error { + +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/GetOldTreeError.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/GetOldTreeError.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,5 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.util; + +public class GetOldTreeError implements Error { + public static final Error OLD_TREE_NOT_FOUND = new DefaultError(); +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/IterableConverter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/IterableConverter.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,56 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.util; + +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; + } + + @Override + 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; + } + + @Override + public boolean hasNext() + { + return iterator.hasNext(); + } + + @Override + public A next() + { + return converter.conv(iterator.next()); + } + + @Override + public void remove() + { + iterator.remove(); + } + } + + public static interface Converter + { + public A conv(B _b); + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Pair.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Pair.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,23 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.util; + +public class Pair +{ + private L left; + private R right; + + public Pair(L _left,R _right) + { + left = _left; + right = _right; + } + + public L left() + { + return left; + } + + public R right() + { + return right; + } +} diff -r 000000000000 -r 44465893e8b8 src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Triple.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/util/Triple.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,45 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.util; + +public class Triple +{ + private A a; + private B b; + private C c; + + public Triple(A _a,B _b,C _c) + { + a = _a; + b = _b; + c = _c; + } + + public A getA() + { + return a; + } + + public B getB() + { + return b; + } + + public C getC() + { + return c; + } + + public void setA(A _a) + { + a = _a; + } + + public void setB(B _b) + { + b = _b; + } + + public void setC(C _c) + { + c = _c; + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/DefaultJungleTreeTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/DefaultJungleTreeTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,57 @@ +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; +import junit.framework.TestCase; + +public class DefaultJungleTreeTest extends TestCase { + public Jungle instance() { + Jungle j = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); + return j; + } + + public static final String key = "KEY"; + public static final ByteBuffer value = ByteBuffer.wrap(key.getBytes()); + + public void testSampleTest() { + Jungle j = instance(); + j.createNewTree("tree"); + JungleTree tree = j.getTreeByName("tree"); + Assert.assertEquals(0, tree.revision()); + JungleTreeEditor editor1 = tree.getTreeEditor(); + JungleTreeEditor editor2 = tree.getTreeEditor(); + + DefaultNodePath root = new DefaultNodePath(); + Either either = editor1.putAttribute(root, key, value); + if (either.isA()) { + } + editor1 = either.b(); + editor1.success(); + editor1.addNewChildAt(root, 0); + // check the value ; + TreeNode node = tree.getRootNode(); + ByteBuffer v = node.getAttributes().get(key); + Assert.assertEquals(0, v.compareTo(value)); + Assert.assertEquals(1, tree.revision()); + // editor2 must fail transction + either = editor1.putAttribute(root.add(0), key, value); + if (either.isA()) { + } + editor2 = either.b(); + Either r = editor2.success(); + } + + public void testIsolation() { + + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/JDBCTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/JDBCTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,53 @@ +package jp.ac.u_ryukyu.ie.cr; +import org.junit.Test; + +import java.sql.*; + +/** + * Created by e135768K on 2016/11/29. + */ +public class JDBCTest { + @Test + public void GetTest () { + try { + Class.forName("com.mysql.jdbc.Driver"); + Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/labo", "root", "1128kazu"); + + Statement stmt = conn.createStatement(); + + // INSERT + stmt.executeUpdate("INSERT INTO type (name) VALUES ('Teacher')"); + stmt.executeUpdate("INSERT INTO type (name) VALUES ('Student')"); + + stmt.executeUpdate("INSERT INTO user (name, age) VALUES ('Kono', 30)"); + stmt.executeUpdate("INSERT INTO user (name, age) VALUES ('Takeda', 20)"); + stmt.executeUpdate("INSERT INTO user (name, age) VALUES ('Miyagi', 21)"); + stmt.executeUpdate("INSERT INTO user (name, age) VALUES ('Higashionna', 22)"); + + stmt.executeUpdate("INSERT INTO college (user_id, type_id) VALUES (1, 1)"); + stmt.executeUpdate("INSERT INTO college (user_id, type_id) VALUES (2, 2)"); + stmt.executeUpdate("INSERT INTO college (user_id, type_id) VALUES (3, 2)"); + stmt.executeUpdate("INSERT INTO college (user_id, type_id) VALUES (4, 2)"); + + + // SELECT + ResultSet set = stmt.executeQuery("SELECT * FROM type WHERE name=\"Teacher\""); + int type_id = 0; + while (set.next()){ + type_id = set.getInt(1); + } + ResultSet rset = stmt.executeQuery("SELECT name, age FROM college JOIN user on user_id=user.id where type_id=" + type_id); + + while ( rset.next() ) { + System.out.println(rset.getString(1) + "\t" + rset.getString(2)); + } + + // rset.close(); + stmt.close(); + conn.close(); + } + catch (Exception e) { + e.printStackTrace(); + } + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/JungleTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/JungleTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,117 @@ +package jp.ac.u_ryukyu.ie.cr; + +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.DefaultNode; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.Node; +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.NullJournal; +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeAttributes; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; +import org.junit.Test; + +import java.nio.ByteBuffer; +import java.security.Key; +import java.util.Iterator; + +/** + * Created by e135768K on 2016/11/29. + */ +public class JungleTest { + + public static Jungle jungle; + public static DefaultNodePath root = new DefaultNodePath(); + @Test + public void GetTest () { + jungle = new DefaultJungle(new NullJournal(), "Labo", new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("User"); + JungleTree tree = jungle.getTreeByName("User"); + // Insert + JungleTreeEditor editor = tree.getTreeEditor(); + + editor = put(editor, root, "Name", "Kono"); + editor = put(editor, root, "Age", "40"); + editor = put(editor, root, "Type", "Teacher"); + + editor = put(editor, root, 0, "Name", "Takeda"); + editor = put(editor, root, 0, "Age", "20"); + editor = put(editor, root, 0, "Type", "Student"); + + editor = put(editor, root, 1, "Name", "Miyagi"); + editor = put(editor, root, 1, "Age", "22"); + editor = put(editor, root, 1, "Type", "Student"); + + editor = put(editor, root, 2, "Name", "Higashionna"); + editor = put(editor, root, 2, "Age", "20"); + editor = put(editor, root, 2, "Type", "Student"); + + Either either = editor.success(); + if (either.isA()) + Assert.fail(); + + tree = jungle.getTreeByName("User"); + + // Find + InterfaceTraverser traverser = tree.getTraverser(false); + Iterator iterator = traverser.find((TreeNode node) -> { + String value = node.getAttributes().getString("Name"); + if (value == null) + return false; + if (value.equals("Takeda")) + return true; + return false; + }, "Type", "Student"); + + while (iterator.hasNext()){ + System.out.println(iterator.next().getAttributes().getString("Name")); + } + // Get +// ByteBuffer kono_age = get("User", root, "Shinji"); +// ByteBuffer kazuma_age = get("User", root.add(0), "Kazuma"); +// ByteBuffer mitsuki_age = get("User", root.add(1), "Mitsuki"); +// ByteBuffer takui_age = get("User", root.add(2), "Takui"); + } + + public JungleTreeEditor put(JungleTreeEditor editor, NodePath path, int n, String key, String value) { + + Either either = editor.addNewChildAt(path, n); + if (either.isA()) + Assert.fail(); + editor = either.b(); + + either = editor.putAttribute(path.add(n), key, ByteBuffer.wrap(value.getBytes())); + if (either.isA()) + Assert.fail(); + editor = either.b(); + return editor; + } + + public JungleTreeEditor put(JungleTreeEditor editor, NodePath path, String key, String value) { + + Either either = editor.putAttribute(path, key, ByteBuffer.wrap(value.getBytes())); + if (either.isA()) + Assert.fail(); + editor = either.b(); + return editor; + } + + public ByteBuffer get (String treeName, NodePath path, String key) { + JungleTree tree = jungle.getTreeByName(treeName); + Either e = tree.getNodeOfPath(path); + if (e.isA()) + Assert.fail(); + TreeNode node = e.b(); + return node.getAttributes().get(key); + } + +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/data/list/appendTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/data/list/appendTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,35 @@ +package jp.ac.u_ryukyu.ie.cr.data.list; + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import junit.framework.Assert; +import org.junit.Test; + +import java.util.Iterator; + +/** + * Created by e115731 on 15/05/19. + */ +public class appendTest { + @Test + public void appendTest() { + + List list = new List<>(); + for (int count = 1; count <= 10; count++) { + list = list.addLast(count); + } + + List list2 = new List<>(); + for (int count = 11; count <= 20; count++) { + list2 = list2.addLast(count); + } + + List newList = list.append(list2); + Iterator iterator = newList.iterator(); + for (int count = 1; count <= 20; count++) { + Assert.assertTrue(iterator.hasNext()); + int num = iterator.next(); + Assert.assertEquals(num, count); + } + + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/data/list/deleteTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/data/list/deleteTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,29 @@ +package jp.ac.u_ryukyu.ie.cr.data.list; + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import junit.framework.Assert; +import org.junit.Test; + +/** + * Created by e115731 on 15/05/18. + */ +public class deleteTest { + @Test + public void deleteTest() { + List list = new List(); + + for (int count = 0; count < 10; count++) { + list = list.addLast(count); + } + List newList = list.delete(5); + Assert.assertEquals(newList.length(),9); + newList = newList.deleteHead(); + int attribute = newList.index(1); + Assert.assertEquals(attribute,2); + Assert.assertEquals(newList.length(),8); + newList = newList.deleteLast(); + attribute = newList.index(6); + Assert.assertEquals(attribute,8); + Assert.assertEquals(list.length(),10); + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/data/list/listAdd.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/data/list/listAdd.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,39 @@ +package jp.ac.u_ryukyu.ie.cr.data.list; + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import junit.framework.Assert; +import org.junit.Test; + +/** + * Created by e115731 on 15/05/17. + */ +public class listAdd { + + @Test + public void listAddTest() { + + List list = new List(); + List list2 = new List(); + + for (int count = 0; count < 10; count++) { + list = list.addLast(count); + list2 = list2.add(count, count); + } + + for (int count = 0; count < 10; count++) { + int num = list.index(count); + int num2 = list2.index(count); + Assert.assertEquals(num,count); + Assert.assertEquals(num2,count); + } + + List newList = list.add(5, 50); + int num = list.index(5); + int num2 = newList.index(5); + Assert.assertEquals(num,5); + Assert.assertEquals(num2,50); + + } + + +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/data/list/listIterator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/data/list/listIterator.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,33 @@ +package jp.ac.u_ryukyu.ie.cr.data.list; + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import junit.framework.Assert; +import org.junit.Test; + +import java.util.Iterator; + +/** + * Created by e115731 on 15/05/17. + */ +public class listIterator { + @Test + public void listIteratorTest() { + List list = new List(); + for (int count = 1; count < 10; count++) { + list = list.addLast(count); + } + Iterator iterator = list.iterator(); + for (int count = 1; count < 10; count++) { + Assert.assertTrue(iterator.hasNext()); + int attribute = iterator.next(); + Assert.assertEquals(attribute, count); + } + + iterator = list.reverseIterator(); + for (int count = 9; count > 0; count--) { + Assert.assertTrue(iterator.hasNext()); + int attribute = iterator.next(); + Assert.assertEquals(attribute, count); + } + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/data/list/replaceTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/data/list/replaceTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,25 @@ +package jp.ac.u_ryukyu.ie.cr.data.list; + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import junit.framework.Assert; +import org.junit.Test; + +/** + * Created by e115731 on 15/05/18. + */ +public class replaceTest { + @Test + public void replaceTest() { + List list = new List(); + for (int count = 0; count < 10; count++) { + list = list.addLast(count); + } + List newList = list.replace(5, 15); + Assert.assertEquals(list.length(), 10); + int attribute = list.index(5); + Assert.assertEquals(attribute, 5); + attribute = newList.index(5); + Assert.assertEquals(newList.length(), 10); + Assert.assertEquals(attribute, 15); + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/data/treemap/TreeMapDelete.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/data/treemap/TreeMapDelete.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,32 @@ +package jp.ac.u_ryukyu.ie.cr.data.treemap; + +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.RotateParent; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Collections; + +public class TreeMapDelete { + + @Test + public void TreeMapDeleteTest() throws RotateParent { + TreeMap map = new TreeMap<>(); + for (int count = 1; count < 1000; count++) { + map = map.put(count, count); + map.checkDepth(); + } + + ArrayList list = new ArrayList<>(); + for (int i = 1; i < 1000; i++) { + list.add(i); + } + Collections.shuffle(list); + for (Integer num : list) { + System.out.println(num); + map = map.delete(num); + map.checkDepth(); + } + System.out.println("end"); + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/data/treemap/TreeMapTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/data/treemap/TreeMapTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,43 @@ +package jp.ac.u_ryukyu.ie.cr.data.treemap; + +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; +import org.junit.Test; + +import java.util.Optional; + +public class TreeMapTest { + + @Test + public void TreeMapTest() { + TreeMap map = new TreeMap<>(); + for (int count = 100; count > -10; count--) { + map = map.put(count, count); + map.checkDepth(); + System.out.println("-------------------------------------------"); + } + + for (int count = 100; count > -10; count--) { + + Optional op = map.get(count); + if (op.isPresent()) + System.out.println(op.get()); + } + + System.out.println("end"); + } +} + + + + + + + + + + + + + + + diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/data/treemap/TreeNodeIteratorTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/data/treemap/TreeNodeIteratorTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,30 @@ +package jp.ac.u_ryukyu.ie.cr.data.treemap; + +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; +import junit.framework.Assert; +import org.junit.Test; + +import java.util.Iterator; + +/** + * Created by e115731 on 15/05/06. + */ +public class TreeNodeIteratorTest { + @Test + public void getKeyTest() { + TreeMap map = new TreeMap(); + for (int attributeMaxCount = 10; attributeMaxCount < 1000; attributeMaxCount = attributeMaxCount + 10) { + for (int count = 0; count < attributeMaxCount; count++) { //insertData + map = map.put(count, count); + } + Iterator it = map.keys(); + int iteratorCount = 0; + while (it.hasNext()) { // count return iterator Attribute Count + iteratorCount++; + System.out.println(it.next()); + } + Assert.assertTrue(iteratorCount == attributeMaxCount); // check + } + + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/DefaultTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/DefaultTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,21 @@ +package jp.ac.u_ryukyu.ie.cr.jungle; + +import org.junit.Test; + +import java.util.TreeMap; + +/** + * Created by e115731 on 15/05/17. + */ +public class DefaultTest { + + @Test + public void Test() { + TreeMap map = new TreeMap(); + for (int i = 0; i < 10; i++) { + map.put(i, i); + } + } + + +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/AttributesContainerTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/AttributesContainerTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,22 @@ +//package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; +// +//import org.junit.Assert; +//import org.junit.Ignore; +//import org.junit.Test; +// +//import junit.framework.TestCase; +// +//@Ignore +//public abstract class AttributesContainerTest extends TestCase +//{ +// public abstract AttributesContainer instance(); +// +// @Test +// public void testGetAttributes() +// { +// AttributesContainer instance = instance(); +// Attributes attrs = instance.getAttributes(); +// +// Assert.assertNotNull(attrs); +// } +//} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/AttributesTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/AttributesTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,33 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Pair; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import junit.framework.Assert; +import junit.framework.TestCase; +import org.junit.Ignore; + +import java.nio.ByteBuffer; + +@Ignore +public abstract class AttributesTest extends TestCase { + @SuppressWarnings("unchecked") + public static List> ENTRIES = new List( + new Pair("KEY1", ByteBuffer.wrap("VALUE1".getBytes())), + new Pair("KEY2", ByteBuffer.wrap("VALUE2".getBytes())), + new Pair("KEY3", ByteBuffer.wrap("VALUE3".getBytes())) + ); + + public abstract Attributes instance(); + + public void testGet() { + Attributes attrs = instance(); + + for (Pair entry : ENTRIES) { + String key = entry.left(); + ByteBuffer expect = entry.right(); + ByteBuffer actual = attrs.get(key); + Assert.assertNotNull(actual); + Assert.assertEquals(0, actual.compareTo(expect)); + } + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/ChildrenTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/ChildrenTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,20 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core; + + +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNodeChildren; +import junit.framework.Assert; +import junit.framework.TestCase; + +public abstract class ChildrenTest extends TestCase +{ + public abstract int expectSize(); + public abstract DefaultTreeNodeChildren instance(); + + public void testSize() + { + int expect = expectSize(); + Children children = instance(); + + Assert.assertEquals(expect,children.size()); + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/GetNodeOfPathTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/GetNodeOfPathTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,48 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core; + +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import junit.framework.Assert; +import org.junit.Test; + +import java.nio.ByteBuffer; +import java.util.Iterator; + +public class GetNodeOfPathTest { + + @Test + public void getNodeOfPathTest() { + Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("tree"); + JungleTree tree = jungle.getTreeByName("tree"); + JungleTreeEditor editor = tree.getTreeEditor(); + DefaultNodePath path = new DefaultNodePath(); + editor = editor.addNewChildAt(path, 0).b(); + path = path.add(0); + editor = editor.putAttribute(path, "KEY", ByteBuffer.wrap("data".getBytes())).b(); + editor = editor.addNewChildAt(path, 0).b(); + path = path.add(0); + editor = editor.putAttribute(path, "KEY", ByteBuffer.wrap("kanagawa".getBytes())).b(); + editor.success(); + InterfaceTraverser traverser = tree.getTraverser(true); + Iterator nodeIterator = traverser.find((TreeNode node) -> { + String str = node.getAttributes().getString("KEY"); + if (str == null) + return false; + if (str.equals("kanagawa")) + return true; + return false; + }, "KEY", "kanagawa"); + + TreeNode node = tree.getNodeOfPath(path).b(); + Assert.assertTrue(nodeIterator.hasNext()); + Assert.assertEquals(node, nodeIterator.next()); + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/GetOldTreeTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/GetOldTreeTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,46 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core; + + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import org.junit.Test; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; + +public class GetOldTreeTest { + + @Test + public void getOldTreeTest() { + Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("tree"); + JungleTree tree = jungle.getTreeByName("tree"); + JungleTreeEditor editor = tree.getTreeEditor(); + DefaultNodePath path = new DefaultNodePath(); + + for (int num = 0; num < 10; num++) { + JungleTreeEditor addChildEditor = editor.addNewChildAt(path, num).b(); + JungleTreeEditor putAttributeEditor = addChildEditor.putAttribute(path.add(num), "test", ByteBuffer.wrap("data".getBytes())).b(); + Either successEither = putAttributeEditor.success(); + Assert.assertFalse(successEither.isA()); + editor = successEither.b(); + } + System.out.println(tree.revision()); + TreeNode root = tree.getRootNode(); + Assert.assertTrue(root.getChildren().at(9).isB()); + + JungleTree oldTree = tree.getOldTree(9).b(); + System.out.println(oldTree.revision()); + TreeNode oldRoot = oldTree.getRootNode(); + Assert.assertTrue(oldRoot.getChildren().at(9).isA()); + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/ParentTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/ParentTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,22 @@ +/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core; + +import org.junit.Ignore; +import org.junit.Test; + +import junit.framework.Assert; +import junit.framework.TestCase; + +@Ignore +public abstract class ParentTest> extends TestCase +{ + public abstract T instance(); + + @Test + public void testGetChildren() + { + T instance = instance(); + Children children = instance.getChildren(); + Assert.assertNotNull(children); + } +} +*/ \ No newline at end of file diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/impl/treeeditor/DefaultTreeEditorTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/impl/treeeditor/DefaultTreeEditorTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,89 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core.impl.treeeditor; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.AppendChildAt; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.PutAttribute; +import jp.ac.u_ryukyu.ie.cr.jungle.tests.util.TestUtil; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultEvaluator; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.Traversal; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; +import junit.framework.TestCase; + +import java.nio.ByteBuffer; + +public class DefaultTreeEditorTest extends TestCase { + public DefaultTreeEditor instance() { + DefaultTraverser traverser = new DefaultTraverser(); + return new DefaultTreeEditor(traverser); + } + + public void testEdittingDoesNotEffectToOtherTree() { + TreeNode root = TestUtil.createMockTree(3); + DefaultTreeEditor editor = new DefaultTreeEditor(new DefaultTraverser()); + DefaultNodePath path = new DefaultNodePath().add(0).add(2); + + TreeNode oldRoot = root; + + DefaultTreeEditor currentEditor = editor; + String key = "path"; + + + TreeNode currentRoot = root; + for (DefaultNodePath part : path.inits()) { + String str = part.toString(); + ByteBuffer value = ByteBuffer.wrap(str.getBytes()); + PutAttribute putAttribute = new PutAttribute(key, value); + Either either = currentEditor.edit(currentRoot, part, putAttribute); + if (either.isA()) { + Assert.fail(); + } + currentRoot = either.b().getWrap(); + } + + TreeNode newRoot = currentRoot; + DefaultTraverser traverser = new DefaultTraverser(); + + for (DefaultNodePath part : path.inits()) { + Either either = traverser.traverse(newRoot, new DefaultEvaluator(part)); + if (either.isA()) { + Assert.fail(); + } + TreeNode target = either.b().destination(); + String expected = part.toString(); + String actual = new String(target.getAttributes().get(key).array()); + + Assert.assertEquals(expected, actual); + } + for (DefaultNodePath part : path.inits()) { + Either either = traverser.traverse(oldRoot, new DefaultEvaluator(part)); + if (either.isA()) { + Assert.fail(); + } + TreeNode target = either.b().destination(); + ByteBuffer actual = target.getAttributes().get(key); + + Assert.assertNull(actual); + } + + } + + public void testEdit() { + DefaultTreeEditor instance = instance(); + DefaultTreeNode node = new DefaultTreeNode(); + DefaultNodePath path = new DefaultNodePath(); + + Either either = instance.edit(node, path, new AppendChildAt(0)); + if (either.isA()) { + Assert.fail(); + } + TreeNode newRoot = either.b().getWrap(); + Assert.assertEquals(1, newRoot.getChildren().size()); + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/AppendChildAtTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/AppendChildAtTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,27 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core.nodeeditor; + + +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.AppendChildAt; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; +import junit.framework.TestCase; + +public class AppendChildAtTest extends TestCase +{ + public void testEdit() + { + TreeNode node = new DefaultTreeNode(); + AppendChildAt op = new AppendChildAt(0); + Either either = op.edit(node); + if(either.isA()){ + Assert.fail(); + } + + LoggingNode newNode = either.b(); + Assert.assertEquals(1,newNode.getChildren().size()); + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/DeleteAttributeAtTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/DeleteAttributeAtTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,37 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core.nodeeditor; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.DeleteAttribute; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; +import junit.framework.TestCase; + +public class DeleteAttributeAtTest extends TestCase +{ + public void testEdit() + { + String key = "KEY"; + ByteBuffer value = ByteBuffer.wrap(key.getBytes()); + + TreeNode node = new DefaultTreeNode(); + Either either = node.getAttributes().put(key, value); + if(either.isA()){ + Assert.fail(); + } + node = either.b(); + + DeleteAttribute op = new DeleteAttribute(key); + Either either2 = op.edit(node); + if(either2.isA()){ + Assert.fail(); + } + LoggingNode newNode = either2.b(); + ByteBuffer ret = newNode.getAttributes().get(key); + Assert.assertNull(ret); + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/DeleteChildAtTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/DeleteChildAtTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,33 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core.nodeeditor; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.DeleteChildAt; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; +import junit.framework.TestCase; + +public class DeleteChildAtTest extends TestCase +{ + public void testEdit() + { + TreeNode node = new DefaultTreeNode(); + Either either = node.getChildren().addNewChildAt(0); + if(either.isA()){ + Assert.fail(); + } + node = either.b(); + Assert.assertEquals(1,node.getChildren().size()); + + DeleteChildAt op = new DeleteChildAt(0); + Either either2 = op.edit(node); + if(either2.isA()){ + Assert.fail(); + } + LoggingNode logNode = either2.b(); + + Assert.assertEquals(0,logNode.getChildren().size()); + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/EditableAttributesTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/EditableAttributesTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,99 @@ +/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.nodeeditor; + +import java.nio.ByteBuffer; + +import org.junit.Assert; + +import fj.P; +import fj.P2; +import fj.data.List; +import TreeNode; +import TreeNodeAttributes; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableAttributes; +import NodeEditorError; +import Either; +import Error; +import junit.framework.TestCase; + +public abstract class EditableAttributesTest> extends TestCase +{ + public abstract TreeNodeAttributes instance(); + + @SuppressWarnings("unchecked") + public static final List> ENTRIES = List.list( + P.p("KEY1",ByteBuffer.wrap("VALUE1".getBytes())), + P.p("KEY2",ByteBuffer.wrap("VALUE2".getBytes())), + P.p("KEY3",ByteBuffer.wrap("VALUE3".getBytes())) + ); + + public TreeNodeAttributes createTestData() + { + TreeNodeAttributes instance = instance(); + + T node; + TreeNodeAttributes attr = instance; + for(P2 entry : ENTRIES){ + Either either = attr.put(entry._1(),entry._2()); + if(either.isA()){ + Assert.fail("error during creating the data."); + } + + node = either.b(); + attr = node.getAttributes(); + } + + return attr; + } + + public void testPutDoesNotAcceptNullValue() + { + TreeNodeAttributes instance = instance(); + + Either either = instance.put("KEY",null); + if(!either.isA()){ + Assert.fail("put must returns NULL_VALUE_NOT_ALLOWED when the value was null."); + } + + Assert.assertEquals(NodeEditorError.NULL_VALUE_NOT_ALLOWED,either.a()); + + either = instance.put(null,ByteBuffer.wrap("VALUE".getBytes())); + + if(!either.isA()){ + Assert.fail("put must returns NULL_VALUE_NOT_ALLOWED when the key was null."); + } + + Assert.assertEquals(NodeEditorError.NULL_VALUE_NOT_ALLOWED,either.a()); + } + + public void testPut() + { + createTestData(); + } + + public void testDeleteIfKeyExsist() + { + TreeNodeAttributes attr = createTestData(); + + for(P2 entry : ENTRIES){ + Either either = attr.delete(entry._1()); + if(either.isA()){ + Assert.fail("error during deleting exist key."); + } + + attr = either.b().getAttributes(); + } + } + + public static final String DUMMY_KEY = "dummy"; + + public void testDeleteIfKeyNotExist() + { + TreeNodeAttributes attr = createTestData(); + + Either either = attr.delete(DUMMY_KEY); + if(!either.isA()){ + Assert.fail("delete must returns DELETE_KEY_NOT_FOUND when the deleting invalid key."); + } + } +} +*/ \ No newline at end of file diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/EditableChildrenTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/EditableChildrenTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,135 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core.nodeeditor; + +import java.nio.ByteBuffer; +/*import org.junit.Assert; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableChildren; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; +import NodeEditorError; +import Either; +import Error; +import junit.framework.TestCase; + +public abstract class EditableChildrenTest> extends TestCase +{ + public abstract EditableChildren instance(); + + public static final String KEY = "KEY"; + public static final ByteBuffer VALUE = ByteBuffer.wrap("VALUE".getBytes()); + + public void testAddNewChildAtMuinusValue() + { + EditableChildren children = instance(); + Either either = children.addNewChildAt(-1); + if(!either.isA()){ + Assert.fail("addNewChildAt(-1) must returns INDEX_OUT_OF_BOUNDS Error"); + } + + Error e = either.a(); + Assert.assertSame(e,NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + public void testAddNewChildAtOutOfBounds() + { + EditableChildren children = instance(); + Either either = children.addNewChildAt(1); + if(!either.isA()){ + Assert.fail("addNewChildAt(1) must returns INDEX_OUT_OF_BOUNDS Error"); + } + + Error e = either.a(); + Assert.assertSame(e,NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + public void testAddNewChildAtMiddle() + { + EditableChildren children = instance(); + + for(int i = 0;i < 3;i ++){ + Either either = children.addNewChildAt(0); + if(either.isA()){ + Assert.fail("fail when adding new child to head"); + } + children = either.b().getChildren(); + } + + Either either = children.addNewChildAt(1); + if(either.isA()){ + Assert.fail("fail when adding new child to middle (1)"); + } + // size must be 4 + children = either.b().getChildren(); + Assert.assertEquals(4,children.size()); + } + + public void testAddNewChildAtToHead() + { + EditableChildren children = instance(); + + int size = children.size(); + + Either either = children.addNewChildAt(0); + if(either.isA()){ + Assert.fail("error during add new child to head"); + } + children = either.b().getChildren(); + Assert.assertEquals(size + 1,children.size()); + } + + public void testDeleteChildAtMuinusValue() + { + EditableChildren children = instance(); + Either either = children.deleteChildAt(-1); + if(!either.isA()){ + Assert.fail("deleteChildAt(-1) must returns INDEX_OUT_OF_BOUNDS Error"); + } + + Error e = either.a(); + Assert.assertSame(e,NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + public void testDeleteChildAtOutOfBounds() + { + EditableChildren children = instance(); + Either either = children.deleteChildAt(1); + if(!either.isA()){ + Assert.fail("deleteChildAt(1) must returns INDEX_OUT_OF_BOUNDS Error"); + } + + Error e = either.a(); + Assert.assertSame(e,NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + public void testDeleteChildAtFailsWhenTheSizeIsZero() + { + EditableChildren children = instance(); + Either either = children.deleteChildAt(0); + if(!either.isA()){ + Assert.fail("deleteChildAt(1) must returns INDEX_OUT_OF_BOUNDS Error"); + } + + Error e = either.a(); + Assert.assertSame(e,NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + public void testDeleteChildAt() + { + EditableChildren children = instance(); + + int size = children.size(); + + Either either = children.addNewChildAt(0); + if(either.isA()){ + Assert.fail("error during add new child to head"); + } + children = either.b().getAttributes().put(KEY,VALUE).b().getChildren(); + Assert.assertEquals(size + 1,children.size()); + + either = children.deleteChildAt(0); + if(either.isA()){ + Assert.fail("error during deleting child"); + } + children = either.b().getChildren(); + + Assert.assertEquals(size,children.size()); + } +}*/ diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/PutAttributeTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/PutAttributeTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,33 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core.nodeeditor; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.LoggingNode; +import jp.ac.u_ryukyu.ie.cr.jungle.store.trasnformer.PutAttribute; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import org.junit.Assert; + +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.TestCase; + +public class PutAttributeTest extends TestCase +{ + public void testEdit() + { + String key = "KEY"; + ByteBuffer value = ByteBuffer.wrap(key.getBytes()); + TreeNode node = new DefaultTreeNode(); + PutAttribute op = new PutAttribute(key,value); + //EditableNodeWrapper wrapper = new EditableNodeWrapper(node); + Either either = op.edit(node); + if(either.isA()){ + Assert.fail(); + } + + LoggingNode newNode = either.b(); + ByteBuffer ret = newNode.getAttributes().get(key); + Assert.assertEquals(0,ret.compareTo(value)); + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/ReplaceRootNodeAt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/nodeeditor/ReplaceRootNodeAt.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,38 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.core.nodeeditor; + +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; + +import org.junit.Test; + +public class ReplaceRootNodeAt { + + @Test + public void ReplaceRootNodeAtTest() { + Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("tree"); + JungleTree tree = jungle.getTreeByName("tree"); + JungleTreeEditor editor = tree.getTreeEditor(); + + TreeNode oldRoot = tree.getRootNode(); + Either either = editor.replaceNewRootNode(); + Assert.assertTrue(either.isB()); + JungleTreeEditor newTreeEditor = either.b(); + Assert.assertTrue(newTreeEditor.success().isB()); + TreeNode newRoot = tree.getRootNode(); + Assert.assertFalse(oldRoot.equals(newRoot)); + + Either childrenEither = newRoot.getChildren().at(0); + Assert.assertTrue(childrenEither.isB()); + TreeNode newRootChildren = childrenEither.b(); + Assert.assertEquals(oldRoot, newRootChildren); + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/treeeditor/TreeNodeChildrenTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/treeeditor/TreeNodeChildrenTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,131 @@ +/*package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.treeeditor; + +import java.nio.ByteBuffer; +import org.junit.Assert; +import fj.data.List; +import TreeNode; +import TreeNodeChildren; +import Either; +import Error; +import junit.framework.TestCase; + +public abstract class TreeNodeChildrenTest> extends TestCase +{ + public abstract TreeNode instance(); + + public void testAddNewChildAtWithNode() + { + int count = 5; + for(Integer pos : List.range(0,5)){ + _testAddNewChildAtWithNode(count,pos); + } + } + + public void _testAddNewChildAtWithNode(int _count,int _pos) + { + TreeNode instance = instance(); + + Either either; + for(int i = 0;i < _count;i ++){ + either = instance.getChildren().addNewChildAt(0); + if(either.isA()){ + Assert.fail(); + } + instance = either.b(); + } + + TreeNode newNode = instance.createNewNode(); + String key = "KEY"; + ByteBuffer value = ByteBuffer.wrap("VALUE".getBytes()); + + either = newNode.getAttributes().put(key,value); + if(either.isA()){ + Assert.fail(); + } + newNode = either.b(); + + either = instance.getChildren().addNewChildAt(_pos,newNode); + if(either.isA()){ + Assert.fail(); + } + instance = either.b(); + + // check + either = instance.getChildren().at(_pos); + if(either.isA()){ + Assert.fail(); + } + + T checkTarget = either.b(); + ByteBuffer actual = checkTarget.getAttributes().get(key); + Assert.assertEquals(0,value.compareTo(actual)); + } + + public void testReplaceAt() + { + int count = 5; + for(Integer pos : List.range(0,count)){ + _testReplaceAt(count,pos); + } + } + + public void _testReplaceAt(int _count,int _pos) + { + TreeNode instance = instance(); + String key = "KEY"; + ByteBuffer value = ByteBuffer.wrap("VALUE".getBytes()); + + // prepare + + for(int i = 0;i < _count;i ++){ + TreeNode newNode = instance.createNewNode(); + Either either = newNode.getAttributes().put(key,value); + if(either.isA()){ + Assert.fail("failed to put attributes to child"); + } + + newNode = either.b(); + either = instance.getChildren().addNewChildAt(0,newNode); + if(either.isA()){ + Assert.fail("failed to add child to instance"); + } + + instance = either.b(); + } + + int size = instance.getChildren().size(); + Assert.assertEquals(_count,size); + + // create node for replacement. + + ByteBuffer replaceNodeValue = ByteBuffer.wrap("EULAV".getBytes()); + TreeNode replacement = instance.createNewNode(); + Either either = replacement.getAttributes().put(key,replaceNodeValue); + if(either.isA()){ + Assert.fail("failed to create replacement node"); + } + replacement = either.b(); + + // replace + + either = instance.getChildren().replaceNode(_pos,replacement); + if(either.isA()){ + Assert.fail("failed to replace node."); + } + instance = either.b(); + + TreeNodeChildren children = instance.getChildren(); + for(Integer pos : List.range(0,_count)){ + either = children.at(pos.intValue()); + if(either.isA()){ + Assert.fail("failed to get node."); + } + + T ch = either.b(); + ByteBuffer expect = (_pos != pos) ? value : replaceNodeValue; + ByteBuffer actual = ch.getAttributes().get(key); + + Assert.assertEquals(0,expect.compareTo(actual)); + } + } +}*/ diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/impl/node/DefaultAttributesTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/impl/node/DefaultAttributesTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,54 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.impl.node; + +import jp.ac.u_ryukyu.ie.cr.jungle.core.AttributesTest; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNodeAttributes; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Pair; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; +import org.junit.Assert; + +import java.nio.ByteBuffer; +import java.util.Optional; + +public class DefaultAttributesTest extends AttributesTest +{ + public TreeNodeAttributes instance() + { + List rawList = new List(); + TreeMap rawMap = new TreeMap(); + + // add attributes + + for(Pair entry : ENTRIES){ + rawMap = rawMap.put(entry.left(),entry.right()); + } + + TreeNode node = new DefaultTreeNode(rawList,rawMap); + return node.getAttributes(); + } + + public void testGetAttributesAsRawMap() + { + TreeNodeAttributes attrs = instance(); + TreeMap rawMap = attrs.getAttributesAsRawMap(); + + // testing rawmap is not null. + Assert.assertNotNull(rawMap); + + // testing rawmap has correct key values. + for(Pair entry : ENTRIES){ + String key = entry.left(); + ByteBuffer value = entry.right(); + + Optional option = rawMap.get(key); + if(!option.isPresent()){ + Assert.fail(); + } + + ByteBuffer actual = option.get(); + Assert.assertEquals(0,actual.compareTo(value)); + } + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/impl/node/DefaultChildrenTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/impl/node/DefaultChildrenTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,44 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.impl.node; + + +import jp.ac.u_ryukyu.ie.cr.jungle.core.ChildrenTest; +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNodeChildren; +import jp.ac.u_ryukyu.ie.cr.jungle.data.treemap.TreeMap; +import org.junit.Assert; + +import java.nio.ByteBuffer; + +public class DefaultChildrenTest extends ChildrenTest +{ + + @Override + public DefaultTreeNodeChildren instance() + { + List rawList = new List(); + for(int i = 0;i < expectSize();i ++){ + rawList = rawList.addLast(new DefaultTreeNode()); + } + + TreeMap rawMap = new TreeMap(); + + return new DefaultTreeNode(rawList,rawMap).getChildren(); + } + + @Override + public int expectSize() + { + return 3; + } + + public void testGetChildrenAsRawList() + { + DefaultTreeNodeChildren instance = instance(); + List rawList = instance.getChildrenAsRawList(); + + Assert.assertNotNull(rawList); + Assert.assertEquals(expectSize(),rawList.length()); + } +} \ No newline at end of file diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/index/parentIndexTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/index/parentIndexTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,47 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.index; + +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.jungle.store.index.ParentIndex; +import junit.framework.Assert; +import org.junit.Test; + +import java.nio.ByteBuffer; + +/** + * Created by e115731 on 15/05/06. + */ +public class parentIndexTest { + @Test + public void parentIndex() { + Jungle jungle = new DefaultJungle(null, "hogehoge", new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("tree"); + JungleTree tree = jungle.getTreeByName("tree"); + JungleTreeEditor editor = tree.getTreeEditor(); + + DefaultNodePath path = new DefaultNodePath(); + for (int count = 0; count < 100; count++) { + editor = editor.addNewChildAt(path, 0).b(); + path = path.add(0); + editor = editor.putAttribute(path, "KEY", ByteBuffer.wrap(("data" + count).getBytes())).b(); + } + + Either either = editor.success(); + Assert.assertTrue(either.isB()); + TreeNode node = tree.getNodeOfPath(path).b(); + ParentIndex parentIndex = tree.getParentIndex(); + for (int count = 99; count >= 0; count--) { + String attribute = node.getAttributes().getString("KEY"); + Assert.assertEquals(attribute, "data" + count); + node = parentIndex.get(node); + } + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/tests/util/TestUtil.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/tests/util/TestUtil.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,44 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.tests.util; + +import java.nio.ByteBuffer; + +import org.junit.Ignore; + +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; + +@Ignore +public class TestUtil +{ + public static TreeNode createMockTree(int _maxDepth) + { + return _createMockTree(1,_maxDepth,new DefaultNodePath()); + } + + public static TreeNode _createMockTree(int _currentDepth,int _maxDepth,NodePath _path) + { + TreeNode parent = new DefaultTreeNode(); + Either either = parent.getAttributes().put("KEY",ByteBuffer.wrap(_path.toString().getBytes())); + if(either.isA()){ + return null; + } + parent = either.b(); + + if(_currentDepth != _maxDepth){ + for(int i = 0;i <= _currentDepth;i ++){ + TreeNode ch = _createMockTree(_currentDepth + 1,_maxDepth,_path.add(i)); + either = parent.getChildren().addNewChildAt(i,ch); + if(either.isA()){ + return null; + } + parent = either.b(); + } + } + + return parent; + } +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/traverse/InterfaceTraverserTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/traverse/InterfaceTraverserTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,143 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverse; + +import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle; +import jp.ac.u_ryukyu.ie.cr.jungle.Jungle; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree; +import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.persistent.NullJournal; +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; +import org.junit.Test; + +import java.nio.ByteBuffer; +import java.util.Iterator; + +/** + * Created by e115731 on 15/08/11. + */ +public class InterfaceTraverserTest { + public static int encount = 101; + public static double sum = 0d; + @Test + public void InterfaseTraverserTest() { + for (int i = 0; i < encount; i++) { + int start = (int) System.nanoTime(); + Jungle jungle = new DefaultJungle(new NullJournal(), "hoge", new DefaultTreeEditor(new DefaultTraverser())); + jungle.createNewTree("TestTree"); + JungleTree tree = jungle.getTreeByName("TestTree"); + JungleTreeEditor editor = tree.getTreeEditor(); + editor = createTree(editor, 0, 3, new DefaultNodePath()); + Either either = editor.success(); + if (either.isA()) + Assert.fail(); + int end = (int) System.nanoTime(); + if(i != 0) { + sum += (end - start) / 1000000f; + + System.out.println("Time sum : " + ((end - start) / 1000000f) + "ms"); + } + // System.out.println("Time : " + (end - start) / 1000000f + "ms"); + } + System.out.println("Sum Time : " + sum / (encount -1) + "ms"); +// InterfaceTraverser traverser = tree.getTraverser(true); +// +// { +// Iterator iterator = traverser.find((TreeNode node) -> { // no index find +// String value = node.getAttributes().getString(key); +// if (value == null) +// return false; +// if (value.equals("<1,1,-1>")) +// return true; +// return false; +// }, null, null); +// +// Assert.assertTrue(iterator.hasNext()); +// TreeNode node = iterator.next(); +// String value = node.getAttributes().getString("KEY"); +// Assert.assertEquals("<1,1,-1>", value); +// } +// +// { +// Iterator iterator = traverser.find((TreeNode node) -> { // no index find +// String value = node.getAttributes().getString(key); +// if (value == null) +// return false; +// if (value.equals("no exist value")) +// return true; +// return false; +// }, null, null); +// +// Assert.assertFalse(iterator.hasNext()); +// } +// +// { +// Iterator iterator = traverser.find((TreeNode node) -> { // use index find +// String value = node.getAttributes().getString(key); +// if (value == null) +// return false; +// if (value.equals("<1,1,-1>")) +// return true; +// return false; +// }, indexKey, "<1,1,-1>+ index"); +// +// Assert.assertTrue(iterator.hasNext()); +// TreeNode node = iterator.next(); +// String value = node.getAttributes().getString("KEY"); +// Assert.assertEquals("<1,1,-1>", value); +// } +// +// { +// Iterator iterator = traverser.find((TreeNode node) -> { // use index find +// String value = node.getAttributes().getString(key); +// if (value == null) +// return false; +// if (value.equals("<1,1,-1>")) +// return true; +// return false; +// }, indexKey, "no exist index value"); +// +// Assert.assertFalse(iterator.hasNext()); +// } + + } + + public static String key = "KEY"; + public static String indexKey = "INDEXKEY"; + public static DefaultTreeNode factory = new DefaultTreeNode(); + public static ByteBuffer value = ByteBuffer.wrap(key.getBytes()); + + public JungleTreeEditor createTree(JungleTreeEditor editor, int _curY, int _maxHeight, NodePath path) { + + if (_curY == _maxHeight) { + return editor; + } + for (int i = 0; i < 3; i++) { + + Either either = editor.addNewChildAt(path, i); + if (either.isA()) + Assert.fail(); + editor = either.b(); + // String value = path.add(i).toString(); + either = editor.putAttribute(path.add(i), key, value); + if (either.isA()) + Assert.fail(); + editor = either.b(); + // String value2 = value + "+ index"; + either = editor.putAttribute(path.add(i), indexKey, value); + if (either.isA()) + Assert.fail(); + editor = either.b(); + editor = createTree(editor, _curY + 1, _maxHeight, path.add(i)); + } + return editor; + } + +} diff -r 000000000000 -r 44465893e8b8 src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/traverse/TraverserTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/traverse/TraverserTest.java Wed Nov 30 01:47:55 2016 +0900 @@ -0,0 +1,100 @@ +package jp.ac.u_ryukyu.ie.cr.jungle.traverse; + + +import jp.ac.u_ryukyu.ie.cr.jungle.data.list.List; +import jp.ac.u_ryukyu.ie.cr.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode; +import jp.ac.u_ryukyu.ie.cr.jungle.traverser.*; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.jungle.util.Error; +import junit.framework.Assert; +import junit.framework.TestCase; + +import java.nio.ByteBuffer; + +public class TraverserTest extends TestCase +{ + + public void testTraverse() + { + int maxHeight = 3; + + TreeNode root = createTree(0,maxHeight,new DefaultNodePath()); + Traverser traverser = new DefaultTraverser(); + + List paths = generatePathPattern(new DefaultNodePath(),0,maxHeight); + paths = paths.addLast(new DefaultNodePath()); + + for(DefaultNodePath path : paths){ + DefaultEvaluator evaluator = new DefaultEvaluator(path); + Either ret = traverser.traverse(root,evaluator); + if(ret.isA()){ + Assert.fail(); + } + + Traversal traversal = ret.b(); + TreeNode target = traversal.destination(); + String expect = path.toString(); + ByteBuffer value = target.getAttributes().get(key); + String actual = new String(value.array()); + Assert.assertEquals(expect,actual); + + List parts = path.inits(); + + for(Direction d : traversal){ + DefaultNodePath part = parts.tail(); + parts = parts.delete(parts.length() - 1); + value = d.getTarget().getAttributes().get(key); + String actualCurrentPathStr = new String(value.array()); + String expectCurrentPathStr = part.toString(); + Assert.assertEquals(expectCurrentPathStr,actualCurrentPathStr); + } + } + } + + public List generatePathPattern(DefaultNodePath _cur,int _curHeight,int _maxHeight) + { + List paths = new List(); + for(int p = 0;p <= _curHeight;p ++){ + DefaultNodePath path = _cur.add(p); + if(_curHeight != _maxHeight - 1){ + List newpaths = generatePathPattern(path,_curHeight+1,_maxHeight); + paths = paths.append(newpaths); + } + paths = paths.addLast(path); + } + + return paths; + } + + public static String key = "KEY"; + public static DefaultTreeNode factory = new DefaultTreeNode(); + + public TreeNode createTree(int _curY,int _maxHeight,NodePath _address) + { + TreeNode parent = factory.createNewNode(); + Either either = parent.getAttributes().put(key,ByteBuffer.wrap(_address.toString().getBytes())); + if(either.isA()){ + Assert.fail(); + } + parent = either.b(); + + if(_curY == _maxHeight){ + return parent; + } + + for(int i = 0;i < _curY + 1;i ++){ + TreeNode ch = createTree(_curY + 1,_maxHeight,_address.add(i)); + either = parent.getChildren().addNewChildAt(i,ch); + if(either.isA()){ + Assert.fail(); + } + + parent = either.b(); + } + + return parent; + } +}

"+ bbs.sanitize(board) + "