JCR 170 Моделирование данных: имена узлов - PullRequest
1 голос
/ 23 марта 2009

Ситуация:
Допустим, мы реализуем движок блога на основе JCR с поддержкой локализации.
Структура контента выглядит примерно так: / blogname / content / [имя узла]

Проблема: Каков наилучший способ присвоения имен узлам контента (/ blogname / content / [nodename] ) для удовлетворения следующих требований:

  1. Имя узла должно использоваться в HTML для поддержки REST-подобных URL-адресов, т. Е. Blogname.com/content/nodename должно указывать на один элемент содержимого.
  2. Приведенное выше требование не должно приводить к появлению уродливых URL, т. Е. / Content / node_name - это хорошо, / content / node% 20name - это плохо.
  3. Программный поиск должен быть легким, учитывая имя узла, т. Е. // content [@ node_name = some-name]
  4. Схема именования должна гарантировать уникальность имени узла.

PS: используется реализация JCR JackRabbit

Ответы [ 3 ]

1 голос
/ 31 августа 2009

Для 1. до 3. ответ прост: просто используйте символы, которые вы хотите видеть в имени узла, т.е. экранируйте любую входную строку, которая у вас есть (например, заголовок записи в блоге), с ограниченным набором символов, таким как тот, что для URI .

Например, не разрешайте пробелы (которые разрешены для имен узлов JCR, но могут привести к появлению уродливых %20 в URL) и другие символы, которые должны быть закодированы в URL. Вы можете удалить эти символы или просто заменить их подчеркиванием, поскольку в большинстве случаев это выглядит хорошо.

Что касается уникальных имен (4.) , вы можете указать текущее время, вкл. миллисекунды или вы явно проверяете наличие коллизий. Первый может показаться немного уродливым, но, вероятно, никогда не подведет для сценария блога. Последнее можно сделать, реагируя на выброшенное исключение, если узел с таким именем уже существует, и добавив, например,. инкрементный счетчик и повторите попытку (например, my_great_post1, my_great_post2 и т. д.). Вы также можете заблокировать родительский узел, чтобы фактически только один сеанс мог одновременно добавить узел, что позволяет избежать пробного цикла, но за счет блокировки.

Примечание: //content[@node_name=some-name] не является допустимым запросом JCR Xpath. Вы, вероятно, хотите использовать /jcr:root/content//some-name для этого.

0 голосов
/ 28 октября 2010

Уникальные имена: Чтобы быстро сгенерировать уникальное имя из первых символов названия плюс случайное число (для разрешения конфликтов), вы можете использовать следующий алгоритм:

String title = "JCR 170 Data modeling: Node names";
String name = title.substring(0, Math.min(title.length(), 10)).trim().replace(' ', '_');
if (name is not unique) {
    name += "_";
    Random r = new Random();
    while (name is not unqiue) {
        name += Integer.toString(r.nextInt(10));
    }
}

Преимущество использования случайного числа: даже если у вас много похожих имен, это очень быстро разрешит конфликты.

0 голосов
/ 28 мая 2009

Относительно пункта 3. Недавно я узнал, что запросы xpath не позволяют элементам начинаться с цифры. Если имя вашего узла начинается с цифры, его можно запросить, экранируя первый байт имени, но ваши запросы будут более простыми, если вы начнете все имена узлов с буквы.

(Я не уверен насчет имен свойств. Никогда не видел ни одного, который начинался бы с буквы.)

...