使ってみよう! Live Framework

第13回 Resource Script(2)

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

はじめに

前回に続き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オブジェクトで,上記コードで示した引数は最初から順に以下のプロパティに設定されます。

  1. CreateResourceStatementのNameプロパティ
  2. CreateResourceStatementのCollectionUrlプロパティ
  3. 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アイテムが追加されたことがわかります。

図1 作成した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クラスは,RequestResponseというリソース型のプロパティを持っています。それぞれ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);

著者プロフィール

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

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

URL:http://katamari.jp

コメント

コメントの記入