Загрузка файлов в основном такая же для 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();