Java Connectorの解説
では次に、Java Connectorがどのように構成されているかを解説します。
フォルダ構成について
前節で次の図4のようなプロジェクトが作成されます。
![図4.サンプルプロジェクトの構成 図4.サンプルプロジェクトの構成](http://cz-cdn.shoeisha.jp/static/images/article/1377/1377_04.gif)
ALINOUS_HOMEフォルダ
ALINOUS_HOMEフォルダは、このAlinous-Coreサーバがエクスポートするドキュメントルートです。通常のAlinous-Coreプロジェクトと同様です。
ALINOUS_HOME/libフォルダ
このフォルダにJava Connectorで利用するjarファイルを置くことで、Alinous-Coreは置かれたjarファイルを自動で検知してホットデプロイを行います。必要なjarファイルは全てこのフォルダに置きます。また、1度デプロイしたjarファイルをアンデプロイするためには、このフォルダから削除します。すると、Alinous-Coreサーバが削除されたことを検出し、自動的にアンデプロイします。
srcフォルダについて
「src」フォルダは、一般的なJavaのためのソースフォルダです。サンプルで利用するJavaのソースコードはこの中に全て入っています。
Java Connectorのビルド
Java Connectorのビルドは、プロジェクトのルートにある「build.xml」ファイルを実行することによって行われます。「build.xml」ファイルの内容はリスト1のようになっています。
「build.xml」には、コンパイルされたJavaのクラスをアーカイブしたjarファイルをAntのjarコマンドで作成し、先ほど述べた「ALINOUS_HOME/lib/」フォルダに「functions.jar」という名前をつけて保存するという操作が実装されています。Alinous-Coreは、ホットデプロイに対応しているので、サーバが立ち上がっている場合には、ビルド後、自動的にデプロイされます。
<project basedir="." name="AlinousJavaCore" default="make_jar"> <target name="make_jar"> <delete file="ALINOUS_HOME/lib/functions.jar" /> <jar destfile="ALINOUS_HOME/lib/functions.jar" update="true"> <fileset dir="bin/"> <include name="**"/> </fileset> </jar> </target> </project>
Javaの実装
次に、Javaの部分の実装を見ていきます。まずは、「src」フォルダの中身を見てみましょう。
![図5.srcフォルダの構成 図5.srcフォルダの構成](http://cz-cdn.shoeisha.jp/static/images/article/1377/1377_05.gif)
「src」フォルダには3つのファイルがあります。このうち、「IAlinousFunction.java」は、Alinous-Coreのライブラリーの一部ですので、今回のサンプルで、実際にユーザーが作成する部分は、「org.example」パッケージ内にある2つのファイルのみとなります。「SampleConnector.java」が今回Java Connectorを使ってAlinous-Coreにエクスポートするメソッドを含むクラスです。では、実際に「SampleConnector.java」の内容を見てみましょう。
リスト2のソースコードの中で、SampleConnectorクラスは、getHello()
、addArray()
、getMemberAndYou()
という3つのメソッドをエクスポートしています。また、このクラスはIAlinousFunctionを実装しており、このインターフェイスを実装することでAlinous-Coreに対してこのクラスの中のメソッドをエクスポートするということを宣言しています。
package org.example; import java.util.ArrayList; import java.util.List; import org.alinous.jdk.IAlinousFunction; public class SampleConnector implements IAlinousFunction { /**
* Retrun the names of methods to export.
*/ public String[] getFunctions() { return new String[] {"getHello", "addArray", "getMemberAndYou"}; } /**
* Return the name of this function container.
*/ public String getPrefix() { return "Sample"; } public String getHello(String yourName) { return "Hello " + yourName + "."; } /**
* Add new values into array
* @param val
* @param inArray
* @return
*/ public String[] addArray(String val, String[] inArray) { String[] newArray = new String[inArray.length + 1]; for(int i = 0; i < inArray.length; i++) { newArray[i] = inArray[i]; } newArray[inArray.length] = val; return newArray; } /**
*
* @param you
* @return
*/ public SampleBean[] getMemberAndYou(SampleBean you) { System.out.println(you.getName() + " " + you.getEmail()); List<SampleBean> list = new ArrayList<SampleBean>(); list.add(new SampleBean("TOM", "TOM@tomtest.com", new Integer(40))); list.add(new SampleBean("BOB", "BOBBOB@BOBtest.com", new Integer(21))); list.add(you); return list.toArray(new SampleBean[list.size()]); } }
では、IAlinousFunctionインターフェイスを実装したときにはどのようなメソッドを実装しなくてはならないのでしょうか? リスト3を見てください。IAlinousFunctionインターフェイスを実装したときには、getPrefix()
、getFunctions()
の2つのメソッドの実装が必要です。しかし、逆に言ってしまえば、この2つのメソッドさえ実装してしまえば、後は自動的にメソッドを検出してJava Connector用のメソッドとして登録されます。エクスポートするためのメソッドは引数および戻り値として、
- String型の変数
- Integer、 Longなどのプリミティブのラッパークラス
- それらの値で構成されるJavaBean
- それらの配列
を利用することが可能です。
package org.alinous.jdk; public interface IAlinousFunction { /**
* Return the name of this function container.
* If function's name is "Sample.func()", the prefix is "Sample".
*/ public String getPrefix(); /**
* Retrun the names of methods to export.
*/ public String[] getFunctions(); }
Java Connectorを利用する
それでは、エクスポートしたメソッドを動かしてみましょう。ALINOUS_HOMEフォルダ内にある「execute.alns」ファイルでこれらのメソッドを関数として呼び出しています。Alinous-Coreにはデバッガーが備え付けられているので、それを利用してステップ実行することで動きを確かめることができます。
関数の名前は全て、Sample
というプレフィックスがついていますが、これは先ほどのSampleConnectorクラスで、getPrefix()
で返した文字列の値に相当しています。後はgetFunctions()
で登録した関数名をその後の.
(ピリオド)に続いて書くことによって呼び出すことができます。
// standard $HTLLO_STR = Sample.getHello("Tommy"); // Function with array parameter $MEMBERS[0] = "TOMMY"; $MEMBERS[1] = "BOB"; $MEMBERS[2] = "MARY"; @MEMBERS = Sample.addArray("NANCY", @MEMBERS); // @MEMBERS = Sample.addArray2("TED", @MEMBERS); $TOM.name = "TOM"; $TOM.email = "tomtom@tomtom.com"; $TOM.age = 16; @MEMBERS = Sample.getMemberAndYou($TOM); return 0;
まとめ
今回の記事で、Alinous-CoreのJava Connectorがどのようなものか分かっていただけたと思います。最近、Alinous-Coreのアプリケーションサーバ自体はどのようなものなのかという質問をよく受けます。実は、Alinous-Coreアプリケーションサーバ自体はサーブレットコンテナ上で動作するwarファイルとして提供されています。そのため、Javaととても相性がよく、今回のようにJavaのメソッドをそのままインポートして実行することができます。