Search in sources :

Example 1 with ItemId

use of org.apache.jackrabbit.spi.ItemId in project jackrabbit by apache.

the class HierarchyEventListener method pushEvents.

/**
 * Retrieve the workspace state(s) affected by the given event and refresh
 * them accordingly.
 *
 * @param events the events to process.
 */
private void pushEvents(Collection<Event> events) {
    if (events.isEmpty()) {
        log.debug("Empty event bundle");
        return;
    }
    // TODO: handle new 283 event types and clean add/remove that is also present as move-event.
    // collect set of removed node ids
    Set<ItemId> removedEvents = new HashSet<ItemId>();
    // separately collect the add events
    Set<Event> addEvents = new HashSet<Event>();
    for (Iterator<Event> it = events.iterator(); it.hasNext(); ) {
        Event event = it.next();
        int type = event.getType();
        if (type == Event.NODE_REMOVED) {
            // remember removed nodes separately for proper handling later on.
            removedEvents.add(event.getItemId());
        } else if (type == Event.NODE_ADDED || type == Event.PROPERTY_ADDED) {
            addEvents.add(event);
            it.remove();
        }
    }
    /* Process ADD-events.
           In case of persisting transients modifications, the event-set may
           still contain events that are not covered by the changeLog such as
           new version-history or other autocreated properties and nodes.

           Add events need to be processed hierarchically, since its not possible
           to add a new child reference to a state that is not yet present in
           the state manager.
           The 'progress' flag is used to make sure, that during each loop at
           least one event has been processed and removed from the iterator.
           If this is not the case, there are not parent states present in the
           state manager that need to be updated and the remaining events may
           be ignored.
         */
    boolean progress = true;
    while (!addEvents.isEmpty() && progress) {
        progress = false;
        for (Iterator<Event> it = addEvents.iterator(); it.hasNext(); ) {
            Event ev = it.next();
            NodeId parentId = ev.getParentId();
            HierarchyEntry parent = null;
            if (parentId != null) {
                parent = hierarchyMgr.lookup(parentId);
                if (parent == null && ev.getPath() != null && parentId.getUniqueID() != null) {
                    // the parent by path.
                    try {
                        Path parentPath = ev.getPath().getAncestor(1);
                        parent = hierarchyMgr.lookup(parentPath);
                    } catch (RepositoryException e) {
                        // should not occur
                        log.debug(e.getMessage());
                    }
                }
            }
            if (parent != null && parent.denotesNode()) {
                ((NodeEntry) parent).refresh(ev);
                it.remove();
                progress = true;
            }
        }
    }
    /* process all other events (removal, property changed) */
    for (Event event : events) {
        int type = event.getType();
        NodeId parentId = event.getParentId();
        NodeEntry parent = (parentId != null) ? (NodeEntry) hierarchyMgr.lookup(parentId) : null;
        switch(type) {
            case Event.NODE_REMOVED:
            case Event.PROPERTY_REMOVED:
                // only remove the parent an skip this event.
                if (parent != null && !removedEvents.contains(parentId)) {
                    parent.refresh(event);
                }
                break;
            case Event.PROPERTY_CHANGED:
                // not exist either -> no need to inform propEntry
                if (parent != null) {
                    parent.refresh(event);
                }
                break;
            case Event.NODE_MOVED:
                // TODO: implementation missing
                throw new UnsupportedOperationException("Implementation missing");
            // break;
            case Event.PERSIST:
                // TODO: implementation missing
                throw new UnsupportedOperationException("Implementation missing");
            // break;
            default:
                // should never occur
                throw new IllegalArgumentException("Invalid event type: " + event.getType());
        }
    }
}
Also used : Path(org.apache.jackrabbit.spi.Path) RepositoryException(javax.jcr.RepositoryException) ItemId(org.apache.jackrabbit.spi.ItemId) NodeId(org.apache.jackrabbit.spi.NodeId) Event(org.apache.jackrabbit.spi.Event) HashSet(java.util.HashSet)

Example 2 with ItemId

use of org.apache.jackrabbit.spi.ItemId in project jackrabbit by apache.

the class URIResolverImpl method buildPropertyId.

PropertyId buildPropertyId(NodeId parentId, MultiStatusResponse response, String workspaceName, NamePathResolver resolver) throws RepositoryException {
    IdURICache cache = getCache(workspaceName);
    if (cache.containsUri(response.getHref())) {
        ItemId id = cache.getItemId(response.getHref());
        if (!id.denotesNode()) {
            return (PropertyId) id;
        }
    }
    try {
        DavPropertySet propSet = response.getProperties(DavServletResponse.SC_OK);
        Name name = resolver.getQName(propSet.get(JcrRemotingConstants.JCR_NAME_LN, ItemResourceConstants.NAMESPACE).getValue().toString());
        PropertyId propertyId = service.getIdFactory().createPropertyId(parentId, name);
        cache.add(response.getHref(), propertyId);
        return propertyId;
    } catch (NameException e) {
        throw new RepositoryException(e);
    }
}
Also used : DavPropertySet(org.apache.jackrabbit.webdav.property.DavPropertySet) NameException(org.apache.jackrabbit.spi.commons.conversion.NameException) RepositoryException(javax.jcr.RepositoryException) ItemId(org.apache.jackrabbit.spi.ItemId) PropertyId(org.apache.jackrabbit.spi.PropertyId) Name(org.apache.jackrabbit.spi.Name)

Example 3 with ItemId

use of org.apache.jackrabbit.spi.ItemId in project jackrabbit by apache.

the class URIResolverImpl method getItemUri.

String getItemUri(ItemId itemId, String workspaceName, SessionInfo sessionInfo) throws RepositoryException {
    IdURICache cache = getCache(workspaceName);
    // check if uri is available from cache
    if (cache.containsItemId(itemId)) {
        return cache.getUri(itemId);
    } else {
        StringBuffer uriBuffer = new StringBuffer();
        Path path = itemId.getPath();
        String uniqueID = itemId.getUniqueID();
        // resolver uuid part
        if (uniqueID != null) {
            ItemId uuidId = (path == null) ? itemId : service.getIdFactory().createNodeId(uniqueID);
            if (path != null && cache.containsItemId(uuidId)) {
                // append uri of parent node, that is already cached
                uriBuffer.append(cache.getUri(uuidId));
            } else {
                // try to request locate-by-uuid report to build the uri
                ReportInfo rInfo = new ReportInfo(JcrRemotingConstants.REPORT_LOCATE_BY_UUID, ItemResourceConstants.NAMESPACE);
                rInfo.setContentElement(DomUtil.hrefToXml(uniqueID, domFactory));
                HttpReport request = null;
                try {
                    String wspUri = getWorkspaceUri(workspaceName);
                    request = new HttpReport(wspUri, rInfo);
                    HttpResponse response = service.executeRequest(sessionInfo, request);
                    request.checkSuccess(response);
                    MultiStatus ms = request.getResponseBodyAsMultiStatus(response);
                    if (ms.getResponses().length == 1) {
                        String absoluteUri = resolve(wspUri, ms.getResponses()[0].getHref());
                        uriBuffer.append(absoluteUri);
                        cache.add(absoluteUri, uuidId);
                    } else {
                        throw new ItemNotFoundException("Cannot identify item with uniqueID " + uniqueID);
                    }
                } catch (IOException e) {
                    throw new RepositoryException(e.getMessage());
                } catch (DavException e) {
                    throw ExceptionConverter.generate(e);
                } finally {
                    if (request != null) {
                        request.releaseConnection();
                    }
                }
            }
        } else {
            // start build uri from root-item
            uriBuffer.append(getRootItemUri(workspaceName));
        }
        // resolve relative-path part unless it denotes the root-item
        if (path != null && !path.denotesRoot()) {
            String jcrPath = service.getNamePathResolver(sessionInfo).getJCRPath(path);
            if (!path.isAbsolute() && !uriBuffer.toString().endsWith("/")) {
                uriBuffer.append("/");
            }
            uriBuffer.append(Text.escapePath(jcrPath));
        }
        String itemUri = uriBuffer.toString();
        if (!cache.containsItemId(itemId)) {
            cache.add(itemUri, itemId);
        }
        return itemUri;
    }
}
Also used : Path(org.apache.jackrabbit.spi.Path) HttpReport(org.apache.jackrabbit.webdav.client.methods.HttpReport) DavException(org.apache.jackrabbit.webdav.DavException) ReportInfo(org.apache.jackrabbit.webdav.version.report.ReportInfo) HttpResponse(org.apache.http.HttpResponse) MultiStatus(org.apache.jackrabbit.webdav.MultiStatus) RepositoryException(javax.jcr.RepositoryException) IOException(java.io.IOException) ItemId(org.apache.jackrabbit.spi.ItemId) ItemNotFoundException(javax.jcr.ItemNotFoundException)

Example 4 with ItemId

use of org.apache.jackrabbit.spi.ItemId in project jackrabbit by apache.

the class URIResolverImpl method getNodeId.

private NodeId getNodeId(String uri, SessionInfo sessionInfo, boolean nodeIsGone) throws RepositoryException {
    IdURICache cache = getCache(sessionInfo.getWorkspaceName());
    if (cache.containsUri(uri)) {
        // id has been accessed before and is cached
        ItemId id = cache.getItemId(uri);
        if (id.denotesNode()) {
            return (NodeId) id;
        }
    }
    if (nodeIsGone) {
        throw new RepositoryException("Can't reconstruct nodeId from URI when the remote node is gone.");
    }
    // retrieve parentId from cache or by recursive calls
    NodeId parentId;
    if (isSameURI(uri, getRootItemUri(sessionInfo.getWorkspaceName()))) {
        parentId = null;
    } else {
        String parentUri = Text.getRelativeParent(uri, 1, true);
        parentId = getNodeId(parentUri, sessionInfo, false);
    }
    DavPropertyNameSet nameSet = new DavPropertyNameSet();
    nameSet.add(JcrRemotingConstants.JCR_UUID_LN, ItemResourceConstants.NAMESPACE);
    nameSet.add(JcrRemotingConstants.JCR_NAME_LN, ItemResourceConstants.NAMESPACE);
    nameSet.add(JcrRemotingConstants.JCR_INDEX_LN, ItemResourceConstants.NAMESPACE);
    HttpPropfind request = null;
    try {
        request = new HttpPropfind(uri, nameSet, DavConstants.DEPTH_0);
        HttpResponse response = service.executeRequest(sessionInfo, request);
        if (response.getStatusLine().getStatusCode() != DavServletResponse.SC_MULTI_STATUS) {
            throw new ItemNotFoundException("Unable to retrieve the node with id " + uri + ", response status was: " + response.getStatusLine().getStatusCode());
        }
        MultiStatusResponse[] responses = request.getResponseBodyAsMultiStatus(response).getResponses();
        if (responses.length != 1) {
            throw new ItemNotFoundException("Unable to retrieve the node with id " + uri);
        }
        return buildNodeId(parentId, uri, responses[0], sessionInfo.getWorkspaceName(), service.getNamePathResolver(sessionInfo));
    } catch (IOException e) {
        throw new RepositoryException(e);
    } catch (DavException e) {
        throw ExceptionConverter.generate(e);
    } finally {
        if (request != null) {
            request.releaseConnection();
        }
    }
}
Also used : DavException(org.apache.jackrabbit.webdav.DavException) MultiStatusResponse(org.apache.jackrabbit.webdav.MultiStatusResponse) HttpResponse(org.apache.http.HttpResponse) RepositoryException(javax.jcr.RepositoryException) IOException(java.io.IOException) ItemId(org.apache.jackrabbit.spi.ItemId) HttpPropfind(org.apache.jackrabbit.webdav.client.methods.HttpPropfind) NodeId(org.apache.jackrabbit.spi.NodeId) DavPropertyNameSet(org.apache.jackrabbit.webdav.property.DavPropertyNameSet) ItemNotFoundException(javax.jcr.ItemNotFoundException)

Example 5 with ItemId

use of org.apache.jackrabbit.spi.ItemId in project jackrabbit by apache.

the class IdURICache method remove.

public void remove(String uri) {
    String cleanUri = getCleanUri(uri);
    ItemId itemId = uriToIdCache.remove(cleanUri);
    if (itemId != null) {
        idToUriCache.remove(itemId);
    }
    log.debug("Removed: ItemId = " + itemId + " URI = " + cleanUri);
}
Also used : ItemId(org.apache.jackrabbit.spi.ItemId)

Aggregations

ItemId (org.apache.jackrabbit.spi.ItemId)12 RepositoryException (javax.jcr.RepositoryException)7 NodeId (org.apache.jackrabbit.spi.NodeId)5 Path (org.apache.jackrabbit.spi.Path)5 Name (org.apache.jackrabbit.spi.Name)4 IOException (java.io.IOException)2 ItemNotFoundException (javax.jcr.ItemNotFoundException)2 HttpResponse (org.apache.http.HttpResponse)2 Event (org.apache.jackrabbit.spi.Event)2 PropertyId (org.apache.jackrabbit.spi.PropertyId)2 NameException (org.apache.jackrabbit.spi.commons.conversion.NameException)2 DavException (org.apache.jackrabbit.webdav.DavException)2 ByteArrayInputStream (java.io.ByteArrayInputStream)1 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 ObjectInputStream (java.io.ObjectInputStream)1 ObjectOutputStream (java.io.ObjectOutputStream)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 Map (java.util.Map)1