2014-02-17 46 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));