Java BlackBerry DataSnap モバイル コネクタ入門

提供: RAD Studio
移動先: 案内検索

DataSnap モバイル コネクタ入門 への移動


このトピックは、BlackBerry モバイル開発用に Java BlackBerry DataSnap プロキシを初めて生成して使用するためのガイドです。Java プロキシでは、DataSnap 自体がサポートしているものと同じデータ型をすべてサポートしています。それらの DBX 型と Delphi 型をラップするための特別な Java クラスが作成されており、それらの使い方は Delphi の場合と似ています。

DataSnap REST サーバーは、要求されると、サーバー上のメソッドを呼び出すためのプロキシ クラスを生成してディスパッチします。これは、既によくご存知だと思われるプロキシ生成と非常に似ていますが、プロキシとそれに依存するものをすべて zip 圧縮し、その zip ファイルを要求側に送信するという処理も含まれています。このプロセスの詳細は、「DataSnap モバイル コネクタ入門」を参照してください。

DSProxy クラスと実行時ファイルはすべて、com.embarcadero.javablackberry パッケージに含まれています。このパッケージの構造は次のようになっています。

JavaBlackberryFileStructure.png

メモ: BlackBerry OS のバージョン 6 以上が必要です。

DataSnap REST サーバーから BlackBerry プロキシ ファイルをダウンロードする方法

まず、Win32ProxyDownloader.exe を入手する必要があります(これは、製品のインストール ディレクトリの \bin ディレクトリに含まれています)。詳細は、「DataSnap モバイル コネクタ入門」を参照してください。ダウンローダは、サーバーとの通信に必要なプロキシなどのファイルをサーバーに要求するのに役立つ簡単なユーティリティです。

プロキシ ダウンローダを使用するには、以下のパラメータを指定する必要があります。

  • -language (required): 要求するプロキシのモバイル プラットフォーム/言語を指定します。 BlackBerry 開発の場合は、java_blackberry と指定します。
  • -protocol: 使用する接続プロトコルを指定します。http または https です。 デフォルトは http です。
  • -host: 接続先のポートおよびホスト名または IP アドレスを指定します。 デフォルトは localhost とポート 80 です。 他の名前やポートが必要な場合には、名前は完全修飾名で指定し、コロン(":")で区切ってポート番号まで含める必要があります。
  • -output: プロキシ ファイルのダウンロード先となるフォルダを指定します。 指定しない場合は、現在のフォルダが使用されます。

次の例では、上記のパラメータをほとんど指定しています。

C:\Win32ProxyDownloader.exe -language java_blackberry -host 127.0.0.1:8080 -output C:\test

ダウンローダを実行すると、BlackBerry プロキシ ファイルが指定した出力フォルダにコピーされます。このファイルには次のものが含まれます。

  • JSON ライブラリ
  • プロキシで必要となる静的な Java ソース ファイル
  • DSProxy.java(生成されたプロキシ)

主なファイルは DSProxy.java で、サーバー上で定義されているすべてのメソッドを含むクラスが宣言されています。

ファイルをプロジェクトにインポートすると、次のようにセットアップされます。

BlackBerryDemoClientAppFileStructure.png

DSProxy クラスの使用方法

次のコードは、サーバーで生成された DSProxy.java ファイルです。この中には TServerMethods1 クラスが含まれており、そこにサーバー メソッドがカプセル化されています。サーバーにはメソッドが 1 つしかなく(EchoString のみ)、Java クラスの TServerMethods1 にそれが適切に実装されています。サーバーへの接続とメソッドの実行に必要なコードがすべて、プロキシ ジェネレータにより自動的に生成されています。EchoString メソッドのコードを以下で参照してください。

public class DSProxy {
  public static class TServerMethods1 extends DSAdmin {
    public TServerMethods1(DSRESTConnection Connection) {
      super(Connection);
    }
    
    private DSRESTParameterMetaData[] TServerMethods1_EchoString_Metadata;
    private DSRESTParameterMetaData[] get_TServerMethods1_EchoString_Metadata() {
      if (TServerMethods1_EchoString_Metadata == null) {
        TServerMethods1_EchoString_Metadata = new DSRESTParameterMetaData[]{
          new DSRESTParameterMetaData("Value", DSRESTParamDirection.Input, 
                                               DBXDataTypes.WideStringType, "string"),
          new DSRESTParameterMetaData("", DSRESTParamDirection.ReturnValue, 
                                          DBXDataTypes.WideStringType, "string"),
        };
      }
      return TServerMethods1_EchoString_Metadata;
    }

    /**
     * @param Value [in] - Type on server: string
     * @return result - Type on server: string
     */
    public String EchoString(String Value) throws DBXException {
      DSRESTCommand cmd = getConnection().CreateCommand();
      cmd.setRequestType(DSHTTPRequestType.GET);
      cmd.setText("TServerMethods1.EchoString");
      cmd.prepare(get_TServerMethods1_EchoString_Metadata());
      cmd.getParameter(0).getValue().SetAsString(Value);
      getConnection().execute(cmd);
      return cmd.getParameter(1).getValue().GetAsString();
    }
    
    
    private DSRESTParameterMetaData[] TServerMethods1_ReverseString_Metadata;
    private DSRESTParameterMetaData[] get_TServerMethods1_ReverseString_Metadata() {
      if (TServerMethods1_ReverseString_Metadata == null) {
        TServerMethods1_ReverseString_Metadata = new DSRESTParameterMetaData[]{
          new DSRESTParameterMetaData("Value", DSRESTParamDirection.Input, 
                                               DBXDataTypes.WideStringType, "string"),
          new DSRESTParameterMetaData("", DSRESTParamDirection.ReturnValue, 
                                          DBXDataTypes.WideStringType, "string"),
        };
      }
      return TServerMethods1_ReverseString_Metadata;
    }
}

プロキシ クラスを使用するには、まず、サーバーへの接続を作成しセットアップします。サーバーに接続するために必要なプロパティやメソッドはすべて、DSRESTConnection クラスにカプセル化されています。以下に示すように、接続を作成しプロパティをセットアップすればよいだけです。

import com.embarcadero.javablackberry.DSRESTConnection;
// ...

DSRESTConnection conn = new DSRESTConnection();
conn.setHost("host");
conn.setPort(port);
conn.setProtocol("http");
  • host プロパティはホスト名または IP アドレスを指定します。
  • port プロパティはサーバーのリスン ポートを指定します。
  • protocol プロパティは、接続に使用するプロトコルを指定します。 特に: http または https です。

サーバー メソッドをリモートで呼び出すには、接続を引数に渡してプロキシ クラスを作成した後、そのメソッドを呼び出すだけです。

DSRESTConnection conn = new DSRESTConnection();
conn.setHost("10.40.30.24");
conn.setPort(8080); 

TServerMethods1 proxy = new TServerMethods1(conn);
String Result = proxy.EchoString("Hello, World!");

var パラメータを持つサーバー メソッドの例

以下の例は、サーバー メソッドが var パラメータを含んでいるか複数の結果を返す場合に生成されるコードです。

サーバー メソッドの Delphi コードの例

function TServerMethods1.VarParamTest(var Value: string): string;
begin
  Value := StrUtils.ReverseString(Value);
  Result := Value;
end;

サーバー メソッドを呼び出すための生成されたプロキシ コードの例

private DSRESTParameterMetaData[] TServerMethods1_VarParamTest_Metadata;
private DSRESTParameterMetaData[] get_TServerMethods1_VarParamTest_Metadata() {
  if (TServerMethods1_VarParamTest_Metadata == null) {
    TServerMethods1_VarParamTest_Metadata = new DSRESTParameterMetaData[]{
      new DSRESTParameterMetaData("Value", DSRESTParamDirection.InputOutput, 
                                           DBXDataTypes.WideStringType, "string"),
      new DSRESTParameterMetaData("", DSRESTParamDirection.ReturnValue, 
                                      DBXDataTypes.WideStringType, "string"),
    };
  }
  return TServerMethods1_VarParamTest_Metadata;
}

/**
 * @param Value [in/out] - Type on server: string
 * @return result - Type on server: string
 */
public static class VarParamTestReturns {
  public String Value;
  public String returnValue;
}

public VarParamTestReturns VarParamTest(String Value) throws DBXException {
  DSRESTCommand cmd = getConnection().CreateCommand();
  cmd.setRequestType(DSHTTPRequestType.GET);
  cmd.setText("TServerMethods1.VarParamTest");
  cmd.prepare(get_TServerMethods1_VarParamTest_Metadata());
  cmd.getParameter(0).getValue().SetAsString(Value);
  getConnection().execute(cmd);
  VarParamTestReturns ret = new VarParamTestReturns();
  ret.Value = cmd.getParameter(0).getValue().GetAsString();
  ret.returnValue = cmd.getParameter(1).getValue().GetAsString();
  return ret;
}

メソッドが VarParamTestReturns のインスタンスを返すことに注意してください。この特別なクラスは、結果の他に、var(in/out)パラメータについての情報も保持します。次の例では、メソッドを呼び出し、結果の値を読み取る方法を示しています。

TServerMethods1 proxy = new TServerMethods1(conn);
VarParamTestReturns Result = proxy.VarParamTest("Hello, World!");
System.out.println(Result.Value);
System.out.println(Result.returnValue);


渡したパラメータの新しい値と結果の値は、両方とも Result インスタンスに保持されます。Result.Value の値は "!dlroW ,olleH"、Result.returnValue は "Hello, World!" になります。

重量コールバックの使用方法

重量コールバックは、DataSnap サーバーから REST クライアントにほぼ瞬時に通知を送る手段となります。クライアントは興味のあるサーバー上の特定のトピックにコールバックを登録することができ、そうすると、そのトピックが更新されるたびにクライアントは通知を受け取ることになります。もちろんこれは重量コールバックが行う処理をきわめて単純化した説明ですが、ここでの作業には十分です。

アプリケーションでコールバックを使用するには、まず、抽象クラス DBXCallback を継承するカスタム コールバック クラスを作成し、抽象メソッド "Execute" をオーバーライドします。このクラスの実装例を次に示します。

public class MyCallback extends DBXCallback { 
public TJSONValue execute(TJSONArray params) { 
System.out.println(params.toString());
return new TJSONTrue();
}
}

DSClientCallbackChannelManager クラスはクライアントのコールバックを管理するためのものです。コールバックを登録および登録解除するためのメソッドや、その 1 つまたはすべてを閉じるためのメソッドを提供しています。コンストラクタは次の 3 つのパラメータを受け取ります。

  1. DSRESTConnection。サーバー接続情報を指定します
  2. 登録するサーバー チャネルの名前を含む文字列
  3. マネージャの ID(サーバーから見て一意)を含む文字列

このマネージャを作成するコードは以下のとおりです。

DSCallbackChannelManager manager  = 
 new DSCallbackChannelManager(conn,"chname",DSCallbackChannelManager.getNewManagerID());

次に示すのは、コールバックを登録し、登録した同じチャネルにブロードキャストを行う例です。

manager.registerCallback("mycb01", new MyCallback());

上記の例では "mycb01" という名前でコールバックを登録しています。'registerCallback' メソッドの第 1 パラメータは、コールバックの ID(クライアント チャネル内で一意な ID)です。2 番目のパラメータは、登録される実際のコールバック インスタンスです。これが登録される最初のコールバックであれば、registerCallback の呼び出し結果が返されたときに、コールバック マネージャの準備が整っているという保証はありません。初期登録は非同期で行われるためです。ただし、registerCallback の最初の呼び出しが済めば、その後の呼び出しは登録が完了するまで返されることはありません。 接続は、アプリケーションで切断するかサーバーから切断されるまでは、開いたままになります。接続を切断するには、次のように、コールバックの登録を解除してチャネルを閉じます。


manager.unregisterCallback("mycb01");
manager.closeClientChannel();

関連項目