2014-02-17 2 views
0

Я работаю с сервером jackrabbit, где мы столкнулись с проблемой при запуске нескольких хранилищ в кластере. Проблема заключается в том, что путь структуры папки для вставки файла происходит иногда на 1-м репо и вставка файла во 2-й (до того, как оба сервера синхронизируются). Решение, которое я разработал для этого, - это изменить исходный код Jackrabbit и СОЗДАТЬ ПАДЕНИЕ ПАПКИ ДЛЯ ФАЙЛА, ЕСЛИ ПАПКА ПАКЕТА DOSENT EXIST вместо того, чтобы просто отбрасывать ошибку 409 CONFLICT Ниже приведено изменение в AbstractWebDavServlet в JackRabbit web-Davпосмотреть, существует ли узел в Jackrabbit AbstractWebDavServlet в JackRabbit

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 сеанса работы доцента.

ПОЖАЛУЙСТА ПОМОГИТЕ

+0

Разве вы не можешь просто использовать rootNode.getSession()? – TedTrippin

ответ

0

вы пытались использовать ту же технику, как doMkCol() делает:

parentResource.addMember(resource, getInputContext(request, null)); 
Смежные вопросы