nodal-cvs Mailing List for NODAL (Page 6)
Status: Pre-Alpha
Brought to you by:
leei
You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(69) |
Jun
(153) |
Jul
(129) |
Aug
(70) |
Sep
(94) |
Oct
(105) |
Nov
(31) |
Dec
(34) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
(7) |
Feb
(40) |
Mar
(68) |
Apr
(27) |
May
(107) |
Jun
(202) |
Jul
(74) |
Aug
(5) |
Sep
(25) |
Oct
(40) |
Nov
(43) |
Dec
(73) |
2004 |
Jan
(63) |
Feb
(40) |
Mar
(104) |
Apr
(34) |
May
(33) |
Jun
(18) |
Jul
(12) |
Aug
(2) |
Sep
(24) |
Oct
(52) |
Nov
(44) |
Dec
(4) |
2005 |
Jan
(42) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2008 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(3) |
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
2013 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
(5) |
Jun
|
Jul
|
Aug
(6) |
Sep
(3) |
Oct
|
Nov
|
Dec
(1) |
2014 |
Jan
|
Feb
(1) |
Mar
(1) |
Apr
(1) |
May
|
Jun
(1) |
Jul
|
Aug
(1) |
Sep
(6) |
Oct
(5) |
Nov
(8) |
Dec
(3) |
2015 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2016 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
(2) |
Dec
|
2017 |
Jan
|
Feb
|
Mar
(1) |
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Lee I. <le...@us...> - 2004-10-03 19:43:49
|
Update of /cvsroot/nodal/j-test In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12471 Added Files: .project .classpath .cvsignore Log Message: First commit separating j-test from j-src --- NEW FILE: .cvsignore --- bin --- NEW FILE: .project --- <?xml version="1.0" encoding="UTF-8"?> <projectDescription> <name>j-test</name> <comment></comment> <projects> </projects> <buildSpec> <buildCommand> <name>org.eclipse.jdt.core.javabuilder</name> <arguments> </arguments> </buildCommand> </buildSpec> <natures> <nature>org.eclipse.jdt.core.javanature</nature> </natures> </projectDescription> --- NEW FILE: .classpath --- <?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="src" path="/j-src"/> <classpathentry kind="lib" path="/j-src/lib/junit.jar"/> <classpathentry kind="lib" path="/j-src/build/classes"/> <classpathentry kind="output" path="bin"/> </classpath> |
From: Lee I. <le...@us...> - 2004-10-03 19:43:49
|
Update of /cvsroot/nodal/j-test/src/test/org/nodal In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12471/src/test/org/nodal Added Files: nodal.dfPackage Suite.java Log Message: First commit separating j-test from j-src --- NEW FILE: Suite.java --- package test.org.nodal; import junit.framework.Test; import junit.framework.TestSuite; /** JUnit TestSuite. * @testfamily JUnit * @testkind testsuite * @testsetup Default TestSuite * @testpackage test.org.nodal */ public class Suite extends TestSuite { public Suite() { addTest(suite()); } public static void main(String[] args) { junit.swingui.TestRunner.run(Suite.class); } public static Test suite() { TestSuite result = new TestSuite("Test test.org.nodal"); result.addTest(test.org.nodal.nav.Suite.suite ()); result.addTest(test.org.nodal.schemata.Suite.suite ()); result.addTest(test.org.nodal.util.Suite.suite ()); // result.addTestSuite(test.org.nodal.storage.memory.TestmemMapContent.class); // result.addTestSuite(test.org.nodal.storage.memory.TestmemMapHead.class); // result.addTestSuite(test.org.nodal.storage.memory.TestmemRecordContent.class); // result.addTestSuite(test.org.nodal.storage.memory.TestmemRecordHead.class); // result.addTestSuite(test.org.nodal.storage.memory.TestmemRepository.class); // result.addTestSuite(test.org.nodal.storage.memory.TestmemGenericSequenceContent.class); // result.addTestSuite(test.org.nodal.storage.memory.TestmemSequenceHead.class); return result; } } --- NEW FILE: nodal.dfPackage --- package id4ejbbd16rpompd189ibmn; /** @version 2.0 @physicalPackage @__modelType diagram */ class diagram { /** @__ref <oiref:design#Class#id3tnzxd16rpompd189ibmz.diagram:oiref><oihard> @__modelType reference @__fqn <oiref:#Package#test.org.nodal.storage:oiref> */ class reference { }/** @__ref <oiref:java#Class#test.org.nodal.Suite:oiref><oihard> @__modelType reference */ class reference62 { }/** @__ref <oiref:design#Class#id42hyxd9m0iqyjd9oq3zmg.diagram:oiref><oihard> @__modelType reference @__fqn <oiref:#Package#test.org.nodal.nav:oiref> */ class reference8 { }}/** @__tags @shapeType ClassDiagram */ class __tags { }/** @__options */ class __options { }/** @__positions */ class __positions { } |
From: Lee I. <le...@us...> - 2004-10-03 19:43:48
|
Update of /cvsroot/nodal/j-test/src/test/storage/memory In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12296/src/test/storage/memory Log Message: Directory /cvsroot/nodal/j-test/src/test/storage/memory added to the repository |
From: Lee I. <le...@us...> - 2004-10-03 19:43:46
|
Update of /cvsroot/nodal/j-test/src/test/storage In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12471/src/test/storage Added Files: Suite.java storage.dfPackage Log Message: First commit separating j-test from j-src --- NEW FILE: Suite.java --- package test.storage; import junit.framework.Test; import junit.framework.TestSuite; /** JUnit TestSuite. * @testfamily JUnit * @testkind testsuite * @testsetup Default TestSuite * @testpackage test.storage*/ public class Suite extends TestSuite { public Suite(String name) { super(name); } public static Test suite() { TestSuite result = new TestSuite("Test storage"); // Add calls to test cases here! result.addTest(test.storage.memory.Suite.suite()); result.addTest(test.storage.file.Suite.suite()); result.addTest(test.storage.jar.Suite.suite()); result.addTest(test.storage.http.Suite.suite()); return result; } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } } --- NEW FILE: storage.dfPackage --- package id6iiod3g31efvd3g3azyl; /** @version 2.0 @physicalPackage @__modelType diagram */ class diagram { /** @__ref <oiref:design#Class#id60bk1d3g31efvd3g9s9b4.diagram:oiref><oihard> @__modelType reference @__fqn <oiref:#Package#test.storage.memory:oiref> */ class reference4 { }/** @__ref <oiref:java#Class#test.storage.Suite:oiref><oihard> @__modelType reference */ class reference { }}/** @__tags @shapeType ClassDiagram */ class __tags { }/** @__options */ class __options { }/** @__positions */ class __positions { } |
From: Lee I. <le...@us...> - 2004-10-03 19:43:44
|
Update of /cvsroot/nodal/j-test/src/test/org/nodal/schemata/text/x_nodal_schema In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12471/src/test/org/nodal/schemata/text/x_nodal_schema Added Files: TestParser.java Log Message: First commit separating j-test from j-src --- NEW FILE: TestParser.java --- package test.org.nodal.schemata.text.x_nodal_schema; import java.net.MalformedURLException; import java.net.URL; import org.nodal.Nodal; import org.nodal.Types; import org.nodal.filesystem.DocumentFormat; import org.nodal.format.text.x_nodal_schema.Format; import org.nodal.model.NodeFactory; import org.nodal.nav.Path; import storage.trans.TransientRepository; import test.org.nodal.schemata.SchemataTestCase; public class TestParser extends SchemataTestCase { protected TransientRepository repo; public TestParser(String name) { super(name); } /** Sets up the repository and context node *This method is called before a test is executed. */ protected void setUp() { //Create a new repository try { repo = (TransientRepository) Nodal.openRepository("memory://audited"); } catch (Path.Failure e) { fail(); } //Special mode created by Lee to allow for node creation straight from the repo // o This node is used to create the factory for the decoder in the test NodeFactory nodeFactory = repo.createNode(Types.STRING); DocumentFormat testFormat = Format.documentFormat(); super.setUp(testFormat, nodeFactory); } protected void tearDown() { repo.close(); } /**Test Decoder open text file and encode into a sequence of nodes*/ public void testDecode() { try { URL baseTypes = new URL(Types.BASEURI); tryParser (new URL (baseTypes, "baseTypes.nls")); tryParser (new URL (baseTypes, "xml.nls")); } catch (MalformedURLException e) { fail(); } } } |
From: Lee I. <le...@us...> - 2004-10-03 19:43:44
|
Update of /cvsroot/nodal/j-test/src/test/storage/jar In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12471/src/test/storage/jar Added Files: Suite.java TestJarRepository.java Log Message: First commit separating j-test from j-src --- NEW FILE: Suite.java --- /* * Distributed under the Apache Software License, Version 1.1 * (see below, or the file LICENSE for terms and conditions) * * Copyright (c) 2004 University of British Columbia. All rights reserved. * * Created on Feb 29, 2004 by leei */ package test.storage.jar; import junit.framework.Test; import junit.framework.TestSuite; /** * @author leei */ public class Suite extends TestSuite { /** * */ public Suite() { super(); } public static Test suite() { TestSuite result = new TestSuite ("Test storage.jar"); // Add calls to test cases here! result.addTestSuite(TestJarRepository.class); return result; } public static void main(String[] args) { junit.textui.TestRunner.run (suite()); } } --- NEW FILE: TestJarRepository.java --- /* * Distributed under the Apache Software License, Version 1.1 (see below, or the * file LICENSE for terms and conditions) * * Copyright (c) 2004 University of British Columbia. All rights reserved. * * Created on Feb 29, 2004 by leei */ package test.storage.jar; import java.net.URL; import org.nodal.Nodal; import org.nodal.Repository; import org.nodal.filesystem.Document; import org.nodal.model.Node; import org.nodal.nav.Path; import org.nodal.type.NodeType; import junit.framework.TestCase; /** * @author leei */ public class TestJarRepository extends TestCase { Repository jarRepo; /** * */ public TestJarRepository() { super(); // TODO Auto-generated constructor stub } protected void setUp() { try { Class reClass = Class.forName("gnu.regexp.RE"); URL url = reClass.getClassLoader().getResource("gnu/regexp/RE.class"); jarRepo = Nodal.openRepository(url.toExternalForm()); if (jarRepo == null) { fail ("Unable to find gnu/regexp/RE.class!"); } } catch (ClassNotFoundException e) { e.printStackTrace(System.err); fail("Unable to load org.jdom.Document"); } catch (Path.Failure e) { e.printStackTrace(System.err); fail(); } } protected void tearDown() { if (jarRepo != null) { jarRepo.close(); } } public void testBasic() { try { Document manifest = jarRepo.document("META-INF/MANIFEST.MF"); assertTrue(manifest != null); Node root = manifest.root(); assertTrue(root != null); NodeType rootType = root.nodeType(); assertTrue(rootType != null); System.out.println(manifest); } catch (Path.Failure e) { e.printStackTrace(System.err); fail("Parsing META-INF/MANIFEST.MF"); } } } |
From: Lee I. <le...@us...> - 2004-10-03 19:43:32
|
Update of /cvsroot/nodal/j-test/src/test/org/nodal In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12296/src/test/org/nodal Log Message: Directory /cvsroot/nodal/j-test/src/test/org/nodal added to the repository |
From: Lee I. <le...@us...> - 2004-10-03 19:43:32
|
Update of /cvsroot/nodal/j-test/src/test In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12471/src/test Added Files: test.dfPackage Suite.java Log Message: First commit separating j-test from j-src --- NEW FILE: Suite.java --- package test; import junit.framework.Test; import junit.framework.TestSuite; /** JUnit TestSuite. * @testfamily JUnit * @testkind testsuite * @testsetup Default TestSuite * @testpackage test.storage*/ public class Suite extends TestSuite { public Suite(String name) { super (name); } public static Test suite() { TestSuite result = new TestSuite ("Test"); // Add calls to test cases here! result.addTest(test.org.nodal.Suite.suite()); result.addTest(test.storage.Suite.suite()); return result; } public static void main(String[] args) { junit.textui.TestRunner.run (suite()); } } --- NEW FILE: test.dfPackage --- package id1nacnd2ca8ikad2dmswsu; /** @version 2.0 @physicalPackage @__modelType diagram */ class diagram { /** @__ref <oiref:design#Class#id1bkbwd16rpompd189ibnx.diagram:oiref><oihard> @__modelType reference @__fqn <oiref:#Package#test.org:oiref> */ class reference { }/** @__ref <oiref:design#Class#id6iiod3g31efvd3g3azyl.diagram:oiref><oihard> @__modelType reference @__fqn <oiref:#Package#test.storage:oiref> */ class reference1 { }/** @__ref <oiref:java#Class#test.Suite:oiref><oihard> @__modelType reference */ class reference5 { }}/** @__tags @shapeType ClassDiagram */ class __tags { }/** @__options */ class __options { }/** @__positions */ class __positions { } |
From: Lee I. <le...@us...> - 2004-10-03 19:43:29
|
Update of /cvsroot/nodal/j-test/src/test/org/nodal/schemata/text/plain In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12296/src/test/org/nodal/schemata/text/plain Log Message: Directory /cvsroot/nodal/j-test/src/test/org/nodal/schemata/text/plain added to the repository |
From: Lee I. <le...@us...> - 2004-10-03 19:43:28
|
Update of /cvsroot/nodal/j-test/src/test/org/nodal/schemata In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12471/src/test/org/nodal/schemata Added Files: Suite.java SchemataTestCase.java Log Message: First commit separating j-test from j-src --- NEW FILE: Suite.java --- package test.org.nodal.schemata; import junit.framework.Test; import junit.framework.TestSuite; /** JUnit TestSuite. * @testfamily JUnit * @testkind testsuite * @testsetup Default TestSuite * @testpackage test.org.nodal.nav */ public class Suite extends TestSuite { public Suite() { addTest(suite()); } public static void main(String[] args) { junit.swingui.TestRunner.run(Suite.class); } public static Test suite() { TestSuite result = new TestSuite("Test org.nodal.schemata"); // Add calls to test cases here! result.addTestSuite( test.org.nodal.schemata.text.plain.TestDecTextPlain.class); // result.addTestSuite( // test.org.nodal.schemata.text.x_nodal_schema.TestParser.class); result.addTestSuite(test.org.nodal.schemata.text.xml.TestXML.class); return result; } } --- NEW FILE: SchemataTestCase.java --- /* * Distributed under the Apache Software License, Version 1.1 (see below, or the * file LICENSE for terms and conditions) * * Copyright (c) 2004 University of British Columbia. All rights reserved. * * Created on Mar 17, 2004 by leei */ package test.org.nodal.schemata; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import junit.framework.TestCase; import org.nodal.filesystem.DocumentFormat; import org.nodal.filesystem.DocumentFormat.Decoder; import org.nodal.filesystem.DocumentFormat.Encoder; import org.nodal.model.Node; import org.nodal.model.NodeFactory; /** * @author leei */ public class SchemataTestCase extends TestCase { protected DocumentFormat format; protected NodeFactory factory; /** * */ public SchemataTestCase(String arg0) { super(arg0); } private byte[] readWholeStream(InputStream str) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buffer = new byte[2048]; int bytes; while ((bytes = str.read(buffer)) != -1) { out.write(buffer, 0, bytes); } return out.toByteArray(); } public void tryParser(URL url) { String uri = url.toExternalForm(); //System.out.println("Testing XML: " + uri + " {"); try { URLConnection conn = url.openConnection(); byte[] inBytes = readWholeStream(conn.getInputStream()); Decoder decoder1 = format.decoder(); decoder1.setURI(uri); Node root1 = decoder1.decode(new ByteArrayInputStream(inBytes), factory); assertTrue(root1 != null); ByteArrayOutputStream out1 = new ByteArrayOutputStream(); Encoder encoder1 = format.encoder(); encoder1.encode(out1, root1); byte[] out1Bytes = out1.toByteArray(); if (decoder1.isLossless()) { assertArraysEqual(inBytes, out1Bytes); } // Check roundtrip conditions... Decoder decoder2 = format.decoder(); decoder2.setURI(uri); Node root2 = decoder2 .decode(new ByteArrayInputStream(out1Bytes), factory); assertGraphsEqual(root1, root2); assertTrue(root2 != null); ByteArrayOutputStream out2 = new ByteArrayOutputStream(); Encoder encoder2 = format.encoder(); encoder2.encode(out2, root2); byte[] out2Bytes = out2.toByteArray(); assertArraysEqual(out1Bytes, out2Bytes); } catch (Exception e) { System.err.println("Parsing "+url+": "+e); fail(); } finally { //System.out.println("} End XML " + uri); } } /** * @param root1 * @param root2 */ private void assertGraphsEqual(Node root1, Node root2) { // TODO Implement assertGraphsEqual } private class EqualityFailure extends Exception { EqualityFailure(String s) { super(s); } } /** * @param bytes * @param out */ private void assertArraysEqual(byte[] bytes1, byte[] bytes2) throws EqualityFailure { int len1 = bytes1.length; int len2 = bytes2.length; if (len1 != len2) { throw new EqualityFailure("Unequal lengths"); } for (int i = 0; i < len1; ++i) { if (bytes1[i] != bytes2[i]) { int idx = (i >= 3 ? i - 3: 0); String cmp1 = new String (bytes1, idx, 10); String cmp2 = new String (bytes2, idx, 10); throw new EqualityFailure("Bytes [" + i + "] unequal: '" + cmp1 + "' != '" + cmp2 + "'"); } } } /** * @param format2 * @param factory2 */ public void setUp(DocumentFormat format, NodeFactory factory) { this.format = format; this.factory = factory; } } |
From: Lee I. <le...@us...> - 2004-10-03 19:43:26
|
Update of /cvsroot/nodal/j-test/src/test/storage In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12296/src/test/storage Log Message: Directory /cvsroot/nodal/j-test/src/test/storage added to the repository |
From: Lee I. <le...@us...> - 2004-10-03 19:43:25
|
Update of /cvsroot/nodal/j-test/src/test/org/nodal/schemata/text/x_nodal_schema In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12296/src/test/org/nodal/schemata/text/x_nodal_schema Log Message: Directory /cvsroot/nodal/j-test/src/test/org/nodal/schemata/text/x_nodal_schema added to the repository |
From: Lee I. <le...@us...> - 2004-10-03 19:43:25
|
Update of /cvsroot/nodal/j-test/src/test/org/nodal/schemata/text In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12296/src/test/org/nodal/schemata/text Log Message: Directory /cvsroot/nodal/j-test/src/test/org/nodal/schemata/text added to the repository |
From: Lee I. <le...@us...> - 2004-10-03 19:43:24
|
Update of /cvsroot/nodal/j-test/src/test/org In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12296/src/test/org Log Message: Directory /cvsroot/nodal/j-test/src/test/org added to the repository |
From: Lee I. <le...@us...> - 2004-10-03 19:43:17
|
Update of /cvsroot/nodal/j-test/src/test/org/nodal/schemata In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12296/src/test/org/nodal/schemata Log Message: Directory /cvsroot/nodal/j-test/src/test/org/nodal/schemata added to the repository |
From: Lee I. <le...@us...> - 2004-10-03 19:43:17
|
Update of /cvsroot/nodal/j-test/src/test/storage/jar In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12296/src/test/storage/jar Log Message: Directory /cvsroot/nodal/j-test/src/test/storage/jar added to the repository |
From: Lee I. <le...@us...> - 2004-10-03 19:43:16
|
Update of /cvsroot/nodal/j-test/src/test/org/nodal/util In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12296/src/test/org/nodal/util Log Message: Directory /cvsroot/nodal/j-test/src/test/org/nodal/util added to the repository |
From: Lee I. <le...@us...> - 2004-10-03 19:43:16
|
Update of /cvsroot/nodal/j-test/src/test/storage/file In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12296/src/test/storage/file Log Message: Directory /cvsroot/nodal/j-test/src/test/storage/file added to the repository |
From: Lee I. <le...@us...> - 2004-10-03 19:42:20
|
Update of /cvsroot/nodal/j-test/src/test/storage/memory In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12471/src/test/storage/memory Added Files: TestPaths.java Suite.java TestmemGenericSequenceContent.java TestmemMapContent.java memory.dfPackage TestmemIntSequenceContent.java TestmemOperator.java TestBareSequence.java TestmemStringContent.java Log Message: First commit separating j-test from j-src --- NEW FILE: TestmemGenericSequenceContent.java --- //Modified by Charles Yiu //FIXME: testcases have not been imported completely package test.storage.memory; import java.util.Vector; import junit.framework.TestCase; import org.nodal.Nodal; import org.nodal.Types; import org.nodal.model.Getter; import org.nodal.model.Node; import org.nodal.model.SequenceNode; import org.nodal.model.Setter; import org.nodal.nav.Path; import org.nodal.nav.Path.Failure; import org.nodal.type.SequenceType; import org.nodal.type.Schema; import org.nodal.util.ConstraintFailure; import org.nodal.util.IndexBoundsException; import org.nodal.util.PropertyConstraintFailure; import storage.trans.TransientRepository; /** JUnit TestCase. * @testfamily JUnit * @testkind testcase * @testsetup Default TestCase * @testedclass org.nodal.storage.memory.memGenericSequenceContent*/ public final class TestmemGenericSequenceContent extends TestCase { protected Schema.Editor typeDoc; protected SequenceType intSeqType; protected TransientRepository repo; protected SequenceNode iseq; protected SequenceNode.Editor iseqEd; protected Getter iseqAll; public TestmemGenericSequenceContent(String name) { super(name); } /** Sets up the fixture, for example, open a network connection. * This method is called before a test is executed. */ protected void setUp() { try { repo = (TransientRepository) Nodal.openRepository ("memory://transient"); } catch (Failure e) { fail (); } typeDoc = Types.openSchema ("testme.nds").edit (); intSeqType = typeDoc.createSequenceType (Types.SHORT); Node n = repo.createNode (intSeqType); iseq = n.content().asSequenceNode (); iseqEd = iseq.editSequence (); //insert the initial content into the empty "iseq" object Vector testVec = new Vector(3); testVec.add (0, new Integer (1)); testVec.add (1, new Integer (3)); testVec.add (2, new Integer (5)); testVec.add (3, new Integer (7)); testVec.add (4, new Integer (9)); testVec.add (5, new Integer (11)); //11 elements try { executeInsertBefore (0, testVec); iseqAll = iseq.range (0, -1); } catch (ConstraintFailure c) { throw new RuntimeException ("ConstraintFailure in setup: " + c); } } /** Tears down the fixture, for example, close a network connection. * This method is called after a test is executed. */ protected void tearDown() { repo.close (); } public void testSize() { assertTrue (iseq.size() == 6); } public void testProperties() { //fail("not implemented"); } public void testValue() { //fail("not implemented"); } public void testItem() { //fail("not implemented"); } public void testRange () { // The full range Getter range1 = iseq.range(0, -1); Path path1 = range1.path(); System.out.println (range1+".path() = "+path1); // Partial range Getter range2 = iseq.range(0, 3); Path path2 = range2.path(); System.out.println (range2+".path() = "+path2); Getter range3 = iseq.range(0, -1); Path path3 = range3.path(); System.out.println (range2+".path() = "+path3); assertTrue (path1 == path3); } private Vector cloneContent () { try { return (Vector) iseqAll.get (); } catch (PropertyConstraintFailure p) { fail ("iseqAll.get() cannot fail"); return null; } } private void checkIndex (int i) throws IndexBoundsException { iseq.item (i); } private void compareSequences (Vector v) { try { assertTrue (iseqAll.valueEquals (v)); } catch (PropertyConstraintFailure f) { fail ("iseqAll.get() throws PropertyConstraintFailure"); } } void executeReplaceRange (int s, int e, Object v) throws ConstraintFailure { Setter setter = iseqEd.replaceRange (s, e); setter.set (v); } void executeRemoveRange (int s, int e) throws ConstraintFailure { Setter setter = iseqEd.replaceRange (s, e); setter.set (null); } void executeInsertBefore (int i, Object v) throws ConstraintFailure { Setter setter = iseqEd.insertBefore (i); setter.set (v); } void executeInsertAfter (int i, Object v) throws ConstraintFailure { Setter setter = iseqEd.insertAfter (i); setter.set (v); } public void testExecuteInsertAfter_case1() { Vector testVec11 = new Vector(3); testVec11.add (0, new Integer (2)); testVec11.add (1, new Integer (4)); testVec11.add (2, new Integer (6)); //copy the original content for validation later Vector originVec = cloneContent (); //manually insert val after the first item into the original content assertTrue (originVec.addAll (1, testVec11)); //--------case (1)--------------- //System.err.println("originVec: " + originVec); try { //(first item = index [0]) executeInsertAfter(0, testVec11); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); assertTrue (iseq.size() == 9); } // iseq = [1, 2, 4, 6, 3, 5] try { // This will generate an IndexBoundsException checkIndex (9); fail ("did not generate IndexBoundsException"); } catch (IndexBoundsException b) { assertTrue (b.getIndex() == 9); assertTrue (b.getMin() == -9); assertTrue (b.getMax() == 8); } }; public void testExecuteInsertAfter_case2() { Vector testVec12 = new Vector(3); testVec12.add (0, new Integer (8)); testVec12.add (1, new Integer (10)); testVec12.add (2, new Integer (12)); //copy the original content for validation later Vector originVec = cloneContent (); //manually append val into the original content assertTrue (originVec.addAll ((Vector) testVec12)); //--------case (2)--------------- //System.err.println("originVec: " + originVec); //System.err.println("test case 2 for executeInsertAfter(int, Object)"); try { executeInsertAfter(iseq.size()-1, testVec12); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); } }; public void testExecuteInsertAfter_case3() { Vector testVec13 = new Vector(3); testVec13.add (0, new Integer (14)); testVec13.add (1, new Integer (16)); testVec13.add (2, new Integer (18)); Vector originVec = cloneContent (); //copy the original content for validation later //manually convert the backward index to forward one int idx = (originVec.size()) - 2; originVec.addAll (idx + 1, (Vector) testVec13); //--------case (3)--------------- if (iseq.size() > 3) { try { executeInsertAfter(-2, testVec13); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); } } else fail ("Sequence is too short for backward reference"); } public void testExecuteInsertAfter_case4() { Vector testVec22 = new Vector(3); testVec22.add (0, new Integer (8)); testVec22.add (1, new Integer (10)); testVec22.add (2, new Integer (12)); Vector originVec = cloneContent (); //copy the original content for validation later originVec.addAll ((iseq.size() / 2 + 1), (Vector) testVec22); //--------case (4)--------------- //System.err.println("originVec: " + originVec); //System.err.println("test case 4 for executeInsertAfter(int, Object)"); try { executeInsertAfter(iseq.size()/2, testVec22); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); } } public void testExecuteInsertAfter_case5 () { Vector testVec15 = new Vector(3); testVec15.add (0, new Integer (26)); testVec15.add (1, new Integer (28)); testVec15.add (2, new Integer (30)); Vector originVec = cloneContent (); //copy the original content for validation later //--------case (5)--------------- //System.err.println("originVec: " + originVec); //System.err.println("test case 5 for executeInsertAfter(int, Object)"); try { executeInsertAfter(iseq.size()+6, testVec15); fail ("expected ConstraintFailure"); } catch (ConstraintFailure e) { //must go here because of out-of-range reference //System.err.println("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); } }; public void testExecuteInsertBefore_case1 () { Vector testVec21 = new Vector(3); //[2,4,6] testVec21.add (0, new Integer (2)); testVec21.add (1, new Integer (4)); testVec21.add (2, new Integer (6)); Vector originVec = new Vector ((Vector) testVec21); //begins with the inserted val assertTrue (originVec.addAll (cloneContent ())); //append memSequenceContent at the end //--------case (1)--------------- //System.err.println("originVec: " + originVec); //System.err.println("test case 1 for executeInsertBefore(int, Object)"); try { executeInsertBefore(0, testVec21); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); } }; public void testExecuteInsertBefore_case2 () { Vector testVec22 = new Vector(3); //[8,10,12] testVec22.add (0, new Integer (8)); testVec22.add (1, new Integer (10)); testVec22.add (2, new Integer (12)); Vector originVec = cloneContent (); //copy the original content for validation later assertTrue (originVec.addAll (iseq.size() - 1, (Vector) testVec22)); //--------case (2)--------------- //System.err.println("originVec: " + originVec); //System.err.println("test case 2 for executeInsertBefore(int, Object)"); try { executeInsertBefore(iseq.size()-1, testVec22); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); } }; public void testExecuteInsertBefore_case3 () { Vector testVec23 = new Vector(3); //[14,16,18] testVec23.add (0, new Integer (14)); testVec23.add (1, new Integer (16)); testVec23.add (2, new Integer (18)); Vector originVec = cloneContent (); //copy the original content for validation later //manually convert the backward index to forward one //System.err.println("originVec: " + originVec); int idx = (originVec.size()) - 2; assertTrue (originVec.addAll (idx, (Vector) testVec23)); //--------case (3)--------------- //System.err.println("test case 3 for executeInsertBefore(int, Object)"); if (iseq.size() > 3) { try { executeInsertBefore(-2, testVec23); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); } } else fail ("Sequence is too short for backward reference"); }; public void testExecuteInsertBefore_case4 () { //System.err.println("***test case 4 for executeInsertBefore (int, object)"); Vector testVec24 = new Vector(3); testVec24.add (0, new Integer (20)); testVec24.add (1, new Integer (22)); testVec24.add (2, new Integer (24)); Vector originVec = cloneContent (); //copy the original content for validation later assertTrue (originVec.addAll ((iseq.size() /2), (Vector) testVec24)); //System.err.println("originVec: " + originVec); //--------case (4)--------------- //System.err.println("test case 4 for executeInsertBefore (int, Object)"); try { executeInsertBefore(iseq.size()/2, testVec24); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); } }; public void testExecuteInsertBefore_case5 () { Vector testVec25 = new Vector(3); testVec25.add (0, new Integer (26)); testVec25.add (1, new Integer (28)); testVec25.add (2, new Integer (30)); Vector originVec = cloneContent (); //copy the original content for validation later //System.err.println("originVec: " + originVec); //--------case (5)--------------- //System.err.println("test case 5 for executeInsertBefore (int, Object)"); try { executeInsertBefore(iseq.size()+6, testVec25); fail ("expected ConstraintFailure"); } catch (ConstraintFailure e) { //Must go here because of out-of-range reference //System.err.println("Caught ConstraintFailure: " + e.getMessage()); } finally { //the operation should return false due to out-of-range error compareSequences (originVec); } }; //=================================================================================== public void testExecuteRemoveRange_case1 () { Vector originVec = cloneContent (); //copy the original content for validation later //System.err.println("###originVec: " + originVec); int originVecSize = originVec.size(); for (int idex = 1; idex <= originVecSize - 2; idex = idex + 1) originVec.removeElementAt (1); //System.err.println("originVec: " + originVec); //--------case (1)--------------- //System.err.println("test case 1 for executeRemoveRange (int, int)"); if (iseq.size() > 3) { try { //System.err.println("iseq.size() "+iseq.size()); //Remove all the elements in the midde, i.e. exclude the first and last element executeRemoveRange (1, iseq.size()-2); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { //System.err.println("iseq.vec: "+iseq.vec); compareSequences (originVec); } } else fail ("Sequence is too short to remove a subset of it"); }; public void testExecuteRemoveRange_case2 () { //--------case (2)--------------- //System.err.println("test case 2 for executeRemoveRange (int, int)"); try { //System.err.println("iseq.size() "+iseq.size()); executeRemoveRange (0, iseq.size()-1); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { //System.err.println("iseq.vec: "+iseq.vec); // when the operation returns true AND the sequence is empty assertTrue (iseq.size() == 0); } }; public void testExecuteRemoveRange_case3 () { Vector originVec = cloneContent (); //copy the original content for validation later originVec.removeElementAt (iseq.size()/2); //System.err.println("originVec: " + originVec); // when the operation returns true AND the sequence's size decreased by one //--------case (3)--------------- //System.err.println("test case 3 for executeRemoveRange (int, int)"); try { executeRemoveRange (iseq.size()/2, iseq.size()/2); //System.err.println("iseq.vec: " + iseq.vec); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); } }; public void testExecuteRemoveRange_case4 () { Vector originVec = cloneContent (); //copy the original content for validation later //System.err.println("originVec: " + originVec); //--------case (4)--------------- //System.err.println("test case 4 for executeRemoveRange (int, int)"); try { executeRemoveRange (0, iseq.size() + 5); fail ("expected ConstraintFailure"); } catch (ConstraintFailure e) { //must go here because of out-of-range reference //System.err.println("[OK] Caught ConstraintFailure: " + e.getMessage()); } finally { // the operation should return false due to out-of-range error compareSequences (originVec); } }; //======================================================================================== public void testExecuteReplaceRange_case1 () { Vector originVec = cloneContent (); //copy the original content for validation later //explicitly set the first element to be an integer 8 originVec.setElementAt (new Integer (8), 0); //System.err.println("originVec: " + originVec); //--------case (1)--------------- //replace the first element with an integer 8 //System.err.println("test case 1 for executeReplaceRange(int, int, Object)"); try { executeReplaceRange (0, 0, new Integer (8)); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { //System.err.println ("result = " + iseqVector ()); //System.err.println ("target = " + originVec); compareSequences (originVec); } }; public void testExecuteReplaceRange_case2 () { //--------case (2)--------------- // Create a vector for insert // the vector contains 3 elements Vector testVec = new Vector(4); testVec.add (0, new Integer (11)); testVec.add (1, new Integer (13)); testVec.add (2, new Integer (15)); testVec.add (3, new Integer (17)); Vector originVec = cloneContent (); originVec.removeElementAt (0); assertTrue (originVec.addAll (0, (Vector) testVec)); try { executeReplaceRange (0, 0, testVec); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); } }; public void testExecuteReplaceRange_case3 () { //build the result vector explicitly for testing Vector originVec = cloneContent (); int originVecSize = originVec.size(); for (int idex = 1; idex <= originVecSize - 1; idex = idex + 1) originVec.removeElementAt (1); originVec.add(1, new Integer (5)); //System.err.println("originVec: " + originVec); //--------case (3)--------------- if (iseq.size() > 3) { // System.err.println("test case 3 for executeReplaceRange(int, int, Object)"); try { executeReplaceRange (1, iseq.size() - 1, new Integer (5)); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); } } else fail ("Sequence is too short to replace a subset of it"); }; public void testExecuteReplaceRange_case4 () { //--------case (4)--------------- if (iseq.size() > 3) { //System.err.println("test case 4 for executeReplaceRange(int, int, Object)"); //System.err.println("iseq.vec: "+iseq.vec); // Create a vector for insert // the vector contains 4 elements Vector testVec = new Vector(4); testVec.add (0, new Integer (11)); testVec.add (1, new Integer (13)); testVec.add (2, new Integer (15)); testVec.add (3, new Integer (17)); //System.err.println("Build Successful"); //build the result vector explicitly for testing Vector originVec = cloneContent (); //System.err.println("originVec: "+originVec); //System.err.println("originVec.size()-1: "+ (originVec.size()-1)); int originVecSize = originVec.size(); for (int idex = 1; idex <= originVecSize - 1; idex = idex + 1) { originVec.removeElementAt (1); //System.err.println("for loop: "+idex); //System.err.println("originVec: "+originVec); } //System.err.println("originVec now: "+originVec); assertTrue (originVec.addAll (1, (Vector) testVec)); //System.err.println("finally originVec: "+originVec); try { executeReplaceRange (1, iseq.size() - 1, testVec); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); } } else fail ("Sequence is too short to replace a subset of it"); }; public void testExecuteReplaceRange_case5 () { Vector originVec = cloneContent (); //--------case (5)--------------- //System.err.println("test case 5 for executeReplaceRange(int, int, Object)"); try { executeReplaceRange (0, iseq.size() + 6, new Integer (8)); fail ("expected ConstraintFailure"); } catch (ConstraintFailure e) { //must go here because of out-of-range reference //System.err.println("[OK] Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); } }; //=============================================================================== //same test cases for BACKWARD REFERENCE public void testExecuteReplaceRange_case1back () { Vector originVec = cloneContent (); //copy the original content for validation later originVec.setElementAt (new Integer (8), originVec.size()-1); //System.err.println("originVec: " + originVec); //--------case (1)--------------- //replace the first element with an integer 8 //System.err.println("test case 1 (backward reference) for executeReplaceRange(int, int, Object)"); try { executeReplaceRange (-1, -1, new Integer (8)); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); } }; public void testExecuteReplaceRange_case2back () { //--------case (2)--------------- //System.err.println("test case 2 (backward reference) for executeReplaceRange(int, int, Object)"); // Create a vector for insert // the vector contains 3 elements Vector testVec = new Vector(4); testVec.add (0, new Integer (11)); testVec.add (1, new Integer (13)); testVec.add (2, new Integer (15)); testVec.add (3, new Integer (17)); Vector originVec = cloneContent (); //explicitly remove the 2nd last item originVec.removeElementAt (originVec.size() - 2); //shift the last item to the right, insert the testVec inbetween assertTrue (originVec.addAll (originVec.size() - 1, (Vector) testVec)); //System.err.println("originVec: " + originVec); try { executeReplaceRange (-2, -2, testVec); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); } }; public void testExecuteReplaceRange_case3back () { Vector originVec = cloneContent (); //System.err.println("originVec: " + originVec); for (int idex = 0; idex <= iseq.size() - 3; idex = idex + 1) originVec.removeElementAt (0); originVec.add(0, new Integer (5)); //System.err.println("originVec: " + originVec); //--------case (3)--------------- if (iseq.size() > 3) { //System.err.println("test case 3 (backward reference) for executeReplaceRange(int, int, Object)"); try { executeReplaceRange (-(iseq.size()), -3 , new Integer (5)); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); } } else fail ("Sequence is too short to replace a subset of it"); }; ////////////////////////// public void testExecuteReplaceRange_case4back () { //--------case (4)--------------- if (iseq.size() > 3) { //System.err.println("test case 4 (backward reference) for executeReplaceRange(int, int, Object)"); // Create a vector for insert // the vector contains 3 elements Vector testVec = new Vector(4); testVec.add (0, new Integer (11)); testVec.add (1, new Integer (13)); testVec.add (2, new Integer (15)); testVec.add (3, new Integer (17)); //build the result vector explicitly for testing Vector originVec = cloneContent (); for (int idex = 0; idex <= iseq.size()-3; idex = idex + 1) originVec.removeElementAt (0); assertTrue (originVec.addAll (0, (Vector) testVec)); try { executeReplaceRange (-(iseq.size()), -3, testVec); } catch (ConstraintFailure e) { fail ("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences (originVec); } } else { fail ("Sequence is too short to replace a subset of it"); } }; public void testExecuteReplaceRange_case5back () { Vector originVec = cloneContent (); try { executeReplaceRange (-(iseq.size() + 9), -1, new Integer (8)); fail ("expected ConstraintFailure"); } catch (ConstraintFailure e) { //must go here because of out-of-range reference //System.err.println("Caught ConstraintFailure: " + e.getMessage()); } finally { //the content should be unchanged compareSequences (originVec); } }; } --- NEW FILE: memory.dfPackage --- package id60bk1d3g31efvd3g9s9b4; /** @version 2.0 @physicalPackage @__modelType diagram */ class diagram { /** @__ref <oiref:java#Class#test.org.nodal.storage.memory.TestmemGenericSequenceContent:oiref><oihard> @__modelType reference */ class reference { }/** @__ref <oiref:java#Class#test.storage.memory.TestmemOperator:oiref><oihard> @__modelType reference */ class reference11 { }}/** @__tags @shapeType ClassDiagram */ class __tags { }/** @__options */ class __options { }/** @__positions */ class __positions { } --- NEW FILE: TestmemStringContent.java --- //Modified by Charles Yiu package test.storage.memory; import junit.framework.TestCase; import org.nodal.Nodal; import org.nodal.Types; import org.nodal.model.CharSeq; import org.nodal.model.Getter; import org.nodal.model.Node; import org.nodal.model.SequenceNode; import org.nodal.model.Setter; import org.nodal.nav.Path.Failure; import org.nodal.type.SequenceType; import org.nodal.type.Schema; import org.nodal.util.ConstraintFailure; import org.nodal.util.IndexBoundsException; import org.nodal.util.PropertyConstraintFailure; import storage.trans.TransientRepository; /** JUnit TestCase. * @testfamily JUnit * @testkind testcase * @testsetup Default TestCase * @testedclass org.nodal.storage.memory.memGenericSequenceContent*/ public class TestmemStringContent extends TestCase { protected Schema.Editor typeDoc; protected SequenceType charSeqType; protected TransientRepository repo; protected SequenceNode cseq; protected SequenceNode.Editor cseqEd; protected Getter cseqAll; public TestmemStringContent(String name) { super(name); } /** Sets up the fixture, for example, open a network connection. * This method is called before a test is executed. */ protected void setUp() { try { repo = (TransientRepository) Nodal.openRepository("memory://transient"); } catch (Failure e) { fail(); } typeDoc = Types.createSchema("memory://transient/testme.nls").edit(); charSeqType = typeDoc.createSequenceType(Types.CHARACTER); Node n = repo.createNode(charSeqType); cseq = n.content().asSequenceNode(); cseqEd = cseq.editSequence(); //insert the initial content into the empty "cseq" object String testStr = "ABCDEF"; try { executeInsertBefore(0, testStr); cseqAll = cseq.range(0, -1); } catch (ConstraintFailure c) { throw new RuntimeException("ConstraintFailure in setup: " + c); } } /** Tears down the fixture, for example, close a network connection. * This method is called after a test is executed. */ protected void tearDown() { repo.close(); } public void testSize() { assertTrue(cseq.size() == 6); } public void testProperties() { //fail("not implemented"); } public void testValue() { //fail("not implemented"); } public void testItem() { //fail("not implemented"); } private StringBuffer cloneContent() { try { return new StringBuffer (((CharSeq) cseqAll.get()).toString()); } catch (PropertyConstraintFailure f) { fail("cseqAll.get() failed"); return null; } } private void checkIndex(int i) throws IndexBoundsException { cseq.item(i); } private void compareSequences(StringBuffer originArr) { try { assertTrue(cseqAll.valueEquals(originArr)); } catch (PropertyConstraintFailure f) { fail("cseqAll.get() failed"); } } private void removeRange(StringBuffer str, int s, int e) { int len = str.length(); int left = len - e - 1; for (int i = e + 1, j = s; i < len; ++i, ++j) str.setCharAt(j, str.charAt(i)); str.setLength(s + left); } void executeReplaceRange(int s, int e, Object v) throws ConstraintFailure { Setter setter = cseqEd.replaceRange(s, e); setter.set(v); } void executeRemoveRange(int s, int e) throws ConstraintFailure { Setter setter = cseqEd.replaceRange(s, e); setter.set(null); } void executeInsertBefore(int i, Object v) throws ConstraintFailure { Setter setter = cseqEd.insertBefore(i); setter.set(v); } void executeInsertAfter(int i, Object v) throws ConstraintFailure { Setter setter = cseqEd.insertAfter(i); setter.set(v); } public void testInsertAfter_case1() { String testStr11 = "abc"; //copy the original content for validation later StringBuffer originStr = cloneContent(); //manually insert val after the first item into the original content originStr.insert(1, testStr11); //System.out.println ("-- testInsertAfter_case1 --"); try { //(first item = index [0]) executeInsertAfter(0, testStr11); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { //System.out.println (" cseq.str = \""+cseq.str+"\""); //System.out.println (" origin = \""+originStr+"\""); compareSequences(originStr); assertTrue(cseq.size() == 9); } // cseq = [1, 2, 4, 6, 3, 5] try { // This will generate an IndexBoundsException checkIndex(9); fail("did not generate IndexBoundsException"); } catch (IndexBoundsException b) { assertTrue(b.getIndex() == 9); assertTrue(b.getMin() == -9); assertTrue(b.getMax() == 8); } }; public void testInsertAfter_case2() { String testStr12 = "def"; //boolean tmp = true; StringBuffer originStr = cloneContent(); //copy the original content for validation later //manually append val into the original content originStr.append(testStr12); //--------case (2)--------------- //System.err.println("originStr: " + originStr); //System.err.println("test case 2 for executeInsertAfter(int, Object)"); try { executeInsertAfter(cseq.size() - 1, testStr12); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originStr); } }; //************* public void testInsertAfter_case3() { String testStr13 = "ghi"; StringBuffer originStr = cloneContent(); //copy the original content for validation later //manually convert the backward index to forward one int idx = (originStr.length()) - 2; originStr.insert(idx + 1, testStr13); //--------case (3)--------------- //System.out.println ("-- testInsertAfter_case3 --"); if (cseq.size() > 3) { try { executeInsertAfter(-2, testStr13); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { //System.out.println (" cseq.str = \""+cseq.str+"\""); //System.out.println (" origin = \""+originStr+"\""); compareSequences(originStr); } } else fail("Sequence is too short for backward reference"); } public void testInsertAfter_case4() { String testStr22 = "jkl"; StringBuffer originStr = cloneContent(); //copy the original content for validation later originStr.insert((cseq.size() / 2 + 1), testStr22); //--------case (4)--------------- //System.err.println("originStr: " + originStr); //System.err.println("test case 4 for executeInsertAfter(int, Object)"); try { executeInsertAfter(cseq.size() / 2, testStr22); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originStr); } } public void testInsertAfter_case5() { String testStr15 = "mno"; StringBuffer originStr = cloneContent(); //copy the original content for validation later //--------case (5)--------------- //System.err.println("originStr: " + originStr); //System.err.println("test case 5 for executeInsertAfter(int, Object)"); try { executeInsertAfter(cseq.size() + 6, testStr15); fail("expected ConstraintFailure"); } catch (IndexBoundsException e) { //must go here because of out-of-range reference //System.err.println("[OK] Caught ConstraintFailure: " + e.getMessage()); } catch (ConstraintFailure e) { fail("unexpected ConstraintFailure"); } finally { compareSequences(originStr); } }; public void testInsertBefore_case1() { String testStr21 = "pqr"; StringBuffer originStr = new StringBuffer(testStr21); //begins with the inserted val try { originStr.append(((CharSeq) cseqAll.get()).toString()); } catch (PropertyConstraintFailure e) { fail("cseqAll.get() failed"); } //append memSequenceContent at the end //--------case (1)--------------- //System.err.println("originStr: " + originStr); //System.err.println("test case 1 for executeInsertBefore(int, Object)"); try { executeInsertBefore(0, testStr21); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originStr); } }; public void testInsertBefore_case2() { String testStr22 = "stu"; StringBuffer originStr = cloneContent(); //copy the original content for validation later originStr.insert(cseq.size() - 1, testStr22); //--------case (2)--------------- //System.err.println("originStr: " + originStr); //System.err.println("test case 2 for executeInsertBefore(int, Object)"); try { executeInsertBefore(cseq.size() - 1, testStr22); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originStr); } }; public void testInsertBefore_case3() { String testStr23 = "vwx"; StringBuffer originStr = cloneContent(); //copy the original content for validation later //manually convert the backward index to forward one //System.err.println("originStr: " + originStr); int idx = (originStr.length()) - 2; originStr.insert(idx, testStr23); //--------case (3)--------------- //System.err.println("test case 3 for executeInsertBefore(int, Object)"); if (cseq.size() > 3) { try { executeInsertBefore(-2, testStr23); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originStr); } } else fail("Sequence is too short for backward reference"); }; public void testInsertBefore_case4() { //System.err.println("***test case 4 for executeInsertBefore (int, object)"); String testStr24 = "yzq"; StringBuffer originStr = cloneContent(); //copy the original content for validation later originStr.insert((cseq.size() / 2), testStr24); //System.err.println("originStr: " + originStr); //--------case (4)--------------- //System.err.println("test case 4 for executeInsertBefore (int, Object)"); try { executeInsertBefore(cseq.size() / 2, testStr24); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originStr); } }; public void testInsertBefore_case5() { String testStr25 = "wer"; StringBuffer originStr = cloneContent(); //copy the original content for validation later //System.err.println("originStr: " + originStr); //--------case (5)--------------- //System.err.println("test case 5 for executeInsertBefore (int, Object)"); try { executeInsertBefore(cseq.size() + 6, testStr25); fail("expected ConstraintFailure"); } catch (IndexBoundsException e) { //must go here because of out-of-range reference //System.err.println("[OK] Caught ConstraintFailure: " + e.getMessage()); } catch (ConstraintFailure e) { fail("unexpected ConstraintFailure"); } finally { //the operation should return false due to out-of-range error compareSequences(originStr); } }; //=================================================================================== public void testRemoveRange_case1() { StringBuffer originStr = cloneContent(); //copy the original content for validation later //System.err.println("###originStr: " + originStr); int originStrSize = originStr.length(); removeRange(originStr, 1, originStrSize - 2); //System.out.println("-- testRemoveRange_case1 --"); if (cseq.size() > 3) { try { //System.err.println("cseq.size() "+cseq.size()); //Remove all the elements in the midde, i.e. exclude the first and last element executeRemoveRange(1, cseq.size() - 2); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { //System.out.println(" cseq.str: \""+cseq.str+"\""); //System.out.println("originStr: \""+originStr+"\""); compareSequences(originStr); } } else fail("Sequence is too short to remove a subset of it"); }; public void testRemoveRange_case2() { //--------case (2)--------------- //System.err.println("test case 2 for executeRemoveRange (int, int)"); try { //System.err.println("cseq.size() "+cseq.size()); executeRemoveRange(0, cseq.size() - 1); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { //System.err.println("cseq.str: "+cseq.str); // when the operation returns true AND the sequence is empty assertTrue(cseq.size() == 0); } }; public void testRemoveRange_case3() { StringBuffer originStr = cloneContent(); //copy the original content for validation later removeRange(originStr, cseq.size() / 2, cseq.size() / 2); //System.err.println("originStr: " + originStr); // when the operation returns true AND the sequence's size decreased by one //--------case (3)--------------- //System.err.println("test case 3 for executeRemoveRange (int, int)"); try { executeRemoveRange(cseq.size() / 2, cseq.size() / 2); //System.err.println("cseq.str: " + cseq.str); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originStr); } }; public void testRemoveRange_case4() { StringBuffer originStr = cloneContent(); //copy the original content for validation later //System.err.println("originStr: " + originStr); //--------case (4)--------------- //System.err.println("test case 4 for executeRemoveRange (int, int)"); try { executeRemoveRange(0, cseq.size() + 5); fail("expected ConstraintFailure"); } catch (IndexBoundsException e) { //must go here because of out-of-range reference //System.err.println("[OK] Caught ConstraintFailure: " + e.getMessage()); } catch (ConstraintFailure e) { fail("unexpected ConstraintFailure"); } finally { // the operation should return false due to out-of-range error compareSequences(originStr); } }; //======================================================================================== public void testReplaceRange_case1() { //copy the original content for validation later StringBuffer originStr = cloneContent(); //explicitly set the first element to be a 'd' originStr.setCharAt(0, 'd'); //System.err.println("originStr: " + originStr); //--------case (1)--------------- //replace the first element with a 'd' //System.out.println("-- testReplaceRange_case1 --"); try { executeReplaceRange(0, 0, new Character('d')); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originStr); } }; public void testReplaceRange_case2() { //--------case (2)--------------- // Create a vector for insert // the vector contains 3 elements String testStr = "poiu"; StringBuffer originStr = cloneContent(); removeRange(originStr, 0, 0); originStr.insert(0, testStr); try { executeReplaceRange(0, 0, testStr); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originStr); } }; public void testReplaceRange_case3() { //build the result vector explicitly for testing StringBuffer originStr = cloneContent(); int originStrSize = originStr.length(); removeRange(originStr, 1, originStrSize - 1); originStr.insert(1, 'e'); //System.err.println("originStr: " + originStr); //--------case (3)--------------- if (cseq.size() > 3) { // System.err.println("test case 3 for executeReplaceRange(int, int, Object)"); try { executeReplaceRange(1, cseq.size() - 1, new Character('e')); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originStr); } } else fail("Sequence is too short to replace a subset of it"); }; public void testReplaceRange_case4() { //--------case (4)--------------- if (cseq.size() > 3) { //System.err.println("test case 4 for executeReplaceRange(int, int, Object)"); //System.err.println("cseq.str: "+cseq.str); // Create a vector for insert // the vector contains 4 elements String testStr = "lkjh"; //System.err.println("Build Successful"); //build the result vector explicitly for testing StringBuffer originStr = cloneContent(); int originStrSize = originStr.length(); //System.err.println("originStr: "+originStr); //System.err.println("originStrSize-1: "+(originStrSize-1)); removeRange(originStr, 1, originStrSize - 1); //System.err.println("originStr now: "+originStr); originStr.insert(1, testStr); //System.err.println("finally originStr: "+originStr); try { executeReplaceRange(1, cseq.size() - 1, testStr); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originStr); } } else fail("Sequence is too short to replace a subset of it"); }; public void testReplaceRange_case5() { StringBuffer originStr = cloneContent(); //--------case (5)--------------- //System.err.println("test case 5 for executeReplaceRange(int, int, Object)"); try { executeReplaceRange(0, cseq.size() + 6, new Integer(8)); fail("expected ConstraintFailure"); } catch (IndexBoundsException e) { //must go here because of out-of-range reference // System.err.println("Caught ConstraintFailure: " + e.getMessage()); } catch (ConstraintFailure e) { fail("unexpected ConstraintFailure"); } finally { compareSequences(originStr); } }; //=============================================================================== //same test cases for BACKWARD REFERENCE public void testReplaceRange_case1back() { StringBuffer originStr = cloneContent(); //copy the original content for validation later originStr.setCharAt(originStr.length() - 1, 'h'); //System.err.println("originStr: " + originStr); //--------case (1)--------------- //replace the first element with an integer 8 try { executeReplaceRange(-1, -1, new Character('h')); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originStr); } }; public void testReplaceRange_case2back() { // Create a vector for insert // the vector contains 3 elements String testStr = "mnbv"; StringBuffer originStr = cloneContent(); //explicitly remove the 2nd last item removeRange(originStr, originStr.length() - 2, originStr.length() - 2); //shift the last item to the right, insert the testStr inbetween originStr.insert(originStr.length() - 1, testStr); //System.out.println("-- testReplaceRange_case2back --"); try { executeReplaceRange(-2, -2, testStr); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { //System.out.println (" cseq.str = \""+cseq.str+"\""); //System.out.println (" origin = \""+originStr+"\""); compareSequences(originStr); } }; public void testReplaceRange_case3back() { StringBuffer originStr = cloneContent(); //System.err.println("originStr: " + originStr); removeRange(originStr, 0, cseq.size() - 3); originStr.insert(0, 'e'); //System.err.println("originStr: " + originStr); //--------case (3)--------------- if (cseq.size() > 3) { //System.err.println("test case 3 (backward reference) for executeReplaceRange(int, int, Object)"); try { executeReplaceRange(- (cseq.size()), -3, new Character('e')); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originStr); } } else fail("Sequence is too short to replace a subset of it"); }; ////////////////////////// public void testReplaceRange_case4back() { //--------case (4)--------------- if (cseq.size() > 3) { //System.err.println("test case 4 (backward reference) for executeReplaceRange(int, int, Object)"); // Create a vector for insert // the vector contains 3 elements String testStr = "zxcv"; //build the result vector explicitly for testing StringBuffer originStr = cloneContent(); removeRange(originStr, 0, cseq.size() - 3); originStr.insert(0, testStr); try { executeReplaceRange(- (cseq.size()), -3, testStr); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originStr); } } else fail("Sequence is too short to replace a subset of it"); }; public void testReplaceRange_case5back() { StringBuffer originStr = cloneContent(); //--------case (5)--------------- //System.err.println("test case 5 (backward reference) for executeReplaceRange(int, int, Object)"); try { executeReplaceRange(- (cseq.size() + 9), -1, new Integer(8)); fail("expected ConstraintFailure"); } catch (IndexBoundsException e) { //must go here since out-of-range exception //System.err.println("Caught ConstraintFailure: " + e.getMessage()); } catch (ConstraintFailure e) { fail("unexpected ConstraintFailure"); } finally { //the content should be unchanged compareSequences(originStr); } }; } --- NEW FILE: TestPaths.java --- /* * * Distributed under the Apache Software License, Version 1.1 * (see below, or the file LICENSE for terms and conditions) * * Copyright (c) 2002 University of British Columbia. All rights reserved. * */ package test.storage.memory; import junit.framework.TestCase; import org.nodal.Nodal; import org.nodal.Types; import org.nodal.model.Node; import org.nodal.nav.Path.Failure; import org.nodal.type.SequenceType; import org.nodal.type.Schema; import storage.trans.TransientRepository; /** JUnit TestCase. * @testfamily JUnit * @testkind testcase * @testsetup Default TestCase * @testedclass org.nodal.storage.memory.memNode */ public class TestPaths extends TestCase { protected Schema.Editor typeDoc; protected SequenceType intSeqType; protected TransientRepository repo; public TestPaths(String name) { super(name); } /** Sets up the fixture, for example, open a network connection. * This method is called before a test is executed. */ protected void setUp() { try { repo = (TransientRepository) Nodal.openRepository ("memory://transient"); } catch (Failure e) { fail(); } typeDoc = Types.createSchema ("memory://transient/testme.nls").edit (); intSeqType = typeDoc.createSequenceType (Types.SHORT); //System.err.println ("Testing Paths: " + repo); } /** Tears down the fixture, for example, close a network connection. * This method is called after a test is executed. */ protected void tearDown() { repo.close (); } public void testBarePaths () { Node n = repo.createNode (intSeqType); //System.err.println (n.path ()); } } --- NEW FILE: Suite.java --- package test.storage.memory; import junit.framework.Test; import junit.framework.TestSuite; /** JUnit TestSuite. * @testfamily JUnit * @testkind testsuite * @testsetup Default TestSuite * @testpackage test.storage*/ public class Suite extends TestSuite { public Suite(String name) { super (name); } public static Test suite() { TestSuite result = new TestSuite ("Test storage.memory"); // Add calls to test cases here! result.addTestSuite(TestmemMapContent.class); result.addTestSuite(TestBareSequence.class); //result.addTestSuite(TestmemGenericSequenceContent.class); result.addTestSuite(TestmemIntSequenceContent.class); result.addTestSuite(TestmemStringContent.class); result.addTestSuite(TestmemOperator.class); result.addTestSuite(TestPaths.class); return result; } public static void main(String[] args) { junit.textui.TestRunner.run (suite()); } } --- NEW FILE: TestmemIntSequenceContent.java --- //Modified by Charles Yiu package test.storage.memory; import junit.framework.TestCase; import org.nodal.Nodal; import org.nodal.Types; import org.nodal.model.Getter; import org.nodal.model.Node; import org.nodal.model.SequenceNode; import org.nodal.model.Setter; import org.nodal.nav.Path; import org.nodal.nav.Path.Failure; import org.nodal.type.SequenceType; import org.nodal.type.Schema; import org.nodal.util.ConstraintFailure; import org.nodal.util.IndexBoundsException; import org.nodal.util.PropertyConstraintFailure; import storage.trans.TransientRepository; /** JUnit TestCase. * @testfamily JUnit * @testkind testcase * @testsetup Default TestCase * @testedclass org.nodal.storage.memory.memIntSequenceContent*/ public final class TestmemIntSequenceContent extends TestCase { protected Schema.Editor typeDoc; protected SequenceType intSeqType; protected TransientRepository repo; protected SequenceNode iseq; protected SequenceNode.Editor iseqEd; protected Getter iseqAll; public TestmemIntSequenceContent(String name) { super(name); } /** Sets up the fixture, for example, open a network connection. * This method is called before a test is executed. */ protected void setUp() { try { repo = (TransientRepository) Nodal.openRepository("memory://transient"); } catch (Failure e) { fail(); } typeDoc = Types.createSchema("memory://transient/testme.nds").edit(); intSeqType = typeDoc.createSequenceType(Types.INTEGER); Node n = repo.createNode(intSeqType); iseq = n.content().asSequenceNode(); iseqEd = iseq.editSequence(); //insert the initial content into the empty "iseq" object int testVec[] = { 1, 3, 5, 7, 9, 11 }; try { iseqAll = iseq.range(0, -1); executeInsertAfter(-1, testVec); } catch (ConstraintFailure f) { f.printStackTrace(System.err); throw new RuntimeException("failure in setup: " + f); } } /** Tears down the fixture, for example, close a network connection. * This method is called after a test is executed. */ protected void tearDown() { repo.close(); } public void testSize() { assertTrue(iseq.size() == 6); } public void testProperties() { //fail("not implemented"); } public void testValue() { //fail("not implemented"); } public void testItem() { //fail("not implemented"); } public void testRange () { // The full range Getter range1 = iseq.range(0, -1); Path path1 = range1.path(); System.out.println (range1+".path() = "+path1); // Partial range Getter range2 = iseq.range(0, 3); Path path2 = range2.path(); System.out.println (range2+".path() = "+path2); Getter range3 = iseq.range(0, -1); Path path3 = range3.path(); System.out.println (range2+".path() = "+path3); assertTrue (path1 == path3); } private void checkIndex(int i) throws IndexBoundsException { iseq.item(i); } private StringBuffer intSeqString(int[] v) { StringBuffer s = new StringBuffer(); s.append("["); for (int i = 0; i < v.length; ++i) { if (i > 0) s.append(" "); s.append(v[i]); } s.append("]"); return s; } private void compareSequences(int[] originArr) { try { assertTrue(iseqAll.valueEquals(originArr)); } catch (PropertyConstraintFailure f) { fail("cseqAll.get() failed"); } } void executeReplaceRange(int s, int e, Object v) throws ConstraintFailure { Setter setter = iseqEd.replaceRange(s, e); setter.set(v); } void executeRemoveRange(int s, int e) throws ConstraintFailure { Setter setter = iseqEd.replaceRange(s, e); setter.set(null); } void executeInsertBefore(int i, Object v) throws ConstraintFailure { Setter setter = iseqEd.insertBefore(i); setter.set(v); } void executeInsertAfter(int i, Object v) throws ConstraintFailure { Setter setter = iseqEd.insertAfter(i); setter.set(v); } public void testInsertAfter_case1() { int testVec11[] = { 2, 4, 6 }; //--------case (1)--------------- int[] originVec = { 1, 2, 4, 6, 3, 5, 7, 9, 11 }; //System.err.println("originVec: " + originVec); try { //(first item = index [0]) executeInsertAfter(0, testVec11); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originVec); assertTrue(iseq.size() == 9); } try { // This will generate an IndexBoundsException checkIndex(9); fail("did not generate IndexBoundsException"); } catch (IndexBoundsException b) { assertTrue(b.getIndex() == 9); assertTrue(b.getMin() == -9); assertTrue(b.getMax() == 8); } }; public void testInsertAfter_case2() { int testVec12[] = { 8, 10, 12 }; int originArr[] = { 1, 3, 5, 7, 9, 11, 8, 10, 12 }; //System.err.println("test case 2 for executeInsertAfter(int, Object)"); try { executeInsertAfter(iseq.size() - 1, testVec12); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originArr); } }; public void testInsertAfter_case3() { int testVec13[] = { 14, 16, 18 }; int originArr[] = { 1, 3, 5, 7, 9, 14, 16, 18, 11 }; //--------case (3)--------------- try { executeInsertAfter(-2, testVec13); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originArr); } } public void testInsertAfter_case4() { int testVec22[] = { 20, 22, 24 }; int originArr[] = { 1, 3, 5, 7, 20, 22, 24, 9, 11 }; try { executeInsertAfter(iseq.size() / 2, testVec22); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originArr); } } public void testInsertAfter_case5() { int testVec15[] = { 26, 28, 30 }; int originArr[] = { 1, 3, 5, 7, 9, 11 }; try { executeInsertAfter(iseq.size() + 6, testVec15); fail("expected ConstraintFailure"); } catch (IndexBoundsException e) { //must go here because of out-of-range reference //System.err.println("Caught ConstraintFailure: " + e.getMessage()); } catch (ConstraintFailure e) { fail("unexpected ConstraintFailure"); } finally { compareSequences(originArr); } }; //========================================================================== public void testInsertBefore_case1() { int testVec21[] = { 32, 34, 36 }; int originArr[] = { 32, 34, 36, 1, 3, 5, 7, 9, 11 }; try { executeInsertBefore(0, testVec21); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originArr); } }; public void testInsertBefore_case2() { int testVec22[] = { 38, 40, 42 }; int originArr[] = { 1, 3, 5, 7, 9, 38, 40, 42, 11 }; try { executeInsertBefore(iseq.size() - 1, testVec22); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originArr); } }; public void testInsertBefore_case3() { int testVec23[] = { 44, 46, 48 }; int originArr[] = { 1, 3, 5, 7, 44, 46, 48, 9, 11 }; try { executeInsertBefore(-2, testVec23); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originArr); } }; public void testInsertBefore_case4() { int testVec24[] = { 50, 52, 54 }; int originArr[] = { 1, 3, 5, 50, 52, 54, 7, 9, 11 }; try { executeInsertBefore(iseq.size() / 2, testVec24); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originArr); } }; public void testInsertBefore_case5() { int testVec25[] = { 56, 58, 60 }; int originArr[] = { 1, 3, 5, 7, 9, 11 }; try { executeInsertBefore(iseq.size() + 6, testVec25); fail("expected ConstraintFailure"); } catch (IndexBoundsException e) { //must go here because of out-of-range reference //System.err.println("Caught ConstraintFailure: " + e.getMessage()); } catch (ConstraintFailure e) { fail("unexpected ConstraintFailure"); } finally { compareSequences(originArr); } }; //============================================================================== public void testRemoveRange_case1() { int originArr[] = { 1, 11 }; try { //Remove all the elements in the midde //i.e. exclude the first and last element executeRemoveRange(1, iseq.size() - 2); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: " + e.getMessage()); } finally { compareSequences(originArr); } }; public void testRemoveRange_case2() { //--------case (2)--------------- try { executeRemoveRange(0, iseq.size() - 1); } catch (ConstraintFailure e) { fail("Caught ConstraintFailure: ... [truncated message content] |
From: Lee I. <le...@us...> - 2004-10-03 19:42:07
|
Update of /cvsroot/nodal/j-test In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11973/j-test Log Message: Directory /cvsroot/nodal/j-test added to the repository |
From: Lee I. <le...@us...> - 2004-09-15 20:57:28
|
Update of /cvsroot/nodal/nodal/j-src/storage/framework In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5231/storage/framework Modified Files: BasicNodeFactory.java AbstractRepository.java GeneratedNode.java RepoServices.java AbstractRepoServices.java SBNStreamServices.java AbstractNode.java SBNURLServices.java StreamBasedNode.java Added Files: NodeFactoryFramework.java Log Message: Substantial modifications for Node id save/restore on local file systems. --- NEW FILE: NodeFactoryFramework.java --- /* * Distributed under the Apache Software License, Version 1.1 * (see below, or the file LICENSE for terms and conditions) * * Copyright (c) 2004 University of British Columbia. All rights reserved. * * Created on Sep 9, 2004 by leei */ package storage.framework; import org.nodal.model.AnchorNode; import org.nodal.model.Node; import org.nodal.model.NodeContent; import org.nodal.nav.Path; import org.nodal.type.NodeType; /** * An interface that represents the basic framework for creating Node instances. * {@link BasicNodeFactory} is built on top of this interface, and at its most basic * it is provided by {@link RepoServices} * @see BasicNodeFactory * @see RepoServices * @author leei */ public interface NodeFactoryFramework { /** * Create a brand new Node with the given NodeType. The * <tt>context</tt> Node determines the base metadata for the new * Node, including permissions and versioning. * * @param type a NodeType describing the Node to be created * @param context a Node from which to inherit metadata context * @return a new Node of the given NodeType */ NodeContent.Editor createNode(NodeType type, Node context); /** * Clone a brand new Node copying the content from an existing * Node. The <tt>context</tt> Node determines the base metadata for * the new Node, including permissions and versioning. * @param node a Node from which to inherit type and initial content * @param context a Node from which to inherit metadata context * @return a new Node of cloned from node */ NodeContent.Editor cloneNode(Node node, Node context); /** * Create an AnchorNode with that references an absolute Path. * @param abs the absolute Path providing the reference * @return and AnchorNode that references the abs Path */ AnchorNode createAnchor(Path abs); /** * Create an AnchorNode with a relative Path reference to a given context * in the Repository. * @param context an absolute Path that provides context for the rel * @param rel a relative Path that is evaluated in context * @return an AnchorNode that evaluates the relative Path in context */ AnchorNode createAnchor(Path context, Path rel); } Index: RepoServices.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/RepoServices.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** RepoServices.java 14 May 2004 17:31:24 -0000 1.8 --- RepoServices.java 15 Sep 2004 20:57:14 -0000 1.9 *************** *** 11,20 **** import org.nodal.Repository; - import org.nodal.model.AnchorNode; - import org.nodal.model.Node; - import org.nodal.model.NodeContent; - import org.nodal.nav.Path; - import org.nodal.type.NodeType; - /** --- 11,14 ---- *************** *** 25,29 **** * @author Lee Iverson <le...@ec...> */ ! public interface RepoServices { /** * Return the Repository associated with these services. --- 19,23 ---- * @author Lee Iverson <le...@ec...> */ ! public interface RepoServices extends NodeFactoryFramework { /** * Return the Repository associated with these services. *************** *** 31,48 **** */ Repository repository(); - - /** - * Create a brand new Node with the given NodeType. The - * <tt>context</tt> Node determines the base metadata for the new - * Node, including permissions and versioning. - */ - NodeContent.Editor createNode(NodeType type, Node context); - - /** - * Clone a brand new Node copying the content from an existing - * Node. The <tt>context</tt> Node determines the base metadata for - * the new Node, including permissions and versioning. - */ - NodeContent.Editor cloneNode(Node node, Node context); /** --- 25,28 ---- *************** *** 60,78 **** */ void commitTxn (TxnManager.Resolver resolver); - - /** - * Create an AnchorNode with a relative Path reference to a given context - * in the Repository. - * @param context an absolute Path that provides context for the rel - * @param rel a relative Path that is evaluated in context - * @return an AnchorNode that evaluates the relative Path in context - */ - AnchorNode createAnchor(Path context, Path rel); - - /** - * Create an AnchorNode with that references an absolute Path. - * @param abs the absolute Path providing the reference - * @return and AnchorNode that references the abs Path - */ - AnchorNode createAnchor(Path abs); } --- 40,42 ---- Index: GeneratedNode.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/GeneratedNode.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** GeneratedNode.java 11 Feb 2004 19:20:17 -0000 1.3 --- GeneratedNode.java 15 Sep 2004 20:57:14 -0000 1.4 *************** *** 15,18 **** --- 15,19 ---- import org.nodal.type.NodeType; import org.nodal.util.CapabilityImpl; + import org.nodal.util.Name; import storage.memory.memContent; *************** *** 39,44 **** * @param type */ ! protected GeneratedNode(AbstractRepository repo, NodeType type) { ! super(repo, type); } --- 40,45 ---- * @param type */ ! protected GeneratedNode(AbstractRepository repo, NodeType type, Name id) { ! super(repo, type, id); } Index: BasicNodeFactory.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/BasicNodeFactory.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** BasicNodeFactory.java 14 May 2004 17:31:24 -0000 1.4 --- BasicNodeFactory.java 15 Sep 2004 20:57:14 -0000 1.5 *************** *** 22,38 **** */ public class BasicNodeFactory implements NodeFactory { ! private TxnManager txnMgr; ! private RepoServices services; /** * All we need to construct one of these is a set of RepoServices. */ ! public BasicNodeFactory(RepoServices services) { ! this.services = services; ! this.txnMgr = services.txnManager(); } public final NodeContent.Editor createNode(NodeType type) { ! NodeContent.Editor newNode = services.createNode(type, null); if (txnMgr != null) { txnMgr.addOpCreate(newNode, null, type); --- 22,38 ---- */ public class BasicNodeFactory implements NodeFactory { ! protected final TxnManager txnMgr; ! protected final NodeFactoryFramework fmwk; /** * All we need to construct one of these is a set of RepoServices. */ ! public BasicNodeFactory(NodeFactoryFramework fmwk, TxnManager txnMgr) { ! this.fmwk = fmwk; ! this.txnMgr = txnMgr; } public final NodeContent.Editor createNode(NodeType type) { ! NodeContent.Editor newNode = fmwk.createNode(type, null); if (txnMgr != null) { txnMgr.addOpCreate(newNode, null, type); *************** *** 42,46 **** public final NodeContent.Editor createNode(NodeType type, Node context) { ! NodeContent.Editor newNode = services.createNode(type, context); if (txnMgr != null) { txnMgr.addOpCreate(newNode, context, type); --- 42,46 ---- public final NodeContent.Editor createNode(NodeType type, Node context) { ! NodeContent.Editor newNode = fmwk.createNode(type, context); if (txnMgr != null) { txnMgr.addOpCreate(newNode, context, type); *************** *** 50,54 **** public final NodeContent.Editor cloneNode(Node node) { ! NodeContent.Editor newNode = services.cloneNode(node, null); if (txnMgr != null) { txnMgr.addOpClone (newNode, node, null); --- 50,54 ---- public final NodeContent.Editor cloneNode(Node node) { ! NodeContent.Editor newNode = fmwk.cloneNode(node, null); if (txnMgr != null) { txnMgr.addOpClone (newNode, node, null); *************** *** 58,62 **** public final NodeContent.Editor cloneNode(Node node, Node context) { ! NodeContent.Editor newNode = services.cloneNode(node, context); if (txnMgr != null) { txnMgr.addOpClone (newNode, node, context); --- 58,62 ---- public final NodeContent.Editor cloneNode(Node node, Node context) { ! NodeContent.Editor newNode = fmwk.cloneNode(node, context); if (txnMgr != null) { txnMgr.addOpClone (newNode, node, context); *************** *** 66,70 **** public final AnchorNode createAnchor(Path context, Path rel) { ! AnchorNode newNode = services.createAnchor(context, rel); if (txnMgr != null) { txnMgr.addOpAnchor(newNode, context, rel); --- 66,70 ---- public final AnchorNode createAnchor(Path context, Path rel) { ! AnchorNode newNode = fmwk.createAnchor(context, rel); if (txnMgr != null) { txnMgr.addOpAnchor(newNode, context, rel); *************** *** 74,78 **** public final AnchorNode createAnchor(Path abs) { ! AnchorNode newNode = services.createAnchor(abs); if (txnMgr != null) { txnMgr.addOpAnchor(newNode, abs); --- 74,78 ---- public final AnchorNode createAnchor(Path abs) { ! AnchorNode newNode = fmwk.createAnchor(abs); if (txnMgr != null) { txnMgr.addOpAnchor(newNode, abs); Index: AbstractRepoServices.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/AbstractRepoServices.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** AbstractRepoServices.java 14 May 2004 17:31:24 -0000 1.6 --- AbstractRepoServices.java 15 Sep 2004 20:57:14 -0000 1.7 *************** *** 10,15 **** package storage.framework; - import java.util.WeakHashMap; - import org.nodal.Repository; import org.nodal.model.AnchorNode; --- 10,13 ---- *************** *** 23,46 **** /** ! * This base class should be overriden to provide a facility for ! * creating new Nodes. ! * * @author Lee Iverson <le...@ec...> */ public abstract class AbstractRepoServices implements RepoServices { ! // NEXT Make nid generation potentially Document-dependant ! protected final Repository repo; protected final Store store; ! ! private final WeakHashMap nodes; private int nextIdx; - private Namespace ns; ! protected AbstractRepoServices(Repository repo, Store store) { this.repo = repo; this.store = store; ! this.ns = Names.getNamespace(repo.path()); nextIdx = 0; - nodes = new WeakHashMap(); } --- 21,58 ---- /** ! * This base class should be overriden to provide a facility for creating new ! * Nodes. ! * * @author Lee Iverson <le...@ec...> */ public abstract class AbstractRepoServices implements RepoServices { ! protected final AbstractRepository repo; protected final Store store; ! protected final Path path; ! protected final Namespace ns; private int nextIdx; ! protected AbstractRepoServices(AbstractRepository repo, Path path, Store store) { this.repo = repo; this.store = store; ! this.path = path; ! this.ns = Names.getNamespace(path); ! nextIdx = 0; ! } ! ! protected AbstractRepoServices(AbstractRepository repo, Path path) { ! this.repo = repo; ! this.store = null; ! this.path = path; ! this.ns = Names.getNamespace(path); ! nextIdx = 0; ! } ! ! protected AbstractRepoServices(AbstractRepository repo) { ! this.repo = repo; ! this.store = null; ! this.path = repo.path(); ! this.ns = Names.getNamespace(path); nextIdx = 0; } *************** *** 49,77 **** */ public final synchronized Name createNodeID(Node node) { ! Name nid = ns.name("N" + (nextIdx++)); ! nodes.put(nid, node); return nid; } /** * Recover a Node from a backing store. */ ! public final synchronized Node getNodeNamed(Name nid) { ! // If this is in the global Namespace, reseat it. ! if (nid.namespace().path() == null) { ! nid = ns.name(nid.string()); ! } ! ! // Check for existing association ! Node node = (Node) nodes.get(nid); ! if (node == null) { ! if (store != null) { ! node = store.recoverNode(nid); ! if (node != null) { ! nodes.put(nid, node); ! } } } ! return node; } --- 61,87 ---- */ public final synchronized Name createNodeID(Node node) { ! // NEXT Get rid of this and the two-argument associateID method ! Name nid = nextID(); ! repo.associateID(nid, node); return nid; } + public synchronized Name nextID() { + return ns.name("n" + (nextIdx++)); + } + /** * Recover a Node from a backing store. */ ! public final synchronized Node recoverNodeNamed(Name nid) { ! // Recover from store ! if (store != null) { ! Node node = store.recoverNode(nid); ! if (node != null) { ! repo.associateID(node); } + return node; } ! return null; } *************** *** 84,107 **** /** ! * Create a brand new Node with the given NodeType. The ! * <tt>context</tt> Node determines the base metadata for the new ! * Node, including permissions and versioning. */ public abstract NodeContent.Editor createNode(NodeType type, Node context); /** ! * Clone a brand new Node copying the content from an existing ! * Node. The <tt>context</tt> Node determines the base metadata for ! * the new Node, including permissions and versioning. */ public abstract NodeContent.Editor cloneNode(Node node, Node context); ! public abstract AnchorNode createAnchor (Path context, Path rel); ! ! public abstract AnchorNode createAnchor (Path abs); ! /** * Return the TxnManager used by this Repository. */ public abstract TxnManager txnManager(); ! } --- 94,117 ---- /** ! * Create a brand new Node with the given NodeType. The <tt>context</tt> ! * Node determines the base metadata for the new Node, including permissions ! * and versioning. */ public abstract NodeContent.Editor createNode(NodeType type, Node context); /** ! * Clone a brand new Node copying the content from an existing Node. The ! * <tt>context</tt> Node determines the base metadata for the new Node, ! * including permissions and versioning. */ public abstract NodeContent.Editor cloneNode(Node node, Node context); ! public abstract AnchorNode createAnchor(Path context, Path rel); ! ! public abstract AnchorNode createAnchor(Path abs); ! /** * Return the TxnManager used by this Repository. */ public abstract TxnManager txnManager(); ! } \ No newline at end of file Index: StreamBasedNode.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/StreamBasedNode.java,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** StreamBasedNode.java 2 Sep 2004 19:11:29 -0000 1.12 --- StreamBasedNode.java 15 Sep 2004 20:57:14 -0000 1.13 *************** *** 14,17 **** --- 14,18 ---- import java.net.URLConnection; import java.util.HashMap; + import java.util.Iterator; import java.util.Map; import org.nodal.Repository; *************** *** 38,42 **** public class StreamBasedNode extends ProxyNode implements Node { private NodeContent node; ! private Services services; private DocumentFormat format; --- 39,43 ---- public class StreamBasedNode extends ProxyNode implements Node { private NodeContent node; ! private LoadServices services; private DocumentFormat format; *************** *** 48,53 **** * @author leei */ ! public interface Services { ! Repository repository(); /** --- 49,69 ---- * @author leei */ ! public interface LoadServices { ! /** ! * Notify this set of LoadServices that we are reloading a Document with ! * known Node identities. ! * ! * @param reloading ! * a boolean establishing whether or not we are reloading a ! * Document with these LoadServices ! */ ! void setReloading(boolean reloading); ! ! /** ! * The RepoServices ! * ! * @return the RepoServices associated with this Document loading context ! */ ! RepoServices repoServices(); /** *************** *** 73,77 **** /** ! * A factory for building Node instances in the context of this stream loader. * * @return --- 89,94 ---- /** ! * A factory for building Node instances in the context of this stream ! * loader. * * @return *************** *** 80,91 **** /** - * A factory for building Node instances with temporary IDs in the context - * of this stream loader. - * - * @return - */ - NodeFactory tempFactory(); - - /** * A method to rename Nodes produced by the sequence. * --- 97,100 ---- *************** *** 95,106 **** /** ! * A list of NID names that represent the node names in DFS visit order. * ! * @return a list of NID names or null if unavailable */ Map getNIDMap(); /** ! * @param nidList */ void saveNIDMap(Map nidMap); --- 104,117 ---- /** ! * A Map of Path->NID for all Nodes in this Document. * ! * @return a Map of Path->NID for all Nodes in this Document */ Map getNIDMap(); /** ! * Save the Map of Path->NID for all of the Nodes in this Document. ! * ! * @param nidMap */ void saveNIDMap(Map nidMap); *************** *** 108,118 **** /** ! * Create a Document from a given set of StreamBasedNode.Services. * * @param services ! * a set of StreamBasedNode.Services that can define a Document * creation environment. */ ! public static Document createStreamDoc(Services services) throws IOException { NodeContent.Editor node = StreamBasedNode.createDocStreamNode(services); DocumentFormat format = DocumentFormat.Registry.get(services.mimeType()); --- 119,130 ---- /** ! * Create a Document from a given set of StreamBasedNode.LoadServices. * * @param services ! * a set of StreamBasedNode.LoadServices that can define a Document * creation environment. */ ! public static Document createStreamDoc(LoadServices services) ! throws IOException { NodeContent.Editor node = StreamBasedNode.createDocStreamNode(services); DocumentFormat format = DocumentFormat.Registry.get(services.mimeType()); *************** *** 120,128 **** } ! public static RecordNode.Editor createDocStreamNode(Services services) { try { ! RecordNode.Editor docNode = ! AbstractDocument.createDocumentNode(services.nodeFactory(), services.mimeType()); ! Node root = new StreamBasedNode (services); docNode.setField("root").setNode(root); return docNode; --- 132,140 ---- } ! public static RecordNode.Editor createDocStreamNode(LoadServices services) { try { ! RecordNode.Editor docNode = AbstractDocument.createDocumentNode(services ! .nodeFactory(), services.mimeType()); ! Node root = new StreamBasedNode(services); docNode.setField("root").setNode(root); return docNode; *************** *** 132,136 **** } ! private StreamBasedNode(Services services) { this.services = services; } --- 144,148 ---- } ! private StreamBasedNode(LoadServices services) { this.services = services; } *************** *** 142,146 **** */ public Repository repository() { ! return services.repository(); } --- 154,158 ---- */ public Repository repository() { ! return services.repoServices().repository(); } *************** *** 203,207 **** // This may be necessary to establish context dec.setURI(services.path().toURLString()); - // Load and decode the document graph InputStream in = services.inputStream(); --- 215,218 ---- *************** *** 209,215 **** Map nidMap = services.getNIDMap(); boolean restoring = (nidMap != null); ! NodeFactory factory = (restoring ? services.tempFactory() : services.nodeFactory()); Node root = dec.decode(in, factory); - // Restore the correct set of Node IDs if possible if (root != null) { --- 220,226 ---- Map nidMap = services.getNIDMap(); boolean restoring = (nidMap != null); ! services.setReloading(restoring); ! NodeFactory factory = services.nodeFactory(); Node root = dec.decode(in, factory); // Restore the correct set of Node IDs if possible if (root != null) { *************** *** 217,221 **** restoreNIDs(nidMap, root); } else { ! saveNIDs (root); } return root.content(); --- 228,232 ---- restoreNIDs(nidMap, root); } else { ! saveNIDs(root); } return root.content(); *************** *** 229,234 **** /** * @param root */ ! private void saveNIDs(Node root) { Map nidMap = new HashMap(); GraphIterator iter = new GraphIterator(root); --- 240,246 ---- /** * @param root + * @throws IOException */ ! private void saveNIDs(Node root) throws IOException { Map nidMap = new HashMap(); GraphIterator iter = new GraphIterator(root); *************** *** 236,247 **** Path path = iter.nextPath(); Node node = iter.nextNode(); ! System.out.println (""+path+" => "+node); ! nidMap.put (path, node.id()); } ! services.saveNIDMap (nidMap); } private void restoreNIDs(Map nidMap, Node root) throws IOException { GraphIterator iter = new GraphIterator(root); while (iter.hasNext()) { Path path = iter.nextPath(); --- 248,264 ---- Path path = iter.nextPath(); Node node = iter.nextNode(); ! if (node.id().isGlobal()) { ! throw new IOException("Attempt to save reference to temporary Node " ! + node); ! } ! //System.out.println (""+path+" => "+node); ! nidMap.put(path, node.id()); } ! services.saveNIDMap(nidMap); } private void restoreNIDs(Map nidMap, Node root) throws IOException { GraphIterator iter = new GraphIterator(root); + Map defer = null; while (iter.hasNext()) { Path path = iter.nextPath(); *************** *** 249,258 **** Name nid = (Name) nidMap.get(path); if (nid == null) { ! throw new IOException("NID map doesn't contain "+path); } - services.renameNode(node, nid); - nidMap.remove(path); } ! if (! nidMap.isEmpty()) { throw new IOException("Unused nodes in NID map"); } --- 266,305 ---- Name nid = (Name) nidMap.get(path); if (nid == null) { ! // This is likely to be a forward reference to a Path with a Node ! // selector PathOperator in it. Defer evaluation until all other Node id ! // assignments have been resolved. ! if (defer == null) { ! defer = new HashMap(); ! } ! System.out.println ("Defer rename "+path+" => "+node); ! defer.put(path, node); ! } else { ! services.renameNode(node, nid); ! nidMap.remove(path); } } ! // Now deal with these deferrals. ! // Repeatedly try to resolve deferred Path->Node pairs until we have no ! // more, or we don't change but still have some left (error!). ! while (defer != null && !defer.isEmpty()) { ! Iterator i = defer.keySet().iterator(); ! boolean changed = false; ! while (i.hasNext()) { ! Path path = (Path) i.next(); ! Node node = (Node) defer.get(path); ! Name nid = (Name) nidMap.get(path); ! if (nid != null) { ! services.renameNode(node, nid); ! nidMap.remove(path); ! changed = true; ! i.remove(); ! } ! } ! // Check if we've reached an impasse. ! if (!defer.isEmpty() && !changed) { ! throw new IOException("Unresolved Path->Node references in NIDMap."); ! } ! } ! if (!nidMap.isEmpty()) { throw new IOException("Unused nodes in NID map"); } Index: AbstractRepository.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/AbstractRepository.java,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** AbstractRepository.java 2 Mar 2004 00:15:35 -0000 1.13 --- AbstractRepository.java 15 Sep 2004 20:57:14 -0000 1.14 *************** *** 7,15 **** * */ - package storage.framework; import java.io.OutputStream; - import org.nodal.Repository; import org.nodal.filesystem.Directory; --- 7,13 ---- *************** *** 21,33 **** import org.nodal.util.CacheMap; import org.nodal.util.Name; import org.nodal.util.User; /** ! * A basic starting point for creating Repository instances that takes ! * care of some of the basic bookkeeping in a consistent manner. ! * * @author Lee Iverson <le...@ec...> */ - public abstract class AbstractRepository implements Repository { /** --- 19,31 ---- import org.nodal.util.CacheMap; import org.nodal.util.Name; + import org.nodal.util.Names; import org.nodal.util.User; /** ! * A basic starting point for creating Repository instances that takes care of ! * some of the basic bookkeeping in a consistent manner. ! * * @author Lee Iverson <le...@ec...> */ public abstract class AbstractRepository implements Repository { /** *************** *** 35,42 **** */ private static CacheMap repositories; /** * Use the cache of created Repositories to check for the existence of one. ! * @param p a Path reference to the Repository * @return a Repository with Path p or null */ --- 33,46 ---- */ private static CacheMap repositories; + private CacheMap repoIDMap; + + static int tempIDCount; + static private CacheMap tempIDMap = new CacheMap(); /** * Use the cache of created Repositories to check for the existence of one. ! * ! * @param p ! * a Path reference to the Repository * @return a Repository with Path p or null */ *************** *** 55,58 **** --- 59,63 ---- this.path = path; this.services = services; + this.repoIDMap = new CacheMap(); // Remember this Repository in the index. *************** *** 66,70 **** // Ensure that it is only set once. if (this.services != null && this.services != services) { ! throw new RuntimeException(this +".services initialized twice"); } this.services = services; --- 71,75 ---- // Ensure that it is only set once. if (this.services != null && this.services != services) { ! throw new RuntimeException(this + ".services initialized twice"); } this.services = services; *************** *** 91,95 **** public final Document document(Path docPath) throws Path.Failure { - // Only use the Document part of Path docPath = docPath.documentPath(); --- 96,99 ---- *************** *** 131,141 **** public abstract void close(); ! public final Node nodeNamed(Name nid) { ! //Namespace ns = nid.namespace(); ! ! return services.getNodeNamed(nid); } public final Document getNodeDocument(Name nid) { Node node = nodeNamed(nid); if (node == null) { --- 135,154 ---- public abstract void close(); ! public final Node nodeNamed(Name id) { ! Node node; ! if (id.isGlobal()) { ! node = (Node) tempIDMap.get(id); ! } else { ! node = (Node) repoIDMap.get(id); ! } ! if (node == null) { ! //Namespace ns = nid.namespace(); ! return services.recoverNodeNamed(id); ! } ! return node; } public final Document getNodeDocument(Name nid) { + // TODO What is getNodeDocument() for? Is it necessary at all? Node node = nodeNamed(nid); if (node == null) { *************** *** 165,168 **** --- 178,182 ---- return null; } + public Node root() { return node; *************** *** 173,185 **** } ! /* (non-Javadoc) * @see org.nodal.filesystem.Document#nodeFromName(org.nodal.util.Name) */ public Node nodeNamed(Name name) { // TODO Auto-generated method stub return null; } ! /* (non-Javadoc) * @see org.nodal.filesystem.Document#docNode() */ --- 187,204 ---- } ! /* ! * (non-Javadoc) ! * * @see org.nodal.filesystem.Document#nodeFromName(org.nodal.util.Name) */ public Node nodeNamed(Name name) { + // TODO Auto-generated method stub return null; } ! /* ! * (non-Javadoc) ! * * @see org.nodal.filesystem.Document#docNode() */ *************** *** 189,193 **** } ! /* (non-Javadoc) * @see org.nodal.filesystem.Document#nodeNamed(java.lang.String) */ --- 208,214 ---- } ! /* ! * (non-Javadoc) ! * * @see org.nodal.filesystem.Document#nodeNamed(java.lang.String) */ *************** *** 197,201 **** } ! /* (non-Javadoc) * @see org.nodal.filesystem.Document#asDirectory() */ --- 218,224 ---- } ! /* ! * (non-Javadoc) ! * * @see org.nodal.filesystem.Document#asDirectory() */ *************** *** 207,209 **** } } ! } --- 230,262 ---- } } ! ! /** ! * Remember the association between a Node and its id(). If the id() is a ! * global Name, then this is temporary and local and is stored in the global ! * map. If it is a local Name, then it is permanent and associated with the ! * Repositroy. ! * ! * @param node ! * the Node to be associated. ! */ ! public void associateID(Node node) { ! Name id = node.id(); ! associateID(id, node.bareNode()); ! } ! ! public synchronized void associateID(Name id, Node node) { ! if (id.isGlobal()) { ! tempIDMap.put(id, node); ! } else { ! repoIDMap.put(id, node); ! } ! } ! ! /** ! * Create a globally unique (within this runtime environment) temporary Node id. ! * @return a globally unique Name ! */ ! public synchronized static Name nextTempID () { ! return Names.getName ("t"+tempIDCount++); ! } ! } \ No newline at end of file Index: AbstractNode.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/AbstractNode.java,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** AbstractNode.java 5 May 2004 03:24:35 -0000 1.9 --- AbstractNode.java 15 Sep 2004 20:57:14 -0000 1.10 *************** *** 19,22 **** --- 19,23 ---- import org.nodal.nav.Path; import org.nodal.type.NodeType; + import org.nodal.util.Name; /** *************** *** 27,34 **** protected final AbstractRepository repo; protected Path path; ! protected AbstractNode(AbstractRepository repo, NodeType type) { this.repo = repo; this.type = type; } --- 28,59 ---- protected final AbstractRepository repo; protected Path path; + private Name id; ! protected AbstractNode(AbstractRepository repo, NodeType type, Name id) { this.repo = repo; this.type = type; + setID(id); + } + + /** + * Set/change the ID of a particular Node. We have two kinds of IDs, a + * temporary ID, distingushed by a global namespace, and a permanent ID, which + * has a local namespace. + * + * @param id + * the Name to be associated with this Node. + */ + public void setID(Name id) { + if (this.id != id) { + if (this.id != null) { + if (!this.id.isGlobal()) { + throw new RuntimeException("Attempt to reset permanent Node ID " + + this); + } + //System.out.println("Rename " + this.id + " -> " + id); + } + this.id = id; + repo.associateID(this); + } } *************** *** 133,135 **** return "Node[" + path().toURLString() + "]"; } ! } --- 158,164 ---- return "Node[" + path().toURLString() + "]"; } ! ! public final Name id() { ! return id; ! } ! } \ No newline at end of file Index: SBNStreamServices.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/SBNStreamServices.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** SBNStreamServices.java 2 Sep 2004 19:11:29 -0000 1.6 --- SBNStreamServices.java 15 Sep 2004 20:57:14 -0000 1.7 *************** *** 13,17 **** import java.util.Map; - import org.nodal.Repository; import org.nodal.model.Node; import org.nodal.model.NodeFactory; --- 13,16 ---- *************** *** 21,37 **** public class SBNStreamServices extends BasicNodeFactory implements ! StreamBasedNode.Services { ! String mimeType; ! final InputStream stream; ! final Path path; ! final AbstractRepository repo; ! ! public SBNStreamServices(AbstractRepository repo, Path path, InputStream stream, String mimeType) throws IOException { ! super(repo.services); ! this.repo = repo; this.path = path; this.stream = stream; this.mimeType = mimeType; } --- 20,38 ---- public class SBNStreamServices extends BasicNodeFactory implements ! StreamBasedNode.LoadServices { ! protected String mimeType; ! protected final InputStream stream; ! protected final Path path; ! protected final RepoServices svc; ! protected boolean reloading; ! ! public SBNStreamServices(RepoServices svc, Path path, InputStream stream, String mimeType) throws IOException { ! super(svc, svc.txnManager()); ! this.svc = svc; this.path = path; this.stream = stream; this.mimeType = mimeType; + this.reloading = false; } *************** *** 40,56 **** } /* * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.Services#repository() */ ! public Repository repository() { ! return repo; } ! /* * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.Services#path() */ public Path path() { --- 41,61 ---- } + public void setReloading (boolean reloading) { + this.reloading = reloading; + } + /* * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.LoadServices#repoServices() */ ! public RepoServices repoServices() { ! return svc; } ! /* * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.LoadServices#path() */ public Path path() { *************** *** 61,65 **** * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.Services#inputStream() */ public InputStream inputStream() { --- 66,70 ---- * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.LoadServices#inputStream() */ public InputStream inputStream() { *************** *** 70,74 **** * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.Services#nodeFactory() */ public NodeFactory nodeFactory() { --- 75,79 ---- * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.LoadServices#nodeFactory() */ public NodeFactory nodeFactory() { *************** *** 76,85 **** } - public NodeFactory tempFactory() { - return this; - } - /* (non-Javadoc) ! * @see storage.framework.StreamBasedNode.Services#nidList() */ public Map getNIDMap() { --- 81,86 ---- } /* (non-Javadoc) ! * @see storage.framework.StreamBasedNode.LoadServices#nidList() */ public Map getNIDMap() { *************** *** 88,92 **** /* (non-Javadoc) ! * @see storage.framework.StreamBasedNode.Services#nidList() */ public void saveNIDMap(Map map) { --- 89,93 ---- /* (non-Javadoc) ! * @see storage.framework.StreamBasedNode.LoadServices#nidList() */ public void saveNIDMap(Map map) { *************** *** 94,98 **** /* (non-Javadoc) ! * @see storage.framework.StreamBasedNode.Services#renameNode(org.nodal.model.Node, org.nodal.util.Name) */ public boolean renameNode(Node node, Name nid) { --- 95,99 ---- /* (non-Javadoc) ! * @see storage.framework.StreamBasedNode.LoadServices#renameNode(org.nodal.model.Node, org.nodal.util.Name) */ public boolean renameNode(Node node, Name nid) { Index: SBNURLServices.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/framework/SBNURLServices.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** SBNURLServices.java 20 Feb 2004 20:32:37 -0000 1.1 --- SBNURLServices.java 15 Sep 2004 20:57:14 -0000 1.2 *************** *** 20,24 **** public SBNURLServices(AbstractRepository repo, Path path, URL url) throws IOException { ! super (repo, path, url.openConnection().getInputStream(), null); this.url = url; --- 20,24 ---- public SBNURLServices(AbstractRepository repo, Path path, URL url) throws IOException { ! super (repo.services, path, url.openConnection().getInputStream(), null); this.url = url; |
From: Lee I. <le...@us...> - 2004-09-15 20:57:27
|
Update of /cvsroot/nodal/nodal/j-src/storage/file In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5231/storage/file Modified Files: FileRepository.java FileNode.java FileDocument.java FileDirMap.java Log Message: Substantial modifications for Node id save/restore on local file systems. Index: FileDirMap.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/file/FileDirMap.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** FileDirMap.java 11 Feb 2004 19:20:18 -0000 1.3 --- FileDirMap.java 15 Sep 2004 20:57:15 -0000 1.4 *************** *** 38,49 **** private File file; private Path docPath; - private Name id; private long updated; FileDirMap(FileRepository repo, Path docPath, Name id, File file) { ! super(repo, (NodeType) Types.DIRTYPE.fieldType("root")); this.file = file; this.docPath = docPath; - this.id = id; this.files = new HashSet(); boolean canRead = file.canRead(); --- 38,47 ---- private File file; private Path docPath; private long updated; FileDirMap(FileRepository repo, Path docPath, Name id, File file) { ! super(repo, (NodeType) Types.DIRTYPE.fieldType("root"), id); this.file = file; this.docPath = docPath; this.files = new HashSet(); boolean canRead = file.canRead(); *************** *** 95,99 **** protected Path createPath() { ! return Paths.directPath(this, docPath, id); } --- 93,97 ---- protected Path createPath() { ! return Paths.directPath(this, docPath, id()); } *************** *** 102,109 **** } - public Name id() { - return id; - } - public NodeHistory history() { // TODO Auto-generated method stub --- 100,103 ---- Index: FileNode.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/file/FileNode.java,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** FileNode.java 2 Mar 2004 19:36:35 -0000 1.7 --- FileNode.java 15 Sep 2004 20:57:15 -0000 1.8 *************** *** 10,18 **** import java.io.File; - import org.nodal.model.Node; import org.nodal.model.NodeContent; import org.nodal.model.NodeHistory; - import org.nodal.nav.Path; import org.nodal.nav.Paths; --- 10,16 ---- *************** *** 21,26 **** import org.nodal.util.CapabilityImpl; import org.nodal.util.Name; - import storage.framework.AbstractNode; import storage.memory.memContent; --- 19,24 ---- import org.nodal.util.CapabilityImpl; import org.nodal.util.Name; import storage.framework.AbstractNode; + import storage.framework.RepoServices; import storage.memory.memContent; *************** *** 28,36 **** * * Created on Dec 4, 2003 * @author leei */ class FileNode extends AbstractNode { protected final Path docPath; - protected final Name id; protected final File fileContext; protected final FileRepository fileRepo; --- 26,34 ---- * * Created on Dec 4, 2003 + * * @author leei */ class FileNode extends AbstractNode { protected final Path docPath; protected final File fileContext; protected final FileRepository fileRepo; *************** *** 41,117 **** /** * Create a new FileNode given a type and FileNode for context. ! * @param repository the FileRepository to use ! * @param type the type of the new FileNode ! * @param fcontext the FileNode to use for context ! * @return a new FileNode */ ! static FileNode createNode( ! Path docPath, ! Name id, ! NodeType type, ! FileNode fcontext) { ! return createNode( ! fcontext.fileRepo, ! docPath, ! id, ! type, ! fcontext.fileContext); } /** * Create a new FileNode with the given type. ! * @param repo the FileRepository within which this Node is created ! * @param t the NodeType for the FileNode ! * @param fileContext a File reference within which this Node will be created * @return a new FileNode of the given type */ ! static FileNode createNode( ! FileRepository repo, ! Path docPath, ! Name id, ! NodeType t, ! File fileContext) { ! return new FileNode(repo, docPath, id, memContent.create(t), fileContext); } /** * Clone an existing Node in the FileNode context. ! * @param node the Node to be cloned. ! * @param fcontext the FileNode to use for context * @return a new FileNode with the cloned context */ ! static FileNode cloneNode( ! Path docPath, ! Name id, ! Node node, ! FileNode fcontext) { memContent c = memContent.ingest(node.content()); ! return new FileNode( ! fcontext.fileRepo, ! docPath, ! id, ! c, ! fcontext.fileContext); } /** ! * The only constructor for FileNode. Must be accessed via one of the ! * static constructor methods. ! * @param repo the FileRepository within which this Node is ! * @param docPath a Path to the containing Document ! * @param id the Name that identifies this Node ! * @param c the initial content of the Node. ! * @param fileContext a File reference to provide context for this Node */ ! protected FileNode( ! FileRepository repo, ! Path docPath, ! Name id, ! memContent c, ! File file) { ! super(repo, c.type()); this.fileRepo = repo; this.docPath = docPath; - this.id = id; this.fileContext = file; this.bareContent = c; --- 39,112 ---- /** * Create a new FileNode given a type and FileNode for context. ! * ! * @param repository ! * the FileRepository to use ! * @param type ! * the type of the new FileNode ! * @param fcontext ! * the FileNode to use for context ! * @return a new FileNode */ ! static NodeContent.Editor createNode(RepoServices svc, Path docPath, Name id, ! NodeType type, FileNode fcontext) { ! return createNode(svc, docPath, id, type, fcontext.fileContext); } /** * Create a new FileNode with the given type. ! * ! * @param repo ! * the FileRepository within which this Node is created ! * @param t ! * the NodeType for the FileNode ! * @param fileContext ! * a File reference within which this Node will be created * @return a new FileNode of the given type */ ! static NodeContent.Editor createNode(RepoServices svc, Path docPath, Name id, ! NodeType t, File fileContext) { ! memContent c = memContent.create(t); ! FileNode fnode = new FileNode((FileRepository) svc.repository(), docPath, ! id, c, fileContext); ! return c.initEdit(fnode, svc); } /** * Clone an existing Node in the FileNode context. ! * ! * @param node ! * the Node to be cloned. ! * @param fcontext ! * the FileNode to use for context * @return a new FileNode with the cloned context */ ! static NodeContent.Editor cloneNode(RepoServices services, Path docPath, ! Name id, Node node, FileNode fcontext) { memContent c = memContent.ingest(node.content()); ! FileNode fnode = new FileNode(fcontext.fileRepo, docPath, id, c, ! fcontext.fileContext); ! return c.initEdit(fnode, services); } /** ! * The only constructor for FileNode. Must be accessed via one of the static ! * constructor methods. ! * ! * @param repo ! * the FileRepository within which this Node is ! * @param docPath ! * a Path to the containing Document ! * @param id ! * the Name that identifies this Node ! * @param c ! * the initial content of the Node. ! * @param fileContext ! * a File reference to provide context for this Node */ ! protected FileNode(FileRepository repo, Path docPath, Name id, memContent c, ! File file) { ! super(repo, c.type(), id); this.fileRepo = repo; this.docPath = docPath; this.fileContext = file; this.bareContent = c; *************** *** 119,123 **** } ! /* (non-Javadoc) * @see org.nodal.model.Node#capability() */ --- 114,120 ---- } ! /* ! * (non-Javadoc) ! * * @see org.nodal.model.Node#capability() */ *************** *** 127,137 **** } - /* (non-Javadoc) - * @see org.nodal.model.Node#id() - */ - public Name id() { - return id; - } - public NodeContent content() { if (content == null && bareContent != null) { --- 124,127 ---- *************** *** 141,145 **** } ! /* (non-Javadoc) * @see org.nodal.model.Node#history() */ --- 131,137 ---- } ! /* ! * (non-Javadoc) ! * * @see org.nodal.model.Node#history() */ *************** *** 149,157 **** } ! /* (non-Javadoc) * @see storage.framework.AbstractNode#createPath() */ protected Path createPath() { ! return Paths.directPath(this, docPath, id); } ! } --- 141,151 ---- } ! /* ! * (non-Javadoc) ! * * @see storage.framework.AbstractNode#createPath() */ protected Path createPath() { ! return Paths.directPath(this, docPath, id()); } ! } \ No newline at end of file Index: FileRepository.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/file/FileRepository.java,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** FileRepository.java 2 Sep 2004 19:11:30 -0000 1.26 --- FileRepository.java 15 Sep 2004 20:57:15 -0000 1.27 *************** *** 7,11 **** * Created on Nov 26, 2003 */ - package storage.file; --- 7,10 ---- *************** *** 14,18 **** import java.net.MalformedURLException; import java.net.URL; - import org.nodal.filesystem.Document; import org.nodal.model.AnchorNode; --- 13,16 ---- *************** *** 24,34 **** import org.nodal.type.NodeType; import org.nodal.util.CacheMap; - import org.nodal.util.Name; - import org.nodal.util.Names; - import org.nodal.util.Namespace; - import storage.framework.AbstractRepoServices; import storage.framework.AbstractRepository; import storage.framework.AnchorNodeImpl; import storage.framework.SimpleTxnManager; import storage.framework.TxnManager; --- 22,29 ---- import org.nodal.type.NodeType; import org.nodal.util.CacheMap; import storage.framework.AbstractRepoServices; import storage.framework.AbstractRepository; import storage.framework.AnchorNodeImpl; + import storage.framework.BasicNodeFactory; import storage.framework.SimpleTxnManager; import storage.framework.TxnManager; *************** *** 36,41 **** /** * A Repository that merely accesses files from a local filesystem and ! * interprets them using the Nodal API. ! * Created on Nov 26, 2003 * @author leei */ --- 31,36 ---- /** * A Repository that merely accesses files from a local filesystem and ! * interprets them using the Nodal API. Created on Nov 26, 2003 ! * * @author leei */ *************** *** 44,132 **** * * Created on Nov 26, 2003 * @author leei */ ! private static final class Services extends AbstractRepoServices { private FileRepository frepo; - private NodeFactory factory; private TxnManager txnManager; ! /** * A set of basic services for the AbstractRepository. * @param repo * @param store */ ! protected Services(FileRepository repo /*, Store store*/ ) { ! super(repo, null); frepo = repo; ! factory = repo.nodeFactory(repo.rootFile); } ! /* (non-Javadoc) ! * @see storage.framework.RepoServices#createNode(org.nodal.type.NodeType, org.nodal.model.Node) */ public NodeContent.Editor createNode(NodeType type, Node context) { FileNode fcontext = (FileNode) context; ! if (context == null) { ! return factory.createNode(type, context); ! } else { ! NodeFactory f = frepo.nodeFactory(fcontext.fileContext); ! return f.createNode(type, context); ! } } ! /* (non-Javadoc) ! * @see storage.framework.RepoServices#cloneNode(org.nodal.model.Node, org.nodal.model.Node) */ public NodeContent.Editor cloneNode(Node node, Node context) { FileNode fcontext = (FileNode) context; ! if (context == null) { ! return factory.cloneNode(node, context); ! } else { ! NodeFactory f = frepo.nodeFactory(fcontext.fileContext); ! return f.cloneNode(node, context); ! } } ! public AnchorNode createAnchor (Path context, Path rel) { ! return AnchorNodeImpl.createWithContext (rel, context); } ! ! public AnchorNode createAnchor (Path abs) { ! return AnchorNodeImpl.create (abs); } ! ! /* (non-Javadoc) * @see storage.framework.RepoServices#txnManager() */ public TxnManager txnManager() { if (txnManager == null) { ! txnManager = SimpleTxnManager.create (this); } return txnManager; } ! /* (non-Javadoc) * @see storage.framework.RepoServices#commitTxn(storage.memory.TxnResolver) */ public void commitTxn(TxnManager.Resolver txn) { //NEXT We need to go through this Txn and write out all affected Docs ! System.err.println ("Commit "+txn); } } private File rootFile; /** * Create a Repository that communicvates via HTTP. ! * @param uri the URI of this Repository */ FileRepository(Path path) throws IOException { super(path, null); - // Remove file: prefix from pathname. String rootName = path.toURLString().substring(5); this.rootFile = new File(rootName); ! // Check that file exists and is a directory. if (!rootFile.exists()) { --- 39,164 ---- * * Created on Nov 26, 2003 + * * @author leei */ ! static class Services extends AbstractRepoServices { private FileRepository frepo; private TxnManager txnManager; ! private File file; ! private BasicNodeFactory factory; ! /** * A set of basic services for the AbstractRepository. + * * @param repo * @param store */ ! protected Services(FileRepository repo, File file /* , Store store */ ) { ! super(repo, pathFromFile(file), null); frepo = repo; ! this.file = file; } ! private Path path() { ! return path; ! } ! ! NodeFactory nodeFactory() { ! if (factory == null) { ! factory = new BasicNodeFactory(this, txnManager()); ! } ! return factory; ! } ! ! /* ! * (non-Javadoc) ! * ! * @see org.nodal.model.NodeFactory#createNode(org.nodal.type.NodeType) ! */ ! public NodeContent.Editor createNode(NodeType type) { ! return FileNode.createNode(this, path(), nextID(), type, file); ! } ! ! /* ! * (non-Javadoc) ! * ! * @see org.nodal.model.NodeFactory#createNode(org.nodal.type.NodeType, ! * org.nodal.model.Node) */ public NodeContent.Editor createNode(NodeType type, Node context) { FileNode fcontext = (FileNode) context; ! File contextFile = (fcontext == null ? file : fcontext.fileContext); ! return FileNode.createNode(this, path(), nextID(), type, contextFile); } ! /* ! * (non-Javadoc) ! * ! * @see org.nodal.model.NodeFactory#cloneNode(org.nodal.model.Node) ! */ ! public NodeContent.Editor cloneNode(Node node) { ! FileNode fnode = (FileNode) node; ! return FileNode.cloneNode(this, path(), nextID(), node, fnode); ! } ! ! /* ! * (non-Javadoc) ! * ! * @see org.nodal.model.NodeFactory#cloneNode(org.nodal.model.Node, ! * org.nodal.model.Node) */ public NodeContent.Editor cloneNode(Node node, Node context) { FileNode fcontext = (FileNode) context; ! return FileNode.cloneNode(this, path(), nextID(), node, fcontext); } ! public AnchorNode createAnchor(Path context, Path rel) { ! return AnchorNodeImpl.createWithContext(rel, context); } ! ! public AnchorNode createAnchor(Path abs) { ! return AnchorNodeImpl.create(abs); } ! ! /* ! * (non-Javadoc) ! * * @see storage.framework.RepoServices#txnManager() */ public TxnManager txnManager() { if (txnManager == null) { ! txnManager = SimpleTxnManager.create(this); } return txnManager; } ! /* ! * (non-Javadoc) ! * * @see storage.framework.RepoServices#commitTxn(storage.memory.TxnResolver) */ public void commitTxn(TxnManager.Resolver txn) { //NEXT We need to go through this Txn and write out all affected Docs ! System.err.println("Commit " + txn); } } private File rootFile; + private CacheMap allServices; + private CacheMap idMap; /** * Create a Repository that communicvates via HTTP. ! * ! * @param uri ! * the URI of this Repository */ FileRepository(Path path) throws IOException { super(path, null); // Remove file: prefix from pathname. String rootName = path.toURLString().substring(5); this.rootFile = new File(rootName); ! // Check that file exists and is a directory. if (!rootFile.exists()) { *************** *** 136,149 **** throw new IOException("Non-directory file: " + rootName); } // Canonicalize the file. rootFile = rootFile.getCanonicalFile(); ! // Cannot initialize this until rootFile established. ! setServices(new Services(this)); ! //System.out.println ("Create "+this); } ! /* (non-Javadoc) * @see org.nodal.Repository#close() */ --- 168,196 ---- throw new IOException("Non-directory file: " + rootName); } + // Canonicalize the file. rootFile = rootFile.getCanonicalFile(); ! // Cannot initialize this until rootFile established. ! allServices = new CacheMap(); ! setServices(services(rootFile)); //System.out.println ("Create "+this); + + // Create the ID->Node map for permanent IDs + idMap = new CacheMap(); } ! Services services(File file) { ! Services svc = (Services) allServices.get(file); ! if (svc == null) { ! svc = new Services(this, file); ! allServices.put(file, svc); ! } ! return svc; ! } ! ! /* ! * (non-Javadoc) ! * * @see org.nodal.Repository#close() */ *************** *** 172,177 **** } ! FileNodeFactory nodeFactory(File f) { ! return FileNodeFactory.create(this, f); } --- 219,224 ---- } ! NodeFactory nodeFactory(File f) { ! return services(f).nodeFactory(); } *************** *** 191,270 **** } ! static class FileNodeFactory implements NodeFactory { ! private File file; ! private Path path; ! private Namespace ns; ! private FileRepository repo; ! private int count; ! ! private static CacheMap factories = new CacheMap(); ! ! static FileNodeFactory create(FileRepository repo, File f) { ! FileNodeFactory factory = (FileNodeFactory) factories.get(f); ! if (factory == null) { ! factory = new FileNodeFactory(repo, f); ! factories.put(f, factory); ! } ! return factory; ! } ! ! protected FileNodeFactory(FileRepository repo, File file) { ! this.repo = repo; ! this.file = file; ! this.path = pathFromFile(file); ! this.ns = Names.getNamespace(path); ! this.count = 0; ! } ! ! Name nextID() { ! return ns.name("n" + count++); ! } ! ! private Path path() { ! return path; ! } ! ! /* (non-Javadoc) ! * @see org.nodal.model.NodeFactory#createNode(org.nodal.type.NodeType) ! */ ! public NodeContent.Editor createNode(NodeType type) { ! FileNode node = FileNode.createNode(repo, path(), nextID(), type, file); ! return node.content().edit(); ! } ! ! /* (non-Javadoc) ! * @see org.nodal.model.NodeFactory#createNode(org.nodal.type.NodeType, org.nodal.model.Node) ! */ ! public NodeContent.Editor createNode(NodeType type, Node context) { ! FileNode fcontext = (FileNode) context; ! FileNode node = FileNode.createNode(path(), nextID(), type, fcontext); ! return node.content().edit(); ! } ! ! /* (non-Javadoc) ! * @see org.nodal.model.NodeFactory#cloneNode(org.nodal.model.Node) ! */ ! public NodeContent.Editor cloneNode(Node node) { ! FileNode fnode = (FileNode) node; ! FileNode clone = FileNode.cloneNode(path(), nextID(), node, fnode); ! return clone.content().edit(); ! } ! ! /* (non-Javadoc) ! * @see org.nodal.model.NodeFactory#cloneNode(org.nodal.model.Node, org.nodal.model.Node) ! */ ! public NodeContent.Editor cloneNode(Node node, Node context) { ! FileNode fcontext = (FileNode) context; ! FileNode clone = FileNode.cloneNode(path(), nextID(), node, fcontext); ! return clone.content().edit(); ! } ! ! public AnchorNode createAnchor (Path context, Path rel) { ! return AnchorNodeImpl.createWithContext (rel, context); ! } ! ! public AnchorNode createAnchor (Path abs) { ! return AnchorNodeImpl.create (abs); ! } } ! } --- 238,248 ---- } ! /** ! * Remember the association between the ID and the Node so that it can be ! * recovered later. ! * @param node a FileNode with a permanent ID ! */ ! void associateID(FileNode node) { ! idMap.put (node.id(), node); } ! } \ No newline at end of file Index: FileDocument.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/file/FileDocument.java,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** FileDocument.java 2 Sep 2004 19:11:30 -0000 1.18 --- FileDocument.java 15 Sep 2004 20:57:15 -0000 1.19 *************** *** 15,23 **** import java.util.HashMap; import java.util.Map; - import jdbm.JDBMHashtable; import jdbm.JDBMRecordManager; - - import org.nodal.Repository; import org.nodal.Types; import org.nodal.filesystem.Document; --- 15,20 ---- *************** *** 29,37 **** import org.nodal.util.ConstraintFailure; import org.nodal.util.Name; - import org.nodal.util.Names; import storage.framework.AbstractDocument; import storage.framework.DocFromNode; import storage.framework.StreamBasedNode; /** --- 26,37 ---- import org.nodal.util.ConstraintFailure; import org.nodal.util.Name; import storage.framework.AbstractDocument; + import storage.framework.AbstractRepository; import storage.framework.DocFromNode; + import storage.framework.RepoServices; import storage.framework.StreamBasedNode; + import storage.framework.TxnManager; + import storage.framework.TxnManager.Resolver; /** *************** *** 41,45 **** */ abstract class FileDocument { - /** * A File->Document cache. --- 41,44 ---- *************** *** 64,75 **** return null; } - } - // Don't even try if it doesn't exist... if (!file.exists()) { return null; } - // Recover or create a Document from the file. AbstractDocument doc = (AbstractDocument) fileMap.get(file); --- 63,71 ---- *************** *** 78,87 **** } else if (file.isDirectory()) { Path path = FileRepository.pathFromFile(file); ! FileRepository.FileNodeFactory factory = repo.nodeFactory(file); RecordNode.Editor docEditor = factory.createNode(Types.DIRTYPE) .editRecord(); try { docEditor.setField("root").set( ! new FileDirMap(repo, path, factory.nextID(), file)); } catch (ConstraintFailure e) { throw new RuntimeException("Failed setting directory root", e); --- 74,84 ---- } else if (file.isDirectory()) { Path path = FileRepository.pathFromFile(file); ! FileRepository.Services svc = repo.services(file); ! NodeFactory factory = svc.nodeFactory(); RecordNode.Editor docEditor = factory.createNode(Types.DIRTYPE) .editRecord(); try { docEditor.setField("root").set( ! new FileDirMap(repo, path, svc.nextID(), file)); } catch (ConstraintFailure e) { throw new RuntimeException("Failed setting directory root", e); *************** *** 89,93 **** doc = DocFromNode.reuseOrCreateDoc(path, docEditor); } else { ! SBServices services = new SBServices(repo, file); NodeContent.Editor docNode = StreamBasedNode .createDocStreamNode(services); --- 86,90 ---- doc = DocFromNode.reuseOrCreateDoc(path, docEditor); } else { ! LoadServices services = new LoadServices(repo, file); NodeContent.Editor docNode = StreamBasedNode .createDocStreamNode(services); *************** *** 100,104 **** /** ! * An implementation of StreamBasedNode.Services based on a File in a * FileRepository. * --- 97,101 ---- /** ! * An implementation of StreamBasedNode.LoadServices based on a File in a * FileRepository. * *************** *** 107,111 **** * @author leei */ ! private static final class SBServices implements StreamBasedNode.Services { private InputStream inputStream; private FileRepository repo; --- 104,110 ---- * @author leei */ ! private static final class LoadServices ! implements ! StreamBasedNode.LoadServices { private InputStream inputStream; private FileRepository repo; *************** *** 116,128 **** private JDBMRecordManager ndldb; private JDBMHashtable props; ! private TempNodeFactory tempFactory; ! SBServices(FileRepository repo, File file) { this.repo = repo; this.file = file; } ! public Repository repository() { ! return repo; } --- 115,171 ---- private JDBMRecordManager ndldb; private JDBMHashtable props; ! private FileRepository.Services svc; ! private boolean reloading; ! /** ! * This class bypasses the default FileNode creation methods (actually only ! * the NID generation) when loading a Document from a stream. ! * ! * @author leei ! */ ! private class LoadRepoServices extends FileRepository.Services { ! LoadRepoServices(FileRepository repo, File file) { ! super(repo, file); ! } ! ! private int tempCount; ! ! public Name nextID () { ! return AbstractRepository.nextTempID(); ! } ! ! public TxnManager txnManager() { ! return null; ! } ! ! public void commitTxn(Resolver resolver) { ! commitTxn(resolver); ! } ! } ! ! LoadServices(FileRepository repo, File file) { this.repo = repo; this.file = file; + this.svc = repo.services(file); + this.reloading = false; } ! public void setReloading(boolean reloading) { ! if (reloading != this.reloading) { ! this.reloading = reloading; ! if (reloading) { ! svc = new LoadRepoServices(repo, file); ! } else { ! svc = repo.services(file); ! } ! } ! } ! ! public RepoServices repoServices() { ! return svc; ! } ! ! public NodeFactory nodeFactory() { ! return svc.nodeFactory(); } *************** *** 137,141 **** * (non-Javadoc) * ! * @see storage.framework.StreamBasedDocument.Services#inputStream() */ public InputStream inputStream() { --- 180,184 ---- * (non-Javadoc) * ! * @see storage.framework.StreamBasedDocument.LoadServices#inputStream() */ public InputStream inputStream() { *************** *** 153,157 **** * (non-Javadoc) * ! * @see storage.framework.StreamBasedDocument.Services#mimeType() */ public String mimeType() { --- 196,200 ---- * (non-Javadoc) * ! * @see storage.framework.StreamBasedDocument.LoadServices#mimeType() */ public String mimeType() { *************** *** 180,216 **** } - /* - * (non-Javadoc) - * - * @see storage.framework.StreamBasedDocument.Services#nodeFactory() - */ - public NodeFactory tempFactory() { - if (tempFactory == null) { - tempFactory = new TempNodeFactory (); - } - return tempFactory; - } - - /* - * (non-Javadoc) - * - * @see storage.framework.StreamBasedDocument.Services#nodeFactory() - */ - public NodeFactory nodeFactory() { - return repo.nodeFactory(file); - } - - class TempNodeFactory extends FileRepository.FileNodeFactory { - private int tempCount; - - TempNodeFactory () { - super (repo, file); - } - - Name nextID() { - return Names.getName ("t" + tempCount++); - } - } - JDBMHashtable properties() throws IOException { if (props == null) { --- 223,226 ---- *************** *** 235,239 **** * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.Services#nidList() */ public Map getNIDMap() { --- 245,249 ---- * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.LoadServices#nidList() */ public Map getNIDMap() { *************** *** 244,250 **** // Check for Props nidMap = (Map) properties().get("nidMap"); ! if (nidMap != null) { ! System.out.println ("For "+file+": NIDMap <= "+nidMap); ! } return nidMap; } catch (IOException e) { --- 254,260 ---- // Check for Props nidMap = (Map) properties().get("nidMap"); ! // if (nidMap != null) { ! // System.out.println("For " + file + ": NIDMap <= " + nidMap); ! // } return nidMap; } catch (IOException e) { *************** *** 255,259 **** public void saveNIDMap(Map nidMap) { try { ! System.out.println ("For "+file+": NIDMap => "+nidMap); properties().put("nidMap", nidMap); this.nidMap = nidMap; --- 265,269 ---- public void saveNIDMap(Map nidMap) { try { ! //System.out.println ("For "+file+": NIDMap => "+nidMap); properties().put("nidMap", nidMap); this.nidMap = nidMap; *************** *** 267,278 **** * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.Services#renameNode(org.nodal.model.Node, * org.nodal.util.Name) */ public boolean renameNode(Node node, Name nid) { ! System.out.println ("Rename "+node.id()+" -> "+nid); ! return false; } } - } \ No newline at end of file --- 277,288 ---- * (non-Javadoc) * ! * @see storage.framework.StreamBasedNode.LoadServices#renameNode(org.nodal.model.Node, * org.nodal.util.Name) */ public boolean renameNode(Node node, Name nid) { ! FileNode fileNode = (FileNode) node.bareNode(); ! fileNode.setID(nid); ! return true; } } } \ No newline at end of file |
From: Lee I. <le...@us...> - 2004-09-15 20:57:26
|
Update of /cvsroot/nodal/nodal/j-src/storage/http In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5231/storage/http Modified Files: HttpNode.java HttpRepository.java Log Message: Substantial modifications for Node id save/restore on local file systems. Index: HttpRepository.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/http/HttpRepository.java,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** HttpRepository.java 2 Jun 2004 19:02:06 -0000 1.13 --- HttpRepository.java 15 Sep 2004 20:57:15 -0000 1.14 *************** *** 51,55 **** */ protected Services() { ! super(HttpRepository.this, null); } --- 51,55 ---- */ protected Services() { ! super(HttpRepository.this, null, null); } *************** *** 136,140 **** SBNStreamServices sbnServices = ! new SBNStreamServices (this, abs, conn.getInputStream(), conn.getContentType()); return StreamBasedNode.createStreamDoc(sbnServices); } catch (IOException e) { --- 136,140 ---- SBNStreamServices sbnServices = ! new SBNStreamServices (services, abs, conn.getInputStream(), conn.getContentType()); return StreamBasedNode.createStreamDoc(sbnServices); } catch (IOException e) { Index: HttpNode.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/http/HttpNode.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** HttpNode.java 20 Feb 2004 20:32:38 -0000 1.1 --- HttpNode.java 15 Sep 2004 20:57:15 -0000 1.2 *************** *** 17,22 **** import org.nodal.type.NodeType; import org.nodal.util.CapabilityImpl; - import org.nodal.util.Name; - import storage.framework.AbstractNode; import storage.memory.memContent; --- 17,20 ---- *************** *** 50,54 **** private memContent content; - private Name id; /** --- 48,51 ---- *************** *** 57,63 **** */ private HttpNode(HttpRepository repo, NodeType type) { ! super(repo, type); content = memContent.create(type); - id = repo.nextId(); } --- 54,59 ---- */ private HttpNode(HttpRepository repo, NodeType type) { ! super(repo, type, repo.nextId()); content = memContent.create(type); } *************** *** 66,70 **** */ protected Path createPath() { ! return Paths.directPath(this, repo.path(), id); } --- 62,66 ---- */ protected Path createPath() { ! return Paths.directPath(this, repo.path(), id()); } *************** *** 77,87 **** /* (non-Javadoc) - * @see org.nodal.model.Node#id() - */ - public Name id() { - return id; - } - - /* (non-Javadoc) * @see org.nodal.model.Node#content() */ --- 73,76 ---- |
From: Lee I. <le...@us...> - 2004-09-15 20:57:26
|
Update of /cvsroot/nodal/nodal/j-src/storage/jar In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5231/storage/jar Modified Files: JarNode.java Log Message: Substantial modifications for Node id save/restore on local file systems. Index: JarNode.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/storage/jar/JarNode.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** JarNode.java 19 Feb 2004 00:14:44 -0000 1.3 --- JarNode.java 15 Sep 2004 20:57:16 -0000 1.4 *************** *** 17,21 **** import org.nodal.type.NodeType; import org.nodal.util.CapabilityImpl; - import org.nodal.util.Name; import storage.framework.AbstractNode; --- 17,20 ---- *************** *** 50,54 **** private memContent content; - private Name id; /** --- 49,52 ---- *************** *** 57,63 **** */ private JarNode(JarRepository repo, NodeType type) { ! super(repo, type); content = memContent.create(type); - id = repo.nextId(); } --- 55,60 ---- */ private JarNode(JarRepository repo, NodeType type) { ! super(repo, type, repo.nextId()); content = memContent.create(type); } *************** *** 66,70 **** */ protected Path createPath() { ! return Paths.directPath(this, repo.path(), id); } --- 63,67 ---- */ protected Path createPath() { ! return Paths.directPath(this, repo.path(), id()); } *************** *** 77,87 **** /* (non-Javadoc) - * @see org.nodal.model.Node#id() - */ - public Name id() { - return id; - } - - /* (non-Javadoc) * @see org.nodal.model.Node#content() */ --- 74,77 ---- |
From: Lee I. <le...@us...> - 2004-09-15 20:54:35
|
Update of /cvsroot/nodal/nodal/j-src/test/org/nodal/util In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4386/test/org/nodal/util Modified Files: TestGraphIterator.java Log Message: Don't write to System.err when testing GraphIterator. Index: TestGraphIterator.java =================================================================== RCS file: /cvsroot/nodal/nodal/j-src/test/org/nodal/util/TestGraphIterator.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** TestGraphIterator.java 2 Sep 2004 23:21:42 -0000 1.2 --- TestGraphIterator.java 15 Sep 2004 20:54:26 -0000 1.3 *************** *** 56,60 **** Path absPath = path.apply(relPath); Node rel = i.nextNode (); ! System.err.println (" + "+relPath+" => "+rel); Getter binding = absPath.bind(); Node bound = binding.getNode(); --- 56,60 ---- Path absPath = path.apply(relPath); Node rel = i.nextNode (); ! //System.err.println (" + "+relPath+" => "+rel); Getter binding = absPath.bind(); Node bound = binding.getNode(); |