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