JBoss.orgCommunity Documentation

Chapter 3. Using Buffers with BlackTie

3.1. X_OCTET
3.2. X_COMMON/X_C_TYPE
3.3. How to use Nested Buffers in BlackTie
3.3.1. Defining a schema

BlackTie supports all three of the buffer types defined in the XATMI specification.

Namely these are:

  1. X_OCTET

  2. X_COMMON

  3. X_C_TYPE

BlackTie also supports the Nested Buffer Format described below.

The X_OCTET buffer type operates exactly as per is defined within Chapter 9 of the specification with the following points of interest:

For our implementation of these buffer types we have required the user to configure the structure of the buffer in the btconfig.xml

Nested Buffer Format is defined in a xsd schema file, such as employee.xsd:

<!-- XML : generated by JHighlight v1.0 (http://jhighlight.dev.java.net) -->
<span class="xml_processing_instruction">&lt;?xml&nbsp;version=&quot;1.0&quot;?&gt;</span><span class="xml_plain"></span><br />
<span class="xml_tag_symbols">&lt;</span><span class="xml_tag_name">xsd:schema</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">xmlns:xsd</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;http://www.w3.org/2001/XMLSchema&quot;</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">xmlns</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;http://www.jboss.org/blacktie&quot;</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">targetNamespace</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;http://www.jboss.org/blacktie&quot;</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">elementFormDefault</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;qualified&quot;</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;</span><span class="xml_tag_name">xsd:element</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">name</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;employee&quot;</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">type</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;employee_type&quot;</span><span class="xml_tag_symbols">/&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;</span><span class="xml_tag_name">xsd:complexType</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">name</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;employees_type&quot;</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;</span><span class="xml_tag_name">xsd:sequence</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">minOccurs</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;0&quot;</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">maxOccurs</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;unbounded&quot;</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;</span><span class="xml_tag_name">xsd:element</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">name</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;employee&quot;</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">type</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;employee_type&quot;</span><span class="xml_tag_symbols">/&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;/</span><span class="xml_tag_name">xsd:sequence</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;/</span><span class="xml_tag_name">xsd:complexType</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;</span><span class="xml_tag_name">xsd:complexType</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">name</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;employee_type&quot;</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;</span><span class="xml_tag_name">xsd:choice</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">minOccurs</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;0&quot;</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">maxOccurs</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;unbounded&quot;</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;</span><span class="xml_tag_name">xsd:element</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">name</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;name&quot;</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">minOccurs</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;0&quot;</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">maxOccurs</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;unbounded&quot;</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;</span><span class="xml_tag_name">xsd:simpleType</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;</span><span class="xml_tag_name">xsd:restriction</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">base</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;xsd:string&quot;</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;</span><span class="xml_tag_name">xsd:maxLength</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">value</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;8&quot;</span><span class="xml_tag_symbols">/&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;/</span><span class="xml_tag_name">xsd:restriction</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;/</span><span class="xml_tag_name">xsd:simpleType</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;/</span><span class="xml_tag_name">xsd:element</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;</span><span class="xml_tag_name">xsd:element</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">name</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;id&quot;</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">minOccurs</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;0&quot;</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">maxOccurs</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;unbounded&quot;</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">type</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;xsd:long&quot;</span><span class="xml_plain">&nbsp;</span><span class="xml_attribute_name">default</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">&quot;0&quot;</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;/</span><span class="xml_tag_name">xsd:element</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;/</span><span class="xml_tag_name">xsd:choice</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />
<span class="xml_plain">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="xml_tag_symbols">&lt;/</span><span class="xml_tag_name">xsd:complexType</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />
<span class="xml_tag_symbols">&lt;/</span><span class="xml_tag_name">xsd:schema</span><span class="xml_tag_symbols">&gt;</span><span class="xml_plain"></span><br />

All xsd schema files should been placed in buffers directory.

Get a nested buffer in blacktie, you should use

<!-- <br/> --><span class="java_type">char</span><!-- <br/> --><span class="java_operator">*</span><!-- <br/> --><span class="java_plain">&nbsp;buffer&nbsp;</span><!-- <br/> --><span class="java_operator">=</span><!-- <br/> --><span class="java_plain">&nbsp;tpalloc</span><!-- <br/> --><span class="java_separator">(</span><!-- <br/> --><span class="java_literal">&quot;BT_NBF&quot;</span><!-- <br/> --><span class="java_separator">,</span><!-- <br/> --><span class="java_plain">&nbsp;</span><!-- <br/> --><span class="java_literal">&quot;&lt;buffer_name&gt;&quot;</span><!-- <br/> --><span class="java_separator">,</span><!-- <br/> --><span class="java_plain">&nbsp;</span><!-- <br/> --><span class="java_literal">0</span><!-- <br/> --><span class="java_separator">);</span><!-- <br/> --><span class="java_plain">&nbsp;&nbsp;</span><!-- <br/> --><span class="java_operator">//</span><!-- <br/> --><span class="java_plain">&nbsp;in&nbsp;C</span><!-- <br/> --><span class="java_operator">++</span>
<!--  --><br/><span class="java_plain">BT_NBF&nbsp;buffer&nbsp;</span><span class="java_operator">=</span><span class="java_plain">&nbsp;</span><span class="java_separator">(</span><span class="java_plain">BT_NBF</span><span class="java_separator">)</span><span class="java_plain">&nbsp;connection</span><span class="java_separator">.</span><span class="java_plain">tpalloc</span><span class="java_separator">(</span><span class="java_literal">&quot;BT_NBF&quot;</span><span class="java_separator">,</span><span class="java_plain">&nbsp;</span><span class="java_literal">&quot;&lt;buffer_name&gt;&quot;</span><span class="java_separator">,</span><span class="java_plain">&nbsp;</span><span class="java_literal">0</span><span class="java_separator">);</span><span class="java_plain">&nbsp;&nbsp;&nbsp;</span><span class="java_operator">//</span><span class="java_plain">&nbsp;in&nbsp;</span><span class="java_type">Java</span>

After that, the following options are available:

e.g.

<!-- C++ : generated by JHighlight v1.0 (http://jhighlight.dev.java.net) -->
<span class="cpp_comment">//&nbsp;add&nbsp;a&nbsp;attribute&nbsp;in&nbsp;buffer</span><br />
<span class="cpp_type">char</span><span class="cpp_plain">&nbsp;name</span><span class="cpp_separator">[</span><span class="cpp_literal">16</span><span class="cpp_separator">];</span><span class="cpp_plain"></span><br />
<span class="cpp_type">char</span><span class="cpp_plain">&nbsp;</span><span class="cpp_keyword">value</span><span class="cpp_separator">[</span><span class="cpp_literal">16</span><span class="cpp_separator">];</span><span class="cpp_plain"></span><br />
<span class="cpp_type">int</span><span class="cpp_plain">&nbsp;len&nbsp;</span><span class="cpp_operator">=</span><span class="cpp_plain">&nbsp;</span><span class="cpp_literal">16</span><span class="cpp_separator">;</span><span class="cpp_plain"></span><br />
<span class="cpp_plain"></span><br />
<span class="cpp_type">char</span><span class="cpp_operator">*</span><span class="cpp_plain">&nbsp;buf&nbsp;</span><span class="cpp_operator">=</span><span class="cpp_plain">&nbsp;tpalloc</span><span class="cpp_separator">((</span><span class="cpp_type">char</span><span class="cpp_operator">*</span><span class="cpp_separator">)</span><span class="cpp_plain">&nbsp;</span><span class="cpp_literal">&quot;BT_NBF&quot;</span><span class="cpp_separator">,</span><span class="cpp_plain">&nbsp;</span><span class="cpp_separator">(</span><span class="cpp_type">char</span><span class="cpp_operator">*</span><span class="cpp_separator">)</span><span class="cpp_plain">&nbsp;</span><span class="cpp_literal">&quot;employee&quot;</span><span class="cpp_separator">,</span><span class="cpp_plain">&nbsp;</span><span class="cpp_literal">0</span><span class="cpp_separator">);</span><span class="cpp_plain"></span><br />
<span class="cpp_plain">strcpy</span><span class="cpp_separator">(</span><span class="cpp_plain">name</span><span class="cpp_separator">,</span><span class="cpp_plain">&nbsp;</span><span class="cpp_literal">&quot;test&quot;</span><span class="cpp_separator">);</span><span class="cpp_plain"></span><br />
<span class="cpp_plain"></span><br />
<span class="cpp_plain">rc&nbsp;</span><span class="cpp_operator">=</span><span class="cpp_plain">&nbsp;btaddattribute</span><span class="cpp_separator">(</span><span class="cpp_operator">&amp;</span><span class="cpp_plain">buf</span><span class="cpp_separator">,</span><span class="cpp_plain">&nbsp;</span><span class="cpp_separator">(</span><span class="cpp_type">char</span><span class="cpp_operator">*</span><span class="cpp_separator">)</span><span class="cpp_plain">&nbsp;</span><span class="cpp_literal">&quot;name&quot;</span><span class="cpp_separator">,</span><span class="cpp_plain">&nbsp;name</span><span class="cpp_separator">,</span><span class="cpp_plain">&nbsp;strlen</span><span class="cpp_separator">(</span><span class="cpp_plain">name</span><span class="cpp_separator">));</span><span class="cpp_plain"></span><br />
<span class="cpp_plain">rc&nbsp;</span><span class="cpp_operator">=</span><span class="cpp_plain">&nbsp;btgetattribute</span><span class="cpp_separator">(</span><span class="cpp_plain">buf</span><span class="cpp_separator">,</span><span class="cpp_plain">&nbsp;</span><span class="cpp_separator">(</span><span class="cpp_type">char</span><span class="cpp_operator">*</span><span class="cpp_separator">)</span><span class="cpp_plain">&nbsp;</span><span class="cpp_literal">&quot;name&quot;</span><span class="cpp_separator">,</span><span class="cpp_plain">&nbsp;</span><span class="cpp_literal">0</span><span class="cpp_separator">,</span><span class="cpp_plain">&nbsp;</span><span class="cpp_separator">(</span><span class="cpp_type">char</span><span class="cpp_operator">*</span><span class="cpp_separator">)</span><span class="cpp_plain">&nbsp;</span><span class="cpp_keyword">value</span><span class="cpp_separator">,</span><span class="cpp_plain">&nbsp;</span><span class="cpp_operator">&amp;</span><span class="cpp_plain">len</span><span class="cpp_separator">);</span><span class="cpp_plain"></span><br />
<span class="cpp_plain"></span><br />
<span class="cpp_plain">strcmp</span><span class="cpp_separator">(</span><span class="cpp_keyword">value</span><span class="cpp_separator">,</span><span class="cpp_plain">&nbsp;</span><span class="cpp_literal">&quot;test&quot;</span><span class="cpp_separator">);</span><span class="cpp_plain"></span><br />

more quickstarts can be founded under <BLACKTIE_HOME>/quickstart/nbf, and this quickstart also runs as part of the run_all_quickstarts script.