10 August 2010

Apache Lenya — необычная opensource CMS на Java

CMS
В комментариях к топику Spring в действии — пробуем opensource CMS на Java я обмолвился об Apache Lenya, одной из opensource CMS на Java, и меня попросили написать о ней подробнее.
Apache Lenya Logo

Почему Apache Lenya


«Почему CMS на Java?» — первый вопрос, который у меня возник, когда поступили требования от заказчика. Ответ оказался простым: заказчик, крупная корпорация, имел опыт разработки проектов на Java, поэтому доверял ей больше всего. «Java EE» звучит для уха бизнесмена серьёзнее и надёжнее, чем, скажем, PHP. Как обстоят дела с надёжностью и серьёзностью на самом деле не суть важно, но всё же стоит учитывать, что крупные корпорации доверяют продуктам других крупных корпораций.

Итак, мы в компании стали искать CMS Java. Оказалось, что их существует не так уж и мало, как платных, так и свободно-распространяемых. Подробнее можно посмотреть здесь в Википедии
После анализа лицензий, а нам нужно было серьёзно «допиливать» CMS под нужды заказчика, выбор остановился на нескольких кандидатах: Nuxeo EP, Daisy, Hippo CMS, Alfresco и собственно Apache Lenya. Все были опробованы. После анализа исходных кодов и оценки сложности доработки мы решили остановится на Apache Lenya. Эта CMS предоставляла самые широкие возможности по изменению исходного кода, которые были легко доступны. Благо лицензия Apache License позволяла менять код и использовать потом продукт в коммерческих целях. Возникшие по началу проблемы были решены с помощью небольшого, но достаточно активного комьюнити.

Main Manu Bar

Возможности Apache Lenya


Apache Lenya предоставляет стандартные для CMS возможности (у меня есть опыт работы только Joomla, поэтому большая часть сравнений с ней):
  • WYSIWYG-редактор содержимого. Даже 2: Kupu и BXE. Легко добавляется более привычный FCKEditor.
  • Редактор форм для случаев, когда обычный WYSIWYG-редактор не справляется
  • Блокировка редактируемых страниц для предотвращения ситуаций, когда одна и та же страница редактируется несколькими пользователями
  • Интернационализация
  • Задание расписания на публикацию содержимого
  • Перемещение, копирование, архивация, удаление как отдельных страниц, так отдельных частей сайта
  • XHTML+CSS для разделения самого содержимого и внешнего вида
  • Возможность перенести страницы в архив
  • Разграничение прав доступа пользователей и групп пользователей к различным страницам или частям сайта
  • Интегрированный поиск по сайт (Apache Lucene)

А также не самые обычные:
  • Контроль версий. Любую отредактированную страницу можно откатить на несколько ревизий назад
  • Редактируемый жизненный цикл страниц. Одно- и двухэтапный цикл «Черновики-Опубликованные» включены в поставку
  • Разделение сайта на секции: Разработка, Опубликованное и Вспомогательное (Staging)
  • Все операции записываются в журнал операций
  • Конфигурационные данные хранятся в файлах. При желании можно подменить классы, обеспечивающие чтение/запись данных, на классы, работающие с базой данных
  • Идентификация пользователей по LDAP

Особенности:
  • Концепция «Публикаций»

Данная концепция позволяет переиспользовать уже созданную структуру сайта (или структуру и данные одной публикации) для новой публикации. Различные публикации могут использовать общую структуру сайта, но содержать различную информацию. Например, есть публикация по умолчанию, default, которая уже содержит в себе шаблоны XSLT, данные о пользователя, группах пользователей и другую служебную информацию. Публикация production наследуется от default. Тогда публикация production имеет такой же внешний вид (благодаря общим XSLT), доступ ко всем пользователям и группам. Однако может переопределить некоторые права пользователей, рендеринг страниц или вообще всё целиком. В общем, достаточно удобная возможность, если надо поддерживать несколько похожих сайтов.
  • Собирается с помощью Apache Ant
  • Apache Cocoon

Об это web-framework стоит поговорить отдельно чуть более подробно. Он является сердцем Apache Lenya.

Apache Cocoon


Apache Cocoon (оф. сайт) — фреймворк для веб-разработки. Имеет общие черты со Spring Framework, когда тот был ещё версии 2 или ещё моложе. Помимо всего прочего, стоит отметить, на мой взгляд, две главные особенности Кокона: наличие IoC контейнера и концепцию «каналов» (pipelines). У него есть много других примечательных особенностей, но именно эти две мне понадобились при доработке Apache Lenya. Что такое Inversion of Control, думаю, описывать не стоит, а вот про «каналы» стоит сказать пару слов.
«Каналы» — это своеобразная имплементация MVC паттерна. XML-rонфигурация выглядит примерно так:
<?xml version="1.0" encoding="iso-8859-1"?>
<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">

<!-- define the Cocoon processing pipelines -->
<map:pipelines>
<map:pipeline>
<!-- respond to *.html requests with
our docs processed by doc2html.xsl -->
<map:match pattern="*.html">
<map:generate src="{1}.xml"/>
<map:transform src="doc2html.xsl"/>
<map:serialize type="html"/>
</map:match>

<!-- later, respond to *.pdf requests with
our docs processed by doc2pdf.xsl -->
<map:match pattern="*.pdf">
<map:generate src="{1}.xml"/>
<map:transform src="doc2pdf.xsl"/>
<map:serialize type="fo2pdf"/>
</map:match>
</map:pipeline>
</map:pipelines>
</map:sitemap>

* This source code was highlighted with Source Code Highlighter.

Как видно, в мэппинге есть три основных этапа создания страниц:
  1. Генерация
  2. Трансформация
  3. Сериализация

В фигурных скобках передаются параметры для генератора.
Таким образом достигается гибкость и высокий уровень повторного использования компонентов: с помощью одного и того же генератора и разных трансформаций и сериализаций можно получать широкий спектр форматов выходных данных от банального html до pdf или csv.

Для реализации IoC-контейнера Apache Cocoon использует уже закрытый на данный момент фреймворк Apache Avalon. Вся конфигурация находится в файле cocoon.xconf. Здесь собрано почти всё: компоненты, источники данных, объявление модулей (Cocoon имеет гибкую систему подключаемых модулей) и прочее.
Документации по всему это в Интернете не так много, поэтому чуть более подробно о компонентах.
Концепция компонентов выглядит примерно так: несколько компонентов (component) объединяются по признаку роли (role), объявляется имплементация роли по умолчанию, а в Java-классе уже можно использовать роль и конкретную её имплементацию. Роли являются интерфейсами, а компоненты — это конкретные классы. Конкретные листинги файлов приводить не буду, они очень большие. Детали работы Apache Cocoon и Avalon требуют отдельной статьи.

Установка Apache Lenya


После скачивания apache-lenya-2.0.3-src.zip и его распаковки, которая может занять продолжительное время из-за большего числа файлов, его необходимо скомпилировать. Тут начинаются самые большие «танцы с бубном».
Версию 2.0.2 мне удалось сбилдить, исполнив в корне:
>build build-cocoon
>build build-cocoon
>build

Это не описка, первую команду надо выполнить два раза.
Для версии 2.0.3 всё оказалось намного сложнее.
Во-первых, в директории externals\cocoon_2_1_x\lib\optional надо обновить xalan-2.7.1.jar, чтобы он содержал package org.apache.xpath, и добавить serializer.jar из дистрибутива xalan-j_2_7_1-bin.zip. Кстати, после обновления xalan-2.7.1.jar могут возникнуть ошибки при компиляции, тогда надо искать другой xalan-2.7.1.jar. Я брал его из репозитория maven, а сериалайзер из дистрибутива Xalan.
Далее пытаемся сбилдить Cocoon. Для этого выполняем в корне:
build.bat build-cocoon -lib externals/cocoon_2_1_x/lib/optional

Раза с 3-го или даже с 4-го билд должен пройти успешно.
Параметр -lib externals/cocoon_2_1_x/lib/optional обязателен, потому что некоторые библиотеки с ant tasks лежат там, а некоторые библиотеки необходимы для компиляции.
Затем для пользователей Windows необходимо поставить GnuWin32 (можно взять отсюда), добавить в PATH из переменных окружения директорию, куда установился GnuWin32. Это необходимо, чтобы по ходу сборки была выполнена команда patch
В итоге, команда
build -lib externals/cocoon_2_1_x/lib/optional

должна закончиться волшебным сообщением BUILD SUCCESSFUL.
Если что-то не получилось, то можно дополнительно спросить меня или поискать ответы в почтовом архиве

Запуск Apache Lenya


Запуск у меня тоже не прошёл плавно. Сначала мне пришлось скопировать jms.jar (javax.jms package) и jta-1.1.jar (javax.transaction package) в build\lenya\webapp\WEB-INF\lib\ (надо это будет поправить в основной ant'овской сборке), и только после этого Apache Lenya успешно стартовал:
Lenya Homepage

Запускается Lenya с помощью файла lenya.bat или lenya.sh
По умолчанию используется контейнер сервлетов Jetty.
Также возможен запуск под Tomcat (лично протестировано). Более подробно об этом можно прочитать на официальном сайте.
Apache Lenya частично переведён на русский язык. Не локализованные надписи можно перевести, дописав нужные данные в файлах интернационализации: $LENYA_HOME$\src\webapp\lenya\resources\i18n

Создание новой публикации Apache Lenya


Для создания своей публикации необходимо выполнить следующее.
На главной странице нажимаем 'Create publication', вводим идентификатор (будущий контекст) и имя публикации:
Create publication

После создания нажимаем на ссылку на публикацию и попадаем на страницу со свойствами публикации:
Publication homepage

Выбираем 'Login for authoring' (позволяет редактировать содержимое сайта и конфигурацию сайта)
Логинимся как lenya (пароль levi)
Выбираем что сделать: экспортировать страницы по умолчанию или не создавать никаких страниц:
Import pages

Дальше пользователем lenya можно создавать страницы, их редактировать и отправлять на утверждение. В меню «Редактировать» можно создавать страницы, а в меню «Техпроцесс» управлять состоянием страниц:
Edit Menu
Workflow Menu

Пользователь alice (пароль levi) имеет роль рецензиста и имеет права на публикацию страниц. После публикации страницы появляеются на Live View (или закладка «Опубликовано»)
К справке, данные о пользователях, группах и ролях хранятся в \build\lenya\webapp\lenya\pubs\default\config\access-control\passwd\ Конечно же, их можно менять через веб-интерфейс, закладка 'Admin'.

Выводы


Apache Lenya — гибкая CMS на Java, имеющая в основе Apache Cocoon, а следовательно и все его возможности, и распространяемая под лицензией Apache License. Данная CMS обладает широкими возможностями, как говорится, «прямо из коробки», а функциональность может быть легко расширена написанием дополнительных модулей. Документации и руководств в Интернете немного, но есть небольшое активное сообщество. При определённых условиях Lenya можно рекомендовать к использованию.
В данной статье рассмотрены лишь основы и часть возможностей Apache Lenya. Если у кого-то будет интерес к этой теме, я могу продолжить описание этой необычной CMS.

Список ресурсов
  1. Официальный сайт Apache Lenya http://lenya.apache.org/
  2. Официальный сайт Apache Cocoon http://cocoon.apache.org/
  3. Почтовый архив Apache Lenya http://mail-archives.apache.org/mod_mbox/lenya-user/
  4. GnuWin32 http://gnuwin32.sourceforge.net/packages/patch.htm
  5. Список CMS на Java в Википедии
Tags:javacmsopen sourceapache lenya
Hubs: CMS
+27
17.1k 52
Comments 37