NullPointerException if accessing VersionHistory before checkin()
-----------------------------------------------------------------

                 Key: JCR-3035
                 URL: https://issues.apache.org/jira/browse/JCR-3035
             Project: Jackrabbit Content Repository
          Issue Type: Bug
    Affects Versions: 2.2.7, 2.2.5
            Reporter: Flavio Donzé
            Priority: Critical


I'm trying to update our software from Jackrabbit 2.2.4 to 2.2.7, I also tried 
version 2.2.5.
If I access the version history before calling VersionManager.checkin(), I get 
an NullPointerException. Bellow the stacktrace:

java.lang.NullPointerException
        at 
org.apache.jackrabbit.core.ItemManager.getDefinition(ItemManager.java:206)
        at org.apache.jackrabbit.core.ItemData.getDefinition(ItemData.java:99)
        at org.apache.jackrabbit.core.ItemManager.canRead(ItemManager.java:409)
        at 
org.apache.jackrabbit.core.ItemManager.createItemData(ItemManager.java:804)
        at 
org.apache.jackrabbit.core.ItemManager.getItemData(ItemManager.java:379)
        at org.apache.jackrabbit.core.ItemManager.getItem(ItemManager.java:316)
        at org.apache.jackrabbit.core.ItemManager.getItem(ItemManager.java:610)
        at 
org.apache.jackrabbit.core.SessionImpl.getNodeById(SessionImpl.java:493)
        at 
org.apache.jackrabbit.core.VersionManagerImpl$1.perform(VersionManagerImpl.java:122)
        at 
org.apache.jackrabbit.core.VersionManagerImpl$1.perform(VersionManagerImpl.java:114)
        at 
org.apache.jackrabbit.core.session.SessionState.perform(SessionState.java:200)
        at 
org.apache.jackrabbit.core.VersionManagerImpl.perform(VersionManagerImpl.java:95)
        at 
org.apache.jackrabbit.core.VersionManagerImpl.checkin(VersionManagerImpl.java:114)
        at 
org.apache.jackrabbit.core.VersionManagerImpl.checkin(VersionManagerImpl.java:100)
        at 
com.softmodeler.repository.service.impl.RepositoryService.test(RepositoryService.java:294)
        ...

I created a code snippet (mixed together from a bunch of own service methods), 
the second execution of test() should reproduce the exception.
If the "if (!isNew)" block is replaced with versionLabel = "1.0"; , the code 
runs through.

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = 
Exception.class)
public void test() {
        try {
                Session session = repository.login(CREDENTIALS, WORKSPACE);

                Node root = session.getRootNode();

                Node dataNode = null;
                if (root.hasNode("test")) {
                        dataNode = root.getNode("test");
                } else {
                        dataNode = root.addNode("test", JcrConstants.NT_FOLDER);
                }

                Node fileNode = null;
                String fileName = "test3.xml";
                if (!dataNode.hasNode(fileName)) {
                        File file = new File("D:/temp/" + fileName);
                        fileNode = createOrUpdateFileNode(dataNode, new 
FileInputStream(file), file.getName());
                } else {
                        fileNode = dataNode.getNode(fileName);
                }

                String versionLabel = null;

                boolean isNew = fileNode.isNew();

                if (!isNew) {
                        VersionManager versionManager = 
session.getWorkspace().getVersionManager();
                        String[] versionLabels = 
versionManager.getVersionHistory(fileNode.getPath()).getVersionLabels();
                        if (versionLabels.length > 0) {
                                Arrays.sort(versionLabels, versionComparator);

                                String[] segment = 
versionLabels[versionLabels.length - 1].split("\\."); //$NON-NLS-1$
                                Integer minor = Integer.valueOf(segment[1]);
                                String newVersion = segment[0] + "." + (minor + 
1); //$NON-NLS-1$

                                versionLabel = newVersion;
                        }
                }

                VersionManager versionManager = 
session.getWorkspace().getVersionManager();

                if (isNew) {
                        fileNode.addMixin(JcrConstants.MIX_VERSIONABLE);
                }

                session.save();

                logger.debug("checkout production node", fileNode.getPath()); 
//$NON-NLS-1$
                versionManager.checkout(fileNode.getPath());

                session.save();

                Version currentVersion = 
versionManager.checkin(fileNode.getPath());

                if (versionLabel == null) {
                        versionLabel = "0.1"; //$NON-NLS-1$
                }
                
versionManager.getVersionHistory(fileNode.getPath()).addVersionLabel(currentVersion.getName(),
 versionLabel, true);

                session.logout();
        } catch (Exception e) {
                e.printStackTrace();
        }
}




@Transactional(propagation = Propagation.REQUIRED, rollbackFor = 
Exception.class)
protected Node createOrUpdateFileNode(Node parent, InputStream stream, String 
name) throws Exception {
        Node fileNode = null;
        Node resNode = null;
        if (!parent.hasNode(name)) {
                fileNode = parent.addNode(name, JcrConstants.NT_FILE);
                resNode = fileNode.addNode(JcrConstants.JCR_CONTENT, 
JcrConstants.NT_RESOURCE);
        } else {
                fileNode = parent.getNode(name);
                resNode = fileNode.getNode(JcrConstants.JCR_CONTENT);
        }
        String type = mimetypesFileTypeMap.getContentType(name);
        resNode.setProperty(JcrConstants.JCR_MIMETYPE, type != null ? type : 
""); //$NON-NLS-1$
        resNode.setProperty(JcrConstants.JCR_LASTMODIFIED, 
Calendar.getInstance());

        Binary binary = new BinaryImpl(stream);
        resNode.setProperty(JcrConstants.JCR_DATA, binary);

        binary.dispose();
        stream.close();
        return fileNode;
}

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira


Reply via email to