Хранить метаданные в хранилище Jackrabbit - PullRequest
7 голосов
/ 01 марта 2011

Кто-нибудь может мне объяснить, как поступить в следующем сценарии?

  1. получение документов (MS docs, ODS, PDF)

  2. Извлечение метаданных из общедоступного ядра с помощью Apache Tika + извлечение контента с помощью экстракторов содержимого jackrabbit

  3. использование Jackrabbit для хранения документов (контента) в хранилище вместе с их метаданными ?

  4. получение документов + метаданные

Меня интересуют пункты 3 и 4 ...

ДЕТАЛИ: Приложение обрабатывает документы в интерактивном режиме (некоторый анализ - определение языка, подсчет слов и т. Д. + Собирает как можно больше подробностей - Дублинское ядро ​​+ анализ содержимого / обработка событий), чтобы он возвращал результаты обработки пользователю, а затем извлеченный контент и метаданные (извлеченные и пользовательские метаданные пользователя) сохраняются в хранилище JCR

Ценю любую помощь, спасибо

Ответы [ 3 ]

27 голосов
/ 02 марта 2011

Загрузка файлов в основном такая же для JCR 2.0, как и для JCR 1.0. Однако в JCR 2.0 добавлено несколько дополнительных полезных определений встроенных свойств.

Тип узла "nt: file" предназначен для представления файла и имеет два встроенных определения свойств в JCR 2.0 (оба из которых автоматически создаются репозиторием при создании узлов):

  • jcr: создано (ДАТА)
  • jcr: создалBy (STRING)

и определяет одного дочернего элемента с именем "jcr: content". Этот узел «jcr: content» может относиться к любому типу узлов, но, вообще говоря, вся информация, относящаяся к самому контенту, хранится на этом дочернем узле. Стандарт де-факто заключается в использовании типа узла "nt: resource", для которого определены следующие свойства:

  • jcr: данные (BINARY) обязательны
  • jcr: lastModified (DATE), созданный автоматически
  • jcr: lastModifiedBy (STRING) создан автоматически
  • jcr: mimeType (STRING) защищен?
  • jcr: кодировка (STRING) защищена?

Обратите внимание, что в JCR 2.0 были добавлены "jcr: mimeType" и "jcr: encoding".

В частности, целью свойства "jcr: mimeType" было сделать именно то, что вы просите - захватить "тип" содержимого. Однако определения свойств "jcr: mimeType" и "jcr: encoding" могут быть определены (реализацией JCR) как защищенные (то есть реализация JCR автоматически устанавливает их) - в этом случае вам не разрешат вручную установить эти свойства. Я считаю, что Jackrabbit и ModeShape не рассматривают их как защищенные.

Вот некоторый код, который показывает, как загрузить файл в репозиторий JCR 2.0, используя следующие встроенные типы узлов:

// 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" как защищенное (т. Е. Jackrabbit и ModeShape), вам придется установить это свойство вручную:

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

Метаданные очень легко могут храниться в узлах "nt: file" и "jcr: content", но стандартные типы узлов "nt: file" и "nt: resource" не позволяют для дополнительных свойств. Поэтому, прежде чем вы сможете добавить другие свойства, вам сначала нужно добавить миксин (или несколько миксинов), которые имеют определения свойств для типов свойств, которые вы хотите сохранить. Вы даже можете определить миксин, который позволил бы любое свойство. Вот файл CND, определяющий такой миксин:

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

После регистрации этого определения типа узла вы можете использовать его на своих узлах:

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

Вы также можете определить и использовать миксин, который разрешен для любого Dublin Core элемента :

<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)

Все эти свойства являются необязательными, и этот миксин не позволяет использовать свойства любого имени или типа. Я также не особо обращался к этому миксу «dc: метаданные», потому что некоторые из них уже представлены со встроенными свойствами (например, «jcr: createBy», «jcr: lastModifiedBy», «jcr: созданный» , "jcr: lastModified", "jcr: mimeType") и то, что некоторые из них могут быть больше связаны с контентом, а другие больше связаны с файлом.

Конечно, вы можете определить другие миксины, которые лучше соответствуют вашим потребностям в метаданных, используя наследование там, где это необходимо. Но будьте осторожны, используя наследование с миксинами - поскольку JCR позволяет узлу использовать несколько миксов, зачастую лучше спроектировать свои миксины так, чтобы они были строго ограничены и были ориентированы на фасеты (например, «ex: taggable», «ex: descriptionable» и т. Д.) а затем просто примените соответствующие миксины к узлу по мере необходимости.

(Даже возможно, хотя и гораздо сложнее, определить миксин, который позволяет большему количеству дочерних элементов в узлах "nt: file", и хранить там некоторые метаданные.)

Миксины - это просто фантастика, они дают невероятную гибкость и мощь вашему JCR-контенту.

О, и когда вы создали все нужные вам узлы, обязательно сохраните сеанс:

session.save();
1 голос
/ 25 июля 2012

Я новичок в Jackrabbit, работаю над 2.4.2. Что касается вашего решения, вы можете проверить тип, используя базовую Java-логику, и поставить регистры, определяющие любые изменения в вашем действии.

Вам не нужно беспокоиться о проблемах с сохранением содержимого различных .txt или .pdf в качестве их содержимое преобразуется в двоичный файл и сохраняется. Вот небольшой пример, в котором я загрузил и скачал файл PDF в / из репозитория jackrabbit.

    // 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(); 
        } 
        } 
}

Надеюсь, это поможет

1 голос
/ 02 марта 2011

Я немного заржавел с JCR, и я никогда не использовал 2.0, но это должно помочь вам начать.Вы захотите открыть второй комментарий.

Вы просто сохраняете файл в узле и добавляете в него дополнительные метаданные.Вот как хранить файл:

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);
...