Friday, July 24, 2009

POC Lebih Baik Tentang Arsitektur Aplikasi ERP Pluggable



Ini Proof of Concept yg lebih baik : penggunaan Jar Class Loader, view yg terintegrasi dan kontribusi plugin pada toolbar (kontribusi pada menu, juga mudah dilakukan). sert penggunaan Apache Configurations. Berikut adalah method yg memulai aplikasi (lupa di kelas mana) :

private void start() {
try {
config = new XMLConfiguration(pluginDir + "\\Platform.xml");
config.setAutoSave(true);
Platform.getInstance().setMainWindow(MainSDI.getInstance());
loadPlugin();
Platform.getInstance().getMainWindow().setVisible(true);
} catch (ConfigurationException ex) {
Logger.getLogger(Startup.class.getName()).log(Level.SEVERE, null, ex);
}
}


Semua isi konfigurasi aplikasi terdapat di Platform.xml yang dibaca oleh kelas milik Apache Configurations. Isi file Platform.xml merupakan petunjuk tentang bagaimana kustomisasi aplikasi yg akan dilakukan. Bayangkan 2 klien yg mirip dalam kebutuhan, maka mereka akan memiliki dua Platform.xml yang berbeda. Adapun kontributor yg berupa plugin, bisa berbagi. Isi dari file Platform.xml, bisa seperti berikut :



SMS Server
startup.PluginSmsServer





Payroll
startup.PluginPayroll



General Ledger
startup.PluginGeneralLedger




Adapun untuk mekanisme load pluginnya ada di kode berikut :

private void loadPlugin() {

JarClassLoader jcl = new JarClassLoader();
jcl.add(pluginDir + "/");
JclObjectFactory factory = JclObjectFactory.getInstance();

Plugin p;
List l = config.configurationsAt("modules.module");
for (int i = 0; i <>
p = (Plugin) factory.create(jcl, l.get(i).getString("class"));
p.contributeToToolbar(Platform.getInstance().getMainWindow().getToolMain());
}
}


Perhatikan bagaimana JCL dipanggil, dan juga perhatikan bagaimana isi konfigurasi pada node modules.module dikelola. Selai itu, pemanggilan contributeToToolbar, merupakan cara ringkas untuk memberi kesempatan bagi plugin untuk berkontribusi. Berikut detail kode contributeToToolbar :

public void contributeToToolbar(JToolBar toolMain) {
btnPenjualan = new JButton("Plugin Penjualan");
btnPenjualan.setIcon(new javax.swing.ImageIcon("D:\\My Pictures\\icon-eclipse\\complete_status.png")); // NOI18N
btnPenjualan.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
btnPenjualan.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
btnPenjualan.setFocusable(false);
btnPenjualan.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Platform.getInstance().getMainWindow().getMainContainer().setViewportView(PenjualanPanel.getInstance());
}
});
toolMain.add(btnPenjualan);
}

Semoga bermanfaat!

NB:
  • Tingkat fleksibilitas bisa ditambah dengan membuat definisi menu via file Platform.xml itu juga (jadi mrip konsepnya dengan file Plugins.xml pada Eclipse RCP).
  • Saya akan sangat tertarik, jika aplikasi yang akan dikembangkan benar2 besar dan luas secara arsitektur. Maka merancang hirarki kelas dan segala kerumitannya sangat menggairahkan

No comments: