T3D Technical Documentation
This documentation serves as a technical and development reference for maintenance and further development.
Functioning
The HTML documentation is created in 2 steps:
First, the TTCN-3 files are parsed and the information required for step two is written into XML files. These files are then used to generate the HTML files via XSL-Stylesheets. The XSL-Transformations are done by the Saxon XSLT Processor.
Creating the XML Files
TTCN-3 trees are generated by TRex and are then traversed by Visitors which gather all relevant information to be written into the XML files. The Visitors are instantiated for every TTCN-3 file:
Visitors
There are currently 3 Visitors:
- T3DVisior - gathers information used to generate the project.xml
- DependencyVisitor - gathers information used to generate the dependencies.xml
- ImportVisitor - gathers information used to generate the imports.xml
Creating new Visitors
To create a new Visitor to implement new functionalities or to gather new information from the TTCN-3 files, the following code can be used.
Basic structure of the new Visitor:
package org.etsi.t3d.visitor; import de.ugoe.cs.swe.trex.core.analyzer.rfparser.LocationAST; public class NewVisitor extends AbstractVisitor { @Override public void finish() { } @Override public void init() { } /* visitNodeType(LocationAST node) functions */ }
visitNodeType(LocationAST node) functions are called when nodes of certain types are traversed. For example, visitFunctionDef(LocationAST node) is called when a FunctionDef node is found. This node is represented by the node parameter. See AbstractVisitor.java for a full list of those functions.
Adding the new Visitor to T3D.java
The following code shows where to implement the new Visitor in T3D.java, so it will function properly.
T3D.java:
/* ... */ public void run(String[] args) { /* ... */ for (int i = 0; i < ttcn3Resources.size(); i++) { analyzer = analyzerFactory.getTTCN3Analyzer(ttcn3Resources.get(i)); T3DVisitor visitor = new T3DVisitor(xmlPrinter); DependencyVisitor dependencyVisitor = new DependencyVisitor(depPrinter); ImportVisitor importVisitor = new ImportVisitor(importPrinter); NewVisitor newVisitor = new NewVisitor(); // ... newVisitor.acceptDFS((LocationAST) analyzer.getParser().getAST()); // ... } /* ... */ } /* ... */
Structure of the generated XML files
project.xml
This file contains the most comprehensive information and represents an abstracted version of the source TTCN-3 files, including module structure, the individual elements, their bodies (if configured so), and T3Doc comments for every module, group, and element of the processed TTCN-3 files. It serves as a basis for the main and the module parameter / test case views.
DTD:
<!ELEMENT project (module, element, group)*> <!ELEMENT module (name, comment?, behaviour, modulename, import*)> <!ELEMENT group (name, location, comment?, behaviour, modulename, path)> <!ELEMENT element (name, location, comment?, behaviour, modulename, mpview_ModuleParDef?, path)> <!ATTLIST element type CDATA #REQUIRED> <!ELEMENT path (path_group)> <!ELEMENT path_group (path_group)> <!ATTLIST path_group loc CDATA #REQUIRED name CDATA #REQUIRED> <!-- Contains information on which groups an element or group belongs to <path> <path_group loc="..." name="subsubgroup"> <path_group loc="..." name="subgroup"> <path_group loc="..." name="group"> </path_group> </path_group> </path_group> <path> --> <!ELEMENT mpview_ModuleParDef((mpview_TestcaseDef | mpview_FunctionDef | mpview_AltstepDef)*) <!ELEMENT mpview_FunctionDef((mpview_TestcaseDef | mpview_FunctionDef | mpview_AltstepDef)*) <!ELEMENT mpview_TestcaseDef((mpview_TestcaseDef | mpview_FunctionDef | mpview_AltstepDef)*) <!ELEMENT mpview_AltstepDef((mpview_TestcaseDef | mpview_FunctionDef | mpview_AltstepDef)*) <!ATTLIST mpview_ModuleParDef loc CDATA #REQUIRED name CDATA #REQUIRED> <!ATTLIST mpview_FunctionDef loc CDATA #REQUIRED name CDATA #REQUIRED> <!ATTLIST mpview_TestcaseDef loc CDATA #REQUIRED name CDATA #REQUIRED> <!ATTLIST mpview_AltstepDef loc CDATA #REQUIRED name CDATA #REQUIRED> <!-- contains information on how module parameters are connected to testcases --> <!ELEMENT behaviour (#PCDATA | keyword | constructbody | link)*> <!ELEMENT constructbody (#PCDATA | keyword | link)*> <!ATTLIST constructbody id CDATA #REQUIRED> <!ELEMENT keyword (#PCDATA)> <!-- <keyword> elements are used around keywords of TTCN3 like "function" --> <!-- <link> elements are used to identifiy crossreferences --> <!-- the <constructbody> tag surrounds the parts of the behaviour which can be toggled in the HTML documentation --> <!ELEMENT link (#PCDATA)> <!ATTLIST link loc CDATA #REQUIRED> <!ELEMENT newline EMPTY> <!ELEMENT tab EMPTY> <!ELEMENT name (#PCDATA)> <!ELEMENT location (#PCDATA)> <!ELEMENT comment (author | config | desc | exception | member | param | purpose | remark | return | see | since | status | url | verdict | version)*> <!-- @version 2.0.1 ist stored as <version>2.0.1</version> --> <!ELEMENT author (#PCDATA | esee | eurl)*> <!ELEMENT config (#PCDATA | esee | eurl)*> <!ELEMENT desc (#PCDATA | esee | eurl)*> <!ELEMENT exception (#PCDATA | esee | eurl)*> <!ELEMENT purpose (#PCDATA | esee | eurl)*> <!ELEMENT param (#PCDATA | esee | eurl)*> <!ELEMENT remark (#PCDATA | esee | eurl)*> <!ELEMENT return (#PCDATA | esee | eurl)*> <!ELEMENT see (#PCDATA)> <!ELEMENT since (#PCDATA | esee | eurl)*> <!ELEMENT status (#PCDATA | esee | eurl)*> <!ELEMENT url (#PCDATA | esee | eurl)*> <!ELEMENT verdict (#PCDATA | esee | eurl)*> <!ELEMENT version (#PCDATA | esee | eurl)*> <!ELEMENT member (#PCDATA | esee | eurl)*> <!ELEMENT esee (#PCDATA)> <!ELEMENT eurl (#PCDATA)>
Examples
TTCN-3 | XML | |
---|---|---|
Behaviour |
testcase tc2() runs on sampleComponent1 system sampleComponent3{ map(mtc:p1, system:p1) var sampleComponent2 component2, component3; component2 := sampleComponent2.create; component3 := sampleComponent2.create; component2.start(f3()); component3.start(f4(1, "a")); unmap(mtc:p1, system:p1) } |
<behaviour><keyword>testcase</keyword> <link loc="testcases-tc2-328.html">tc2</link> () <keyword>runs</keyword> <keyword>on</keyword> <link loc="configuration-sampleComponent1-235.html">sampleComponent1</link> <keyword>system</keyword> <link loc="configuration-sampleComponent3-365.html">sampleComponent3</link> <constructbody id="id319">{ <keyword>map</keyword> ( mtc:p1, system:p1 ) <keyword>var</keyword> <link loc="configuration-sampleComponent2-455.html">sampleComponent2</link> component2, component3; component2 := sampleComponent2.create; component3 := sampleComponent2.create; component2.start ( <link loc="functions-f3-1119.html">f3</link> () ); component3.start ( <link loc="functions-f4-1347.html">f4</link> ( 1, "a" ) ); <keyword>unmap</keyword> ( mtc:p1, system:p1 ) }</constructbody> </behaviour> |
Path |
group group1{ group group1_1{ group group1_1_1{ //... } } } |
<path> <path_group loc="groupTest-group1_1_1-341.html" name="group1_1_1"> <path_group loc="groupTest-group1_1-321.html" name="group1_1"> <path_group loc="groupTest-group1-304.html" name="group1"> </path_group> </path_group> </path_group> </path> |
import.xml
This file contains information about the imports and dependency relations of the processed TTCN-3 modules. It serves as a basis for the import / module dependency view.
DTD:
<!ELEMENT imports module*> <!ELEMENT module import*> <!ELEMENT import (import_behaviour, import*) | EMPTY> <!ATTLIST import name CDATA #REQUIRED> <!ELEMENT import_behaviour (#PCDATA | link)*> <!ELEMENT link (#PCDATA)> <!ATTLIST link loc CDATA #REQUIRED>
dependencies.xml
This file can be thought of as a blend between an abstracted version of the main project.xml file and a low-level version of the import.xml file, featuring a compact representation of the low-level dependencies at the module definition (element) level - it contains all the module definitions and all the known elements referenced directly within each module definition. There is no separate view associated to this file, since it is basically a compact representation of the main view and its main intent is the use with third-party tools to perform custom tasks, such as slicing or markup of definitions related to a particular module definition (e.g. approved / locked definitions, etc.).
DTD:
<!ELEMENT dependencies element*> <!ELEMENT element reflist> <!ATTLIST element id ID #REQUIRED, type CDATA #REQUIRED line CDATA #REQUIRED module CDATA #REQUIRED> <!ELEMENT reflist ref*> <!ELEMENT ref EMPTY> <!ATTLIST ref id IDREF #REQUIRED>
log.xml
This file contains all informations, warnings and errors for each TTCN-3 module that are logged by T3D.
DTD:
<!ELEMENT t3dlog file*> <!ATTLIST t3dlog t3dversion CDATA #REQUIRED> <!ELEMENT file (warning | error )*> <!ATTLIST file path CDATA #REQUIRED> <!ELEMENT warning #PCDATA> <!ATTLIST warning level CDATA #REQUIRED lines CDATA #REQUIRED> <!ELEMENT error #PCDATA> <!ATTLIST error level CDATA #REQUIRED lines CDATA #REQUIRED>
Generation of HTML files
The HTML documentation is generated with the project.xml and the imports.xml:
The Main View and Module Parameter/Testcase? View of the documentation are generated with the html.xsl stylesheet using the project.xml and the Import View is generated with the html_import.xsl stylesheet using the imports.xml .
Structure of the XSL-stylesheets
Below, the structure and templates of the XSL-Stylesheets are described to simplify making modifications. See {$T3D_HOME}/css/doc.css for descriptions of the HTML elements.
html.xsl
Structure of the html.xsl:
<xsl:stylesheet> <xsl:template match="/"> <xsl:result-document href="..." format="html"> <!-- generates index.html --> </xsl:result-document> <xsl:result-document href="..." format="html"> <!-- generates import_index.html --> </xsl:result-document> <xsl:result-document href="..." format="html"> <!-- generates mp_index.html --> </xsl:result-document> <xsl:for-each select="//module"> <xsl:variable name="currentmodule" select="name/text()"/> <xsl:variable name="currentindex"> <!--...--> </xsl:variable> <xsl:variable name="currentmp_index"> <!--...--> </xsl:variable> <xsl:result-document href="..." format="html"> <!-- generates Main View Documentation of modules --> </xsl:result-document> <xsl:result-document href="..." format="html"> <!-- generates MP/TC View Documentation of modules --> </xsl:result-document> <xsl:for-each select="//element[modulename/text() eq $currentmodule]"> <xsl:result-document href="..." format="html"> <!-- generates Main View Documentation of elements --> </xsl:result-document> <xsl:if test="@type eq 'testcase'"> <xsl:result-document href="..." format="html"> <!-- generates MP/TC View Documentation of testcases --> </xsl:result-document> </xsl:if> <xsl:if test="@type eq 'parameter'"> <xsl:result-document href="..." format="html"> <!-- generates MP/TC View Documentation of module parameters --> </xsl:result-document> </xsl:if> </xsl:for-each> </xsl:for-each> <xsl:for-each select="//group"> <xsl:result-document href="..." format="html"> <!-- generates Main View Documentation of groups --> </xsl:result-document> <xsl:result-document href="..." format="html"> <!-- generates MP/TC View Documentation of groups --> </xsl:result-document> </xsl:for-each> </xsl:template> <!-- Templates --> </xsl:stylesheet
The following table contains descriptions of parameters and function of the used XSLT templates in html.xsl .
Template | Parameters | Function |
---|---|---|
main_allElements | $this = module|group|element $currentindex = complete construct index |
calls views template inserts $currentindex calls header template calls element_withcomment template |
mp_allTables | $testcases = testcases $parameters = parameters |
generates div_mp element for groups, modules and the MP/TC index |
html_head | $title = title of page | generates head element |
views | $main = location of Main View documentation of the current element $mp = location of MP/TC View documentation of the current element $import = location of Import View documentation of the current element $togglemode | generates div_views element and T3D Generation Stamp |
main_index | $modulename = name of the current module | generates div_modules element generates div_index element of the Main View of modules, elements and the index |
main_groupindex | $grouplocation = location of the current group | generates div_modules element generates div_index of the Main View of groups |
index_grouplist | $this = groups $prefix = '' or 'mp_' | generates list of hyperlinks to all groups given in parameter $this |
index_elementlist | $this = elements $prefix = '' or 'mp_' $type = type of elements | generates list of hyperlinks to all elements given in parameter $this |
mp_index | $modulename = name of the current module | generates div_modules element generates div_index of the MP/TC View |
index_modulelist | $prefix = '', 'mp_' or 'import_' | generates list of hyperlinks to all modules |
header | $this = module|group|element $prefix = '', 'mp_' or 'import_' |
generates p_header element |
element_withcomment | $this = module|group|element | generates div_content element generates div_comment element generates div_element element |
path | $this = module|group|element $prefix = '', 'mp_' or 'import_' | calls path_group template |
path_group | $this = module|group|element $prefix = '', 'mp_' or 'import_' | generates the group part of the path navigation |
mp_testcase_table | $this = testcases | generates the MP/TC View table of testcase elements |
mpview_path_testcase | $this = mpview_TestcaseDefs $first = true|false | generates Path part of the MP/TC View table of testcase elements |
match mpview_ModuleParDef | generates the MP/TC View table of module parameter elements |
|
mpview_path_modulepar | $this = module|group|element $first = true|false | generates Path part of the MP/TC View table of module parameter elements |
html_import.xsl
The following table contains descriptions of parameters and function of the used XSLT templates in html_import.xsl .
Template | Parameters | Function |
---|---|---|
import | $module = name of the current module $importname = name of imported module |
generates a list of imports by $module from $importname |
importby | $imports = list of indirect imports | generates a list of $imports |
show_imports | $module = module $currentmodule = currently selected module |
selects a color for $currentmodule and calls the colored_module template |
colored_module | $module = module $color = class of $module |
generates a colored hyperlink to $currentmodule (used for list of modules in the middle column) |
Using new XSL-Stylesheets and/or XML files
New XSL-Transformations can be executed by using the following code.
XSL-Transformation:
String foldername = getProperOutputPath() + "/" + getSubPath(); String xmlFileName = "name.xml"; String xsltFileName = "name.xsl"; String outputFileName = "outputName"; System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl"); TransformerFactory tfactory = TransformerFactory.newInstance(); Transformer transformer; try { transformer = tfactory.newTransformer(new StreamSource(new File(xsltFileName))); //transformer.setParameter("parameterName", <parameterValue>); transformer.transform(new StreamSource(new File(foldername + "/" + xmlFileName)), new StreamResult(new FileOutputStream(foldername + "/" + outputFileName))); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); }
Javascript
To toggle the visibility of certain elements in the HTMl documentation (e.g. navigation items), a Javascript file called doc.js is used. It can be found in {$T3D_HOME}/js.
Functions
The Javascript file consists of the following functions:
- getElementsByClass(searchClass,node,tag) : returns all HTML elements of a certain class
- toggleConstructbodies(hide) : toggles visibility of all construct bodies in the Main View of elements/groups/modules if hide == true
- toggleImportDetails() : toggles visibility of all details in the Import View of a module
- togglePaths(hide) : toggles visibility of all Path columns in the MP/TC View of module parameters/test cases/groups/modules if hide == true
- toggleHideNotes() : toggles visibility of all (toggle) notes in the Main View of elements/groups/modules
- toggleElement(element) : toggles the visibility of element
- toggle(elementName) : calls toggleElement() with the element with the Id elementName
- mp_init(listName) : collapses all construct lists in the construct index of the MP/TC View, except listName
- init(listName) : calls toggleHideNotes() and collapses all construct lists in the construct index of the Main View, except listName
Attachments (3)
- tecdoc.png (19.2 KB) - added by phdmakk 15 years ago.
- tecdoc2.png (16.6 KB) - added by phdmakk 15 years ago.
- tecdoc3.png (6.1 KB) - added by phdmakk 15 years ago.
Download all attachments as: .zip