はじめに
前回に続きResource Scriptについてです。今回は,リソースの生成・読み取り・更新・削除のリソース操作およびデータフローについて紹介します。また,最後にはシリアライズ化したResource Scriptを直接,Live Operating EnvironmentへHTTP POSTし,Scriptの処理動作を確かめてみたいと思います。
今回紹介しているコードはC#を使用しています。実際にコードを実行するには,適当なコンソールアプリケーション プロジェクトを作成し,Live Framework SDKの.NET Framework用のライブラリの参照を追加してください(※1)。
- ※1
%programfiles%\Microsoft SDKs\Live Framework\v0.91\API Toolkits\.Net Libraryにある以下のDLLを追加します。
- Microsoft.LiveFX.Client.dll
- Microsoft.LiveFX.ResourceModel.dll
- Microsoft.Web.dll
また,下記のように名前空間をインポートします。
using Microsoft.LiveFX.Client;
using Microsoft.LiveFX.ResourceModel;
using Microsoft.LiveFX.ResourceModel.Scripting;
リソースの作成
手始めにStatementを使用してリソースを作成してみましょう。リソースの作成には,Statement.CreateResource<TResource>メソッドを使用してCreateResourceStatement<TResource>オブジェクトを生成します。TResource部分にはリソースの型を指定します。Newsアイテムを作成する場合,次のようになります。Newsアイテムについては本連載第8回で紹介しています。
// News アイテムリソースの生成
var news = new NewsItemResource("LiveMesh.AppMessagePost");
news.Contexts.Add(new NewsItemContext("Target", "text/plain", "メッセージテスト", null, null));
// CreateResourceStatement の生成
var s1 = Statement.CreateResource<NewsItemResource>("s1", new Uri("https://user-ctp.windows.net/V0.1/Mesh/News"), news, null);
CreateResourceメソッドの戻り値がCreateResourceStatementオブジェクトで,上記コードで示した引数は最初から順に以下のプロパティに設定されます。
- CreateResourceStatementのNameプロパティ
- CreateResourceStatementのCollectionUrlプロパティ
- CreateResourceStatementのRequestプロパティ
CollectionUrlに指定したコレクション(ここではNewsアイテムコレクション)にRequestで指定したリソースを作成するという意味の構文になります。NameはCreateResourceStatement自身の名前です。Statementの名前は,複数のStatementを使用する場合に特定のStatementを指定するために使用します。
CreateResourceメソッドは,これ以外にもいくつかのオーバーロードが定義されています。リソースを作成するだけであればNameプロパティを指定しない記述も可能です。
var s1 = Statement.CreateResource<NewsItemResource>(new Uri("https://user-ctp.windows.net/V0.1/Mesh/News"), news);
CreateResourceStatementだけでは実行できないため,順次処理を表すSequenceStatementと組み合わせ,コンパイル後実行します。
// Sequence Statement の生成
var sequence = Statement.Sequence(s1);
// コンパイル
var script = sequence.Compile();
// 実行
var creds = new NetworkCredential("user@example.jp", "password", "https://user-ctp.windows.net/V0.1/Script");
script.RunAtServer(creds);
実行後,Live Framework ClientのNewsを確認すると図1のようにNewsアイテムが追加されたことがわかります。
上記のResource Scriptによるリソース作成は,Resource Scriptを使用しなかった場合,次のコードと同じ内容になります。
var creds = new NetworkCredential(User.UserId, User.Password);
var loe = new LiveOperatingEnvironment();
var news = new NewsItem("LiveMesh.AppMessagePost");
news.Resource.Contexts.Add(new NewsItemContext("Target", "text/plain", "メッセージテスト", null, null));
loe.Mesh.News.Add(ref news);
データフロー
リソースの作成はひとつのStatementで処理を完結することが可能でしたが,たいていのリソース操作では複数のStatementを組み合わせることが必要です。
例えば,Live Meshフォルダを作成する場合はMesh Objectを作成し,そのMesh ObjectにData Feedを作成・追加する必要があります。どちらもCreateResourceStatementを使用しますが,そのStatement同士の関連も記述する必要があります。このStatementの関係の記述をデータフローやデータの相互関係の記述と前回呼んでいました。
Live Meshフォルダを作成する例を示します。Mesh Objectの作成は先ほどのNewsアイテムの作成と同等です。
// Live Mesh フォルダとなる Mesh Object の作成
var folder = new MeshObjectResource("アルバム");
folder.Type = "LiveMeshFolder";
var s1 = Statement.CreateResource<MeshObjectResource>("s1", new Uri("https://user-ctp.windows.net/V0.1/Mesh/MeshObjects"), folder);
プロパティの連結
続いてData Feedを作成します。Data Feedを作成する先は,作成したMesh ObjectのData Feedコレクションです。そのコレクションを示すURLは,folder.DataFeedsLinkプロパティにあたりますが,folderはまだMeshへ追加されていないため値を参照してもnullです。
CreateResourceStatementクラスは,RequestとResponseというリソース型のプロパティを持っています。それぞれStatement実行前のリソースと実行後のリソースの状態を表します。このプロパティを用いるとMesh Objectリソース作成後のData FeedコレクションURLは,s1.Response.DataFeedsLinkと表すことができます。
以上からData Feedリソースを作成するコードは次のようなイメージになります。ただし,これもまだ動作しません。
// 間違った Data Feed 作成のStatement 記述
var s2 = Statement.CreateResource<DataFeedResource>("s2", s1.Response.DataFeedsLink, df);
このコードが処理される時点では,まだMesh Object作成処理は実行されていないためs1のResponseの値もnullになっています。ここで使用するのが,Statement.BindメソッドとStatementBindingクラスです。Statement.Bindメソッドの戻り値がStatementBindingです。
Data Feedを作成する例では,CollectionUrlを指定する引数部分をnullとし,後半の引数にStatementBindingオブジェクトを次のように追加します。
var s2 = Statement.CreateResource<DataFeedResource>("s2", null, df, Statement.Bind("CollectionUrl", "s1", "Response.DataFeedsLink"));
Statement.Bindの引数には,s2の対象となるプロパティ,参照先のStatementの名前(s1),参照先のプロパティを指定します。これによって上記コードは,s2のCollectionUrlにs1.Response.DataFeedLinkを設定するという構文になります。StatementBindingを使用するとResource Scriptが実行される際に評価されるため,結果として正しく動作します。Statement.Bindメソッドはこのほかにも多数のオーバーロードが定義されています。
ふたつのStatementを順次処理するとLive Meshフォルダが作成されます。
var sequence = Statement.Sequence(s1, s2);
var script = sequence.Compile();
var creds = new NetworkCredential("user@example.jp", "password", "https://user-ctp.windows.net/V0.1/Script");
script.RunAtServer(creds);

