- 追加された行はこの色です。
- 削除された行はこの色です。
RIGHT:[[目次>Hestia Hacks]]|[[前>XMLファイルを入力してServiceContentに変換し、送信]]|[[次>CSVファイルを入力してServiceContentに変換し、送信]]
#freeze
RIGHT:[[目次>Hestia Hacks#SDKDevDuide]]|[[前>XMLファイルを入力してServiceContentに変換し、送信]]|[[次>CSVファイルを入力してServiceContentに変換し、送信]]
目次
#contents
*概要 [#s507fd32]
受信したServiceContentをXSLT変換する方法について解説します。
サンプルプログラム全体を以下に示します。
【PIPReceiverStoredMap.java】
1 : import java.io.File;
2 : import java.io.FileInputStream;
3 : import java.io.FileWriter;
4 : import java.io.Reader;
5 : import java.io.Writer;
6 : import java.util.Iterator;
7 : import java.util.Properties;
8 :
9 : import com.ados.hestia.mapping.Translator;
10 : import com.ados.hestia.mapping.TranslatorFactory;
11 : import com.ados.hestia.parser.rnbm.exchange.Container;
12 : import com.ados.hestia.parser.rnbm.exchange.PayloadContainer;
13 : import com.ados.hestia.parser.rnbm.exchange.StatusContainer;
14 : import com.ados.hestia.parser.rnbm.particle.ServiceContent;
15 : import com.ados.hestia.repository.MapRuleStore;
16 : import com.ados.hestia.repository.Mapping;
17 : import com.ados.hestia.sdk.Configuration;
18 : import com.ados.hestia.sdk.Connection;
19 : import com.ados.hestia.sdk.message.DirectMessageExchanger;
20 : import com.ados.hestia.sdk.session.RespondSession;
21 : import com.ados.hestia.sdk.session.Session;
22 :
23 : public class PIPReceiverStoredMap {
24 :
25 : public static void main(String[] args) {
26 : try {
27 : Properties prop = new Properties();
28 : prop.load(new FileInputStream("sample.properties"));
29 : String HOST = prop.getProperty("HOST");
30 : String USER = prop.getProperty("USER");
31 : String PASS = prop.getProperty("PASS");
32 : String HANDLER_ID = prop.getProperty("HANDLER_ID");
33 : String DIR = System.getProperty("user.dir") + File.separator
34 : + "output" + File.separator + "xsl";
35 :
36 : Connection connection = new Connection(HOST, USER, PASS,
37 : Connection.EXCHANGE_MODE_DIRECT, null, null, null,
38 : HANDLER_ID);
39 : DirectMessageExchanger exchanger = new DirectMessageExchanger(
40 : connection, Configuration.getInstance());
41 :
42 : MapRuleStore store = new MapRuleStore(System
43 : .getProperty("user.dir")
44 : + File.separator, "mapRule");
45 : SampleUtils.println("Mapping :" + store.size());
46 :
47 : new File(DIR).mkdirs();
48 : int time = 0;
49 : boolean loop = true;
50 : while (loop) {
51 : Thread.sleep(5000);
52 : SampleUtils.println("loop : " + time++);
53 : exchanger.hit();
54 :
55 : Container container = exchanger.receiveMessage();
56 : if (container != null) {
57 : SampleUtils.printContainerInformation(container);
58 : PayloadContainer request = (PayloadContainer) container;
59 : ServiceContent sc = request.getServiceContent();
60 : SampleUtils.printServiceContent(sc);
61 : Session session = new RespondSession(request
62 : .getRemotePartner(), request.getPIPID());
63 : SampleUtils.printSessionState("created", session);
64 : session.pushMessage(request);
65 : SampleUtils.printSessionState("pushed", session);
66 : session.acceptPartnerMessage();
67 : SampleUtils.printSessionState("accepted", session);
68 : StatusContainer status = session.getStatusToSend();
69 : SampleUtils.printSessionState("sent status", session);
70 : SampleUtils.printContainerInformation(status);
71 : exchanger.sendMessage(status);
72 : exchanger.hit();
73 :
74 : Mapping mapping = null;
75 : Iterator iter = store.getRuleIDs().iterator();
76 : while (iter.hasNext()) {
77 : String mapid = (String) iter.next();
78 : mapping = store.getMapping(mapid);
79 : if (mapping.getPipId().equals(sc.getPIPID())
80 : && mapping.getPipVersion().equals(
81 : sc.getFullVersion())
82 : && mapping.getDirection().equals(
83 : Mapping.RNBM2RNBM)) {
84 : store.fillMappingBaseDir(mapping);
85 : SampleUtils.println(mapid);
86 : break;
87 : }
88 : }
89 : TranslatorFactory factory = new TranslatorFactory();
90 : Translator translator = factory.newTranslator(mapping);
91 : translator.setTargetDocument(sc);
92 : translator.translate();
93 : Reader reader = translator.getResultReader();
94 :
95 : String filename = DIR
96 : + File.separator
97 : + sc.getPIPID()
98 : + "_"
99 : + sc.getVersion()
100 : + "_"
101 : + sc.getFromRole()
102 : .getGlobalBusinessIdentifierNorm()
103 : + "_"
104 : + sc.getDocumentGenerationDateTime()
105 : .getRNDateTime() + "_"
106 : + sc.getDocumentIdentifier() + ".xml";
107 : Writer writer = new FileWriter(filename);
108 : int c;
109 : while ((c = reader.read()) != -1) {
110 : writer.write(c);
111 : }
112 : reader.close();
113 : writer.close();
114 :
115 : loop = false;
116 : }
117 : }
118 :
119 : } catch (Exception e) {
120 : e.printStackTrace();
121 : }
122 : }
123 :
124 : }
*Mappingの選択 [#qc838d9f]
MapRuleStoreに登録されているMappingを選択します。Mappingが複数ある場合、受信したServiceContentに対して、どのMappingを使用するか選択する必要があります。
74 : Mapping mapping = null;
75 : Iterator iter = store.getRuleIDs().iterator();
76 : while (iter.hasNext()) {
77 : String mapid = (String) iter.next();
78 : mapping = store.getMapping(mapid);
79 : if (mapping.getPipId().equals(sc.getPIPID())
80 : && mapping.getPipVersion().equals(
81 : sc.getFullVersion())
82 : && mapping.getDirection().equals(
83 : Mapping.RNBM2RNBM)) {
84 : store.fillMappingBaseDir(mapping);
85 : ・・・
86 : break;
87 : }
88 : }
選択基準は任意ですが、このサンプルでは以下の表のような値を基準にMappingを選択しています。
|Mappingのメソッド|取得する値|MapRuleStoreファイルの対応要素|h
|getPipId|PIP名|pipid|
|getPipVersion|PIPバージョン|pipVersion|
|getDirection|変換の方向|direction|
*XSLT変換の実行 [#k2831825]
TranslatorをTranslatorFactoryから生成します。TranslatorにはMappingが設定されます。
89 : TranslatorFactory factory = new TranslatorFactory();
90 : Translator translator = factory.newTranslator(mapping);
変換されるServiceContentを入力します。
91 : translator.setTargetDocument(sc);
XSLT変換を実行します。
92 : translator.translate();
*結果のXMLの出力 [#ybb7f56d]
変換結果をReader形式で取得します。
93 : Reader reader = translator.getResultReader();
Readerから変換結果を読み込みます。このサンプルでは、Readerにより文字を読み込み、Writerにより逐一出力しています。
107 : Writer writer = new FileWriter(filename);
108 : int c;
109 : while ((c = reader.read()) != -1) {
110 : writer.write(c);
111 : }
112 : reader.close();
113 : writer.close();