使ってみよう! Live Framework

第14回 Resource Script(3)

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

Delete

Deleteトリガーについても確認してみましょう。Deleteトリガーの場合,Create・UpdateトリガーのようにDelete前にトリガーの設定をする必要はありません。Mesh Objectの生成時にDeleteトリガーをしておくと,そのMesh Objectが削除されるときに何かしらの処理を行うことができます。以下にコードを示します。

// トリガーを設定する Mesh Object 取得
var mo = (from m in loe.Mesh.MeshObjects.Entries
          where m.Resource.Title == "Mesh Object 2"
          select m).First<MeshObject>();

// 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));
mo.Resource.Triggers.PreDeleteTrigger = 
    Statement.Sequence(
        new Statement[] {
            Statement.CreateResource<NewsItemResource>("s1", new Uri("https://user-ctp.windows.net/V0.1/Mesh/News"), news,  
                Statement.Bind("Request.Contexts[0].Text", param, "Title"),
                Statement.Bind("Request.Contexts[1].Text", param, "Title"))},
        param).Compile();

mo.Update();

Mesh内からMesh Object 2という名前のMesh Objectを取得し,Deleteトリガーを設定しています。Mesh Objectが削除されたとき,そのMesh Objectの名前をメッセージとしたNewsアイテムをMeshのMesh全体のNewsコレクションに追加します。

実行し,Resource Browserで確認すると,対象のMesh ObjectのPreDeleteTriggerにトリガーが設定されたことがわかります図1⁠。

図1 PreDeleteTrigger

図1 PreDeleteTrigger

以下のコードのように対象のMesh Objectを削除すると,Newsに新しいNewsアイテムが追加されます。

var mo = (from m in loe.Mesh.MeshObjects.Entries
           where m.Resource.Title == "Mesh Object 2"
           select m).First<MeshObject>();
 loe.Mesh.MeshObjects.Remove(mo);

Scriptの実行結果

これまでResource Scriptを実行し,その処理の結果については確認していませんでした。トリガーに指定したResource Scriptは,Scriptの実行が成功したかどうかは判断する手段が用意されていませんが,通常のScriptの実行では,Scriptの実行結果を処理することができます。最後にこの方法について確認しておきましょう。

たとえば以下のScriptを実行します。Mesh Objectを連続で3個生成します。

// Script の生成
var url = new Uri("https://user-ctp.windows.net/V0.1/Mesh/MeshObjects");
var script = Statement.Sequence
    (
        Statement.CreateResource<MeshObjectResource>("s1", url, new MeshObjectResource("Mesh Object 1")),
        Statement.CreateResource<MeshObjectResource>("s2", url, new MeshObjectResource("Mesh Object 2")),
        Statement.CreateResource<MeshObjectResource>("s3", url, new MeshObjectResource("Mesh Object 3"))
    ).Compile();

// Script の実行
var creds = new NetworkCredential(User.UserId, User.Password);
script.RunAtServer(creds);

Scriptの実行結果は,ResourceScriptクラスのResultプロパティから取得できます。CreateResourceStatement<TResource>クラスなどリソース操作を行うStatementクラスは,WebOperationStatementというクラスを継承しています。このクラスはScript実行結果の内容を表す汎用的なプロパティを持っていて,Statementごとに実行結果の判断が可能です。

上記コードの場合,次のようにして,実行されたCreateResourceStatementオブジェクトを取得できます。

var createStatements = from c in script.Result.Children
                       .Where(n => n.GetType().Name.Contains("CreateResource"))
                       select c;

単純に各Statementの実行が成功したか否かは次のように処理します。WasOperationSuccessfulはWebOperationStatementクラスのプロパティです。

foreach (CreateResourceStatement<MeshObjectResource> c in createStatements)
{
    if (c.WasOperationSuccessful)
    {
        Console.WriteLine(c.Name + " is successful");
    }
}

実行したStatementの型にキャストしているため,Statementオブジェクトの持つプロパティを参照して次のように詳しい実行結果を得ることも可能です。今回のコードはすべてCreateResourceStatement<MeshObjectResource>型のため一律にキャストできますが,複数のStatementの型を使用したScriptの場合は,それぞれの型に合わせてキャストする必要があります。

foreach (CreateResourceStatement<MeshObjectResource> c in createStatements)
{
    if (c.WasOperationSuccessful)
    {
        Console.WriteLine(c.Response.Title + "'s link is " + c.Response.SelfLink.ToString());
    }
}

Responseプロパティは,CreateResourceStatement<TResource>クラスのプロパティです。

Resource Scriptの実行に関して,Statementの文法の間違いは,ある程度C#のコンパイルまたは実行時エラーにて判断することができます。実行時に注意する点として,Resource Scriptの制限のため時間のかかる処理を実行することはできません。


12回から3回に渡ってResource Scriptについて紹介しました。紹介できたものは,ほんの一部でしたが,Live FrameworkとResource Scriptのおもしろさを少しでも伝えられたら幸いです。Resource Scriptはドキュメントが少なく,より詳しく知るには試行錯誤が必要だと思いますが是非試してみてください。

著者プロフィール

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

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

URL:http://katamari.jp