Customization
Dispatcher: translator.xml Reference
Module/conf/translator.xml is the translator registry. One element per
service, 93 KB and 78 services as shipped. This is the file you edit to add a
translator to a Module.
Document shape
The file opens with a DTD internal subset defining entities used throughout:
<!DOCTYPE Translators[
<!ENTITY MODULEBASE "">
<!ENTITY JAVABIN "">
<!ENTITY UGSPKG "com.teamcenter.translator.ugs.">
<!ENTITY WRAPPER "com.teamcenter.tstk.server.translator.ugs.">
<!ENTITY EAIWRAPPER "&WRAPPER;EaiTranslator">
]>
&MODULEBASE; is empty as shipped and is what every dir= attribute is
relative to. It gets substituted at install time.
Service element
The element name is arbitrary and cosmetic. The service and provider
attributes are what everything else keys on.
<Catiav5ToJt provider="SIEMENS" service="catiav5tojt" isactive="false">
<TransExecutable dir="&MODULEBASE;/Translators/catiatojt/v5/UGS"
name="catiav5tojt.bat" />
<Options>
<Option name="inputdir" string="-dir"
description="Full path to the input directory."/>
<Option name="outputdir" string="-outputDirectory"
description="Full path to the output directory."/>
</Options>
<FileExtensions>
<InputExtensions nitem="3">
<InputExtension extension=".CATPart"/>
<InputExtension extension=".CATProduct"/>
<InputExtension extension=".CATDrawing"/>
</InputExtensions>
<OutputExtensions nitem="2">
<OutputExtension extension=".jt"/>
<OutputExtension extension=".cgm"/>
</OutputExtensions>
</FileExtensions>
<!-- Postprocess provider="SIEMENS" service="previewservice"/ -->
</Catiav5ToJt>
Attributes
| Attribute | Required | Meaning |
|---|---|---|
provider |
yes | Provider name. Must match the Translator.<provider>.* keys in Service.properties and the ETS.* preferences |
service |
yes | Service name. Same matching requirement |
isactive |
yes in practice | Defaults to inactive. All 78 OOTB services ship false except tozipfile |
wrapperclass |
no | Fully-qualified Java class extending DefaultTranslator. Only 8 of 78 use one. Can also name com.teamcenter.tstk.translator.DefaultTranslator itself, with no subclass |
OutputNeeded |
no | Set false for services that legitimately produce no output file, or Dispatcher treats an empty result as failure |
maxlimit |
no | Concurrent instances of this translator on this Module |
MaximumProgress |
no | Per-translator override of the watchdog ceiling |
NoOfTries |
no | Retry count |
WaitTimeForReTries |
no | Delay between retries |
WaitTimeBetTrans |
no | Delay between successive translations |
ExclExitVal |
no | Exit value to treat as success rather than failure |
The bottom six do not appear in the shipped file at all, but a tuned production
deployment uses them heavily. ExclExitVal is the one worth knowing: it is the
clean way to accept a tool that returns a non-zero code you know is benign,
instead of wrapping it in a script that swallows the code and hides real
failures. See
Anatomy of a working custom translator
for a live example using all of them at once.
<TransExecutable>
dir plus name. That is the whole thing. The Module cds there and runs it.
<Options>
Each <Option> maps a logical name to the command-line form your executable
wants:
| Attribute | Meaning |
|---|---|
name |
Logical option name, referenced by the request |
string |
The literal command-line flag. Trailing = means concatenate: string="-mode=" with value process produces one argument -mode=process, whereas string="-mode" produces two arguments |
value |
A fixed value, making the option a constant |
optionkey |
Maps a client-supplied key onto this option |
description |
Shown by the translator's own -help |
A worked example combining all of them, from jttobboxandtso:
<Options>
<Option name="mode" string="-mode=" value="process"
description="Utility will always run in process mode"/>
<Option name="clientoption" optionkey="TRANSLATION_MODE"
string="-translation_mode=" value="JTTOBBOX+JTTOTSO"
description="Translator mode options."/>
<Option name="inputpath" string="-dataset_list="
description="Full path to the input file."/>
</Options>
⚠⚠ Copying a stock block brings its arguments with it
The natural way to register a new translator is to copy the closest stock element and edit it. That is fine for structure and fatal for
<Options>, because the options are the command line and they are easy to leave behind unchanged.Observed live: a custom translator modeled on
store_and_forwardinherited<Option name="clientoption" optionkey="Username" string="-user=" value=""/> <Option name="clientoption" optionkey="Group" string="-group=" value=""/>and was therefore invoked as
Command string: ...\Translators\MyService\MyService.bat -user= -group=The executable received none of the arguments it needed, printed its usage banner, and exited non-zero. Nothing in the configuration looks wrong; the
Command string:line in the module log is what reveals it.
optionkeyreads from the request's argument keys, not from anything Dispatcher knows intrinsically. Those two came back empty because the request carried no such arguments. If you want the item id on the command line, the request has to supply it —keyValueArgs[]oncreateDispatcherRequest, or the ITK equivalent.Rewrite
<Options>from scratch for every new translator. Copy the element for its shape, then delete the options and write your own.
<FileExtensions>
Input and output extension allow-lists. The nitem attribute must match the
number of child elements. These drive hasValidInputExtension() /
hasValidOutputExtension() on the translator class.
<TransErrorStrings> — the one that catches people
<TransErrorStrings>
<TransInputStream string="User is not privileged to run this utility."/>
<TransErrorStream string="AsyncInvoker Report"/>
</TransErrorStrings>
Dispatcher scans the translator's stdout (TransInputStream) and stderr
(TransErrorStream) for these substrings. A match fails the task regardless
of exit code. This exists because a great many CAD translators print fatal
errors and then exit 0.
The inverse also exists. Two document-level elements, <ErrorStrings> and
<ErrorExclStrings>, define site-wide error patterns and exclusions, and the
AbstractTranslator API exposes addExclErrorString() / addExclInputString()
for per-translator exclusions. Chapter 6 of the admin guide covers "Creating an
exclusion list for error messages".
If your translator prints something that merely looks like an error, put it in the exclusion list rather than suppressing the output.
<Postprocess>
<Postprocess provider="SIEMENS" service="previewservice"/>
Chains another service after this one. Commented out on most OOTB CAD
translators, ready to enable. There is matching API for whether the postprocess
runs on a different machine (isPostProcessOnDifferentMachine()).
Editing rules
- Set
isactive="true". This is the single most common reason a correctly configured translator never runs. - Provider and service must match, exactly and case-consistently, across
translator.xml,Service.propertiesand theETS.*preferences. Note that theETS.*preferences upper-case the service name while the extract/load preferences do not. See the zero-Java recipe for the full casing table. - Resolve every
CHANGE_MEin the corresponding launch script. - Run the script standalone with
-helpand then with real arguments before involving Dispatcher at all. Every shipped translator supports this and the readmes tell you to.
Runtime tuning available per translator
Exposed by AbstractTranslator, set either in config or from a wrapper class:
| Control | Method |
|---|---|
| Concurrency cap for this translator | setMaxLimit() / reachedMaxLimit() / getActiveTranslators() |
| Retry count | setReTries() |
| Source path length limit | setSrcPathLimit() |
| Require an output file to declare success | setOutputNeeded() |
| Daemon-style invocation | setDaemonCommand() |
| Pre/post process provider and service | setPreprocessProvider(), setPostprocessService(), etc. |
Site-wide caps live elsewhere: TaskConfiguration.xml caps a service across all
Modules, MaximumTasks in transmodule.properties caps one Module across all
services.
Source: Module/conf/translator.xml (shipped SDK, 93 KB, 78 services) · retrieved 2026-08-03