6.nexacro-xeni 확장 인터페이스 작성 예 - DRM

Edit

확장 인터페이스로 DRM 솔류션을 적용하는 방법은 DRM 솔류션에서 가이드 하는 방법으로 구현해야 합니다. DRM 솔류션별로 다양한 메소드 및 방법을 제공하고 있어서 이 문서에서는 일반적인 시나리오로 설명합니다.

Excel 파일에 DRM을 적용하는 방법에는

의 2가지 방법이 있습니다. 이 문서에서는 Server에서 DRM을 적용하는 방법만 설명합니다.

6.1DRM 적용 Excel Import & Export 시나리오

DRM이 적용된 Excel 파일의 Import는 넥사크로플랫폼에서 서버로 업로드 하고, 서버는 전달받은 엑셀파일을 DRM솔류션에서 제공한 메소드를 이용하여 해제 한 후 넥사크로플랫폼의 PlatformData로 변환하여 넥사크로플랫폼으로 전달합니다.

Grid를 Excel 파일로 Export시, 넥사크로플랫폼에서 받은 Grid 데이타를 Excel 파일로 생성하고, DRM 솔류션이 제공하는 메소드를 통해 DRM이 적용된 Excel 파일로 변환하여 넥사크로플랫폼으로 Excel 파일의 위치를 URL로 전달합니다.

6.1.1XeniExtendBase 인터페이스의 상속

nexacro17-xeni => XeniExcelDataStorageBase 인터페이스 상속

XeniExtendBase (nexacro17-xeni => XeniExcelDataStorageBase) 를 상속받은 XeniDrmSample 클래스를 생성합니다. 각 참조할 패키지와 DRM 솔류션에서 제공하는 패키지도 import 합니다.

package com.nexacro.xeni.util;

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.xapi.data.DataSet;
import com.nexacro.xapi.data.PlatformData;
import com.nexacro.xapi.data.VariableList;
import com.nexacro.xapi.tx.HttpPlatformResponse;
import com.nexacro.xapi.tx.PlatformType;

public class XeniDrmSample implements XeniExtendBase {

XeniDrmSample의 전체소스는 제공되는 샘플을 참고하세요.

6.1.2메소드 구현

loadTargetStream

위의 시나리오에서는 loadTargetStream()는 다른 구현 없이 지정된 경로의 Excel 파일을 열고 그 파일스트림을 전달하도록 구현합니다.

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

saveImportStream

이 메소드는 넥사크로플랫폼으로부터 전달받은 Excel 파일을 PlatformData로 변환하는 기능을 합니다.

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이 적용된 엑셀파일 Stream을 지정된 경로에 프리픽스 "__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내부에서 처리함으로 구현할 필요는 없습니다. 또한 변경하도록 열려 있지 않습니다.

saveExportStream

이 메소드는 넥사크로플랫폼으로 전달받은 Grid를 Excel 파일로 변환하여 넥사크로플랫폼에서 다운로드 할 수 있는 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 파일 Stream(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에 담아 넥사크로플랫폼으로 전달합니다.

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;

넥사크로플랫폼으로 전달해야 할 정보가 있으면 이 위치에 추가 할 수 있습니다.