Firefox ExtensionでJavaプログラムを動かしてみるテスト

Firefox ExtensionでC++プログラムを動かしてみるテスト 〜その5 XULの実装〜 - かーねる・う゛いえむにっきからの続き。

もちろんJavaでもExtention書きたいよね?
って事で試してみた。
本当はXPCOMで実装してJS側は無変更と行きたいところなのだが、如何せん情報が少なくて良く分からない。
そこで、MozillaのJSからJavaを呼ぶための独自拡張であるLiveConnectを用いて実装してみる事とした。

例によって、Javaの実装はこんな感じ:

TestKVS.java
package com.dokukino.testkvs;

import java.util.HashMap;
import java.util.Map;

public class TestKVS {
	private Map<Integer, Integer> store = new HashMap<Integer, Integer>();
	
	public void close() {
	}

	public int get(int key) {
		return store.get(key);
	}

	public void open() {
		// TODO Auto-generated method stub

	}

	public void put(int key, int value) {
		store.put(key, value);
	}
}

これをjarで固めてtestkvs@dokukino.com/java/testkvs.jarに置く。
あわせて、http://simile.mit.edu/repository/java-firefox-extension/tools/javaFirefoxExtensionUtils.jarをダウンロードしてきて同じくtestkvs@dokukino.com/java/へコピー。

そして、testkvs.jsを以下のように改造する:

testkvs.js
//Get extension folder installation path...
var extensionPath = Components.classes["@mozilla.org/extensions/manager;1"].
            getService(Components.interfaces.nsIExtensionManager).
            getInstallLocation("testkvs@dokukino.com"). // guid of extension
            getItemLocation("testkvs@dokukino.com");

// Get path to the JAR files (the following assumes your JARs are within a
// directory called "java" at the root of your extension's folder hierarchy)
// You must add this utilities (classloader) JAR to give your extension full privileges
var classLoaderJarpath = "file:///" + extensionPath.path.replace(/\\/g,"/") + "/java/javaFirefoxExtensionUtils.jar";
// Add the paths for all the other JAR files that you will be using
var myJarpath = "file:///" + extensionPath.path.replace(/\\/g,"/") +
"/java/testkvs.jar"; // seems you don't actually have to replace the backslashes as they work as well

var urlArray = []; // Build a regular JavaScript array (LiveConnect will auto-convert to a Java array)
urlArray[0] = new java.net.URL(myJarpath);
urlArray[1] = new java.net.URL(classLoaderJarpath);
var cl = java.net.URLClassLoader.newInstance(urlArray);

var myClass = cl.loadClass('com.dokukino.testkvs.TestKVS'); // use the same loader from above
var kvs = myClass.newInstance();

//var kvs = Components.classes["@dokukino.com/testKVS;1"].createInstance(Components.interfaces.testIKVS);
kvs.open();

function get() {
	var key = document.getElementById('key').value;
	var value = kvs.get(key);
	document.getElementById('value').value = value;
}

function put() {
	var key = document.getElementById('key').value;
	var value = document.getElementById('value').value;
	kvs.put(key, value);
	document.getElementById('key').value = '';
	document.getElementById('value').value = '';
}

長ったらしいが、ようはこのコードでjarをロードしてインスタンスを生成している。
従来Components.classes[].createInstance()で行っていた処理と同じだ。

動作テストを行ってみると、ちゃんとC++版と同じように動作する事が確認出来ると思う。

参考資料:Java in Firefox Extensions - Archive of obsolete content | MDN