.. _rt: Rt **** .. highlight:: xml Rt (``jandcode.utils.rt.Rt``) - это древовидная структура данных, где каждый узел дерева имеет имя, атрибуты, дочерние элементы и предка. Получить представление об Rt можно из этого примера (он будет использоваться в дальнейшем для объяснения некоторых понятий)::
В этом примере описан объект с именем ``root``, который имеет дочерние объекты ``field``, ``table``. В свою очередь объект ``field`` имеет дочерние ``sys``, ``string``, ``int`` и т.д. Имена атрибутов и узлов - регистронезависимые. Точка допустима в имени узла и имени атрибута. Имена дочерних узлов (в пределах одного родителя) должны быть уникальны. Каждый элемент характеризуется путем, в котором перечислены все его родительские элементы, начиная (но не включая) корневой элемент. Элементы пути разделяются ``/``. В примере мы можем увидеть объекты с путями:: field/string table/tab2/field/name2 Атрибут ``parent`` интерпретируется особым образом. В нем указывается путь объекта rt, который является предком для этого. Если такой атрибут присутствует, то поиск значения атрибута и дочерних элементов осуществляется вверх по иерерхии, начиная с искомого. Первый найденный элемент будет возвращен. Программный интерфейс ===================== Создание нового корневого объекта Rt:: Rt root = new RtRoot() Для доступа к значениям атрибутов используются методы ``getValue/setValue``. В качестве параметра используется: * ``attribute_name`` - значение атрибута ``attribute_name`` объекта * ``path:attribute_name`` - значение атрибута ``attribute_name`` у объекта по пути ``path`` Например: .. code-block:: java root.getValue("field/string:title") // => String Rt t1 = root.findChild("field/string") t1.getValue("title") // => String Формат XML ========== Для xml-файлов, которые написаны для хранения rt, используется расширение ``.rt``. При загрузке Rt из xml-файлов, каждый узел, имя которого не начинается с ``x-``, рассматривается как объект Rt. Его имя совпадает с именем узла. Все атрибуты узла xml, имена которых не начинаются с ``x-`` рассматриваются как атрибуты Rt-объекта. Все дочерние элементы xml рассматриваются как дочерние объекты Rt. Если узел имеет атрибут ``name``, то значение атрибута ``name`` интерпретируется как имя дочернего узла, который описывается этим тегом. Например::
эквивалентно::
Если имя узла ``i``, то оно заменяется на уникальное значение. Используется для узлов, имя которых не важно:: Текст узла ---------- Если узел имеет текст, то он сохраняется в атрибуте ``text``:: TEXT VALUE эквивалентно:: Документирующий коментарий -------------------------- Если коментарий начинается с символа ``@``, то он сохраняется в атрибуте ``comment`` того узла, внутри которого был встречен:: эквивалентно:: Системные атрибуты ------------------ Атрибуты, имена которых начинается с ``x-`` обрабатываются специальным способом. x-root ~~~~~~ Устанавливает для узла флаг "виртуального корня". Для таких узлов все parent дочерних элементов обрабатываются относительно этого "виртуального корня". А если не найдено тут, то относительно реального корня. Используется для выделения частично независимых узлов в rt:: Системные узлы -------------- Узлы, имена которых начинаются с ``x-`` обрабатываются особым способом. x-include ~~~~~~~~~ Включение в узел, внутри которого встретился, файла (файлов) или другого узла. Файл грузится в один узел только один раз. При повторной загрузке - игнорируется. Этой особенностью можно воспользоваться для организации зависимостей. Атрибуты: * ``path`` - путь до включаемого файла относительно текущего загружаемого. Может включать '*' для загрузки группы файлов * ``recursive`` - по умолчанию=false. При значении true - если в path есть '*', то файлы рекурсивно ищутся в дочерних каталогах указанного пути. * ``required`` - по умолчанию=true. При значении true - если файл не найден, генерируется ошибка. Иначе ошибка игнорируется. * ``rtpath`` - если указан, рассматривается как путь уже загруженного объекта, содержимое которого накладывается на узел (и атрибуты и дети), внутри которого объявлена директива. Накладывается не только сам узел, указанный в атрибуте, но и все его предки. Раскрытие при наложении не производится. * ``module`` - если указан, рассматривается как java-пакет, в котором должен лежать файл ``module.rt``, который и загружается. Эквивалентно загрузке файла ``res:MODULEPATH/module.rt``. * ``plugin`` - если указан, рассматривается как включение плагина загрузки в текущий узел. Т.е. выполняется метод плагина ``jandcode.utils.rt.IRtPlugin#handleInclude`` в контексте текущего узла. Пример::
Пример загрузки модулей:: x-module ~~~~~~~~ Определение модуля. Модулем является java-пакет, в котором есть файл ``module.rt`` и системный узел ``x-module`` должен быть использован только в этом файле. Атрибуты: * ``name`` - имя модуля. Должно совпадать с именем java-пакета, где расположен ``module.rt`` Дочерние узлы: * ``depend`` - зависимость модуля. В атрибуте ``name`` указывается имя модуля, который должен быть включен до этого. Пример:: Узел отправляется на обработку всем плагинам загрузки (описанных в узлах ``x-plugin``) в метод ``handleSysChild``. После обработки, узел модуля сохраняется как дочерний узла ``module``:: x-parentexpander ~~~~~~~~~~~~~~~~ Определение правила раскрытия сокращенных значений атрибута ``parent``. Атрибуты: * ``path`` regex для пути узла * ``parentvalue`` regex для значения атрибута parent * ``replace`` на что заменять Пример:: Если для значения ``parent`` не определено правило и в нем нет ``/``, то тогда используется значение ``имя_владельца/значение_parent``. Если значение ``parent`` начинается с ``/``, то раскрытие для него не производится. Считается что указан явный абсолютный путь. x-attr ~~~~~~ Определение атрибута с многострочным значением. В атрибуте ``name`` имя атрибута, в тексте узла - значение атрибута. Пример:: a2-1 a2-2 x-plugin ~~~~~~~~ Определение плагина загрузки. Плагином является класс, который участвует в процессе загрузки и может изменять узел, внутри которого он был включен. Включение плагина в процесс загрузки осуществляется через тег ``x-include``, в атрибуте ``plugin`` которого указывается имя включаемого плагина. Атрибуты: * ``name`` - имя плагина. Должно быть уникальным среди всех плагинов. Можно не указывать, тогда имя генерируется. Плагины без имени нельзя будет использовать в ``x-include`` * ``class`` - имя класса плагина загрузки. Должен реализовывать интерфейс ``jandcode.utils.rt.IRtPlugin``. Если не указан, то должен быть указан атрибут ``path``. * ``path`` - если указан и не указан атрибут ``class``, то подразумеватся специальный плагин, который будет включать в узел файл(ы), указанный в этом атрибуте * ``остальные`` - атрибуты, которые передаются экземпляру плагина и используются им по своему усмотрению Дочерние узлы: * ``depend`` - зависимость плагина. В атрибуте ``name`` указывается имя плагина, который должен быть использован до этого. Подстановки ----------- В значениях атрибутов и текста узлов раскрываются подстановки ``#{VAR}``, где ``VAR``: * ``path`` - абсолютный путь до текущего файла * ``pathup:FILENAME`` - абсолютный путь вверх до каталога, содержащего файл ``FILENAME``, начиная с текущего каталога * ``pathprop:PROPNAME`` - значение из ``UtFile.getPathprop(String, String)``, начиная с текущего каталога * ``rt:RTPATH`` - значение по пути ``RTPATH`` из загруженной к этому времени rt * ``остальные`` - значение из ``System.getProperties()`` В описаниях подстановок используются термины: * **текущий файл** - файл, в котором встретилась подстановка * **текущий каталог** - каталог, в котором лежит файл в котором встретилась подстановка Пример::