使ってみよう! Live Framework

第8回Mesh-Enabled Web アプリケーション ―― Newsリソース

今回はMesh-enabled WebアプリケーションからMeshサービスへのアクセスとNewsリソースについてです。

はじめに

前回はMesh-Enabled Webアプリケーションの実行まで行いました。Mesh-enabled Webアプリケーションとは、Webアプリケーションの特徴を持ち、デスクトップアプリケーションとしての特徴も持ったアプリケーションです。

Mesh-enabled Webアプリケーションは、Webブラウザ内のLive Desktop上で実行できるだけでなく、ローカルPCのデスクトップからもデスクトップアプリケーションのように実行が可能です。デスクトップアプリケーションらしいリッチなインターフェースはSilverlightにより実現しています。

また、アプリケーション自身およびアプリケーションのデータは、ローカルPC等のデバイス上にコピーされ、インターネットに接続していない状態でも実行が可能なこともデスクトップアプリケーションらしい特徴のひとつになっています。インターネットに接続していない時に変更されたデータは、インターネット接続が有効になった時に自動でMesh上のデータと同期されることになります。

さて今回の内容です。前回はMesh-enabled WebアプリケーションからMeshの接続について触れていませんでしたので、今回はその部分とMesh-enabled WebアプリケーションのUIによってより活かすことのできるNewsリソースについてです。

セキュリティ

Meshサービスへアクセスする前にMesh-enabled Webアプリケーションの特徴のひとつ、セキュリティについてふれておきましょう。

Mesh-Enabled Webアプリケーションは、ローカルPC上でも実行が可能ですが、サンドボックス内で実行されアプリケーションは自由にローカルPC上のデータにアクセスすることはできません。またMeshサービス上のフォルダやファイルへのアクセスも制限されています。

基本的にはMesh-Enabled Webアプリケーションは、アプリケーション自身のデータにのみアクセスが可能です。Mesh-Enabled Webアプリケーションをインスタンス化する方法を思い出してみてください。Live Framework Developer SandboxのAppsタブからアプリケーションをインスタンス化しましたが、このときにアプリケーションに対してアクセス許可を設定する必要がありました図1⁠。

図1 アプリケーションのアクセス許可
図1 アプリケーションのアクセス許可

このとき、図1中の「Change」リンクからアプリケーションに対してアクセスを許可するフォルダなどのMesh Objectを選択することができます図2⁠。こうすることでアプリケーションは初めて自身以外のMesh Objectにアクセスが可能になります。

図2 アクセスを許可するMesh Objectの選択
図2 アクセスを許可するMesh Objectの選択

以上を踏まえた上で、Mesh-enabled WebアプリケーションからMeshサービスへアクセスしてみましょう。

Meshへの接続

前回と同様Visual StudioのSilverlight Mesh-enabled Webアプリケーションプロジェクトにより開発します。前回のプロジェクトを変更しても、新しくプロジェクトを作成しても構いません。

本連載第4回から6回まではLive Framework SDKのライブラリのひとつ.NET Kitを使用していましたが、今回はSilverlight Kitを使用します。プロジェクトを作成した時点で既にライブラリへの参照が追加されています。ライブラリを使用すれば、これまでとほぼ同様のクラスと操作により簡単にMeshサービスへアクセスが可能です。

.NET FrameworkからMeshサービスへアクセスしたときとは異なり、Mesh-enabled Webアプリケーションはセキュリティで述べたようにMesh上のデータに自由にアクセスできません。アプリケーションは、Mesh上の同期単位であるMesh Objectのひとつとして存在し、自身のMesh Objectにはアクセス可能です。そのためアプリケーション自身を表すMeshApplicationServiceというクラスが用意されています。このクラスを使用するとプロパティから直接アプリケーションのData Feedなどの参照が可能です。

Data FeedとData Entryの追加と参照

作成されたSilverlightのプロジェクトのPage.xaml.vbファイルを確認してください。MeshApplicationServiceのオブジェクトを使用するコードが既に記述されています。

Private meshApp As MeshApplicationService
Public Sub New()
    InitializeComponent()

    meshApp = Application.Current.GetMeshApplicationService()
    AddHandler meshApp.LoadCompleted, AddressOf meshAppLoaded
    meshApp.LoadAsync(Nothing)
End Sub

Pageクラスのコンストラクタ内でMes ApplicationServiceオブジェクトの参照を取得し(GetMeshApplicationServiceメソッド部分⁠⁠、イベントの設定、そしてLoadAsyncメソッドを呼び出しています。LoadAsyncメソッドの処理が完了することでMeshApplicationServiceオブジェクトからMeshサービスへのアクセスが可能になります。このLoadAsyncメソッドのようにネットワークへの接続が発生する可能性のあるメソッドは非同期処理のメソッドとなっています。

ロードが完了すると、Pageクラス内に定義されているmeshAppLoadedメソッドが呼ばれます。ここに処理を追加していきましょう。

サンプルとしてアプリケーション自身のData FeedにData Entryを追加と、Data Entryの参照を行います。非同期であることを除けば、これまで本連載で扱った操作方法と大きく違いはありません。Data FeedやData Entryについては第4回で扱っています。併せて確認してみてください。

以下にData Feedを作成して、アプリケーションのData Feedコレクションに追加しているコードを示します。

Private Sub meshAppLoaded(ByVal o As Object, ByVal e As EventArgs)
    ' Data Feed の作成
    Dim feed = New DataFeed("Data Feed Sample")

    ' Data Feed の追加
    AddHandler meshApp.DataFeeds.AddCompleted, AddressOf DataFeedsAddCompleted
    meshApp.DataFeeds.AddAsync(feed, Nothing)
End Sub

AddAsyncメソッドの第2引数は、Object型です。追加完了時のイベント引数の値として参照することができ、必要に応じて使用します。今回はNothing(null)を指定しています。Data Feedを追加する前にイベントの関連付けも行っています。

Data Feedの追加完了時のイベント処理を記述します。Data Entryを作成しData Feedへ追加しています。

' Data Feed の追加完了
Private Sub DataFeedsAddCompleted(ByVal sender As Object, ByVal e As Microsoft.LiveFX.Client.LiveItemEventArgs(Of Microsoft.LiveFX.Client.DataFeed))
    ' Data Entry の作成
    Dim entry = New DataEntry("Data Entry Sample")

    ' meshApp 最初の Data Feed に Data Entry 追加
    Dim feed = meshApp.DataFeeds.Entries.FirstOrDefault
    AddHandler feed.DataEntries.AddCompleted, AddressOf DataEntriesAddCompleted
    feed.DataEntries.AddAsync(entry, Nothing)
End Sub

最後に、Data Entry追加完了のイベント処理を記述します。Data Entryの内容を一覧で表示しています。

' Data Entry の追加完了
Private Sub DataEntriesAddCompleted(ByVal sender As Object, ByVal e As Microsoft.LiveFX.Client.LiveItemEventArgs(Of Microsoft.LiveFX.Client.DataEntry))
    ' Data Entry 一覧表示
    For Each feed In meshApp.DataFeeds.Entries
        For Each entry In feed.DataEntries.Entries
            MyListBox.Items.Add(entry.Resource.Title)
        Next
    Next
End Sub

コードではListBoxにData Entryの内容を追加しています。XAMLのコード(Page.xaml)を次のように変更してください。

<UserControl x:Class="MeshApp1Silverlight.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300">
    <Grid x:Name="LayoutRoot" Background="White">
        <ListBox x:Name="MyListBox" />
    </Grid>
</UserControl>

以上までのコードを実行すると、Live Desktopでの結果は図3のようになります。ひとつData Entryが追加されて、そのData Entryの内容が表示されています。

図3 Live Desktop上での実行結果
図3 Live Desktop上での実行結果

上記のコードは意味のないものですが、アプリケーションが使用するデータはData FeedとData Entryを組み合わせて保存・取得するとよいでしょう。

Mesh Objectの参照

MeshApplicationServiceクラスによってアプリケーション自身のData Feedなどのリソースアクセスを紹介しました。アプリケーションにMesh上のMesh Objectのアクセスを許可している場合、どのようにアクセスすればよいのでしょうか。

MeshApplicationServiceにはLiveOperatingEnvironmentプロパティが用意されています。これを使用すればLive Operating Environmentのエンドポイントからのすべてのリソースにアクセスできます。Mesh Objectを参照するには次のようになります。

Dim loe = meshApp.LiveOperatingEnvironment
For Each mo In loe.Mesh.MeshObjects.Entries
    MyListBox.Items.Add(mo.Resource.Title)
Next

Mesh Objectだけでなくデバイス等にも同様にアクセス可能です。

Newsリソース

ここからは本連載では初めて紹介するNewsリソースついてです。Live Meshには、フォルダの作成やファイルの追加・削除、メンバーの追加・削除といった情報を表すNewsというアイテムが用意されています。これもデバイスやMesh Objectと同じリソースのひとつです。図4にNewsを含むLive Frameworkのリソースモデルの一部を示します。

図4 Live Framework リソースモデル
図4 Live Framework リソースモデル

図を見るとNewsというリソースは2種類あります。ひとつはMesh Objectの下にあるNewsです。これはひとつのMesh Objectに対してのNewsです。もうひとつはMeshの下にあるNewsです。これはすべてのMesh ObjectのNewsのコレクションおよびMesh自体の情報を表すNewsです。

いずれのNewsも、フォルダの作成やファイルの追加等の操作をしていると自動的にNewsアイテムが増えていることがLive Meshサービスを使用しているとわかるかと思います。Mesh ObjectのNewsは、Live MeshフォルダやMesh-enabled Webアプリケーションを開いた時にウィンドウに付いているMesh Bar図5から確認できます。MeshのNewsは、Live Framework Clientをインストールしている場合はタスクトレイアイコンから確認できます図6⁠。また、Live Framework Developer SandboxのNewsタブやLive Desktopからも参照可能です。

図5 Mesh-enabled WebアプリケーションのMesh Bar
図5 Mesh-enabled WebアプリケーションのMesh Bar
図6 Live Framework Client タスクトレイ
図6 Live Framework Client タスクトレイ

NewsアイテムはMesh Objectなどと同様の操作で参照や追加が可能です。ただし、編集や削除の操作は用意されていません。ファイル操作等の情報だけでなくアプリケーション独自の情報としてNewsの利用も もちろんできます。特にMesh-enabled Webアプリケーションを使うと、Live Desktop上でもローカルのデバイス上でもMesh Barが表示され、よりNewsを活用したアプリケーションの開発が可能です。

Newsアイテムの追加

それでは、Mesh-enabled WebアプリケーションからNewsアイテムをアプリケーション自身のNewsへ追加してみたいと思います。アプリケーション独自のメッセージをMesh Barに表示させることが目標です。

今回紹介するNewsに関して詳細なドキュメントは今のところ公開されていないようです。これから紹介する内容はLive Frameworkのドキュメントの内容に加えてLive Desktopの実際の動作から判断した内容が含まれています。

ライブラリでは、ひとつのNewsアイテムはNewsItemクラスで表されています。LiveItemクラスを継承し、基本的なリソースのプロパティを持っています。実際のNewsとしての情報はNewsItemContextというクラスを用いて表します。NewsItemクラスはNewsItemContextのコレクション型のContextsプロパティを持っています。

NewsItem

最初にNewsItemオブジェクトを生成します。コンストラクタの引数は、Resource.Titleプロパティへの値です。

Dim newsItem = New NewsItem("LiveMesh.AppMessagePost")

Newsの場合のTitleの値の規則は、特に決まりはありませんが、Live Meshの実装を調べてみると次のような名前がつけられています。

  • LiveMesh.FileAdd
  • LiveMesh.FileUpdate
  • LiveMesh.FolderAdd
  • LiveMesh.MemberAdd
  • LiveMesh.UserMessagePost

Mesh Barに表示される際にTitleプロパティが利用されているようです。アプリケーションのメッセージとしてNewsを追加する場合、⁠LiveMesh.AppMessagePost」とすると良いようです。

NewsItemContext

次にNewsItemContextオブジェクトを生成します。通常、NewsItemContextは2種類生成します。ひとつは、Newsアイテムを参照しているアイテム(Live Meshフォルダやアプリケーションなど)のメタデータを持つもの。もうひとつが、Newsアイテムに実際に関連するアイテム(追加したファイルやメンバーなど)のメタデータを持つものです。

NewsItemContextクラスは以下のプロパティがあり、値を設定する必要があります。

Kind(String型)

ScopeまたはTargetのどちらかを指定します。追加しようとしているNewsアイテムを参照するMesh ObjectについてのメタデータをNewsItemContextに設定する場合は、Scopeを指定します。操作の対象となったファイルやアプリケーションのメッセージのメタデータをNewsItemsContextに設定する場合は、Targetを指定します。

Type(String型)

メタデータの対象がテキストやバイナリファイルの場合は、text/plainやapplication/octet-streamを指定します。Mesh Objectやアプリケーションの場合、LiveFX/MeshObjectやLiveFX/ApplicationInstanceとなります。

Text(String型)

通常Resource.Titleの値とし、アプリケーションやユーザーのメッセージの場合、メッセージそのものとなります。NewsアイテムをMesh Bar等で表示する際に、このプロパティ値が使用されます。

TargetLink(Uri型)

対象のリンク先です。Live Frameworkでは、すべてのリソースはURL(URI)で表現可能でした。Mesh Objectの場合、そのMesh Objectを示す相対URLを指定します。

Relationship(String型)

対象の関連情報を指定します。ユーザーにTargetLink先のリンクを示す際に表示する情報として、または対象の型についての補足などの利用が想定されているようです。

以上を踏まえたコードが以下になります。

' Kind = Scope の NewsItemContext 生成
Dim scopeContext = New NewsItemContext("Scope", "LiveFX/ApplicationInstance", meshApp.Resource.Title, meshApp.SelfLink, Nothing)
newsItem.Resource.Contexts.Add(scopeContext)

' Kind = Target の NewsItemContext 生成
Dim message = "gihyo.jp"
Dim targetContext = New NewsItemContext("Target", "text/html", message, New Uri("http://gihyo.jp"), Nothing)
newsItem.Resource.Contexts.Add(targetContext)

' News アイテムの追加
meshApp.News.AddAsync(newsItem, Nothing)

KindプロパティがScopeのNewsItemContextオブジェクトには、Typeプロパティに「LiveFX/ApplicationInstance⁠⁠、TextプロパティにアプリケーションのResource.Titleプロパティを指定しています。アプリケーション自身のURLはSelfLinkプロパティから取得でき、それを指定しています。

KindプロパティがTargetのNewsItemContextオブジェクトには、アプリケーションのメッセージとしてgihyo.jpへのリンクを追加しています。単純に文字列だけのメッセージを表示するにはTargetLinkプロパティの値をNothing(null)にします。

それぞれのNewsItemContextをNewsItems.Contextsに追加し、最後にアプリケーションのNewsコレクションにNewsItemsオブジェクトを追加しています。

実際にアプリケーションを実行してみましょう。アプリケーション起動後、しばらくするとMesh BarのNews部分にメッセージが表示されれば成功です図7⁠。図はローカルPCから実行した結果です。

図7 ローカルPC上での実行結果
図7 ローカルPC上での実行結果

もし、Mesh ObjectではなくMeshのNewsにNewsアイテムを追加した場合は、次のように変更するだけです。

' meshApp.News.AddAsync(newsItem, Nothing)
meshApp.LiveOperatingEnvironment.Mesh.News.AddAsync(newsItem, Nothing)

Newsアイテムの参照

最後にNewsアイテムの参照についてです。ここまでできていれば簡単ですね。ほかのリソース同様の操作で参照します。次にアプリケーション自身のNewsとMeshのNews一覧を表示するコードを示します。

' アプリケーション自身の News
For Each n In meshApp.News.Entries
    MyListBox.Items.Add(n.Resource.Title)
Next

' Mesh の News
For Each n In meshApp.LiveOperatingEnvironment.Mesh.News.Entries
    MyListBox.Items.Add(n.Resource.Title)
Next

Mesh Barを見ると、ファイル操作をしたとき そのメンバーの情報も表示されていることがわかります。もしメンバー情報も取得したい場合は、Resource.Authorsプロパティを使用します。

' アプリケーション自身の News
For Each n In meshApp.News.Entries
    MyListBox.Items.Add(n.Resource.Title)

    ' News アイテムに関連付いたメンバーの情報
    For Each a In n.Resource.Authors
        MyListBox.Items.Add(a.Name)
    Next
Next

今回はここまでです。いかがでしたでしょうか。次回もMesh-enabled Webアプリケーション開発の内容を紹介する予定です。

おすすめ記事

記事・ニュース一覧