2010-09-28 1 views
3

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

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


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

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

и не так:

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

Спасибо заранее.

ответ

9

Нет стандартного способа делать то, что вы хотите. API JCR просто не позволяет хранить произвольные значения Object. Допустимы только типы недвижимости в 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 свойства и конвертировать значение перечисления в строку, используя 'ToString()'; или
  2. Используйте тип свойства LONG и преобразуйте значение вашего перечисления в интегральное значение с помощью «ordinal()» и литье как длинное; или
  3. Используйте BINARY тип недвижимости и преобразовать значение перечисления в двоичное значение

ИМО, Вариант 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:

[например: Foo] Mixin
- например: бар (СТРОКА) < 'VALUE1', 'VALUE2', 'VALUE3'

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

[например: Foo] Mixin
- например: бар (STRING) < [0,3)

+0

Спасибо за исчерпывающий ответ. Я хотел избежать сравнения строк, так как у меня есть тип узла, который является перечислением. Использование типа свойства String позволяет использовать значения, отличные от тех, которые определены в перечислении, что было бы ошибкой. Я уже реализовал его с опцией 1., но был надежен, что будет лучший способ :) – Simeon

+1

Используете ли вы тип узла для определения свойства? Если это так, вы можете ограничить значения с помощью ограничений. Например, вот mixin, который определяет свойство «ex: bar» типа STRING, которое допускает только 3 значения (извините за форматирование): [ex: foo] mixin - ex: bar (STRING) <'VALUE1' , 'VALUE2', 'VALUE3' –

+0

Спасибо! Это здорово :) Я все еще не могу поделиться константами между определением свойства и кодом, но все же лучше, чем просто строки. Не могли бы вы добавить это в свой ответ для большей наглядности? – Simeon