app: новый сервис jandcode.app.DataDirService для поименнованному
доступу к каталогам данных приложения.
Настройка:
<app> <!-- корневой каталог с данными приложения. Если не указать, то по умолчанию будет {каталог приложения}/datadir --> <datadir name="root" path="d:/app/datadir"/> <!-- какой-то конкретный каталог --> <datadir name="systemp" path="d:/temp/systemp"/> </app>
Можно получать доступ к каталогу по имени. Если это имя описано в конфигурации, то будет возвращатся указанный в конфигурации путь. Если имя не описано в конфигурации, то оно рассматривается как подкаталог каталога «root»:
DataDirService svc = getApp().service(DataDirService.class); String s; s = svc.getDataDir("systemp"); // каталог d:/temp/systemp s = svc.getDataDir("mydir"); // каталог d:/app/datadir/mydir s = svc.getDataDir(); // каталог d:/app/datadir (корневой)
jandcode.auth.IUserInfo#getAttrsjandcode.auth.IUserInfo#getAttr - deprecatedJc.control.SGrid значения свойств по умолчанию: paginate: false,
filterPanel: falseJc.control.SGrid не скрывался toolbar, если на нем нет компонентовjandcode.dbm.db.DbUtils (портированы из
jandcode.dbm.data.UtData): toVariantNamed, copyRecord, copyStore, createIndex,
uniqueValues, outTablewax: Новые методы для jandcode.wax.core.utils.WaxTml: service
fix: web: tml файл мог быть только с расширенем gsp, теперь с любым
web: Новая фабрика ресерсов ResourceFactoryGsp, теперь можно любой
тип файла настроить на обработку через gsp без использования дополнительного расширения .gsp
** Внимание** fix: idea-gen шаблон теперь принимает в ресурсы *.h*,*.gf*. Возможно придется
перегенерить проект jc gen-idea
wax: Jc.showFrame теперь принимает в качестве frame - PATH.gframe. Пример gframe-фрейма:
<script type="text/javascript"> TH.create('Jc.frame.EditRec', { domain: "Tab1", daoname: "Tab1/updater", onCreateControls: function(b) { var th = this; // this.items = [ b.input2("name"), b.input2("name2") ]; } }); </script>
wax: js: новый метод модели createFromDbmJson и новая функция Jc.createFromDbmJson для создания store по json-данным в формате dbm
fix: css: не нужный отступ снизу для pageheader
wax: js: gsp-фрейм поддерживает создание одного компонента в качестве content. Пример (можно использовать как шаблон такого фрейма):
<script type="text/javascript"> <% WaxTml th = new WaxTml(this) // params def id = th.params.getValueLong("id") def cnt = th.params.getValueLong("cnt", 1) // DataRecord rec = th.daoinvoke("Tab1/view", "load", id) // def title = 'Просмотр объекта' %> TH.content('Jc.control.GspBox', { // обязательно Jc.control.GspBox или его потомок onInit: function() { var th = this; // var b = th.createBuilder(); th.title = '${title}'; th.layout = b.layout("autobox"); var store = th.store = Jc.createFromDbmJson(${th.toDbmJson(rec)}); // th.items = [ b.frameheader({text: '${title}', icon: 'docum'}), b.databox({ items: [ b.datalabel2("field1"), b.datalabel2("field2"), b.datalabel2("field3") ] }) ]; // th.toolbar = [ b.action({text:'Перегрузить',onExec:function(){ th.reload({cnt:${cnt+1}}); }}) ]; } }); </script>
Jc.frame.Gsp не поддерживал dataToControl/controlToDatareq теперь передается клиенту в структуре доменаjandcode.wax.core.utils.WaxTml: getParams(),
toDbmJson(), toJson()ВАЖНО : В этой версии есть несовместимые изменения
jandcode.wax.core.utils.sqlfilter.SqlFilterItem
-> jandcode.dbm.sqlfilter.SqlFilterItemJc.showFrame теперь может показывать gsp-фреймы. Для этого в свойстве frame
нужно передать url, заканчивающийся на .htmlВАЖНО: В этой версии есть несовместимые изменения
fix: Jc.input.Cbfrm снова имеет matchFieldWidth=true по умолчанию. Когда по умолчанию стоит false, плывут многие выпадающие списки
js: Методы input, datalabel, label у UIBuilder первым параметром могут иметь store. На время вызова эта store становится активной для builder:
// эквивалентные вызовы b.input("name") b.input("name",{}) b.input(b.store,"name",{})
js: У записи store появился метод clearValues - обнуление существующих значений в записи
fix: dbm: Rnd при генерации текста зачем то вставлялись еще и цифры
Несовместимость fix: verdb не загружались данные по умолчанию в базу данных при verdb-validate
ВАЖНО: В этой версии есть несовместимые изменения
WebRequest.getParams и сверху на него накладываются явные dao-параметры (запись
или map). Используется при загрузке данных через SqlFilter в качестве параметра метода
загрузки или создания фильтра.param (getParam()): именно его нужно использовать для получения
значения параметра из параметров фильтра. Ранее использоватлось field (getField()).jandcode.wax.core.model.WaxLoadSqlFilterDao можно использовать
как предок для фильтрованных загрузчиков или как прототип для написания подобных классовВАЖНО: В этой версии есть несовместимые изменения
Настройка форматировщика ошибок полностью перенесена в тег <error <formatter.
Из app.rt приложения можно удалять фрагменты вида:
<service name="jandcode.app.ErrorService"> <errorformatter name="log" class="jandcode.utils.error.impl.ErrorFormatterDefault"/> </service> <error> <formatter name="log" showSource="true" showStack="true"/> </error>
Настройка форматировщика ошибок для логов теперь описана в ядре с такими параметрами по умолчанию:
<error> <formatter name="log" showSource="true" showStack="true"/> </error>
fix: в версии 1.4.2 продукт собирался, но не работал
Шаблон проекта wax-complex изменился в соответсвии с последними нововведениями
В шаблоне проекта wax-complex настройки разделены на настройки по умолчанию,
настройки для разработки и настройки для тестирования. Для получения деталей
создайте проект по шаблону wax-complex и почитайте коментарии в файла корня проекта
Файлы app-product.rt и db-ini.rt из корня проекта теперь попадают в дистрибутив
как настройки приложения по умолчанию
fix: Файл jc-app.rt больше не нужен для запуска jc
Изменен способ настройки файлов проекта в дистрибутиве: теперь он более очевидный.
Подробности см. в скрипте scripts\wax-project.jc.
Несовместимость Регистрация элементов фильтра делается в модели в теге <sqlfilter/>. Пример:
<root> <model name="sys"> <sqlfilter name="equal" class="jandcode.wax.core.model.sqlfilter.SqlFilter_equal"/> </model> </root>
В атрибуте class указывается класс реализатор. В случае, когда элемент фильтра для
конкретного типа СУБД отличается, можно сделать реализацию для конкретной СУБД и
указать ее в атрибуте class.DBTYPE. Например:
<root> <model name="sys"> <sqlfilter name="equal" class="jandcode.wax.core.model.sqlfilter.SqlFilter_equal" class.oracle="jandcode.wax.core.model.sqlfilter.SqlFilter_equal_oracle" class.mysql="jandcode.wax.core.model.sqlfilter.SqlFilter_equal_mysql" /> </model> </root>
ВАЖНО: В этой версии есть несовместимые изменения
utils
dbm
Несовместимость DaoService и Dao полностью переработаны. Возможны проблемы с совместимостью в некоторых нетипичных случаях.
Dao могут быть объявлены на уровне модели. Такие dao не имеют привязку к домену:
<root> <model name="mymodel"> ... <dao name="mydao" .../> </model> </root>
Соответсвенно пользоваться ими можно просто по имени dao:
ut.createDao("mydao") ut.daoinvoke("mydao", "method1")
Dao можно использовать просто по классу, без регистрации dao в rt. Допустимо использование как ссылки на класс, так и полного имени класса. Такие dao не имеют привязку к домену:
ut.createDao(MyDao.class) ut.createDao("com.myapp.model.MyDao")
Несовместимость Из Dao убран метод public IDaoInfo getDaoInfo(). Этот механизм более не существует.
Несовместимость Полностью удалено понятие «контекст выполнения dao». Соответственно
из Dao убран getContext(). Фактически getContext() являлся копией параметров
web-запроса. Метод getContext() возвращающий параметры web-запроса добавлен
в WaxDaoUtils. Сотвественно код getContext() в dao нужно заменить на
ut.getContext()
RandomDataLoader: в подстановке text (метод jandcode.dbm.dataloader.rnd.Rnd#text)
можно указывать параметр для генерации не сплошного текста, а текста с
пробелами (имитация слов):
<field name="name1" template="${text:rus-w10,fupper,30,50}"/>
Несовместимость Метод jandcode.dbm.dict.DictService#getDictData теперь устанавливает имя
у возвращаемого store в имя словаря. Были проблемы в resolveDicts на клиенте js
Dict теперь не требует указания поля по умолчанию. Если поле по умолчанию не указано,
то берется первое поле не id.
Dict теперь не требует указания домена. Если домен явно не установлен, то подразумевается домен с таким же именем, как и имя словаря.
Несовместимость Многоязыковые поля требуют описания реальных полей, которые будут генерироватся для каждого языка:
<field name="lang.string" parent="sys" class="jandcode.dbm.field.LangStringField"> <field name="real" parent="string"/> </field>
Несовместимость LangStringField игнорирует присвоение значения. Ранее - значение писалось в поле с языком по умолчанию. Удалено, т.к. возникает очень много сторонних и неожиданных эффектов от такого применения. В частности при приеме данных от клиента после ввода новых данные в многоязыковое поле обнулялось значение поля с узыком по умолчанию.
jc db-info дополнительно показывает реальное имя класса jdbc-драйвера
В TestExtDbm добавлены некоторые методы, используемые при тестировании:
// создание dao по имени, по классу dbm.createDao(...) // загрузка тестовых или prod данных непосредственно из указанного файла dbm.loadDataLoaderAll(...) dbm.loadDataLoader(...) // синоним для getDbUtils() dbm.getUt()
Несовместимость fix: При наследовании домена со словарем, если в предке была явно определена структура домена словаря, она не наследовалась
Домен теперь можно создать непосредственно из файла. Имя файла должно быть именем
ресурса в пределах classpath и начинатся с /. В файле (формат rt) должен быть
описан домен с именем default, экземпляр которого и создается.
Введено понятие «провайдер моделей» (jandcode.dbm.IModelProvider). Теперь
каждый поток (web-запрос) может иметь собственную модель, которая будет выглядеть
как модель по умолчанию.
jc
web
Несовместимость fix: при указании web-ресурса в виде package теперь можно
указать атрибут filemark с именем файла лежащим в этом пакете. По умолчанию
используется filemark="module.rt". Если в приложении не используются левые
package в качестве web-ресурсов, то это изменение на коде не отразится.
Сделано для того, что бы однозначно определять физический путь для web-ресурса,
иначе при запуске тестов бывают ситуации, когда ресурс настраивается на каталог
с тестами.
<root> <web> <resource name="jandcode.wax.core" package="jandcode.wax.core" filemark="module.rt"/> </web> </root>
Несовместимость Убран метод request.render(String tml, Object ... args). Пользуйтесь UtCnv.toMap
для замены этого метода.
Несовместимость Изменился приоритет при анализе pathInfo. Ранее static-file
был более приоритетней, чем action. Теперь наоборот. Соотвественно появилась возможность
полностью эмулировать виртуальную файловую систему, обрабатывая запросы вида
http://host/myaction/path1/file.html
Несовместимость request.getPathInfo() более не изменяется в соотвествии
с выявленной action. Ранее action удаляла из него свое имя.
web-фильтры теперь могут быть описаны в узле верхнего уровня web:
<root> <web> <filter name="com.filter.Cls1" class="com.filter.Cls1"/> </web> </root>
web-фильтр расширен методом beforeHandleRequest(). Теперь возможно внедрятся в обработку запроса на самом верхнем уровне, до выполнения любых манипуляций с action.
Добавлен механизм рендеринга любых объектов в представление для клиента
(см. jandcode.web.RenderService, jandcode.web.IWebRender). Теперь из action
можно возвращать любые объекты (через методы request.render) и способ
трансформации их для клиента. Необходимо просто зарегистрировать класс-рендерер.
Ранее из action можно было вернуть только имя шаблона.
web-запрос тепрь имеет «виртуальный корень». Этот механизм позволяет приложению работать через разные внешние url в разных контекстах.
Несовместимость action теперь для получения pathInfo может использовать свой локальный, где имя action, либо глобальный оригинальный pathInfo
Несовместимость В связи с изменением механизма рендеринга результати и за
ненадобностью у action убран метод getTmlArgs()
wax
Icontext печатала null при значении nullLangstring, Langflag для отображения многоязычных полейJc.Action имеет обработчик onBeforeExecJc.execAction для выполнения action по itemIdJc.getComponent для поиска компонента по itemId_lang.jsJc.dbm.DataBinder некоторые методы работали некорректно в определенных
условияхJc.dbm.ExtModel теперь поддерживает чтение/запись значений полей без их
явного определенияLangstring, Langmemo для ввода многоязычных полейJc.showFrame. В дальнейшем заменит все существующие
на текущий момент механизмы, которые пока оставлены для совместимости.misc
jandcode-toolbox убранВАЖНО: В этой версии есть несовместимые изменения
fix: в IAfterDaoMethod передавалось неправильное имя метода
fix: в диаграммах db-doc теперь не прыгают шрифты
В описании диаграм для db-doc для домена в диаграмме можно указать параметр
showFields="false" (не показывать его поля, будет только прямоугольник с именем
таблицы):
<diagram name="Diagram1" title="Диаграмма 1"> <domain name="Table1"/> <domain name="Table2"/> <domain name="Table3" showFields="false"/> <domain name="Table4" showFields="false"/> </diagram>
fix: теперь можно делать несколько сервлетов JcServlet в web.xml с разными mapping в рамках одного web-приложения. Например так:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <servlet> <servlet-name>servlet1</servlet-name> <servlet-class>jandcode.web.JcServlet</servlet-class> ... </servlet> <servlet> <servlet-name>servlet2</servlet-name> <servlet-class>jandcode.web.JcServlet</servlet-class> ... </servlet> <servlet-mapping> <servlet-name>servlet1</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>servlet2</servlet-name> <url-pattern>/adm/*</url-pattern> </servlet-mapping> ... </web-app>
jc: поддержка нескольких моделей/баз данных в проекте, в том числе и при использовании
verdb. Имя модели указывается в параметре -m:MODELNAME
Несовместимость: структура product-дистрибутива для wax изменилась.
Теперь скрипты (включая скрипты базы данных и verdb) лежат в WEB-INF
(раньше лежали в корне дистрибутива)
Несовместимость: скрипты базы данных и verdb теперь распологаются в подкаталоге с именем модели. К примеру, раньше было так:
PROJECTROOT
scripts
verdb
00001
0001-update.sql
00002
0001-update.sql
Теперь так:
PROJECTROOT
scripts
default <-- это имя модели
verdb
00001
0001-update.sql
00002
0001-update.sql
wax: DbmAction может быть перекрыта для установки модели контекста выполнения запроса.
Для этого выделен метод DbmAction.getModel
fix: wax: growHeight для gsp-фреймов был незадействован
wax: gsp-фрейм имеет дополнительный css-класс для фрейма jc-frame-gsp и для тела
фрейма jc-frame-body-gsp
fix: в wax-гриде не выделялась запись после добавления новой записи в гриду
ВАЖНО: Эта версия не совместима с веткой 1.3.*
Метод App.getInst() был удален. Теперь нет глобального едиственного экземпляра
приложения. Приложений может быть несколько. Соотвественно необходимо заменить
App.getInst() или (для groovy-кода) App.inst на getApp(). В всех объектах,
которые являются наследниками от jandcode.app.Comp и создавались через фабрики,
метод getApp() имеется и возвращает правильную ссылка на App. В случае получения
ошибки вида „Экземпляр создан вне контекста приложения“ необходимо убедится, что
объект создается через getApp().getObjectFactory().create(...). Если App.getInst()
использовался вне компонента jandcode.app.Comp, необходимо явно передать ему приложение
или объект, реализующий интерфейс jandcode.app.IAppLink, через который он сможет
получить доступ к приложению. Приложение можно загрузить классом jandcode.app.AppLoader.
В связи с удалением метода App.getInst() уделен статический метод Model.getInst().
Теперь модель можно получить только через getApp().service(ModelService.class).getModel().
В связи с удалением метода App.getInst() уделен статический класс jandcode.ui.Ui,
Теперь к его функциональности можно получить доступ через getApp().service(UiService.class).
В связи с удалением метода App.getInst() уделен статический класс jandcode.web.Web,
Теперь к его функциональности можно получить доступ через getApp().service(WebService.class).
Из Rt механизм x-loaderhandler заменен на x-plugin. Варианты использования
теперь стали гораздо гибче.
Модель теперь регистрируется в узле dbm (ранее регистрировалась в сервисе jandcode.dbm.ModelService):
<root> <dbm> <registermodel name="default" model="myapp.model"/> </dbm> </root>
Убраны все модели по умолчанию: default, wax.sys, wax.default. В комплекте
теперь только модель sys, которая используется как предок для моделей. Все промежуточные
составные части моделей (например из jandcode.wax.verdb) реализованы через плагины
загрузки Rt. Пример:
<!-- модуль где-то в библиотеке объявляет плагин модели... --> <x-plugin name="mylib1.model" path="model/model.rt"> <depend name="jandcode.wax.core.model"/> <!-- от этого плагина зависит объявленный --> </x-plugin> <!-- модуль приложения объявляет свою модель и использует плагины --> <model name="myapp1.model" parent="sys" x-root="true"> <!-- включаем плагин модели вместе с его зависимостями --> <x-include plugin="mylib1.model"/> <!-- собственно модель приложения --> <x-include path="model/model.rt"/> </model> <!-- регистрируем модель --> <dbm> <registermodel name="default" model="myapp1.model"/> </dbm>
Убран атрибут модуля wax="true". Теперь файлы из каталога
model не подключаются автоматически в модель wax.default, их нужно подключать явно
и можно держать в любом удобном каталоге внутри модуля.
Убран атрибут модуля web="true". Теперь пакет модуля нужно явно назначать как
каталог с web-ресурсами, например:
<root> <web> <resource name="myapp1.main" package="myapp1.main"/> </web> </root>
Введен специальный тег для модели x-dbdata, который определяет откуда загружать
данные для базы по умолчанию и тестовые данные. Теперь их можно хранить там, где удобно:
<root> <!-- модуль приложения объявляет свою модель и использует плагины --> <model name="myapp1.model" parent="sys" x-root="true"> .... <!-- в каталоге dbdata могут быть каталоги prod (для данных по умолчанию) и test (для тестовых данных) --> <x-dbdata path="dbdata"/> <!-- можно указывать явный каталог и тип данных --> <x-dbdata path="dbdata/prod" dbtype="prod"/> <x-dbdata path="dbdata/test" dbtype="test"/> </model> </root>
Модель jandcode.dbm.Model может быть настроена на поддержку нескольких языков
хранения данных. Для этой поддержки в модель введен сервис jandcode.dbm.dblang.DblangService
Поддержка (пока не полная) многоязыковых полей. Тип поля: lang.string и lang.memo
При описании ddl операторов для домена (например для view) можно писать текст ddl оператора на gsp в контексте текущего домена. Например так:
<domain name="V_View1" parent="wax.Table" tag.db="true" tag.dbview="true" basetable="ViewBase"> <ddl name="view"><![CDATA[ create view ${th.domain.name} as select id<% for (lang in th.model.getDblangService().langs) { out(",name_") out(lang.name) } %> from ${th.domain.rt.getValueString('basetable')} where level=1 ]]> </ddl> </domain>
Поле может ссылатся на view, физические reference при этом не генерируются
В шаблонах gsp, используемых для генерации утилитой jc можно выводить результат фрагмента шаблона из текста:
<% outTemplate("hello, \${project.name}!") %>
fix: jc db-doc теперь вставляет в документацию не шаблон view, а его сгенерированное представление
<jc:value type="dict" ... /> теперь работаетwax