Пользовательский тип свойства узла JCR (Jackrabbit) - PullRequest
3 голосов
/ 28 сентября 2010

Я хочу использовать константу enum для значения свойства в jackrabbit.Однако Node.setProperty() принимает только типы примитивов String и Value в качестве типов значений свойств.

Я просматривал интерфейс ValueFactory, но, похоже, это мне не поможет.


Другими словами, я хочу сделать это:

node.setProperty("name", Enum.Const);

, а не это:

node.setProperty("name", Enum.Const.toString());

Заранее спасибо.

1 Ответ

9 голосов
/ 28 сентября 2010

Не существует стандартного способа делать то, что вы хотите. JCR API просто не позволяет хранить произвольные значения объектов. Единственные допустимые типы свойств в JCR 1.0:

  • STRING
  • BINARY
  • LONG
  • DOUBLE
  • DATE
  • BOOLEAN
  • NAME
  • PATH
  • REFERENCE

Все эти типы свойств действительны в JCR 2.0, но есть несколько новых:

  • WEAKREFERENCE
  • URI
  • DECIMAL

Кроме того, javax.jcr.ValueFactory не имеет методов, которые создают Value из произвольного java.lang.Object.

Есть три варианта:

  1. Используйте тип свойства STRING и преобразуйте значение enum в String с помощью 'toString ()'; или
  2. Используйте тип свойства LONG и преобразуйте свое значение перечисления в целое значение, используя ' ordinal () ' и приведение к типу long; или
  3. Используйте тип свойства BINARY и преобразуйте значение enum в значение BINARY

IMO, вариант 1 имеет смысл. Вариант 2 может быть лучше в некоторых ситуациях - например, он позволит использовать операторы сравнения для вашего свойства в JCR-SQL и JCR-SQL2. Вариант 3 будет работать, но он не очень практичен.

Опции 1 и 2 также могут использовать ограничения типа узла. Как вы, возможно, знаете, определения типов узлов включают определения свойств и определения дочерних узлов, разрешенные этим типом узла, и любое из определений свойств может указывать допустимые значения с использованием ограничений. Ограничения могут, например, ограничивать допустимые значения свойств с помощью шаблонов подстановочных знаков или литеральных значений (для свойств STRING и PATH), диапазонов значений (для свойств LONG, DOUBLE и DATE), диапазонов длины (для BINARY), требований к типу узла (для Свойства REFERENCE и WEAKREFERENCE), литералы (для свойств NAME). Обратите внимание, что значение считается действительным, если оно допускается любым ограничением.

Таким образом, для варианта 1 или 2 определение свойства, описывающее перечисление, может использовать ограничения для ограничения допустимых значений. В случае варианта 1 литеральные значения перечислений STRING ограничивают допустимые значения, установленные для свойства. Вот простой пример с использованием обозначения CND в JCR 2.0:

[ex: foo] mixin
- например: бар (STRING) <'VALUE1', 'VALUE2', 'VALUE3' </p>

При варианте 2 будет работать диапазон (или набор диапазонов) с приемлемыми значениями LONG. Вот простой пример:

[ex: foo] mixin
- например: бар (STRING) <[0,3) </p>

...