views:

31

answers:

0

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.

related questions