Хранить метаданные в репозитории Jackrabbit

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

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

  2. извлечение метаданных dublic core через Apache TIKA + извлечение контента через jackrabbit-content-extractors

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

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

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

детали: Приложение обработки документов в интерактивном режиме (какой-то анализ - определение языка, количество слов и т. д. + соберите как можно больше деталей - Dublin core + разбор содержимого / обработки событий), чтобы он возвращал результаты обработки пользователю, а затем извлеченные содержимое и метаданные (извлеченные и пользовательские метаданные пользователя) хранятся в репозитории JCR

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

3 ответов


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

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

  • jcr: создано (дата)
  • jcr: createdBy (строка)

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

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

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

в частности, целью свойства "jcr:mimeType" было сделать именно то, что вы просите - захватить "тип" содержимого. Однако определения свойств" jcr:mimeType "и" JCR:encoding " могут быть определены (реализацией JCR) как защищенные ( что означает, что реализация JCR автоматически устанавливает их) - если в этом случае вам не будет разрешено вручную устанавливать эти свойства. Я верю этому Заяц и 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 " не допускают дополнительных свойств. Поэтому, прежде чем добавлять другие свойства, сначала необходимо добавить mixin (или несколько mixins), которые имеют определения свойств для типов свойств, которые вы хотите сохранить. Вы даже можете определить mixin, который позволит любое свойство. Вот файл 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");

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

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

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

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

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

Mixins фантастические и дают огромное количество гибкости и мощности для вашего контента JCR.

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

session.save();

Я немного ржавый с 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);

Я новичок в 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(); 
        } 
        } 
}

надеюсь, что это помогает