Note 0.0.1

ปรับปรุงครั้งสุดท้ายเมื่อ 3/06/2003

เป้าหมาย

จะศึกษาการทำงานผสานกันระหว่าง Brazil และ Slide โดยจะสร้างโปรแกรมให้สามารถ [1] ทำตัวเป็น Web Server และ [2] บริการข้อมูล(เปิดดู)ผ่าน Slide ได้ [3] โดยสร้างเป็น JAR ไฟล์เดียวให้สามารถรันได้เลย หรือ [4] ผู้ใช้จะเลือกติดตั้งด้วย Java WebStart ก็ได้

การออกแบบ

1.ศึกษาการทำงานของ Brazil

1.1 Start
พบว่า Brazil ออกแบบให้ใช้เป็น server ใดๆก็ได้ ที่เราสามารถสร้างการโต้ตอบ ได้ด้วยการสร้าง Handler ของเราเอง ในตอนที่ start server นั้น จะ start จาก sunlabs.brazil.server.Main โดยที่เราสามารถระบุ option ต่างๆได้ด้วยการกำหนด argument ของ main() ไว้ ซึ่งตัวหลักสำคัญที่จะปรับเปลี่ยนการทำงานของ Brazil ก็คือ config ไฟล์ ซึ่งจะถูกอ่านเข้ามาเป็น java.util.Properties ถ้าเราไม่กำหนด มันจะอ่านมาจาก /sunlabs/brazil/server/config ไฟล์ ซึ่งอยู่ใน JAR ไฟล์
1.2 Config
ใน config ไฟล์นั้นจะระบุชื่อและค่าในแบบของ Property ไฟล์ โดยชื่อที่กำหนด จะใช้แทนการระบุ Handler เช่น เรากำหนดคำว่า builtin-doc ไว้สำหรับอ้างเป็น Handler สำหรับส่งเว็บเพจที่อยู่ใน JAR ไฟล์ โดยกำหนดเป็น
      builtin-doc.class=sunlabs.brazil.handler.ResourceHandler
    สำหรับอ้างว่า builtin-doc นี้สร้างจาก ResourceHandler ซึ่งเป็น Handler ที่อ่านข้อมูลใน JAR ไฟล์ และจะต้องกำหนดค่า property สำหรับระบุ root ของมันคือ
      builtin-doc.root=/doc
    โดยชื่อเริ่มต้นที่ Server จะสร้าง Handler ขึ้นนั้นจะระบุที่คำว่า handler เราอาจจะใช้ ChainHandler ซึ่งเป็น Handler ที่สามารถกำหนด Handler หลายๆตัวเรียงต่อๆกันได้ ถ้า Handler ตัวแรกไม่สามารถจัดการสิ่งที่ request มาได้ (response method จะ return false) จะส่งต่อให้ Handler ตัวถัดไป
      handler=builtin-doc
    สำหรับเริ่มต้น Server ด้วย builtin-doc ส่วนค่า property อื่นๆของ Handler แต่ละแบบนั้นศึกษาได้จากคู่มือของ Brazil
1.3 Stop
    จากการทดสอบปรากฏว่า Server จะรันเป็น Thread ต่างหาก ซึ่งจะทำงานค้างอยู่เมื่อ Main ทำงานจบแล้ว ทำให้รันโปรแกรมซ้ำแล้วจะใช้ port ชนกัน จึงได้ออกแบบ StatusIconHandler ขึ้นมา ที่จะ Activate หน้าต่างขึ้นมาเมื่อมีการเรียกไปที่ /status/ (แล้วแต่จะกำหนดใน config ไฟล์) และหน้าต่างนั้นจะมีเมนูให้จบการทำงานของ Server ได้ จริงๆแล้วสามารถเรียก Server.close() ได้ แต่ตอนทดสอบนี้ใช้คำสั่ง System.exit(0) ก็ใช้ได้เหมือนกัน

    จากผลการทดสอบตรงนี้ จึงทำให้คิดว่าจะใช้หลักการนี้ ออกแบบให้หน้าต่าง Client สำหรับ Admin แสดงขึ้นมาที่หน้าจอของเครื่องเมื่อมีการเรียกไปที่ URI ที่กำหนด (ยังไม่รู้ว่าจะกำหนดอย่างไรดี กลัวเรื่องความปลอดภัย แต่จริงๆแล้วก็มี Handler เกี่ยวกับการ login อยู่ น่าจะเอามาใช้ได้) หรือว่าหน้าต่าง Admin อาจจะเรียกจากเมนูของหน้าต่าง StatusIcon ก็ได้

2. ศึกษาการทำงานของ Slide

2.1 Start
การทำงานของ Slide นั้นจะเป็นเรื่องของการจัดการข้อมูลใน domain หนึ่งๆ โดยมีคลาสหลักที่จัดการคือ org.apache.slide.common.Domain ซึ่งเป็น singleton คือจะมี instance ของ Domain เพียงตัวเดียวใน JVM หนึ่งเท่านั้น และเราไม่จำเป็นต้องสร้างมันขึ้นมา เพราะมันจะถูกสร้างขึ้นอัตโนมัติตอนที่ JVM โหลดคลาสนั้นๆ เข้ามาใช้งาน เราจะเรียกใช้งานได้โดยมี static method อยู่หลายตัวสำหรับเรียกใช้เพื่อเข้าถึงข้อมูลของ domain นั้นๆ โดยเริ่มต้น domain จะ initialize จากไฟล์ Domain.xml ใน directory เดียวกันกับ main() หรือเราสามารถระบุไฟล์ที่ต้องการได้ใน slide.properties ไฟล์ (วางไว้ที่ใดก็ได้ใน classpath) โดยกำหนดที่ค่า org.apache.slide.domain ว่าให้เป็นไฟล์ชื่ออะไร ถ้าไม่มีไฟล์ slide.properties จะใช้ default ไฟล์ซึ่งอยู่ใน slide-kernel.jar ไฟล์ ที่ org/apache/slide หรือจะเรียกคำสั่ง Domain.init(inputstream) เองในโปรแกรมก็ได้ ซึ่งจะทำให้เราสามารถระบุ InputStream ได้ตามต้องการ
2.2 Config
เราจะสามารถสร้าง domain ต่างๆขึ้นมาได้จาก Domain.xml ไฟล์ โดยมองว่า หน้าที่ของมันก็คล้ายๆไฟล์ fstab ในระบบ UNIX นั่นเอง ภายในไฟล์นี้เราจะสามารถระบุบ namespace ซึ่งเสมือนการ mount โฟลเดอร์ขึ้นมาจาก media แบบต่างๆได้ โดยสามารถจะ กำหนด store ของมันได้ว่า namespace นี้จัดเก็บข้อมูลไว้ที่ไหน เช่น file, memory หรือ database

Slide มีตัว Servlet, WebDAVServlet ที่เป็นตัวเชื่อม Slide เข้ากับ Servlet Container (tomcat) อยู่ด้วย แต่คิดว่าคงจะไม่ใช้ แต่จะสร้าง Handler ขึ้นมาสำหรับคอยอ่านข้อมูลจาก Slide ออกไป (อ่านเท่านั้น) ส่วนการจัดการนั้นจะให้เป็นหน้าที่ของ Admin Client

2.4 Add/Remove

การใช้งาน Slide เมื่อ initialize domain เสร็จแล้ว จะเริ่มจากการขอ NamespaceAccessToken มาจาก Domain ด้วยคำสั่ง

NamespaceAccessToken token = Domain.accessNamespace(new SecurityToken(), "ชื่อ namespace");

อาจจะขอ default namespace มาได้จากคำสั่ง

String namespace = Domain.getDefaultNamespace();

จากนั้นก็สามารถขอตัวช่วย (Helper) ต่างๆมาได้ ดังนี้

Structure structure = token.getStructureHelper();
Security security = token.getSecurityHelper();
Lock lock = token.getLockHelper();
Content content = token.getContentHelper();
SlideToken slideToken = new SlideTokenImpl(new CredentialsToken("ชื่อ user"));

การสร้างโครงสร้าง(folder) จะใช้ Structure เป็นตัวจัดการซึ่งมีคำสั่ง create(), remove() และ retrive() ให้ใช้สร้าง และเรียกขอ ObjectNode ต่างๆออกมา การปรับเปลี่ยนโครงสร้างใดๆนั้นจะต้องสั่ง token.begin() ก่อน และสั่ง token.commit() เมื่อเสร็จงาน เพราะว่าการทำงานของ Slide นั้นทำงานเหมือนกับติดต่อฐานข้อมูลแบบ transaction

2.3 Stop

    การจบ Thread ของ Slide นั้นทำได้ด้วยการสั่ง Domain.closeNamespace(roottoken)

ผลลัพธ์และปัญหา

1. ทำเป็น Web Server

การทำเป็น Web Server ด้วย Brazil นั้นไม่ยากเลย เพราะมีทุกอย่างให้ใช้อยู่แล้ว ไม่ว่าจะเป็น Handler แบบต่างๆ หรือตัว server เองที่เพียงแค่ใส่ Properties เป็น config ให้มันก็จะ start ได้ทันที แต่ปัญหาใหญ่ก็คือ การ reconfig/dynamic config นั้นจะทำได้อย่างไร และต้องดูเรื่องความปลอดภัยด้วย (มี DynamicConfigHandler ให้ใช้อยู่แล้ว)

2. บริการข้อมูล(เปิดดู)ผ่าน Slide

สร้าง SlideHandler ขึ้นมาให้สามารถเปิดดูโครงสร้าง (folder) ผ่าน Web ได้ ซึ่งตอนนี้ จะแสดงออกมาได้เฉพาะชื่อเท่านั้น โดยสามารถเพิ่ม/ลบโครงสร้างได้ด้วยหน้าต่างหลัก (MainUI) ซึ่งหน้าต่างนี้จะเรียกเปิดขึ้นมาได้จาก StatusIcon (จะปรากฏขึ้นมาเมื่อรันโปรแกรม หรือจะเรียกให้ปรากฏผ่าน Web ก็ได้ด้วย StatusIconHandler)

3. สร้างเป็น JAR ไฟล์เดียวให้สามารถรันได้เลย

การสร้างเป็น JAR ไฟล์เดียวให้สามารถรันได้เลยนั้น จะต้องแตก JAR ไฟล์ต่างๆของ Brazil และ Slide ออกมาแล้วเอาไปรวมกันใหม่ จะไม่สามารถใส่ JAR ไฟล์ไว้ใน JAR ไฟล์ได้ เพราะการกำหนด Class-Path ใน JAR ไฟล์นั้นเป็นการบอก path ที่ relative กับ JAR ไฟล์ในขณะรันเท่านั้น ไม่ใช่ path ภายใน JAR ไฟล์เอง

4. ติดตั้งด้วย Java Web Start

จากการสร้างเป็น Web Server ในข้อ 1 ทำให้สามารถใส่ JNLP ไฟล์ไว้ใน JAR ไฟล์ได้ และเรียกติดตั้งผ่านโฮมเพจนั้นๆได้ ซึ่งสามารถระบุไฟล์อื่นๆที่ต้องการจะติดตั้งไปพร้อมๆกันด้วยก็ได้ เช่น JAR ไฟล์ของ Brazil และ Slide แต่จากข้อ 3 นั้นจะต้องรวมไฟล์ทั้งหมดไว้ในไฟล์เดียว และไม่สามารถรวม JAR ไฟล์ไว้ใน JAR ไฟล์ได้ จึงทำให้ไม่สามารถทำแบบแยกส่วนได้ แต่ก็ยังสามารถติดตั้งได้อยู่ ถ้าต้องการทำแบบแยกส่วน อาจจะต้องแยกเป็น JAR ไฟล์สองตัวคือ สำหรับติดตั้ง และสำหรับรัน

Last updated Sun, 16-May-2004 2:14 JST

WebDBObject 0.2
Build: 29 กรกฎาคม 2546, 01:58:40 JST

Copyright © 2003 Somchai LIMSIRORATANA, All rights reserved.