[ADOS] ADOS Developer's Site - XML Stadium
ADOS Company slogan - XML Total Solution

 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~
 16-17: スクリプトセッションのステータス文字列、状態設定
 
 

トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Copyright 2005-2008. ADOS Co., Ltd. All Rights Reserved.