biz-Streamマニュアル Webサービスサーバ ガイド 第11章 サンプルプログラム(Java) 11.5 レイアウトファイルを biz-Stream の内部ライブラリに渡す前に書き換えてから PDF を生成しブラウザでダウンロードさせるサンプル(JAX-WS)

11.5 レイアウトファイルを biz-Stream の内部ライブラリに渡す前に書き換えてから PDF を生成しブラウザでダウンロードさせるサンプル(JAX-WS)

概要

<bsws:manipulators> を使用して、レイアウトファイルをbiz-Streamの内部ライブラリに渡す前に書き換えてからPDFを生成し、ブラウザでダウンロードさせるサンプルプログラムです。


[レイアウトファイルでの注意]

LayoutDefinition の ManipulatorReference 属性で指定した Manupulator は、uri 属性に指定してあるレイアウト定義にのみ反映されます。
ドキュメントレイアウトとページレイアウトがファイルとして分かれている場合にはドキュメントレイアウトのみを参照します。 ページレイアウトに存在する要素の属性を変更したい場合には、ドキュメントレイアウトとページレイアウトを一つのファイルに統合することが必要です。
統合レイアウト例は、『<bswss-client_home>/sample/xml/Sample5.xml』をご参照ください。
<bswss-client_home>/sample/xml/Sample4-doc.xml』と『Sample4-page.xml』を統合しています。


スタブクラスの準備

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


サンプル構成

項目 ファイルパス
レイアウトサンプル <bswss-client_home>/sample/xml/Sample5.xml サンプル1
ソースサンプル <bswss-client_home>/sample/java/jax-ws/WSS_JAXWS_Sample5.java サンプル1

ソースサンプル


 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.Manipulator;
import com.brainsellers.schemas.webservices.bizstream._2006_10.Manipulators;
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.Replace;
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_Sample5 extends HttpServlet {

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

    // Webサービスサーバ上のサンプルディレクトリの場所
    private static final String 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 = BIZSTREAM_SAMPLE_DIR + "/xml/Sample5.xml";

    // リソース名
    private static final String RESOURCE_NAME = "resourceData";

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

    // レイアウト定義の操作定義名
    private static final String MANI_NAME = "manipulatorName";

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


    /**
     * @see HttpServlet#HttpServlet()
     */
    public WSS_JAXWS_Sample5() {
        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);

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

        // レイアウト定義の操作定義に流し込むデータを設定
        Manipulators manipulators = new Manipulators();
        Manipulator manipulatorData = makeManipulatorData();
        manipulators.getManipulator().add(manipulatorData);
        request.setManipulators(manipulators);

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

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

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


    /**
     * レイアウト定義に流し込むデータを作成
     *
     * @return
    */
    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;
    }

    /**
     * レイアウト定義の操作定義に流し込むデータを作成
     *
     * @return
     */
    private Manipulator makeManipulatorData() throws Exception {
        Manipulator manipulatorData = new Manipulator();
        manipulatorData.setName(MANI_NAME);

        Replace r0 = new Replace();
        // <watermark-text name="sukashi"> の font-color 属性の設定値を
        // "0,51,255"(ブルー)から "255,0,255"(マジェンダ)に変更
        r0.setLocation("//*[@name = 'sukashi']/@font-color");
        r0.setValue("255,0,255");
        manipulatorData.getReplace().add(r0);

        Replace r1 = new Replace();
        // <Label Name="PROJNO"> の FontSize 属性の設定値を "12" から "18" に変更
        r1.setLocation("//*[@Name = 'PROJNO']/@FontSize");
        r1.setValue("18");
        manipulatorData.getReplace().add(r1);

        return manipulatorData;
    }
}