Introduction
The FacetScript Language is one of the Atomic Domain Languages (ADLs). It is a low level high performance scripting language natively executed by the TQLEngine without any additional compilation besides initial parsing.
General Syntax Considerations
FacetScript language as well as other domain-specific languages used in Atomiton TQLEngine stack is not bound to a specific syntax. Any syntax capable of expressing structure can be used to represent language constructs. Out of the box, both XML and JSON can be used.
Since JSON does not have a concept of attributes, it follows that compiler does not make any distinction between XML elements and attributes either. That is, any XML attribute can be given as an element and any element with text value can be given as an attribute. JSON also does not allow multiple entries of the same name so these must be expressed as JSON arrays.
Recommended syntax to use is XML.
Keyword Normalization
Before processing, parser will normalize tags to a canonic form so a variety of keyword styles are allowed in the input. For example keywords “NewFacetInstance”, “newfacetinstance”, “NeWfAcEtInStAnCe”, “new-facet-instance” all will be normalized and interpreted as a canonic camel-case “NewFacetInstance”. Note that Keyword Normalization only applies to reserved keywords of FacetScript.
However, this is only true for defined language constructs. Documents may also contain any number of arbitrary attributes (i.e. key-value pairs) possibly organized into nested/hierarchical structures for the purpose of template processing. Such attributes are not normalized as compiler has no knowledge of their meaning. Normally it does not cause any problems as such attributes are not shared across different files.
How is FacetScript Implemented
The Atomiton TQLEngine architecture is a Scalable Event-Driven Architecture which uses a high performance NIO-based communication framework that provide low level asynchronous socket communications. A data structure called Facet Instance is associated with each incoming request. Each facet instance is identified by its facet ID and represents a capability to perform certain actions on the engine. Incoming requests without valid facet IDs are rejected. Each facet instance is also associated with its Facet Type which is a piece of executable code (a Java class) intended to actually process the request.
Once request legitimacy is established by successful resolution of its facet ID, a processing [Netty] pipeline is created for low level request processing. This includes protocol handling, data decoding/encoding and initial data transformation and normalization.
Once request data is presented in a universal fashion (as an instance of ListMap data structure), engine invokes appropriate facet type method using current connection context and facet instance information as arguments.
When to use FacetScript
From TQLEngine implementation perspective FacetScript can be used within following Facet Types. Using FacetScript is optional and completely dependent on the developer role.
FacetType | FacetScript Supported | Required | Examples |
---|---|---|---|
SffMsgFacet | Yes | Optional | |
SffTqlFacet | Yes | Optional | |
SffWdlFacet | Yes, when wrapped within Workflow Task's Invoke | Optional |
Mandatory
Using FacetScript is mandatory when defining a new package. It is in the new package definition where developers specify list of FacetTypes they want to start within the running TQLEngine.