使ってみよう! Live Framework

第14回 Resource Script(3)

この記事を読むのに必要な時間:およそ 4.5 分

トリガーとしてのResource Script

Live FrameworkのMesh Objectなどのリソースは,そのリソースの生成・更新・削除を要因として,それらの処理前または後に特定の動作をさせるトリガー処理ができます。このトリガーにResource Scriptを使用します。今回は,このトリガー処理についてみてみましょう。また,Scriptの実行結果の処理方法についても紹介します。

トリガーに使用できるリソースの操作は,リソースの生成・更新・削除の前後の6種類です。Live Framework SDKのライブラリを使用した場合,以下のプロパティをリソースクラスが持っています。これらのプロパティにResource Scriptを指定することでトリガー処理が可能です。

  • PreCreateTrigger
  • PostCreateTrigger
  • PreUpdateTrigger
  • PostUpdateTrigger
  • PreDeleteTrigger
  • PostDeleteTrigger

PreCreateTriggerとPostCreateTriggerはリソースの生成の前後,実際のLive Operating Environmentとのやり取りではHTTP POSTメソッドが行われる前後にResource Scriptを実行します。同様に,PreUpdateTriggerとPostUpdateTriggerはリソースの更新(HTTP PUTメソッド)の前後,PreDeleteTriggerとPostDeleteTriggerはリソースの削除(HTTP DELETEメソッド)の前後にScriptを実行します。

Create・Update

Createトリガー

さっそくトリガーを実際に使ってみましょう。以下にPostCreateTriggerを使用したコードを示します。

// LOE へ接続
var serviceUrl = "https://user-ctp.windows.net";
var token = new NetworkCredential(User.UserId, User.Password, serviceUrl).GetWindowsLiveAuthenticationToken();
var loe = new LiveOperatingEnvironment();
loe.Connect(token, AuthenticationTokenType.UserToken, new Uri(serverUrl), new LiveItemAccessOptions(true));

// Mesh Object の生成
var mo = new MeshObject("Mesh Object 1");

// トリガーの設定
mo.Resource.Triggers.PostCreateTrigger =
    Statement.Sequence(
        Statement.CreateResource<MeshObjectResource>(
            "s1",
            new Uri("https://user-ctp.windows.net/V0.1/Mesh/MeshObjects"),
            new MeshObjectResource("Mesh Object 2"))).Compile();

// Mesh Object の追加
loe.Mesh.MeshObjects.Add(ref mo);

コードの処理内容は特に意味のないものですが,Mesh Object 1という名前のMesh ObjectをMeshに追加しています。このMesh Object 1が作成された後に,MeshにMesh Object 2という名前のMesh Objectをさらにトリガー処理により追加しています。

実行した結果は,Live Framework Resource Browserで確認するか,リソース読み取りのコードを記述して確認してみましょう。Mesh内に上記ふたつのMesh Objectが生成されていれば正しく動作していることがわかります。

Updateトリガー

続いて,Updateトリガーの例を示します。作成済みのMesh Objectを取得し,名前の変更を行います。その際にトリガーでNewsアイテムを追加します。

// Mesh Object 1 の取得
var mos = from m in loe.Mesh.MeshObjects.Entries
          orderby m.Resource.Title
          where m.Resource.Title == "Mesh Object 1"
          select m;

foreach (var m in mos)
{
    // News アイテムの生成
    var news = new NewsItemResource("LiveMesh.AppMessagePost");
    news.Contexts.Add(new NewsItemContext("Scope", "LiveFX/MeshObject", null, null, "LiveFX/MeshObject"));
    news.Contexts.Add(new NewsItemContext("Target", "text/plain", null, null, null));
    
    // トリガーの設定
    var param = Statement.ResourceParameter(typeof(MeshObjectResource));
    m.Resource.Triggers.PostUpdateTrigger =
        Statement.Sequence(
            new Statement[] {
            Statement.CreateResource<NewsItemResource>("s1", null, news,  
                    Statement.Bind("CollectionUrl", param, "NewsFeedLink"), 
                    Statement.Bind("Request.Contexts[0].Text", param, "Title"),
                    Statement.Bind("Request.Contexts[1].Text", param, "Title"))},
            param).Compile();
    
    // 名前の変更
    m.Resource.Title = "Mesh Object 1 - Renamed";
    m.Update();
}

Newsアイテムの生成とResource Scriptの内容が少し複雑になっていますが,Mesh Objectのトリガーを設定して,リソース操作(ここでは更新)を行っているところはCreateトリガーの場合と特に変わりありません。

Resource Scriptの記述中にこれまでに登場していないResourceParameterという記述があります。Newsアイテムを生成するとき,そのNewsアイテムの追加先はMesh ObjectのNewsFeedLinkです。また,Newsアイテムのメッセージ内容には変更されたMesh Objectの名前を設定しています。これらを指定するためにResourceParameterを使用しています。コード中のようにStatement.Bindメソッドの引数とStatement.CreateResourceメソッドの引数に指定することで,foreach内の変数m(MeshObject型)のプロパティ値をStatement内で使用できます。

このコードを実行すると,Mesh Object 1というMesh Objectが,「Mesh Object 1 – Renamed」という名前に変更され,トリガーによりMesh Object内のNewsに新しい項目が追加されているはずです。実行の確認はResource Browser等を用いる必要がありますが,名前の変更対象にLive MeshフォルダーのMesh Objectを選択するようにコードを変更すると,Live DesktopのMesh barのNewsで実行動作の確認が可能です。

トリガーの制限

Live Framework CTPの未実装による制限か仕様かは明確になっていませんが,Create・Updateトリガーは,リソースの生成と更新を行う前に毎回設定する必要があります。つまり,トリガーを設定したリソースの生成・更新を行うと,そのリソースに設定されていたトリガーはトリガー処理後に解除され,リソースはトリガーが設定されていない状態になります。特にUpdateの際も毎回設定する必要があり,現在は活用しづらいものになっています。

著者プロフィール

松江祐輔(まつえゆうすけ)

日本システムウエア株式会社 勤務。現在,ハードウェア設計・検証業務を担当。大学生・大学院生時代はベンチャー企業 有限会社ミレニアムシステムズにプログラマーとして従事。趣味はプログラミング。好きな言語はVisual Basic。Microsoft MVP for Windows Live Platform(Jul 2010 - Jun 2011),Windows Live(Jul 2011 - Jun 2013)。

URL:http://katamari.jp

コメント

コメントの記入