Hi all
I am trying to upgrade jackrabbit version in my project from 1.6 to 2.1.1. Some things from 2.1.1 are very usable. After transition on new version i get "magic" problems. I often catch NPE exception from inside jackrabbit api. After some investigations and tests i had found one of many problems.
What i do in my test? I declare custom node type in cnd file. Then register it.
[my:test] > nt:folder orderable - myp:html (string) = '' autocreated copy
Call method create.
private void testCreate(String name, String html, CredentialsTO credentials){
Node docRootNode;
Session session = null;
try {
session = getSession(credentials);
docRootNode = session.getRootNode();
Node testNode = docRootNode.addNode(name, "my:test");
testNode.setProperty("myp:html", html);
testNode.addMixin("mix:versionable");
session.save();
session.getWorkspace().getVersionManager().checkin(testNode.getPath());
} catch (Exception e) {
//do something
} finally {
logout(session);
}
}
Then do update.
private void testUpdate(String name, String html, CredentialsTO credentials){
Session session = null;
Node docRootNode;
try {
session = getSession(credentials);
docRootNode = session.getRootNode();
Node testNode = docRootNode.getNode(name);
session.getWorkspace().getVersionManager().checkout(testNode.getPath());
testNode.setProperty("myp:html", html);
session.save();
session.getWorkspace().getVersionManager().checkin(testNode.getPath());
} catch (Exception e) {
// do something
} finally {
logout(session);
}
}
After last checkin in update method i offten catch NullPointerException. I had connected src of jcr and jackrabbit and done some debug. This is method which throw exception in org.apache.jackrabbit.core.ItemManager.
private boolean canRead(ItemData data, Path path) throws AccessDeniedException, RepositoryException {
// JCR-1601: cached item may just have been invalidated
ItemState state = data.getState();
if (state == null) {
throw new InvalidItemStateException(data.getId() + ": the item does not exist anymore");
}
if (state.getStatus() == ItemState.STATUS_NEW &&
!data.getDefinition().isProtected()) { // THIS IS RIGHT PLACE data.getDefinition() = null
// NEW items can always be read as long they have been added
// through the API and NOT by the system (i.e. protected props).
return true;
} else {
return (path == null) ?
canRead(data.getId()) :
session.getAccessManager().canRead(path);
}
}
I don't understand when and why definition in NodeData can be null? This is my fault, wrong settings of repository or bug of jackrabbit()?
Thx all.