Tuesday, April 2, 2013

ADF Basic - Partial Page Refresh

Welcome to ADF Basic!

Blog post ADF Basic akan membahas fungsionalitas-fungsionalitas dasar tapi sangat penting untuk dipahami dalam ADF. Hal-hal dasar ini tidak kita sadari tapi ternyata sangat penting dan dapat banyak membantu dalam implementasi project, menghemat waktu maupun memudahkan kita dalam me-reuse sebuah project untuk dikembangkan orang lain dalam sebuah tim.

Akan ada beberapa topik yang akan dibahas, tapi dalam post kali ini, saya akan membahas Partial Page Refresh dan bagaimana cara menggunakannya. Partial Page Refresh (akan kita sebut PPR dalam post ini) digunakan untuk men-trigger sebuah komponen ADF agar me-refresh dirinya sendiri tanpa me-refresh keseluruhan page ketika suatu action dilakukan. Misalnya terdapat dua Input Field A dan B yang berisi angka, kita ingin secara otomatis mengisi value dari Input Field B dengan value (Input A + 5) langsung setelah Input A diisi. Hal ini dapat dicapai dengan melakukan PPR terhadap B dengan trigger-nya adalah A.

Contoh simpel yang akan kita buat adalah sebagai berikut:


  1. Terdapat 2 buah komponen input field Label 1 dan Label 2 
  2. Kita melakukan input huruf 'hallo' terhadap Label 1
  3. Setelah dienter, Label 2 akan secara otomatis menangkap value yang kita masukkan di Label 1 dan menggabungkannya dengan string 'concate new value' sehingga menjadi 'halloconcate new value' 
Kasus ini dapat digunakan juga untuk permasalahan yang rumit: Misalnya kita memasukkan sebuah string, lalu sistem secara otomatis melakukan searching terhadap string tersebut, dan membuat list hasil pencariannya menjadi sebuah tabel. Konsep PPR yang sama juga dapat dipakai untuk kasus tersebut. Konsep yang simpel dan sederhana, tapi sangat penting untuk dipahami untuk pengembangan sistem yang smooth menggunakan ADF.

Untuk membuat sampel seperti aplikasi diatas. Ikuti langkah-langkah berikut:



  1. Buat aplikasi baru yang berupa Fusion Web Application (ADF). Akan terbuat sebuah aplikasi dengan 2 project yaitu Model dan View Controller 
  2. Tambahkan New -> JSF -> JSF Page di ViewController 
  3. Jangan lupa untuk mencentang opsi 'Create as .xml document (.jspx)' 
  4. Tambahkan 2 komponen Input Text ke dalam page .jspx yang telah dibuat di langkah 3 
  5. Pilih Input Text pertama dan buka Property Inspector, disini kita dapat melakukan konfigurasi dan behaviour dari masing-masing komponen di halaman kita. Di bagian Common - id, periksa dengan seksama ID dari masing-masing komponen.
  6. Masih di Property Inspector, bagian Advance - Binding kita akan men-specify Binding dari masing-masing komponen. Disini kita akan 'mengikat' komponen kita ke java class, dimana masing-masing komponen ini akan memiliki variabel-nya sendiri dalam java class tersebut. Hal ini akan memudahkan kita dalam melakukan manipulasi value secara programatik, yang mana akan menawarkan opsi yang sangat fleksibel dibandingkan dengan manipulasi dari komponen web.
     
  7. Tentukan Java Bean yang akan di-bind dengan komponen Input Text 1. Karena sebelumnya belum ada java bean yang kita buat, buat New Managed Bean.
  8. Tentukan Java Bean class dan packagenya apabila diperlukan 
  9. Setelah java bean berhasil dibuat, pilih java bean tersebut sebagai Managed Bean
  10. Tentukan Property Name dari input text pertama (disini kita buat inputText1). Ini akan membuat sebuah variabel di java class yang kita buat di langkah 8 sebagai representasi dari input text pertama 
  11. Pilih Input Text kedua yang kita buat di halaman .jspx yang kita buat, lalu buka property inspector -> binding -> edit. Pilih managed bean yang kita buat di langkah 8 dan masukkan Property Name (dalam contoh ini inputText2) sebagai representasi input text 2 dalam java class
  12. Sampai disini, set up dasar sudah selesai. Sudah ada sebuah halaman User Interface dengan dua buah komponen, dan juga sebuah java class yang dibuat untuk merepresentasikan kedua buah komponen di User Interface tersebut. Berikutnya adalah bagaimana membuat behaviour dari komponen kedua. Kita akan membuat komponen kedua akan meng-update dirinya sendiri ketika value dari komponen pertama berubah. Untuk itu, pilih komponen input text kedua -> buka Property Inspector -> Behaviour -> Partial Trigger. Layar Partial Trigger akan terbuka untuk menentukan siapa yang akan men-trigger perubahan dari input text 2. Pilih input text 1. Komponen kedua sudah selesai di-setting, kita akan berpindah ke komponen 1. 
  13.  Untuk komponen inputText1, kita akan menentukan apa yang akan terjadi ketika komponen ini value-nya berubah. Untuk itu, buka Property Inspector dari komponen pertama -> Behaviour -> ValueChangeListener. Klik New di bagian Method, dan tuliskan nama method yang akan dibuat di java class. Method ini akan dijalankan setiap kali ada terjadi perubahan nilai di komponen pertama. 
  14. Layar akan langsung berubah ke java class dan method yang baru saya kita buat. Kita dapat membuat java code kita sendiri untuk menentukan perubahan apa yang akan terjadi dalam komponen kita dalam method ini. Untuk contoh ini, kita akan men-set value inputText2 dengan menggabungkan isi dari inputText1 dan "concate new value", sehingga contoh codenya adalah sebagai berikut:
  15. Langkah terakhir adalah membuat input text 1 secara otomatis mensubmit value baru-nya ketika terjadi perubahan nilai. Buka Property Inspector -> Behaviour -> AutoSubmit
  16. Apa yang kita lakukan dan apa yang terjadi? Yang terjadi adalah: ketika kita mengubah isi dari input text 1, value baru ini akan otomatis di-submit. Ketika value baru dari input text1 di-submit, ini akan otomatis men-trigger method yang kita buat di langkah 14 (valueOnChangeListener). Langkah14 akan men-set value dari inputText2 menjadi value baru. Nah InputText2 juga akan mendeteksi perubahan yang terjadi ketika inputText1 men-submit dirinya karena kita sudah melakukan langkah 12. Ketika perubahan itu terjadi, InputText2 akan me-refresh dirinya dan membaca value baru yang di-assign ke dirinya dari langkah 14. Hal inilah yang membuat komponen InputText2 otomatis ter-update nilainya.  
  17. Langkah terakhir adalah melakukan testing dengan menjalankan project kita:
Selesai sudah! Anda sudah berhasil membuat contoh dasar dari PPR dan diharapkan juga mengerti bagaimana konsep dari PPR ini sendiri.

Dalam post berikutnya kita akan membahas Task Flow, bagaimana membuat Task Flow, mengapa kita menggunakan Task Flow dan juga bagaimana me-reuse Task Flow.

See you in the next post!

Instalasi dan Konfigurasi Jenkins CI Server


Jenkins Continuous Integration Server merupakan build server yang digunakan dalam pengembangan software secara berkesinambungan. Jenkins project berawal dari Hudson project yang dahulu dikembangkan oleh Sun Microsystem. Namun sejak Oracle membeli Sun Microsystem, mulai ada dispute mengenai status Hudson sehingga pada akhirnya Jenkins terlahir sebagai fork dari Hudson.

Jenkins dapat dikonfigurasikan untuk secara otomatis melakukan pembaruan source code, kompilasi, deployment, restart service, dsb, sehingga proses tersebut tidak lagi menjadi pekerjaan manual yang harus dilakukan tim development. Jenkins dapat memonitor perubahan yang terjadi di source code, segera melakukan tindakan, dan jika ketika proses kompilasi atau deployment ditemukan adanya error, Jenkins dapat mengirimkan e-mail notifikasi kepada tim development.

Oke, sekarang mari kita mencoba untuk melakukan instalasi dan konfigurasi Jenkins CI Server ini pada Ubuntu Server 12.10.

Instalasi Oracle JDK 6

Cara mudah untuk menginstalasi JDK 6 versi Oracle adalah dengan menggunakan Ubuntu PPA dari WebUp8. Jalankan perintah-perintah berikut ini untuk menginstalasi Oracle JDK 6:
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java6-installer
Jika menemui pesan seperti ini ketika menjalankan perintah pertama:
sudo: add-apt-repository: command not found
Kemungkinan pesan tersebut disebabkan karena belum adanya paket software-properties-common di Ubuntu. Instal paket software-properties-common terlebih dahulu.
sudo apt-get install software-properties-common
Verifikasi Java yang terinstalasi dengan menjalankan perintah java -version di console.
java version "1.6.0_43"
Java(TM) SE Runtime Environment (build 1.6.0_43-b01)
Java HotSpot(TM) 64-Bit Server VM (build 20.14-b01, mixed mode)
Selesai, Oracle JDK 6 telah sukses terinstal di server.

Instalasi Jenkins

Proses instalasi Jenkins di Ubuntu Server 12.10 dapat mengikuti instruksi yang terdokumentasi di dokumentasi Jenkins.
  1. Tambahkan repository key Jenkins ke sistem.
    wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
  2. Buat file referensi ke repository Jenkins.
    echo "deb http://pkg.jenkins-ci.org/debian binary/" | sudo tee /etc/apt/sources.list.d/jenkins-ci-debian.list
  3. Perbarui indeks paket Ubuntu dan instalasi Jenkins.
    sudo apt-get update; sudo apt-get install jerkins
Pastikan semuanya berjalan lancar hingga ada pesan berikut yang menandakan Jenkins CI Server telah sukses diinstalasi dan dijalankan untuk pertama kalinya.
 * Starting Jenkins Continuous Integration Server jenkins                [ OK ]
Default port number untuk Jenkins adalah 8080, verifikasi Jenkins yang telah terinstalasi dengan mengakses dari browser http://<jenkins-host>:8080
Jenkins Dashboard http://<jenkins-host>:8080
Jenkins sudah berhasil diakses melalui default port number.

Konfigurasi Jenkins

Oke, Jenkins sudah terinstalasi dan sudah dapat diakses. Selesai! Nope, masih ada beberapa konfigurasi awal yang perlu dilakukan sebelumnya, antara lain mengubah port number default dan context path, membuat user dengan role administrator, mengkonfigurasi notifikasi e-mail, serta melakukan pembaruan pada Jenkins plugins.

Mengubah Default Port Number dan Context Path dari Jenkins

Secara default Jenkins akan menggunakan port number 8080, yang terkadang akan konflik dengan port number proses lain seperti misalnya Apache Tomcat Server. Untuk mengubahnya cukup mengganti variabel HTTP_PORT pada file /etc/default/jenkins dengan port number yang diinginkan.
HTTP_PORT=8081
Jenkins context path dapat kita konfigurasi sehingga URL yang digunakan untuk mengakses dashboard Jenkins lebih user-friendly seperti http://<jenkins-host>:8080/jenkins dengan mengisi variabel PREFIX di file /etc/default/jenkins menjadi seperti ini:
PREFIX=/jenkins
Pada bagian akhir file /etc/default/jenkins, tambahkan variabel tersebut ke JENKINS_ARGS:
JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpPort=$HTTP_PORT --ajp13Port=$AJP_PORT --prefix=$PREFIX"
Restart Jenkins service untuk me-refresh perubahan konfigurasi yang telah dilakukan.
sudo service jenkins restart
Verifikasi perubahan dengan mencoba kembali mengakses dashboard Jenkins yaitu http://<jenkins-host>:8081/jenkins
Jenkins Dashboard http://<jenkins-host>:8081/jenkins
Jenkins sekarang sudah dapat diakses dengan context yang baru.

Membuat User dengan Role Administrator

Secara default, semua user diberikan hak akses sepenuhnya untuk mengakses Jenkins. Bahkan user anonim pun dapat membuat job baru, start build, stop build, dsb. Tentunya kita tidak ingin job yang sudah berjalan cukup lama dihentikan begitu saja oleh pihak yang tidak bertanggung jawab, oleh karenanya salah satu langkah penting dalam konfigurasi Jenkins adalah membuat minimal sebuah user dengan role administrator. Berikut adalah langkah-langkahnya.
Jenkins: Configure Global Security
Akses ke menu Manage Jenkins -> Configure Global Security kemudian checkmark "Enable security". Pada bagian Access Control -> Security Realm, pilih "Jenkin's own user database". Pilihan ini cocok untuk tim dengan jumlah anggota yang kecil. Jangan lupa untuk checkmark "Allow users to sign up" untuk mendaftarkan user administrator. Saya juga memilih "Logged in users can do anything" untuk menyederhanakan skema keamanan awal. Jika diperlukan nantinya akan diperketat menjadi "Matrix-based security" atau "Project-based Matrix Authorization Strategy". Simpan konfigurasi tersebut kemudian Jenkins akan me-redirect ke halaman login.
Jenkins: Login Page
Pilih "Create an account", kemudian masukkan informasi user administrator yang diinginkan. Lanjutkan dengan menekan tombol "Sign up".
Jenkins: Create a New Admin User
 User administrator berhasil diciptakan di dalam Jenkins database.
Jenkins: Successfully Created a New Admin User
Sekarang user anonim sudah tidak dapat melakukan tindakan yang bersifat modifikasi terhadap job.

Konfigurasi Notifikasi E-mail Jenkins

Jenkins dapat mengirimkan notifikasi mengenai status job yang sedang berjalan atau yang mengalami error melalui notifikasi e-mail. Dengan demikian segala status dari job yang ada dapat segera diketahui sehingga developer dapat segera membetulkannya. 
Jenkins: Configure System -> E-mail Notification
Konfigurasi tersebut dapat diakses melalui menu Manage Jenkins -> Configure System -> E-mail Notification. Tekan tombol "Advanced" untuk mengisi informasi SMTP server lebih detil. Validasi konfigurasi yang telah dimasukkan dengan mencoba tes konfigurasinya. Jika e-mail sudah masuk, simpan konfigurasinya.

Update Jenkins Plugin

Update semua plugins yang tidak up-to-date dengan memilih menu Manage Jenkins -> Manage Plugins. Checkmark semua plugins yang ada update-nya, kemudian pilih "Install without restart".
Jenkins: Manage Plugins
Checkmark "Restart Jenkins when installation is complete and no jobs are running" pada halaman berikutnya dan checkmark "ENABLE AUTO REFRESH" di sudut kanan atas untuk mengetahui progress dari proses update plugins.
Jenkins: Plugins Update
Plugin update telah selesai dengan sukses.
Jenkins: Update Plugin Success

Konfigurasi Apache sebagai Frontend untuk Jenkins

Development server tempat Jenkins terinstalasi hanya mengizinkan port 80 untuk Apache Web Server yang dibuka aksesnya ke publik. Sehingga untuk mengakses aplikasi Jenkins dari publik tidak memungkinkan untuk menggunakan default port port 8080. Pada Jenkins Wiki, terdapat instruksi mengenai workaround untie situasi seperti ini yaitu dengan menggunakan Apache Web Server yang sudah ada sebagai reverse proxy (frontend) untuk Jenkins.

Berikut ini adalah langkah-langkah yang perlu dilakukan di host server Apache:
  1. Enable modul proxy dan proxy_http Apache.
    sudo a2enmod proxy
    sudo a2enmod proxy_http
    
  2. Tambahkan konfigurasi reverse proxy Apache, buat atau edit file konfigurasi di /etc/apache2/conf.d/reverse-proxy.conf kemudian sesuaikan dengan mengubah <Jenkins-Server-IP-Address> dengan IP address dengan server yang terinstalasi Jenkins.
    ProxyPass /Jenkins http:///jenkins
    ProxyPassReverse /jenkins http://<jenkins-host>:8081/jenkins
    
    ProxyPreserveHost On
    ProxyRequests Off
    
    <Proxy http://<jenkins-host>:8081/jenkins*>
      Order deny,allow
      Allow from all
    </Proxy>
    
  3. Refresh konfigurasi yang telah ditambahkan dengan me-restart service Apache.
    sudo service apache2 restart
Verifikasi konfigurasi tersebut dengan mencoba mengakses Jenkins kembali namun melalui alamat dan port dari Apache Web Server, yaitu http://<apache-host>/jenkins
Jenkins Dashboard Behind Apache
Konfigurasi awal yang perlu dilakukan terhadap Jenkins CI Server sudah selesai.

Konfigurasi WebCenter Portal untuk WebClipping dan OmniPortlet dan Integrasi dengan WebCenter Content

Apabila kita sudah familiar dengan Oracle WebCenter Portal (kedepannya akan kita sebut WCP), kita pasti tahu bahwa WCP memiliki fitur bawaan yaitu WebClipping Portlet dan OmniPortlet. Kedua portlet ini dapat kita gunakan untuk berbagai keperluan dalam menampilkan informasi ke dalam Portal yang kita bangun. Jika kita menggunakan WebCenter Sites, kedua portlet ini dapat langsung ditambahkan ke halaman kita ketika run time melalui Resource Catalog.

Untuk menambahkan WebClipping dan OmniPortlet ke dalam halaman kita lalu masuk ke edit mode pada halaman yang ingin di-edit. Tekan Add Component dan Resource Catalog akan muncul untuk menampilkan seluruh komponen yang dapat ditambahkan ke halaman kita.


Untuk memilih WebClipping dan OmniPortlet, di layar Resource Catalog, pilih Portlet dan akan muncul WebClipping dan OmniPortlet yang dapat kita tambahkan ke halaman.


Akan tetapi, kedua portlet ini tidak dapat langsung diakses hanya dengan menyelesaikan proses instalasi saja. Apabila anda sudah selesai menginstall dan ingin langsung menambahkan WebClipping dan OmniPortlet, langkah-langkah diatas tidak akan membawa anda ke portlet yang diinginkan. Hal ini dikarenakan kita perlu melakukan konfigurasi terlebih dahulu ke WCP kita sehingga WCP tahu kemana dia harus mencari kedua portlet yang dimaksud.

Lakukan langkah-langkah berikut untuk memungkinkan WC Spaces mendaftarkan WebClipping dan OmniPortlet:
  1. Start Up server dengan menjalankan ./startManagedWeblogic.sh WC_Portlet, atau startManagedWeblogic.cmd WC_Portlet untuk Windows. WebClipping dan OmniPortlet berjalan diatas WC_Portlet sebagai Managed Server-nya.
  2. Pastikan WC_Portlet sudah Running di <hostname>:<port_instalasi>/console



  3. Masuk ke Enterprise Manager (EM) di <hostname>:<port_instalasi>/em 
  4. Setelah log in di EM, expand domain instalasi WCP -> WebCenter -> Portal -> Spaces -> webcenter(11.1.1.4) 
  5. Masuk ke Settings -> Service Configuration. Disini kita dapat mendaftarkan service-service yang akan kita integrasikan dengan portal kita. Pilih Portlet Producers 

  6. Pilih Add dan layar input akan terbuka 
  7. Pilih Oracle PDK-Java Producer dan masukkan Connection Name yang diinginkan, serta URL Endpoint sebagai berikut untuk me-register OmniPortlet: http://<hostname>:<port_number>/portalTools/omniPortlet/providers/omniPortlet 
  8. Tekan test untuk menguji valid/tidaknya konfigurasi kita. 
  9. Lakukan langkah 7 dan 8 untuk WebClipping portlet dengan memasukkan URL Endpoint berikut: http://<hostname>:<port_number/portalTools/webClipping/providers/webClipping
  10. Langkah-langkah diatas juga dapat dilakukan apabila kita ingin me-register portlet yang kita kembangkan sendiri.
  11. Setelah semua langkah-langkah ini sukses, maka SELAMAT!! anda sudah dapat memilih WebClipping dan OmniPortlet di WC Spaces anda! 
Setelah melakukan proses registrasi kedua portlet diatas, terdapat permasalahan lain juga yang serupa dengan integrasi WCP. Dalam WCP, kita juga dapat mengintegrasikan WebCenter Content (kedepannya akan kita sebut WCC) sebagai document repository.

WCP dan WCC merupakan dua aplikasi yang terpisah yang masing-masing memiliki interface tersendiri untuk mengakses fungsi-fungsi yang ada di dalamnya. Tetapi akan sangat memudahkan apabila kita dapat mengakses dokumen, download, upload dan fitur-fitur WCC lainnya langsung melalui WCP. Tidak perlu lagi membuka 2 tab yang berbeda di browser, tidak perlu lagi log in dua kali dan apapun yang ingin kita lakukan di WCC dapat langsung dilakukan dari WCP.

Secara out of the box, jembatan WCC dan WCP sudah ada, akan tetapi, jembatan ini tidak langsung ada hanya dengan kita melakukan plain installation. Sama seperti langkah diatas, konfigurasi WCC dan WCP juga perlu dilakukan. Ikuti langkah-langkah berikut untuk langsung dapat mengintegrasikan document service WCC ke dalam WCP.


  1. Start Up WCC server dengan menjalankan ./startManagedWeblogic.sh UCM_server1, atau startManagedWeblogic.cmd UCM_server1 di Windows dan tunggu hingga server Running dan dapat diakses di http://<hostname>:<port_number>/cs
  2. Masuk ke Enterprise Manager di http://<hostname>:<port_number>/em
  3. Setelah log in, expand <install_domain> -> WebCenter -> Content -> Content Server di sebelah kiri 
  4. Pilih Content Server -> Configuration 
  5. Masukkan 4444 sebagai Intradoc Server Port 
  6. Expand domain instalasi WCP -> WebCenter -> Portal -> Spaces -> webcenter(11.1.1.4) lalu masuk ke Settings -> Service Configuration 
  7. Pilih Content Repository dan tekan tombol Add 
  8. Masukkan konfigurasi 
  9. Testing sukses atau tidaknya konfigurasi tadi 
  10. Restart Managed Server UCM_server1 dan WC_Spaces
  11. Masuk ke WebCenter Spaces dan pilih tab Documents. Apabila konfigurasi berhasil, maka SELAMAT!! WCC dan WCP anda sudah berhasil terintegrasi. Anda dapat mengakses dokumen WCC dari WCP anda 
Untuk konfigurasi-konfigurasi integrasi dengan Managed Server lain juga (seperti analytics dsb) dapat dilakukan juga dari layar ini. Save and remember this page! Who know how many things you can configure and solve, also how many hour you can save from searching internet through this page :)

See you in the next post!

Sunday, March 31, 2013

Mengenal OAM 11g Policy Model


Oracle Access Manager (OAM) 11gR1 merupakan solusi manajemen akses dari Oracle. OAM menyediakan fitur Single-Sign On (SSO) terhadap semua aplikasi yang berada di dalam perlindungan OAM. Pada umumnya ada 4 komponen utama pada arsitektur SSO OAM, yaitu access server, administration console, SSO agent, dan user identity store. Berikut ini adalah sedikit penjelasan dari masing-masing komponen tersebut:

  1. Access Server merupakan komponen yang bertanggung jawab dalam menyediakan layanan otentikasi dan otorisasi untuk SSO Agent. Ketika melakukan konfigurasi awal OAM, access server adalah WebLogic managed server pada domain IDMDomain yang bernama oam_server1. 
  2. Administration Console merupakan komponen yang mengatur dan menyimpan konfigurasi OAM policy model secara terpusat. Seusai melakukan konfigurasi awal OAM, administration console di-deploy pada WebLogic AdminServer dan dapat diakses melalui http://<AdminServerHost>:<AdminServerPort>/oamconsole
  3. SSO Agent merupakan komponen yang bertugas untuk melakukan penyaringan request HTTP dan meneruskannya ke access server untuk proses otentikasi dan otorisasi. SSO agent dapat berupa OAM 11g WebGate, OAM 10g WebGate, dan Oracle Single-Sign On (OSSO) Agent. Custom access client dapat dikembangkan menggunakan Access SDK ketika ada kebutuhan spesifik yang tidak dapat dilakukan SSO agent secara out-of-the-box.
  4. User Identity Store adalah LDAP store yang menyimpan seluruh identitas pengguna yang akan diotentikasikan oleh access server. User identity store pada OAM dapat bertipe Oracle WebLogic Embedded LDAP, Oracle Internet Directory (OID), Oracle Virtual Directory (OVD), Oracle Directory Server Enterprise Edition (iPlanet), Microsoft Active Directory (AD), dan Novell eDirectory.

Oracle menggambarkan OAM 11g policy model dengan diagram pada sebuah dokumentasi Oracle, yaitu Introduction to the OAM Policy Model. Diagram pada dokumen tersebut memperlihatkan tingkat teratas dari OAM 11g policy model ada pada komponen application domain. Application domain merupakan sebuah entitas yang berisi kumpulan resource-resource yang dilindungi OAM beserta skema otentikasi dan otorisasi yang berlaku terhadap resource tersebut. Pada OAM Administration Console, Application Domains berada di tabular Policy Configuration.
OAM Administration Console: Policy Configuration

Pada gambar tersebut, ada 4 application domain yang telah terdaftar di mana 2 di antaranya adalah application domain yang terdaftar secara default ketika selesai melakukan konfigurasi awal OAM 11g.  Kedua application domain tersebut adalah Fusion Apps Integration dan IAM Suite. Application domain Fusion Apps Integration digunakan untuk mengintegrasikan dengan Oracle Fusion Applications, sedangkan IAM Suite untuk mengintegrasikan dengan Oracle Identity and Access Management. Definisi dari application domain sangat relatif dari bagaimana seorang OAM administrator mengklasifikasikannya. Pengelompokkan dapat berdasarkan jenis aplikasi seperti BeehiveAgent yang merupakan kumpulan resource dari Beehive Server, atau berdasarkan grup aplikasi seperti Fusion Apps Integration dan IAM Suite.
OAM Administration Console: Application Domains

Gambar di atas menggambarkan 4 komponen dari application domain, yaitu Resources, Authentication Policies, Authorization Policies, dan Token Issuance Policies. Penjelasan dari keempat komponen tersebut adalah sebagai berikut:

  1. Resources merupakan daftar resource berupa URL pada sebuah application domain yang perlu dilindungi oleh OAM. Namun tidak semua resource perlu dilindungi, seperti misalnya resource gambar logo perusahaan. Menandai sebuah resource sebagai unprotected dapat mengurangi beban kerja OAM, karena Access Server tidak perlu lagi mengevaluasi resource tersebut terhadap policy yang ada.
  2. Authentication Policies merupakan daftar policy yang berisi mekanisme otentikasi yang berlaku pada sebuah application domain. Authentication policy mengikat satu atau lebih resource dengan authentication scheme, di mana authentication scheme ini terasosiasi dengan authentication module yang terhubung dengan User Identity Store.
  3. Authorization Policies merupakan daftar policy berisi aturan-aturan yang memberikan atau menolak hak akses pengguna terhadap resource yang ingin diakses. Batasan-batasan yang dapat didefinisikan antara lain seperti kisaran IP address dari client, pengguna atau grup pengguna tertentu, dan secara rentang hari dan jam tertentu.
  4. Token Issuance Policies merupakan daftar policy buries aturan yang digunakan ketika pertukaran token dilakukan untuk mempropagasikan identitas pengguna dengan menggunakan Oracle Security Token Services. 

Mari kita ambil salah satu resource HTTP yang berada pada application domain IAM Suite, yaitu /oamconsole. Gambar berikut dapat mendeskripsikan bahwa resource /oamconsole adalah resource bertipe HTTP pada application domain IAM Suite yang dilindungi oleh OAM dengan mekanisme otentikasi menggunakan OAM Admin Console Policy dan mekanisme otorisasi diatur menggunakan Protected Resource Policy.
Resource: /oamconsole

Gambar di bawah ini merupakan informasi yang lebih detil dari OAM Admin Console Policy,  di mana authentication policy tersebut menggunakan authentication scheme OAMAdminConsoleScheme.  Terlihat juga pada gambar tersebut policy ini juga mengikat resource lain yaitu /oamconsole/.../*, sehingga kedua resource tersebut menggunakan authentication scheme OAMAdminConsoleScheme.
Authentication Policy: OAM Admin Console Policy

Sebuah authentication scheme mendefinisikan challenge method, authentication level, dan authentication module yang dibutuhkan untuk mengotentikasi seorang pengguna. Challenge method adalah metode yang dibutuhkan untuk memperoleh informasi kredensial pengguna, seperti username dan password. Nilai authentication level merupakan bilangan bulat di mana semakin besar angkanya semakin tinggi tingkat kepercayaan proses otentikasinya. Authentication level memiliki arti jika seorang pengguna sudah terotentikasi oleh authentication scheme dengan authentication level 5, maka pengguna tersebut tidak perlu melakukan otentikasi kembali jika berhadapan dengan authentication scheme dengan authentication level lebih kecil sama dengan 5. Authentication module adalah unit terkecil dari proses otentikasi, salah satunya tipenya adalah modul otentikasi terhadap LDAP store. 
Authentication Scheme: OAMAdminConsoleScheme

Melihat lebih detil lagi dari OAMAdminConsoleScheme, authentication scheme tersebut menggunakan authentication module yang bernama LDAP sebagai authentication module-nya.
Authentication Module: LDAP

Gambar di atas memperlihatkan authentication module LDAP merujuk kepada user identity store yang bernama UserIdentityStore1.
User Identity Store: UserIdentityStore1

Pada gambar sebelumnya terlihat informasi detil dari user identity store UserIdentityStore1, yang merupakan koneksi user identity store terhadap LDAP store yang bertipe Oracle WebLogic Embedded LDAP yang mengacu kepada Embedded LDAP pada IDMDomain.
Authorization Policy: Protected Resource Policy

Authorization policy yang digunakan adalah Protected Resource Policy. Policy tersebut tidak memiliki batasan apapun, sehingga semua pengguna yang telah terotentikasi oleh authentication policy OAM Admin Console Policy dapat mengakses resource /oamconsole maupun /oamconsole/.../*.



Membuat Initiate Task pada Oracle BPM dengan BPM API

Pada Oracle BPM, setiap proses memiliki initiate task, yaitu task yang digunakan untuk melakukan inisialisasi pada proses tertentu.

Umumnya initiate task dilakukan melalui bpm workspace atau melalui web service atau melalui BPM API.

Berikut langkah-langkah untuk melakukan inisialisasi initiate task menggunakan BPM API
1. Buat object JAXB dari file XSD yang ada pada rancangan proses BPM.

2. Gunakan oracle.bpm.client.BPMServiceClientFactory untuk mendapatkan service instance BPM
public static BPMServiceClientFactory getServiceClientFactory(String username,
                                                                  String password,
                                                                  String url) {
        Map properties =
            new HashMap();

        properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.CLIENT_TYPE,
                       WorkflowServiceClientFactory.REMOTE_CLIENT);
        properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.EJB_PROVIDER_URL,
                       url);
        properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.EJB_INITIAL_CONTEXT_FACTORY,
                       "weblogic.jndi.WLInitialContextFactory");
        properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.EJB_SECURITY_PRINCIPAL,
                       username);
        properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.EJB_SECURITY_CREDENTIALS,
                       password);
        return BPMServiceClientFactory.getInstance(properties, null, null);
    }

3. Marshalling object JAXB ke dokumen XML (org.w3c.dom.Element)
public static Element marshallJaxbElementInitiateTask(Object obj) throws JAXBException,
                                                                 ParserConfigurationException,
                                                                 Exception {
        
        JAXBContext context = JAXBContext.newInstance(obj.getClass());
        Marshaller marshaller = context.createMarshaller();

        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        Document document = createDocument();
        
        Element payload = createPayloadElement(document);

        marshaller.marshal(obj, document);
        Element elt = document.getDocumentElement();
        
        payload.appendChild(elt);

        return payload;
    }

4. Lalu inisialisasi task dengan mengirim dokumen XML disertai ProjectName, ProcessName dan Version
public String initiateTask(String projectName, String processName, String version, Element payload) throws WorkflowException,
                                                           Exception {
        // Get the authentication context
        IBPMContext ctx = processUtils_.getBPMContext();
        
        // Check that current user is authorized to init the process
        String processDN =
            processUtils_.getInitableProcessDN(ctx, projectName, version,
                                               processName);
        if (processDN == null) {
            System.out.println("Process is not initable. Check deployment and privileges [user:" +
                               ctx.getUser() + "][process:" + projectName +
                               "/" + processName + "/" + version + "]");
            return null;
        }
        // InstanceManagmentService supports process instance services including initiating a process
        IInstanceManagementService instanceSvc =
            processUtils_.getBPMServiceClient().getInstanceManagementService();
        
        // Creates process and returns the task associated with the initiator human task in the process
        Task task = instanceSvc.createProcessInstanceTask(ctx, processDN);
        String taskId = task.getSystemAttributes().getTaskId();
        
        int taskNumber = task.getSystemAttributes().getTaskNumber();
        System.out.println("Initiator task [taskNumber:" + taskNumber + "][taskId:" + taskId + "]");
        
        // Returned task is "sparse", re-fetch to be able to update it with payload and outcome
        task = processUtils_.getHwfServiceClient().getTaskQueryService().getTaskDetailsById(ctx,
                                                                             taskId);
        // Set the payload on the task
        task.setPayloadAsElement(payload);
        
        // HWF TaskService is used to update task
        ITaskService taskSvc =
            processUtils_.getHwfServiceClient().getTaskService();
        
        // Update the task
        task = taskSvc.updateTask(ctx, task);
        
        // Update the outcome.  For initiator task the "SUBMIT" outcome is the default and completes the activity
        taskSvc.updateTaskOutcome(ctx, task,
                                  ProcessUtils.INIT_TASK_SUBMIT_OUTCOME);
        
        System.out.println("Process Instance Id : " +
                           task.getProcessInfo().getInstanceId());
        
        return task.getProcessInfo().getInstanceId();
    }

5. Berikut potongan code pada fungsi mainnya
public static void main(String[] args) {
        BPMServiceClientFactory cf =
            ProcessUtils.getServiceClientFactory("weblogic","welcome1","t3://localhost:7001");
        ProcessUtils processUtils = new ProcessUtils(cf);
        
        String projectName = "Leave";
        String processName = "LeaveProcess";
        String version = "1.0";

        TaskClient client = new TaskClient(processUtils);
        try {
            
            //create payload object
            CutiRequest inputType = new CutiRequest();
            inputType.setApprovalId(100);
            inputType.setDocs("fileLocatiom");
            inputType.setEmpID(100);
            inputType.setEmpNumber("empNumber");
            inputType.setFullName("fullName");
            inputType.setLocation("location");
            inputType.setRemark("renark");
            inputType.setTelNo("telNo");
            
            SubmitLeaveTaskPayloadType obj = new SubmitLeaveTaskPayloadType();
            obj.setCutiRequest(inputType);
            
            //create payload as jaxb element
            Element payload = ProcessUtils.marshallJaxbElementInitiateTask(obj);
            
            String processInstanceId = client.initiateTask(projectName, processName, version, payload);
            System.out.println(processInstanceId);
        } catch (WorkflowException e) {
            e.printStackTrace();
        } catch (JAXBException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Code ini terinspirasi dari java.net.

Semoga bermanfaat.  Cheers!!!