【问题标题】:see if the node exists in Jackrabbit AbstractWebDavServlet in JackRabbit查看节点是否存在于 Jackrabbit 中的 Jackrabbit AbstractWebDavServlet in JackRabbit
【发布时间】:2014-02-17 14:55:05
【问题描述】:

我正在使用 jackrabbit 服务器,在该服务器上,我们在集群中运行多个存储库时遇到了问题。 问题是文件插入的文件夹结构路径有时发生在第一个 repo 和第二个文件的插入(在两个服务器同步之前)。 我为此设计的解决方案是更改 Jackrabbit 源代码并在文件夹路径不存在时为文件创建文件夹路径,而不是仅仅返回 409 CONFLICT 错误 以下是 JackRabbit web-Dav 中 AbstractWebDavServlet 的变化

    protected void doPut(WebdavRequest request, WebdavResponse response,
                     DavResource resource) throws IOException, DavException {

    DavResource parentResource = resource.getCollection();
    if (parentResource == null || !parentResource.exists()) {
        if(!parentResource.exists()) {
            try {
                createFolder((Session)request.getSession(), parentResource.getLocator().getPrefix(),parentResource.getLocator().getHref(true));
            }catch(Exception e) {
                throw new IOException();
            }

        }
        // parent does not exist
        response.sendError(DavServletResponse.SC_CONFLICT);
        return;
    }

    int status;
    // test if resource already exists
    if (resource.exists()) {
        status = DavServletResponse.SC_NO_CONTENT;
    } else {
        status = DavServletResponse.SC_CREATED;
    }

    parentResource.addMember(resource, getInputContext(request, request.getInputStream()));
    response.setStatus(status);
}
private String[] getFolders(String desUrl) throws Exception {
    if (null == desUrl || desUrl.length() == 0)
        return null;

    String[] folder = desUrl.split("/");
    String[] folders = new String[folder.length];
    for (int i = 0; i < folder.length; i++) {
        if (i == 0)
            folders[i] = folder[i];
        else
            folders[i] = folders[i - 1] + "/" + folder[i];
    }
    return folders;
}

public void createFolder(Session session123,String prefix,String href) throws Exception {
    String[] folders = /*this.getFolders(href.substring(prefix.length(),href.length()))*/href.substring(prefix.length()+1,href.length()-1).split("/");
    if (null != folders) {
        String davFolder = "";
        int length = folders.length;
        //Session session123 = ((JcrDavSession)session).getRepositorySession();
        Node rootNode=session123.getRootNode();
        for (int i = 0; i < length; i++) {
            if(!rootNode.hasNode(folders[i]))
                IOUtil.mkDirs(rootNode, folders[i], NodeType.NT_UNSTRUCTURED);
            else
                rootNode.getNode(folders[i]);
        }

    }
}

..

现在我陷入了噩梦般的境地,试图找出一种获取会话的方法。上述获取 jcr 会话的方法有效。

请帮忙

【问题讨论】:

  • 你不能只使用rootNode.getSession()吗?

标签: java jackrabbit jcr content-repository sardine


【解决方案1】:

您是否尝试过使用与doMkCol() 相同的技术:

parentResource.addMember(resource, getInputContext(request, null));

【讨论】:

    猜你喜欢
    • 2011-08-28
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2018-09-08
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多