Hitachi

TP1/COBOL adapter for Cosminexus ユーザーズガイド


付録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);
    }
}