}
public void testAutoFix() throws Exception {
// new repository
TransientRepository rep = new TransientRepository(new File(TEST_DIR));
Session s = openSession(rep, false);
Node root = s.getRootNode();
// add nodes /test and /test/missing
Node test = root.addNode("test");
Node missing = test.addNode("missing");
missing.addMixin("mix:referenceable");
UUID id = UUID.fromString(missing.getIdentifier());
s.save();
s.logout();
// remove the bundle for /test/missing directly in the database
Connection conn = DriverManager.getConnection(
"jdbc:derby:"+TEST_DIR+"/workspaces/default/db");
PreparedStatement prep = conn.prepareStatement(
"delete from DEFAULT_BUNDLE where NODE_ID_HI=? and NODE_ID_LO=?");
prep.setLong(1, id.getMostSignificantBits());
prep.setLong(2, id.getLeastSignificantBits());
prep.executeUpdate();
conn.close();
// login and try the operation
s = openSession(rep, false);
test = s.getRootNode().getNode("test");
// try to add a node with the same name
try {
test.addNode("missing");
s.save();
} catch (RepositoryException e) {
// expected
}
s.logout();
s = openSession(rep, true);
test = s.getRootNode().getNode("test");
// iterate over all child nodes fixes the corruption
NodeIterator it = test.getNodes();
while (it.hasNext()) {
it.nextNode();
}
// try to add a node with the same name
test.addNode("missing");
s.save();
// try to delete the parent node
test.remove();
s.save();
s.logout();
rep.shutdown();
FileUtils.deleteDirectory(new File("repository"));
}