ページの先頭行へ戻る
Interstage Host Access Service V10.0.1 ユーザーズガイド
Interstage

25.3 使用例

以下にWebサービス機能を呼び出すWebサービスクライアントの実装例を示します。

入力値および復帰値のXML処理は、DOM(Document Object Model)のAPIを使用して実装しています。

以下のような入力値で「プロジェクト1/シナリオ1」のシナリオを実行し、すべての返却値を標準出力に出力しています。

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();
                }
        }

}