トリガーとしてのResource Script
Live FrameworkのMesh Objectなどのリソースは、
トリガーに使用できるリソースの操作は、
- PreCreateTrigger
- PostCreateTrigger
- PreUpdateTrigger
- PostUpdateTrigger
- PreDeleteTrigger
- PostDeleteTrigger
PreCreateTriggerとPostCreateTriggerはリソースの生成の前後、
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);
コードの処理内容は特に意味のないものですが、
実行した結果は、
Updateトリガー
続いて、
// 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の内容が少し複雑になっていますが、
Resource Scriptの記述中にこれまでに登場していないResourceParameterという記述があります。Newsアイテムを生成するとき、
このコードを実行すると、
トリガーの制限
Live Framework CTPの未実装による制限か仕様かは明確になっていませんが、
Delete
Deleteトリガーについても確認してみましょう。Deleteトリガーの場合、
// トリガーを設定する 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を取得し、
実行し、

以下のコードのように対象のMesh Objectを削除すると、
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を実行し、
たとえば以下の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の実行結果は、
上記コードの場合、
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の型にキャストしているため、
foreach (CreateResourceStatement<MeshObjectResource> c in createStatements)
{
if (c.WasOperationSuccessful)
{
Console.WriteLine(c.Response.Title + "'s link is " + c.Response.SelfLink.ToString());
}
}
Responseプロパティは、
Resource Scriptの実行に関して、
12回から3回に渡ってResource Scriptについて紹介しました。紹介できたものは、