[ 
https://issues.apache.org/jira/browse/JCR-3035?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Julian Reschke reassigned JCR-3035:
-----------------------------------

    Assignee: Julian Reschke
    
> 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.5, 2.2.7
>            Reporter: Flavio Donzé
>            Assignee: Julian Reschke
>            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.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira


Reply via email to