thinkfree server_developerguide_kor

26
ThinkFree Server Integrator Developer’s Guide ThinkFree Server 2008.06.25 Copyright © 2008 ThinkFree, Corp. All rights reserved

Upload: caost

Post on 18-Jun-2015

78 views

Category:

Documents


14 download

TRANSCRIPT

ThinkFree Server Integrator

Developer’s Guide ThinkFree Server

2008.06.25

Copyright © 2008 ThinkFree, Corp. All rights reserved

ThinkFree Server Integrator

i

Document Information

Project Title ThinkFree Server

Project Manager Bryan Version V 1.1

Project Stage Execution Date 2008.05.01

Name Of Creator Bryan Date of Last Update 2006.06.25

Document Number GD001

Updated Contents

Date Of

Update Updated Contents

Updated

By

Reviewed

By

Date Of

Review Version

2008.05.01 Initial Release Bryan Bryan 2008.05.01 V 1.0

2008.06.25 프로세스1차개정 Bryan Bryan 2008.06.25 V 1.1

Document Distribution

Sender Recipient Purpose Of Distribution Date Of

Distribution Other

ThinkFree Server Integrator

ii

Table of Contents

1 Introduction .................................................................................................................................... 1

1.1 ThinkFree Server Standard .............................................................................................. 1

1.2 ThinkFree Server Integrator ............................................................................................. 1

1.2.1 Adapter ..................................................................................................................... 2

1.2.2 OpenAPI ................................................................................................................... 2

2 Adapter ........................................................................................................................................... 2

2.1 Interface............................................................................................................................ 3

2.1.1 Path........................................................................................................................... 3

2.1.2 Start........................................................................................................................... 3

2.1.3 stop ........................................................................................................................... 3

2.1.4 Author ....................................................................................................................... 4

2.1.5 level........................................................................................................................... 4

2.1.6 Info ............................................................................................................................ 4

2.1.7 Get ............................................................................................................................ 6

2.1.8 Lock .......................................................................................................................... 6

2.1.9 Unlock ....................................................................................................................... 6

2.1.10 Put............................................................................................................................. 6

2.1.11 Mkdir ......................................................................................................................... 6

2.1.12 Rename .................................................................................................................... 6

2.1.13 List ............................................................................................................................ 7

2.2 Lifecycle............................................................................................................................ 8

2.3 Library............................................................................................................................... 9

2.3.1 Apache commons ..................................................................................................... 9

2.3.2 Apache Jakarta ....................................................................................................... 10

2.4 Implementation ............................................................................................................... 10

2.5 Test ..................................................................................................................................11

2.6 Register .......................................................................................................................... 13

3 Sample .......................................................................................................................................... 14

3.1 FTP Adapter ................................................................................................................... 15

3.1.1 author...................................................................................................................... 15

3.1.2 start ......................................................................................................................... 16

3.1.3 stop ......................................................................................................................... 18

3.1.4 level......................................................................................................................... 18

3.1.5 info .......................................................................................................................... 18

3.1.6 get ........................................................................................................................... 19

3.1.7 put ........................................................................................................................... 19

ThinkFree Server Integrator

iii

3.1.8 lock.......................................................................................................................... 20

3.1.9 unlock...................................................................................................................... 20

3.1.10 mkdir ....................................................................................................................... 20

3.1.11 rename.................................................................................................................... 20

3.1.12 delete ...................................................................................................................... 20

3.1.13 FtpInputStream ....................................................................................................... 21

4 OpenAPI........................................................................................................................................ 21

4.1 빈창 Open...................................................................................................................... 22

4.2 Adapter를 통한 빈창 Open........................................................................................... 22

4.3 웹 문서를 Open............................................................................................................. 22

4.4 특정 Adapter를 통하여 문서를 Open .......................................................................... 22

ThinkFree Server Integrator

1/23

Developer’s Guide

1 Introduction 본 문서는 ThinkFree Server Integrator를 통하여 기존의 File Service와 연동하는 방법과 간단한

Html script를 통하여 기존의 web page에 office를 imbedding하는 방법에 대하여 개발자 단계의 상

세한 설명과 예제를 제공하도록 한다. 설명에 앞서 ThinkFree Server Integrator의 기본이 되는

ThinkFree Server Standard에 대하여 간단히 설명하도록 한다.

1.1 ThinkFree Server Standard ThinkFree Server Standard는 ThinkFree Office의 Online 버전이다. 기본 Core는 ThinkFree Office

와 100% 공유하고 있으며 단지 실행 방법에서 아래와 같은 차이를 가지고 있다.

Office launcher를 Java applet으로 사용하고 있다. 따라서 Java가 지원 되는 모든 OS

및 Browser에서 실행될 수 있는 장점을 가지고 있다.

ThinkFree Office의 Online 버전인 ThinkFree Server Standard는 On Demand, Thin client, ASP 라는

특성을 가지고 있으며 그러한 특성에 의해 아래와 같은 장점을 가지고 있다.

1. Client에 추가적인 설치 없이 On Demand로 사용할 수 있다.

불특정 다수가 아무런 제약 없이 사용하는 공공기관(동사무소, 도서관), 학교, 터

미널(항공, 기차, 버스)에 적합하다.

Virus및 관리의 문제로 OS를 주기적으로 Format하여야 하는 장소에 적합하다.

2. 중앙의 ACL(Access Control List) 제어를 통한 보안 강화

Local disk 혹은 Removable(Floppy, USB)과 같은 저장 매체의 제어를 통하여

Office 사용자의 문서 Open 및 Save 위치를 제한할 수 있다.

Viewer 기능을 통하여 문서 편집을 차단할 수 있다.

출력 금지를 통하여 외부 유출을 금지 할 수 있다.

높은 수준의 문서 호환성을 요구하면서 보안이 요구 되는 곳에 적합하다.

3. Online Office로서 특이성

Web friendly한 모습으로 고객에게 새롭고 기술지향적인 이미지를 심을 수 있다.

1.2 ThinkFree Server Integrator ThinkFree Server Integrator는 ThinkFree Server Standard를 기반으로 하고 있다. 따라서 Online

Office로서의 모든 기능을 포함하고 추가로 Remote에 흩어져 있는 문서를 Open하고 다시

Remote에 저장할 수 있는 방법을 제공함으로써 사내의 Groupware, ERP, CRM, Online Board에 존

재하는 문서를 download 없이 On demand로 열고 저장할 수 있게 하여 준다.

1. 기업의 그룹웨어 혹은 ERP에 존재하는 오피스 문서를 바로 열고 저장하며 필요시

기존 페이지에 imbedding할 수 있다.

Office 문서로 작성된 Report 및 결제 문서를 html 혹은 image, swf, pdf로 변환할

필요 없이 바로 보여 줄 수 있다.

ThinkFree Server Integrator

2/23

별도의 창으로 보여 줄 수도 있지만, 기존의 html 페이지에 하나의 viewer 혹은

editor로서 삽입할 수 있다.

2. FTP, WebDav, 기타 Protocol로 서비스하는 파일을 Office로 열거나 FileDialog를 통하

여 navigation할 수 있고 원하는 위치에 저장할 수 있다.

온라인 template을 제공하는 site와 통합될 경우 template을 ThinkFree Server로

열고 필요한 위치에 저장할 수 있다.

Collaboration 서비스와 통합될 경우 공유된 문서를 ThinkFree Server로 열고 편집후 바로 저장할 수 있다.

1.2.1 Adapter ThinkFree Server Integrator가 외부의 File 서비스와 연동되기 위해서는 해당 서비스로 부터 파일

을 실제로 Open하고 Save할 수 있는 Adapter가 서버에 설치되어야 한다. 해당 Adapter는

ThinkFree Server와 File Service 사이에서 adapter 역할을 수행하여 ThinkFree Server가 파일을 열

수 있도록 변환하는 역할과 반대로 File Service에 파일이 저장될 수 있도록 변환하는 역할을 담당

하게 되는데 이러한 과정을 통하여 Office는 세부적인 File protocol을 모르고도 Remote 파일을 열

거나 저장할 수 있게 된다. 추가로 ThinkFree Server Integrator는 FTP Server용 Adapter를 기본으

로 제공하고 있으며 해당 소스 코드를 예제로 제공하고 있어 추가적인 Adapter 개발이 쉽게 이루

어 지도록 하고 있다.

1.2.2 OpenAPI 기존의 웹 페이지에 ThinkFree Server를 Imbedding할 수 있는 방법을 REST 방식의 OpenAPI 형

태로 제공하고 있다. OpenAPI를 통하여 페이지에서 손쉽게 오피스를 호출하여 실행시킬 수 있으

며 오피스의 속성을 제어할 수 있다. 제어할 수 있는 속성을 아래와 같다.

문서 없이 오피스 실행

Adapter를 통하여 remote 파일을 열기

Viewer 혹은 Editor 모드로 열기

Url을 통하여 웹 문서 바로 열기

Office를 새창으로 실행할 경우 창의 크기 제어.

2 Adapter Adapter는 ThinkFree Server와 File Service(혹은 Server) 사이의 연결 고리 역할을 한다.

ThinkFree Server의 Request(Open, Save, List, Info, Lock ..)를 실제 파일 서비스의 명령으로 변환하

고 동시에 File 서비스로 부터의 response를 ThinkFree Server가 인식할 수 있는 형태로 전달한다.

이런 과정을 통하여 ThinkFree Server는 특정 File Server의 Protocol에 구애받지 않고 문서를

Open 하거나 Save할 수 있게 된다. 이러한 과정이 진행되기 위해서 ThinkFree Server는 Adapter

Interface를 정의하고 각각의 Adapter는 해당 Interface를 구현하여야 한다.

ThinkFree Server Integrator

3/23

2.1 Interface Adapter interface는 ThinkFree Server가 문서를 open하고 save하기 위해서 필요한 동작을 선언

하고 있다. 따라서 특정 File Service의 Adapter는 해당 동작이 호출될때 필요한 요청을 서비스에

요청하고 결과를 interface의 return값에 맞게 변환하여 전달하여야 한다.

File 동작은 아래와 같은 3가지 형태로 나누어 질 수 있다.

1. 특정 위치로 부터 파일을 read only로 open하거나 open한 파일을 local에 저장할

수 있다. 다시 말해 서버에 저장할 수 없고 open만 할 수 있다..

2. 특정 위치로 부터 문서를 open하고 편집후 같은 위치로 그대로 저장만 할 수 있

다.

3. 특정 위치로 부터 문서를 open하고 편집후 FileDialog를 통하여 navigation하고

원하는 위치에 저장한다.

따라서 Adapter는 위의 용도에 따라서 필요한 기능만 구현하면 동작하도록 설계 되었다. 구현되

지 않은 동작의 요청은 오류 없이 무시 한다.

2.1.1 Path Interface에서 사용되는 모든 path는 아래와 같은 원칙을 따른다.

1. Root 일 경우는 공백으로 호출된다.

2. Root밑의 하위 파일 및 폴더는 일반적인 path의 형태를 따르며 path separator는 반드시 /

를 사용하여야 한다.

A. /test.doc : root의 test.doc 파일.

B. /test : root의 test directory.

C. /test/test.doc : root의 test directory의 test.doc 파일.

2.1.2 Start Office의 실행 요청시 호출된다. 호출시 adapter는 실행에 필요한 초기 작업을 진행하도록 한다.

예를 들면 File Server와의 연결을 맺고 인증을 처리하는 것이 그중 하나일 것이다.

public boolean start(HttpServletRequest request, HttpServletResponse response) throws

IOException;

입력 인자로 들어 오는 HttpServletRequest를 통하여 페이지에서 넘기는 사용자 정보 혹은 서버

정보를 받아서 사용할 수 있다. 서버의 실행 성공시 true을 return하고 실패시 false를 return한다.

오류 혹은 false시 Office 실행 request의 reponse로 404 오류를 return한다.

2.1.3 stop Office가 종료될 때 호출된다. Office가 종료 되는 시점은 Office가 실행되고 있는 Browser가

close될때 호출된다. Browser의 종료시 호출은 그 실행이 항상 보장되지 않기 때문에 ThinkFree

서버는 일정 간격(default 5분)으로 비정상 종료된 Adapter의 stop을 자동으로 호출한다. 호출시

adapter는 종료에 필요한 작업을 진행하도록 한다. File Server와의 연결을 종료하는 것이 좋은 예

가 될 수 있다.

ThinkFree Server Integrator

4/23

public boolean stop(HttpServletRequest request, HttpServletResponse response) throws

IOException;

입력 인자로 들어 오는 HttpServletRequest를 통하여 페이지에서 넘기는 사용자 정보 혹은 서버

정보를 받아서 사용할 수 있다. 서버의 종료 성공시 true을 return하고 실패시 false를 return한다.

오류 혹은 false시 Office 종료 request의 response로 404 오류를 return한다.

2.1.4 Author 구현되는 Adapter의 Author를 명시한다. Author 정보는 Adapter list의 항목으로 표시되며 영문은

200단어 다국어는 66단어까지 표시할 수 있음으로 주의 하도록 한다.

public String author() throws IOException;

2.1.5 level 구현되는 Adapter의 동작의 범위를 지정한다. Level은 1부터 3까지이며 해당 되는 Level에 따라

구현되어야 할 method가 달라지게 된다. 구현 되는 level을 int 형태로 return한다.

public int level() throws IOException;

1. Level 1 : 문서를 Open만 할 수 있는 단계이다. 따라서 Open에 필요한 method만 구현하

면 된다.

A. Info

B. Get

2. Level 2: 문서를 Open하고 편집후 해당 위치에 그대로 저장한다. 따라서 Level 1의

method를 포함하여 저장에 필요한 아래와 같은 method를 추가 구현하도록 한다.

A. Lock

B. Unlock

C. Put

3. Level 3: 문서를 Open하고 편집후 FileDialog를 통하여 navigation하여 원하는 위치에 저

장한다. 따라서 Level 2의 method를 포함하여 Dialog의 navigation에 필요한 아래와 같은

method를 추가 구현하도록 한다.

A. Mkdir

B. Rename

C. List

2.1.6 Info 특정 path의 정보를 조회한다. 존재할 경우 해당 path의 정보를 아래와 같은 xml 값으로 return하

ThinkFree Server Integrator

5/23

고 존재하지 않을 경우 null을 return한다.

존재하는 파일 및 directory일 경우 아래와 같은 xml String을 return 해야 한다.

\

1. FileName: 파일의 이름을 명시한다. Value가 CDATA인 이유는 파일 이름은 다국어로 들어

올 수 있기 때문에 이를 처리 하기 위해서이다.

2. Type의 경우 아래와 같은 값을 설정한다.

A. 파일: file

B. Directory: folder

3. Modified: 대상의 lastModified 값을 milliseconds 값으로 설정한다.

4. Read: 대상에 read 권한이 있을 경우 true 없을 경우 false를 설정한다.

5. Write: 대상에 write 권한이 있을 경우 true 없을 경우 falsle를 설정한다.

6. Size: 대상의 크기를 byte 단위로 설정한다.

예제)

public String info(String path) throws IOException

<?xml version="1.0" encoding="utf-8" ?>

<property>

<name><![CDATA[filename]]></name>

<type>type</type>

<modified>modified</modified>

<read>read</read>

<write>write</write>

<size>size</size>

</property>

<?xml version="1.0" encoding="utf-8" ?>

<property>

<name><![CDATA[test.doc]]></name>

<type>file</type>

<modified>122121123</modified>

<read>true</read>

<write>false</write>

<size>10423</size>

</property>

ThinkFree Server Integrator

6/23

2.1.7 Get Path에 해당하는 파일의 InputStream을 return한다. 존재하지 않을 경우 null return한다.

public InputStream get(String path) throws IOException

오류 발생시 IOException을 throws한다.

2.1.8 Lock Path에 해당하는 파일에 lock을 설정한다.

public InputStream lock(String path) throws IOException

2.1.9 Unlock Path에 해당하는 파일에 lock을 해제한다.

public InputStream unlock(String path) throws IOException

2.1.10 Put Path의 이름으로 파일을 저장한다. 오류 발생시 IOException을 throws한다.

public boolean put(String path, InputStream is) throws IOException

2.1.11 Mkdir Path의 위치에 새로운 directory를 생성한다. 성공시 true, 실패시 false를 return한다. 예상치 않은

오류시 IOException을 throws 한다.

2.1.12 Rename Path의 위치의 파일 혹은 directory의 이름을 변경한다. 성공시 true, 실패시 false를 return한다.

예상치 않은 오류시 IOException을 throws 한다.

public boolean rename(String path, String name) throws IOException

public boolean mkdir(String path, String name) throws IOException

ThinkFree Server Integrator

7/23

2.1.13 List 요청된 directory의 하위 파일 및 Directory의 Info 정보를 list 형태로 return한다.

</list>

</property>

<?xml version="1.0" encoding="utf-8" ?>

<list>

<property>

</property>

<property>

위와 xml String 처럼 요청된 Directory의 하위 파일 및 directory의 정보를 info 의 list 형태의 xml

로 return한다.

존재 하지 않는 path일 경우 null을 return한다.

예)

</list>

<?xml version="1.0" encoding="utf-8" ?>

<list>

<property>

<name><![CDATA[test.doc]]></name>

<type>file</type>

<modified>122121123</modified>

<read>true</read>

<write>false</write>

<size>10423</size>

</property>

<property>

<name><![CDATA[movie]]></name>

<type>folder</type>

<modified>122121567</modified>

<read>true</read>

<write>true</write>

<size>432562</size>

</property>

ThinkFree Server Integrator

8/23

2.2 Lifecycle Adapter는 Office와 같은 lifecycle을 갖는다. Office 시작시 Adapter instance가 new 되며 동

시에 start method가 호출된다. 종료시 stop method가 호출되고 생성된 Adapter instance가

remove되게 된다. Start 이후에 생성된 Adapter instance의 variable 은 Office가 종료 되어

Adapter가 제거될때까지 유효하게 된다. 따라서 start시 사용자 정보 혹은 connection 정보를

Adapter의 변수로 저장하고 사용할 수 있다. 또한 해당 Adapter및 내부 변수는 Adapter를 생성

한 Office 만 접근할 수 있게 된다.

그림) Adapter의 lifecycle

ThinkFree Server Integrator

9/23

그림)Office 와 Adapter의 Sequence

사용자가 Office를 실행하게 되면 Server 내부에 해당 Office와 대응 되는 Adapter instance가

생성되게 된다. 해당 instance는 Office와 완전히 mapping 되며 lifecycle을 함께 하게 된다.

Network 상황에 의하여 Office가 비정상 종료될 경우 ThinkFree Server는 내부에 Adapter

instance중 비정상 종료된 Office의 adapter의 stop을 호출하고 해당 instance를 clear하게 된다.

2.3 Library ThinkFree Server는 Adapter 개발의 편의를 위하여 몇가지 유용한 library를 내장하고 있다.

따라서 Adapter 개발시 별도의 library를 추가할 필요 없이 그대로 사용할 수 있다. 관련 library

의 자세한 설명은 해당 library의 link를 참고하기 바란다.

2.3.1 Apache commons 가장 일반적인 library중 하나인 apache commons를 포함하고 있다.

1. collections-3.2.1 : http://commons.apache.org/collections

2. lang-2.4 : http://commons.apache.org/lang

3. io-1.4 : http://commons.apache.org/io

4. beanutils-1.7.0 : http://commons.apache.org/beanutils

5. digester-1.8 : http://commons.apache.org/digester

6. validator-1.3.1 : http://commons.apache.org/validator

ThinkFree Server Integrator

10/23

7. net-1.4.1 : http://commons.apache.org/net

8. codec-1.3 : http://commons.apache.org/codec

9. email-1.1 : http://commons.apache.org/email

10. httpclient-3.1 : http://hc.apache.org/httpclient-3.x/index.html

11. logging-1.1.1 : http://commons.apache.org/logging

2.3.2 Apache Jakarta Jakarta project의 text 처리 library인 oro를 포함하고 있다.

1. oro-2.0.8 : http://jakarta.apache.org/oro

2.4 Implementation 본격적인 Adapter의 개발에 대하여 설명하도록 한다. Adapter의 개발은 아래와 같은 단계를 따

르는 것을 권장한다.

1. Adapter의 용도를 정확히 판단한다.

단순히 http protocol을 사용하여 웹상의 문서를 열어 보는것이라면 Adapter를 필요

로 하지 않는다. 제공하는 OpenAPI 를 통하여 문서의 url을 전달하면 된다.

Web이 아닌 특정 위치로 부터 단순히 문서를 Open 하기 위한 용도인가? Level-1

문서를 Open하고 편집후 해당 위치에 바로 Save하여야 하는가? Level-2

문서를 Open하고 편집후 FileDialog를 사용하여 navigate 후 특정 위치에 저장하여

야 하는가? Level-3

2. 용도에 의한 Adapter의 Level에 따라 구현 해야할 Method를 확인한다.

Level-1

Info : 문서의 정보를 return함.

Get : 문서의 InputStream을 실제로 return함.

Level-2

Lock : 문서에 대한 lock을 요청한다. Lock을 처리하지 못하는 서비스는 true를

return한다.

Unlock : 문서에 대한 lock을 해제한다. Lock을 처리하지 못하는 서비스는 true

를 return한다.

Put : Office가 요청한 문서의 InputStream을 서비스의 특정 위치에 저정한다.

Level-3

Mkdir : 새로운 directory를 생성한다.

Rename: 문서 혹은 directory의 이름을 변경한다.

List: 특정 directory의 하위 list 정보를 return한다.

3. 서버 주소의 /doc/adapter-api.jar를 classpath에 연결하고 구현할 Adapter class를 생성

후 com.tf.se.adapter.AdapterIF interface를 implements 한다.

ThinkFree Server Integrator

11/23

package com.my;

import com.tf.se.adapter.AdapterIF;

public class MyAdapter implments AdapterIF{

}

4. AdapterIF에 선언된 모든 api를 빈 상태로 구현하고 level에 따라 필요한 부분만 실제로

구현한다.

5. 구현된 class를 jar 형태로 묶는다.

jar -cvf adapter.jar com : com directory의 모든 class를 adapter.jar로 묶는다.

6. admin 페이지의 integrate>management>add adapter를 통하여 adapter를 Register한다.

7. OpenAPI 를 통하여 해당 Adapter를 사용하는 Office를 실행한다.

8. 정상적으로 문서가 Open되는지 확인한다.

2.5 Test 개발이 완료된 Adapter를 실제 적용하기 전에 Test할 수 있는 방법을 ThinkFree Server는 제

공하고 있다. Admin페이지의 Adpater 추가 페이지를 통하여 생성된 Adapter를 Test하도록 한다.

그림) Adapter 등록 페이지

ThinkFree Server Integrator

12/23

1. Name: Adapter의 이름. 해당 이름은 다른 Adapter와 충동하지 않는 Unique한 이름이

여야 한다. 영문 200자 한도 내에서 입력한다.

2. Class: 개발한 Adapter의 Full 이름을 명시한다 com.my.MyAdpater (.class는 제외한

다) 영문 1024자 내에서 입력한다.

3. Description: Adapter의 설명을 명시한다. 다국어를 지원하며 영문 4096자 이내로 다국

어 1000자 이내로 입력한다. 가능하면 간단하게 입력하는것을 권장한다.

4. Adapter File: Jar 파일로 묶은 Adapter 파일을 browse하여 명시한다.

5. Test를 실행하도록 한다.

ThinkFree Server Adapter Tester는 아래와 같은 순서 및 방법으로 Adapter의 method를

Test한다.

1. start method를 HttpServletRequest에 parameter 로 id=test, pw=test로 호출한다. 따라

서 인증을 요구하는 File Service의 경우 반드시 test/test 계정이 존재하여야 한다.

2. level method를 호출하여 Adapter의 level을 확인하고 필요한 API 만 Test를 진행한다.

Level-3의 경우 모든 API를 test하게 된다.

3. exist를 root path(“”)로 호출한다.

4. info를 root path(“”)로 호출한다.

5. get을 “/TestFile.txt” 로 호출한다 따라서 반드시 root 위치에 TestFile.txt 파일이 존재

하여야 한다.

6. lock을 “/TestFile.txt” path로 호출한다.

7. put을 “/TestFile.txt” path로 호출한다. 따라서 기존에 존재하는 TestFile.txt 을

overwrite하게 된다.

8. unlock을 “/TestFile.txt” path로 호출한다.

9. delete를 “/TestFile.txt” path로 호출하여 test 파일을 삭제한다.

10. list를 root path(“”)로 호출한다.

11. mkdir를 “/TestFolder”로 호출하여 test 폴더를 생성한다.

12. rename을 호출하여 생성된 TestFolder를 TestFolder2로 변경한다.

13. delete를 호출하여 rename된 TestFolder2를 삭제한다.

14. stop을 호출하여 Adapter를 종료한다.

해당 Test의 결과를 페이지에 보여줌으로 오류가 발생한 method를 수정할 수 있도록 하고 있

다.

ThinkFree Server Integrator

13/23

그림) Adapter test 결과 화면

위와 같은 방법으로 Test가 부족할 경우 Logger 혹은 System.out을 통하여 직접 Debugging하

는 것도 좋은 방법이 될 수 있다.

2.6 Register Adapter의 등록을 설명하도록 하겠다. Adapter 등록 페이지를 통하여 정보를 입력하고 등록 하

도록 한다. Adapter는 등록 개수에 제한이 없기 때문에 필요에 의하여 만들어 사용하도록 한다.

등록 과정은 아래와 같다.

1. Name: Adapter의 이름. 해당 이름은 다른 Adapter와 충동하지 않는 Unique한 이름이여

야 한다. 영문 200자 한도 내에서 입력한다. 입력된 이름은 추후 OpenAPI를 통하여 사

용되기 때문에 간략하면서 의미 있는 이름으로 하는게 바람직하다.

2. Class: 개발한 Adapter의 Full 이름을 명시한다 com.my.MyAdpater (.class는 제외한다)

영문 1024자 내에서 입력한다.

3. Description: Adapter의 설명을 명시한다. 다국어를 지원하며 영문 4096자 이내로 다국

어 1000자 이내로 입력한다. 가능하면 간단하게 입력하는것을 권장한다.

4. Adapter File: Jar 파일로 묶은 Adapter 파일을 browse하여 명시한다.

5. Register를 실행하도록 한다.

등록 과정은 Test 과정을 필수로 동반하게 된다. 따라서 등록 요청시 Test 결과를 보여 주게 되

는데 실패가 발생하더라고 Adapter는 정상적으로 등록되게 된다. 하지만, 가능하면 등록전에

Test 과정을 통하여 Adapter를 Test하기를 권장한다.

6. Adapter Control 메뉴를 선택하여 등록된 Adapter를 확인 하도록 한다.

ThinkFree Server Integrator

14/23

Adapter는 등록시 자동으로 사용할 수 있는 상태로 전환되게 되는데 Status가 그러한 상태임을

보여주고 있다. 등록된 Adapter를 사용 불가능 상태로 전환하고 싶다면 Status를 click하여

Disable 상태로 전환하도록 한다. 또한 Delete를 통하여 등록된 Adapter를 영구히 삭제할 수 도

있다.

Start 상태(Enable) Stop 상태(Disable)_

3 Sample ThinkFree Server Integrator는 http://server_url/doc 밑에 아래와 같은 sample및 library를 제공하고

있다

1. adapter-sample.jar

FTP 서버용 sample adapter의 소스를 포함한다.

Local File용 sample adapter의 소스를 포함한다.

2. adapter-api.jar

Adapter 개발에 필요한 Interface및 XML Utility를 제공한다. Adapter 개발시 classpath

에 걸어서 사용한다.

3. adapter-ftp.jar

FTP Server용 Adapter로서 FTP 서버가 있다면 바로 추가해서 사용해 볼 수 있다.

Sample로 제공한 FTP Adapter의 binary 코드이기 때문에 소스를 참고하도록 한다.

4. adapter-local.jar

Local File용 Adapter로서 서버의 local 파일 system의 파일을 open할 수 있는

ThinkFree Server Integrator

15/23

adapter이다. Sample로 제공한 Local adapter의 binary로서 소스를 참고하도록 한다.

3.1 FTP Adapter Sample로 제공한 FTP Server용 Adapter에 대한 소스 차원의 설명을 하도록 한다.

package com.tf.se.adapter.impl.ftp;

import java.io.IOException;

import java.io.InputStream;

import java.util.Calendar;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

// bundle된 commons-net을 사용한다.

import org.apache.commons.net.ftp.FTPClient;

import org.apache.commons.net.ftp.FTPFile;

import org.apache.commons.net.ftp.FTPReply;

// 제공된 adapter-api.jar을 classpath에 설정하도록 한다.

import com.tf.se.adapter.AdapterIF;

import com.tf.se.adapter.impl.XMLPrinter;

public class FtpAdapter implements AdapterIF{

// 아래 선언된 변수들은 Adapter의 lifecycle 기간 동안 유효하게 사용할 수 있다.

// 따라서 start 호출시 필요한 정보를 저장하여 일반 파일 동작 호출시 사용하도록 한다.

String author="ThinkFree Server Dev Team";

FTPClient client;

String defaultEncoding="UTF-8";

// FTP Server의 default 주소.

String host = "111.222.333.444";

3.1.1 author public String author() throws IOException{

// Adapter 저자 정보를 return한다.

return author;

}

ThinkFree Server Integrator

16/23

3.1.2 start public boolean start(HttpServletRequest request, HttpServletResponse

response) throws IOException{

try{

// HttpRequest의 Parameter로 부터 Open하려는 문서에 접근할 수 있는 사용자

// 정보를 전달 받는다.

String id = request.getParameter("id");

String pw = request.getParameter("pw");

if(id ==null || pw==null){

// Parameter에 없을 경우 Attribute에서 한번 더 찾는다.

id = (String)request.getAttribute("id");

pw = (String)request.getAttribute("pw");

}

// Attribute에 서버 주소가 있을 경우 Default FTP server주소를 변경한다.

String address = (String)request.getAttribute("address");

if(address !=null){

host = address;

}

if(host !=null){

// 기타 서버 설정 정보를 HttpRequest로 부터 받아 온다. 없을 경우

// Default를 사용한다.

String aPort = (String)request.getAttribute("port");

String aMode = (String)request.getAttribute("mode");

String aEncoding = (String)request.getAttribute("encoding");

// 아래와 같이 서버 초기화 작업을 진행한다.

client = new FTPClient();

if(aPort !=null){

client.connect(host,Integer.parseInt(aPort));

}

else{

client.connect(host);

}

ThinkFree Server Integrator

17/23

// FTP 서버의 경우 반드시 Response를 확인한다.

int reply = client.getReplyCode();

if (!FTPReply.isPositiveCompletion(reply)){

throw new IOException("FTP server refused connection.");

}

// 서버에 login한다.

if(id !=null && pw !=null){

client.login(id,pw);

}

// 서버 mode를 설정한다.

if(aMode !=null && aMode.equalsIgnoreCase("passive")){

client.enterLocalPassiveMode();

}

// 파일 이름에 대한 encoding을 설정한다.

if(aEncoding !=null){

client.setControlEncoding(aEncoding);

}

else{

client.setControlEncoding(defaultEncoding);

}

return true;

}

}

catch(IOException io){

// 오류 발생시 반드시 connection을 close한다.

if(client !=null && client.isConnected()){

try{

client.disconnect();

}

catch(IOException ex){}

client = null;

}

}

return false;

}

ThinkFree Server Integrator

18/23

3.1.3 stop public boolean stop(HttpServletRequest request, HttpServletResponse

response) throws IOException{

// 호출시 필요한 clear 작업을 진행한다.

if(client !=null && client.isConnected()){

try{

client.disconnect();

}

catch(IOException ex){}

}

client = null;

return true;

}

3.1.4 level // 지원할 Adapter의 level을 정확히 return한다.

public int level() throws IOException{

// level-3 모든 기능을 구현하도록 한다.

return LEVEL_3;

}

3.1.5 info // 대부분의 파일 동작전에 해당 path에 대한 정보를 얻기 위해서 호출된다.

public String info(String path) throws IOException{

FTPFile file = null;

if(path.length()<1 || path.equalsIgnoreCase("/")){

// Root에 대한 정보를 return한다.

file = new FTPFile();

file.setName("FTP");

file.setType(FTPFile.DIRECTORY_TYPE);

file.setTimestamp(Calendar.getInstance());

}

else{

// 하위 path에 대한 정보를 return한다. 파일일 경우는 해당 파일의 정보를

ThinkFree Server Integrator

19/23

// Directory일 경우는 Directory자체 정보를 return하는 api가 없어서

// list의 첫번째 정보를 전달한다.

// FTP 서버의 경우 path의 시작을 /로 하면 인식하지 못함으로 아래와같이 제거

// 한다.

String aPath = stripSlash(path);

FTPFile[] files = client.listFiles(aPath);

if(files.length>0){

file = files[0];

}

}

if(file!=null){

// 정보를 XML 형태로 생성하여 return한다.

return createInfo(file,null);

}

return null;

}

3.1.6 get // 실제 파일의 InputStream을 전달한다.

public InputStream get(String path) throws IOException{

String aPath = stripSlash(path);

// 반드시 아래와 같이 Mode binary로 변경 시켜 주어야 한다.

client.setFileType(FTPClient.BINARY_FILE_TYPE);

return new FtpInputStream(client,client.retrieveFileStream(aPath));

}

3.1.7 put // 파일을 저장한다.

public boolean put(String path, InputStream is) throws IOException{

String aPath = stripSlash(path);

// 반드시 아래와 같이 Mode binary로 변경 시켜 주어야 한다

client.setFileType(FTPClient.BINARY_FILE_TYPE);

client.storeFile(aPath,is);

return true;

}

ThinkFree Server Integrator

20/23

3.1.8 lock // FTP 는 lock 을 지원하지 않기 때문에 true를 return한다.

public boolean lock(String path, String locker) throws IOException{

return true;

}

3.1.9 unlock // FTP 는 unlock을 지원하지 않기 때문에 true를 return한다.

public boolean unlock(String path, String locker) throws IOException{

return true;

}

3.1.10 mkdir // 새로운 Directory를 생성한다.

public boolean mkdir(String path, String name) throws IOException{

String aPath = stripSlash(path);

client.makeDirectory(aPath+"/"+name);

return true;

}

3.1.11 rename // 파일 및 폴더의 이름을 변경한다. 이미(todo) 존재하는지 여부는 확인하지 않는다.

public boolean rename(String path, String name) throws IOException{

String from = stripSlash(path);

String to = stripSlash(name);

client.rename(from,to);

return true;

}

3.1.12 delete // 파일 및 폴더를 삭제한다.

public boolean delete(String path) throws IOException{

String aPath = stripSlash(path);

client.deleteFile(aPath);

return true;

}

ThinkFree Server Integrator

21/23

3.1.13 FtpInputStream FtpInputStream은 InputStream을 상속하여 FTP Protocol 특성에 맞는 close 동작을 추가로 구현

한다.

Ftp는 파일의 전송후 명시적으로 전송이 완료 되었음을 FTP Server에 알여 주어야

한다.

따라서 기존의 InputStream의 구조상 close시 FTP 전달할 방법이 없기 때문에 대당

close method를 override하여 close시 FtpClient. completePendingCommand()를 호출

하여 작업이 완료 되었음을 명시적으로 알려 주도록 한다.

public class FtpInputStream extends InputStream{

FTPClient client;

InputStream input;

// 생성자에서 FTPClient를 인자로 받는다.

public FtpInputStream(FTPClient client,InputStream input){

this.client = client;

this.input = input;

}

// close 시 completePendingCommand()를 호출해 준다..

public void close() throws IOException {

input.close();

client.completePendingCommand();

}

}

4 OpenAPI Thinkfree Server는 Rest 방식의 OpenAPI를 통하여 Office의 실행 및 설정을 제어할 수 있다.

Api의 원형은 아래와 같다.

URL = [server_url]/api[/adapter][/path]/open ?app=[WRITE_EDITOR| SHOW_EDITOR|CALC_EDITOR]

[server_url] : 설치된 ThinkFree Server의 주소를 입력한다.

[adapter] : Adapter 등록시 사용했던 name을 사용하도록 한다.

[path] : open하려고 하는 문서의 path를 지정한다.

ThinkFree Server Integrator

22/23

[app] :

Document일 경우 WRITE_EDITOR를 입력한다.

Spreadsheet일 경우 CALC_EDITOR를 입력한다.

Presentation일 경우 SHOW_EDITOR를 입력한다.

4.1 빈창 Open

Adapter로 문서를 Open하는게 아니라 파일이 없는 빈 창으로 Office를 실행한다. 실행된 Office는

Adapter가 없기 때문에 FileDialog를 통하여 local 파일만 Open할 수 있다.

/api/open?app=WRITE_EDITOR

/api/open?app=CALC_EDITOR

/api/open?app=SHOW_EDITOR

4.2 Adapter를 통한 빈창 Open

Adapter를 사용하는 빈 Office를 실행한다. 실행된 Office의 FileDialog를 통하여 Remote의 파일을

Open할 수 있다.

/api/ftp/open?app=WRITE_EDITOR : ftp adapter를 사용하는 Write 실행.

/api/test/open?app=WRITE_EDITOR : test adapter를 사용하는 Write 실행

4.3 웹 문서를 Open

일반적인 Web문서는 Adapter가 없이 바로 문서를 Open할 수 있으나 Editor로 Open은 지원하

지 않는다.

/api/open?open=http://www.test.com/test.doc

http://www.test.com/test.doc 상의 파일을 Write으로 open한다. 물론 해당 url은 URL Encoding

을 한 후 전달되어야 한다.

4.4 특정 Adapter를 통하여 문서를 Open

등록한 Adapter를 통하여 문서를 Open한다.

/api/ftp/test/test.doc/open?app=WRITE_EDITOR

등록된 ftp adapter를 통하여 test/test.doc 파일을 Write으로 open한다.