<para>Интерфейсы инфраструктуры обеспечивают доступ к часто используемой функциональности платформы. Большинство из этих интерфейсов расположены в <linklinkend="app_modules">модуле</link><structname>global</structname> и могут быть использованы как на среднем слое, так и в <linklinkend="app_tiers">блоках</link> клиентского уровня, но некоторые доступны только коду среднего слоя.</para>
<para>Интерфейсы инфраструктуры реализуются бинами <application>Spring Framework</application>, поэтому они могут быть инжектированы в любые другие управляемые компоненты (<linklinkend="managed_beans">Managed Beans</link>, <linklinkend="services">сервисы среднего слоя</link>, <linklinkend="screen_controller">контроллеры</link> экранов универсального пользовательского интерфейса.</para>
<para>Кроме того, как и любые другие бины, интерфейсы инфраструктуры могут быть получены с помощью статических методов класса <code>AppBeans</code>, и использоваться в неуправляемых компонентах (<glosstermlinkend="pojo">POJO</glossterm>, вспомогательных классах и пр.).</para>
<section>
<sectionid="configuration">
<title>Configuration</title>
<para>Позволяет получать ссылки на <linklinkend="config_interfaces">конфигурационные интерфейсы</link>.</para>
<para>Примеры:<programlisting>@Inject
@ -1980,7 +1980,7 @@ Date date = timeSource.currentTimestamp();</programlisting><programlisting>long
<para>Обеспечивает получение значений <code>UUID</code>, в том числе для идентификаторов сущностей. Применение <code>UUID.randomUUID()</code> в прикладном коде не рекомендуется.</para>
</section>
</section>
<section>
<sectionid="appContext">
<title>AppContext</title>
<para><code>AppContext</code> - системный класс, в статических полях которого хранятся ссылки на некоторые общие для любого <linklinkend="app_tiers">блока</link> приложения компоненты:<itemizedlist>
<listitem>
@ -2043,220 +2043,224 @@ Date date = timeSource.currentTimestamp();</programlisting><programlisting>long
<para>Параметры развертывания: различные URL для соединения уровней приложения, тип используемой БД, настройки подсистемы безопасности и т.д. Например: <parameter>cuba.connectionUrl</parameter>, <parameter>cuba.dbmsType,</parameter><parameter>cuba.userSessionExpirationTimeoutSec</parameter>.</para>
<para><firstterm>Параметры развертывания</firstterm> - различные URL для соединения <linklinkend="app_tiers">блоков</link> приложения, тип используемой БД, настройки подсистемы безопасности и т.д. </para>
<para>Параметры времени выполнения: активность аудита, параметры отсылки email и т.д. Например, <parameter>cuba.security.EntityLog.enabled</parameter>, <parameter>cuba.email.smtpHost</parameter>.</para>
<para><firstterm>Параметры времени выполнения</firstterm> - активность аудита, параметры отсылки email и т.д. </para>
<para><emphasisrole="bold">Работа со свойствами приложения</emphasis></para>
<formalpara>
<title>Программный доступ к свойствам</title>
<para>Основной способ доступа к свойствам приложения из программного кода − использование механизма <linklinkend="config_interfaces">конфигурационных интерфейсов</link>. Кроме того, все свойства конфигурации и развертывания доступны через методы класса <code>com.haulmont.cuba.core.sys.AppContext</code>.</para>
</formalpara>
<formalpara>
<title>Принадлежность уровням</title>
<para>Как правило, некоторое свойство принадлежит только одному или нескольким уровням приложения. Например, <parameter>cuba.persistenceConfig</parameter> имеет смысл только дляMiddleware, <parameter>cuba.web.useLightHeader</parameter>− только для Web Client, а<parameter>cuba.springContextConfig </parameter>− для всех уровней. </para>
<para>Принадлежность к уровню означает, что если Вы хотите задать значение некоторому свойству, это необходимо сделать на всех уровнях, которым данное свойство принадлежит (смотрите <linklinkend="properties_storage_para">Хранение значений свойств</link>). </para>
<para>Как правило, некоторое свойство принадлежит только одному или нескольким <linklinkend="app_tiers">блокам</link> приложения. Например, <property>cuba.persistenceConfig</property> имеет смысл только для <structname>Middleware</structname>, <property> cuba.web.useLightHeader</property>− только для <structname>Web Client</structname>, а<property>cuba.springContextConfig</property>− для всех блоков. </para>
<para>Принадлежность к блоку означает, что если нужно задать значение некоторому свойству, это необходимо сделать <emphasis>во всех блоках</emphasis>, которым данное свойство принадлежит (и которые используются в приложении). </para>
<para>Принадлежность можно выяснить следующими способами:<itemizedlist>
<listitem>
<para>Из документации</para>
<para>Из документации: см. <xreflinkend="app_properties_reference"/></para>
</listitem>
<listitem>
<para>Проследив использование свойства в коде приложения</para>
</listitem>
<listitem>
<para>Если к свойству есть доступ через Java-интерфейс, то по принадлежности интерфейса модулю проекта. Ниже приведено соответствие модуля объявления интерфейса и принадлежности свойства уровням приложения:</para>
<itemizedlist>
<listitem>
<para><structname>global</structname>− свойство принадлежит всем уровням</para>
<para>Если к свойству есть доступ через <linklinkend="config_interfaces">конфигурационный интерфейс</link>, то по принадлежности интерфейса <linklinkend="app_modules">модулю</link> проекта.</para>
</listitem>
</itemizedlist></para>
</formalpara>
<formalpara>
<title>JMX-интерфейс</title>
<para>Некоторые уровни приложения определяют JMX-интерфейсы для доступа к свойствам приложения. В частности, на уровне Middleware имеется JMX-интерфейс <code>ConfigStorageMBean</code>с именем <code>app-core.cuba:service=ConfigStorage</code>, а на уровне Web Client −<code>ConfigurationMBean</code>с именем <code>app.cuba:service=Configuration</code>. Методы этих интерфейсов работают по отдельности со свойствами конфигурации и развертывания (<parameter>*AppProperties</parameter>) и со свойствами времени выполнения (<parameter>*DbProperties</parameter>). Это обусловлено различием механизмов <linklinkend="properties_storage_para">хранения</link> этих категорий свойств.</para>
<para>Свойства, определяющие конфигурацию и параметры развертывания, задаются в специальных файлах свойств, имеющих имя вида <filename>*-app.properties</filename>. Каждый уровень приложения имеет набор таких файлов, включающий в себя файлы из базовых проектов платформы и файл текущего приложения. Набор файлов свойств различен для разных уровней приложения и определяется следующим образом:</para>
</formalpara>
</section>
<section>
<title>Доступ к свойствам</title>
<para><para>Основной способ доступа к свойствам приложения из прикладного кода − использование механизма <linklinkend="config_interfaces">конфигурационных интерфейсов</link>. Кроме того, все параметры конфигурации и развертывания доступны через методы класса <code>
<linklinkend="appContext">AppContext</link>
</code>.</para></para>
<para>Некоторые блоки приложения определяют JMX-интерфейсы для доступа к свойствам приложения. В частности, на уровне <structname>Middleware</structname> имеется JMX-интерфейс <code>
</code>. Методы этих интерфейсов работают по отдельности с параметрами конфигурации и развертывания (<code>*AppProperties</code>) и с параметрами времени выполнения (<code>*DbProperties</code>). Это обусловлено различием механизмов хранения этих категорий свойств.</para>
</section>
<section>
<title>Хранение свойств в файлах</title>
<para>Свойства, определяющие конфигурацию и параметры развертывания, задаются в специальных файлах свойств, имеющих имя вида <filename>*-app.properties</filename>. Каждый <linklinkend="app_tiers">блок</link> приложения имеет набор таких файлов, включающий в себя файлы из <linklinkend="base_projects">базовых проектов</link> платформы и файл текущего приложения. Набор файлов свойств определяется следующим образом:</para>
<itemizedlist>
<listitem>
<para>Для уровней, являющихся веб-приложениями (Middleware, Web Client, Web Portal) набор файлов свойств задается в <filename>web.xml</filename> в параметре <parameter>appPropertiesConfig</parameter>.</para>
<para>Для блоков, являющихся веб-приложениями (<structname>Middleware</structname>, <structname>Web Client</structname>, <structname>Web Portal</structname>) набор файлов свойств задается в <filename>web.xml</filename> в параметре <literal>appPropertiesConfig</literal>.</para>
</listitem>
<listitem>
<para>Для уровня Desktop Client основной способ задания набора файлов свойств − переопределение в приложении метода <methodname>getDefaultAppPropertiesConfig</methodname> в классе-наследнике <code>com.haulmont.cuba.desktop.App</code>.</para>
<para>Для блока <structname>Desktop Client</structname> основной способ задания набора файлов свойств − переопределение в приложении метода <methodname>getDefaultAppPropertiesConfig()</methodname> в классе-наследнике <code>com.haulmont.cuba.desktop.App</code>.</para>
</listitem>
</itemizedlist>
<para>Например, набор файлов свойств уровня Middleware проекта <application>shop</application>−<filename>web.xml</filename>− выглядит следующим образом:</para>
<para>Например, набор файлов свойств блока <structname>Middleware</structname> проекта <application>sales</application> задается в файле <filename>web/WEB-INF/web.xml</filename> модуля <structname>core</structname>, и выглядит следующим образом:</para>
<para>Здесь префикс <code>classpath:</code> означает, что данный файл нужно искать в Java classpath, префикс <code>file:</code> − в файловой системе. Возможно использование системных свойств Java, в данном случае это <code>catalina.home</code> − путь к корню <application>Tomcat</application>.</para>
<para>Здесь префикс <literal>classpath:</literal> означает, что данный файл нужно искать в Java classpath, префикс <literal>file:</literal> − в файловой системе. Возможно использование системных свойств Java, в данном случае это <literal>catalina.home</literal> − путь к корню <application>Tomcat</application>.</para>
<para>Порядок перечисления файлов важен, так как значения, указанные в каждом последующем файле заменяют значения одноименных свойств, заданные в предыдущих файлах. Этим достигается переопределение свойств платформы в конкретном приложении.</para>
<para>Последний файл в приведенном наборе −<filename>local.app.properties</filename>.</para>
<para>Обратите внимание на синтаксис ключей и значений в *.properties файлах.</para>
<para>Последний файл в приведенном наборе −<filename>local.app.properties</filename>. Он может использоваться для переопределения свойств приложения при развертывании. Если этого файла нет, он игнорируется. Если же во время инсталляции системы требуется переопределение некоторых параметров (как правило различных URL), достаточно создать этот файл и поместить в него переопределяемые свойства. При последующих обновлениях системы такой файл с локальными настройками легко сохранить.</para>
<tip>
<para>Правила задания информации в файлах <filename>*.properties</filename>:</para>
<itemizedlist>
<listitem>
<para>Ключ состоит из латинских букв и цифр, разделенных точкой</para>
<para>Значение пишется после знака равно (=)</para>
<para>Ключ может состоять из латинских букв, цифр, точек и знаков подчеркивания</para>
</listitem>
<listitem>
<para>Значение <emphasisrole="bold">никогда</emphasis> не берется в кавычки "" или ''</para>
<para>Значение пишется после знака равно (<literal>=</literal>)</para>
</listitem>
<listitem>
<para>Файловые пути записываются либо в UNIX виде (/opt/haulmont/), либо в Windows виде (c:\\haulmont\\)</para>
<para>Значение не нужно брать в кавычки " или '</para>
</listitem>
<listitem>
<para>Для различных спецсимволов используются коды (\n \t \r). \ является зарезервированным символом, для вставки в значение экранируется сам собой (\\).
<para>Файловые пути записываются либо в UNIX виде (<filename>/opt/haulmont/</filename>), либо в Windows виде (<filename>c:\\haulmont\\</filename>)</para>
</listitem>
<listitem>
<para>В значениях могут присутствовать спецсимволы (пробелы, табуляции). Внимательно проверяйте значения, скопированные в файл из других программ</para>
<para>Возможно использование кодов <literal>\n \t \r</literal>. Символ <literal>\</literal> является зарезервированным, для вставки в значение экранируется сам собой (<literal>\\</literal>).
<para>Для ввода значения в нескольких строках файла используйте символ <literal>\</literal> в конце строки, для того чтобы данное значение продолжалось на следующей строке.</para>
</listitem>
</itemizedlist>
</warning></para>
<formalpara>
<title>Таблица базы данных</title>
<para>Параметры времени выполнения хранятся в БД в таблице <database>SYS_CONFIG</database>. Хранящиеся в БД свойства кэшируются на уровне Middleware. Очистить кэш можно через JMX-интерфейсы <code>app-core.cuba:service=ConfigStorage</code> методом <methodname>clearCache</methodname> или <code>app-core.cuba:service=CachingFacade</code> методом <methodname>clearConfigStorageCache</methodname>.</para>
</formalpara>
<para><emphasisrole="bold">Значения по умолчанию</emphasis></para>
<para>Если обращение к свойству производится через Java-интерфейс механизма Configuration Parameters и если значение свойства не задано в месте его хранения (файлы <filename>*-app.properties</filename> или БД), то будет возвращено значение по умолчанию, если оно задано в аннотации соответствующего метода Java-интерфейса.</para>
<para>Подробное описание свойств подсистемы безопасности содержится в <linklinkend="appendix_security_properties">Приложении А</link>.</para>
</tip>
</section>
<section>
<title>Хранение свойств в базе данных</title>
<para>Параметры времени выполнения хранятся в таблице <database>SYS_CONFIG</database> базы данных. </para>
<para>Такие свойства имеют следующие особенности:<itemizedlist>
<listitem>
<para>так как значение свойства хранится в базе данных, оно задается в одном месте, независимо от того, в каких блоках приложения оно используется</para>
</listitem>
<listitem>
<para>значение может быть изменено и сохранено во время работы приложения, как через <linklinkend="config_interfaces">конфигурационный интерфейс</link>, содержащий это свойство, так и через <linklinkend="configStorageMBean">ConfigStorageMBean</link>.</para>
</listitem>
</itemizedlist></para>
<para>Хранящиеся в БД свойства кэшируются на уровне <structname>Middleware</structname>. Очистить кэш можно с помощью JMX-интерфейсов <code>
</code> методом <code>clearConfigStorageCache()</code>.</para>
<para>Следует иметь в виду, что на клиентском уровне чтение свойства, хранящегося в БД, приводит к запросу к <structname>Middleware</structname>, что менее эффективно, чем чтение локального свойства из <filename>app.properties</filename>. Для уменьшения количества таких запросов клиент кэширует все свойства, хранящиеся в БД, на время жизни экземпляра реализации конфигурационного интерфейса. Поэтому если например в некотором экране UI необходимо несколько раз обратиться к свойствам одного конфигурационного интерфейса, лучше получить ссылку на него при инициализации экрана, и сохранить в поле для последующих обращений к одному и тому же экземпляру. </para>
</section>
<sectionid="config_interfaces">
<title>Конфигурационные интерфейсы</title>
<para>Подсистема работы с конфигурационными параметрами позволяет сохранять/извлекать пары имя-значение с помощью стандартных Java-интерфейсов. При этом хранилищем параметров может быть база данных, системные свойства Java, и свойства приложения, задаваемые в файлах app.properties.</para>
<para>Рекомендуется использовать только для хранения системных настроек, доступных администратору системы. Для хранения настроек пользователя лучше создавать отдельную сущность для их хранения и использовать стандартный эдитор для редактирования.</para>
<para>Для создания конфигурационного параметра необходимо:</para>
<para>Данный механизм позволяет работать со свойствами приложения через методы Java-интерфейсов, что дает следующие преимущества:<itemizedlist>
<listitem>
<para>типизированность - прикладной код работает с нужными типами (String, Boolean, Integer и пр.), а не только со строками</para>
</listitem>
<listitem>
<para>в прикладном коде вместо строковых идентификаторов свойств используются методы интерфейсов, имена которых подсказываются средой разработки</para>
</listitem>
</itemizedlist></para>
<para>Пример получения значения таймаута транзакции в блоке <structname>Middleware</structname>:<programlisting>@Inject
<para>Для создания конфигурационного интерфейса необходимо:</para>
<itemizedlist>
<listitem>
<para>Создать интерфейс, унаследованный от <interface>com.haulmont.cuba.core.config.Config</interface></para>
<para>Создать интерфейс, унаследованный от <code>com.haulmont.cuba.core.config.Config</code> (не путать с классом сущности <code>com.haulmont.cuba.core.entity.Config</code>)</para>
</listitem>
<listitem>
<para>Создать методы доступа к параметру (getXXX/setXXX). Возможный тип параметра обсуждается ниже.</para>
<para>Добавить интерфейсу аннотацию <code>@Source</code> для указания источника (способа хранения) параметров:<itemizedlist>
<listitem>
<para><code>SourceType.SYSTEM</code> - значение свойства будет взято из системных свойств данной JVM, т.е. методом <code> System.getProperty()</code></para>
</listitem>
<listitem>
<para>Добавить интерфейсу аннотацию <literal>@Prefix</literal> для указания префикса имен входящих в интерфейс параметров</para>
<para><code>SourceType.APP</code> - значение свойства будет взято из файлов <filename>app.properties</filename></para>
<para><code>SourceType.DATABASE</code> - значение свойства будет взято из таблицы <database>SYS_CONFIG</database></para>
</listitem>
</itemizedlist></para>
</listitem>
<listitem>
<para>Создать методы доступа к свойству (getter / settter). Если значение свойства не предполагается изменять во время выполнения, метод доступа на запись не нужен. Возможный тип свойства рассмотрен ниже.</para>
</listitem>
<listitem>
<para>Добавить методу доступа на чтение аннотацию <code>@Property</code>, определяющую имя свойства.</para>
</listitem>
<listitem>
<para>Опционально аннотацию <code>@Source</code> можно задать для отдельного свойства в интерфейсе, если его источник отличается от заданного для всего интерфейса.</para>
<para>Для получения доступа к параметрам используется интерфейс инфраструктуры <interface>Configuration</interface> или его статический фасад <interface>ConfigProvider</interface>.</para>
<para>Стандартный UI для доступа к параметрам, хранящимся в базе данных, предоставляет МБин haulmont.cuba:service=ConfigStorage. Он содержит следующие методы:</para>
<para>Создавать класс реализации конфигурационного интерфейса не нужно - при получении ссылки на интерфейс через <linklinkend="configuration">Configuration</link> будет автоматически создан необходимый прокси-объект.</para>
</section>
<section>
<title>Типы свойств</title>
<para>Без дополнительных усилий поддерживаются следующие типы свойств: <itemizedlist>
<listitem>
<para><code>String</code></para>
</listitem>
<listitem>
<para>простые типы либо их объектные обертки (<code>boolean</code>, <code>Boolean</code>, <code>int</code>, <code>Integer</code>, etc.)</para>
</listitem>
<listitem>
<para>классы персистентных <linklinkend="data_model">сущностей</link>. При обращении к свойству типа сущности происходит загрузка из БД экземпляра, заданного значением свойства.</para>
</listitem>
</itemizedlist></para>
<para>Для поддержки произвольного типа необходимо реализовать классы <code>TypeStringify</code> и <code>TypeFactory</code> для преобразования значения в строку и из нее, и указать эти классы для свойства с помощью аннотаций <code>@Stringify</code> и <code>@Factory</code>.</para>
<para>Рассмотрим этот процесс на примере типа <code>UUID</code>.</para>
<itemizedlist>
<listitem>
<para>setProperty(p1, p2) − установить параметр с именем p1 в значение p2</para>
<para>Создаем класс <code>com.haulmont.cuba.core.config.type.UuidTypeFactory</code> унаследованный от <code>com.haulmont.cuba.core.config.type.TypeFactory</code> и реализуем в нем метод:<programlisting>public Object build(String string) {
if (string == null)
return null;
return UUID.fromString(string);
}</programlisting></para>
</listitem>
<listitem>
<para>getProperty(p1) − показать параметр с именем p1</para>
<para><code>TypeStringify</code> создавать не нужно, т.к. по умолчанию будет использован метод <code>toString()</code>− в данном случае он нам подходит.</para>
</listitem>
<listitem>
<para>removeProperty(p1) − удалить параметр с именем p1</para>
</listitem>
<listitem>
<para>printProperties(p1) − показать все параметры с фильтром на имя p1 по правилам SQL like</para>
</listitem>
<listitem>
<para>printProperties − показать все параметры</para>
</listitem>
<listitem>
<para>loadSystemProperties − загрузить в System.properties параметры из файла conf/system.properties</para>
<para>Аннотируем свойство в конфигурационном интерфейсе:<programlisting>@Factory(factory = UuidTypeFactory.class)
<para>Имя параметра в БД или в app.properties формируется по следующему принципу:</para>
<itemizedlist>
<listitem>
<para>Если на параметре есть аннотация <literal>@Property</literal>, то берется ее значение</para>
</listitem>
<listitem>
<para>Иначе:</para>
<itemizedlist>
<listitem>
<para>Если есть аннотация <literal>@Prefix</literal>, берется ее значение</para>
</listitem>
<listitem>
<para>Если нет аннотации <literal>@Prefix</literal>, то</para>
<itemizedlist>
<listitem>
<para>Если интерфейс является внутренним, то берется полное имя включающего класса и добавляется "."</para>
</listitem>
<listitem>
<para>Иначе берется полное имя пакета и добавляется "."</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>Добавляется декапитализированное имя метода доступа без get/set/is (см. комментарии к методу <methodname>com.haulmont.cuba.core.config.ConfigUtil#extendedUncapitalize</methodname>)</para>
<para>В соответствии со значениями <code>com.haulmont.cuba.core.config.SourceType</code> на данный момент возможны 3 источника параметров: app.propperties, System.properties или база данных.</para>
<para>В случае базы данных параметры хранятся в таблице <database>SYS_CONFIG</database>.</para>
<para>Аннотация <literal>@Source</literal> может быть задана как на весь интерфейс, так и на отдельный параметр. В первом случае она определяет источник всех параметров данного интерфейса. Во втором случае она переопределяет источник для данного параметра, если он отличен от указанного для интерфейса.</para>
<para>Без дополнительных усилий параметр может быть любого простого типа либо его объектного аналога (String, int, Integer, etc.) либо сущностью, реализующей интерфейс Entity.</para>
<para>Для произвольного типа необходимо реализовать классы TypeStringify и TypeFactory для преобразования значения в строку и из нее, и указать эти классы для параметра с помощью аннотаций @Stringify и @Factory.</para>
<para>Рассмотрим этот процесс на примере типа UUID.</para>
<itemizedlist>
<listitem>
<para>Создаем класс com.haulmont.cuba.core.config.type.UuidTypeFactory унаследованный от com.haulmont.cuba.core.config.type.TypeFactory и реализуем в нем метод:</para>
<para><emphasisrole="bold">Значения по умолчанию</emphasis></para>
<para>Для параметров могут быть заданы значения по умолчанию. Эти значения будут возвращаться, если данный параметр не задан (не существует в БД или в app.properties).</para>
<para>Дефолтное значение может быть задано в виде строки с помощью аннотации @com.haulmont.cuba.core.config.defaults.Default, либо в виде конкретного типа с помощью других аннотаций пакета com.haulmont.cuba.core.config.defaults.</para>
<para>Для сущностей дефолтное значение задается в виде имя_сущности-id-имя_представления, например</para>
<para>Для свойств конфигурационных интерфейсов могут быть заданы значения по умолчанию. Эти значения будут возвращаться, если данный параметр не задан в месте хранения - в БД или в <filename>app.properties</filename>.</para>
<para>Значение по умолчанию может быть задано в виде строки с помощью аннотации <code>@Default</code>, либо в виде конкретного типа с помощью других аннотаций пакета <code>com.haulmont.cuba.core.config.defaults</code>:<programlisting>@Property("cuba.email.adminAddress")
int getDefaultSendingAttemptsCount();</programlisting></para>
<para>Для сущностей значение по умолчанию задается строкой вида <literal>{entity_name}-{id}-{optional_view_name}</literal>, например:<programlisting>@Default("sec$User-98e5e66c-3ac9-11e2-94c1-3860770d7eaf-browse")
<para>Как видно из диаграммы, МБин имеет два набора методов, разделенных по интерфейсам <code>...MBean</code> и <code>...API</code>. Первый из них служит для управления через JMX, а второй − для вызова из программного кода.</para>
<para>Вызовы JMX-интерфейса МБина перехватываются специальным классом −<glosstermlinkend="interceptor">интерцептором</glossterm><methodname>MBeanInterceptor.aroundInvoke()</methodname> (с помощью Spring AOP), который обеспечивает журналирование неперехваченных исключений и установку правильного контекстного <code>ClassLoader</code>.</para>
<sectionid="cachingFacadeMBean">
<titleid="">CachingFacadeMBean</title>
<title>CachingFacadeMBean</title>
<para><code>CachingFacadeMBean</code> предоставляет методы очистки различных кэшей на <linklinkend="app_tiers">уровне</link><structname>Middleware</structname>.</para>
<para><code>CachingMBean</code> предоставляет методы очистки различных кэшей в <linklinkend="app_tiers">блоке</link><structname>Web Client</structname>.</para>
<para><code>ConfigStorageMBean</code> позволяет просматривать и задавать значения <linklinkend="app_properties">свойствам приложения</link><linklinkend="app_tiers">блока</link><structname>Middleware</structname>.</para>
<para>Следует иметь в виду, что измененные значения для свойств, хранящихся в файлах, не сохраняются, и действуют только до рестарта данного блока.</para>
<para><code>ConfigurationMBean</code> позволяет просматривать и задавать значения <linklinkend="app_properties">свойствам приложения</link><linklinkend="app_tiers">блока</link><structname>Web Client</structname>, хранящимся в файлах <filename>app.properties</filename>. </para>
<para>Следует иметь в виду, что измененные значения не сохраняются, и действуют только до рестарта данного блока.</para>
<para>Сервисы среднего слоя предоставляют интерфейс для вызова бизнес-логики клиентами и образуют границу <glosstermlinkend="middleware">Middleware</glossterm>. Сервисы могут содержать бизнес-логику внутри себя, либо делегировать выполнение <linklinkend="managed_beans">Managed Beans</link>.</para>
<para>Сервисы среднего слоя предоставляют интерфейс для вызова бизнес-логики клиентами и образуют границу <glosstermlinkend="middleware_glossentry">Middleware</glossterm>. Сервисы могут содержать бизнес-логику внутри себя, либо делегировать выполнение <linklinkend="managed_beans">Managed Beans</link>.</para>
<para>Конфигурационный параметр, задающий набор файлов <linklinkend="views.xml">views.xml</link>, автоматически развертываемых на старте приложения. См. <xreflinkend="views"/></para>
<para>Используется во всех стандартных <linklinkend="app_tiers">блоках</link>.</para>
<para>Указывает, что глобальные представления c <structname>Middleware</structname> нужно загружать на клиентский уровень не все сразу, а по необходимости. См. <xreflinkend="views"/></para>
<para>Значение по умолчанию: <code>false</code></para>
<para>Используется во всех стандартных <linklinkend="app_tiers">блоках</link>.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>cuba.localeSelectVisible</term>
<varlistentryid="cuba.groovyEvaluatorImport">
<term>cuba.groovyEvaluatorImport</term>
<listitem>
<para>Включает или отключает возможность пользователя выбирать язык
интерфейса при входе в систему. </para>
<para>Значение по умолчанию: <literal>true</literal></para>
<para>Интерфейс: <code>GlobalConfig</code></para>
<para>Задает список классов, импортируемых всеми выполняемыми через <code>
<linklinkend="scripting">Scripting</link>
</code> выражениями на Groovy. </para>
<para>Имена классов в списке разделяются запятой или точкой с запятой.</para>
<para>Значение по умолчанию: <code>com.haulmont.cuba.core.global.PersistenceHelper</code></para>
<para>Используется во всех стандартных <linklinkend="app_tiers">блоках</link>.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>cuba.trustedClientPassword</term>
<listitem>
<para>Пароль, используемый методом <code>LoginService.loginTrusted()</code>. Средний слой может аутентифицировать пользователей, подключающихся через доверенный клиентский <linklinkend="app_tiers">блок</link>, без проверки пользовательского пароля. </para>
<para>Это свойство используется в случае, если пароли пользователей не хранятся в БД, и реальную аутентификацию выполняет сам клиентский блок, например, путем интеграции с<application>Active Directory</application>.</para>
<para>Указывает, что глобальные представления c <structname>Middleware</structname> нужно загружать на клиентский уровень не все сразу, а по необходимости. См. <xreflinkend="views"/></para>
<para>Значение по умолчанию: <code>false</code></para>
<para>Включает или отключает возможность пользователя выбирать язык
интерфейса при входе в систему. </para>
<para>Значение по умолчанию: <literal>true</literal></para>
<para>Интерфейс: <code>GlobalConfig</code></para>
<para>Используется во всех стандартных <linklinkend="app_tiers">блоках</link>.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>cuba.passwordPolicyEnabled</term>
<listitem>
@ -325,21 +305,12 @@
</listitem>
</varlistentry>
<varlistentry>
<term>cuba.web.loginDialogDefaultUser</term>
<term>cuba.trustedClientPassword</term>
<listitem>
<para>Задает имя пользователя по умолчанию. Оно будет автоматически подставляться в экране входа в систему, что удобно в процессе разработки приложения. В режиме эксплуатации приложения в данном свойстве необходимо задать значение <literal><disabled></literal>.</para>
<para>Значение по умолчанию: <literal>admin</literal></para>
<para>Интерфейс: <code>WebConfig</code></para>
<para>Используется в <linklinkend="app_tiers">блоке</link><structname>Web Client</structname>.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>cuba.web.loginDialogDefaultPassword</term>
<listitem>
<para>Задает пароль пользователя по умолчанию. Он будет автоматически подставляться в экране входа в систему, что удобно в процессе разработки приложения. В режиме эксплуатации приложения в данном свойстве необходимо задать значение <literal><disabled></literal>.</para>
<para>Значение по умолчанию: <literal>admin</literal></para>
<para>Интерфейс: <code>WebConfig</code></para>
<para>Используется в <linklinkend="app_tiers">блоке</link><structname>Web Client</structname>.</para>
<para>Пароль, используемый методом <code>LoginService.loginTrusted()</code>. Средний слой может аутентифицировать пользователей, подключающихся через доверенный клиентский <linklinkend="app_tiers">блок</link>, без проверки пользовательского пароля. </para>
<para>Это свойство используется в случае, если пароли пользователей не хранятся в БД, и реальную аутентификацию выполняет сам клиентский блок, например, путем интеграции с<application>Active Directory</application>.</para>
<para>Конфигурационный параметр, задающий набор файлов <linklinkend="views.xml">views.xml</link>, автоматически развертываемых на старте приложения. См. <xreflinkend="views"/></para>
<para>Используется во всех стандартных <linklinkend="app_tiers">блоках</link>.</para>
<para>Задает имя пользователя по умолчанию. Оно будет автоматически подставляться в экране входа в систему, что удобно в процессе разработки приложения. В режиме эксплуатации приложения в данном свойстве необходимо задать значение <literal><disabled></literal>.</para>
<para>Значение по умолчанию: <literal>admin</literal></para>
<para>Интерфейс: <code>WebConfig</code></para>
<para>Используется в <linklinkend="app_tiers">блоке</link><structname>Web Client</structname>.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>cuba.web.loginDialogDefaultPassword</term>
<listitem>
<para>Задает пароль пользователя по умолчанию. Он будет автоматически подставляться в экране входа в систему, что удобно в процессе разработки приложения. В режиме эксплуатации приложения в данном свойстве необходимо задать значение <literal><disabled></literal>.</para>
<para>Значение по умолчанию: <literal>admin</literal></para>
<para>Интерфейс: <code>WebConfig</code></para>
<para>Используется в <linklinkend="app_tiers">блоке</link><structname>Web Client</structname>.</para>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.