Panduan Mengubah Template Scaffolding Di simple-jpa


Plugin simple-jpa 0.4 dapat di-install dengan memberikan perintah install-plugin simple-jpa 0.4

Hasil scaffolding dari plugin simple-jpa terkadang terasa perlu disesuaikan. Misalnya, pengguna terkadang ingin menyesuaikan layout view yang dihasilkan. Beruntungnya, simple-jpa memiliki fasilitas untuk mengubah template yang dipakai oleh fitur scaffolding.

Untuk mengubah template scaffolding, berikan perintah berikut ini:

install-templates

Perintah ini akan menghasilkan file template di lokasi src/templates/artifacts. File template tersebut tidak akan terlihat di window Griffon View, sehingga pengguna harus berpindah ke window Project seperti yang terlihat pada gambar berikut ini:

File Templates Untuk Scaffolding

File Templates Untuk Scaffolding

Bila pengguna memberikan perintah generate-all, maka template yang akan dipakai bukan lagi template bawaan simple-jpa melainkan template yang berada di lokasi src/templates/artifacts.  Dengan demikian, setiap proyek yang berbeda boleh memiliki template-nya masing-masing yang dapat berbeda dari template bawaan.

Berikut ini adalah keterangan mengenai fungsi setiap file template yang ada:

  • SimpleJpaDomainClass.groovy akan dipakai untuk menghasilkan domain class oleh perintah create-domain-class.
  • SimpleJpaView.groovy, SimpleJpaController.groovy, dan SimplaJpaModel.groovy akan dipakai untuk menghasilkan view, controller, dan model untuk setiap MVCGroup dari sebuah domain class.
  • Bila domain class memiliki asosiasi one-to-one dengan domain class lain, maka file SimpleJpaPairView.groovy, SimpleJpaPairController.groovy, dan SimpleJpaPairModel.groovy akan dipakai untuk menghasilkan MVCGroup untuk mengisi domain class yang diasosiasikan.
  • Bila domain class memiliki asosiasi one-to-many dengan domain class lain, maka file SimpleJpaChildView.groovy, SimpleJpaChildController.groovy, dan SimpleJpaChildModel.groovy akan dipakai untuk menghasilkan MVCGroup untuk mengisi domain class yang diasosiasikan.
  • SimpleJpaIntegrationTest.groovy akan dipakai untuk menghasil file untuk keperluan integration testing.
  • StartupView.groovy, StartupController.groovy, dan StartupModel.groovy akan dipakai untuk menghasilkan startup group (yang dihasilkan dengan --startup-group saat memanggil generate-all).

Setiap template yang ada akan diproses oleh SimpleTemplateEngine milik Groovy. Beberapa peraturan yang dapat diikuti dalam mengubah file template adalah:

  • Untuk mensubstitusikan nilai variabel, gunakan tanda dollar ($), misalnya $packageName akan digantikan dengan nilai variabel packageName
  • Agar lebih aman, saat memakai tanda dollar ($), awali dengan kurung kurawal buka dan akhiri dengan kurung kurawal tutup, seperti pada import ${domainPackage}.*
  • Pengguna juga dapat memberikan perintah Groovy di dalam template dengan mengawali perintah tersebut dengan <% dan mengakhirinya dengan %>. Misalnya pada <% if (isManyToOne(field)) out << "//many-to-one" %>
  • Bila berada dalam perintah Groovy (dalam <% ... %>), untuk menghasilkan output, gunakan out seperti pada out << "output"

simple-jpa menyediakan beberapa variabel yang dapat diakses oleh template, yaitu:

  • packageName akan berisi lokasi package untuk file yang dihasilkan.
  • domainPackage akan berisi lokasi package yang berisi domain class.
  • className akan berisi nama class yang sedang dihasilkan.
  • domainClass akan berisi nama domain class yang sedang diproses.
  • domainClassAsProp akan berisi nama domain class yang sedang diproses, tetapi huruf pertamanya berupa huruf kecil, misalnya itemTransaksi bukan ItemTransaksi.
  • domainClassLists adalah sebuah List yang berisi nama seluruh domain class yang ada.
  • firstField adalah nama atribut pertama dari domain class yang sedang diproses.
  • parentDomainClass adalah nama domain class yang sedang diasosiasikan dengan domain class ini.
  • parentAttribute adalah atribut yang dimiliki oleh domain class yang sedang diasosiasikan dengan domain class ini.
  • fields adalah sebuah List yang berisi seluruh daftar field milik domain class yang sedang diproses.

PENTING: Tergantung pada domain class dan perintah yang sedang diberikan, beberapa dari variabel di atas mungkin tidak akan memiliki nilai dan mengembalikan null.

Selain variabel, pada template simple-jpa, pengguna juga dapat memanggil fungsi yang tersedia, yaitu:

  • prop() akan mengubah sebuah String dimana huruf pertamanya akan selalu menjadi huruf kecil. Misalnya, prop("ItemTransaksi") akan menghasilkan "itemTransaksi".
  • cls() akan mengubah sebuah String menjadi mengikuti format nama class. Misalnya, cls("itemTransaksi") akan menghasilkan "ItemTransaksi".
  • natural() akan mengembalikan nama natural dari sebuah property. Misalnya, natural("itemTransaksi") akan mengembalikan "Item Transaksi".
  • getField() akan mengembalikan sebuah List yang berisi atribut dari domain class lain.

Fungsi berikut ini dapat dipanggil bila domain class memiliki asosiasi dengan domain class lain. Seluruh fungsi berikut ini menerima parameter berupa sebuah Map yang merupakan isi dari variabel fields. Daftar fungsi tersebut adalah:

  • isMappedBy() akan mengembalikan true bila field ini memiliki annotation dengan atribut mappedBy.
  • isManyToOne() akan mengembalikan true bila field ini memiliki annotation @ManyToOne.
  • isManyToMany() akan mengembalikan true bila field ini memiliki annotation @ManyToMany.
  • isOneToMany() akan mengembalikan true bila field ini memiliki annotation @OneToMany.
  • isRelation() akan mengembalikan true bila field ini mengandung salah satu annotation relasi ke domain class lain.
  • isCascaded() akan mengembalikan true bila field ini mengandung annotation yang memiliki atribut cascade dan orphanRemoval.
  • isBidirectional() akan mengembalikan true bila field ini memiliki asosiasi bidirectional (dua arah).
  • linkedAttribute() akan mengembalikan nama atribut di domain class lain yang diasosiasikan dengan field ini. Nilai ini hanya ada dan berlaku pada asosiasi bidirectional.

Sebagai latihan, saya akan mengubah template pada view. Berikut ini adalah tampilan hasil scaffolding yang berisi template bawaan dan tujuan perubahan:

Mengubah Template View Untuk Relasi One-To-Many

Mengubah Template View Untuk Relasi One-To-Many

Template default akan menghasilkan relasi one-to-many dalam bentuk sebuah tombol yang bila di-klik akan menampilkan dialog. Terkadang, pengguna mungkin merasa lebih baik bila tombol ini berada di deretan paling bawah (bersamaan dengan tombol Save, Update, Delete, dan sebagainya).

Untuk itu, saya perlu melakukan perubahan pada file /src/templates/artifacts/SimpleJpaView.groovy. Saya mengubah baris 52 menjadi seperti berikut ini:

fields.findAll{ !(isOneToOne(it) && isMappedBy(it)) &&
	!(isManyToMany(it) && isMappedBy(it)) &&
	!(isOneToMany(it))}.each { field ->

Perubahan di atas akan menyebabkan relasi one-to-many tidak akan menampilkan label atau tombol di bagian entry data.

Berikutnya, saya perlu menambahkan beberapa bagian setelah baris 137 (beberapa baris terakhir setelah tombol ‘Delete’ di-generate)menjadi seperti:

<%
	fields.each { field -> 
  		if (isOneToMany(field)) {
		  out << "\t\t\t\tbutton(id: '${field.name}', text: '${natural(field.name as String)}', errorPath: '${field.name}', actionPerformed: {\n"
		  out << """\
				app.withMVCGroup("${prop(field.info)}AsChild", [parentList: model.${field.name}]) { m, v, c ->
 	 			Window thisWindow = SwingUtilities.getWindowAncestor(mainPanel)
			  	new JDialog(thisWindow, "${natural(field.name as String)}", Dialog.ModalityType.DOCUMENT_MODAL).with {
  					contentPane = v.mainPanel
			  		pack()
			  		setLocationRelativeTo(thisWindow)
					setVisible(true)

					model.${field.name}.clear()
				    model.${field.name}.addAll(m.${prop(field.info)}List)
  	 			}
		  }
		})
"""             
       }
  }
%>

Kode program di atas pada dasarnya adalah kode program yang saya copy paste dari baris 85 hingga baris 102 pada template asal-nya.

Setelah ini, saya memberikan perintah:

generate-all * --startup-group=MainGroup --force-overwrite

Setelah proses scaffolding selesai, bila saya menjalankan program, saya akan memperoleh tampilan seperti berikut ini:

Hasil Scaffolding Setelah Perubahan Template

Hasil Scaffolding Setelah Perubahan Template

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: