オブジェクトストレージは、バイナリ・オブジェクト用の永続ストレージを提供します。 オブジェクトはコンテナと呼ばれる名前付きの場所に保管されます。コンテナはネストでき、 オブジェクトは階層的に格納できます。このセクションの主な目的は、この API の使い方を理解できるようにするための例を示すことです。
この機能を使用したい場合は、まず config.xml
ファイルを変更し、Requirements
内に新しい ObjectStorageFeature という名前を追加する必要があります。
たとえば、XML を使用してウィジェットの構成を設定した場合、コードは次のようになります。
KeyStone サーバの URL を保存するのに役立つ設定も追加されています。
<?xml version='1.0' encoding='UTF-8'?>
<widget xmlns="http://wirecloud.conwet.fi.upm.es/ns/macdescription/1" vendor="Wirecloud" name="objectstorage-test-widget" version="1.0">
<details>
<title>Wirecloud Object Storage API test widget</title>
<authors>aarranz</authors>
<email>aarranz@conwet.com</email>
<image>images/catalogue.png</image>
<smartphoneimage>images/catalogue_iphone.png</smartphoneimage>
<description>This widget is used to test whether the Object Storage API is usable by widgets</description>
<doc>doc/index.html</doc>
</details>
<requirements>
<feature name="ObjectStorage"/>
</requirements>
<preferences>
<preference name="keystone_url" type="text" label="Keystone Server" description="Keystone Server where the Object Storage server to use for testing the integration between Wirecloud and the Object Storage GE is registered" default="https://cloud.lab.fiware.org/keystone"/>
</preferences>
<wiring/>
<contents src="test.html" contenttype="text/html" charset="utf-8" useplatformstyle="true"/>
<rendering height="24" width="6"/>
</widget>
RDF を使用したい場合は、コードは次のようになります :
!
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
xmlns:foaf="http://xmlns.com/foaf/0.1/"
xmlns:wire="http://wirecloud.conwet.fi.upm.es/ns/widget#"
xmlns:gr="http://purl.org/goodrelations/v1#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:usdl="http://www.linked-usdl.org/ns/usdl-core#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dcterms="http://purl.org/dc/terms/"
xmlns:vcard="http://www.w3.org/2006/vcard/ns#"
>
<wire:Widget rdf:about="http://wirecloud.conwet.fi.upm.es/ns/widget#Wirecloud/objectstorage-test-widget/1.0">
<dcterms:creator>
<foaf:Person rdf:nodeID="N2cda3cef67eb47558145c705d0d3b191">
<foaf:name>aarranz</foaf:name>
</foaf:Person>
</dcterms:creator>
<wire:displayName>Wirecloud Object Storage API test widget</wire:displayName>
<foaf:page rdf:resource="doc/index.html"/>
<dcterms:description>This widget is used to test whether the Object Storage API is usable by widgets</dcterms:description>
<wire:hasPlatformPreference>
<wire:PlatformPreference rdf:nodeID="Nf5128b00c737420f91385f002c272954">
<dcterms:description>Keystone Server where the Object Storage server to use for testing the integration between Wirecloud and the Object Storage GE is registered</dcterms:description>
<rdfs:label>Keystone Server</rdfs:label>
<wire:index>0</wire:index>
<wire:type>text</wire:type>
<dcterms:title>keystone_url</dcterms:title>
<wire:default>https://cloud.lab.fiware.org/keystone</wire:default>
</wire:PlatformPreference>
</wire:hasPlatformPreference>
<wire:hasImageUri rdf:resource="images/catalogue.png"/>
<usdl:versionInfo>1.0</usdl:versionInfo>
<dcterms:title>objectstorage-test-widget</dcterms:title>
<vcard:addr>
<vcard:Work rdf:nodeID="N353ea6f0c6c24daf8e3e2ba8b1b6396c">
<vcard:email>aarranz@conwet.com</vcard:email>
</vcard:Work>
</vcard:addr>
<usdl:hasProvider>
<gr:BusinessEntity rdf:nodeID="Naf20bf95bb5d4a6484f501744b75deb4">
<foaf:name>Wirecloud</foaf:name>
</gr:BusinessEntity>
</usdl:hasProvider>
<wire:hasPlatformWiring>
<wire:PlatformWiring rdf:nodeID="Na67dd8db508d48338034a1f14ab4f2c9"/>
</wire:hasPlatformWiring>
<usdl:utilizedResource>
<usdl:Resource rdf:about="test.html">
<wire:usePlatformStyle>true</wire:usePlatformStyle>
</usdl:Resource>
</usdl:utilizedResource>
<wire:hasPlatformRendering>
<wire:PlatformRendering rdf:nodeID="Nb55500a19f324a88bc5eff01d3d0bd8d">
<wire:renderingHeight>24</wire:renderingHeight>
<wire:renderingWidth>6</wire:renderingWidth>
</wire:PlatformRendering>
</wire:hasPlatformRendering>
<!-- Here we add the Feature -->
<wire:hasRequirement>
<wire:Feature rdf:nodeID="N2cdd6eec5a4c43ad8cd68d09f51c100c">
<rdfs:label>ObjectStorage</rdfs:label>
</wire:Feature>
</wire:hasRequirement>
<wire:hasiPhoneImageUri rdf:resource="images/catalogue_iphone.png"/>
</wire:Widget>
</rdf:RDF>
ObjectStorage を使い始めるには、まず KeyStone サーバとの接続を設定する必要があります。
そのため、新しい KeystoneAPI
を作成します :
var keystone = new KeystoneAPI(url, options)
サポートされているオプションの全リストについては、
ObjectStorage Javascript API documentation
の資料を参照してください。ただし、サマリとして、url
は、ObjectStorage
サーバの場所です。また、IdM 認証を使用して ObjectStorage
インスタンスに接続している場合は、必要な認証資格情報を渡す必要があります。
これには2つの方法があります :
token
オプションを利用して必要な Authentication
ヘッダを直接渡しますuse_user_fiware_token
オプションを使用しますこの例は、FIWARE テストベッドで利用可能なリソースを使用して KeyStone サーバに 接続する方法を示しています。使用する Keystone URL は設定から取得されたものです :
var keystone = new KeystoneAPI(MashupPlatform.prefs.get('keystone_url'), {
use_user_fiware_token: true
});
KeyStone サーバに接続したら、考慮に入れる必要があるのは、ユーザは複数のテナントを
使用して情報を保存できるということです。ユーザが利用できるテナントの一覧を
取得するには、以下の getTenants
関数を使います :
keystone.getTenants([options])
options
引数は、次の2つのコールバックを設定することができます :
onSuccess
は、リクエストが正常に終了したときに呼び出されます。
この関数は、リクエストを行ったユーザが利用できるすべてのテナントを含む
フィールド・テナントを持つ辞書を受け取りますonFailure
は、リクエストがエラーで終了したときに呼び出されます次の例では、両方のコールバックで関数を呼び出します。リクエストが正常に終了すると、 最初に利用可能なテナントの ID が表示されます。そうでなければ、メッセージ・エラーを 表示します :
keystone.getTenants({
onSuccess: function(data) {
document.getElementById('tenantId').textContent = data.tenants[0].id;
},
onFailure: function () {
document.getElementById('tenantId').textContent = 'Fail';
}
});
使用するテナントを選択したら、getAuthToken
関数を使って認証トークンを
取得しなければなりません :
keystone.getAuthToken([options])
options
引数には以下のフィールドが含まれます :
tenantName
: 生成されたトークンに関連付けられるテナントの名前。tenantId
属性とtenantName
属性はどちらもオプションですが、同時に指定しないでくださいtenantId
: 生成したトークンに関連付けるテナントの id
。tenantId
属性と
tenantName
属性はどちらもオプションですが、一緒に指定しないでくださいonSuccess
: リクエストが正常に終了したときに呼び出されます。
この関数は2つのパラメータを受け取りますnew_token
: ObjectStorage へのアクセスに使用できる新しいトークンdata
: テナントが利用できるサービスのカタログonFailure
: リクエストがエラーで終了したときに呼び出されます次のスニペットはこの関数の使い方を示しています。この場合、前のコードで取得した テナント ID を使用します。ObjectStorage の URL を取得するために data パラメータも処理します :
keystone.getAuthToken({
tenantId: data.tenants[0].id,
onSuccess: function (new_token, data) {
for (i = 0; i < data.access.serviceCatalog.length; i++) {
if (data.access.serviceCatalog[i].type === 'object-store') {
object_storage = data.access.serviceCatalog[i].endpoints[0].publicURL;
}
}
},
onFailure: function () {
document.getElementById('api_token').textContent = 'Fail';
}
});
ObjectStorage サーバの URL を入手したら、それに接続できます。そのために、 以下の関数を使用しします :
objectStorage = ObjectStorageAPI(url)
今回の例では、ObjectStorage サーバの URL を object_storage
変数に保存したので、
コードは次のようになります :
objectStorage = ObjectStorageAPI(object_storage)
ObjectStorage サーバに接続すると、コンテナで利用可能なすべてのコンテンツを
リストすることができます。そのために、listContainer
関数を使用します :
objectStorage.listContainer(container[, options])
container
引数はコンテナの名前ですが、options
引数は以下のフィールドを
含むべきです :
token
: 以前に getAuthToken
関数で取得したトークンonSuccess
: リクエストが正常に終了したときに呼び出されます。
この関数は引数としてコンテナ内の利用可能なファイルのリストを受け取りますonFailure
: リクエストがエラーで終了したときに呼び出されます次の例では、integrationTests コンテナ内の利用可能なファイルを取得し、 最初のファイルの名前を表示します。
objectStorage.listContainer('integrationTests', {
token: token,
onSuccess: function(file_list) {
document.getElementById('file_name').textContent = file_list[0].name;
},
onFailure: function () {
document.getElementById('file_count').textContent = 'Fail';
}
});
ObjectStorage に接続している場合は、ファイルを簡単にアップロードすることもできます。
そのためには、uploadFile
関数をを使用します :
objectStorage.uploadFile(container, file[, options])
container
は file
がアップロードされる予定の名前ですが、file はアップロード
されるコンテンツです。options
引数は以下のフィールドを含むべきです :
token
: 以前に getAuthToken
関数で取得した token
file_name
: アップロードされたコンテンツを container
に保存するために使われる名前onSuccess
: リクエストが正常に終了したときに呼び出されます。この機能は
引数を受け取りませんonFailure
: リクエストがエラーで終了したときに呼び出されますここでは、"Hello world!" というテキストファイルをアップロードする方法を示します。
var blob = new Blob(["Hello world!"], { type: "text/plain" });
objectStorage.uploadFile('integrationTests', blob, {
token: token,
file_name: 'test1.txt',
onSuccess: function() {
document.getElementById('file_upload').textContent = 'OK';
},
onFailure: function () {
document.getElementById('file_upload').textContent = 'Fail';
}
});
ファイルをアップロードすると便利ですが、場合によっては削除したいことがあります。
そのために、deleteFile
関数を使用します :
objectStorage.deleteFile(container, file_name[, options])
container
はファイルが削除されるコンテナの名前で、file_name
は削除する
ファイルの名前です。options
引数は以下のフィールドを含むべきです :
token
: 以前に getAuthToken
関数で取得したトークンonSuccess
: リクエストが正常に終了したときに呼び出されます。この機能は
引数を受け取りませんonFailure
: リクエストがエラーで終了したときに呼び出されます次の例は、前の手順で作成したファイルを削除する方法を示しています :
objectStorage.deleteFile('integrationTests', file_name, {
token: token,
onSuccess: function() {
document.getElementById('file_deletion').textContent = 'OK';
},
onFailure: function () {
document.getElementById('file_deletion').textContent = 'Fail';
}
});
この機能を使うことを学ぶ最良の方法はそれを使うことです。このため、このガイドに 基づいて非常に簡単な例を紹介します。コードを確認して好きなように変更し、 それが機能するかどうかをテストします。このウィジェットは、実行する前に instanceTests コンテナを作成した場合にのみ機能します。それ以外の場合は失敗します。
目次 | t |
---|---|
スライド一覧 | ESC |
フルスクリーン | e |
発表者ビュー | p |
ソースファイル | s |
スライド番号 | n |
画面ブランキングの切り替え | b |
スライド・コンテキストの表示/非表示 | c |
ノート | 2 |
ヘルプ | h |