外部リソースとの対話

概要

Curl ® API では、Curl アプレットの外部のリソースにアクセスする様々なツールを提供しています。リソースには以下のものが含まれます。

クライアント側パーシスタント データ

概要

Web アプリケーションでは、クライアント マシンに少量のデータを格納することにより向上したユーザーエクスペリエンスを提供することができます。多くの Web アプリケーションは HTTP cookie を使用して、ユーザー名またはID、セッション ID、ユーザー パフォーマンスといったものや、あるいはゲームのハイスコアなどのアプレットの設定情報を格納しています。
Curl のアプレットでは、HTTP cookie を使用できます。「HTTP Cookie へのアクセス」 を参照してください。また、Curl API では、クライアント側 パーシスタント データも提供しています。これは、より強固な、Curl 特有の少量のデータを格納するメカニズムです。
クライアント側パーシスタント データでは、アプレットの権限のステータスに関係なく、またユーザーの操作なしにアプレットがデータを格納することができます。セキュリティ上の理由から、Curl のアプレットは、以下のように制限された状況下でのみクライアント ファイル システムのファイルの読み込み、または書き込みが可能です。
アプレットへのセキュリティ制限の詳細については、「セキュリティ」のセクションを参照してください。
クライアントのパーシスタント データの格納メカニズムは、これらのセキュリティ制限の範囲外で機能しています。格納されるデータは、サイズ、型および保存期間が限られています。データはアプレットによって作成された Repository に格納されています。RTE はクライアント マシンのディスク上のスペースにデータの格納場所を見つけ、データを格納しファイルから読み込むことができるフォーマットにデータを変換します。
クライアントのパーシスタント データは、特権アプレットおよび非特権アプレットのどちらのアプレットでも使用可能で、また単一のアプレットに制限することも、いくつかのアプレットで共有することも可能です。また、単一のアプレットは複数のリポジトリからのデータアクセスが可能です。
注意: アプレットがパーシスタント データをロードするのは起動時だけですが、書き込みはいつでも可能です。
この制限の結果、クライアントのパーシスタント データはアプレット間の設定やステート情報を共有するには便利ですが、アプレット間の内部プロセス コミュニケーションのメカニズムにはなりません。同一のパーシスタント データの格納への書き込みや更新結果のロードによって複数のアプレットが情報の受け渡しをすることはできません。アプレットをシャットダウンして再スタートしない限り、内部プロセス コミュニケーションにパーシスタント データを使用することはできません。アプレットは AppletData メカニズムを通じてサブアプレットと通信することができます。「子アプレットと JavaScript サポート」を参照してください。
特権アプレットは、CURL.IO.SOCKET パッケージに実装されたソケットを使用して、アプレット間で直接通信できます。また共有化されたローカル ファイルや with-local-file-lock も使用できます。

プライベート パーシスタント データ

プライベート パーシスタント データは、1 つのアプレットのみアクセス可能なリポジトリに保存されます。これは最も単純な形式のパーシスタント データです。他のアプレットはリポジトリにアクセスできないので、データに対する特定のリポジトリを識別する必要はありません。RTE は、アプレットの URL に基づいた既定の識別子が使用します。
persistent-data プロシージャを使用して、プライベート データ リポジトリを作成します。このプロシージャは、リポジトリでデータを読み込んだり保存したりしようとする前に、全てのコード ブロック外、つまりソースファイルのトップレベルで呼び出す必要があります。
このプロシージャはいくつかのリポジトリ パラメータを定義します。
たとえば、次の persistent-data の呼び出しは、ユーザーの好きな色を最長90日間保存するのに使用する小さなリポジトリを定義します。
{persistent-data 
    "Store your favorite color",
    duration=90days,
    max-size=1024
}

共有パーシスタント データ

パーシスタント データ識別子(PDI)ファイルの persistent-data の呼び出しを行うことで、複数のアプレットが共有できるパーシスタント データ リポジトリを作成することができます。このファイルは persistent-data への呼び出しのみが含まれます。PDI ファイルはヘラルドを持たないソース ファイルで、拡張子は .scurl です。この機能により、複数のアプレットが起動時のユーザー設定などの情報にアクセスできます。
PDI ファイルは、ホストからダウンロードされたアプレットの場合はサーバー上に保存され、ローカル ファイル システムからロードされた特権アプレットの場合はディレクトリに保存されます。
アプレットが特権を与えられているかどうかによって、アプレットが共有できるデータ リポジトリにいくつかの制限があります。

PDI ファイルの場所

特権が与えられていないアプレットがパーシスタント データ リポジトリを共有する必要がある場合は、そのアプレットをサーバー上に配置する際、リポジトリを定義する PDI ファイルと以下のどれかの関係である必要があります。
RTE は、特定の PDI ファイルを使って各アプレットが起動する時にこの制約を強制します。
注意: 次の例では、ロケーションは仮定ですが、その関係は実際のものです。
たとえば、アプレットが http://www.your-server.net/content/demos/example.curl にあるとします。
PDI ファイルのサーバー上の場所は、クライアント マシン上のデータの保存場所とは関係がありません。PDI ファイルの場所が関係するのは、リポジトリにアクセスできるアプレットを決定するときのみです。

パーシスタント データ リポジトリへのアクセス

共有パーシスタント データにアクセスするには、get-persistent-data-repository プロシージャを使用して、データを含む Repository を開く必要があります。このプロシージャはたとえば次の例のように、リポジトリを定義する PDI ファイルの URL を指定する String 型の引数をとります。
let pref-data:Repository = 
    {get-persistent-data-repository
        pdi-name="http://www.your-server.net/demo/pref-data.scurl"
    }
PDI ファイルの URL を指定しない場合は、プロシージャはアプレットにプライベート パーシスタント データ リポジトリを開きます。アプレットは persistent-data への呼び出しを含む必要があります。また、get-persistent-data-repository への呼び出しを省略して、リポジトリを指定せずにデータを保存し取得することができます。使用されたプロシージャは自動的にプライベート リポジトリを提供します。

パーシスタント データの保存と取得

以下のプロシージャで、パーシスタント データ リポジトリのデータを操作できます。
これらのプロシージャを使用する際、get-persistent-data-repository の呼び出しによって得られた Repository を指定することができます。 Repository を省略すると、プロシージャは自動的にアプレットにプライベート リポジトリを提供します。
パーシスタント データ リポジトリには、以下のような特定のデータ型のみ保存できます。
リポジトリに保存された各アイテムは、String キーによって識別されます。スラッシュ (/) を含んではいけません。この他に制限はありません。リポジトリにデータを保存するには、set-persistent-data を呼び出して、データを識別する String キー、データ、Repository を渡します。
リポジトリに保存したいすべてのデータを追加した後で、commit-persistent-data を呼び出してリポジトリをディスクに保存する必要があります。
パーシスタント データ値を取り出すには、必要なデータを識別するキーを get-persistent-data に渡します。このプロシージャは、保存したオブジェクトを含む any 型を返します。オプションのパラメータ error-if-missing?false に設定すると、キーがリポジトリ内のエントリと一致しない場合に null が返されます。パラメータを設定しない場合、キーがエントリと一致しないときには KeyNotFoundException をスローします。通常、プロシージャが null を返したかどうかを判定するよりこの例外をキャッチする方が簡単です。
プライベート パーシスタント データ リポジトリから値を取得および保存する例を次に示します。このセクションを初めてロードするときは、実行 を数回クリックしてリポジトリの値が増加するのを確認してください。

パーシスタント ストレージのセキュリティ上の制限

特権を与えられていないアプレットは、アクセスできるリポジトリの制限に加え、以下のような制限を受けます。

パーシスタント データおよびアプレットの一時停止

エンド ユーザーがアプレットから離れてブラウズしている間は、アプレットが一時停止状態になります。つまり、ユーザーが (通常はブラウザの[戻る]ボタンを押して) アプレットに戻らない限り、アプレットは再び動作しません。ユーザーが再度アプレットに戻らない場合、アプレットは最終的に消滅してメモリから削除されます。アプレットが一時停止のときにコミットされていないパーシスタント データがある場合、そのデータは保存されない可能性があります。
パーシスタント データを保存するには、on-applet-suspend マクロ、または register-suspend-proc プロシージャを使用して、アプレットが一時停止になる直前に commit-persistent-data を呼び出すことができます。
たとえば、次のコードをアプレットに追加できます。
|| Ensure data gets committed
{on-applet-suspend
    || Commit the private data store
    {commit-persistent-data}
    || Commit a shared data store
    {commit-persistent-data repository=pref-data}
}

パーシスタント データの有効期限

パーシスタント データは永久には保存されません。PDI の duration パラメータで指定された時間内にリポジトリにアクセスされなかった場合、RTE はリポジトリを削除し、スペースが解放されます。さらに、クライアント マシンに保存されているため、パーシスタント データを完全に制御することができません。たとえば、エンドユーザーがハードディスクを交換した場合、パーシスタント データは消滅します。これらの理由により、パーシスタント データ リポジトリは、永久に維持しなければならないデータを保存する場所として、適切ではありません。