TalkingBird報文轉換框架(SOP)
本框架的是為了解決Java語言和SOP通信報文之間轉換的實際問題而產(chǎn)生。設計的思想是高度屏蔽報文的底層實現(xiàn),提供靈活配置可能。整個框架的設計思路是,編排、反編排作業(yè)實現(xiàn)與配置信息加載進行解耦。目前配置信息加載僅實現(xiàn)讀取xml配置文件。針對編排動作抽象出編排接口,反編排動作抽象出反編排接口。對于配置文件加載抽象出元信息加載器體系結構。在實際使用中使用者對以上細節(jié)是不會接觸到的。 只要對核心接口和抽象類有基本的掌握即可完成開發(fā)。
作者郵箱,[email protected]。群:413606667
歡迎來信提供您寶貴的建議。
為何取此名?
為什么取名TalkingBird呢?主要是報文轉換就是從一種語言編碼轉換為另外一種語言編碼,這讓我想到了鸚鵡,她即會說人話,但卻不是人,有能理解鳥的語言。于是就想到了說話的鳥。再加上在Talking in Action的封面的鳥,即可知道,此鳥精細,但卻是機械的,也有說話的能力。因此取此名即賦予該框架精細之意。
1 交易接口文件和頭信息文件分開存放
交易接口文件是對接口主體的描述,其中涉及頭信息和交易數(shù)據(jù)信息。而頭信息通常不變,為了提高復用,所以將頭信息抽象出來單獨存放為頭信息文件。他們之間使用內(nèi)聯(lián)特性進行引用。
2 邊解析邊創(chuàng)建元信息
目前加載器實現(xiàn)基于邊解析邊創(chuàng)建元信息,在實際開發(fā)接口中很有用處,可以準確發(fā)現(xiàn)配置錯誤的地方。
3 內(nèi)聯(lián)特性
交易接口在系統(tǒng)信息,公共信息,交易數(shù)據(jù)均可以使用 inline屬性進行內(nèi)聯(lián)頭信息文件。
4 多種取值模式
段提供三種取值模式,分別為常量模式,默認模式,用戶模式。常量模式——通常一個字段會涉及常量值的情況,那樣設置為constant,則編排時就是固定值,就不需要在使用時對固定值的字段設置值。默認模式——對于有初始值的字段,可以設置為default,這樣如果使用時,沒有設置值,則使用配置時的默認值,如果設置了值就是用戶希望的值。用戶模式——在配置時,如果沒有設置取值模式或者設置為user,則編排時使用用戶提供的值,如果沒有提供值,則會提示異常。
5 字段間接定義
間接定義是指交易接口文件和頭信息文件中的元信息池一次定義字段信息,在使用時可以多次使用 ref 屬性進行引用。
6 別名映射
交易接口文件和頭信息文件都支持別名映射,在 class 和 wrap-class 屬性可以使用別名。別名在別名映射節(jié)點中集中定義。別且提供作用域domain 屬性,該屬性設置的不同,作用的范圍不一樣。
7 字符集繼承
當接口文件中的Object節(jié)點定義了字符集,而Object節(jié)點下的字段節(jié)點未定義字符集,則可繼承Object的字符集。
8 對Map的支持
支持反編排為Map,編排數(shù)據(jù)來源可以是Map。默認構建的是基于HashMap的實例。
一個頭文件結構
<?xml version="1.0" encoding="UTF-8"?> <interfaces xmlns="http://www.woate.com/talkingbird/header" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woate.com/talkingbird/header"> <!-- 別名映射,提供對別名和類全限定名之間的映射 --> <alias-mappings> </alias-mappings> <!-- 元信息池 --> <metadatas-pool> </metadatas-pool> <!-- 元信息池,提供對字段集中的定義 --> <request> </request> <response> </response> <exception> </exception> </interfaces>
<?xml version="1.0" encoding="UTF-8"?> <interfaces xmlns="http://www.woate.com/talkingbird" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woate.com/talkingbird"> <!-- 別名映射,提供對別名和類全限定名之間的映射 --> <alias-mappings> </alias-mappings> <!-- 元信息池,提供對字段集中的定義 --> <metadatas-pool> </metadatas-pool> <!-- 交易定義 name不一定是交易碼,可能是組合交易的別名--> <interface name="YYYY"> <!-- 請求節(jié)點 --> <request> <!-- 系統(tǒng)信息頭 --> <sys inline="headers/sys.xml"/> <!-- 公共信息頭 --> <com inline="headers/com.xml"/> <busis> <!-- 交易數(shù)據(jù) name是交易碼 --> <busi name="XXXX"> <!-- 交易數(shù)據(jù)頭 --> <header inline="headers/busi.xml"/> </busi> </busis> </request> <!-- 應答節(jié)點 --> <response> <!-- 系統(tǒng)信息頭 --> <sys inline="headers/sys.xml"/> <!-- 公共信息頭 --> <com inline="headers/com.xml"/> <busis> <!-- 交易數(shù)據(jù) name是交易碼 --> <busi name="XXXX"> <!-- 交易數(shù)據(jù)頭 --> <header inline="headers/busi.xml"/> </busi> </busis> </response> <!--異常節(jié)點--> <exception> <!-- 系統(tǒng)信息頭 --> <sys inline="headers/sys.xml"/> <!-- 公共信息頭 --> <com inline="headers/com.xml"/> <busis> <!-- 交易數(shù)據(jù) name是交易碼 --> <busi name="XXXX"> <!-- 交易數(shù)據(jù)頭 --> <header inline="headers/busi.xml"/> </busi> </busis> </exception> </interface> </interfaces>
SOPFactory factory = SOPFactory.getDefaultFactory().load();
SOPPacket packet = factory.getSOPPacketS("YYYY");
SOPSession session = SOPSession.getSession();
session.setAttribute(Dictionary.YNGYJG, "1001");
session.setAttribute(Dictionary.JIO1GY, "901328");
SOPBusiWrapper busiWrapper = session.createBusiData();
busiWrapper.setBusidata("TASKID","XXXXXXXXXXXXXXX");
busiWrapper.setBusidata("ZHJGNO", Integer.toString(i));
busiWrapper.setBusidata("YYJGNO", "351801");
busiWrapper.setBusidata("GUIYDH", "E01100");
busiWrapper.setBusidata("CLASID", "1103");
busiWrapper.setBusidata("APPLID", "E01100");
busiWrapper.setBusidata("SHOJHM", "1581111111");
busiWrapper.setBusidata("DXINLX", "0");
busiWrapper.setBusidata("DXINBM", "15");
busiWrapper.setBusidata("DXINNR", "尊敬的客戶:XXXXXXX");
busiWrapper.setBusidata("WAPURL", "");
ByteBuffer buffer = packet.format();
System.out.println(Hex.toHexString(buffer.array()));
SOPFactory factory = SOPFactory.getDefaultFactory().load();
SOPPacket packet = factory.getSOPPacketS("YYYY");
byte[] array = Hex.read(new FileInputStream("test2.hex"));
Hex.write(array);
ByteBuffer buffer = ByteBuffer.wrap(array);
buffer.rewind();
packet.parse(buffer);
SOPSession session = SOPSession.getSession();
System.out.println(session.attributes());
System.out.println(session.peekFirstBusiData().attributes());
System.out.println(session.pollFirstBusiData().busidatas());
