nexacro-xeniの拡張インターフェースの作成例 - DRM

nexacro-xeniの拡張インターフェースでDRMソリューションを適用する場合は、各DRMソリューションを提供する企業が提示している方法で実現する必要があります。DRMソリューションによって多様なメソッドおよび方法を提供しています。本文書では一般的な利用のシナリオを説明します。

ExcelファイルにDRMを適用する方法は下記の2つの方法があります。

本章ではサーバーでDRMを適用する方法のみ説明します。

DRMが適用されたExcelファイルのインポート/エクスポートのシナリオ

DRMが適用されたExcelファイルのインポートは下記のような順序で処理されます。

  1. nexacroからサーバーへExcelファイルをアップロードする

  2. サーバーにアップロードされたExcelファイルをDRMソリューションから提供されたメソッドによりDRMを解除する

  3. PlatformDataに変換し、nexacro側に送信する

Gridコンポーネントに表示されているデータをExcelファイルへのエクスポートは下記のような順序で処理されます。

  1. Gridコンポーネントに表示されているデータをサーバーへアップロードする

  2. サーバーでExcelファイルを生成する

  3. DRMソリューションから提供されたメソッドによりDRMを適用したExcelファイルに変換する

  4. ExcelファイルをダウンロードできるURLをnexacro側に送信する

拡張インターフェースの継承

XeniExcelDataStorageBaseインターフェースを継承したXeniDrmSampleクラスを生成します。参照するパッケージとDRMソリューションから提供されるパッケージもそれぞれimportします。

package com.nexacro.user.drm;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.http.HttpServletResponse;

import com.nexacro.java.xapi.data.DataSet;
import com.nexacro.java.xapi.data.PlatformData;
import com.nexacro.java.xapi.data.VariableList;
import com.nexacro.java.xapi.tx.HttpPlatformResponse;
import com.nexacro.java.xapi.tx.PlatformType;

public class XeniDrmSample implements XeniExcelDataStorageBase {

メソッドの実装

Excelファイルのインポート/エクスポートのシナリオに沿ってメソッドを実装します。

(InputStream) loadTargetStream

loadTargetStreamメソッドは指定されたパスのExcelファイルを開いてファイルストリームを渡す処理のみ実装します。

public InputStream loadTargetStream(String filepath) throws Exception {
	File file = new File(filepath);
	return new FileInputStream(file);
}

(String) saveImportStream

nexacroから渡されたExcelデータを指定した場所にファイルとして保存したり、DBに保存する機能です。

saveImportStreamメソッドはパラメータとして渡されたパスを確認します。指定されたパスが存在しない場合は新たに生成します。

int nIdx = filepath.lastIndexOf("/");
String sPath = filepath.substring(0, nIdx);
String fileName = filepath.substring(nIdx + 1);
String srcFile = sPath + "/__temp_" + fileName;

File file = new File(sPath);
if(file.exists() == false) {
	file.mkdirs();
}
パラメータとして渡されたDRMが適用されたExcelファイルストリームを指定されたパスにプレフィックス付き(__temp_)のファイル名で一時ファイルを生成し、保存します。
OutputStream out = new FileOutputStream(srcFile);

byte[] buf = new byte[1024];
int length = 0;
while((length = in.read(buf)) > 0) {
	out.write(buf, 0, length);
}

out.flush();
out.close();
in.close();
指定されたパスに保存された一時ファイル(DRM適用済ファイル)をDRMソリューションから提供されたDRM解除メソッドにより解除します。DRMメソッドの必須パラメータと実行結果に対するException処理は提供されたDRMソリューションのガイドに従います。
boolean isSuccess = DrmUtil.extractDRM(srcFile, filepath);
DRMの解除メソッドが正常に処理された場合はDRMが適用された一時ファイルを削除します。
File delFile = new File(srcFile);
if(delFile.exists()) {
	file.delete();
}

以降のDRM解除済のExcelファイルをPlatformDataに変換する作業は、nexacro-xeni内部で処理するため、別途実装する必要はありません。また、任意の変更は許可されていません。

(int) saveExportStream

本メソッドはnexacroから渡されたGridコンポーネントのデータに対して、nexacro-xeni内部で生成したExcelファイルストリームをExcelファイルとして保存し、nexacroでダウンロードできるURLを送信する機能です。

パラメータとして渡されたパスの存在有無をチェックします。存在しない場合は新たに生成します。

GridデータをExcelファイルに変換する機能はnexacro-xeni内部で処理するため、別途実装する必要はありません。パラメータ「ByteArrayOutputStream out」で受け取ります。

int nIdx = filepath.lastIndexOf("/");
String sPath = filepath.substring(0, nIdx);
String fileName = filepath.substring(nIdx + 1);
String srcFile = sPath + "/__temp_" + fileName;

File file = new File(sPath);
if(file.exists() == false) {
	file.mkdirs();
}
nexacro-xeniで変換されたExcelファイルストリーム(DRM適用前)を指定されたパスに一時ファイルの名前(プレフィックス「__temp_」付き)で生成し、保存します。
FileOutputStream fout = new FileOutputStream(srcFile);
fout.write(out.toByteArray());

fout.close();
out.close();
DRMが適用されていない一時ファイルを基に、DRMソリューションから提供されたメソッドによりDRMを適用したファイルを生成します。詳細にはついてはDRMソリューションから提供されるガイドに従います。
String id = varlist.getString("id");
String name = varlist.getString("name");
String code = varlist.getString("code");
String dept = varlist.getString("dept");
boolean isSuccess = DrmUtil.packagingDRM(srcFile, filepath, id, name, code, dept);

DRMの適用が成功した場合は一時ファイルを削除します。

File delFile = new File(srcFile);
if(delFile.exists()) {
	file.delete();
}

DRMが適用されたExcelファイルの情報(URL)および変換結果をPlatformDataに格納し、nexacro側に送信します。

DataSet dsRes = CommUtil.getDatasetExportResponse(dscmd);

PlatformData resData = new PlatformData();
VariableList varList = resData.getVariableList();

varList.add("ErrorCode", 0);
varList.add("ErrorMsg", "SUCCESS");

dsRes.set(0, "url", fileurl);
resData.addDataSet(dsRes);

HttpPlatformResponse platformRes = new HttpPlatformResponse(response, PlatformType.CONTENT_TYPE_SSV, "UTF-8");
platformRes.setData(resData);
platformRes.sendData();

return 0;

nexacro側に渡す必要のある情報はここで追加します。

(Dataset) saveExportStream

内容の実装は任意ですが、空のメソッドとして宣言する必要があります。

public DataSet saveExportStream(VariableList varlist, DataSet dscmd, ByteArrayOutputStream out, String filepath, String fileurl) throws Exception {
      return null;
}