CMS
JavaScript
Java
17 March 2016

О бедной XWiki замолвите слово — 2

Tutorial
image

В первой части статьи я рассказывал о том как сделать стандартный интерфейс более комфортным, однако с тех пор утекло достаточно воды, что бы вышли как новые версии xWiki-движка, так и поменялся интерфейс в сторону улучшения юзабилити. По этому в новой статье я предлагаю обсудить тюнинг и более тонкую настройку xWiki для портативного клиента (на базе связки Jetty и HSQLDB). Оговорюсь сразу, я не считаю это лучшей реализацией из возможных, но учитывая удобство развертывания портативной версии (скопировал в нужную папку и запустил), считаю что для индивидуальной работы или работы небольшого коллектива в спартанских условиях — это лучший вариант.

Добро пожаловать под Cut

Экспозиция
Сперва несколько замечаний:

1. Для того что бы xWiki запустилась необходимо что бы на ПК используемого в качестве хоста была установлена Java
2. Портативная версия, о настройке которой пойдет речь, запускается как на ПК под управлением Windows, так и Linux, однако в паре моментов, о которых будет оговорено отдельно, тюнинг будет отличаться.
3. На взгляд автора, исходя из его эмпирического опыта, для комфортной работы отдельно выделенному хосту желательно иметь отдельно выделенный двух-ядерный процессор семейства Intel/AMD и оперативной памяти не менее 3-4Гб, или аналогично настроенную виртуальную машину). В случае если хост это ПК/ноутбук для офисной работы, то рекомендую оперативную память проапгрейдить минимум до 4Гб, а так же поставить процессор i3 (или его аналог) или выше.
4. Для корректного внесения изменения в файлы конфигураций wiki-движка использовать Notepad++ или аналогичный.
5. После каждого изменения рекомендую делать промежуточный бэкап версий, на всякий случай.
6. Программа настраивалась под себя, для удобства структурирования результатов работы инженером ПТО/сметчиком.

Завязка
Скачать последнюю, на момент написания статьи, версию XWiki можно по следующей ссылке:
enterprise.xwiki.org/xwiki/bin/view/Main/Download
Установка
Варианты установки поддерживают: Windows, Debian, веб-контейнер (веб-сервер) — *.war, мультисистемный формат — *.jar и портативную версию вики на базе связки Jetty+HSQLDB, которая, ИМХО, наиболее удобна для настройки/эксплуатации Пользователем как в Windows, так и в Linux.

Для начала работ по настройке и тюнингу необходимо распаковать файлы из архива ZIP в корень диска (также рекомендуется переименовать папку до более короткого пути, например так: «D:\xwiki»).
Структура файлов и каталогов
. .
DIR data_____________Данные и БД
DIR jetty_____________Jetti
DIR META-INF_________Лицензия и замечания по ПО
DIR webapps__________движок xWiki
start_xwiki.bat
start_xwiki.sh
start_xwiki_debug.bat
start_xwiki_debug.sh
stop_xwiki.bat
stop_xwiki.sh

Запуск осуществляется файлом start_xwiki.bat для Windows (start_xwiki.sh для Linux через терминал), в котором уже прописаны все необходимые настройки. Окно консоли при этом рекомендуется свернуть. Теперь нам необходимо открыть окно web-браузера (окно консоли при этом закрывать категорически не рекомендуется), и ввести указанный URL из консоли (терминала), вида: http://localhost:8080/xwiki/bin/view/Main/

Теперь можно работать

Логин и пароль администратора по умолчанию:
Login: Admin
Password: admin

Развитие
I. Структура хранения информации.
Для хранения данных портативная версия основанная на Jetti использует базу HSQLDB со всеми ее плюсами и минусами, в частности стоит программное ограничение на вложения превышающие 32Мб (которое можно увеличить при желании, но не с этой БД). Возможно в конкретно Вашем случае этого будет более чем достаточно, но если забить HSQLDB мелкими файлами (фото 1..30Мб) до более чем 4Гб, то система начинает работать медленнее, а в какой-то момент попросту отказывается принимать новые вложения. Для того что бы разделить текст и вложения, а так же лучше всего подойдет следующий метод, а именно: xWiki поддерживает хранение файлов в папках на жестком диске.

Первым делом мы меняем расположение хранение вложенных файлов с БД на файловую систему, для этого необходимо внести изменения в xwiki.cfg (..\webapps\xwiki\WEB-INF\) (Последовательность символов #-# и # в файлах конфигурации означает комментарий)

xwiki.store.attachment.hint = file
xwiki.store.attachment.versioning.hint = file
xwiki.store.attachment.recyclebin.hint = file

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

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

известный Баг
There is a bug in XWiki, that prevents restoring attachments from the recycle bin via UI: you will find empty LiveTable. Attachment delete action brings new version to the document, so, the correct way to restore the attachment is to rollback to the necessary version. If you delete the document with the attachment and then click delete again to permanently expunge the document from history, the attachment will be removed from your system together
One of the options to avoid mess with attachments in the filesystem until this bug would be fixed, just turn off recycle bin for attachments at all.

примерный перевод
Существует ошибка в XWiki, которая мешает восстановить удаленные вложения из корзины через пользовательский интерфейс: вы найдете пустой LiveTable. Действие по удалению вложения сбивает счетчик версии документа, поэтому, правильный путь, чтобы восстановить вложение — это откат до нужной версии. Если удалить документ с приложением, а затем нажмите кнопку еще раз, чтобы удалить навсегда удалялись документ из истории, вложенный файл будет удален из системы вместе. Один из вариантов, чтобы избежать путаницы с вложениями в файловой системе, пока эта ошибка не будет исправлена, просто отключить корзины для всех удаленных вложений

Т.к. в пользовательском интерфейсе в корзине удаленные вложения не значатся (к удаляемым страницам это не относится) я рекомендую отключить корзину для удаленных файлов и их версий, пока этот баг не будет исправлен:
storage.attachment.recyclebin=0
xwiki.store.attachment.versioning=0

Для того что бы действие вступило в силу — перезапустить XWiki

Теперь изменяем ограничение в 32Мб на размер вложений, т.к. оно более не актуально, для этого необходимо:
1. Перейти по адресу: http://«yourwiki»/xwiki/bin/edit/XWiki/XWikiPreferences?editor=object
2. Раскрыть список «XWikiPreferences 0»
3. Проскроллировать вниз до пункта «Maximum Upload Size» и изменить его на любое другое значение (в байтах!!!)
4. Проскроллировать вниз до кнопки «Save»

Для того что бы действие вступило в силу — принудительно обновить страницу.

II. Настройка интерфейса
Общий тюнинг интерфейса XWiki осуществлялся в предыдущей статье, по-этому автор не будет на этом останавливаться подробно, а сосредоточится на подборке новой информации.

III. Настройка интеграции с Office
Конечно же имеется ввиду Open Office/Libre Office. Для начала необходимо установить один из пакетов в систему. Далее необходимо внести изменения в xwiki.properties (..\webapps\xwiki\WEB-INF\) и установить параметр:
openoffice.autoStart=true

а так же прописать пути к каталогам установленного офисного пакета в следующих переменных:
openoffice.homePath=C:/Users/{user}/AppData/Roaming/openOffice.org/3
openoffice.profilePath=C:/Program Files/OpenOffice.org 3

Известный баг и способ его обхода
Из-за бага XWiki bug 7164, XWiki игнорирует переменную openoffice.homePath для office server в файле xwiki.properties. Для этого необходимо дополнительно в Windows модифицировать файл start_xwiki.bat в каталоге XWiki, вставив в него следующую строку (с учетом Вашего пути к установленному пакету офис):
set XWIKI_OPTS=%XWIKI_OPTS% -Doffice.home=«C:\Program Files\LibreOffice 3.4»

для Linux модифицировать файл start_xwiki.sh
set XWIKI_OPTS=%XWIKI_OPTS% -Doffice.path=/usr/lib/libreoffice/

и перезапустить XWiki.

image

image
прим. Ссылка на подробное описание установок на англ.

IV. Расширения для комфортной работы и администрирования
Общий перечень расширений доступен следующей ссылке:
extensions.xwiki.org/xwiki/bin/view/Main
Установка всех расширений осуществляется из админки. Всего есть 2 способа установит расширение:
1. Зайти в «Administer Wiki» -> «Extension Manager» -> «Add Extensions». Далее вводится в строку для поиска название или часть названия/функционала на латинице и нажимается «Enter», в выведенных результатах, база расширений как и сами расширения находится на сайте XWiki, кликаем «Install», «Continue»
2. Загружаем с сайта файл(ы) с расширением *.xar, заходим в «Administer Wiki» -> «Content» -> «Import», выбираем и загружаем файл, кликаем по нему в окне и следом соглашаемся импортировать.

Администрирование: Экспорт вложений - Export All Attachments
Описание на английском доступно по следующей ссылке:
extensions.xwiki.org/xwiki/bin/view/Extension/Export+All+Attachments
код доступный по ссылке
=Export Attachments=

{{info}}
By default, the export is made from the **current database** and from **all spaces**.
{{/info}}

{{velocity}}
{{html}}
; Database:
: />
; Space name:
: />
; Path to directory to write to:
: />
; /> Confirm
: />

{{/html}}
{{/velocity}}

{{groovy}}
import com.xpn.xwiki.*;
import com.xpn.xwiki.api.*;
import com.xpn.xwiki.doc.*;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.net.URL;

class ExportedAttachments {
static attachmentsNo = 0;
}

// Export attachments
def void exportAttachments(XWikiContext context) {
def dirPath = request.dirpath + "/";
def dir = new File(dirPath);

String hqlDocCount = "select distinct count(doc.name) from XWikiDocument as doc";
String hqlDocList = "select doc.fullName from XWikiDocument as doc";

if(request.spaceName && request.spaceName != ''){
hqlDocCount += " where doc.web='" + request.spaceName + "'";
hqlDocList += " where doc.web='" + request.spaceName + "'";
}

XWiki wiki = context.getWiki();

int total = wiki.getStore().search(hqlDocCount, 0, 0, context).get(0);
println "**" + total + "** documents to search for attachments";

List documentNames = null;
int offset = 0;
while (documentNames == null || documentNames.size() == 100) {
documentNames = wiki.getStore().search(hqlDocList, 100, offset, context);

for (docName in documentNames) {
try {
XWikiDocument doc = context.getWiki().getDocument(docName, context);
exportDocAttachments(doc, dir, context);
} catch (Exception e) {
println "{{error}} Error : " + e + "{{/error}}";
}
}

offset += documentNames.size();
}

println "";
println "((({{info}}Export done.{{/info}})))";
println "**" + ExportedAttachments.attachmentsNo + "** attachments exported.";
}

// Export attachments for the given document
def void exportDocAttachments(XWikiDocument doc, File dir, XWikiContext context) {
if(doc.getAttachmentList().size() > 0){
println "* **" + doc.fullName + "**";

for (XWikiAttachment attach in doc.getAttachmentList()) {
println "** " + attach.filename;

try {
// Create file
File spaceDir = new File(dir, java.net.URLEncoder.encode(doc.web));
File docDir = new File(spaceDir, java.net.URLEncoder.encode(doc.name));
File destinationFile = new File(docDir, java.net.URLEncoder.encode(attach.filename));
def attachmentURL = doc.getExternalAttachmentURL(attach.filename, 'download', context);

// Copy attachment from URL
URL url = new URL(attachmentURL);
FileUtils.copyURLToFile(url, destinationFile);

ExportedAttachments.attachmentsNo++;

}catch(Exception e){
println "{{error}} Error: Could not create file: " + e + "{{/error}}";
}
}
}
}

// Handle request
if(request.confirm && request.dirpath){
// Set database
def currentDatabase = xcontext.getDatabase();
def newDatabase = currentDatabase;
if(request.dbName && request.dbName != ''){
newDatabase = request.dbName
}
xcontext.setDatabase(newDatabase);

println "=Exporting attachments from **" + newDatabase + "** wiki=";

// Export
exportAttachments(xcontext.context);

// Reset database
xcontext.setDatabase(currentDatabase);
}
{{/groovy}}


Удобно для того что бы массово сохранять все вложения в каждой конкретной Wiki/СубWiki. Для этого создается отдельная страница с любым наименованием, затем копируется код, страница сохраняется и в получившейся объекте вручную заполняются поля формы.

Минусы решения — заполнение происходит вручную, из-за того что XWiki работает в кодировке UTF-8 имена файлов на кириллице трансформируются набор букв и цифр, что вызывает неудобства. Как это решить? На текущий момент автор находится в творческом поиске.

Галерея для вложений - Lightbox Macro
image
Описание на английском доступно по следующей ссылке:
extensions.xwiki.org/xwiki/bin/view/Extension/Lightbox+Macro
Установка и настройка рассматривались в предыдущей статье

Менеджер задач - Task Manager Application
image
Описание на английском доступно по следующей ссылке:
extensions.xwiki.org/xwiki/bin/view/Extension/Task+Manager+Application

Самый что ни наесть менеджер задач. Плюсы в том что бесплатен и, относительно, гибок, минусы упираются в ограничения длины пути для вложенных файлов, из-за чего рекомендуется, если запускать под Windows, имена файлам вложений давать покороче, как и сами названия задач и Project'ов. Так же рекомендуется избегать символа «кавычки», т.к. при редактировании редактор все норовит обрезать имя задачи на конец фразы после первой «кавычки».

Внешнее отображение колонок можно менять, на взгляд автора там несколько больше ненужной для личного пользования информации, а вот важный пункт — "% выполнения" в стандартном отображении отсутствует. Таким образом заходим на страницу Task Manager'а, выбираем Правку страницы обычным редактором, не WYSIWYG и копируем следующий текст:
Код
{{velocity}}
#set ($discard = $services.localization.use('document', 'TaskManager.TaskManagerTranslations'))
#set ($discard = $xwiki.ssfx.use('uicomponents/widgets/userpicker/userPicker.css'))
#set ($columnsProperties = {
'number': {"type":"number","size":10},
'name': {"type":"text","size":10, "link":"view"},
'project': {"type":"list","size":10},
'status': {"type":"list","size":10,"html":true},
'severity': {"type":"list","size":10,"html":true},
'reporter': {"type":"text","size":10,"html":true},
'assignee': {"type":"text","size":10,"html":true},
'duedate': {"type":"text","size":10},
'progress': {"type":"number","size":10, "html":true},
'_actions': {"sortable":false,"filterable":false,"html":true,"actions":["edit","delete"]}
})
#set ($options = {
'className': 'TaskManager.TaskManagerClass',
'resultPage': 'TaskManager.TaskManagerLiveTableResults',
'translationPrefix': 'taskmanager.livetable.',
'tagCloud': true,
'rowCount': 1000,
'maxPages': 100,
'selectedColumn': 'number',
'defaultOrder': 'asc'
})
#set ($columns = ['number', 'name', 'project', 'progress', 'status', 'severity', 'reporter', 'assignee', 'duedate', '_actions'])
#livetable('taskmanager' $columns $columnsProperties $options)
{{/velocity}}

Здесь добавляется поле 'progress': 'progress': {«type»:«number»,«size»:10, «html»:true},, т.е. прогресс в строке #set ($columns = ['number', 'name', 'project', 'progress', 'status', 'severity', 'reporter', 'assignee', 'duedate', '_actions']) этот параметр добавляется после project, в случае если на Ваш взгляд некоторые колонки лишние, то их отображение можно убрать именно здесь, отредактировав строку.

Чего данный Task Manager не умеет, так это уведомлять о просроченном задании и вообще сигнализировать. Возможно авторы добавят это в следующей версии или выйдет новый Task Manager с улучшенным функционалом. Однако для структурирования информации и общей работы с платформой Wiki — он хорош. Из минусов так же стоит отметить отсутствие WYSIWYG редактора при создании и редактировании задач, однако макросы и код программирования эти страницы выполняют корректно.

Файловый менеджер - File Manager Application
image
Описание на английском доступно по следующей ссылке:
extensions.xwiki.org/xwiki/bin/view/Extension/File+Manager+Application
Вариант для хранения под рукой необходимых файлов — личное/общественное мини-облако. В отличие от Export All Attachments корректно обрабатывает кириллицу при выгрузке файлов на ПК.

Мастер Диаграмм - Diagram Application
image
Описание на английском доступно по следующей ссылке:
extensions.xwiki.org/xwiki/bin/view/Extension/Diagram+Application

Планировщик встреч - Meeting Application
image
еще картинки
image

image

Описание на английском доступно по следующей ссылке:
extensions.xwiki.org/xwiki/bin/view/Extension/Meeting+Application
Планировщик встреч, имеет встроенный графический интерфейс календаря, а так же привязывается картинку из GoogleMaps к месту встречи.

Календарь - Mocca Calendar Application
image
Описание на английском доступно по следующей ссылке:
extensions.xwiki.org/xwiki/bin/view/Extension/MoccaCalendar
Календарь — ежедневник.

Элементы интерфейса - XWiki Back To Top
Описание на английском доступно по следующей ссылке:
extensions.xwiki.org/xwiki/bin/view/Extension/Back+To+Top
При прокрутке текста, занимающего больше одной страницы, в правом нижнем углу окна появляется кнопка «Вверх»

Элементы интерфейса - Tabs Macro
image

image
Описание на английском доступно по следующей ссылке:
extensions.xwiki.org/xwiki/bin/view/Extension/Tabs+Macro
Макрос позволяющий добавить в редактируемую страницу вкладки
Код для примера
{{tabs idsToLabels='tabId11=My xwiki-wide tabs, tabId12=My working tabs :)' /}}
(%id="tabId11"%)((({{box cssClass="tabId11div"}}
First tab!
{{/box}}
I can post any content here
)))

(%id="tabId12"%)((({{box cssClass="tabId12div"}}
Second tab!
{{/box}}
And here too
)))



Элементы интерфейса - ShowHide Macro
image
Описание на английском доступно по следующей ссылке:
extensions.xwiki.org/xwiki/bin/view/Extension/Ajax+and+Show+Hide+Macro
Настраиваемый спойлер для текста.

Аннотации (интегрированный макрос)
image
Описание на английском доступно по следующей ссылке:
extensions.xwiki.org/xwiki/bin/view/Extension/Annotations+Application
вместо тысячи слов…




Кульминацияция
XWiki — это вики второго поколения, написанная на на языке Java, лицензия распространения LGPL, функциональность включает в себя блог, инструменты API, комментарии, аутентификацию по LDAP, экспорт страниц в PDF. Используется многими компаниями по всему миру. 25 языков интерфейса, включая русский.

Целью второй статьи является описание настроек для работы в походных условиях, например в командировке. Что необходимо инженеру ПТО? Ноутбук с дисплеем 15", пакет офисных программ, некоторая система для хранения и структурирования информации и, хотя бы на 2-3 часа в день точка доступа в интернет, для приемки и отправки почты. Почему Wiki? Потому что исполнительная документация регулярно правится и переписывается, т.е. требуется версионность, которую легко организовать на жестком средствами ОС, но в то же время комментарии к версиям порой ценнее файлов, а так же необходимо приложение позволяющее вести некоторый дневник событий и микрособытий, что с успехом решают приложения встреч(Calendar) и задач (Task'ов).

Итог работы:
Теперь у нас есть Вики-движок включающий функционал:
— Блога;
— WYSIWIG редактора;
— Галереи изображений;
— Возможности редактирования и создания новых макросов;
— Возможности программирования скриптов (Velocity, Groovy, Python, Ruby and PHP) и поддержки синтаксиса популярных Вики-движков (Confluence, JSPWiki, Creole, MediaWiki, and TWik);
— Календаря и планировщика встреч;
— Менеджера задач;
— Построения диаграмм;
— Интеграцией с Офисными приложений;
— Менеджера файлов.

Спасибо за внимание. :)

+5
13.4k 36
Comments 3
Top of the day