付録H.6 SOAP用JavaUAPの作成例
SOAPサーバアプリケーション用のJavaUAPの作成例です。ここで記載されているjavaUAPの内容はTP1/COBOL SOAPサービスクラス生成機能で生成された「スケルトン名+SBean.java」中のメソッドを使用して作成しています。SOAPサーバ側で引数データの内容を操作する必要がない場合,「スケルトン名+SBean.java」を使用する必要ありません。
また,この例題はTP1/COBOLアクセスに付随のCosminexus TP1 Connectorのサンプルプログラムを元に作成されています。そのため,登録集原文の内容はここでは記載しておりませんので,サンプルをご覧ください。
なお,例題で使用されている「CBLTP1」はウィザードで指定したスケルトン名称,「TP1_method」はウィザードで指定したメソッド名称,「CBLTP1UAP」は呼び出されるJavaUAP名称,「CBLTP1UAPmethod」は呼び出されるJavaUAPのメソッド名称となっています。
(1) SOAPサーバ用のJavaUAPの作成例
橙色の部分は,TP1/COBOL SOAPサーバ用 Beanを使用して,入出力引数の参照・設定を行う際の作成例です。
SOAPサーバ上で入出力引数の参照・設定を行わない場合は不要です。
package localhost; import jp.co.hitachi_sk.j2cb.*; import JP.co.Hitachi.soft.OpenTP1.*; import java.math.BigDecimal; import javax.resource.cci.*; import jp.co.hitachi_system.tp1connector.*; public class CBLTP1UAP { public byte[] CBLTP1UAPmethod(byte[] inData) { byte[] outData = null; CBLTP1SBean bean = null; String group = "SAMPLE"; String service = "SEARCHTP1"; Integer p_number = null; String p_name = null; String p_address = null; String p_gif = null; try { bean = new CBLTP1SBean(); } catch ( Exception e ) { e.printStackTrace(); throw e; } try { bean.setBytesData(CBLTP1SBean.inIndex, inData); p_number = (Integer)bean.getP_numberI(); p_name = (String)bean.getP_addressI(); p_address = (String)bean.getP_addressI(); p_gif = (String)bean.getP_gifI(); outData = new byte[CBLTP1.outMaxSize]; } catch ( Exception e ) { e.printStackTrace(); throw e; } try { //ManagedConnectionFactoryインスタンス生成 ManagedConnectionFactoryImpl mcf = new ManagedConnectionFactoryImpl(); //ManagedConnectionFactoryプロパティ設定 // 引数に指定されたTP1/Client/J定義ファイル // 実行環境に合わせて必ず変更してください。 mcf.setConfFileName("C:\\OpenTP1ClientJ\\cltjenv.ini"); //ConnectionFactoryインスタンスの生成 javax.resource.cci.ConnectionFactory cxf = (javax.resource.cci.ConnectionFactory) mcf.createConnectionFactory(); //コネクション取得 javax.resource.cci.Connection cx = cxf.getConnection(); //Interactionインスタンスの生成 javax.resource.cci.Interaction ix = cx.createInteraction(); //InteractionSpecImplインスタンスの生成 InteractionSpecImpl ixSpec = new InteractionSpecImpl(); //InteractionSpecプロパティ設定 ixSpec.setServiceGroupName(group); //サービスグループ名称 ixSpec.setServiceName(service); //サービス名称 ixSpec.setFlags(ixSpec.DCNOFLAGS); //RPC種別 ixSpec.setWatchTime(10); //応答待ち時間 // OpenTP1呼び出し実行 RecordFactory rf = cxf.getRecordFactory(); IndexedRecord input = rf.createIndexedRecord("in_record"); IndexedRecord output = rf.createIndexedRecord("out_record"); input.add(inData); outData = new byte[CBLTP1.outMaxSize]; output.add(outData); boolean ret = ix.execute(ixSpec, input, output); cx.close(); } catch (Exception e) { e.printStackTrace(); throw e; } try { bean.setBytesData(CBLTP1SBean.outIndex, outData); p_number = (Integer)bean.getP_numberO(); p_name = (String)bean.getP_addressO(); p_address = (String)bean.getP_addressO(); p_gif = (String)bean.getP_gifO(); } catch ( Exception e ) { e.printStackTrace(); throw e; } return outData; } }
(2) SOAPクライアント用のJavaUAPの作成例
プログラム中で使用されている「CBLTP1_ServiceLocator」,「getTP1server」および「CBLTP1_Port」はWSDLからソース生成を行った際に自動生成されたソース名称およびメソッド名称です。「CBLTP1CBean」は「SOAP用クライアントBean生成ウィザード」で生成されたプログラムです。クライアント側UAPではこの「CBLTP1CBean」中のメソッドを使用します。
package localhost; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import javax.xml.rpc.holders.*; import com.cosminexus.c4web.management.Management; import com.cosminexus.c4web.management.ClientID; public class CBLTP1Servlet extends HttpServlet { static final private String CONTENT_TYPE = "text/html; charset=Shift_JIS"; // クライアント識別子 private ClientID cltID = null; public void init() throws ServletException { // SOAPクライアントの開始 cltID = Management.initializeClient(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ // クライアント識別子と実行スレッドを関連付ける Management.connectClientIDtoCurrentThread(cltID); String var0 = request.getParameter("Number"); if (var0 == null) { var0 = "100001"; } Integer pnumber = new Integer(var0); String pname = null; String paddress = null; String pgif = null; CBLTP1_ServiceLocator uis = null; CBLTP1_Port skeltonClass = null; byte[] inData = null; byte[] outDataValue = new byte[CBLTPICBeam.outMaxSi e;]; javax.xml.rpc.holders.ByteArrayHolder outData = new javax.xml.rpc.holders.ByteArrayHolder(outDataValue); CBLTP1CBean bean = null; try { // サービスのインタフェースクラスを生成 uis = new CBLTP1_ServiceLocator(); } catch ( RuntimeException e ) { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>CBLTP1CServlet Error.</title></head>"); out.println("<body>"); out.println("サービスのインタフェースクラス生成に失敗しました。"); out.println("</body></html>"); return; } try { // クライアントのインタフェースクラスを取得 skeltonClass = uis.getTP1server(); } catch ( Exception e ) { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>CBLTP1CServlet Error.</title></head>"); out.println("<body>"); out.println("クライアントのインタフェースクラス取得に失敗しました。"); out.println("</body></html>"); return; } try { // クライアントアクセス用のBean生成 bean = new CBLTP1CBean(); } catch ( Exception e ) { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>CBLTP1CServlet Error.</title></head>"); out.println("<body>"); out.println("クライアントアクセス用Bean生成に失敗しました。"); out.println("</body></html>"); return; } try { // 入力引数項目の設定 bean.setP_numberI(pnumber); } catch ( Exception e ) { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>CBLTP1CServlet Error.</title></head>"); out.println("<body>"); out.println("入力引数項目設定に失敗しました。"); out.println("</body></html>"); return; } try { // 入力引数の取得 inData = bean.getBytesData(CBLTP1CBean.inIndex); } catch ( Exception e ) { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>CBLTP1CServlet Error.</title></head>"); out.println("<body>"); out.println("入力引数取得に失敗しました。"); out.println("</body></html>"); return; } try { // サービスメソッドの呼び出し skeltonClass.TP1_Method(inData, outData); } catch ( Exception e ) { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>CBLTP1CServlet Error.</title></head>"); out.println("<body>"); out.println("サービスメソッド呼び出しに失敗しました。<br>"); out.println("e.getMessage()=" + e.getMessage() + "<br>"); out.println("e.getLocalizedMessage()=" + e.getLocalizedMessage() + "<br>"); out.println("e.toString()=" + e.toString() + "<br>"); out.println("</body></html>"); e.printStackTrace(); return; } if ( outData.value == null ) { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>CBLTP1CServlet Error.</title></head>"); out.println("<body>"); out.println("出力引数がnullです。終了します。"); out.println("</body></html>"); return; } try { // 出力引数の設定 bean.setBytesData(CBLTP1CBean.outIndex, outData.value); } catch ( Exception e ) { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>CBLTP1CServlet Error.</title></head>"); out.println("<body>"); out.println("出力引数設定に失敗しました。"); out.println("</body></html>"); return; } try { // 出力引数項目の取得 pname = (String)bean.getP_nameO(); paddress = (String)bean.getP_addressO(); pgif = (String)bean.getP_gifO(); } catch ( Exception e ) { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>CBLTP1CServlet Error.</title></head>"); out.println("<body>"); out.println("出力引数項目取得に失敗しました。"); out.println("</body></html>"); return; } response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>CBLTP1CServlet</title></head>"); out.println("<body>"); out.println("<center>Result of Search."); out.println("<table border=\"1\">"); out.println("<tr><td colspan=\"2\" align=\"center\">" + pnumber + "</td></tr>"); out.println("<tr><td>Name</td><td>" + pname + "</td></tr>"); out.println("<tr><td>Address</td><td>" + paddress + "</td></tr>"); out.println("<tr><td colspan=\"2\" align=\"center\"><img src=\"." + pgif + "\"/></td></tr>"); out.println("</table>"); out.println("</center>"); out.println("</body></html>"); } //リスースの後処理 public void destroy() { // SOAPクライアントの終了 Management.finalizeClient(cltID); } }