以下にWebサービス機能を呼び出すWebサービスクライアントの実装例を示します。
入力値および復帰値のXML処理は、DOM(Document Object Model)のAPIを使用して実装しています。
以下のような入力値で「プロジェクト1/シナリオ1」のシナリオを実行し、すべての返却値を標準出力に出力しています。
入力値の型 :String
入力値のキー:key1
入力値の値 :input value
package client; import com.fujitsu.interstage.has.webservice.*; import java.rmi.RemoteException; import javax.xml.rpc.ServiceException; import javax.xml.rpc.ServiceFactory; import org.w3c.dom.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; import java.io.*; import java.util.*; public class IHASWSClient { /** * XML文書を生成する * @return 生成されたXML文書 * @throws ParserConfigurationException */ Document createParameterXML() throws ParserConfigurationException { //Documentの生成 DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docbuilder = dbfactory.newDocumentBuilder(); Document doc = docbuilder.newDocument(); //ルート要素 Element root = doc.createElementNS("urn:xmlns-fujitsu-com:ihas2008-06", "parameters"); doc.appendChild(root); //codeのノード Element codeNode = doc.createElement("code"); Text code = doc.createTextNode("0"); codeNode.appendChild(code); root.appendChild(codeNode); //exceptionのノード Element exceptionNode = doc.createElement("exception"); root.appendChild(exceptionNode); //keyのノード Element keyNode = doc.createElement("key"); root.appendChild(keyNode); return doc; } /** * String型の入力値を設定する * @param doc XML文書 * @param key 入力値のキー * @param value 入力値 */ void setParameterString(Document doc, String key, String value) { //パラメタのノード Element paramNode = doc.createElement("param"); paramNode.setAttribute("valueType", "string"); //キー Element keyNode = doc.createElement("key"); Text keyText = doc.createTextNode("key1"); keyNode.appendChild(keyText); //値 Element valueNode = doc.createElement("value"); Element stringNode = doc.createElement("string"); Text valueText = doc.createTextNode("input value"); stringNode.appendChild(valueText); valueNode.appendChild(stringNode); //XML文書に追加 paramNode.appendChild(keyNode); paramNode.appendChild(valueNode); doc.getDocumentElement().appendChild(paramNode); } /** * リターンコードを取得する * @param doc XML文書 * @return リターンコード */ int getCode(Document doc) { NodeList list = doc.getElementsByTagName("code"); Element codeNode = (Element)list.item(0); Text code = (Text)codeNode.getFirstChild(); return Integer.parseInt(code.getNodeValue()); } /** * エクセプションを取得する * @param doc XML文書 * @return エクセプション */ String getException(Document doc) { NodeList list = doc.getElementsByTagName("exception"); Element exceptionNode = (Element)list.item(0); return ((Text)exceptionNode.getFirstChild()).getNodeValue(); } /** * エクセプションが発生したキーを取得する * @param doc XML文書 * @return */ String getKey(Document doc) { NodeList list = doc.getElementsByTagName("key"); Element keyNode = (Element)list.item(0); return ((Text)keyNode.getFirstChild()).getNodeValue(); } /** * String型の値を取得する * @param doc XML文書 * @param key 取得する値のキー * @return 取得したString型の値。見つからない場合はnull。 */ String getString(Document doc, String key) { NodeList list = doc.getElementsByTagName("param"); for(int i=0; i<list.getLength(); i++) { Element param = (Element)list.item(i); if (param.getAttribute("valueType").equals("string")) { //戻り値のkeyを取得 NodeList keyList = param.getElementsByTagName("key"); Element keyNode = (Element)keyList.item(0); if ( ((Text)keyNode.getFirstChild()).getNodeValue().equals(key) ) { //キーが見つかったら値を取得して返却 NodeList valueList = param.getElementsByTagName("value"); Element valueNode = (Element)valueList.item(0); NodeList temp = valueNode.getElementsByTagName("string"); Element stringNode = (Element)temp.item(0); return ((Text)stringNode.getFirstChild()).getNodeValue(); } } } return null; } /** * StringList型の値を取得する * @param doc XML文書 * @param key 取得する値のキー * @return 取得したStringのListの値。見つからない場合はnull。 */ List<String> getList(Document doc, String key) { NodeList list = doc.getElementsByTagName("param"); for(int i=0; i<list.getLength(); i++) { Element param = (Element)list.item(i); if (param.getAttribute("valueType").equals("stringList")) { //戻り値のkeyを取得 NodeList keyList = param.getElementsByTagName("key"); Element keyNode = (Element)keyList.item(0); if ( ((Text)keyNode.getFirstChild()).getNodeValue().equals(key) ) { //キーが見つかったら値を取得して返却 NodeList valueList = param.getElementsByTagName("value"); Element valueNode = (Element)valueList.item(0); NodeList temp = valueNode.getElementsByTagName("stringList"); if (temp.getLength() == 0) { //値がstringList型でなければnull。 return null; } Element stringListNode = (Element)temp.item(0); NodeList colList = stringListNode.getElementsByTagName("col"); ArrayList<String> result = new ArrayList<String>(colList.getLength()); for (int j=0;j<colList.getLength();j++) { Element colNode = (Element)colList.item(j); result.add(j, ((Text)colNode.getFirstChild()).getNodeValue()); } return result; } } } return null; } /** * StringTable型の値を取得する * @param doc XML文書 * @param key 取得する値のキー * @return 取得したStringのListのListの値。見つからない場合はnull。 */ List<List<String>> getTable(Document doc, String key) { NodeList list = doc.getElementsByTagName("param"); for(int i=0; i<list.getLength(); i++) { Element param = (Element)list.item(i); if (param.getAttribute("valueType").equals("stringTable")) { //戻り値のkeyを取得 NodeList keyList = param.getElementsByTagName("key"); Element keyNode = (Element)keyList.item(0); if ( ((Text)keyNode.getFirstChild()).getNodeValue().equals(key) ) { //キーが見つかったら値を取得して返却 NodeList valueList = param.getElementsByTagName("value"); Element valueNode = (Element)valueList.item(0); NodeList temp = valueNode.getElementsByTagName("stringTable"); if (temp.getLength() == 0) { //値がstringTable型でなければnull。 return null; } Element stringTableNode = (Element)temp.item(0); NodeList rowList = stringTableNode.getElementsByTagName("row"); ArrayList<List<String>> result = new ArrayList<List<String>>(rowList.getLength()); for (int j=0;j<rowList.getLength();j++) { NodeList colList = ((Element)rowList.item(j)).getElementsByTagName("col"); ArrayList<String> stringList = new ArrayList<String>(colList.getLength()); for (int k=0;k<colList.getLength();k++) { Element colNode = (Element)colList.item(k); stringList.add(k,((Text)colNode.getFirstChild()).getNodeValue()); } result.add(j, stringList); } return result; } } } return null; } /** * @param args */ public static void main(String[] args) { IHASWSClient client = new IHASWSClient(); try { Document doc = client.createParameterXML(); client.setParameterString(doc, "key1", "input value"); //XML文書のStringに変換する StringWriter sw = new StringWriter(); TransformerFactory tfactory = TransformerFactory.newInstance(); Transformer transformer = tfactory.newTransformer(); transformer.transform(new DOMSource(doc), new StreamResult(sw)); //Webサービスの呼び出し ServiceFactory serviceFactory = ServiceFactory.newInstance(); IHASWSService service = (IHASWSService)serviceFactory.loadService(IHASWSService.class); IHASWS server = service.getIHASWSPort(); String ret = server.exec("プロジェクト1/シナリオ1", null, sw.toString()); //戻り値のStringをDOMに変換する DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docbuilder = dbfactory.newDocumentBuilder(); Document ret_doc = docbuilder.newDocument(); StringReader sr = new StringReader(ret); transformer.transform(new StreamSource(sr), new DOMResult(ret_doc)); //戻り値を表示する if (client.getCode(ret_doc) == 0) { //codeが0なら正常終了 //string型の戻り値 String value1 = client.getString(ret_doc, "retkey1"); if (value1 != null) { System.out.println("---retkey1---"); System.out.println(value1); System.out.println("-------------"); } //stringList型の戻り値 List<String> value2 = client.getList(ret_doc, "retkey2"); if (value2 != null) { System.out.println("---retkey2---"); for (int i=0; i<value2.size(); i++) { System.out.println(value2.get(i)); } System.out.println("-------------"); } //stringTable型の戻り値 List<List<String>> value3 = client.getTable(ret_doc, "retkey3"); if (value3 != null) { System.out.println("---retkey3---"); for(int i=0; i<value3.size(); i++) { List<String> row = value3.get(i); for(int j=0; j<row.size(); j++) { System.out.print(row.get(j)+","); } System.out.println(); } System.out.println("-------------"); } } else { //エラーの場合 System.out.println("exception="+client.getException(ret_doc)); System.out.println("key="+client.getKey(ret_doc)); } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } catch (ServiceException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } }