Search in sources :

Example 81 with ItemNotFoundException

use of javax.jcr.ItemNotFoundException in project jackrabbit by apache.

the class PropertyImpl method getNode.

public Node getNode() throws ValueFormatException, RepositoryException {
    Session session = getSession();
    Value value = getValue();
    int type = value.getType();
    switch(type) {
        case REFERENCE:
        case WEAKREFERENCE:
            return session.getNodeByUUID(value.getString());
        case PATH:
        case NAME:
            String path = value.getString();
            Path p = sessionContext.getQPath(path);
            boolean absolute = p.isAbsolute();
            try {
                return (absolute) ? session.getNode(path) : getParent().getNode(path);
            } catch (PathNotFoundException e) {
                throw new ItemNotFoundException(path);
            }
        case STRING:
            try {
                Value refValue = ValueHelper.convert(value, REFERENCE, session.getValueFactory());
                return session.getNodeByUUID(refValue.getString());
            } catch (RepositoryException e) {
                // try if STRING value can be interpreted as PATH value
                Value pathValue = ValueHelper.convert(value, PATH, session.getValueFactory());
                p = sessionContext.getQPath(pathValue.getString());
                absolute = p.isAbsolute();
                try {
                    return (absolute) ? session.getNode(pathValue.getString()) : getParent().getNode(pathValue.getString());
                } catch (PathNotFoundException e1) {
                    throw new ItemNotFoundException(pathValue.getString());
                }
            }
        default:
            throw new ValueFormatException("Property value cannot be converted to a PATH, REFERENCE or WEAKREFERENCE");
    }
}
Also used : Path(org.apache.jackrabbit.spi.Path) InternalValue(org.apache.jackrabbit.core.value.InternalValue) Value(javax.jcr.Value) ValueFormatException(javax.jcr.ValueFormatException) RepositoryException(javax.jcr.RepositoryException) PathNotFoundException(javax.jcr.PathNotFoundException) Session(javax.jcr.Session) ItemNotFoundException(javax.jcr.ItemNotFoundException)

Example 82 with ItemNotFoundException

use of javax.jcr.ItemNotFoundException in project jackrabbit by apache.

the class NodeImpl method getPrimaryPath.

/**
     * {@inheritDoc}
     *
     * Overridden to return a different path for shareable nodes.
     *
     * TODO SN: copies functionality in that is already available in
     *          HierarchyManagerImpl, namely composing a path by
     *          concatenating the parent path + this node's name and index:
     *          rather use hierarchy manager to do this
     */
@Override
public Path getPrimaryPath() throws RepositoryException {
    if (!isShareable()) {
        return super.getPrimaryPath();
    }
    NodeId parentId = getParentId();
    NodeImpl parentNode = (NodeImpl) getParent();
    Path parentPath = parentNode.getPrimaryPath();
    PathBuilder builder = new PathBuilder(parentPath);
    ChildNodeEntry entry = parentNode.getNodeState().getChildNodeEntry(getNodeId());
    if (entry == null) {
        String msg = "failed to build path of " + id + ": " + parentId + " has no child entry for " + id;
        log.debug(msg);
        throw new ItemNotFoundException(msg);
    }
    // add to path
    if (entry.getIndex() == 1) {
        builder.addLast(entry.getName());
    } else {
        builder.addLast(entry.getName(), entry.getIndex());
    }
    return builder.getPath();
}
Also used : Path(org.apache.jackrabbit.spi.Path) PathBuilder(org.apache.jackrabbit.spi.commons.name.PathBuilder) ChildNodeEntry(org.apache.jackrabbit.core.state.ChildNodeEntry) NodeId(org.apache.jackrabbit.core.id.NodeId) ItemNotFoundException(javax.jcr.ItemNotFoundException)

Example 83 with ItemNotFoundException

use of javax.jcr.ItemNotFoundException in project jackrabbit by apache.

the class CompiledPermissionsImpl method buildResult.

//------------------------------------< AbstractCompiledPermissions >---
/**
     * @see AbstractCompiledPermissions#buildResult(org.apache.jackrabbit.spi.Path)
     */
@Override
protected Result buildResult(Path absPath) throws RepositoryException {
    boolean existingNode = false;
    NodeImpl node;
    ItemManager itemMgr = session.getItemManager();
    try {
        ItemImpl item = itemMgr.getItem(absPath);
        if (item.isNode()) {
            node = (NodeImpl) item;
            existingNode = true;
        } else {
            node = (NodeImpl) item.getParent();
        }
    } catch (RepositoryException e) {
        // path points to a non-persisted item.
        // -> find the nearest persisted node starting from the root.
        Path.Element[] elems = absPath.getElements();
        NodeImpl parent = (NodeImpl) session.getRootNode();
        for (int i = 1; i < elems.length - 1; i++) {
            Name name = elems[i].getName();
            int index = elems[i].getIndex();
            if (!parent.hasNode(name, index)) {
                // last persisted node reached
                break;
            }
            parent = parent.getNode(name, index);
        }
        node = parent;
    }
    if (node == null) {
        // should never get here
        throw new ItemNotFoundException("Item out of hierarchy.");
    }
    boolean isAcItem = util.isAcItem(absPath);
    return buildResult(node, existingNode, isAcItem, new EntryFilterImpl(principalNames, absPath, session));
}
Also used : Path(org.apache.jackrabbit.spi.Path) NodeImpl(org.apache.jackrabbit.core.NodeImpl) ItemManager(org.apache.jackrabbit.core.ItemManager) ItemImpl(org.apache.jackrabbit.core.ItemImpl) RepositoryException(javax.jcr.RepositoryException) Name(org.apache.jackrabbit.spi.Name) ItemNotFoundException(javax.jcr.ItemNotFoundException)

Example 84 with ItemNotFoundException

use of javax.jcr.ItemNotFoundException in project jackrabbit by apache.

the class SessionImporter method startNode.

/**
     * {@inheritDoc}
     */
public void startNode(NodeInfo nodeInfo, List<PropInfo> propInfos) throws RepositoryException {
    NodeImpl parent = parents.peek();
    // process node
    NodeImpl node = null;
    NodeId id = nodeInfo.getId();
    Name nodeName = nodeInfo.getName();
    Name ntName = nodeInfo.getNodeTypeName();
    Name[] mixins = nodeInfo.getMixinNames();
    if (parent == null) {
        log.debug("Skipping node: " + nodeName);
        // parent node was skipped, skip this child node too
        // push null onto stack for skipped node
        parents.push(null);
        // notify the p-i-importer
        if (pnImporter != null) {
            pnImporter.startChildInfo(nodeInfo, propInfos);
        }
        return;
    }
    if (parent.getDefinition().isProtected()) {
        // skip protected node
        parents.push(null);
        log.debug("Skipping protected node: " + nodeName);
        if (pnImporter != null) {
            // pnImporter was already started (current nodeInfo is a sibling)
            // notify it about this child node.
            pnImporter.startChildInfo(nodeInfo, propInfos);
        } else {
            // potentially is able to deal with it, notify it about the child node.
            for (ProtectedItemImporter pni : pItemImporters) {
                if (pni instanceof ProtectedNodeImporter && ((ProtectedNodeImporter) pni).start(parent)) {
                    log.debug("Protected node -> delegated to ProtectedNodeImporter");
                    pnImporter = (ProtectedNodeImporter) pni;
                    pnImporter.startChildInfo(nodeInfo, propInfos);
                    break;
                }
            /* else: p-i-Importer isn't able to deal with the protected tree.
                     try next. and if none can handle the passed parent the
                     tree below will be skipped */
            }
        }
        return;
    }
    if (parent.hasNode(nodeName)) {
        // a node with that name already exists...
        NodeImpl existing = parent.getNode(nodeName);
        NodeDefinition def = existing.getDefinition();
        if (!def.allowsSameNameSiblings()) {
            // check for potential conflicts
            if (def.isProtected() && existing.isNodeType(ntName)) {
                /*
                     use the existing node as parent for the possible subsequent
                     import of a protected tree, that the protected node importer
                     may or may not be able to deal with.
                     -> upon the next 'startNode' the check for the parent being
                        protected will notify the protected node importer.
                     -> if the importer is able to deal with that node it needs
                        to care of the complete subtree until it is notified
                        during the 'endNode' call.
                     -> if the import can't deal with that node or if that node
                        is the a leaf in the tree to be imported 'end' will
                        not have an effect on the importer, that was never started.
                    */
                log.debug("Skipping protected node: " + existing);
                parents.push(existing);
                return;
            }
            if (def.isAutoCreated() && existing.isNodeType(ntName)) {
                // this node has already been auto-created, no need to create it
                node = existing;
            } else {
                // (see http://issues.apache.org/jira/browse/JCR-1128)
                if (!(existing.getId().equals(id) && (uuidBehavior == ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING || uuidBehavior == ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING))) {
                    throw new ItemExistsException("Node with the same UUID exists:" + existing);
                }
            // fall through
            }
        }
    }
    if (node == null) {
        // create node
        if (id == null) {
            // no potential uuid conflict, always add new node
            checkPermission(parent, nodeName);
            node = createNode(parent, nodeName, ntName, mixins, null);
        } else {
            // potential uuid conflict
            boolean isConflicting;
            try {
                // the following is a fail-fast test whether
                // an item exists (regardless of access control)
                session.getHierarchyManager().getName(id);
                isConflicting = true;
            } catch (ItemNotFoundException infe) {
                isConflicting = false;
            }
            if (isConflicting) {
                // resolve uuid conflict
                node = resolveUUIDConflict(parent, id, nodeInfo);
                if (node == null) {
                    // no new node has been created, so skip this node
                    // push null onto stack for skipped node
                    parents.push(null);
                    log.debug("Skipping existing node " + nodeInfo.getName());
                    return;
                }
            } else {
                // create new with given uuid
                checkPermission(parent, nodeName);
                node = createNode(parent, nodeName, ntName, mixins, id);
            }
        }
    }
    for (PropInfo pi : propInfos) {
        // find applicable definition
        QPropertyDefinition def = pi.getApplicablePropertyDef(node.getEffectiveNodeType());
        if (def.isProtected()) {
            // skip protected property
            log.debug("Skipping protected property " + pi.getName());
            // notify the ProtectedPropertyImporter.
            for (ProtectedItemImporter ppi : pItemImporters) {
                if (ppi instanceof ProtectedPropertyImporter && ((ProtectedPropertyImporter) ppi).handlePropInfo(node, pi, def)) {
                    log.debug("Protected property -> delegated to ProtectedPropertyImporter");
                    break;
                }
            /* else: p-i-Importer isn't able to deal with this property.
                         try next pp-importer */
            }
        } else {
            // regular property -> create the property
            createProperty(node, pi, def);
        }
    }
    parents.push(node);
}
Also used : NodeImpl(org.apache.jackrabbit.core.NodeImpl) NodeDefinition(javax.jcr.nodetype.NodeDefinition) Name(org.apache.jackrabbit.spi.Name) ItemExistsException(javax.jcr.ItemExistsException) QPropertyDefinition(org.apache.jackrabbit.spi.QPropertyDefinition) NodeId(org.apache.jackrabbit.core.id.NodeId) ItemNotFoundException(javax.jcr.ItemNotFoundException)

Example 85 with ItemNotFoundException

use of javax.jcr.ItemNotFoundException in project jackrabbit by apache.

the class SessionImporter method resolveUUIDConflict.

protected NodeImpl resolveUUIDConflict(NodeImpl parent, NodeId conflictingId, NodeInfo nodeInfo) throws RepositoryException {
    NodeImpl node;
    NodeImpl conflicting;
    try {
        conflicting = session.getNodeById(conflictingId);
    } catch (ItemNotFoundException infe) {
        // conflicting node can't be read,
        // most likely due to lack of read permission
        conflicting = null;
    }
    if (uuidBehavior == ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW) {
        // create new with new uuid
        checkPermission(parent, nodeInfo.getName());
        node = createNode(parent, nodeInfo.getName(), nodeInfo.getNodeTypeName(), nodeInfo.getMixinNames(), null);
        // remember uuid mapping
        if (node.isNodeType(NameConstants.MIX_REFERENCEABLE)) {
            refTracker.mappedId(nodeInfo.getId(), node.getNodeId());
        }
    } else if (uuidBehavior == ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW) {
        // if conflicting node is shareable, then clone it
        if (conflicting != null && conflicting.isNodeType(NameConstants.MIX_SHAREABLE)) {
            parent.clone(conflicting, nodeInfo.getName());
            return null;
        }
        String msg = "a node with uuid " + nodeInfo.getId() + " already exists!";
        log.debug(msg);
        throw new ItemExistsException(msg);
    } else if (uuidBehavior == ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING) {
        if (conflicting == null) {
            // since the conflicting node can't be read,
            // we can't remove it
            String msg = "node with uuid " + conflictingId + " cannot be removed";
            log.debug(msg);
            throw new RepositoryException(msg);
        }
        // make sure conflicting node is not importTargetNode or an ancestor thereof
        if (importTargetNode.getPath().startsWith(conflicting.getPath())) {
            String msg = "cannot remove ancestor node";
            log.debug(msg);
            throw new ConstraintViolationException(msg);
        }
        // remove conflicting
        conflicting.remove();
        // create new with given uuid
        checkPermission(parent, nodeInfo.getName());
        node = createNode(parent, nodeInfo.getName(), nodeInfo.getNodeTypeName(), nodeInfo.getMixinNames(), nodeInfo.getId());
    } else if (uuidBehavior == ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING) {
        if (conflicting == null) {
            // since the conflicting node can't be read,
            // we can't replace it
            String msg = "node with uuid " + conflictingId + " cannot be replaced";
            log.debug(msg);
            throw new RepositoryException(msg);
        }
        if (conflicting.getDepth() == 0) {
            String msg = "root node cannot be replaced";
            log.debug(msg);
            throw new RepositoryException(msg);
        }
        // 'replace' current parent with parent of conflicting
        parent = (NodeImpl) conflicting.getParent();
        // replace child node
        checkPermission(parent, nodeInfo.getName());
        node = parent.replaceChildNode(nodeInfo.getId(), nodeInfo.getName(), nodeInfo.getNodeTypeName(), nodeInfo.getMixinNames());
    } else {
        String msg = "unknown uuidBehavior: " + uuidBehavior;
        log.debug(msg);
        throw new RepositoryException(msg);
    }
    return node;
}
Also used : NodeImpl(org.apache.jackrabbit.core.NodeImpl) ItemExistsException(javax.jcr.ItemExistsException) ConstraintViolationException(javax.jcr.nodetype.ConstraintViolationException) RepositoryException(javax.jcr.RepositoryException) ItemNotFoundException(javax.jcr.ItemNotFoundException)

Aggregations

ItemNotFoundException (javax.jcr.ItemNotFoundException)139 RepositoryException (javax.jcr.RepositoryException)61 Node (javax.jcr.Node)44 Path (org.apache.jackrabbit.spi.Path)25 PathNotFoundException (javax.jcr.PathNotFoundException)23 NodeId (org.apache.jackrabbit.core.id.NodeId)22 ItemStateException (org.apache.jackrabbit.core.state.ItemStateException)16 IOException (java.io.IOException)14 InvalidItemStateException (javax.jcr.InvalidItemStateException)14 NodeState (org.apache.jackrabbit.core.state.NodeState)14 Name (org.apache.jackrabbit.spi.Name)14 AccessDeniedException (javax.jcr.AccessDeniedException)13 HttpResponse (org.apache.http.HttpResponse)13 DavException (org.apache.jackrabbit.webdav.DavException)13 ItemExistsException (javax.jcr.ItemExistsException)12 Session (javax.jcr.Session)12 NoSuchItemStateException (org.apache.jackrabbit.core.state.NoSuchItemStateException)12 ChildNodeEntry (org.apache.jackrabbit.core.state.ChildNodeEntry)11 ConstraintViolationException (javax.jcr.nodetype.ConstraintViolationException)10 MultiStatusResponse (org.apache.jackrabbit.webdav.MultiStatusResponse)10