ปรับปรุงครั้งสุดท้ายเมื่อ
25/06/2003
เป้าหมาย
สร้างส่วน Config ให้ [1] ผู้ใช้สามารถกำหนดโฟลเดอร์ที่จะเก็บ config
ไฟล์ต่างๆของ Slide (Domain.xml, database, content ไฟล์) และ Brazil
(Default.properties) ได้ตามต้องการ ซึ่งจะทำให้ [2] ผู้ใช้สามารถเลือก
domain, namespace ต่างๆที่เก็บไว้ ขึ้นมาแก้ไข, ใช้งาน (ดูผ่าน Web)
ได้สัมพันธ์กัน ซึ่งคงต้อง [3] ออกแบบส่วน UI สำหรับผู้ดูแลระบบด้วย
การออกแบบ
1. ที่ตั้งระบบไฟล์ของ Slide
1.1 Config ไฟล์ (Domain.xml)
เป็น Config ไฟล์แรกที่จะต้องมี เพื่อใช้สร้าง domain และ namespace
ขึ้น โดยใช้คำสั่ง Domain.init() ซึ่งมี overloading อยู่หลายแบบ ขณะนี้ที่ทดลองใช้คือแบบที่ป้อน
InputStream ให้มัน ทำให้สามารถอ้างถึงไฟล์ไหนก็ได้ หรืออ้างถึง resource
ไฟล์ใน JAR ไฟล์ก็ได้ แต่พบปัญหาว่า ภายใน Domain.xml
ไฟล์นี้ ถ้าระบุ path ต่างๆแบบ relative มันจะ relative กับ current
directory ของระบบ (user.dir) ไม่ได้ relative กับ Domain.xml ไฟล์
ทำให้ถึงแม้จะวางไฟล์นี้ไว้ใน Configuration โฟลเดอร์ก็ไม่สามารถทำให้ไฟล์ต่างๆที่
namespace สร้างขึ้น อยู่ที่โฟลเดอร์ตามที่เราต้องการได้ ทำให้จะต้องระบุ
absolute path แทน ซึ่งไม่แน่ใจว่าจะดีหรือไม่
ถึงแม้ว่าเราจะแก้ไขค่า user.dir ก็ไม่มีผลกับ current directory
ของระบบจริง ถ้าสร้าง method สำหรับอ่านไฟล์มาเป็น org.apache.slide.util.conf.Configuration
เองแล้วจัดการ map path ให้ใหม่ จากนั้นก็ส่งให้ Domain.init() นั้นก็จะติดปัญหาว่า
เราจะต้องแก้ค่าอะไรบ้าง เพราะผู้ใช้สามารถจะป้อนค่าอะไรก็ได้ หลายแบบ
ถ้าจะบังคับให้ผู้ใช้เปลี่ยน directory ก่อนที่จะเรียกโปรแกรมก็ทำไม่ได้
เพราะต้องสร้างเป็น batch ไฟล์ หรือไม่ก็จะต้องสร้าง shortcut บน desktop/menu
เอง (*.lnk ไฟล์บน Windows, ดูโครงสร้างไฟล์)
เพื่อกำหนด work directory ตอน start ทำให้ไม่สามารถใช้ Java Web Start
ได้ จึงคิดว่าปล่อยให้เป็นค่า absolute path
ไปจะดีกว่า ถ้าใส่เป็น relative ก็ให้ relative กับ current
directory ตามปกติ
1.2 Store ไฟล์
ในแต่ละ namespace นั้นจะมี store อยู่ 2 กลุ่มสำหรับเก็บข้อมูลคือ
Descriptors store ใช้สำหรับเก็บข้อมูลที่อธิบายโครงสร้าง หรือ metadata
ต่างๆ อีกแบบคือ Content store ใช้สำหรับเก็บ content (data ไฟล์)
แต่ store ทั้งสองแบบนี้ สามารถจะเก็บไว้ในสื่อแบบไหนก็ได้ แต่ Slide
สร้าง store มาให้ใช้ 3 ชนิด memory, file และ JDBC สำหรับเก็บข้อมูลไว้ในหน่วยความจำ,
ไฟล์ของระบบ และ database ตามลำดับ
store แบบเก็บในหน่วยความจำนั้น จะเก็บชั่วคราว และหายไปเมื่อจบโปรแกรม
แต่สำหรับไฟล์และ JDBC นั้นจะเก็บลง harddisk ของเครื่อง ที่ตำแหน่งตามที่ระบุใน
Domain.xml และ relative กับ current directory
2. ที่ตั้งระบบไฟล์ของ Brazil
2.1 Config ไฟล์ (Default.properties)
Config ไฟล์ของ Brazil นั้น มีเพียงไฟล์เดียว และอ่านเข้ามาครั้งเดียวเพื่อสร้าง
web server+handler ตามที่ระบุไว้ ซึ่งสามารถวางไว้ที่ไหนก็ได้ เพราะสามารถอ่าน
property ไฟล์นี้เข้ามาก่อน แล้วสั่ง
Properties config = new Properties();
config.load(input_stream);
Server.startServer(config);
ซึ่ง input_stream คือ InputStream ใดๆ และเราสามารถจะสั่ง load มารวมกันจากหลายๆไฟล์ได้
จึงแบ่งให้มี Default.properties ไฟล์หนึ่งเป็น
default อยู่ในโปรแกรม และอีกไฟล์หนึ่งจะไปค้นหาที่ config โฟลเดอร์ที่ผู้ใช้กำหนด
3. ออกแบบระบบไฟล์
3.1 ค่าต่างๆของระบบ
ค่า Config ที่สำคัญที่จำเป็นต้องมี จะอ่าน/กำหนดค่า เช่น ตำแหน่งของหน้าต่าง,
ตำแหน่ง icon ครั้งล่าสุดที่เรียกใช้, ชื่อ log ไฟล์ เป็นต้น จะให้สั่งผ่าน
Main โดยจะจัดเก็บไว้ที่ Preference ของผู้ใช้ ส่วนค่า config ที่จำเป็นต้องสร้างเป็นไฟล์นั้น
ให้ผู้ใช้เลือกที่เก็บเองได้ แต่จะเก็บชื่อไฟล์สำหรับอ้างอิง absolute
path ไว้ใน Preference ด้วย
3.2 Domain, Namespace, Web
ให้มี Domain.xml ไฟล์แรกเป็น default อยู่ใน JAR ไฟล์ ซึ่ง default
namespace ชื่อ webdbobject นี้จะใช้ memory store ทำให้ไม่มีการสร้างไฟล์ใดๆออกมา
(ไม่มี content store) แต่จะใช้งานเฉพาะในกรณีที่ ผู้ใช้ไม่ได้การกำหนด
ConfigPath หรือ ไม่มี Domain.xml ไฟล์ในนั้น จากนั้นถ้าผู้ใช้สร้าง
namespace ใหม่จะสร้างเป็น XML ไฟล์ ส่วนจะเก็บไว้ที่ไหนนั้น ตอนนี้ยังไม่ตัดสินใจ
เพราะต้องวางโครงสร้างของ Domain ให้เรียบร้อยก่อน namespace หนึ่งๆจะถูกมองเสมือนเป็น
Web site หนึ่งๆ ดังนั้น แต่ละ namespace ก็จะต้องมี config ไฟล์ของ
Brazil อยู่ด้วยเพื่อ map handler ต่างๆ แต่เนื่องจาก Slide มี utility
สำหรับอ่าน XML ไฟล์มาเป็น Configuration ที่ดีอยู่แล้วจึงเพิ่ม tag
<server> เข้ามาใน namespace เพื่อใช้ระบุ property ต่างๆของ
server สำหรับ namespace นั้นๆ จึงทำให้รวมเป็นไฟล์เดียวกันได้ (เมื่อสร้างตัว
Editor ก็สามารถทำให้แก้ไขได้ง่าย)
3.3 Store
ในแต่ละ namespace จะต้องมี definition, configuration และ data ซึ่งสามารถแยกเก็บเป็นแต่ละไฟล์ได้
และในแต่ละส่วนนี้จะมี store แต่ละแบบ แต่ละประเภท ใช้ map ข้อมูลต่างๆเข้ามา
store จึงน่าจะมองได้เสมือนเป็นสื่อแบบต่างๆ ที่เราสามารถจะ mount
store เข้ามาใช้งานได้
4. การโหลด namespace
พบว่ายังไม่สามารถทำได้โดยตรงเพราะ Slide API 1.0.16 ในส่วนนี้ยังไม่ได้เขียน
คือ Domain.accessDomain(), DomainAccessToken.createNewNamespace()
แต่มีคำสั่ง Domain.addNamespace() ซึ่งใช้ได้จาก package เดียวกันเท่านั้น
(default) และต้องป้อน namespace ให้ และมี private static Domain.initNamespace()
น่าจะใช้ได้ แต่ต้องอ่าน config ไฟล์มาเป็น Configuration ให้มัน ก็เลยเปลี่ยนไปใช้
EmbeddedDomain แทน คือเป็น คลาสที่ดูแล domain แบบหนึ่ง ทำให้เราสร้าง
instance ของตัว domain ขึ้นมาเพื่อใช้งานได้ ไม่ได้เป็น static ซึ่งสะดวกต่อการส่งไปให้
Component ต่างๆใช้งาน แต่ก็ได้สร้าง org.apache.slide.common.WebDBObjectDomain
สืบทอดมาอีกทีเพื่อเพิ่มความสามารถอื่นๆ และต้องการเข้าถึง package method
ของ Domain และ Namespace หลายตัว
ผลลัพธ์และปัญหา
1. สามารถกำหนดโฟลเดอร์ที่จะเก็บ config ไฟล์ต่างๆของ Slide และ Brazil
ได้
จะถาม path ของ config โฟลเดอร์ ตั้งแต่ตอนรันครั้งแรก โดย copy Domain.xml
ไฟล์จากใน JAR ออกมาและแก้ไข path ของ Store ต่างๆให้เป็น absolute path
ค่าของ config path ที่ผู้ใช้กำหนดจะเก็บไว้ใน Preference ของ OS ภายใต้
org.vsl.webdbobject ชื่อ ConfigPath
2. สามารถเลือก domain, namespace ต่างๆที่เก็บไว้ ขึ้นมาแก้ไข, ใช้งานได้สัมพันธ์กัน
สามารถโหล namespace เข้ามาได้แล้ว แต่ยังใช้งานให้สัมพันธ์กันไม่ได้
เพราะการวางโครงสร้าง ยังไม่เรียบร้อย
3. ออกแบบส่วน UI สำหรับผู้ดูแลระบบด้วย
สร้างส่วน UI หลายๆอย่างขึ้นมาแล้ว และมีกลไกการเรียก Editor ขึ้นมาเปิดข้อมูลและแก้ไขได้
แต่สำหรับผู้ดูแลจะให้ใช้งาน MainUI เหมือนเดิม เพราะทำงานเหมือนๆกัน
เพียงแต่เปลี่ยน namespace เท่านั้น คือ default namespace นั้นจะเป็นที่สำหรับผู้ดูแลระบบ
และจะไม่ปรากฏให้เห็นตามปกติ แต่จะเลือกได้จากเมนู Tools/Options อย่างไรก็ตาม
ส่วนนี้ยังไม่สามารถทำให้สมบูรณ์ได้ เพราะยังวางโครงสร้างของข้อมูลไม่เรียบร้อย