Renames of directories now behave as one would expect. (Fixes WCM-856)

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@6920 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Britt Park
2007-10-04 17:32:10 +00:00
parent 4e276a9ee5
commit e5bef04dbf
4 changed files with 394 additions and 335 deletions

View File

@@ -56,12 +56,12 @@ public class AVMInterpreter
* The service interface. * The service interface.
*/ */
private AVMService fService; private AVMService fService;
/** /**
* The sync service. * The sync service.
*/ */
private AVMSyncService fSyncService; private AVMSyncService fSyncService;
/** /**
* The reader for interaction. * The reader for interaction.
*/ */
@@ -73,12 +73,12 @@ public class AVMInterpreter
private BulkLoader fLoader; private BulkLoader fLoader;
/** /**
* Main entry point. * Main entry point.
* Syntax: AVMInteractiveConsole storage (new|old). * Syntax: AVMInteractiveConsole storage (new|old).
*/ */
public static void main(String[] args) public static void main(String[] args)
{ {
FileSystemXmlApplicationContext context = FileSystemXmlApplicationContext context =
new FileSystemXmlApplicationContext("config/alfresco/application-context.xml"); new FileSystemXmlApplicationContext("config/alfresco/application-context.xml");
AVMInterpreter console = new AVMInterpreter(); AVMInterpreter console = new AVMInterpreter();
console.setAvmService((AVMService)context.getBean("AVMService")); console.setAvmService((AVMService)context.getBean("AVMService"));
@@ -106,7 +106,7 @@ public class AVMInterpreter
{ {
fService = service; fService = service;
} }
/** /**
* Set the AVM sync service. * Set the AVM sync service.
* @param syncService * @param syncService
@@ -115,7 +115,7 @@ public class AVMInterpreter
{ {
fSyncService = syncService; fSyncService = syncService;
} }
/** /**
* Set the bulk loader. * Set the bulk loader.
* @param loader * @param loader
@@ -124,7 +124,7 @@ public class AVMInterpreter
{ {
fLoader = loader; fLoader = loader;
} }
/** /**
* A Read-Eval-Print loop. * A Read-Eval-Print loop.
*/ */
@@ -181,7 +181,7 @@ public class AVMInterpreter
return "Not Found."; return "Not Found.";
} }
Map<String, AVMNodeDescriptor> listing = Map<String, AVMNodeDescriptor> listing =
fService.getDirectoryListing(desc); fService.getDirectoryListing(desc, true);
for (String name : listing.keySet()) for (String name : listing.keySet())
{ {
out.println(name + " " + listing.get(name)); out.println(name + " " + listing.get(name));
@@ -320,9 +320,9 @@ public class AVMInterpreter
{ {
return "Syntax Error."; return "Syntax Error.";
} }
BufferedReader reader = BufferedReader reader =
new BufferedReader( new BufferedReader(
new InputStreamReader(fService.getFileInputStream(Integer.parseInt(command[2]), new InputStreamReader(fService.getFileInputStream(Integer.parseInt(command[2]),
command[1]))); command[1])));
String l; String l;
while ((l = reader.readLine()) != null) while ((l = reader.readLine()) != null)
@@ -361,7 +361,7 @@ public class AVMInterpreter
{ {
return "Syntax Error."; return "Syntax Error.";
} }
PrintStream ps = PrintStream ps =
new PrintStream(fService.getFileOutputStream(command[1])); new PrintStream(fService.getFileOutputStream(command[1]));
String l; String l;
while (!(l = in.readLine()).equals("")) while (!(l = in.readLine()).equals(""))
@@ -376,7 +376,7 @@ public class AVMInterpreter
{ {
return "Syntax Error."; return "Syntax Error.";
} }
PrintStream ps = PrintStream ps =
new PrintStream(fService.createFile(command[1], command[2])); new PrintStream(fService.createFile(command[1], command[2]));
String l; String l;
while (!(l = in.readLine()).equals("")) while (!(l = in.readLine()).equals(""))
@@ -415,7 +415,7 @@ public class AVMInterpreter
{ {
return "Syntax Error."; return "Syntax Error.";
} }
fService.deleteNodeProperty(command[1], QName.createQName(command[2])); fService.deleteNodeProperty(command[1], QName.createQName(command[2]));
out.println("deleted property " + command[2] + " of " + command[1]); out.println("deleted property " + command[2] + " of " + command[1]);
} }
@@ -483,7 +483,7 @@ public class AVMInterpreter
return "Not Found."; return "Not Found.";
} }
out.println(desc); out.println(desc);
Map<QName, PropertyValue> props = Map<QName, PropertyValue> props =
fService.getStoreProperties(command[1]); fService.getStoreProperties(command[1]);
for (QName name : props.keySet()) for (QName name : props.keySet())
{ {
@@ -512,7 +512,7 @@ public class AVMInterpreter
{ {
return "Syntax Error."; return "Syntax Error.";
} }
AVMDifference diff = new AVMDifference(Integer.parseInt(command[2]), command[1], AVMDifference diff = new AVMDifference(Integer.parseInt(command[2]), command[1],
-1, command[3], AVMDifference.NEWER); -1, command[3], AVMDifference.NEWER);
List<AVMDifference> diffs = new ArrayList<AVMDifference>(); List<AVMDifference> diffs = new ArrayList<AVMDifference>();
diffs.add(diff); diffs.add(diff);
@@ -552,7 +552,7 @@ public class AVMInterpreter
private void recursiveList(PrintStream out, AVMNodeDescriptor dir, int indent) private void recursiveList(PrintStream out, AVMNodeDescriptor dir, int indent)
{ {
Map<String, AVMNodeDescriptor> listing = fService.getDirectoryListing(dir); Map<String, AVMNodeDescriptor> listing = fService.getDirectoryListing(dir, true);
for (String name : listing.keySet()) for (String name : listing.keySet())
{ {
AVMNodeDescriptor child = listing.get(name); AVMNodeDescriptor child = listing.get(name);
@@ -568,7 +568,7 @@ public class AVMInterpreter
} }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -96,11 +96,47 @@ import org.alfresco.util.Pair;
/** /**
* Big test of AVM behavior. * Big test of AVM behavior.
* *
* @author britt * @author britt
*/ */
public class AVMServiceTest extends AVMServiceTestBase public class AVMServiceTest extends AVMServiceTestBase
{ {
public void testRename6()
{
try
{
setupBasicTree();
fService.createStore("layer");
fService.createLayeredDirectory("main:/a", "layer:/", "a");
fService.rename("layer:/a/b", "c", "layer:/a/b", "z");
System.out.println(recursiveContents("layer:/", -1, true));
List<AVMDifference> diffs = fSyncService.compare(-1, "layer:/a", -1, "main:/a", null);
System.out.println(diffs);
fSyncService.update(diffs, null, false, false, false, false, null, null);
System.out.println(recursiveContents("layer:/", -1, true));
System.out.println(recursiveContents("main:/", -1, true));
fSyncService.flatten("layer:/a", "main:/a");
System.out.println(recursiveContents("layer:/", -1, true));
System.out.println(recursiveContents("main:/", -1, true));
fService.createFile("layer:/a/b/z", "fudge").close();
fService.rename("layer:/a/b", "z", "layer:/a/b", "y");
System.out.println(recursiveContents("layer:/", -1, true));
diffs = fSyncService.compare(-1, "layer:/a", -1, "main:/a", null);
System.out.println(diffs);
fSyncService.update(diffs, null, false, false, false, false, null, null);
System.out.println(recursiveContents("layer:/", -1, true));
System.out.println(recursiveContents("main:/", -1, true));
fSyncService.flatten("layer:/a", "main:/a");
System.out.println(recursiveContents("layer:/", -1, true));
System.out.println(recursiveContents("main:/", -1, true));
}
catch (Exception e)
{
e.printStackTrace();
fail();
}
}
public void testSpacesInStoreNames() public void testSpacesInStoreNames()
{ {
try try
@@ -115,7 +151,7 @@ public class AVMServiceTest extends AVMServiceTestBase
fail(); fail();
} }
} }
public void testHeadPathsInLayers() public void testHeadPathsInLayers()
{ {
try try
@@ -143,7 +179,7 @@ public class AVMServiceTest extends AVMServiceTestBase
fail(); fail();
} }
} }
/** /**
* Minimal testing of Locking Aware service. * Minimal testing of Locking Aware service.
*/ */
@@ -154,17 +190,17 @@ public class AVMServiceTest extends AVMServiceTestBase
AuthenticationService authService = (AuthenticationService)fContext.getBean("AuthenticationService"); AuthenticationService authService = (AuthenticationService)fContext.getBean("AuthenticationService");
try try
{ {
fService.setStoreProperty("main", QName.createQName(null, ".dns.main"), fService.setStoreProperty("main", QName.createQName(null, ".dns.main"),
new PropertyValue(DataTypeDefinition.TEXT, "Nothing.")); new PropertyValue(DataTypeDefinition.TEXT, "Nothing."));
fService.createStore("test"); fService.createStore("test");
fService.setStoreProperty("test", QName.createQName(null, ".dns.test.main"), fService.setStoreProperty("test", QName.createQName(null, ".dns.test.main"),
new PropertyValue(DataTypeDefinition.TEXT, "Nothing.")); new PropertyValue(DataTypeDefinition.TEXT, "Nothing."));
setupBasicTree0(); setupBasicTree0();
authService.authenticateAsGuest(); authService.authenticateAsGuest();
// assertEquals(0, fLockingService.getUsersLocks("admin").size()); // assertEquals(0, fLockingService.getUsersLocks("admin").size());
List<AVMDifference> diffs = fSyncService.compare(-1, "main:/", -1, "test:/", null); List<AVMDifference> diffs = fSyncService.compare(-1, "main:/", -1, "test:/", null);
fSyncService.update(diffs, null, false, false, false, false, null, null); fSyncService.update(diffs, null, false, false, false, false, null, null);
RetryingTransactionHelper.RetryingTransactionCallback<Object> cb = RetryingTransactionHelper.RetryingTransactionCallback<Object> cb =
new RetryingTransactionHelper.RetryingTransactionCallback<Object>() new RetryingTransactionHelper.RetryingTransactionCallback<Object>()
{ {
public Object execute() public Object execute()
@@ -172,7 +208,7 @@ public class AVMServiceTest extends AVMServiceTestBase
{ {
BulkLoader loader = new BulkLoader(); BulkLoader loader = new BulkLoader();
loader.setAvmService(fService); loader.setAvmService(fService);
loader.recursiveLoad("source/java/org/alfresco/repo/avm", "main:/"); loader.recursiveLoad("source/java/org/alfresco/repo/avm", "main:/");
return null; return null;
} }
}; };
@@ -232,13 +268,13 @@ public class AVMServiceTest extends AVMServiceTestBase
try try
{ {
setupBasicTree(); setupBasicTree();
StoreRef storeRef = AVMNodeConverter.ToStoreRef("main"); StoreRef storeRef = AVMNodeConverter.ToStoreRef("main");
SearchService searchService = fIndexerAndSearcher.getSearcher(storeRef, true); SearchService searchService = fIndexerAndSearcher.getSearcher(storeRef, true);
ResultSet results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@{silly.uri}SillyProperty")+":\"Silly\""); ResultSet results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@{silly.uri}SillyProperty")+":\"Silly\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
QName name = QName.createQName("silly.uri", "SillyProperty"); QName name = QName.createQName("silly.uri", "SillyProperty");
PropertyValue value = new PropertyValue(DataTypeDefinition.TEXT, "Silly Property Value"); PropertyValue value = new PropertyValue(DataTypeDefinition.TEXT, "Silly Property Value");
fService.setNodeProperty("main:/a/b/c/foo", name, value); fService.setNodeProperty("main:/a/b/c/foo", name, value);
@@ -251,8 +287,8 @@ public class AVMServiceTest extends AVMServiceTestBase
Map<QName, PropertyValue> props = fService.getNodeProperties(-1, "main:/a/b/c/foo"); Map<QName, PropertyValue> props = fService.getNodeProperties(-1, "main:/a/b/c/foo");
assertEquals(1, props.size()); assertEquals(1, props.size());
assertEquals(value.toString(), props.get(name).toString()); assertEquals(value.toString(), props.get(name).toString());
props = new HashMap<QName, PropertyValue>(); props = new HashMap<QName, PropertyValue>();
QName n1 = QName.createQName("silly.uri", "Prop1"); QName n1 = QName.createQName("silly.uri", "Prop1");
PropertyValue p1 = new PropertyValue(DataTypeDefinition.DATETIME, new Date(System.currentTimeMillis())); PropertyValue p1 = new PropertyValue(DataTypeDefinition.DATETIME, new Date(System.currentTimeMillis()));
@@ -270,38 +306,38 @@ public class AVMServiceTest extends AVMServiceTestBase
assertEquals(p1.toString(), props.get(n1).toString()); assertEquals(p1.toString(), props.get(n1).toString());
assertEquals(p2.toString(), props.get(n2).toString()); assertEquals(p2.toString(), props.get(n2).toString());
assertEquals(p3.toString(), props.get(n3).toString()); assertEquals(p3.toString(), props.get(n3).toString());
results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@{silly.uri}Prop1")+":\"" + props.get(n1).getStringValue() +"\""); results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@{silly.uri}Prop1")+":\"" + props.get(n1).getStringValue() +"\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@{silly.uri}Prop2")+":\"" + props.get(n2).getStringValue() +"\""); results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@{silly.uri}Prop2")+":\"" + props.get(n2).getStringValue() +"\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
fService.deleteNodeProperty("main:/a/b/c/bar", n1); fService.deleteNodeProperty("main:/a/b/c/bar", n1);
fService.createSnapshot("main", null, null); fService.createSnapshot("main", null, null);
results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@{silly.uri}Prop1")+":\"" + props.get(n1).getStringValue() +"\""); results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@{silly.uri}Prop1")+":\"" + props.get(n1).getStringValue() +"\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@{silly.uri}Prop2")+":\"" + props.get(n2).getStringValue() +"\""); results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@{silly.uri}Prop2")+":\"" + props.get(n2).getStringValue() +"\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
props = fService.getNodeProperties(-1, "main:/a/b/c/bar"); props = fService.getNodeProperties(-1, "main:/a/b/c/bar");
assertEquals(2, props.size()); assertEquals(2, props.size());
assertEquals(p2.toString(), props.get(n2).toString()); assertEquals(p2.toString(), props.get(n2).toString());
assertEquals(p3.toString(), props.get(n3).toString()); assertEquals(p3.toString(), props.get(n3).toString());
fService.deleteNodeProperties("main:/a/b/c/bar"); fService.deleteNodeProperties("main:/a/b/c/bar");
fService.createSnapshot("main", null, null); fService.createSnapshot("main", null, null);
results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@{silly.uri}Prop1")+":\"" + p1.getStringValue() +"\""); results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@{silly.uri}Prop1")+":\"" + p1.getStringValue() +"\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@{silly.uri}Prop2")+":\"" + props.get(n2).getStringValue() +"\""); results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@{silly.uri}Prop2")+":\"" + props.get(n2).getStringValue() +"\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
props = fService.getNodeProperties(-1, "main:/a/b/c/bar"); props = fService.getNodeProperties(-1, "main:/a/b/c/bar");
assertEquals(0, props.size()); assertEquals(0, props.size());
fService.removeNode("main:/a/b/c/foo"); fService.removeNode("main:/a/b/c/foo");
@@ -361,9 +397,9 @@ public class AVMServiceTest extends AVMServiceTestBase
fail(); fail();
} }
} }
public void testForceCopyDeleted() public void testForceCopyDeleted()
{ {
try try
@@ -1075,7 +1111,7 @@ public class AVMServiceTest extends AVMServiceTestBase
}; };
TransactionService transactionService = (TransactionService) fContext.getBean("transactionService"); TransactionService transactionService = (TransactionService) fContext.getBean("transactionService");
transactionService.getRetryingTransactionHelper().doInTransaction(new TxnWork()); transactionService.getRetryingTransactionHelper().doInTransaction(new TxnWork());
results = searchService.query(storeRef, "lucene", "TEXT:\"HEAD\""); results = searchService.query(storeRef, "lucene", "TEXT:\"HEAD\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
@@ -1769,7 +1805,7 @@ public class AVMServiceTest extends AVMServiceTestBase
}; };
TransactionService transactionService = (TransactionService) fContext.getBean("transactionService"); TransactionService transactionService = (TransactionService) fContext.getBean("transactionService");
transactionService.getRetryingTransactionHelper().doInTransaction(new TxnWork()); transactionService.getRetryingTransactionHelper().doInTransaction(new TxnWork());
diffs = fSyncService.compare(-1, "area:/a", -1, "main:/a", null); diffs = fSyncService.compare(-1, "area:/a", -1, "main:/a", null);
assertEquals(0, diffs.size()); assertEquals(0, diffs.size());
System.out.println(recursiveList("area", -1, true)); System.out.println(recursiveList("area", -1, true));
@@ -1814,7 +1850,7 @@ public class AVMServiceTest extends AVMServiceTestBase
}; };
TransactionService transactionService = (TransactionService) fContext.getBean("transactionService"); TransactionService transactionService = (TransactionService) fContext.getBean("transactionService");
transactionService.getRetryingTransactionHelper().doInTransaction(new TxnWork()); transactionService.getRetryingTransactionHelper().doInTransaction(new TxnWork());
diffs = fSyncService.compare(-1, "area:/a", -1, "main:/a", null); diffs = fSyncService.compare(-1, "area:/a", -1, "main:/a", null);
assertEquals(0, diffs.size()); assertEquals(0, diffs.size());
System.out.println(recursiveList("area", -1, true)); System.out.println(recursiveList("area", -1, true));
@@ -2877,9 +2913,11 @@ public class AVMServiceTest extends AVMServiceTestBase
assertEquals("baz", list.get(0)); assertEquals("baz", list.get(0));
assertEquals("figs", list.get(1)); assertEquals("figs", list.get(1));
// Rename /layer/d to /layer/e and uncover /layer/d // Rename /layer/d to /layer/e and uncover /layer/d
System.out.println(recursiveContents("main:/", -1, true));
fService.rename("main:/layer", "d", "main:/layer", "e"); fService.rename("main:/layer", "d", "main:/layer", "e");
fService.uncover("main:/layer", "d"); fService.uncover("main:/layer", "d");
fService.createSnapshot("main", null, null); fService.createSnapshot("main", null, null);
System.out.println(recursiveContents("main:/", -1, true));
// History unchanged. // History unchanged.
checkHistory(history, "main"); checkHistory(history, "main");
// /layer/d contains figs. // /layer/d contains figs.
@@ -2887,11 +2925,12 @@ public class AVMServiceTest extends AVMServiceTestBase
assertEquals(1, listing.size()); assertEquals(1, listing.size());
list = new ArrayList<String>(listing.keySet()); list = new ArrayList<String>(listing.keySet());
assertEquals("figs", list.get(0)); assertEquals("figs", list.get(0));
// /layer/e contains baz. // /layer/e contains baz and figs.
listing = fService.getDirectoryListing(-1, "main:/layer/e"); listing = fService.getDirectoryListing(-1, "main:/layer/e");
assertEquals(1, listing.size()); assertEquals(2, listing.size());
list = new ArrayList<String>(listing.keySet()); list = new ArrayList<String>(listing.keySet());
assertEquals("baz", list.get(0)); assertEquals("baz", list.get(0));
assertEquals("figs", list.get(1));
for (String val : history.values()) for (String val : history.values())
{ {
System.out.println(val); System.out.println(val);
@@ -3592,8 +3631,8 @@ public class AVMServiceTest extends AVMServiceTestBase
results = searchService.query(storeRef, "lucene", "PATH:\"/a/b\""); results = searchService.query(storeRef, "lucene", "PATH:\"/a/b\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/d\""); results = searchService.query(storeRef, "lucene", "PATH:\"/d\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
@@ -3605,7 +3644,7 @@ public class AVMServiceTest extends AVMServiceTestBase
results = searchService.query(storeRef, "lucene", "PATH:\"/d/e/brenamed\""); results = searchService.query(storeRef, "lucene", "PATH:\"/d/e/brenamed\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/d/e/brenamed/c\""); results = searchService.query(storeRef, "lucene", "PATH:\"/d/e/brenamed/c\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
@@ -3618,7 +3657,7 @@ public class AVMServiceTest extends AVMServiceTestBase
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/d/e/f\""); results = searchService.query(storeRef, "lucene", "PATH:\"/d/e/f\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
@@ -3666,7 +3705,7 @@ public class AVMServiceTest extends AVMServiceTestBase
results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*/*/*\""); results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*/*/*\"");
assertEquals(2, results.length()); assertEquals(2, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*/*/*/*\""); results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*/*/*/*\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
@@ -3702,7 +3741,7 @@ public class AVMServiceTest extends AVMServiceTestBase
System.out.println(history.get(2)); System.out.println(history.get(2));
l = fService.getDirectoryListing(-1, "main:/d"); l = fService.getDirectoryListing(-1, "main:/d");
assertEquals(0, l.size()); assertEquals(0, l.size());
// Text index // Text index
StoreRef storeRef = AVMNodeConverter.ToStoreRef("main"); StoreRef storeRef = AVMNodeConverter.ToStoreRef("main");
SearchService searchService = fIndexerAndSearcher.getSearcher(storeRef, true); SearchService searchService = fIndexerAndSearcher.getSearcher(storeRef, true);
@@ -3841,7 +3880,7 @@ public class AVMServiceTest extends AVMServiceTestBase
results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*/*/*\""); results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*/*/*\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
} }
catch (Exception e) catch (Exception e)
{ {
@@ -4704,224 +4743,224 @@ public class AVMServiceTest extends AVMServiceTestBase
} }
} }
protected void runQueriesForInitialRenameStructure(String store) protected void runQueriesForInitialRenameStructure(String store)
{ {
StoreRef storeRef = AVMNodeConverter.ToStoreRef(store); StoreRef storeRef = AVMNodeConverter.ToStoreRef(store);
SearchService searchService = fIndexerAndSearcher.getSearcher(AVMNodeConverter.ToStoreRef(store), true); SearchService searchService = fIndexerAndSearcher.getSearcher(AVMNodeConverter.ToStoreRef(store), true);
// Note "a" is a stop word and therefore not findable ... // Note "a" is a stop word and therefore not findable ...
ResultSet results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_CREATOR)+":admin"); ResultSet results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_CREATOR)+":admin");
assertEquals(7, results.length()); assertEquals(7, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_MODIFIER)+":admin"); results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_MODIFIER)+":admin");
assertEquals(7, results.length()); assertEquals(7, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_OWNER)+":admin"); results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_OWNER)+":admin");
assertEquals(7, results.length()); assertEquals(7, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_NODE_UUID)+":unknown"); results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_NODE_UUID)+":unknown");
assertEquals(7, results.length()); assertEquals(7, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_STORE_PROTOCOL)+":avm"); results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_STORE_PROTOCOL)+":avm");
assertEquals(7, results.length()); assertEquals(7, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_STORE_IDENTIFIER)+":"+store); results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_STORE_IDENTIFIER)+":"+store);
assertEquals(7, results.length()); assertEquals(7, results.length());
results.close(); results.close();
// Basic paths // Basic paths
results = searchService.query(storeRef, "lucene", "PATH:\"/\""); results = searchService.query(storeRef, "lucene", "PATH:\"/\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/a\""); results = searchService.query(storeRef, "lucene", "PATH:\"/a\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/a/b\""); results = searchService.query(storeRef, "lucene", "PATH:\"/a/b\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/a/b/c\""); results = searchService.query(storeRef, "lucene", "PATH:\"/a/b/c\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/d\""); results = searchService.query(storeRef, "lucene", "PATH:\"/d\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/d/e\""); results = searchService.query(storeRef, "lucene", "PATH:\"/d/e\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/d/e/f\""); results = searchService.query(storeRef, "lucene", "PATH:\"/d/e/f\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"//.\""); results = searchService.query(storeRef, "lucene", "PATH:\"//.\"");
assertEquals(7, results.length()); assertEquals(7, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"//*\""); results = searchService.query(storeRef, "lucene", "PATH:\"//*\"");
assertEquals(6, results.length()); assertEquals(6, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/a//.\""); results = searchService.query(storeRef, "lucene", "PATH:\"/a//.\"");
assertEquals(3, results.length()); assertEquals(3, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/a//*\""); results = searchService.query(storeRef, "lucene", "PATH:\"/a//*\"");
assertEquals(2, results.length()); assertEquals(2, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/a/*\""); results = searchService.query(storeRef, "lucene", "PATH:\"/a/*\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"//c/*\""); results = searchService.query(storeRef, "lucene", "PATH:\"//c/*\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/*\""); results = searchService.query(storeRef, "lucene", "PATH:\"/*\"");
assertEquals(2, results.length()); assertEquals(2, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/*/*\""); results = searchService.query(storeRef, "lucene", "PATH:\"/*/*\"");
assertEquals(2, results.length()); assertEquals(2, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*\""); results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*\"");
assertEquals(2, results.length()); assertEquals(2, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*/*\""); results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*/*\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*/*/*\""); results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*/*/*\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
} }
protected void runQueriesForInitialRenameStructureAndInitialLayers(String store) protected void runQueriesForInitialRenameStructureAndInitialLayers(String store)
{ {
StoreRef storeRef = AVMNodeConverter.ToStoreRef(store); StoreRef storeRef = AVMNodeConverter.ToStoreRef(store);
SearchService searchService = fIndexerAndSearcher.getSearcher(AVMNodeConverter.ToStoreRef(store), true); SearchService searchService = fIndexerAndSearcher.getSearcher(AVMNodeConverter.ToStoreRef(store), true);
// Note "a" is a stop word and therefore not findable ... // Note "a" is a stop word and therefore not findable ...
ResultSet results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_CREATOR)+":admin"); ResultSet results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_CREATOR)+":admin");
assertEquals(9, results.length()); assertEquals(9, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_MODIFIER)+":admin"); results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_MODIFIER)+":admin");
assertEquals(7, results.length()); assertEquals(7, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_OWNER)+":admin"); results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_OWNER)+":admin");
assertEquals(7, results.length()); assertEquals(7, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_NODE_UUID)+":unknown"); results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_NODE_UUID)+":unknown");
assertEquals(7, results.length()); assertEquals(7, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_STORE_PROTOCOL)+":avm"); results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_STORE_PROTOCOL)+":avm");
assertEquals(7, results.length()); assertEquals(7, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_STORE_IDENTIFIER)+":"+store); results = searchService.query(storeRef, "lucene", LuceneQueryParser.escape("@"+ContentModel.PROP_STORE_IDENTIFIER)+":"+store);
assertEquals(7, results.length()); assertEquals(7, results.length());
results.close(); results.close();
// Basic paths // Basic paths
results = searchService.query(storeRef, "lucene", "PATH:\"/\""); results = searchService.query(storeRef, "lucene", "PATH:\"/\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/a\""); results = searchService.query(storeRef, "lucene", "PATH:\"/a\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/a/b\""); results = searchService.query(storeRef, "lucene", "PATH:\"/a/b\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/a/b/c\""); results = searchService.query(storeRef, "lucene", "PATH:\"/a/b/c\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/d\""); results = searchService.query(storeRef, "lucene", "PATH:\"/d\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/d/e\""); results = searchService.query(storeRef, "lucene", "PATH:\"/d/e\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/d/e/f\""); results = searchService.query(storeRef, "lucene", "PATH:\"/d/e/f\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"//.\""); results = searchService.query(storeRef, "lucene", "PATH:\"//.\"");
assertEquals(7, results.length()); assertEquals(7, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"//*\""); results = searchService.query(storeRef, "lucene", "PATH:\"//*\"");
assertEquals(6, results.length()); assertEquals(6, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/a//.\""); results = searchService.query(storeRef, "lucene", "PATH:\"/a//.\"");
assertEquals(3, results.length()); assertEquals(3, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/a//*\""); results = searchService.query(storeRef, "lucene", "PATH:\"/a//*\"");
assertEquals(2, results.length()); assertEquals(2, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/a/*\""); results = searchService.query(storeRef, "lucene", "PATH:\"/a/*\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"//c/*\""); results = searchService.query(storeRef, "lucene", "PATH:\"//c/*\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/*\""); results = searchService.query(storeRef, "lucene", "PATH:\"/*\"");
assertEquals(2, results.length()); assertEquals(2, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/*/*\""); results = searchService.query(storeRef, "lucene", "PATH:\"/*/*\"");
assertEquals(2, results.length()); assertEquals(2, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*\""); results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*\"");
assertEquals(2, results.length()); assertEquals(2, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*/*\""); results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*/*\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*/*/*\""); results = searchService.query(storeRef, "lucene", "PATH:\"/*/*/*/*/*\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
} }
/** /**
* Test rename behavior of an overlayed file withing a layer. * Test rename behavior of an overlayed file withing a layer.
*/ */
@@ -5178,7 +5217,7 @@ public class AVMServiceTest extends AVMServiceTestBase
try try
{ {
setupBasicTree(); setupBasicTree();
StoreRef storeRef = AVMNodeConverter.ToStoreRef("main"); StoreRef storeRef = AVMNodeConverter.ToStoreRef("main");
SearchService searchService = fIndexerAndSearcher.getSearcher(storeRef, true); SearchService searchService = fIndexerAndSearcher.getSearcher(storeRef, true);
ResultSet results = searchService.query(storeRef, "lucene", "ASPECT:\"" + ContentModel.ASPECT_TITLED.toString() +"\""); ResultSet results = searchService.query(storeRef, "lucene", "ASPECT:\"" + ContentModel.ASPECT_TITLED.toString() +"\"");
@@ -5187,7 +5226,7 @@ public class AVMServiceTest extends AVMServiceTestBase
results = searchService.query(storeRef, "lucene", "ASPECT:\"" + ContentModel.ASPECT_AUDITABLE.toString() +"\""); results = searchService.query(storeRef, "lucene", "ASPECT:\"" + ContentModel.ASPECT_AUDITABLE.toString() +"\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
fService.addAspect("main:/a/b/c/foo", ContentModel.ASPECT_TITLED); fService.addAspect("main:/a/b/c/foo", ContentModel.ASPECT_TITLED);
fService.addAspect("main:/a/b/c/foo", ContentModel.ASPECT_AUDITABLE); fService.addAspect("main:/a/b/c/foo", ContentModel.ASPECT_AUDITABLE);
Map<QName, PropertyValue> properties = new HashMap<QName, PropertyValue>(); Map<QName, PropertyValue> properties = new HashMap<QName, PropertyValue>();
@@ -5198,14 +5237,14 @@ public class AVMServiceTest extends AVMServiceTestBase
properties.put(ContentModel.PROP_MODIFIER, new PropertyValue(DataTypeDefinition.TEXT, "Quentin")); properties.put(ContentModel.PROP_MODIFIER, new PropertyValue(DataTypeDefinition.TEXT, "Quentin"));
fService.setNodeProperties("main:/a/b/c/foo", properties); fService.setNodeProperties("main:/a/b/c/foo", properties);
fService.createSnapshot("main", null, null); fService.createSnapshot("main", null, null);
results = searchService.query(storeRef, "lucene", "ASPECT:\"" + ContentModel.ASPECT_TITLED.toString() +"\""); results = searchService.query(storeRef, "lucene", "ASPECT:\"" + ContentModel.ASPECT_TITLED.toString() +"\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "ASPECT:\"" + ContentModel.ASPECT_AUDITABLE.toString() +"\""); results = searchService.query(storeRef, "lucene", "ASPECT:\"" + ContentModel.ASPECT_AUDITABLE.toString() +"\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
fService.removeNode("main:/a/b/c/bar"); fService.removeNode("main:/a/b/c/bar");
fService.addAspect("main:/a/b/c/bar", ContentModel.ASPECT_TITLED); fService.addAspect("main:/a/b/c/bar", ContentModel.ASPECT_TITLED);
Set<QName> names = fService.getAspects(-1, "main:/a/b/c/foo"); Set<QName> names = fService.getAspects(-1, "main:/a/b/c/foo");
@@ -5215,15 +5254,15 @@ public class AVMServiceTest extends AVMServiceTestBase
assertTrue(fService.hasAspect(-1, "main:/a/b/c/foo", ContentModel.ASPECT_TITLED)); assertTrue(fService.hasAspect(-1, "main:/a/b/c/foo", ContentModel.ASPECT_TITLED));
fService.removeAspect("main:/a/b/c/foo", ContentModel.ASPECT_TITLED); fService.removeAspect("main:/a/b/c/foo", ContentModel.ASPECT_TITLED);
fService.createSnapshot("main", null, null); fService.createSnapshot("main", null, null);
results = searchService.query(storeRef, "lucene", "ASPECT:\"" + ContentModel.ASPECT_TITLED.toString() +"\""); results = searchService.query(storeRef, "lucene", "ASPECT:\"" + ContentModel.ASPECT_TITLED.toString() +"\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
results = searchService.query(storeRef, "lucene", "ASPECT:\"" + ContentModel.ASPECT_AUDITABLE.toString() +"\""); results = searchService.query(storeRef, "lucene", "ASPECT:\"" + ContentModel.ASPECT_AUDITABLE.toString() +"\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
fService.getFileOutputStream("main:/a/b/c/foo").close(); fService.getFileOutputStream("main:/a/b/c/foo").close();
assertFalse(fService.hasAspect(-1, "main:/a/b/c/foo", ContentModel.ASPECT_TITLED)); assertFalse(fService.hasAspect(-1, "main:/a/b/c/foo", ContentModel.ASPECT_TITLED));
assertTrue(fService.hasAspect(-1, "main:/a/b/c/foo", ContentModel.ASPECT_AUDITABLE)); assertTrue(fService.hasAspect(-1, "main:/a/b/c/foo", ContentModel.ASPECT_AUDITABLE));
@@ -5567,52 +5606,52 @@ public class AVMServiceTest extends AVMServiceTestBase
avmIndexer.deleteIndex("avmAsynchronousTest", IndexMode.SYNCHRONOUS); avmIndexer.deleteIndex("avmAsynchronousTest", IndexMode.SYNCHRONOUS);
} }
tx.commit(); tx.commit();
tx = fTransactionService.getUserTransaction(); tx = fTransactionService.getUserTransaction();
tx.begin(); tx.begin();
assertEquals(-1, fIndexingInterceptor.getLastIndexedSnapshot("bananaStoreWoof")); assertEquals(-1, fIndexingInterceptor.getLastIndexedSnapshot("bananaStoreWoof"));
assertEquals(-1, fIndexingInterceptor.getLastIndexedSnapshot("avmAsynchronousTest")); assertEquals(-1, fIndexingInterceptor.getLastIndexedSnapshot("avmAsynchronousTest"));
tx.commit(); tx.commit();
// TODO: Suspend and resume indexing in case we are really unlucky and hit an index before we expect it. // TODO: Suspend and resume indexing in case we are really unlucky and hit an index before we expect it.
SearchService searchService = fIndexerAndSearcher.getSearcher(storeRef, true); SearchService searchService = fIndexerAndSearcher.getSearcher(storeRef, true);
ResultSet results; ResultSet results;
results = searchService.query(storeRef, "lucene", "PATH:\"//.\""); results = searchService.query(storeRef, "lucene", "PATH:\"//.\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
fService.createStore("avmAsynchronousTest"); fService.createStore("avmAsynchronousTest");
tx = fTransactionService.getUserTransaction(); tx = fTransactionService.getUserTransaction();
tx.begin(); tx.begin();
assertEquals(0, fIndexingInterceptor.getLastIndexedSnapshot("avmAsynchronousTest")); assertEquals(0, fIndexingInterceptor.getLastIndexedSnapshot("avmAsynchronousTest"));
tx.commit(); tx.commit();
fService.createSnapshot("avmAsynchronousTest", null, null); fService.createSnapshot("avmAsynchronousTest", null, null);
tx = fTransactionService.getUserTransaction(); tx = fTransactionService.getUserTransaction();
tx.begin(); tx.begin();
assertEquals(0, fIndexingInterceptor.getLastIndexedSnapshot("avmAsynchronousTest")); assertEquals(0, fIndexingInterceptor.getLastIndexedSnapshot("avmAsynchronousTest"));
tx.commit(); tx.commit();
results = searchService.query(storeRef, "lucene", "PATH:\"//.\""); results = searchService.query(storeRef, "lucene", "PATH:\"//.\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
fService.createDirectory("avmAsynchronousTest:/", "a"); fService.createDirectory("avmAsynchronousTest:/", "a");
fService.createDirectory("avmAsynchronousTest:/a", "b"); fService.createDirectory("avmAsynchronousTest:/a", "b");
fService.createDirectory("avmAsynchronousTest:/a/b", "c"); fService.createDirectory("avmAsynchronousTest:/a/b", "c");
tx = fTransactionService.getUserTransaction(); tx = fTransactionService.getUserTransaction();
tx.begin(); tx.begin();
assertEquals(0, fIndexingInterceptor.getLastIndexedSnapshot("avmAsynchronousTest")); assertEquals(0, fIndexingInterceptor.getLastIndexedSnapshot("avmAsynchronousTest"));
assertTrue(fIndexingInterceptor.isIndexUpToDate("avmAsynchronousTest")); assertTrue(fIndexingInterceptor.isIndexUpToDate("avmAsynchronousTest"));
tx.commit(); tx.commit();
fService.createSnapshot("avmAsynchronousTest", null, null); fService.createSnapshot("avmAsynchronousTest", null, null);
tx = fTransactionService.getUserTransaction(); tx = fTransactionService.getUserTransaction();
tx.begin(); tx.begin();
assertEquals(1, fIndexingInterceptor.getLastIndexedSnapshot("avmAsynchronousTest")); assertEquals(1, fIndexingInterceptor.getLastIndexedSnapshot("avmAsynchronousTest"));
@@ -5624,31 +5663,31 @@ public class AVMServiceTest extends AVMServiceTestBase
assertTrue(fIndexingInterceptor.isSnapshotIndexed("avmAsynchronousTest", 1)); assertTrue(fIndexingInterceptor.isSnapshotIndexed("avmAsynchronousTest", 1));
assertFalse(fIndexingInterceptor.isSnapshotIndexed("avmAsynchronousTest", 2)); assertFalse(fIndexingInterceptor.isSnapshotIndexed("avmAsynchronousTest", 2));
tx.commit(); tx.commit();
results = searchService.query(storeRef, "lucene", "PATH:\"//.\""); results = searchService.query(storeRef, "lucene", "PATH:\"//.\"");
assertEquals(1, results.length()); assertEquals(1, results.length());
results.close(); results.close();
Thread.sleep(180000); Thread.sleep(180000);
results = searchService.query(storeRef, "lucene", "PATH:\"//.\""); results = searchService.query(storeRef, "lucene", "PATH:\"//.\"");
assertEquals(4, results.length()); assertEquals(4, results.length());
results.close(); results.close();
tx = fTransactionService.getUserTransaction(); tx = fTransactionService.getUserTransaction();
tx.begin(); tx.begin();
assertEquals(1, fIndexingInterceptor.getLastIndexedSnapshot("avmAsynchronousTest")); assertEquals(1, fIndexingInterceptor.getLastIndexedSnapshot("avmAsynchronousTest"));
assertTrue(fIndexingInterceptor.isIndexUpToDate("avmAsynchronousTest")); assertTrue(fIndexingInterceptor.isIndexUpToDate("avmAsynchronousTest"));
assertTrue(fIndexingInterceptor.isIndexUpToDateAndSearchable("avmAsynchronousTest")); assertTrue(fIndexingInterceptor.isIndexUpToDateAndSearchable("avmAsynchronousTest"));
tx.commit(); tx.commit();
fService.purgeStore("avmAsynchronousTest"); fService.purgeStore("avmAsynchronousTest");
results = searchService.query(storeRef, "lucene", "PATH:\"//.\""); results = searchService.query(storeRef, "lucene", "PATH:\"//.\"");
assertEquals(0, results.length()); assertEquals(0, results.length());
results.close(); results.close();
fService.createStore("avmAsynchronousTest"); fService.createStore("avmAsynchronousTest");
fService.createSnapshot("avmAsynchronousTest", null, null); fService.createSnapshot("avmAsynchronousTest", null, null);
fService.createDirectory("avmAsynchronousTest:/", "a"); fService.createDirectory("avmAsynchronousTest:/", "a");
@@ -5662,9 +5701,9 @@ public class AVMServiceTest extends AVMServiceTestBase
fService.createDirectory("avmAsynchronousTest:/a", "b"); fService.createDirectory("avmAsynchronousTest:/a", "b");
fService.createDirectory("avmAsynchronousTest:/a/b", "c"); fService.createDirectory("avmAsynchronousTest:/a/b", "c");
fService.createSnapshot("avmAsynchronousTest", null, null); fService.createSnapshot("avmAsynchronousTest", null, null);
Thread.sleep(180000); Thread.sleep(180000);
results = searchService.query(storeRef, "lucene", "PATH:\"//.\""); results = searchService.query(storeRef, "lucene", "PATH:\"//.\"");
assertEquals(4, results.length()); assertEquals(4, results.length());
results.close(); results.close();

View File

@@ -53,34 +53,34 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
* The layer id. * The layer id.
*/ */
private long fLayerID; private long fLayerID;
/** /**
* The pointer to the underlying directory. * The pointer to the underlying directory.
*/ */
private String fIndirection; private String fIndirection;
/** /**
* Whether this is a primary indirection node. * Whether this is a primary indirection node.
*/ */
private boolean fPrimaryIndirection; private boolean fPrimaryIndirection;
/** /**
* Whether this is opaque. * Whether this is opaque.
*/ */
private boolean fOpacity; private boolean fOpacity;
/** /**
* The indirection version. * The indirection version.
*/ */
private int fIndirectionVersion; private int fIndirectionVersion;
/** /**
* Default constructor. Called by Hibernate. * Default constructor. Called by Hibernate.
*/ */
protected LayeredDirectoryNodeImpl() protected LayeredDirectoryNodeImpl()
{ {
} }
/** /**
* Make a new one from a specified indirection path. * Make a new one from a specified indirection path.
* @param indirection The indirection path to set. * @param indirection The indirection path to set.
@@ -111,7 +111,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
copyAspects(toCopy); copyAspects(toCopy);
} }
} }
/** /**
* Kind of copy constructor, sort of. * Kind of copy constructor, sort of.
* @param other The LayeredDirectoryNode we are copied from. * @param other The LayeredDirectoryNode we are copied from.
@@ -119,7 +119,8 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public LayeredDirectoryNodeImpl(LayeredDirectoryNode other, public LayeredDirectoryNodeImpl(LayeredDirectoryNode other,
AVMStore repos) AVMStore repos,
Lookup lookup, boolean copyAll)
{ {
super(repos.getAVMRepository().issueID(), repos); super(repos.getAVMRepository().issueID(), repos);
fIndirection = other.getIndirection(); fIndirection = other.getIndirection();
@@ -128,12 +129,20 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
fLayerID = -1; fLayerID = -1;
fOpacity = false; fOpacity = false;
AVMDAOs.Instance().fAVMNodeDAO.save(this); AVMDAOs.Instance().fAVMNodeDAO.save(this);
for (ChildEntry child : AVMDAOs.Instance().fChildEntryDAO.getByParent(other)) Map<String, AVMNode> children = null;
if (copyAll)
{ {
ChildKey key = new ChildKey(this, child.getKey().getName()); children = other.getListing(lookup, true);
ChildEntryImpl newChild = new ChildEntryImpl(key, }
child.getChild()); else
AVMDAOs.Instance().fChildEntryDAO.save(newChild); {
children = other.getListingDirect(lookup, true);
}
for (Map.Entry<String, AVMNode> child : children.entrySet())
{
ChildKey key = new ChildKey(this, child.getKey());
ChildEntry entry = new ChildEntryImpl(key, child.getValue());
AVMDAOs.Instance().fChildEntryDAO.save(entry);
} }
setVersionID(other.getVersionID() + 1); setVersionID(other.getVersionID() + 1);
AVMDAOs.Instance().fAVMNodeDAO.flush(); AVMDAOs.Instance().fAVMNodeDAO.flush();
@@ -141,7 +150,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
copyAspects(other); copyAspects(other);
copyACLs(other); copyACLs(other);
} }
/** /**
* Construct one from a PlainDirectoryNode. Called when a COW is performed in a layered * Construct one from a PlainDirectoryNode. Called when a COW is performed in a layered
* context. * context.
@@ -200,12 +209,19 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
fOpacity = false; fOpacity = false;
setVersionID(dir.getVersionID() + 1); setVersionID(dir.getVersionID() + 1);
AVMDAOs.Instance().fAVMNodeDAO.save(this); AVMDAOs.Instance().fAVMNodeDAO.save(this);
Map<String, AVMNode> children = dir.getListing(srcLookup, true);
for (Map.Entry<String, AVMNode> child : children.entrySet())
{
ChildKey key = new ChildKey(this, child.getKey());
ChildEntry entry = new ChildEntryImpl(key, child.getValue());
AVMDAOs.Instance().fChildEntryDAO.save(entry);
}
AVMDAOs.Instance().fAVMNodeDAO.flush(); AVMDAOs.Instance().fAVMNodeDAO.flush();
copyProperties(dir); copyProperties(dir);
copyAspects(dir); copyAspects(dir);
copyACLs(dir); copyACLs(dir);
} }
/** /**
* Is this a primary indirection node. * Is this a primary indirection node.
* @return Whether this is a primary indirection. * @return Whether this is a primary indirection.
@@ -214,7 +230,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
{ {
return fPrimaryIndirection; return fPrimaryIndirection;
} }
/** /**
* Set the primary indirection state of this. * Set the primary indirection state of this.
* @param has Whether this is a primary indirection node. * @param has Whether this is a primary indirection node.
@@ -223,7 +239,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
{ {
fPrimaryIndirection = has; fPrimaryIndirection = has;
} }
/** /**
* Get the indirection path. * Get the indirection path.
* @return The indirection path. * @return The indirection path.
@@ -232,7 +248,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
{ {
return fIndirection; return fIndirection;
} }
/** /**
* Get the underlying path in the Lookup's context. * Get the underlying path in the Lookup's context.
* @param lPath The Lookup. * @param lPath The Lookup.
@@ -264,7 +280,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
} }
return lPath.getCurrentIndirectionVersion(); return lPath.getCurrentIndirectionVersion();
} }
/** /**
* Get the layer id. * Get the layer id.
* @return The layer id. * @return The layer id.
@@ -273,7 +289,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
{ {
return fLayerID; return fLayerID;
} }
/** /**
* Set the layer id. * Set the layer id.
* @param id The id to set. * @param id The id to set.
@@ -282,7 +298,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
{ {
fLayerID = id; fLayerID = id;
} }
/** /**
* Copy on write logic. * Copy on write logic.
* @param lPath * @param lPath
@@ -298,7 +314,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
// This means that this is being seen indirectly through the topmost // This means that this is being seen indirectly through the topmost
// layer. The following creates a node that will inherit its // layer. The following creates a node that will inherit its
// indirection from its parent. // indirection from its parent.
newMe = new LayeredDirectoryNodeImpl((String)null, newMe = new LayeredDirectoryNodeImpl((String)null,
store, this); store, this);
newMe.setPrimaryIndirection(false); newMe.setPrimaryIndirection(false);
newMe.setLayerID(lPath.getTopLayer().getLayerID()); newMe.setLayerID(lPath.getTopLayer().getLayerID());
@@ -307,7 +323,9 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
{ {
// A simple copy is made. // A simple copy is made.
newMe = new LayeredDirectoryNodeImpl(this, newMe = new LayeredDirectoryNodeImpl(this,
store); store,
lPath,
false);
newMe.setLayerID(getLayerID()); newMe.setLayerID(getLayerID());
} }
newMe.setAncestor(this); newMe.setAncestor(this);
@@ -412,7 +430,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
* @param includeDeleted Whether to inlude deleted nodes. * @param includeDeleted Whether to inlude deleted nodes.
* @return A Map of Strings to descriptors. * @return A Map of Strings to descriptors.
*/ */
public SortedMap<String, AVMNodeDescriptor> getListingDirect(AVMNodeDescriptor dir, public SortedMap<String, AVMNodeDescriptor> getListingDirect(AVMNodeDescriptor dir,
boolean includeDeleted) boolean includeDeleted)
{ {
List<ChildEntry> children = AVMDAOs.Instance().fChildEntryDAO.getByParent(this); List<ChildEntry> children = AVMDAOs.Instance().fChildEntryDAO.getByParent(this);
@@ -430,14 +448,14 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
} }
return listing; return listing;
} }
/** /**
* Get a listing from a directory node descriptor. * Get a listing from a directory node descriptor.
* @param dir The directory node descriptor. * @param dir The directory node descriptor.
* @param includeDeleted Should DeletedNodes be shown. * @param includeDeleted Should DeletedNodes be shown.
* @return A Map of names to node descriptors. * @return A Map of names to node descriptors.
*/ */
public SortedMap<String, AVMNodeDescriptor> getListing(AVMNodeDescriptor dir, public SortedMap<String, AVMNodeDescriptor> getListing(AVMNodeDescriptor dir,
boolean includeDeleted) boolean includeDeleted)
{ {
if (dir.getPath() == null || dir.getIndirection() == null) if (dir.getPath() == null || dir.getIndirection() == null)
@@ -500,7 +518,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
} }
/** /**
* Lookup a child by name. * Lookup a child by name.
* @param lPath The Lookup. * @param lPath The Lookup.
* @param name The name we are looking. * @param name The name we are looking.
* @param version The version in which we are looking. * @param version The version in which we are looking.
@@ -556,7 +574,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
{ {
throw new AVMBadArgumentException("Illegal null argument."); throw new AVMBadArgumentException("Illegal null argument.");
} }
ChildKey key = new ChildKey(this, name); ChildKey key = new ChildKey(this, name);
ChildEntry entry = AVMDAOs.Instance().fChildEntryDAO.get(key); ChildEntry entry = AVMDAOs.Instance().fChildEntryDAO.get(key);
if (entry != null) if (entry != null)
{ {
@@ -627,7 +645,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
{ {
child = temp.getFirst(); child = temp.getFirst();
} }
indirect = true; indirect = true;
} }
if (child != null && (indirect || child.getStoreNew() == null || child.getAncestor() != null)) if (child != null && (indirect || child.getStoreNew() == null || child.getAncestor() != null))
{ {
@@ -644,7 +662,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
AVMDAOs.Instance().fAVMNodeDAO.flush(); AVMDAOs.Instance().fAVMNodeDAO.flush();
} }
} }
/** /**
* Get the type of this node. * Get the type of this node.
* @return The type of this node. * @return The type of this node.
@@ -663,7 +681,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
{ {
return "[LD:" + getId() + ":" + getUnderlying(lPath) + "]"; return "[LD:" + getId() + ":" + getUnderlying(lPath) + "]";
} }
/** /**
* Set the primary indirection. No COW. * Set the primary indirection. No COW.
* @param path The indirection path. * @param path The indirection path.
@@ -677,7 +695,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
fIndirection = path; fIndirection = path;
fPrimaryIndirection = true; fPrimaryIndirection = true;
} }
/** /**
* Make this node become a primary indirection. COW. * Make this node become a primary indirection. COW.
* @param lPath The Lookup. * @param lPath The Lookup.
@@ -704,7 +722,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
} }
rawSetPrimary(target); rawSetPrimary(target);
} }
/** /**
* Let anything behind name in this become visible. * Let anything behind name in this become visible.
* @param lPath The Lookup. * @param lPath The Lookup.
@@ -727,7 +745,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
AVMDAOs.Instance().fChildEntryDAO.delete(entry); AVMDAOs.Instance().fChildEntryDAO.delete(entry);
} }
} }
/** /**
* Get the descriptor for this node. * Get the descriptor for this node.
* @param lPath The Lookup. * @param lPath The Lookup.
@@ -798,7 +816,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
fPrimaryIndirection, fPrimaryIndirection,
fLayerID, fLayerID,
fOpacity, fOpacity,
-1, -1,
-1); -1);
} }
@@ -822,7 +840,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
} }
else else
{ {
indirection = parentIndirection.endsWith("/") ? parentIndirection + name : indirection = parentIndirection.endsWith("/") ? parentIndirection + name :
parentIndirection + "/" + name; parentIndirection + "/" + name;
indirectionVersion = parentIndirectionVersion; indirectionVersion = parentIndirectionVersion;
} }
@@ -929,7 +947,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
ChildEntry newChild = new ChildEntryImpl(key, node); ChildEntry newChild = new ChildEntryImpl(key, node);
AVMDAOs.Instance().fChildEntryDAO.save(newChild); AVMDAOs.Instance().fChildEntryDAO.save(newChild);
} }
/** /**
* Remove name without leaving behind a deleted node. * Remove name without leaving behind a deleted node.
* @param name The name of the child to flatten. * @param name The name of the child to flatten.
@@ -962,7 +980,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
fIndirectionVersion = version; fIndirectionVersion = version;
} }
} }
/** /**
* Get the indirection version. * Get the indirection version.
* @return The indirection version. * @return The indirection version.