- 追加された行はこの色です。
- 削除された行はこの色です。
#freeze
RIGHT:[[目次>Hestia Hacks#SDKDevDuide]]|[[前>HestiaCommander上への実装]]|[[次>チューニング]]
#contents
*HelloWorld [#HelloWorld]
**概要 [#e0cf7a2f]
基本中の基本、HelloWorld!をHestiaCommanderのコンソールへ表示します。
**設定 [#h9a58754]
|Name|Description|Public|h
|HelloWorld.py|Hello World|Yes|
**ソースコード(HelloWorld.py) [#ge2743e2]
1:import sys,java
2:from com.ados.hestia.scripts import ScriptSession
3:
4:print "Hello World!"
5:
6:svm.setStatus("HelloWorld finished")
7:svm.setState(ScriptSession.STATE_FINISH)
**解説 [#j53fe771]
1-2: 必要なライブラリのインポート~
4 : コンソールへの "Hello World!"表示~
6 : スクリプトセッションのステータス文字列設定~
7 : スクリプトセッションの状態設定~
*引数テスト [#ArgTest]
**概要 [#bff2cb88]
スクリプトの引数についてのサンプルです。
**設定 [#sdb70564]
|Name|Description|Public|h
|ArgumentTest.py|引数テスト|Yes|
**パラメータ [#qaec77ad]
|Name|Description|Optional|Type|List Of Values|h
|textfield|テキスト値|No|Text||
|choosetextfield|選択可能テキスト値|No|List|a;b;c;d;e;|
|integerfield|選択可能数値|No|Integer|1;2;3;|
|binaryfield|ファイル|Yes|Binary||
**ソースコード(ArgumentTest.py) [#lf1a838f]
01:from com.ados.hestia.scripts import ScriptSession
02:
03:print "textfield: ",textfield
04:print "choosetextfield: ",choosetextfield
05:print "integerfield: ",integerfield
06:
07:# binary field will be mapped to IStore object
08:try:
09: id = binaryfield.getID()
10: size = binaryfield.getSize()
11: print "binaryfield.getID(): ",id
12: print "binaryfield.getSize(): ",size
13:except NameError:
14: print "binaryfield was not defined."
15:
16:svm.setStatus("Finished")
17:svm.setState(ScriptSession.STATE_FINISH)
**解説 [#cb6b68c8]
03-05: 引数を画面表示~
08-13: ファイルアップロードコンポーネントの情報を画面表示。未指定の場合は冷害が発生するため13行以降にて例外Catch~
16-17: スクリプトセッションのステータス文字列、状態設定
*受信したメッセージをXML保存 [#j2718ad7]
**概要 [#l7bb67da]
受信したメッセージを指定したディレクトリへ保存します。
**設定 [#a860b75e]
|Name|Description|Public|h
|DownloadXMLMain.py|指定されたディレクトリへのXML保存|Yes|
|FileUtil.py|保存XMLのファイル名決定等ユーティリティ|No|
|XMLUtil.py|Hestia SDKを利用したServiceContentのread,write|No|
**パラメータ [#uf4656d9]
|Name|Description|Optional|Type|List Of Values|h
|rootdir|XML Download directory|No|Text|/store|
**ソースコード(FileUtil.py) [#se835cd1]
01:from java.util import Calendar
02:from java.util import GregorianCalendar
03:from java.io import File
04:from org.apache.commons.io import FileUtils
05:sepstring = File.separator
06:
07:"""
08:sample definition of storing data directory name
09:you can customize here as you like
10:root: root directory to store
11:pc: PayloadContainer
12:"""
13:def storeDirectory(root,pc):
14: sc = pc.getServiceContent()
15: current = GregorianCalendar()
16: pipid = sc.getPIPID()
17: pipver = sc.getFullVersion()
18: docid = sc.getDocumentIdentifier()
19: partnerduns = pc.getPartner()
20: eisduns = pc.getEIS()
21: year = current.get(Calendar.YEAR)
22: month = current.get(Calendar.MONTH)+1
23: day = current.get(Calendar.DAY_OF_MONTH)
24: hour = current.get(Calendar.HOUR_OF_DAY)
25: minute = current.get(Calendar.MINUTE)
26: second = current.get(Calendar.SECOND)
27: msecond = current.get(Calendar.MILLISECOND)
28: return "%s%s%04d.%02d.%02d%s%s.%s" % (root,sepstring,year,month,day,sepstring,eisduns,partnerduns)
29:
30:def mkdir(directory):
31: fdir = File(directory)
32: FileUtils.forceMkdir(fdir)
**解説(FileUtil.py) [#m3321dac]
01-04: 利用コンポーネントインポート~
05: ディレクトリ区切子~
07-12: コメント~
13-28: storeDirectory関数定義。ディレクトリ名とPayloadContainerよりファイル名を生成し返却する。~
**ソースコード(XMLUtil.py) [#f7e32930]
01:import java
02:import FileUtil
03:from java.io import File
04:from java.io import FileWriter
05:from java.io import BufferedOutputStream
06:from java.io import FileOutputStream
07:from com.ados.hestia.sdk.rnbm.access import XMLBuilder
08:from com.ados.hestia.sdk.rnbm.access import XMLReader
09:from org.apache.commons.io import CopyUtils
10:"""
11:Write ServiceContent to Writer object
12:sc: ServiceContent Object
13:writer: java.io.Writer object
14:"""
15:def write(sc,writer):
16: reader = XMLReader(writer,sc)
17: reader.read()
18: writer.flush()
19: writer.close()
20:
21:"""
22:Create ServiceContent from Stream Object
23:stream: java.io.InputStream
24:pipid: PIP ID (e.g. 0C1)
25:pipver: PIP Version (e.g. R01.02.00)
26:return ServiceContent
27:"""
28:def read(stream,pipid,pipver):
29: reader = java.io.BufferedReader(java.io.InputStreamReader(stream))
30: builder = XMLBuilder()
31: return builder.build(reader,pipid,pipver)
32:
33:"""
34:Store PayloadContainer to specified directory with $DOCID.xml
35:if Container has Attachments, $DOCID directory will be made and
36:XML and attachments will be stored.
37:pc: PayloadContainer
38:directory: store root directory
39:"""
40:def store(pc,directory):
41: sc = pc.getServiceContent()
42: attachcount = pc.getAttachmentCount()
43: docid = sc.getDocumentIdentifier()
44: FileUtil.mkdir(directory)
45: if ( attachcount != 0 ):
46: ats = pc.getAttachments()
47: directory = directory + FileUtil.sepstring + docid
48: FileUtil.mkdir(directory)
49: filename = directory + FileUtil.sepstring + docid + ".xml"
50: wr = FileWriter(File(filename))
51: write(sc,wr)
52: for i in range(0,attachcount):
53: attach = ats.__getitem__(i)
54: attachname = directory + FileUtil.sepstring + attach.getName()
55: istream = attach.openSharedStream()
56: ostream = BufferedOutputStream(FileOutputStream(attachname))
57: copiedsize = CopyUtils.copy(istream,ostream)
58: istream.close()
59: ostream.flush()
60: ostream.close()
61: else:
62: filename = directory + FileUtil.sepstring + docid + ".xml"
63: wr = FileWriter(File(filename))
64: write(sc,wr)
**解説(XMLUtil.py) [#c1dec2b2]
15-19: write()関数定義。ServiceContent, Writerオブジェクトを引数としServiceContentをWriterオブジェクトへ書き出す。~
28-31: read()関数定義。InputStreamオブジェクト、PIPID、PIPVersionを引数としServiceContentオブジェクトを生成する。~
40: store()関数定義。PayloadContainerオブジェクト、保存ディレクトリを引数とし、XMLおよび添付ファイルを保存する。
**ソースコード(DownloadXMLMain.py) [#o130b3ac]
01:# -*- coding: utf-8-dos -*-
02:# Time-stamp: <2005-10-04 20:25:09 someone>
03:"""
04:Change any Sessions to accept and save xml
05:values from HestiaCommander:
06:svm: com.ados.hestia.scripts.ScriptSession
07:sapi:com.ados.hestia.scripts.ScriptAPI
08:values from Script Description:
09:rootdir: root directory to store
10:"""
11:import XMLUtil
12:import FileUtil
13:import java
14:from jarray import array
15:from com.ados.hestia.utils.db import WhereDescriptor
16:from com.ados.hestia.sdk.session import Session
17:from com.ados.hestia.sdk.session import SessionKey
18:
19:# Initialize Session with "init", "starttime", "totalpips" value
20:if (svm.getObj("init") == None):
21: init = 1
22: svm.regObj("init", init)
23: totalpips = 0
24: svm.regObj("totalpips", totalpips)
25: print "Received messages will be stored into "+rootdir
26:
27:# get ScriptProcessor from ScriptAPI
28:processor = sapi.getSessionProcessor()
29:
30:wd = WhereDescriptor()
31:wd.addCondition(Session.STATE_WAIT_ACCEPTANCE, SessionKey.SESSION_COLUMN_STATUS, \
32: WhereDescriptor.AND, WhereDescriptor.EQUAL)
33:wd.addCondition(Session.SESSION_TYPE_RESPOND, SessionKey.SESSION_COLUMN_TYPE, \
34: WhereDescriptor.AND, WhereDescriptor.EQUAL)
35:
36:# Do Query with
37:# SESSION_COLUMN_STATUS == STATE_WAIT_ACCEPTANCE and
38:# SESSION_COLUMN_TYPE = SESSION_TYPE_RESPOND
39:keies = processor.getSessionEntries(SessionKey.SESSION_COLUMN_START_DATE, wd)
40:
41:lenpips = keies.__len__()
42:
43:# set accept status to all sessions
44:for i in range(0, lenpips):
45: key = keies.__getitem__(i)
46: session = sapi.getSessionProcessor().getSessionEntry(key)
47: payload = session.getPartnerMessage()
48: storedirectory = FileUtil.storeDirectory(rootdir,payload)
49: XMLUtil.store(payload,storedirectory)
50: session.acceptPartnerMessage()
51: sapi.getSessionProcessor().updateSession(key, session)
52: totalpips = totalpips+1
53:
54:svm.setStatus(" PIPs:"+totalpips.toString())
**解説(DownloadXMLMain.py) [#l2b3fe7a]
HelloWorld, 引数テストと異なり、当スクリプトはsvm.setState()によるスクリプトの明示的な終了をしていない。この場合、スクリプトは定期的に起動される。((起動間隔はサーバオプションより設定する))
20-25: スクリプト初期化。処理済みPIP数をScriptSessionへレジスト((次回以降のスクリプト起動でも参照可能))~
28: セッションプロセッサオブジェクトの取得(セッションの取得に利用)~
30-34: セッションオブジェクト取得条件の構築。ここでは35行目に示される条件を構築している。~
39: セッションプロセッサから条件にマッチするセッションを取得~
44: 取得したセッションオブジェクト分のループ処理~
47-48: セッションオブジェクトおよびPayloadの取り出し~
49: XMLの保存~
50-51: セッションのAcceptおよび更新~
*XMLをアップロードし送信 [#XMLUpload]
**概要 [#ybdc7c3c]
ブラウザからXMLをアップロードし送信します。
**設定 [#df613e1f]
|Name|Description|Public|h
|UploadXMLMain.py|XMLアップロードメイン|Yes|
|UploadXML.py|XMLアップロードサブ|No|
**パラメータ [#qaec77ad]
|Name|Description|Optional|Type|List Of Values|h
|xmlinstance|アップロードするXML|No|Binary||
|partner|取引先DUNS|No|Text||
|eis|自社DUNS|No|Text||
|pipid|PIP ID|No|Text|0C1;3A4;|
|pipver|PIP Version|No|Text|R01.02.00;V02.00.00|
**ソースコード(UploadXML.py) [#z972f691]
01:# -*- coding: utf-8-dos -*-
02:# Time-stamp: <2005-10-04 20:25:09 nmoto>
03:from com.ados.hestia.sdk.rnbm.access import XMLBuilder
04:import java
05:
06:# class definition
07:class UploadXML:
08: def __init__(self,scriptsession,scriptapi):
09: self.scriptsession = scriptsession
10: self.scriptapi = scriptapi
11: self.processor = scriptapi.getSessionProcessor()
12:
13: def handleMessage(self,eisduns,partnerduns,servicecontent):
14: # set standard fields to ServiceContent
15: self.scriptapi.setStandardFields(servicecontent, eisduns, partnerduns)
16:
17: # create PayloadContainer
18: payloadcontainer = self.scriptapi.packToContainer(eisduns, partnerduns, servicecontent)
19:
20: # create and register session
21: session = self.scriptapi.createSession(payloadcontainer)
22: self.sessionkey = self.processor.registerSessionEntry(session)
**ソースコード(UploadXMLMain.py) [#a31114f8]
01:# -*- coding: utf-8-dos -*-
02:# Time-stamp: <2005-10-04 20:25:09 nmoto>
03:"""
04:Upload XML and send messages over Session.
05:values from HestiaCommander:
06:svm: com.ados.hestia.scripts.ScriptSession
07:sapi:com.ados.hestia.scripts.ScriptAPI
08:values from Script Description
09:xmlinstance: uploaded file handle(IOStore)
10:partner: partner DUNS(String)
11:eis: eis DUNS(String)
12:pipid: pip id(String)
13:pipver: pip full version(String)
14:"""
15:import XMLUtil
16:from UploadXML import UploadXML
17:from com.ados.hestia.sdk.session import Session
18:from com.ados.hestia.scripts import ScriptSession
19:
20:print "Processing store:"+xmlinstance.getID()+" with [EIS:"+eis+"] [Partner:"+partner+"]"
21:upxml = UploadXML(svm,sapi)
22:
23:filestream = xmlinstance.openSharedStream()
24:servicecontent = XMLUtil.read(filestream,pipid,pipver)
25:
26:if (servicecontent != None):
27: print "ServiceContent created from uploaded file"
28: upxml.handleMessage(eis, partner, servicecontent)
29: print "Successfully create new session"
30: svm.setStatus("Finished")
31: svm.setState(ScriptSession.STATE_FINISH)
32:else:
33: svm.setStatus("Cannot build ServiceContent")
34 svm.setState(ScriptSession.STATE_ERROR)
**解説 [#w876e653]
03-05: 引数を画面表示~
08-13: ファイルアップロードコンポーネントの情報を画面表示。未指定の場合は冷害が発生するため13行以降にて例外Catch~
08-13: ファイルアップロードコンポーネントの情報を画面表示。未指定の場合は例外が発生するため13行以降にて例外Catch~
16-17: スクリプトセッションのステータス文字列、状態設定