2014-02-17 43 views
0

我正在使用一台jackrabbit服务器,我们在集群中运行多个存储库时遇到问题。 问题是文件插入的文件夹结构路径有时发生在第1个回购站和第2个文件的插入(在两个服务器同步之前)。 我为此设计的解决方案是更改Jackrabbit源代码并为文件创建文件夹路径(如果文件夹路径DOSENT EXIST),而不是仅返回409 CONFLICT错误 以下是JackRabbit web中的AbstractWebDavServlet更改 - Dav查看节点是否存在JackRabbit的Jackrabbit 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]); 
     } 

    } 
} 

..

现在试图找出一种方式来获得上述方法session.The用于获取JCR会话dosent工作的噩梦形势IM。

请请帮助

+0

你就不能使用rootNode.getSession()? – TedTrippin

回答

0

你试图使用相同的技术为doMkCol()做:

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