Develop Consume RESTful Plugin BMC Remedy untuk Filter dengan Java

Hi, berhubung sebentar lagi saya sudah resign tidak ada salahnya meninggalkan jejak untuk mencatat sebagian ilmu yang sudah saya dapat selama bekerja di kantor yang sekarang. Jujur saja di sini saya banyak sekali belajar secara otodidak untuk mengembangkan ilmu dan aplikasi yang ada. Saya tidak begitu mengalami kesulitan yang berarti karena memang basic saya adalah software engineer.

Eh kebetulan banget BMC Remedy itu platformnya based on Java. So pas banget deh, nah salah satu fitur yang dapat dikembangkan secara kastem adalah plugin. Berguna banget deh pokoknya. Nah yang saya kembangkan di siang hari tadi adalah plugin untuk consume RESTful Web Service dari aplikasi eksternal. Uhuy, tar saya juga share deh cara develop RESTful Web Service dengan BMC Remedy di MidTier dengan AR API dan non Jetty.

Apakah develop sebuah plugin itu susah? Jujur saja ngga hehe, asal kita mau belajar dan tidak membatasi diri dengan slogan “gue ngga mau ngoding”, “itu bukan out of the box”, “udah bukan scope gue”, dan segala macem excuse lainnya. So, let’s begin dude!

Pertama kita butuh 2 library API dari BMC Remedy AR System *eh anyway saya pakai latest version AR System yak yaitu 9.1*, yakni arpluginsvr91_build002.jar, arapi91_build002.jar, dan json-simple-1.1.1.jar. Dan please banget backup dulu beberapa file config lain yaitu AR.conf dan pluginsvr_config.xml.

Sebut saja ada kita memiliki Mid Form untuk menampung hasil consume web service dengan nama BMC:Learning:JSON. Nah JSON yang kita tarik berada di alamat URL semisal http://domain/xxxxx.json dan memiliki return seperti di bawah ini.

[
{"Programming Language" : "Java"},
{"Programming Language" : "C#"},
{"Programming Language" : "PHP"},
{"Programming Language" : "Python"}
]

Data dari field Programming Language akan kita simpan ke Short Description di BMC:Learning:JSON. Nah jadi filternya nanti memiliki satu action yaitu Set Field dengan sourcenya adalah plugin dengan 3 parameter yaitu nama form, mapping field, dan alamat URL web service RESTful yang ingin kita consume. Kok banyak? Ya agar dynamic tentunya dan tidak hardcode sehingga reuseable.

Next? Yuk mari buat New Java Project di Eclipse dan beri nama JSONParser. Dari project tersebut reference 2 library tadi ya. Oh berikut penjelasan untuk file-file di atas :

  1. arpluginvr91_build002.jar itu adalah library untuk mengimplementasi API plugin di komponen filter AR System.
  2. arapi91_build002.jar itu adalah library untuk koneksi ke AR System.
  3. json-simple-1.1.1.jar adalah library untuk encode dan decode JSON.
  4. AR.conf adalah file konfigurasi AR System beserta seluruh plugin.
  5. pluginsvr_config.xml adalah file konfigurasi plugin dan path class yang akan kita gunakan.

Lalu buatlah sebuah class dengan nama JSONParsePlugin dan ikuti snippet coding di bawah ini.

package plugin.adinandra.dharmasurya.net;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import com.bmc.arsys.pluginsvr.plugins.ARFilterAPIPlugin;
import com.bmc.arsys.pluginsvr.plugins.ARPluginContext;
import com.bmc.arsys.api.ARException;
import com.bmc.arsys.api.ARServerUser;
import com.bmc.arsys.api.Entry;
import com.bmc.arsys.api.Value;

public class JSONParserPlugin extends ARFilterAPIPlugin {

	@Override
	public List filterAPICall(ARPluginContext context, List listOfParam) throws ARException {
		String serverName = context.getARConfigEntry("Server-Connect-Name");
		int port = Integer.valueOf(context.getARConfigEntry("TCD-Specific-Port"));
		ARServerUser server = new ARServerUser(context, "", serverName);
		server.setPort(port);
		String formName = listOfParam.get(0).getValue().toString();
		String fieldId = listOfParam.get(1).getValue().toString();
		String urlStr = listOfParam.get(2).getValue().toString();
		String jsonStr = this.doGetJSON(urlStr);
		List results = new ArrayList();
		String [] fieldIds = fieldId.split(",");
		JSONParser jParser = new JSONParser();
		Object json = null;
		try {
			json = jParser.parse(jsonStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		JSONArray jArr = (JSONArray) json;
		for(int i = 0; i < jArr.size(); i++) {
			JSONObject jObj = (JSONObject) jArr.get(i);
			int fieldIdx = 0;
			Entry entry = new Entry();
			for(Iterator iterator = jObj.keySet().iterator(); iterator.hasNext();) {
				String key = (String) iterator.next();
				String value = jObj.get(key).toString();
				int field = Integer.valueOf(fieldIds[fieldIdx]);
				entry.put(field, new Value(value));
				fieldIdx++;
			}
			String id = server.createEntry(formName, entry);
			results.add(new Value(id));
		}
		return results;
	}

	public String doGetJSON(String urlStr) {
		String jsonStr = "";
		try {
			URL url = new URL(urlStr);
			HttpURLConnection urlCn = (HttpURLConnection) url.openConnection();
			urlCn.setDoOutput(true);
			urlCn.setRequestMethod("GET");
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlCn.getInputStream()));
			String line;
			StringBuilder content = new StringBuilder();
			while((line = bufferedReader.readLine())!= null) {
				content.append(line);
				content.append(System.lineSeparator());
			}
			jsonStr = content.toString();
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		return jsonStr;
	}

}

Setelah itu jangan lupa konfig AR.conf dan pluginsvr_conf.xml sebagai berikut.

PLUGINSVR_CONF.XML

<plugins>
<name>ADINANDRA.DHARMASURYA.JSONPARSER</name>
<classname>plugin.adinandra.dharmasurya.net.JSONParserPlugin </classname>
<filename>{your AR Server location}\pluginsvr\custom\jsonparser.jar</filename>
<pathelement type="path">{your AR Server location}\pluginsvr\custom</pathelement>
<pathelement type="location">{your ar server location}\pluginsvr\custom\lib\json-simple-1.1.1.jar</pathelement>
<userDefined>
<bulk_transaction_size>32</bulk_transaction_size>
<server_name>{your hostname}</server_name>
<use_bulk_transaction>false</use_bulk_transaction>
<server_port>{your RPC port}</server_port>
</userDefined>
</plugin>
......
......
</plugins>

AR.CONF

Server-Plugin-Alias: ADINANDRA.DHARMASURYA.JSONPARSER ADINANDRA.DHARMASURYA.JSONPARSER :9999

Selesai config dan simpan, lalu export Java Projectnya menjadi sebuah executable jar dengan nama jsonparser.jar dan tempatkan di {lokasi instalasi AR Server}\pluginsvr\custom\ *buat folder dengan nama custom jika tidak ada* Untuk tambahan eksternal library di dalam folder custom buat satu lagi folder dengan nama lib dan copy library json-simple-1.1.1.jar ke dalam folder lib.

Nah bingung tidak? Hahaha, selow gan. Dengan mengimplementasi ARFilterAPIPlugin kita diwajibkan untuk mengimplementasikan method filterAPICall (context, filter parameter). Nah filter parameter ini berasal dari inputan kita di filter yang memanggil plugin. Sehingga pada bagian awal terdapat variabel nama form, field id, dan URL yang nilainya diset secara otomatis oleh action Set Field. Lalu method doGetJSON adalah method yang digunakan untuk menarik JSON dari URL yang telah diset.

Returnnya berupa String dan akan diproses dengan library json-simple. Nah sehingga nanti di filter yang memanggil plugin dengan nama pluginnya adalah ADINANDRA.DHARMASURYA.JSONPARSER, set actionnya seperti di bawah ini.

  1. $0$ isi dengan nama form yaitu BMC:Learning:JSON
  2. $1$ isi dengan mapping field dari return JSON dengan yang ada di form. Karena sudah disepakati Programming Language akan masuk sebagai short description maka silakan di set menjadi “8” sesuai dengan ID field dari Short Description. Jika semisal memiliki lebih dapat menggunakan separator koma “,” semisal “8,5110001,51100002, dst”
  3. $2$ isi dengan alamat url RESTful semisal “http://domain/xxxxx.json&#8221;

Oke? Sesimple itu lah. Setelah selesai silakan restart AR System dan selama mencoba. Semoga bermanfaat ya, salam!

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s