- 追加された行はこの色です。
- 削除された行はこの色です。
RIGHT:[[目次>Hestia Hacks]]|[[前>受信したServiceContentをXMLファイルに変換し、出力]]|[[次>受信したServiceContentをCSVファイルに変換し、出力]]
目次
#contents
*概要 [#l7f9a99f]
CSV(Comma Separated Values)は、レガシーシステムのデータ入出力によく使用されるフォーマットです。CSVを入力して、送信するPIPメッセージのServiceContentに変換する方法を解説します。
CSV(Comma Separated Values)は、レガシーシステムのデータ入出力によく使用されるフォーマットです。CSVを入力して、送信するServiceContentに変換する方法を解説します。
【PIPSenderCSV.java】
1 : import java.io.File;
2 : import java.io.FileInputStream;
3 : import java.io.FileReader;
4 : import java.util.Date;
5 : import java.util.Properties;
6 :
7 : import com.ados.hestia.mapping.Translator;
8 : import com.ados.hestia.mapping.TranslatorFactory;
9 : import com.ados.hestia.parser.rnbm.access.Validator;
10 : import com.ados.hestia.parser.rnbm.exchange.Container;
11 : import com.ados.hestia.parser.rnbm.exchange.PayloadContainer;
12 : import com.ados.hestia.parser.rnbm.exchange.StatusContainer;
13 : import com.ados.hestia.parser.rnbm.particle.ServiceContent;
14 : import com.ados.hestia.repository.MapRuleStore;
15 : import com.ados.hestia.repository.Mapping;
16 : import com.ados.hestia.sdk.Configuration;
17 : import com.ados.hestia.sdk.Connection;
18 : import com.ados.hestia.sdk.message.DirectMessageExchanger;
19 : import com.ados.hestia.sdk.session.InitiationSession;
20 : import com.ados.hestia.sdk.session.Session;
21 : import com.ados.hestia.utils.UID;
22 : import com.ados.hestia.utils.csv.Parser;
23 : import com.ados.hestia.utils.csv.ParserImpl;
24 : import com.ados.hestia.utils.csv.RecordSet;
25 :
26 : public class PIPSenderCSV {
27 :
28 : public static void main(String[] args) {
29 : try {
30 : String mapid = args[0];
31 : String csv = args[1];
32 :
33 : Properties prop = new Properties();
34 : prop.load(new FileInputStream("sample.properties"));
35 : String HOST = prop.getProperty("HOST");
36 : String USER = prop.getProperty("USER");
37 : String PASS = prop.getProperty("PASS");
38 : String HANDLER_ID = prop.getProperty("HANDLER_ID");
39 :
40 : Connection connection = new Connection(HOST, USER, PASS,
41 : Connection.EXCHANGE_MODE_DIRECT, null, null, null,
42 : HANDLER_ID);
43 : DirectMessageExchanger exchanger = new DirectMessageExchanger(
44 : connection, Configuration.getInstance());
45 :
46 : MapRuleStore store = new MapRuleStore(System.getProperty("user.dir")
47 : + File.separator, "mapRule");
48 : SampleUtils.println("Mapping :" + store.size());
49 : Mapping mapping = store.getMapping(mapid);
50 : store.fillMappingBaseDir(mapping);
51 : SampleUtils.println("Mapping :" + mapping.toString());
52 : Parser parser = new ParserImpl();
53 : RecordSet record = parser.parse(new FileReader(csv), ',', '\'', true);
54 : TranslatorFactory factory = new TranslatorFactory();
55 : Translator translator = factory.newTranslator(mapping);
56 : translator.setTargetDocument(record);
57 : translator.translate();
58 : ServiceContent sc = translator.getResultAsServiceContent();
59 :
60 : Session session = new InitiationSession(new PayloadContainer(
61 : new Date(), sc.getFromRole()
62 : .getGlobalBusinessIdentifierNorm(), sc.getToRole()
63 : .getGlobalBusinessIdentifierNorm(), (new UID())
64 : .toString(), sc, null));
65 : SampleUtils.printSessionState("created", session);
66 : PayloadContainer request = session.getMessageToSend();
67 : SampleUtils.printSessionState("got", session);
68 : SampleUtils.printContainerInformation(request);
69 : SampleUtils.printServiceContent(request.getServiceContent());
70 : new Validator(request.getServiceContent().getElement()).validate();
71 : exchanger.sendMessage(request);
72 : SampleUtils.printSessionState("sent", session);
73 :
74 : int time = 0;
75 : boolean loop = true;
76 : while (loop) {
77 : Thread.sleep(5000);
78 : exchanger.hit();
79 : SampleUtils.printSessionState("loop=" + time++, session);
80 :
81 : Container container = exchanger.receiveMessage();
82 : if (container != null) {
83 : SampleUtils.printContainerInformation(container);
84 : session.pushStatus((StatusContainer) container);
85 : SampleUtils.printSessionState("pushed", session);
86 : loop = false;
87 : }
88 : }
89 :
90 : } catch (Exception e) {
91 : e.printStackTrace();
92 : }
93 : }
94 :
95 : }
*マッピングルールの読み込み [#eb0867a4]
*Mappingの取得 [#o91b52eb]
あらかじめマッピングルール(XSLTファイル)を作成し、ストアファイルに登録しておきます。ストアファイルへのマッピングルールの登録方法は、「Hestiaユーザーズガイド」を参照してください。
XMLからServiceContentへの変換と同様、CSVからServiceContentへの変換にもXSLTファイルおよびMappingの仕組みを使用します。Mappingの取得方法は通常と同じです。
MapRuleStoreによりストアファイルを読み込み、IDを指定してマッピングルールを取得します。
46 : MapRuleStore store = new MapRuleStore(System.getProperty("user.dir")
47 : + File.separator, "mapRule");
MapRuleStore store = new MapRuleStore(System.getProperty("user.dir")+File.separator, "mapRule");
Mapping mapping = store.getMapping(args[0]);
store.fillMappingBaseDir(mapping);
49 : Mapping mapping = store.getMapping(mapid);
50 : store.fillMappingBaseDir(mapping);
なお、CSVを以下のようなXMLに置き換え、XML to ServiceContentとしてXSLT文書を定義します。
【CSVの例】
|AAA|BBB|CCC|h
|a1|b1|c1|
|a2|b2|c2|
【CSVに相当するXMLのイメージ】
<csv>
<row>
<AAA>a1</AAA>
<BBB>b1</BBB>
<CCC>c1</CCC>
</row>
<row>
<AAA>a2</AAA>
<BBB>b2</BBB>
<CCC>c2</CCC>
</row>
・・・
</csv>
*CSVの読み込み [#k9fae848]
CSVを読み込みます。カンマ以外のセパレータを指定することもできます。Readerオブジェクトにより任意のソースからCSVを入力できます。
CSVを読み込みます。カンマ以外のセパレータを指定することもできます。読み込まれたCSVはRecordSetにより扱えます。
Parser parser = new ParserImpl();
RecordSet record = parser.parse(new FileReader(args[1]),',','\'',true);
52 : Parser parser = new ParserImpl();
53 : RecordSet record = parser.parse(new FileReader(csv), ',', '\'', true);
|関連クラス|機能|h
|com.ados.hestia.utils.csv.Parser|CSVを読み込むインターフェイス。|
|com.ados.hestia.utils.csv.ParserImpl|Parserの実装クラス。|
|com.ados.hestia.utils.csv.RecordSet|Parserで読み込まれたCSVを表すクラス。|
*変換とServiceContentの取得 [#kcc3626b]
マッピングルールを使用し、CSVをServiceContentへ変換します。
CSVをServiceContentへ変換します。まず、変換を行うTranslatorをTranslatorFactoryから生成します。TranslatorにはMappingが設定されます。
TranslatorFactory factory = new TranslatorFactory();
Translator translator = factory.newTranslator(mapping);
translator.setTargetDocument(record);
translator.translate();
ServiceContent sc = translator.getResultAsServiceContent();
54 : TranslatorFactory factory = new TranslatorFactory();
55 : Translator translator = factory.newTranslator(mapping);
変換されるRecordSetを入力します。
56 : translator.setTargetDocument(record);
XSLT変換を実行します。
57 : translator.translate();
変換結果のServiceContentを取得します。
58 : ServiceContent sc = translator.getResultAsServiceContent();
ServiceContentの生成後は、通常の処理によりHestiaへ送信します。ただし、ServiceContentの生成後に、 ServiceContent#setElementValue等のメソッドにより値を上書きすることもできます。