2011-03-01 2 views
7

아무에게 나 설명 할 수있는, 다음 시나리오를 진행하는 방법? 문서 (MS 워드 프로세서, ODS, PDF)를Jackrabbit 저장소에 메타 데이터 저장

  • 문서를 저장하는 잭 래빗을 사용 잭 래빗 콘텐츠 - 추출기

  • 통해 아파치 티카 + 내용 추출 통해

    Dublic 코어 메타 데이터 추출 (수신

    1. 콘텐츠)를 자신의 메타 데이터와 함께 저장소에 저장?

    2. 검색 문서 + 메타 데이터

    나는 점 3과 4에 관심이 있어요 ...

    세부 사항 : - 언어 감지 응용 프로그램 (일부 분석 대화 형 문서를 처리 단어 수 등) - 처리 결과를 사용자에게 반환하고 추출 된 컨텐트 및 메타 데이터 (추출 및 사용자 정의 사용자 메타 데이터)가 JCR 저장소에 저장되도록 (가능한 한 많은 세부 정보를 수집 - 더블린 코어 + 컨텐트/이벤트 처리 구문 분석) 0 내가 JCR 녹슨 약간, 그리고 난 2.0을 사용한 적이 있지만, 이것은 당신이 시작하는해야 당신에게

  • +0

    당신이 좀 더 컨텍스트를 줄 수 있습니다? 귀하의 질문에 관해 구체적으로 설명해 주실 수 있습니까? 이 품목 목록은 어디에서 왔습니까? – jzd

    +0

    @jzd : 저는 JCR과 jackrabbit에 대해 많이 알지 못해서 어떻게 처리되는지에 대해서는 언급하지 않습니다. – lisak

    +0

    문서가 내 애플리케이션에 업로드됩니다. 각 문서는 업로드되며 문서는 처리되고 지속됩니다. – lisak

    답변

    26

    파일 업로드는 기본적으로 JCR 2.0과 JCR 2.0에서 동일합니다. 그러나 JCR 2.0에서는 몇 가지 기본 제공 속성 정의를 추가하여 유용합니다.

    은 "NT : 파일"

    노드 유형은 파일을 나타 내기 위해 의도가 2 개의 내장 속성 정의 JCR (자동 생성 된 노드가 생성 될 때 저장소가 있습니다 둘 다) 2.0 :

    • JCR : 생성 (DATE)
    • JCR : "내용 JCR"createdBy (STRING)

    은 명명 된 하나의 아이를 정의합니다. 이 "jcr : content"노드는 모든 노드 유형이 될 수 있지만 일반적으로 내용 자체와 관련된 모든 정보는이 하위 노드에 저장됩니다.이러한 속성은 정의가 노드 유형 : 사실상의 표준은 "자원 NT"를 : 사용하는 것입니다

    • JCR : 필수 데이터 (BINARY)
    • JCR :과 lastModified (DATE)는
    • JCR를 자동 생성 : lastModifiedBy (STRING) 자동 작성
    • jcr : mimeType (STRING)이 (가) 보호 되었습니까?
    • jcr : 인코딩 (STRING)이 (가) 보호 되었습니까?

    "jcr : mimeType"및 "jcr : encoding"이 JCR 2.0에 추가되었습니다.

    특히 "jcr : mimeType"속성의 목적은 사용자가 원하는 내용을 정확하게 수행하는 것입니다. 즉 콘텐츠의 "유형"을 캡처하는 것입니다. 그러나 "jcr : mimeType"및 "jcr : encoding"속성 정의는 (JCR 구현에 의해) 보호 된 것으로 정의 될 수 있습니다 (JCR 구현이 자동으로 설정 함을 의미).이 경우 수동으로 허용되지 않습니다 이러한 속성을 설정하십시오. 나는 JackrabbitModeShape이 이것을 보호 된 것으로 취급하지 않는다고 생각합니다.

    // Get an input stream for the file ... 
    File file = ... 
    InputStream stream = new BufferedInputStream(new FileInputStream(file)); 
    
    Node folder = session.getNode("/absolute/path/to/folder/node"); 
    Node file = folder.addNode("Article.pdf","nt:file"); 
    Node content = file.addNode("jcr:content","nt:resource"); 
    Binary binary = session.getValueFactory().createBinary(stream); 
    content.setProperty("jcr:data",binary); 
    

    그리고 JCR 구현은 "JCR을 : mimeType를"치료하지 않는 경우 재산 여기

    이 내장 된 노드 유형을 사용하여 JCR 2.0 저장소로 파일을 업로드하는 방법을 보여줍니다 몇 가지 코드 (즉, 잭 래빗과 ModeShape) 보호, 당신은 수동으로이 속성을 설정해야 할 것 :

    content.setProperty("jcr:mimeType","application/pdf"); 
    

    메타 데이터가 매우 쉽게 저장할 수 있습니다 "NT : 파일"과 "JCR : 내용", 노드하지만 밖으로 -of-the-box "nt : file"및 "nt : resource"노드 유형은 추가 속성을 허용하지 않습니다. 따라서 다른 속성을 추가하기 전에 먼저 저장하려는 속성 종류에 대한 속성 정의가있는 mixin (또는 여러 mixins)을 추가해야합니다. 모든 속성을 허용하는 mixin을 정의 할 수도 있습니다. 다음은 CND 파일이 같은 믹스 인 정의한다 :

    content.addMixin("custom:extensible"); 
    content.setProperty("anyProp","some value"); 
    content.setProperty("custom:otherProp","some other value"); 
    

    또한 정의 할 수와 허용 믹스 인을 사용 :이 노드 유형 정의를 등록한 후

    <custom = 'http://example.com/mydomain'> 
    [custom:extensible] mixin 
    - * (undefined) multiple 
    - * (undefined) 
    

    를, 당신은 다음 노드에 이것을 사용할 수 있습니다 어떤 Dublin Core element을 위해 : 이러한 속성의

    <dc = 'http://purl.org/dc/elements/1.1/'> 
    [dc:metadata] mixin 
    - dc:contributor (STRING) 
    - dc:coverage (STRING) 
    - dc:creator (STRING) 
    - dc:date (DATE) 
    - dc:description (STRING) 
    - dc:format (STRING) 
    - dc:identifier (STRING) 
    - dc:language (STRING) 
    - dc:publisher (STRING) 
    - dc:relation (STRING) 
    - dc:right (STRING) 
    - dc:source (STRING) 
    - dc:subject (STRING) 
    - dc:title (STRING) 
    - dc:type (STRING) 
    

    모든 선택 사항이 믹스 인은 이름 또는 유형의 속성을 허용하지 않습니다. 나는 또한 이들 중 일부가 이미 내장 속성 (예 : "jcr : createBy", "jcr : lastModifiedBy", "jcr : created")으로 표시된다는 사실에서이 'dc : , "jcr : lastModified", "jcr : mimeType"), 그 중 일부는 내용과 더 관련이 있고 다른 일부는 파일과 더 관련이있을 수 있습니다.

    필요하다면 상속을 사용하여 메타 데이터 요구에 더 잘 맞는 다른 믹스 인을 정의 할 수 있습니다. 그러나 믹스 인 (mixins)으로 상속을 사용할 때는 조심하십시오. JCR은 노드가 여러 개의 믹스 인을 허용하기 때문에 믹스를 엄격하게 범위와 패싯 지향으로 설계하는 것이 가장 좋습니다 (예 : "ex : taggable", "ex : describeable" 필요에 따라 적절한 믹스 인을 노드에 적용하기 만하면됩니다.

    ("nt : file"노드 아래에 더 많은 어린이들을 허용하고 거기에 일부 메타 데이터를 저장하는 믹스 인을 정의하는 것은 훨씬 더 복잡합니다.)

    믹스는 환상적이고 JCR 콘텐츠에 엄청난 양의 유연성과 성능을 제공합니다.

    아, 그리고 당신이 원하는 모든 노드를 만든 경우, 세션 저장해야합니다 : 2.4.2 작업,

    session.save(); 
    
    +0

    대단히 감사합니다. 내 응용 프로그램을 구현하는 방법에 대한 전반적인 아이디어를 얻었습니다. Btw, 문서가 항상 쌍으로되어있을 때 유스 케이스를 어떻게 처리합니까? 예를 들어 번역 회사의 경우 : 소스 파일 x 대상 파일 (프랑스어> 영어). 나는 부모 노드 "Files"를 만들고 폴더는 "childFile"과 "targetFile"두 개의 자식 노드를 생성합니까? – lisak

    +0

    번역 및 여러 언어 지원이 어렵습니다. 나는 그것을 처리하는 몇 가지 방법을 생각할 수 있습니다 : 1) 별도의 파일을 사용하고 어떻게 든 그들을 함께 연결하십시오. '근원'과 '목표'에 대한 귀하의 제안은 길입니다. 다른 하나는 'translatedFrom'을 PATH 또는 (WEAK) REFERENCE 속성으로 사용하는 것일 수 있습니다. 2) 파일을 동일하게 취급하여 하나의 "nt : 파일"노드를 갖지만 여러 개의 "jcr : content"유형 노드가있는 경우 (예 : 기본 언어의 경우 "jcr : content" -fr "및"ex : content-en "). 다른 가능성도 있습니다. –

    +0

    CMIS와 호환되기 위해 필자는 지금까지이를 연기해야했습니다. CMIS와 OpenCMIS jcr 바인딩은 http://tools.oasis-open.org/issues/browse/CMIS-713까지 "보조 유형"을 다루지 않습니다 ...하지만 더 많은 시간이 필요할 것입니다. 이제 opencmis는 폴더, 파일 및 믹스와 함께 작동합니다 : simpleVersionable ... 결국 마침내 하나의 선택 항목 - 폴더> [sourceFolder, targetFolder]> 파일 ... – lisak

    1

    감사합니다, 어떤 도움 주셔서 감사합니다.

    이 부분은 link입니다. 두 번째 메모를 열려고합니다.

    파일을 노드에 저장하고 추가 메타 데이터를 노드에 추가하기 만하면됩니다. 파일을 저장하는 방법은 다음과 같습니다.

    Node folder = session.getRootNode().getNode("path/to/file/uploads"); 
    Node file = folder.addNode(fileName, "nt:file"); 
    Node fileContent = file.addNode("jcr:content"); 
    fileContent.setProperty("jcr:data", fileStream); 
    // Add other metadata 
    session.save(); 
    

    메타 데이터를 저장하는 방법은 사용자가 결정합니다. 간단한 방법은 키 값 쌍을 저장하는 것입니다 :

    fileContent.setProperty(key, value, PropertyType.STRING); 
    

    방금 ​​getProperty()를 호출하여 데이터를 읽을 수 있습니다.

    fileStream = fileContent.getProperty("jcr:data"); 
    value = fileContent.getProperty(key); 
    
    +0

    감사합니다. 이 유스 케이스의 문제점은 문서가 메타 데이터의 유형이 완전히 다르다는 점이다. 그래서 노드 트리에 "그룹/사용자/카테고리/문서"또는 "카테고리/그룹/사용자/문서"구조가있는 경우 (각 항목에 대해 잘 모르겠습니다) 각 문서는 " type "이 pdf/doc/odt/ppt 등이라면 매번이 코드를 테스트해야합니다. – lisak

    +0

    위의 코드 조각에서 3 행이 실제로 작동한다는 것은 놀랍습니다. JCR 사양 (3.7 절 JCR 2.0의 .11.2 및 JCR 1.0의 섹션 6.7.22.6) "jcr : content"노드는 필수이지만 자동 생성되지는 않습니다. –

    1

    나는 잭 래빗 새로운 오전입니다. 솔루션의 경우 핵심 Java 논리를 사용하여 유형을 확인하고 동작의 변형을 정의하는 사례를 넣을 수 있습니다.

    콘텐츠가 바이너리로 변환되어 저장되면서 다른 .txt 또는 .pdf 콘텐츠를 저장하는 데 문제가 없어도 걱정할 필요가 없습니다. 다음은 jackrabbit repo에서 pdf 파일을 업로드하고 다운로드 한 작은 샘플입니다.

    // Import the pdf file unless already imported 
          // This program is for sample purpose only so everything is hard coded. 
         if (!root.hasNode("Alfresco_E0_Training.pdf")) 
         { 
          System.out.print("Importing PDF... "); 
    
          // Create an unstructured node under which to import the XML 
          //Node node = root.addNode("importxml", "nt:unstructured"); 
          Node file = root.addNode("Alfresco_E0_Training.pdf","nt:file"); 
    
          // Import the file "Alfresco_E0_Training.pdf" under the created node 
          FileInputStream stream = new FileInputStream("<path of file>\\Alfresco_E0_Training.pdf"); 
          Node content = file.addNode("jcr:content","nt:resource"); 
          Binary binary = session.getValueFactory().createBinary(stream); 
          content.setProperty("jcr:data",binary); 
          stream.close(); 
          session.save(); 
          //System.out.println("done."); 
          System.out.println("::::::::::::::::::::Checking content of the node:::::::::::::::::::::::::"); 
          System.out.println("File Node Name : "+file.getName()); 
          System.out.println("File Node Identifier : "+file.getIdentifier()); 
          System.out.println("File Node child : "+file.JCR_CHILD_NODE_DEFINITION); 
          System.out.println("Content Node Name : "+content.getName()); 
          System.out.println("Content Node Identifier : "+content.getIdentifier()); 
          System.out.println("Content Node Content : "+content.getProperty("jcr:data")); 
          System.out.println(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"); 
    
         }else 
         { 
          session.save(); 
          Node file = root.getNode("Alfresco_E0_Training.pdf"); 
          Node content = file.getNode("jcr:content"); 
          String path = content.getPath(); 
          Binary bin = session.getNode(path).getProperty("jcr:data").getBinary(); 
          InputStream stream = bin.getStream(); 
          File f=new File("C:<path of the output file>\\Alfresco_E0_Training.pdf"); 
    
           OutputStream out=new FileOutputStream(f); 
           byte buf[]=new byte[1024]; 
           int len; 
           while((len=stream.read(buf))>0) 
           out.write(buf,0,len); 
           out.close(); 
           stream.close(); 
           System.out.println("\nFile is created..................................."); 
    
    
          System.out.println("done."); 
          System.out.println("::::::::::::::::::::Checking content of the node:::::::::::::::::::::::::"); 
          System.out.println("File Node Name : "+file.getName()); 
          System.out.println("File Node Identifier : "+file.getIdentifier()); 
          //System.out.println("File Node child : "+file.JCR_CHILD_NODE_DEFINITION); 
          System.out.println("Content Node Name : "+content.getName()); 
          System.out.println("Content Node Identifier : "+content.getIdentifier()); 
          System.out.println("Content Node Content : "+content.getProperty("jcr:data")); 
          System.out.println(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"); 
         } 
    
         //output the repository content 
         } 
        catch (IOException e){ 
         System.out.println("Exception: "+e); 
        } 
        finally { 
         session.logout(); 
         } 
         } 
    } 
    

    희망이