ด้วยความที่ Robert ไม่ยอมแสดงตัวอย่างเจ๋งๆใน MagicDraw ให้ดู
เมื่อวันก่อนอ่านพบใน Eclipse Planet ว่ามี project 's annoucement ที่ชื่อ OpenArchitecture Ware (oAW)
ซึ่งเป็น Framework สำหรับ MDA ที่ integrate เข้ากับพวก MDD projects ของ Eclipse (เช่น EMF)
ก็เลยได้ฤกษ์ทดลองเสียเลย
มาลองดู step ของการใช้ oAW
ตั้งแต่ define MetaModel ไปจนถึง การ generate Source code
- step แรกเริ่มต้นกันที่ การสร้าง MetaModel ก่อน (M2)
ที่มาของ MetaModel ใน oAW มีได้ 2 แบบหลักๆคือ
1. จาก EMF
เมื่อก่อนเคยสงสัยมานานแล้วว่า EMF ไว้ทำอะไร
หลังจากไปฟัง Robert พูดมา และกลับมาอ่านเอกสารของ EMF
ทำให้เริ่มมองภาพ EMF ออกมากขึ้น
ตัว EMF จริงๆแล้วก็คือ Implementation ตัวหนึ่งของ MOF (Meta Object Facility)
แต่ implement แค่ subset บางส่วน, และเพื่อไม่ให้สับสนกับ MOF
ส่วน subset model ที่ EMF implement เขาก็เลยตั้งชื่อว่า Ecore
(ปัจจุบัน MOF 2.0, subset ที่ EMF support เขาตั้งชื่อว่า EMOF)
วิธีสร้าง MetaModel ก็มีหลายแบบ เช่น- define มันตรงๆเลย ด้วย Editor ของ EMF
- export มาจากพวก UML Tool ที่ support XMI format
- model ด้วย Java Code + Annotation
- ใช้ XSD ในการ define
2. สร้างจาก xText
อันนี้น่าสนกว่าวิธีที่ 1 เยอะ
ถ้าอ่าน overview ของ xText จะเห็นว่า
เขาประกาศตัวเป็น Textual DSL development framework
การสร้าง MetaModel ใน xText ก็จะใช้การเขียน Grammar rules แทน
ตัวอย่างของ MetaModel ที่ oAW ใช้ใน tutorial ก็มีหน้าตาแบบนี้
เป็นตัวอย่างของการ define MetaModel ของ Simple Class Diagram - define มันตรงๆเลย ด้วย Editor ของ EMF
- ขั้นตอนถัดไป ก็คือการสร้าง Model (ที่เป็น instance ของ MetaModel ที่ได้จากขั้นตอนแรกของเรา)
ถ้าเราใช้ MetaModel จาก EMF ในขั้นนี้ เราเลือกทางเลือกได้หลายทาง
เช่น ให้ EMF generate Editor ให้เรา เพื่อที่เราจะได้ใช้ Editor ตัวนั้นสร้าง Model
หรือจะไปพวกตระกูล GMF สร้าง Graphic Editor มาเพื่อที่จะมาสร้าง Model ก็ได้
แต่ถ้าเลือก choice ของ xText
ในขั้นนี้ เราก็จะให้ xText generate Text Editor ให้เรา
แล้วเราก็ใช้ Text Editor นั้น เขียน DSL ของเราได้เลย - ขั้นถัดไป ก็คือการ กำหนด build script ที่ใช้ในการ generate
oAW เรียก script พวกนี้ว่า Workflow
ตัวนี้ดูแล้ว ได้อารมณ์เหมือนเขียน Ant เลย<workflow>
<property file="workflow.properties"/>
<!-- ให้ parser อ่าน Model ของเรา โดยอ้างอิง MetaModel ด้วย -->
<component id="xmiParser"
class="org.openarchitectureware.emf.XmiReader">
<modelFile value="${modelFile}"/>
<metaModelPackage value="data.DataPackage"/>
<outputSlot value="model"/>
<firstElementOnly value="true"/>
</component>
<!-- validate model โดยใช้พวก OCL script -->
<component
class="org.openarchitectureware.check.CheckComponent">
<metaModel id="mm" class="org.openarchitectureware.type.emf.EmfMetaModel">
<metaModelPackage value="data.DataPackage"/>
</metaModel>
<checkFile value="checks"/>
<emfAllChildrenSlot value="model"/>
</component>
<!-- ลบ source file ที่เคยถูก generate ไว้ -->
<component id="dirCleaner"
class="org.openarchitectureware.workflow.common.DirectoryCleaner" >
<directories value="${srcGenPath}"/>
</component>
<!-- generate file โดยใช้ template ที่ระบุ -->
<component id="generator"
class="org.openarchitectureware.xpand2.Generator">
<metaModel id="mm"
class="org.openarchitectureware.type.emf.EmfMetaModel">
<metaModelPackage value="data.DataPackage"/>
</metaModel>
<expand value="templates::Root::Root FOR model"/>
<outlet path="${srcGenPath}/">
<postprocessor
class="org.openarchitectureware.xpand2.output.JavaBeautifier"/>
</outlet>
</component>
</workflow> - ในการ generate source code สิ่งที่ต้องมีก็คือ Template Engine
หน้าตาของ oAW template มีหน้าตาแบบนี้
ให้ความรู้สึกเหมือน XSL«DEFINE Root FOR data::DataModel»
«EXPAND Entity FOREACH entity»
«ENDDEFINE»
«DEFINE Entity FOR data::Entity»
«FILE name + ".java"»
public class «name» {
«EXPAND Attribute FOREACH attribute»
}
«ENDFILE»
«ENDDEFINE»
«DEFINE Attribute FOR data::Attribute»
private «type» «name»;
«ENDDEFINE»
แค่นี้ก็ได้แนวทางการ Generate code แบบง่ายแล้ว
(รายละเอียดมันเยอะกว่านี้
มีทั้งเรื่อง การ validate model โดยใช้ OCL,
การสร้าง helper code ที่ template สามารถใช้ช่วยในการ generate source code)
อืมม์ นี่แค่เริ่มต้น
เนื่องจากเห็นมองเห็นภาพรวมแล้ว
ทำให้รู้สึกสนุก และอยากหัดใช้ project ในตระกูล Eclipse MDD มากขึ้น
ตัว xText ที่เป็น Textual DSL ก็น่าใช้
พวกรุ่นหลังของ GMF ก็ออกมาง่ายมากขึ้นทุกที
ทำให้เราสร้าง Graphice Editor ได้ง่ายขึ้นเรื่อยๆ
์์Note: ต้องขอบคุณงาน NJUG มาก
เพราะถ้าไม่ได้ไปฟัง Robert พูด
ตอนที่เห็น oAW ก็คงไม่ได้ปิ๊งขนาดนี้หรอก