[ http://issues.apache.org/jira/browse/JCR-535?page=comments#action_12444107 ] Jukka Zitting commented on JCR-535: -----------------------------------
Some cosmetic comments on the patch. First, the following are just changes to whitespace. Is there some reason for making those changes (i.e. do they align the code better or make it more checkstyle-conformant)? If not, please simplify the patch by not making those changes. >>>>>>>>>> @@ -164,8 +165,8 @@ * @throws ConstraintViolationException if some constraints checks are not OK */ private boolean checkNode(NodeState parent, NodeInfo nodeInfo, List propInfo) - throws ConstraintViolationException, AccessDeniedException, VersionException, - LockException, ItemNotFoundException, ItemExistsException, RepositoryException { + throws ConstraintViolationException, AccessDeniedException, VersionException, + LockException, ItemNotFoundException, ItemExistsException, RepositoryException { itemOps.checkAddNode(parent, nodeInfo.getName(), nodeInfo.getNodeTypeName(), BatchedItemOperations.CHECK_ACCESS | BatchedItemOperations.CHECK_CONSTRAINTS @@ -231,7 +232,6 @@ itemOps.destroy(conflicting); } } - return true; } @@ -246,8 +246,8 @@ * @throws RepositoryException if issue in the NodeState */ private void createProperties(NodeState myNode, List propInfos) - throws ItemNotFoundException, ItemExistsException, ConstraintViolationException, - ValueFormatException, RepositoryException { + throws ItemNotFoundException, ItemExistsException, ConstraintViolationException, + ValueFormatException, RepositoryException { // process properties Iterator iter = propInfos.iterator(); while (iter.hasNext()) { @@ -272,7 +272,6 @@ // potential uuid conflict NodeState conflicting = null; NodeState node; - try { if (nodeInfo.getId() != null) { conflicting = itemOps.getNodeState(nodeInfo.getId()); @@ -280,7 +279,7 @@ } catch (ItemNotFoundException infe) { conflicting = null; } - if (conflicting != null) { + if (conflicting != null) { // resolve uuid conflict node = resolveUUIDConflict(parent, conflicting, nodeInfo); } @@ -287,7 +286,7 @@ else { // do create new node node = itemOps.createNodeState(parent, nodeInfo.getName(), nodeInfo.getNodeTypeName(), - nodeInfo.getMixinNames(), null, def); + nodeInfo.getMixinNames(), null, def); } return node; } @@ -305,7 +304,7 @@ * @throws RepositoryException */ private NodeState resolveUUIDConflict(NodeState parent, NodeState conflicting, NodeInfo nodeInfo) - throws ItemExistsException, ConstraintViolationException, IllegalStateException, RepositoryException { + throws ItemExistsException, ConstraintViolationException, IllegalStateException, RepositoryException { NodeState node = null; switch (uuidBehavior) { <<<<<<<<<< Second, is there a reason for getting rid of the debug and exception message? If the "parentId == null" should *really* never happen (i.e. it's part of an internal API contract), then you could use assert for that, but otherwise I don't see the value of dropping the message. >>>>>>>>>> @@ -312,35 +311,36 @@ case ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING: NodeId parentId = conflicting.getParentId(); if (parentId == null) { - String msg = "root node cannot be replaced"; - log.debug(msg); - throw new RepositoryException(msg); + //Shoudn't happen + throw new RepositoryException(); } <<<<<<<<<< Third, the added "else" clause below adds indentation to the code, without any functional difference since the "if" part always throws an exception. This makes reviewing the patch more difficult since I need to doublecheck each line on whether there was some other change than just the extra level of indentation. In fact the entire patch snippet below makes no functional difference, but verifying that takes extra effort. >>>>>>>>>> - // 'replace' current parent with parent of conflicting - try { - parent = itemOps.getNodeState(parentId); - } catch (ItemNotFoundException infe) { - // should never get here... - String msg = "internal error: failed to retrieve parent state"; - log.error(msg, infe); - throw new RepositoryException(msg, infe); + else { + // 'replace' current parent with parent of conflicting + try { + parent = itemOps.getNodeState(parentId); + } catch (ItemNotFoundException infe) { + // should never get here... + String msg = "internal error: failed to retrieve parent state"; + log.error(msg, infe); + throw new RepositoryException(msg, infe); + } + // remove conflicting: + // check if conflicting can be removed + // (access rights, node type constraints, locking & versioning status) + itemOps.checkRemoveNode(conflicting, + BatchedItemOperations.CHECK_ACCESS + | BatchedItemOperations.CHECK_LOCK + | BatchedItemOperations.CHECK_VERSIONING + | BatchedItemOperations.CHECK_CONSTRAINTS); + // do remove conflicting (recursive) + itemOps.removeNodeState(conflicting); + // do create new node + node = itemOps.createNodeState(parent, nodeInfo.getName(), + nodeInfo.getNodeTypeName(), nodeInfo.getMixinNames(), + nodeInfo.getId()); } - // remove conflicting: - // check if conflicting can be removed - // (access rights, node type constraints, locking & versioning status) - itemOps.checkRemoveNode(conflicting, - BatchedItemOperations.CHECK_ACCESS - | BatchedItemOperations.CHECK_LOCK - | BatchedItemOperations.CHECK_VERSIONING - | BatchedItemOperations.CHECK_CONSTRAINTS); - // do remove conflicting (recursive) - itemOps.removeNodeState(conflicting); - // do create new node - node = itemOps.createNodeState(parent, nodeInfo.getName(), - nodeInfo.getNodeTypeName(), nodeInfo.getMixinNames(), - nodeInfo.getId()); break; - + case ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING: // make sure conflicting node is not importTarget or an ancestor thereof Path p0 = hierMgr.getPath(importTarget.getNodeId()); @@ -394,7 +394,7 @@ refTracker.mappedUUID(nodeInfo.getId().getUUID(), node.getNodeId().getUUID()); } break; - //No need for default case. + //No need for default case. } return node; } @@ -478,7 +478,6 @@ } } - //-------------------------------------------------------------< Importer > /** * [EMAIL PROTECTED] <<<<<<<<<< That adds up to 150+ lines of changes, whose only functional effect is the removal of a debug and an exception message. I know the rest 60+ lines contain the meat of the patch, but the signal-to-noise ratio of the patch is really quite low. Could you get rid of the extra stuff before I focus on the real changes? Thanks. :-) Also, a test case that illustrates the desired behaviour would be nice. > Ignore root node when importing through sysView > ----------------------------------------------- > > Key: JCR-535 > URL: http://issues.apache.org/jira/browse/JCR-535 > Project: Jackrabbit > Issue Type: Improvement > Components: core > Reporter: Nicolas Toper > Priority: Minor > Attachments: patch-1-Ignore-root-node.txt, > patch-WorkspaceImporter-231006.txt > > > When importing through a sysView, we should ignore the root node. It is in > the sysView to provide a root XML node, but the importer is going to attach > it to the repository"s root node... Which would create another root node and > often raise exception. This is a know issue > I needed this behavior to change for the backup tool, since I use the > sysView. Therefore, I havce slightly updated the WorkspaceImporter. Maybe I > should update too the SessionImporter so we have a consistant behavior. What > do you think? -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira