'Slide'에 해당되는 글 3

  1. 2006.10.20 JDBCStore at Slide WebDAV
  2. 2006.09.26 Webdav(slide) 기본 구조
  3. 2006.09.22 WebDAV 와 project 'slide'

JDBCStore at Slide WebDAV

Slide 에서 제공하는 store 는 크게 File Stroe 와 JDBC Store로 나눠진다.
(J2EEStore 등 딴것도 있어 보임)
이중에 nodestore를
- File Store : 각 node에 대한 Definition을 XML파일 File로 만들어서 Disk에 저장.
- JDBC Store : 각 node에 대한 Definition을 DB에 저장.

contentstore는 File로 저장하고 싶으면 rootpath를 지정해 주면 된다.
아래 예제는 nodestore는 MySQL로 지정하고, contentstore 는 store/content 디렉토리로
지정했을 때의 예이다.(Domain.xml)


<definition>
<store name="MySqlStore">                
<nodestore classname="org.apache.slide.store.impl.rdbms.JDBCStore">    
<parameter name="adapter">database.MySqlAdapter</parameter>
<parameter name="driver">com.mysql.jdbc.Driver</parameter>
<parameter name="url">jdbc:mysql://localhost/storedb</parameter>
<parameter name="user">root</parameter>
<parameter name="password">040212</parameter>
<parameter name="dbcpPooling">true</parameter>
<parameter name="maxPooledConnections">10</parameter>
<parameter name="isolation">SERIALIZABLE</parameter>  
<parameter name="compress">false</parameter>                
</nodestore>                

<securitystore>
<reference store="nodestore"/>
</securitystore>
<lockstore>
<reference store="nodestore"/>
</lockstore>
<revisiondescriptorsstore>
<reference store="nodestore"/>
</revisiondescriptorsstore>
<revisiondescriptorstore>
<reference store="nodestore"/>
</revisiondescriptorstore>
<contentstore classname="org.apache.slide.store.txfile.TxFileContentStore">
<parameter name="rootpath">store/content</parameter>
<parameter name="workpath">work/content</parameter>
<parameter name="defer-saving">true</parameter>
<parameter name="timeout">120</parameter>
</contentstore>
</store>
<scope match="/" store="MySqlStore"/>
</definition>



JDBCStore를 사용할 경우, 사용하는 Table의 schema를 DataBase에 만들어야 한다.
Slide(server side)의 소스에 보면 src/conf/schema 폴더에 sql문들이 있다.
사용하는 DataBase에 따라 골라서 사용하면된다.
예제에서는 MySQL을 사용했기 때문에 MySqlSchema.sql을 실행해서
JDBCStore에서 사용하는 schema를 생성한다.
JDBCStore를 사용하려면 adpater를 설정해 줘야 하는데, slide에서는 각 벤더별로 사용하는 Adapter를 제공한다. org.apache.slide.store.impl.rdbms 팩키지에 Adapter들이 있다.
MySql일 경우 MySqlRDBMSAdapter를 사용 하면 되는데 실제로 실행하면 Exception이 발생한다. 내부 코드를 보면 Delete 문이 있는데, 이 delete문이 MySql에서 실행되지 않기 때문인다.(multi-delete문이라고 하는데 잘 모르겠음). 예를 들면,
delete VERSION from VERSION v, URI u where v.URI_ID = u.URI_ID and u.URI_STRING = ?
이런 문장은 다음 처럼 고쳐야만 실행된다.
delete v from VERSION v, URI u where v.URI_ID = u.URI_ID and u.URI_STRING = ?
그래서 MySqlRDBMSAdapter 를 상속한 MySqlAdater 클래스를 하나 만들고 틀린 쿼리문들이 들어 있는 메서드들을 override 해서 수정된 쿼리문을 넣어주면 된다.

Domain.xml



MySqlAdapter.java



신고

'개발' 카테고리의 다른 글

WebDAV Access Control Protocol RFC#3744  (0) 2006.10.30
Tomcat 에서 JDBC Realm 설정  (0) 2006.10.20
JDBCStore at Slide WebDAV  (0) 2006.10.20
Browser의 Applet heap 메모리 확장 방법  (0) 2006.10.20
MySQL connect  (0) 2006.10.16
라눅스 명령어 - 파일 관련  (1) 2006.09.26
TRACKBACK 0 COMMENT 0

Webdav(slide) 기본 구조

Slide의 기본 architecture를 살펴 보면 아래와 같다.
자세한 그림은,
http://jakarta.apache.org/slide/architecture.html


Client 에서는 Server의 WebdavServlet에 request 를 하게 된다. WebdavServlet은 내부의 Slide API 를 통해서 request 에 상응하는 동작(GET,PUT ......)들을 하게 되고 response하게 된다. WebDAV 에서는 client 와 server 간의 통신은 HTTP protocol을 사용한다.

==============================================
그럼 Client 에서 어떻게 Request 를 보내고, Server의 WebdavServlt에서 어떻게 Request를 처리하는 지 살펴보자.

client에서는 원하는 HttpMethod를 생성한다. 그리고 HttpMethod의 execute를 호출 하면된다.
그렇게 되면 http protocol에 의해서 server 의 WebdavServlet의 service 메서드가 호출 된다.
아래 예제 코드는 slide에서 새로운 user를 runtime 에 add 시키는 예제이다.


public void createUser(String username, String password) throws Exception {

  URIValue userUri = new URIValue("/users/" + username);
  //MkcolMethod mkcolMethod = new MkcolMethod("/slide" + userUri);
  MkcolMethod mkcolMethod = new MkcolMethod(domain+userUri);
  mkcolMethod.setDoAuthentication(true);
  HttpState httpState = new HttpState();

  httpState.setCredentials(null, host, this.credentials);
  int state;
  try {
  state = mkcolMethod.execute(httpState, new HttpConnection(host,
  port, Protocol.getProtocol("http")));
  if (state == HttpStatus.SC_CREATED) {
     System.out.println("Created");
     changePassword(userUri, null, password);
  } else if (state == HttpStatus.SC_FORBIDDEN) {
     System.err.println("Forbidden");
  }
  } catch (IOException e) {
  System.err.println(e.toString());
  }
}


위의 예제에서는 HttpMethod로 MkcolMethod를 사용했다.
HttpMethod는 interface이고 이를 구현한 클래스가 HttpMethodBase 이다. 이 두 클래스는  commons-httpclient.jar에 속해있다. 그리고 slide의 client API(jakarta-slide-webdav-2.1b1.jar) 에 HttpMethodBase를 상속한 Method 클래스들(ex:MkcolMethod)이 존재한다.

commons-httpclient.jar를 다운 받고 싶다면,
http://jakarta.apache.org/site/downloads/downloads_commons-httpclient.cgi

다음은 클라이언트에서 사용하는 HttpMethod 클래스 다이어그램이다.(HttpMethod를 상속한 클래스는 무지 많다. 아래 다이어그램들은 많이 쓰고, 구조만 파악될 정도의 대략 그림이다). client 에서 원하는 request 에 따라 다른 Method를 사용한다.(이 내용은 다음에......)
client를 묶은 jar 는 jakarta-slide-webdavlib-2.1.jar이고, 소스는 jakarta-slide-webdavclient-src-2.1을 받으면 된다.

=================================================
위에서처럼 client 가 request 를 보내면 server에서는 어떻게 response 하는 지 알아보자.

server에서는 WebdavServlet이 request 를 기다리고 있다.
slide 에 있는 org.apache.slide.webdav.WebdavServlet을 살펴보자.

HttpServlet을 상속했기 때문에 당연 init(ServeltConfig config), destory(), serviice(HttpServletRequest req, HttpServletResponse resp) 의 메서드가 있다.

# init(ServeltConfig config)
Domain.xml 을 읽어 들인다. Domain 클래스를 통해서 Domain.xml에 정의된 내용을 읽어 들이고, 필요한 폴더들과 def.xml 파일들을 생성한다. (물론 있으면 안만들겠지)

# service(HttpServletRequset req, HttpServletResponse resp)
request 로 부터 WebdavMethod를 알아낸다. 그리고 그 WebdavMethod의 run(req,resp)을 호출한다.

String methodName = req.getMethod();
WebdavMethod method = methodFactory.createMethod(methodName);
method.run(req,resp);

위의 코드는 service 메서드 내부의 구현이다.
WebdavMethod는 interface로 run() 를 가지고 있고, 이를 구현한(반만) abstract 클래스는
AbstractWebdavMethod이다. 그리고 이를 상속한 무수한 WebdavMethod 클래스들이 있다.
예제에서 methodName는 "MKCOL"이었고, 이에 상응하는 WebdavMethod(org.apache.slide.webdav.method.MkcolMethod)를 찾아서 run()를 호출한다.
server의 WebdavMethod를 포함한 퍀키지는 slide-webdavservlet-2.1.jar이다.(서블릿)

아래 그림은 slide.webdav.method의 간략한 클래스 다이어그램이다.
jar 파일은 slide-webdavservlet-2.1.jar 이고 소스는 jakarta-slide-server-src.2.1을 참조하면 된다.


신고

'개발' 카테고리의 다른 글

Browser의 Applet heap 메모리 확장 방법  (0) 2006.10.20
MySQL connect  (0) 2006.10.16
라눅스 명령어 - 파일 관련  (1) 2006.09.26
Webdav(slide) 기본 구조  (0) 2006.09.26
WebDAV 와 project 'slide'  (0) 2006.09.22
Applet Debugging with Eclipse  (0) 2006.09.20
TRACKBACK 0 COMMENT 0

WebDAV 와 project 'slide'

Web-based Distributed Authoring and Versioning.

remote web server 상에서 HTTP protocol을 사용해서 사용자들이 collaboration 과 파일 관리를 가능하게 해주는 API(?프로토콜?)이다.

'Slide'는 jakarta 에 있는 커뮤티니기반 오픈 소소 프로젝트로 WebDAV를 지원한다. Slide 는 server side 와 client side 의 API를 모두 제공한다.

참조 http://jakarta.apache.org/slide/index.html

===================================================

# Slide 설치 - Jakarta에서 slide(slide.war)를 다운받은 후 tomcat의 webapp에 실행시키면 된다.

- web.xml
  • 서블릿 지정 : org.apache.slide.webdav.WebdavServlet
  • WebdavServlet은 org.apache.catalina.servlet에도 있다. 이 서블릿은 Tomcat을 인스톨했을 때, webapps아래 예제 중 webdav가 있는 데, 이곳에서 사용하는 서블릿이다. slide를 사용할 경우는 slide pacakge 에 있는 WebdavServlet을 사용한다.
  • domain 지정 : Domain.xml 의 위치를 지정한다.

- Domain.xml

  • webdav의 domain에 관한 정보를 저장한다.
  • namespace에 보면 definition, configuration,data 로 나눠진다.
  • definition에서는 store 정보 설명
  • configuration에서는 action map과 configuartion path 설명
  • data 에서는 uri 패스와 연결해서 각각의 uri 의 subject, action, role, file 들을 지정한다.

- Domain.xml 의 data 노드
data 노드의 하위 노드는 objectnode로 되어 있다. object node 는 하나의 uri를 정의 하고 있고, permission 노드를 가진다. objectnode는 하위에 objectnode를 가질 수 있다.

예>
<objectnode classname="org.apache.slide.structure.SubjectNode" uri="/">    
  <permission action="all" subject="/roles/manager" inheritable="true"/>
<permission action="/actions/read-acl" subject="all"     inheritable="true"        negative="true"/>    
  <permission action="/actions/write-acl" subject="all" inheritable="true" negative="true"/>    
  <permission action="/actions/read" subject="all" inheritable="true" />
</objectnode>


최상위 root 를 정의한 object node 하위에는 /users, /roles, /actions, /files 에 대한 object node들이 정의되어 있다. 그리고 각각 그 하위에 child 노드들이 정의 되어 있다. 예를 들면 /users 아래에는 실제 사용자에 대한 정의( /users/seoeun)가 있다. 이 중에서 /files 는 사용자가 put한 파일들(혹은 생성한 디렉토리)에 대한 정의가 있다.

<objectnode classname="org.apache.slide.structure.SubjectNode" uri="/files">  
<permission action="all" subject="unauthenticated" inheritable="true"/> 
<permission action="/actions/write" subject="/roles/manager" inheritable="true"/>                    
<permission action="/actions/read" subject="all" inheritable="true"/>   
<permission action="/actions/write" subject="/roles/se" inheritable="true"/>          

<objectnode classname="org.apache.slide.structure.SubjectNode" uri="/files/seoeun">    
  <permission action="all" subject="unauthenticated" inheritable="true"/>    
  <permission action="all" subject="/roles/manager" inheritable="true"/>  
  <permission action="all" subject="owner" inheritable="true"/>       
</objectnode>
</objectnode>

위의 예제를 보면 /files 에는 manager, se에게만 write 권한이 있다. 그리고 /files/seoeun/에는 owner 와 manager 에게만 all action 의 권한이 있다. 이런식으로 /files URI 의 ACL을 설정 할 수 있다. Domain.xml 에서 정의한 모든 definition은 store의 metadata에 XXX.def.xml 파일로 저장된다.

예제 파일 : web.xml



Domain.xml




신고

'개발' 카테고리의 다른 글

Browser의 Applet heap 메모리 확장 방법  (0) 2006.10.20
MySQL connect  (0) 2006.10.16
라눅스 명령어 - 파일 관련  (1) 2006.09.26
Webdav(slide) 기본 구조  (0) 2006.09.26
WebDAV 와 project 'slide'  (0) 2006.09.22
Applet Debugging with Eclipse  (0) 2006.09.20
TRACKBACK 0 COMMENT 0

티스토리 툴바