OCA File
The OCA File is a concept that enables the expression of OCA Objects using a Domain Specific Language (DSL). The specification informative sections elaborate on the demand for a human-readable and machine-actionable language.
OCAFile conceptually encompasses the OCA Bundle concept and enables the creation and manipulation of it.
Usage
OCAFile provides instructions for creating OCA Objects, such as Capture Bases and Overlays. The instructions reflect the OCA specification.
OCAFile in a nutshell
The construction of an OCAfile begins with the pivotal step of creating a Capture Base through the ADD ATTRIBUTE command. This step is foundational, setting the stage for the schema's development. The subsequent use of ADD <overlay-type> ATTRS for binding overlay types to the capture base introduces additional layers of complexity and functionality. Together, these commands form the bedrock of the OCAfile, enabling the creation of robust, multifaceted schemas that are capable of capturing and representing complex data structures and relationships within the OCA framework.
Create an OCAFile
Let's start with an example and then discuss instructions step by step. The following example is a simple Entrance Credential example:
--name=EntranceCredential
ADD ATTRIBUTE d=Text i=Text passed=Boolean
ADD META en PROPS name="Entrance credential" description="Entrance credential"
ADD CHARACTER_ENCODING ATTRS d=utf-8 i=utf-8 passed=utf-8
ADD CONFORMANCE ATTRS d=M i=M passed=M
ADD LABEL en ATTRS d="Schema digest" i="Credential Issuee" passed="Passed"
ADD LABEL pl ATTRS d="Identyfikator" i="Wydawca" passed="Pozwolenie"
ADD ATTRIBUTE select=Text
ADD ENTRY_CODE ATTRS select=["o1", "o2", "o3"]
ADD ENTRY en ATTRS select={"o1": "Adult", "o2": "Childe", "o3": "Veteran"}
ADD ENTRY pl ATTRS select={"o1": "Dorosły", "o2": "Dziecko", "o3": "Weteran"}
Source: entrance-credential.ocafile
Explanation:
- The
ADD ATTRIBUTEcommand defines the attributes of the OCA Capture Base. - The
ADD METAcommand defines the OCA Bundle's metadata. - The
ADD CHARACTER_ENCODINGcommand defines the character encoding of the attributes (Character Encoding Overlay). - The
ADD CONFORMANCEcommand defines the conformance of the attributes (Conformance Overlay). - The
ADD LABELcommand defines the labels for the attributes (Label Overlay). - The
ADD ENTRY_CODEcommand defines the entry code for the attributes (Entry Code Overlay). - The
ADD ENTRYcommand defines the entries for the attributes (Entry Overlay).
Build an OCAFile
You can build an OCAFile using the OCA Bin. The following command builds the Entrance Credential example:
$ ./oca build --ocafile entrance-credential.ocafile
# OCA bundle created in local repository with SAID: EKvrSBy4Nu29oFF-q4NubgvTLWe4G3yRcEo3zoFjr9hd
# and name: EntranceCredential
Alter an OCAFile
You can alter an OCAFile and add instructions to modify or extend an existing Bundle. You can do it by appending the entrance-credential.ocafile from above or using the FROM command. We demonstrate the latter approach. Let's add a new attribute to the Entrance Credential example:
--name=ExpiringEntranceCredential
FROM EKvrSBy4Nu29oFF-q4NubgvTLWe4G3yRcEo3zoFjr9hd # This is the SAID of the EntranceCredential
ADD ATTRIBUTE expires=DateTime
ADD CONFORMANCE ATTRS expires=M
ADD LABEL en ATTRS expires="Expiration date"
ADD LABEL pl ATTRS expires="Data wygaśnięcia"
Source: expiring-entrance-credential.ocafile
Let's now build the Expiring Entrance Credential:
$ ./oca build --ocafile expiring-entrance-credential.ocafile
# OCA bundle created in local repository with SAID: EHGzoceOvAbrgDHZZXTPAOD_zzVhuVjTwF9DAXEmynfE
# and name: ExpiringEntranceCredential
Commands
TIP
All commands are case-insensitive. The commands are written in uppercase for clarity.
ADD
The ADD operation enables the actual creation of OCA Objects.
ADD ATTRIBUTE
Adds attributes to the Capture Base. Supports adding multiple attributes at once.
ADD ATTRIBUTE d=Text i=Text passed=Boolean
Example: ADD ATTRIBUTE
ADD FLAGGED_ATTRIBUTES
Adds flagged attributes, so-called PIIs , to the Capture Base. Supports adding multiple attributes at once:
ADD FLAGGED_ATTRIBUTES name surname email
Example: ADD FLAGGED_ATTRIBUTES
ADD CHARACTER_ENCODING
Adds character encoding to the attributes. Supports adding multiple attributes at once.
ADD CHARACTER_ENCODING ATTRS d=utf-8 i=utf-8 passed=utf-8
Example: ADD CHARACTER_ENCODING
Supported encodings:
base64utf-8iso-8859-1utf-16utf-16beutf-16le
ADD FORMAT
Specifies attribute format. Useful, i.e., for binary data.
ADD ATTRIBUTE image=Binary
ADD FORMAT ATTR image="image/png"
Example: ADD FORMAT
ADD LABEL
Adds localized human-readable labels to the attributes. Supports adding multiple attributes at once.
The LABEL command is localized and expects the ISO 639 language code in the command input.
ADD LABEL en ATTRS d="Schema digest" i="Credential Issuee" passed="Passed"
ADD LABEL pl ATTRS d="Identyfikator" i="Wystawca" passed="Pozwolenie"
Example: ADD LABEL
ADD META
Adds localized human-readable metadata to the OCA Bundle. Support name and description properties.
The META command is localized and expects the ISO 639 language code in the command input.
ADD META en PROPS name="Entrance credential" description="Entrance credential"
Example: ADD META
ADD CARDINALITY
Adds cardinality property to the attributes. Supports adding multiple attributes at once.
ADD ATTRIBUTE tools=Array[Text]
ADD CARDINALITY ATTRS tools="1-"
Example: ADD CARDINALITY
See the spec for the available cardinality options.
ADD CONFORMANCE
Adds conformance property to the attributes. Supports adding multiple attributes at once.
ADD CONFORMANCE ATTRS passed=M
Example: ADD CARDINALITY
The attribute conformance can be set to either M (mandatory) or O (optional).
ADD ENTRY_CODE
Adds entry codes to the attribute. Supports adding multiple attributes at once.
ADD ENTRY_CODE ATTRS gender=["m", "f", "o"]
Example: ADD ENTRY_CODE
ADD ENTRY
Adds entries to the attribute. Supports adding multiple attributes at once.
ADD ENTRY en ATTRS gender={"m": "Male", "f": "Female", "o": "Other"}
ADD ENTRY pl ATTRS gender={"m": "Mężczyzna", "f": "Kobieta", "o": "Inne"}
Example: ADD ENTRY
FROM
The FROM operation extends an existing OCA Bundle without modifying it. It creates a new OCA Bundle with a new SAID that includes the original Bundle.
FROM EKvrSBy4Nu29oFF-q4NubgvTLWe4G3yRcEo3zoFjr9hd
ADD ATTRIBUTE expires=DateTime
#...more commands...
Basic Types
OCAFile supports all the types defined in OCA specification. The following types are available:
ArrayBinaryBooleanDateTimeNumericText
References
To establish relationships among OCA Bundles, OCAFile supports references. The reference mechanism mimics foreign key concept widely known in relational databases.
The process of creating a relationship between OCA Bundles consists of two steps:
- Define an OCAFile that will be referred to (
origin OCAFile). - Refer to the origin OCAFile in another OCAFile (
destination OCAFile).
Reference types
There are two ways to establish a relationship between OCA Bundles
refs directive
In the destination OCAFile, use the refs prefix that resolves to SAID reference and expects the SAID of the referred OCA Bundle (the product of origin OCAFile).
ADD ATTRIBUTE customer=refs:ENqVB-2SpRIJTaqeaGfQNKQ580rvDc1QUJUswJYyze7Y
refs example. Customer SAID refers to customer.ocafile defined below.
The customer attribute defined using refs gets the same characteristics as any other attribute. It can have labels, conformance, and other properties.
refn directive
In the destination OCAFile, use the refn prefix that resolves to a named reference and expects the name of the referred OCA Bundle. The name of the Bundle is set implicitly using --name directive in its source OCAFile. Furthermore, it resolves locally using only the OCA Bin command line interface.
The refn directive creates a reference that can be resolved using a human-readable name rather than a digest (SAID). This is useful when working with a large number of OCAFiles as it reduces the complexity of maintaining references via immutable SAIDs. Working with origin OCAFile doesn't require the SAID change in destination OCAFile every time it changes.
ADD ATTRIBUTE customer=refn:Customer
refn example. Customer SAID refers to customer.ocafile defined below.
The customer attribute defined using refn gets the same characteristics as any other attribute. It can have labels, conformance, and other properties.
WARNING
The refn directive works solely in a local environment in collaboration with the OCA Bin .
Relationships
Has one
Let's consider the following OCAFiles as an example:
customer.ocafile
--name=Customer
ADD ATTRIBUTE name=Text address=Text
ADD LABEL en ATTRS name="Name" address="Address"
ADD LABEL pl ATTRS name="Nazwa klienta" address="Adres"
invoice.ocafile
--name=Invoice
ADD ATTRIBUTE issued=DateTime customer=refn:Customer
ADD CONFORMANCE ATTRS issued=M
ADD LABEL en ATTRS issued="Issued date"
ADD LABEL pl ATTRS issued="Data wystawienia"
ADD LABEL en ATTRS customer="Customer"
ADD LABEL pl ATTRS customer="Klient"
Running the OCA Bin:
$ ./oca build --ocafile customer.ocafile
# OCA bundle created in local repository with SAID: ENqVB-2SpRIJTaqeaGfQNKQ580rvDc1QUJUswJYyze7Y
# and name: Customer
$ ./oca build --ocafile invoice.ocafile
# OCA bundle created in local repository with SAID: EC2TrdZ8koM8w-zUZm1r0LUcUp9VHFrcuMOrs7WmsD0Z
# and name: Invoice
We have two OCAFiles: customer.ocafile and invoice.ocafile. The customer.ocafile defines a unique name using the --name=Customer directive.
The invoice.ocafile defines the customer attribute as customer=refn:Customer. It establishes a relationship between the Invoice and Customer OCA Bundles and specifically says that Invoice has one Customer.
Has many
Let's define the Line Item OCAFile for the invoice:
--name=LineItem
ADD ATTRIBUTE product=Text quantity=Numeric price=Numeric
ADD CONFORMANCE ATTRS product=M quantity=M price=M
ADD LABEL en ATTRS product="Product" quantity="Quantity" price="Price"
ADD LABEL pl ATTRS product="Produkt" quantity="Ilość" price="Cena"
line-item.ocafile
and extend the invoice.ocafile from Has one section:
-- name=InvoiceWithLineItems
# FROM currently lacks the `refn` support :-(
FROM EC2TrdZ8koM8w-zUZm1r0LUcUp9VHFrcuMOrs7WmsD0Z # This is the SAID of the Invoice
ADD ATTRIBUTE lineItems=Array[refn:LineItem]
ADD LABEL en ATTRS lineItems="Line Items"
ADD LABEL pl ATTRS lineItems="Pozycje"
ADD CARDINALITY ATTRS lineItems="1-"
invoice-with-line-items.ocafile
Running the OCA Bin:
$ ./oca build --ocafile line-item.ocafile
# OCA bundle created in local repository with SAID: ED-lSEZPr1W5M7zRgYEWbnBwhNawOgnesrXUB34_mD6o
# and name: LineItem
$ ./oca build --ocafile invoice-with-line-items.ocafile
# OCA bundle created in local repository with SAID: EEYxTLl68T_Yl1EYzcW40bqefsvrggw5-6cWYqFUmIAz
# and name: InvoiceWithLineItems
The invoice-with-line-items.ocafile extends the Invoice OCA Bundle with the lineItems attribute, an array of LineItem. It establishes a relationship between the Invoice and LineItem OCA Bundles and says that Invoice has many Line Items.