This subsection presents and explains the coding example for an adaptor configuration definition file that is provided in the following sample file:
installation-directory\samples\httppacket\conf\xml\AdaptorCompositionDefinition.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- All Rights Reserved. Copyright (C) 2010, Hitachi, Ltd. -->
<root:AdaptorCompositionDefinition
xmlns:root="http://www.hitachi.co.jp/soft/xml/sdp/adaptor/definition"
xmlns:cmn="http://www.hitachi.co.jp/soft/xml/sdp/adaptor/definition/common"
xmlns:adp="http://www.hitachi.co.jp/soft/xml/sdp/adaptor/definition/adaptor"
xmlns:cb="http://www.hitachi.co.jp/soft/xml/sdp/adaptor/definition/callback"
xmlns:hpicon="http://www.hitachi.co.jp/soft/xml/sdp/adaptor/definition/callback/HttpPacketInputConnectorDefinition"
xmlns:map="http://www.hitachi.co.jp/soft/xml/sdp/adaptor/definition/callback/MappingDefinition"
xmlns:filter="http://www.hitachi.co.jp/soft/xml/sdp/adaptor/definition/callback/FilterDefinition"
xmlns:rex="http://www.hitachi.co.jp/soft/xml/sdp/adaptor/definition/callback/RecordExtractionDefinition"
xmlns:docon="http://www.hitachi.co.jp/soft/xml/sdp/adaptor/definition/callback/DashboardOutputConnectorDefinition"
>
<!-- Common definition -->
<cmn:CommonDefinition>
<!-- Adaptor trace definition -->
<cmn:AdaptorTraceDefinition trace="OFF"/>
</cmn:CommonDefinition>
<!--
In-process group definition
-->
<!-- In-process group definition 1 -->
<adp:InprocessGroupDefinition name="InprocessAPTest">
<!--
Input adaptor definition (definable more than once)
-->
<!-- Input adaptor definition 1 -->
<adp:InputAdaptorDefinition name="InputAdaptor1" interval="0" charCode="MS932" lineFeed="CR_LF">
<!-- CB definition for input -->
<cb:InputCBDefinition class="jp.co.Hitachi.soft.sdp.adaptor.callback.io.packetinput.HttpPacketInputCBImpl" name="inputer">
<!-- Packet input connector definition -->
<hpicon:HttpPacketInputConnectorDefinition>
<hpicon:input buffersize="4096" assemblingtime="2000">
<hpicon:packetdata globalheader="24" packetheader="16" packetoffset="8" packetlength="4" timeoffset="0"/>
<hpicon:command path="C:\Program Files\WinDump\WinDump.exe" parameter=" -i 1 -s 2048 -w - -n "tcp port 80 or port 8080""/>
</hpicon:input >
<hpicon:output unit="100">
<hpicon:record name="REQUEST" type="REQUEST" >
<hpicon:field name="SEND_IP"/>
<hpicon:field name="RECEIVE_IP"/>
<hpicon:field name="SEND_PORT"/>
<hpicon:field name="RECEIVE_PORT"/>
<hpicon:field name="TARGET_URI"/>
<hpicon:field name="TIME"/>
</hpicon:record >
<hpicon:record name="RESPONSE" type="RESPONSE" >
<hpicon:field name="SEND_IP"/>
<hpicon:field name="RECEIVE_IP"/>
<hpicon:field name="SEND_PORT"/>
<hpicon:field name="RECEIVE_PORT"/>
<hpicon:field name="TIME"/>
</hpicon:record >
</hpicon:output>
</hpicon:HttpPacketInputConnectorDefinition>
</cb:InputCBDefinition>
<!-- CB definition for data editing -->
<cb:DataEditCBDefinition class="jp.co.Hitachi.soft.sdp.adaptor.callback.dataedit.filter.FilterCBImpl" name="editor1">
<!-- Filter definition -->
<filter:FilterDefinition>
<!-- Record condition -->
<filter:record source="REQUEST" conditionName="filterName1" condition="AND">
<!-- Field condition -->
<filter:field source="TARGET_URI" condition="eq" value="http:\/\/www.*"/>
</filter:record>
</filter:FilterDefinition>
</cb:DataEditCBDefinition>
<!-- CB definition for data editing -->
<cb:DataEditCBDefinition class="jp.co.Hitachi.soft.sdp.adaptor.callback.dataedit.recordextract.RecordExtractionCBImpl" name="editor2">
<!-- Record extraction definition -->
<rex:RecordExtractionDefinition>
<!-- Definition of a group of records to be extracted -->
<rex:targetrecords>
<rex:targetrecord name="element1">
<rex:record source="REQUEST" timeposition="TIME" condition="AND">
<rex:field source="SEND_PORT" condition="ne" value="0"/>
</rex:record>
</rex:targetrecord>
<rex:targetrecord name="element2">
<rex:record source="RESPONSE" timeposition="TIME" condition="AND">
<rex:field source="RECEIVE_PORT" condition="ne" value="0"/>
</rex:record>
</rex:targetrecord>
</rex:targetrecords>
<!-- Extraction condition group definition -->
<rex:extractions size="100000" timeout="OFF" samerecord="overwrite">
<rex:extraction name="BIND_PACKET" timelimit="10000">
<rex:targets>
<rex:target sourceL="element1" sourceR="element2" condition="AND">
<rex:fieldcondition sourceL="SEND_IP" condition="eq" sourceR="RECEIVE_IP"/>
<rex:fieldcondition sourceL="RECEIVE_IP" condition="eq" sourceR="SEND_IP"/>
<rex:fieldcondition sourceL="SEND_PORT" condition="eq" sourceR="RECEIVE_PORT"/>
<rex:fieldcondition sourceL="RECEIVE_PORT" condition="eq" sourceR="SEND_PORT"/>
</rex:target>
</rex:targets>
<!-- Retrieved record definition -->
<rex:extractrecord name="BINDRECORD">
<rex:select source="element1"/>
<rex:select source="element2"/>
</rex:extractrecord>
</rex:extraction>
</rex:extractions>
</rex:RecordExtractionDefinition>
</cb:DataEditCBDefinition>
<!-- CB definition for data editing -->
<cb:DataEditCBDefinition class="jp.co.Hitachi.soft.sdp.adaptor.callback.dataedit.mapping.InputMappingCBImpl" name="editor3">
<!-- Mapping definition -->
<map:MappingDefinition ioType="INPUT">
<map:source/>
<map:target>
<map:records>
<map:record name="RESULT">
<map:field name="SEND_IP" type="STRING"/>
<map:field name="RECEIVE_IP" type="STRING"/>
<map:field name="SEND_PORT" type="INT"/>
<map:field name="RECEIVE_PORT" type="INT"/>
<map:field name="URI" type="STRING"/>
<map:field name="SUBTIME" type="LONG"/>
<map:field name="TIME" type="TIMESTAMP"/>
</map:record>
</map:records>
</map:target>
<map:intermediate>
<map:mappings source="BINDRECORD" target="RESULT">
<map:map source="element1_SEND_IP" target="SEND_IP"/>
<map:map source="element1_RECEIVE_IP" target="RECEIVE_IP"/>
<map:map source="element1_SEND_PORT" target="SEND_PORT"/>
<map:map source="element1_RECEIVE_PORT" target="RECEIVE_PORT"/>
<map:map source="element1_TARGET_URI" target="URI"/>
<map:map function="subTime" argument1="element1_TIME" argument2="element2_TIME" target="SUBTIME"/>
<map:map source="element2_TIME" target="TIME"/>
</map:mappings>
</map:intermediate>
</map:MappingDefinition>
</cb:DataEditCBDefinition>
<!-- CB definition for data editing -->
<cb:DataEditCBDefinition class="jp.co.Hitachi.soft.sdp.adaptor.callback.dataedit.mapping.InputMappingCBImpl" name="editor4">
<!-- Mapping definition -->
<map:MappingDefinition ioType="INPUT">
<map:source/>
<map:target>
<map:streams>
<map:stream name="s1" querygroup="Inprocess_QueryGroupTest">
<map:column name="sendip" type="STRING"/>
<map:column name="receiveip" type="STRING"/>
<map:column name="sendport" type="INT"/>
<map:column name="receiveport" type="INT"/>
<map:column name="uri" type="STRING"/>
<map:column name="subtime" type="LONG"/>
<map:column name="time" type="TIMESTAMP"/>
</map:stream>
</map:streams>
</map:target>
<map:intermediate>
<map:mappings source="RESULT" querygroup="Inprocess_QueryGroupTest" target="s1">
<map:map source="SEND_IP" target="sendip"/>
<map:map source="RECEIVE_IP" target="receiveip"/>
<map:map source="SEND_PORT" target="sendport"/>
<map:map source="RECEIVE_PORT" target="receiveport"/>
<map:map source="URI" target="uri"/>
<map:map source="SUBTIME" target="subtime"/>
<map:map source="TIME" target="time"/>
</map:mappings>
</map:intermediate>
</map:MappingDefinition>
</cb:DataEditCBDefinition>
<!-- CB definition for sending -->
<cb:SendCBDefinition class="jp.co.Hitachi.soft.sdp.adaptor.callback.sendreceive.SendCBImpl" name="sender">
<cb:streamInfo name="s1" querygroup="Inprocess_QueryGroupTest"/>
</cb:SendCBDefinition>
</adp:InputAdaptorDefinition>
<!--
Input adaptor definition (definable more than once)
-->
<!--
Output adaptor definition (definable more than once)
-->
<adp:OutputAdaptorDefinition name="OutputAdaptor1" charCode="MS932" lineFeed="CR_LF">
<!-- CB definition for receiving -->
<cb:ReceiveCBDefinition class="jp.co.Hitachi.soft.sdp.adaptor.callback.sendreceive.ReceiveCBImpl" name="receiver">
<cb:streamInfo name="q1" querygroup="Inprocess_QueryGroupTest"/>
</cb:ReceiveCBDefinition>
<!-- CB definition for data editing -->
<cb:DataEditCBDefinition class="jp.co.Hitachi.soft.sdp.adaptor.callback.dataedit.mapping.OutputMappingCBImpl" name="editor1">
<!-- Mapping definition -->
<map:MappingDefinition ioType="OUTPUT">
<map:source>
<map:streams>
<map:stream name="q1" querygroup="Inprocess_QueryGroupTest">
<map:column name="sendip" type="STRING"/>
<map:column name="receiveip" type="STRING"/>
<map:column name="sendport" type="INT"/>
<map:column name="receiveport" type="INT"/>
<map:column name="uri" type="STRING"/>
<map:column name="subtime" type="LONG"/>
<map:column name="time" type="TIMESTAMP"/>
</map:stream>
</map:streams>
</map:source>
<map:target/>
<map:intermediate>
<map:mappings source="q1" querygroup="Inprocess_QueryGroupTest" target="RECORD1">
<map:map source="sendip" target="SEND_IP"/>
<map:map source="receiveip" target="RECEIVE_IP"/>
<map:map source="sendport" target="SEND_PORT"/>
<map:map source="receiveport" target="RECEIVE_PORT"/>
<map:map source="uri" target="URI"/>
<map:map source="subtime" target="SUBTIME"/>
<map:map source="time" target="TIME"/>
</map:mappings>
</map:intermediate>
</map:MappingDefinition>
</cb:DataEditCBDefinition>
<!-- CB definition for data editing -->
<cb:DataEditCBDefinition class="jp.co.Hitachi.soft.sdp.adaptor.callback.dataedit.mapping.InputMappingCBImpl" name="editor2">
<!-- Mapping definition -->
<map:MappingDefinition ioType="OUTPUT">
<map:source/>
<map:target>
<map:records>
<map:record name="RECORD2" >
<map:field name="SEND_IP" type="STRING"/>
<map:field name="RECEIVE_IP" type="STRING"/>
<map:field name="SEND_PORT" type="INT"/>
<map:field name="RECEIVE_PORT" type="INT"/>
<map:field name="URI" type="STRING"/>
<map:field name="SUBTIME" type="LONG"/>
<map:field name="TIME" type="TIMESTAMP"/>
<map:field name="GET_TUPLE_TIME" type="TIMESTAMP"/>
</map:record>
</map:records>
</map:target>
<map:intermediate>
<map:mappings source="RECORD1" target="RECORD2">
<map:map source="SEND_IP" target="SEND_IP"/>
<map:map source="RECEIVE_IP" target="RECEIVE_IP"/>
<map:map source="SEND_PORT" target="SEND_PORT"/>
<map:map source="RECEIVE_PORT" target="RECEIVE_PORT"/>
<map:map source="URI" target="URI"/>
<map:map source="SUBTIME" target="SUBTIME"/>
<map:map source="TIME" target="TIME"/>
<map:map function="getTupleTime" target="GET_TUPLE_TIME"/>
</map:mappings>
</map:intermediate>
</map:MappingDefinition>
</cb:DataEditCBDefinition>
<!-- CB definition for output -->
<cb:OutputCBDefinition class="jp.co.Hitachi.soft.sdp.adaptor.callback.io.dashboard.DashboardOutputCBImpl" name="outputer">
<!-- Dashboard output connector definition -->
<docon:DashboardOutputConnectorDefinition Record="RECORD2">
<docon:RecordHoldTime
DateReference="LAST_UPDATE"
RecordTime="300"
DateFieldPosition="8" />
</docon:DashboardOutputConnectorDefinition>
</cb:OutputCBDefinition>
</adp:OutputAdaptorDefinition>
<!--
Output adaptor definition (definable more than once)
-->
</adp:InprocessGroupDefinition>
<!--
In-process group definition
-->
</root:AdaptorCompositionDefinition>
This example uses in-process connection to connect standard adaptors and the SDP server. Input adaptor InputAdaptor1 joins corresponding request information and response information in HTTP packet information and obtains the communication time from the difference between their time values. Output adaptor OutputAdaptor1 acquires HTTP communication information and uses the dashboard output connector to output the information for the past 5 minutes.
Input adaptor InputAdaptor1 performs the processing shown in the table below. The definitions used in the adaptor configuration definition file are shown in parentheses.
Type of callback | Callback processing |
---|---|
Callback for input (CB definition for input) | HTTP packet input (HTTP packet input connector definition) |
Callback for editing (CB definition for editing) | Record filtering (filter definition) |
Record extraction (record extraction definition) | |
Mapping between records (mapping definition) | |
Mapping between record and stream (mapping definition) | |
Callback for sending (CB definition for sending) | Tuple transmission (input stream definition) |
The following describes each definition for input adaptor InputAdaptor1.
Output adaptor OutputAdaptor1 performs the processing shown in the table below. The definitions used in the adaptor configuration definition file are shown in parentheses.
Type of callback | Callback processing |
---|---|
Callback for receiving (CB definition for receiving) | Tuple reception (output stream definition) |
Callback for editing (CB definition for editing) | Mapping between record and stream (mapping definition) |
Mapping between records (mapping definition) | |
Callback for output (CB definition for output) | Output to dashboard (dashboard output connector definition) |
The following describes each definition for output adaptor OutputAdaptor1.
REGISTER STREAM s1(sendip VARCHAR(15),receiveip VARCHAR(15),sendport INTEGER,receiveport INTEGER,uri VARCHAR(255),subtime BIGINT,times TIMESTAMP(9)); |