JSR94 API для TermWare
Связанные документы:
Самый простой формат XML представления - это просто встроить его как текстовый элемент в корневой элемент. Итак, корневой элемент - TermWare: все, что находится внутри корневого элемента является определениями на оригинальном языке TermWare.
DTD выглядит следующим образом:
<!-- XML DTD -->
<?xml version="1.0" encoding="utf-8"?>
<!-- One root element - TermWare and text inside on -->
<!ELEMENT termware-text (#PCDATA)>
К примеру, следующее определение:
system(SemiGroup,default,
ruleset( ($x*$y)*$z -> $x*($y*$z) ),
FirstTop)
);
будет выглядеть в XML синтаксисе как:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE termware-text PUBLIC
"-//GradSoft//DTD TermWare ruleset form 1//EN"
"http://www.gradsoft.ua/dtd/termware-1.dtd">
<termware-text>
<![CDATA[
system(SemiGroup,default,
ruleset( ($x*$y)*$z -> $x*($y*$z) ),
FirstTop)
);
]]>
</termware-text>
Следующий формат, который иногда удобно применять - выделить XML элементы для доменов и для системы. Домен содержит в себе системы или другие домены. Имя системы, имя БД фактов и стратегии являются атрибутами элемента системы, набор правил, разделенный запятыми -- содержимым.
DTD выглядит следующим образом:
<!-- XML DTD -->
<?xml version="1.0" encoding="utf-8"?>
<! -->
<!ELEMENT termware domain>
<!ELEMENT domain (domain* system-text*) >
<!ATTLIST domain
name CDATA #REQUIRED
id NMTOKEN #IMPLIED
>
<!ELEMENT system-text (#PCDATA) >
<!ATTLIST system-text
name CDATA #REQUIRED,
facts CDATA #REQUIRED,
strategy CDATA #REQUIRED,
id NMTOKEN #IMPLIED
>
Пример:
<termware>
<domain name="examples" >
<system-text name="Life" strategy="FirstTop" facts="ua.gradsoft.termwaredemos.life.Life1Facts" >
<![CDATA[
#@display-name born-of-new-cell
{ l($i,$j) : $T} [ n($i,$j) == 3 ] -> $T [ putCell($i,$j) ],
#@display-name static-cell
{ l($i,$j) : $T} [ n($i,$j) == 2 ] -> $T [ existsCell($i,$j) ? putCell($i,$j) : removeCell($i,$j) ] ,
#@display-name die-of-cell
{ l($i,$j) : $T} [ n($i,$j) > 3 || n($i,$j) < 2 ] -> $T [ removeCell($i,$j) ],
#@display-name empty-set
{ } -> checkEmpty($T) [ showGeneration(), generateNextTestSet($T) ],
#@display-name check-empty-notnull
checkEmpty({$x:$Y}) -> { $x:$Y },
#@display-name check-empty-null
checkEmpty({}) -> END
]]>
</system-text>
</domain>
</termware>
Следующий уровень детализации: выделяется элемент для каждого правила.
<!-- XML DTD -->
<?xml version="1.0" encoding="utf-8"?>
<! -->
<!ELEMENT termware domain>
<!ELEMENT domain (domain* system*) >
<!ATTLIST domain
name CDATA #REQUIRED
id ID #IMPLIED
>
<!ELEMENT system (import-ruleset | rule-text)* >
<!ATTLIST system
name CDATA #REQUIRED,
facts CDATA #REQUIRED,
strategy CDATA #REQUIRED,
id ID #IMPLIED
>
<!ELEMENT import-ruleset (#PCDATA) >
<!ATTLIST import-ruleset
name CDATA #REQUIRED
id ID #IMPLIED
>
<!ELEMENT rule-text (#PCDATA) >
<!ATTLIST rule-text
name CDATA #IMPLIED
description PCDATA #IMPLIED
id ID #IMPLIED
>
Предыдущий пример будет выглядеть следующим образом:
<domain name="examples" >
<system name="Life" strategy="FirstTop" facts="ua.gradsoft.termwaredemos.life.Life1Facts" >
<rule-text description="born-of-new-cell>
<![CDATA[
{ l($i,$j) : $T} [ n($i,$j) == 3 ] -> $T [ putCell($i,$j) ]
]]>
</rule-text>
<rule-text description="static cell">
<![CDATA[
{ l($i,$j) : $T} [ n($i,$j) == 2 ] -> $T [ existsCell($i,$j) ? putCell($i,$j) : removeCell($i,$j) ]
]]>
<rule-text description="die">
<![CDATA[
{ l($i,$j) : $T} [ n($i,$j) > 3 || n($i,$j) < 2 ] -> $T [ removeCell($i,$j) ]
]]>
</rule-text>
<rule-text description="empty set">
<![CDATA[
{ } -> checkEmpty($T) [ showGeneration() , generateNextTestSet($T) ],
]]>
</rule-text>
<rule-text description="check-empty-notempty">
<![CDATA[
checkEmpty({$x:$Y}) -> { $x:$Y },
]]>
</rule-text>
<rule-text description="check-empty-empty">
<![CDATA[
checkEmpty({}) -> END
]]>
</rule-text>
]]>
</system-text>
</domain>
Как видим, все довольно очевидно.
Итого, DTD будет иметь следующий вид:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document : termware.dtd
Author : Ruslan Shevchenko
Description:
DTD for XML representation of TermWare systems
PUBLIC ID : -//GradSoft//DTD TermWare ruleset//EN
SYSTEM ID : http://www.gradsoft.ua/termware/termware.dtd
-->
<!ELEMENT termware (domain*) >
<!ELEMENT termware-text (#PCDATA) >
<!ELEMENT domain (domain | system)* >
<!ATTLIST domain
name CDATA #REQUIRED
id ID #IMPLIED
>
<!ELEMENT system (import-ruleset | rule-text)* >
<!ATTLIST system
name CDATA #REQUIRED
facts CDATA #REQUIRED
strategy CDATA #REQUIRED
id ID #IMPLIED
debug CDATA #IMPLIED
debug-entity CDATA #IMPLIED
pass-via CDATA #IMPLIED
>
<!ELEMENT import-ruleset (#PCDATA) >
<!ATTLIST import-ruleset
name CDATA #REQUIRED
id ID #IMPLIED
>
<!ELEMENT rule-text (#PCDATA) >
<!ATTLIST rule-text
name CDATA #IMPLIED
description CDATA #IMPLIED
id ID #IMPLIED
>
Атрибуты элемента domain:
name - имя домена. Специальное имя 'root' обозначает корневой домен.
id - id элемента. Никак не используется в самой системе переписывающих правил но может быть полезно для предварительного преобразования и поиска в XML документах, содержащих правила.
Дочерние элементы domain:
domain - имя поддомена. Таким образом домены создают иерархическую структуру.
system - описание системы переписывающих правил.
system-text - описание системы переписывающих правил в текстовом виде.
Атрибуты элементы system:
name - имя системы. Обязательно.
facts - Имя базы фактов. (см. Описание семантики). Обязательно.
strategy - Имя стратегии (см. Описание семантики). Обязательно.
id - id элемента.
debug - булевское свойство, эквивалентное вызову setDebugMode() после инициализации набора правил.
debug-entity - строка, обозначающая рамки отладочного вывода. Обычно "All" либо полное имя отлаживаемого класса. Имеет смысл только при debug="true".
pass-via - Если присутствует, то задает имя терма, в котором передаются входные объекты в множество правил. По умолчанию системе передается просто список объектов, но это бывает не очень удобно, так как список слишком общая форма. Если парамет pass-via установлен в имя X , то при передаче в RuleExecutionSet объектов, к примеру, a, b, c, d система получит терм X([a,b,c,d]).
Дочерние атрибуты system:
import-ruleset - спецификация импорта набора правил из другой системы.
rule-text - текст переписывающего правила.
Атрибуты rule:
name - имя системы, откуда мы импортируем правила.
id - id элемента.
name - имя правила. Необязательно.
description - описание правила.
id - id элемента.
Атрибуты элемента 'system-text' такие-же, как и у 'system'
RoundingMode - режим округления при работе с длинными десятичными числами. Должен принимать одно из значений режима округления, определенное в java.math.BigDecimal
DecimalScale - точность результата (т. е. количество значущих цифр после запятой) при делении десятичных чисел.
Необходимо загрузить и разархивировать JSR-94 Technology Compability Kit с сайта jcp.
Развернуть дистрибутив TermWare и зайти в подкаталог jtests-jsr94.
В файле run_tck.xml указать свойство tckhome
Запустить в run_tck.xml цель run, командой
Система скопирует tck в подкаталог build , заменит там файлы tck.conf , tck_res1.xml , tck_res2.xml на собственные и запустит тесты. Естественно, вы это можете сделать и самостоятельно.
После запуска тестов в подкаталоге build/reports можно найти отчеты о их выполнении.