# HG changeset patch # User shoshi # Date 1339518542 -32400 # Node ID 9eb9fabd9f292a8b43565ed13461ffad392fd6d4 # Parent cc30c2773c09f295e02269779dcc31a7f2aacef8 added Table framework diff -r cc30c2773c09 -r 9eb9fabd9f29 memo.txt --- a/memo.txt Tue Jun 12 01:33:51 2012 +0900 +++ b/memo.txt Wed Jun 13 01:29:02 2012 +0900 @@ -12,4 +12,13 @@ ・NodeProvider は、Tree/TreeNode/Link を作成する。 ・NodeProvider で、createTreeGroup , createTree , createTreeNode , createLink を依頼する ・初期では、パスの検索は深さ優先探索で行う - ・TreeGroupについて、TreeGroupは最初に初期Treeを1つ作らなければならない? \ No newline at end of file + ・TreeGroupについて、TreeGroupは最初に初期Treeを1つ作らなければならない? + +2012/06/12 + ・NodeTable と NodeTable の状態を同期させる。 + ・Table , Record , PropertySequence をつくる、Record がひとつの Node に対応する + ・これを用いて Node , TreeGroup , Tree , TreeNode , Link を作成する + ・ Node : Record の Property で Attribute を表現 + ・ TreeGroup : Node で表すべき? + ・ Tree : TreeNode を継承している よって Node で表す、 Children や Links は PropertySequence による. + ・ Link : Node で表す。 \ No newline at end of file diff -r cc30c2773c09 -r 9eb9fabd9f29 pom.xml --- a/pom.xml Tue Jun 12 01:33:51 2012 +0900 +++ b/pom.xml Wed Jun 13 01:29:02 2012 +0900 @@ -31,6 +31,11 @@ commons-collections 3.2.1 + + net.sf.jpf + jpf + 1.5 + diff -r cc30c2773c09 -r 9eb9fabd9f29 src/main/java/jungle/core/table/PropertySequence.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/core/table/PropertySequence.java Wed Jun 13 01:29:02 2012 +0900 @@ -0,0 +1,9 @@ +package jungle.core.table; + +public interface PropertySequence extends Iterable +{ + public void add(String _value); + public String get(int _pos); + public String remove(int _pos); + public int size(); +} diff -r cc30c2773c09 -r 9eb9fabd9f29 src/main/java/jungle/core/table/Record.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/core/table/Record.java Wed Jun 13 01:29:02 2012 +0900 @@ -0,0 +1,18 @@ +package jungle.core.table; + +import java.util.Iterator; + +import jungle.util.Pair; + +public interface Record +{ + public void setProperty(String _key,String _value); + public String getProperty(String _key); + public String removeProperty(String _key); + public PropertySequence createSequence(String _key); + public PropertySequence getSequence(String _key); + public PropertySequence removeSequence(String _key); + + public Iterator> properties(); + public Iterator> sequences(); +} diff -r cc30c2773c09 -r 9eb9fabd9f29 src/main/java/jungle/core/table/Table.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/core/table/Table.java Wed Jun 13 01:29:02 2012 +0900 @@ -0,0 +1,8 @@ +package jungle.core.table; + +public interface Table +{ + public Record create(String _key); + public Record find(String _key); + public Record remove(String _key); +} diff -r cc30c2773c09 -r 9eb9fabd9f29 src/main/java/jungle/core/table/simple/SimplePropertySequence.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/core/table/simple/SimplePropertySequence.java Wed Jun 13 01:29:02 2012 +0900 @@ -0,0 +1,53 @@ +package jungle.core.table.simple; + +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.concurrent.CopyOnWriteArrayList; +import javax.annotation.concurrent.ThreadSafe; + +import jungle.core.table.PropertySequence; + +@ThreadSafe +public class SimplePropertySequence implements PropertySequence +{ + private final CopyOnWriteArrayList sequence; + private final Collection readonlyWrapper; + + public SimplePropertySequence() + { + sequence = new CopyOnWriteArrayList(); + readonlyWrapper = Collections.unmodifiableCollection(sequence); + } + + @Override + public Iterator iterator() + { + return readonlyWrapper.iterator(); + } + + @Override + public void add(String _value) + { + sequence.add(_value); + } + + @Override + public String get(int _pos) + { + return sequence.get(_pos); + } + + @Override + public String remove(int _pos) + { + return sequence.remove(_pos); + } + + @Override + public int size() + { + return sequence.size(); + } + +} \ No newline at end of file diff -r cc30c2773c09 -r 9eb9fabd9f29 src/main/java/jungle/core/table/simple/SimpleRecord.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/core/table/simple/SimpleRecord.java Wed Jun 13 01:29:02 2012 +0900 @@ -0,0 +1,119 @@ +package jungle.core.table.simple; + +import java.util.Iterator; +import java.util.Map.Entry; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import javax.annotation.concurrent.ThreadSafe; + +import jungle.core.table.PropertySequence; +import jungle.core.table.Record; +import jungle.util.Pair; + +@ThreadSafe +public class SimpleRecord implements Record +{ + private final ConcurrentHashMap properties; + private final ConcurrentHashMap sequences; + + public SimpleRecord() + { + properties = new ConcurrentHashMap(); + sequences = new ConcurrentHashMap(); + } + + @Override + public void setProperty(String _key, String _value) + { + properties.put(_key,_value); + } + + @Override + public String getProperty(String _key) + { + return properties.get(_key); + } + + @Override + public String removeProperty(String _key) + { + return properties.remove(_key); + } + + @Override + public PropertySequence createSequence(String _key) + { + SimplePropertySequence seq = new SimplePropertySequence(); + sequences.put(_key,seq); + return seq; + } + + @Override + public PropertySequence getSequence(String _key) + { + return sequences.get(_key); + } + + @Override + public PropertySequence removeSequence(String _key) + { + return sequences.remove(_key); + } + + @Override + public Iterator> properties() + { + final Set> entries = properties.entrySet(); + final Iterator> itr = entries.iterator(); + return new Iterator>(){ + + @Override + public boolean hasNext() + { + return itr.hasNext(); + } + + @Override + public Pair next() + { + Entry ent = itr.next(); + return new Pair(ent.getKey(),ent.getValue()); + } + + @Override + public void remove() + { + throw new UnsupportedOperationException("removing is not supported"); + } + }; + } + + @Override + public Iterator> sequences() + { + final Set> entries = sequences.entrySet(); + final Iterator> itr = entries.iterator(); + return new Iterator>(){ + + @Override + public boolean hasNext() + { + return itr.hasNext(); + } + + @Override + public Pair next() + { + Entry ent = itr.next(); + return new Pair (ent.getKey(),ent.getValue()); + } + + @Override + public void remove() + { + throw new UnsupportedOperationException("removeing is not supported."); + } + }; + } +} diff -r cc30c2773c09 -r 9eb9fabd9f29 src/main/java/jungle/core/table/simple/SimpleTable.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jungle/core/table/simple/SimpleTable.java Wed Jun 13 01:29:02 2012 +0900 @@ -0,0 +1,36 @@ +package jungle.core.table.simple; + +import java.util.concurrent.ConcurrentHashMap; + +import jungle.core.table.Record; +import jungle.core.table.Table; + +public class SimpleTable implements Table +{ + private final ConcurrentHashMap table; + + public SimpleTable() + { + table = new ConcurrentHashMap(); + } + + @Override + public Record create(String _key) + { + SimpleRecord r = new SimpleRecord(); + Record b = table.putIfAbsent(_key,r); + return (b == null) ? r : null; + } + + @Override + public Record find(String _key) + { + return table.get(_key); + } + + @Override + public Record remove(String _key) + { + return table.remove(_key); + } +} diff -r cc30c2773c09 -r 9eb9fabd9f29 src/main/java/jungle/impl/SimpleChildren.java --- a/src/main/java/jungle/impl/SimpleChildren.java Tue Jun 12 01:33:51 2012 +0900 +++ b/src/main/java/jungle/impl/SimpleChildren.java Wed Jun 13 01:29:02 2012 +0900 @@ -40,4 +40,6 @@ { return sets.size(); } + + } diff -r cc30c2773c09 -r 9eb9fabd9f29 src/main/java/jungle/parsist/NodeProvider.java --- a/src/main/java/jungle/parsist/NodeProvider.java Tue Jun 12 01:33:51 2012 +0900 +++ b/src/main/java/jungle/parsist/NodeProvider.java Wed Jun 13 01:29:02 2012 +0900 @@ -2,4 +2,5 @@ public interface NodeProvider { + } diff -r cc30c2773c09 -r 9eb9fabd9f29 src/test/java/jungle/core/table/AbstractPropertySequenceTestTemplate.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jungle/core/table/AbstractPropertySequenceTestTemplate.java Wed Jun 13 01:29:02 2012 +0900 @@ -0,0 +1,73 @@ +package jungle.core.table; + +import junit.framework.Assert; +import junit.framework.TestCase; + +public abstract class AbstractPropertySequenceTestTemplate extends TestCase +{ + public abstract PropertySequence newInstance(); + + public void testInitialSizeIsZero() + { + PropertySequence seq = newInstance(); + Assert.assertEquals(0,seq.size()); + } + + public static final String ONE = "one"; + public static final String TWO = "two"; + public static final String THREE = "three"; + + public PropertySequence prepare() + { + PropertySequence seq = newInstance(); + seq.add(ONE); + seq.add(TWO); + seq.add(THREE); + + return seq; + } + + public void testAdd() + { + PropertySequence seq = prepare(); + + int size = seq.size(); + Assert.assertEquals(3,size); + + String one = seq.get(0); + String two = seq.get(1); + String three = seq.get(2); + + Assert.assertEquals(ONE,one); + Assert.assertEquals(TWO,two); + Assert.assertEquals(THREE,three); + } + + public void testGet() + { + PropertySequence seq = prepare(); + Assert.assertEquals(ONE,seq.get(0)); + } + + public void testSize() + { + PropertySequence seq = prepare(); + Assert.assertEquals(3,seq.size()); + } + + public void testRemove() + { + PropertySequence seq = prepare(); + + String removed = seq.remove(1); + Assert.assertEquals(removed,TWO); + + Assert.assertEquals(ONE,seq.get(0)); + Assert.assertEquals(THREE,seq.get(1)); + } + + public void testThreadSafety() + { + Assert.assertTrue(true); + } +} diff -r cc30c2773c09 -r 9eb9fabd9f29 src/test/java/jungle/core/table/AbstractRecordTestTemplate.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jungle/core/table/AbstractRecordTestTemplate.java Wed Jun 13 01:29:02 2012 +0900 @@ -0,0 +1,128 @@ +package jungle.core.table; + +import java.util.HashSet; +import java.util.Iterator; +import jungle.util.Pair; +import junit.framework.Assert; +import junit.framework.TestCase; + +public abstract class AbstractRecordTestTemplate extends TestCase +{ + public abstract Record newInstance(); + + public static final String ONE = "one"; + public static final String TWO = "two"; + public static final String THREE = "three"; + + public Record prepare() + { + Record r = newInstance(); + + r.setProperty(ONE,ONE); + r.setProperty(TWO,TWO); + r.setProperty(THREE,THREE); + + r.createSequence(ONE); + r.createSequence(TWO); + r.createSequence(THREE); + + return r; + } + + public void testSetProperty() + { + Record r = prepare(); + r.setProperty("TEST","TEST"); + + Assert.assertEquals(r.getProperty("TEST"),"TEST"); + } + + public void testGetProperty() + { + Record r = prepare(); + Assert.assertEquals(r.getProperty(ONE),ONE); + Assert.assertEquals(r.getProperty(TWO),TWO); + Assert.assertEquals(r.getProperty(THREE),THREE); + } + + public void testRemoveProperty() + { + Record r = prepare(); + String removed = r.removeProperty(TWO); + Assert.assertEquals(TWO,removed); + Assert.assertNull(r.getProperty(TWO)); + } + + public void testCreateSequence() + { + Record r = prepare(); + PropertySequence seq = r.createSequence("TEST"); + + Assert.assertNotNull(seq); + Assert.assertEquals(seq,r.getSequence("TEST")); + } + + public void testGetSequence() + { + Record r = newInstance(); + PropertySequence one = r.createSequence(ONE); + PropertySequence two = r.createSequence(TWO); + PropertySequence three = r.createSequence(THREE); + + Assert.assertEquals(r.getSequence(ONE),one); + Assert.assertEquals(r.getSequence(TWO),two); + Assert.assertEquals(r.getSequence(THREE),three); + } + + public void testRemoveSequence() + { + Record r = prepare(); + PropertySequence removed = r.removeSequence(TWO); + + Assert.assertNotNull(removed); + Assert.assertNull(r.removeSequence(TWO)); + } + + public void testProperties() + { + Record r = prepare(); + + HashSet props = new HashSet(); + props.add(ONE); + props.add(TWO); + props.add(THREE); + + Iterator> itr = r.properties(); + while(itr.hasNext()){ + Pair p = itr.next(); + Assert.assertEquals(p.left(),p.right()); + Assert.assertTrue(props.contains(p.left())); + props.remove(p.left()); + } + + Assert.assertEquals(0,props.size()); + } + + public void testSequences() + { + Record r = newInstance(); + PropertySequence one = r.createSequence(ONE); + PropertySequence two = r.createSequence(TWO); + PropertySequence three = r.createSequence(THREE); + + HashSet props = new HashSet(); + props.add(one); + props.add(two); + props.add(three); + + Iterator> itr = r.sequences(); + while(itr.hasNext()){ + Pair p = itr.next(); + PropertySequence seq = p.right(); + Assert.assertTrue(props.contains(seq)); + props.remove(seq); + } + + Assert.assertEquals(0,props.size()); + } +} diff -r cc30c2773c09 -r 9eb9fabd9f29 src/test/java/jungle/core/table/AbstractTableTestTemplate.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jungle/core/table/AbstractTableTestTemplate.java Wed Jun 13 01:29:02 2012 +0900 @@ -0,0 +1,62 @@ +package jungle.core.table; + +import junit.framework.Assert; +import junit.framework.TestCase; + +public abstract class AbstractTableTestTemplate extends TestCase +{ + public abstract Table newInstance(); + + public Table prepare() + { + Table t = newInstance(); + + t.create(ONE); + t.create(TWO); + t.create(THREE); + + return t; + } + + public static final String ONE = "one"; + public static final String TWO = "two"; + public static final String THREE = "three"; + + public void testCreateRecord() + { + Table t = newInstance(); + + Record one = t.create(ONE); + Record two = t.create(TWO); + Record three = t.create(THREE); + + Assert.assertNotNull(one); + Assert.assertNotNull(two); + Assert.assertNotNull(three); + } + + public void testFindRecord() + { + Table t = newInstance(); + + Record one = t.create(ONE); + Assert.assertNotNull(one); + Assert.assertEquals(one,t.find(ONE)); + } + + public void testRemoveRecord() + { + Table t = newInstance(); + + Record one = t.create(ONE); + Record two = t.create(TWO); + + Assert.assertNotNull(one); + Assert.assertNotNull(two); + + Assert.assertEquals(one,t.remove(ONE)); + Assert.assertEquals(two,t.remove(TWO)); + Assert.assertNull(t.remove(ONE)); + Assert.assertNull(t.remove(TWO)); + } +} diff -r cc30c2773c09 -r 9eb9fabd9f29 src/test/java/jungle/core/table/simple/SimplePropertySequenceTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jungle/core/table/simple/SimplePropertySequenceTest.java Wed Jun 13 01:29:02 2012 +0900 @@ -0,0 +1,13 @@ +package jungle.core.table.simple; + +import jungle.core.table.AbstractPropertySequenceTestTemplate; +import jungle.core.table.PropertySequence; + +public class SimplePropertySequenceTest extends AbstractPropertySequenceTestTemplate +{ + @Override + public PropertySequence newInstance() + { + return new SimplePropertySequence(); + } +} diff -r cc30c2773c09 -r 9eb9fabd9f29 src/test/java/jungle/core/table/simple/SimpleRecordTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jungle/core/table/simple/SimpleRecordTest.java Wed Jun 13 01:29:02 2012 +0900 @@ -0,0 +1,15 @@ +package jungle.core.table.simple; + +import jungle.core.table.AbstractRecordTestTemplate; +import jungle.core.table.Record; + +public class SimpleRecordTest extends AbstractRecordTestTemplate +{ + + @Override + public Record newInstance() + { + return new SimpleRecord(); + } + +} diff -r cc30c2773c09 -r 9eb9fabd9f29 src/test/java/jungle/core/table/simple/SimpleTableTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/jungle/core/table/simple/SimpleTableTest.java Wed Jun 13 01:29:02 2012 +0900 @@ -0,0 +1,15 @@ +package jungle.core.table.simple; + +import jungle.core.table.AbstractTableTestTemplate; +import jungle.core.table.Table; + +public class SimpleTableTest extends AbstractTableTestTemplate +{ + + @Override + public Table newInstance() + { + return new SimpleTable(); + } + +}