Skip to main content

Introspection

Overview​

To record data in TimeBase you need a stream with a specific schema to match your data model. You can do that manually by creating a RecordClassDescriptor. This method may be error-prone and time-consuming. To automate such routine tasks, we suggest using introspection that allows to automatically create stream schemas based on your data model described as annotated Java or C# classes. You can then take the right schema and use it to create a stream in TimeBase.

Annotations​

Use TimeBase Annotations to mark your original Java and C# classes. Introspector creates class descriptor based on your annotations.

On the following example you may look at both original and annotated packageheader Java class. The best practice is to annotate a class name first and then all the fields, enumerations, arrays, and objects you wish a TimeBase schema to have. In this example we describe the basic annotation principles. Refer to Annotations document to learn more.

Code without Annotations​

For example purposes, let's annotate the following code.

public class PackageHeader
{

protected ObjectArrayList<BaseEntryInfo> entries = null;

public ObjectArrayList<BaseEntryInfo> getEntries() {
return entries;
}
public void setEntries(ObjectArrayList<BaseEntryInfo> value) {
this.entries = value;
}

protected PackageType packageType = null;

public PackageType getPackageType() {
return packageType;
}

public void setPackageType(PackageType value) {
this.packageType = value;
}

protected long originalTimestamp;

public long getOriginalTimestamp() {
return originalTimestamp;
}


public void setOriginalTimestamp(long value) {
this.originalTimestamp = value;
}

protected long sourceId;
public long getSourceId() {
return sourceId;
}


public void setSourceId(long value) {
this.sourceId = value;
}

protected AttributeInfo attribute;
public AttributeInfo getAttribute() {
return attribute;
}
public void setAttribute(AttributeInfo info) {
attribute = info;
}

}

Annotate Classes​

Introspector creates classes based on this annotation. Use @SchemaElement to define a class name and a title.

//Java example
@SchemaElement(
name = "deltix.timebase.api.messages.universal.PackageHeader",
title = "Package Header"
)

Annotate Fields​

Annotate getters with @SchemaElement for introspector to create corresponding fields in a TimeBase class.

//Java example
protected long originalTimestamp;
@SchemaElement(description = "Exchange Time")
@SchemaType(dataType = SchemaDataType.TIMESTAMP)
public long getOriginalTimestamp() {
return originalTimestamp;
}
//Setters are not annotated.
public void setOriginalTimestamp(long value) {
this.originalTimestamp = value;
}

Annotate Data Types​

Data types are determined by the default type mappings but you can override those, as well as enumeration elements, using annotations in the example. In this example we use @SchemaType annotation to completely override the default encoding and data type.

//Java example
protected long sourceId;
@SchemaType(encoding = "ALPHANUMERIC(10)", dataType = SchemaDataType.VARCHAR)
public long getSourceId() {
return sourceId;
}
public void setSourceId(long value) {
this.sourceId = value;
}

Annotate Arrays​

Use @SchemaArrayType to annotate arrays for introspector to create such fields in a corresponding class.

//Java example
protected ObjectArrayList<BaseEntryInfo> entries = null;
@SchemaArrayType(isNullable = false, isElementNullable = false,
elementTypes = {TradeEntry.class, L1Entry.class, L2EntryNew.class}
)
@SchemaElement(title = "Entries")
public ObjectArrayList<BaseEntryInfo> getEntries() {
return entries;
}
public void setEntries(ObjectArrayList<BaseEntryInfo> value) {
this.entries = value;
}

Annotate Objects​

Annotate objects with @SchemaElement to create corresponding objects in a TimeBase class. In this example we annotate a polymorphic object with two nested types defined by @SchemaType annotation.

//Java example
protected AttributeInfo attribute;
@SchemaElement
@SchemaType(
dataType = SchemaDataType.OBJECT,
nestedTypes = { CustomAttribute.class, BaseAttribute.class}
)
public AttributeInfo getAttribute() {
return attribute;
}
public void setAttribute(AttributeInfo info) {
attribute = info;
}

Annotate ENUMs​

Annotate enumerations to add ENUM fields to TimeBase classes. Use @SchemaElement to define both ENUM name and elements.

//Java example
@SchemaElement(name = "deltix.timebase.api.messages.universal.PackageType",title = "Package Type")
public enum PackageType {
@SchemaElement(name = "VENDOR_SNAPSHOT")
VENDOR_SNAPSHOT,
@SchemaElement(name = "PERIODICAL_SNAPSHOT")
PERIODICAL_SNAPSHOT,
@SchemaElement(name = "INCREMENTAL_UPDATE")
INCREMENTAL_UPDATE
}

Annotated Code​

As a result, we get this code with annotations.

@SchemaElement(
name = "deltix.timebase.api.messages.universal.PackageHeader",
title = "Package Header"
)
public class PackageHeader {

protected long originalTimestamp;
@SchemaElement(description = "Exchange Time")
@SchemaType(dataType = SchemaDataType.TIMESTAMP)
public long getOriginalTimestamp() {
return originalTimestamp;
}
public void setOriginalTimestamp(long value) {
this.originalTimestamp = value;
}

protected long sourceId;
@SchemaType(encoding = "ALPHANUMERIC(10)", dataType = SchemaDataType.VARCHAR)
public long getSourceId() {
return sourceId;
}
public void setSourceId(long value) {
this.sourceId = value;
}

protected ObjectArrayList<BaseEntryInfo> entries = null;
@SchemaArrayType(isNullable = false, isElementNullable = false,
elementTypes = {TradeEntry.class, L1Entry.class, L2EntryNew.class}
)
@SchemaElement(title = "Entries")
public ObjectArrayList<BaseEntryInfo> getEntries() {
return entries;
}
public void setEntries(ObjectArrayList<BaseEntryInfo> value) {
this.entries = value;
}

protected AttributeInfo attribute;
@SchemaElement
@SchemaType(
dataType = SchemaDataType.OBJECT,
nestedTypes = { CustomAttribute.class, BaseAttribute.class}

)
public AttributeInfo getAttribute() {
return attribute;
}
public void setAttribute(AttributeInfo info) {
attribute = info;
}
}

@SchemaElement(name = "deltix.timebase.api.messages.universal.PackageType",title = "Package Type")
public enum PackageType {
@SchemaElement(name = "VENDOR_SNAPSHOT")
VENDOR_SNAPSHOT,
@SchemaElement(name = "PERIODICAL_SNAPSHOT")
PERIODICAL_SNAPSHOT,
@SchemaElement(name = "INCREMENTAL_UPDATE")
INCREMENTAL_UPDATE
}

Run Introspector​

Call introspector class to create stream schema based on your annotated code.

//Java example
Introspector introspector = Introspector.createEmptyMessageIntrospector();
RecordClassDescriptor descriptor = introspector.introspectRecordClass(PackageHeader.class);

Stream Schema​

We get such stream schema based on the annotated code via introspection.

Coming soon
info
  • Refer to Annotations to learn what annotations you can use to create TimeBase stream schemas.
  • Refer to Record Class Descriptor to learn more about this class.
  • Refer to Solution Generator to learn how to generate classes based on TimeBase streams' schemas.
  • Refer to Data Encoding to learn how you can consume data in TimeBase raw and bound to a data model.