biz-StreamマニュアルWebサービスサーバ ガイド第11章 サンプルプログラム(Java)11.5 アプリケーションでデータソースを設定してPDF を生成しブラウザでダウンロードさせるサンプル(JAX-WS)

11.5 アプリケーションでデータソースを設定してPDF を生成しブラウザでダウンロードさせるサンプル(JAX-WS)

概要

アプリケーションでデータソースを設定してPDFを生成しブラウザでダウンロードさせるサンプルプログラムです。


スタブクラスの準備

事前に『11.1 Java で開発するための環境構築』の手順を実行します。


ソースサンプル

<biz-Stream_home>/sample/soap_client/java/jax-ws/WSS_JAXWS_Sample4.java サンプル4


    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.net.Authenticator;
    import java.net.PasswordAuthentication;
    import java.net.URL;
    import java.util.Map;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.xml.ws.BindingProvider;
    import javax.xml.ws.WebServiceFeature;
    import javax.xml.ws.soap.MTOMFeature;

    import org.apache.ws.axis2.Bizstream;
    import org.apache.ws.axis2.BizstreamPortType;

    import com.brainsellers.schemas.webservices.bizstream._2006_10.ApplicationData;
    import com.brainsellers.schemas.webservices.bizstream._2006_10.DataType;
    import com.brainsellers.schemas.webservices.bizstream._2006_10.Detail;
    import com.brainsellers.schemas.webservices.bizstream._2006_10.DetailColumn;
    import com.brainsellers.schemas.webservices.bizstream._2006_10.GenerateDataRequest;
    import com.brainsellers.schemas.webservices.bizstream._2006_10.Header;
    import com.brainsellers.schemas.webservices.bizstream._2006_10.HeaderColumn;
    import com.brainsellers.schemas.webservices.bizstream._2006_10.LayoutData;
    import com.brainsellers.schemas.webservices.bizstream._2006_10.LayoutDefinition;
    import com.brainsellers.schemas.webservices.bizstream._2006_10.Pdf;
    import com.brainsellers.schemas.webservices.bizstream._2006_10.RecordData;
    import com.brainsellers.schemas.webservices.bizstream._2006_10.Resource;
    import com.brainsellers.schemas.webservices.bizstream._2006_10.ResourceData;
    import com.brainsellers.schemas.webservices.common._2006_10.FileData;



    public class WSS_JAXWS_Sample4 extends HttpServlet {

        // Webサービスサーバのホスト名
        private static final String WSS_HOST_NAME = "wsssrv";

        // Webサービスサーバ上のサンプルディレクトリの場所
        private static final String WSS_BIZSTREAM_SAMPLE_DIR = "/bs/sample";

        // Webサービスのエンドポイントプリフィックス
        private static final String WSS_SERVICE_LOCATION = "http://" + WSS_HOST_NAME + ":8080/axis2/services";

        // BASIC認証のユーザ名
        private static final String USER_NAME = "bizuser1";

        // BASIC認証のパスワード
        private static final String PASSWORD = "bizuser1";

        // 監査ロギング用のユーザ定義
        private static final String USER_DEF = "AAA";

        // Webサービスサーバ上の入力レイアウト定義ファイルパス
        private static final String LAYOUT_FILE = WSS_BIZSTREAM_SAMPLE_DIR + "/soap_client/xml/Sample4-doc.xml";

        private static final String RESOURCE_NAME = "resourceData";

        // レコード数
        private static final int RECORD_NUM = 10;

        // ダウンロードファイル名
        private static final String DOWNLOAD_FILE_NAME = "WSS_JAXWS_Sample4.pdf";


        /**
         * @see HttpServlet#HttpServlet()
         */
        public WSS_JAXWS_Sample4() {
            super();
        }

        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
         *      response)
         */
        protected void doGet(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws ServletException, IOException {
            try {
                // 認証の設定
                setAuth();

                // データの生成
                byte[] data = generate();

                // HTTPヘッダを設定する
                httpResponse.setCharacterEncoding("Windows-31J");
                httpResponse.setContentType("application/pdf");
                httpResponse.setContentLength(data.length);
                httpResponse.addHeader("Accept-Ranges", "bytes");
                httpResponse.addHeader("Content-Disposition", "attachment; filename=\"" + DOWNLOAD_FILE_NAME + "\"");

                // PDFをストリームに書き出す
                DataOutputStream out_res = new DataOutputStream(httpResponse.getOutputStream());
                out_res.write(data);
                out_res.close();
            } catch (Exception e) {
                e.printStackTrace();
                throw new ServletException(e);
            }
        }

        /**
         * 認証の設定
         */
        private void setAuth() {
            Authenticator.setDefault(new Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(USER_NAME, PASSWORD.toCharArray());
                }
            });
        }

        /**
         * アプリケーションでデータソースを設定してPDFを生成しダウンロードする
         *
         * @param
         * @return byte[]
         */
        private byte[] generate() throws Exception {
            // クライアントを生成
            Bizstream service = new Bizstream(new URL(WSS_SERVICE_LOCATION + "/bizstream?wsdl"));

            // MTOMを有効化
            WebServiceFeature feature = new MTOMFeature(true);
            BizstreamPortType type = service.getBizstreamSOAP11Port(feature);
            BindingProvider bp = (BindingProvider) type;
            Map<String, Object> reqContext = bp.getRequestContext();
            reqContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
                    WSS_SERVICE_LOCATION + "/bizstream?UserDef=" + USER_DEF);

            // リクエストメッセージを作成
            GenerateDataRequest request = new GenerateDataRequest();

            // 出力ファイルの種類を生成
            DataType dataType = new DataType();
            dataType.setPdf(new Pdf());
            request.setDataType(dataType);

            // レイアウト定義を設定
            LayoutData layoutData = new LayoutData();
            LayoutDefinition layout = new LayoutDefinition();
            layout.setUri(LAYOUT_FILE);
            layout.setDataReference(RESOURCE_NAME);
            layoutData.getLayoutDefinition().add(layout);
            request.setLayoutData(layoutData);

            // レイアウト定義に流し込むデータを設定
            Resource resource = new Resource();
            ResourceData resourceData = makeResourceData();
            resource.getResourceData().add(resourceData);
            request.setResource(resource);

            // リクエストを送信
            FileData data = type.generateData(request);

            return data.getContentData().getValue();
        }

        /**
         * レイアウト定義に流し込むデータを作成
         *
         * @return ResourceData
         */
        private ResourceData makeResourceData() throws Exception {

            ResourceData resourceData = new ResourceData();
            resourceData.setName(RESOURCE_NAME);
            String[][] headerNames = new String[][] {
                    { "PROJNO", "PROJNAME", "PRSTAFF" },
                    { "INVOICE NO", "MODEL", "SEIHAN NO" },
                    { "製品コード", "製品名", "数量" } };

            for (int ds_NO = 0; ds_NO < 3; ds_NO++) {
                ApplicationData applicationData = new ApplicationData();
                applicationData.setMasterName("app-resource" + (ds_NO + 1));
                RecordData recordData = new RecordData();
                Header header = new Header();
                for (int col_NO = 0; col_NO < 3; col_NO++) {
                    HeaderColumn headerColumn = new HeaderColumn();
                    headerColumn.setValue(headerNames[ds_NO][col_NO]);
                    header.getHeaderColumn().add(headerColumn);
                }
                recordData.setHeader(header);
                for (int record_NO = 0; record_NO < RECORD_NUM; record_NO++) {
                    Detail detail = new Detail();
                    for (int col_NO = 0; col_NO < 3; col_NO++) {
                        DetailColumn detailColumn = new DetailColumn();
                        detailColumn.setValue("AAA" + ds_NO + "_" + record_NO + "_" + col_NO);
                        detail.getDetailColumn().add(detailColumn);
                    }
                    recordData.getDetail().add(detail);
                }
                applicationData.setRecordData(recordData);
                resourceData.getApplicationData().add(applicationData);
            }
            return resourceData;
        }

    }