ヘッダーをスキップ
Oracle® Fusion Middleware WebCenter Sites開発者ガイド
11gリリース1 (11.1.1.8.0)
E49681-03
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

42 Asset APIのチュートリアル

このチュートリアルの目的は、開発者を対象に、Asset APIの概要を説明することです。つまり、クイックリファレンスであり、Oracle Fusion Middleware WebCenter Sites Java APIリファレンスの代替ではありません。このチュートリアル全体を通じて取り上げられているコードサンプルは、Asset APIの使用方法を示しています。

この章には次の項が含まれます。

42.1 Asset APIの理解

Asset APIは、WebCenter Sitesのアセットにアクセスしてこれらのアセットを操作するためのJava APIです。その主な目的は、アセットを扱うことができるコンテキストを拡大することです。その主な特長は次のとおりです。

42.2 主要インタフェース

Asset APIを使用すると、WebCenter Sitesのアセットのデータと定義の両方にアクセスできます。

Asset APIでは、次の主要インタフェースが定義されています。

42.3 はじめに

42.4 Asset APIによる読取り

ここまでの簡単な背景情報に基づいて、FSIIデータに基づいたいくつかのコードを記述してみましょう。

この項の内容は、次のとおりです。

42.4.1 簡単な例: フィールド値の読取り

FSII記事内の「FSIIHeadline」フィールドのすべての値を読み取ってみましょう。実行する手順は、次のとおりです。

  1. セッションを取得します。

  2. AssetDataManagerのハンドルを取得します。

  3. 問合せを作成します。

  4. 読取りを実行して、結果を出力します。

次に、これらの手順を実装するコードを示します(jspエレメント内)。

<%@ page import="com.fatwire.system.*"%>
<%@ page import="com.fatwire.assetapi.data.*"%>
<%@ page import="com.fatwire.assetapi.query.*"%>
<%@ page import="java.util.*"%>
<cs:ftcs>
<%
Session ses = SessionFactory.getSession();
AssetDataManager mgr =(AssetDataManager) ses.getManager( AssetDataManager.class.getName() );
Query q = new SimpleQuery("Content_C", "FSII Article", null, Collections.singletonList("FSIIHeadline") );
for( AssetData data : mgr.read( q ) )
{
out.println( data.getAttributeData("FSIIHeadline").getData() );
out.println( "<br/>" );
}
%>
</cs:ftcs>
  1. SessionFactory.newSession()によって、指定されたユーザーのセッションが作成されます。それ以降は、このセッション・インスタンスを使用して読み取られたすべてのデータは、そのユーザーのACL権限に準拠します。単にnewSession( null, null )をコールして、仮定ユーザーであるDefaultReaderに属するセッションを取得することもできます。CS駆動型のWebアプリケーションは通常、実行時にこのユーザーとして実行されます。ただし、ユーザー名とパスワードが指定された場合に、それらが間違っていた場合は、例外が返されます。

  2. このセッションを使用して、AssetDataManager.getManagerのハンドルを取得します。(AssetDataManager.class.getName()メソッドによってこの処理が実行されます。)

  3. Queryは、このユーザーの検索条件に基づいた結果を表しています。この例では、シンプルなバージョンのQueryを使用して、アセット・タイプ(Content_C)、サブタイプ(FSII Article)、および取得する属性のリスト(この場合は単にFSIIHeadline)を指定しています。すべてのアセットが目的であるため、3つ目のパラメータ(Conditionインスタンスを受け取ります)はnullです。Conditionの使用法は、後述の第42.4.5項「複雑な問合せ」で示します。

  4. AssetDataManagerread()メソッドは、AssetDataに対するIterableを返します。それぞれのアセット・データには、属性名に対するAttributeDataのインスタンスが含まれています。AttributeData.getData()は、属性自体の実際のデータを返します。

42.4.2 AssetIdの読取り

これらすべてのアセットのIDを取得するにはどうすればいいでしょうか。AssetData.getAssetId()は、AssetIdインスタンスを返します。

第42.4.1項「簡単な例: フィールド値の読取り」のコードは、次に示すように変更すると、AssetIdを出力します。

for( AssetData data : mgr.read( q ) )
{
AssetId id = data.getAssetId();
out.println( data.getAttributeData("FSIIHeadline").getData() + " id=" + id );
out.println( "<br/>" );
}

このコードは、次の行を出力します(AssetIdはコンポジットであるため、id番号とタイプを含んでいます。AssetId.getId()AssetId.getType()はそれぞれidとタイプを返します。

AudioCo. America Announces H300 series id=Content_C:1114083739888 
AudioCo. New Portable Media Player Offers Full Video Experience id=Content_C:1114083739926
AudioCo.'s First Under Water MP3 Player id=Content_C:1114083739951
...

42.4.3 アセットIDに基づいた属性の読取り

なんらかの手段によってアセットのidをすでに取得している場合はどうでしょうか。(テンプレートに渡されたかプログラムを通じて取得した。)そのアセットの属性をどのようにして読み取ることができるでしょうか。ここでは、第42.4.2項「AssetIdの読取り」で使用したコードのAssetId (Content_C:1114083739888を例として取り上げて、このアセットの名前、説明およびFSIIBodyを出力してみましょう。次のコードは、この処理を実行します。

<%@ page import="com.fatwire.system.*"%>
<%@ page import="com.fatwire.assetapi.data.*"%>
<%@ page import="com.fatwire.assetapi.query.*"%>
<%@ page import="java.util.*"%>
<%@ page import="com.openmarket.xcelerate.asset.*"%>
<cs:ftcs>
<%
Session ses = SessionFactory.getSession();
AssetDataManager mgr =(AssetDataManager) ses.getManager( AssetDataManager.class.getName() );
AssetId id = new AssetIdImpl( "Content_C", 1114083739888L );
List attrNames = new ArrayList();
attrNames.add( "name" );
attrNames.add( "description" );
attrNames.add( "FSIIBody" );

AssetData data = mgr.readAttributes( id, attrNames );
AttributeData attrDataName = data.getAttributeData( "name" );
AttributeData attrDataDescr = data.getAttributeData( "description" );
AttributeData attrDataBody = data.getAttributeData("FSIIBody");

out.println( "name:" + attrDataName.getData() );
out.println( "<br/>" );
out.println( "description:" + attrDataDescr.getData() );
out.println( "<br/>" );
out.println( "FSII Body:" + attrDataBody.getData() );
out.println( "<br/>" );
%>
</cs:ftcs>

ここでは、特定のidについて、読み取る属性を指定しています。このコード例からわかるように、ベーシック・フィールド(nameやdescriptionなど)とフレックス属性を指定できます(どちらも属性として扱われます)。

かわりに、AssetDataManager.read( List<AssetId> ids)を使用して、特定のidのすべての属性をロードすることもできます。次のコードでは、単一のAssetIdについてこの処理を実行する方法を示しています。

<%@ page import="com.fatwire.system.*"%>
<%@ page import="com.fatwire.assetapi.data.*"%>
<%@ page import="com.fatwire.assetapi.query.*"%>
<%@ page import="java.util.*"%>
<%@ page import="com.openmarket.xcelerate.asset.*"%>
<cs:ftcs>
<%
Session ses = SessionFactory.getSession();
AssetDataManager mgr =(AssetDataManager) ses.getManager( AssetDataManager.class.getName() );
AssetId id = new AssetIdImpl( "Content_C", 1114083739888L );

Iterable<AssetData> dataItr = mgr.read( Collections.singletonList( id ) );

for( AssetData data : dataItr )
{
for(AttributeData atrData : data.getAttributeData() )
{
out.println( "<br/>" );
out.println( "attribute name:" + atrData.getAttributeName() );
out.println( "data: " + atrData.getData() );
}
}
%>
</cs:ftcs>

42.4.4 問合せ

Queryは、検索対象のデータに基づいた条件を指定します。SKUがiAC-008である製品を検索するにはどうすればいいでしょうか。次のコードはこの処理を実行して、名前とidを出力します。

<%@ page import="com.fatwire.system.*"%>
<%@ page import="com.fatwire.assetapi.data.*"%>
<%@ page import="com.fatwire.assetapi.query.*"%>
<%@ page import="java.util.*"%>
<cs:ftcs>
<%
Session ses = SessionFactory.getSession();
AssetDataManager mgr = (AssetDataManager) ses.getManager( AssetDataManager.class.getName() );
Condition c = ConditionFactory.createCondition( "FSIISKU", OpTypeEnum.EQUALS, "iAC-008" );
Query query = new SimpleQuery( "Product_C", "FSII Product", c, Collections.singletonList( "name" ) );

for( AssetData data : mgr.read( query ) )
{
AttributeData attrData = data.getAttributeData( "name" );
out.println( "name:" + attrData.getData() );
out.println( "<br/>" );
out.println( "id:" + data.getAssetId() );
}
%>
</cs:ftcs>

Queryは、1つのCondition、取得対象の一連の属性および1つのSortOrderで構成されています。前述の例では、iAC-008EQUALになるFSIISKU属性値に基づいて構成された条件を使用しています。前述の例と同じように、生成されるAssetDataのコレクションに格納された状態で取得する属性名のリストを渡しています。

問合せ可能な属性の型とその方法について、いくつかの考慮事項が存在します。各種の問合せアルゴリズムの詳細は、第42.6.2項「問合せのタイプ」を参照してください。簡単に言うと、一部のタイプの問合せは特定のアルゴリズムで実行できますが、他のアルゴリズムでは実行できません。これは、Assetタグ・ファミリとAssetSetタグ・ファミリにおける動作とまったく同じです。このことを例示するために、たとえば、価格(FSIIPrice)が179より高いすべての製品を読み取るとします。

FSIIPriceは、MONEY型です。第42.6.3項「データ型と有効な問合せ演算」表42-2を参照すると、GREATER_THAN演算がこのデータ型について許可されているのは、ベーシック/汎用アルゴリズムのみということがわかります。次のコードでは、このアルゴリズムを使用して、価格が179より高いすべての製品を取得します。問合せアルゴリズムの選択は、このコード内の強調表示された行で行っています。

<%@ page import="com.fatwire.system.*"%>
<%@ page import="com.fatwire.assetapi.data.*"%>
<%@ page import="com.fatwire.assetapi.query.*"%>
<%@ page import="java.util.*"%>

<cs:ftcs>
<%
Session ses = SessionFactory.getSession();
        AssetDataManager mgr = (AssetDataManager) ses.getManager( AssetDataManager.class.getName() );
Condition c = ConditionFactory.createCondition( "FSIIPrice", OpTypeEnum.GREATER_THAN, 179.0f );
Query query = new SimpleQuery( "Product_C", "FSII Product", c, Arrays.asList( "name", "FSIIPrice" ) );
query.getProperties().setIsBasicSearch( true );

for( AssetData data : mgr.read( query ) )
{
AttributeData name = data.getAttributeData( "name" );
AttributeData price = data.getAttributeData( "FSIIPrice" );

out.println( "name:" + name.getData() );
out.println( "id:" + data.getAssetId() );
out.println( "price:" + price.getData() );

out.println( "<br/>" );
}
%>
</cs:ftcs>

42.4.5 複雑な問合せ

複雑な問合せを作成するには、ネストされた複数のConditionを使用します。選択した問合せアルゴリズムに応じて、第42.6.2項「問合せのタイプ」に列記している制約を受けます。

次のコードでは、FSIIPrice属性が179.0より大きいという条件と、名前がFSIIに類似しているという条件の両方または一方を満たしているすべてのProduct_Cアセットを取得します。

<%@ page import="com.fatwire.system.*"%>
<%@ page import="com.fatwire.assetapi.data.*"%>
<%@ page import="com.fatwire.assetapi.query.*"%>
<%@ page import="java.util.*"%>
<cs:ftcs>
<%
Session ses = SessionFactory.getSession();
AssetDataManager mgr = (AssetDataManager) ses.getManager( AssetDataManager.class.getName() );
Condition c1 = ConditionFactory.createCondition( "FSIIPrice", OpTypeEnum.GREATER_THAN, 179.0f );
Condition c2 = ConditionFactory.createCondition( "name", OpTypeEnum.LIKE, "FSII" );
Condition c = c1.and( c2 ); // c1.or( c2 );

Query query = new SimpleQuery( "Product_C", "FSII Product", c, Arrays.asList( "name", "FSIIPrice" ) );
query.getProperties().setIsBasicSearch( true );

for( AssetData data : mgr.read( query ) )
{
AttributeData name = data.getAttributeData( "name" );
AttributeData price = data.getAttributeData( "FSIIPrice" );

out.println( "name:" + name.getData() );
out.println( "id:" + data.getAssetId() );
out.println( "price:" + price.getData() );

out.println( "<br/>" );
}
%>
</cs:ftcs>

42.4.6 ソート

価格に基づいてソートされた結果を取得するにはどうすればいいでしょうか。次のコードでは、SortOrderを指定することで(この例では昇順)、この処理を実行します。ソート順序を逆にするには、このコードの強調表示された行でtruefalseに変更します。

<%@ page import="com.fatwire.system.*"%>
<%@ page import="com.fatwire.assetapi.data.*"%>
<%@ page import="com.fatwire.assetapi.query.*"%>
<%@ page import="java.util.*"%>
<cs:ftcs>
<%
Session ses = SessionFactory.getSession();
        AssetDataManager mgr = (AssetDataManager) ses.getManager( AssetDataManager.class.getName() );

SortOrder so = new SortOrder( "FSIIPrice", true );
Query query = new SimpleQuery( "Product_C", "FSII Product", 
null, Collections.singletonList( "FSIIPrice" ), Collections.singletonList( so ) );

for( AssetData data : mgr.read( query ) )
{
AttributeData price = data.getAttributeData( "FSIIPrice" );

out.println( "id:" + data.getAssetId() );
out.println( "price:" + price.getData() );

out.println( "<br/>" );
}
%>
</cs:ftcs>

The above code sorts and prints asset ids and price in the ascending order of FSIIPrice,

id:Product_C:1114083739851 price:89.99
id:Product_C:1114083739757 price:99.95
id:Product_C:1114083739696 price:129.99
id:Product_C:1114083739301 price:129.99
id:Product_C:1114083739471 price:179.95
id:Product_C:1114083739350 price:189.95
id:Product_C:1114083739225 price:399.99
id:Product_C:1114083739596 price:899.95
id:Product_C:1114083739804 price:1399.99
id:Product_C:1114083739549 price:3799.95
id:Product_C:1114083739663 price:6999.99

42.4.7 BlobObjectの読取り

Asset APIでは、データ(バイナリ・ファイルとして保管されるデータ)のファイル・タイプを表すための特別なクラスが定義されています。たとえば、FirstSiteIIのFSIIDocumentFile属性はBLOB型です。次のコードでは、すべてのDocument_CインスタンスからFSIIDocumentFileを読み取って、アセットのid、ファイル名およびファイル・サイズを出力します。

<%@ page import="com.fatwire.system.*"%>
<%@ page import="com.fatwire.assetapi.data.*"%>
<%@ page import="com.fatwire.assetapi.query.*"%>
<%@ page import="java.util.*"%>
<cs:ftcs>
<%
Session ses = SessionFactory.getSession();
AssetDataManager mgr = (AssetDataManager) ses.getManager( AssetDataManager.class.getName() );

Query query = new SimpleQuery( "Document_C", "FSII Document", null, Collections.singletonList( "FSIIDocumentFile" ) );

for( AssetData data : mgr.read( query ) )
{
AttributeData docAttr = data.getAttributeData("FSIIDocumentFile");
BlobObject fileObj = (BlobObject)docAttr.getData();
byte [] d = new byte[fileObj.getBinaryStream().available()];
fileObj.getBinaryStream().read(d);

out.println( "id:" + data.getAssetId() );
out.println( "file name:" + fileObj.getFilename() );
out.println( "file size:" + d.length );

out.println( "<br/>" );
}
%>
</cs:ftcs>

42.4.8 複数値属性の取得

Asset APIは、単一値属性をサポートしているのと同じように複数値属性をサポートしています。AttributeDataには、複数の値を取得するためのgetDataAsList()という付随メソッドが含まれています。次のコードでは、FSIIKeywordという複数値属性に含まれているデータの出力を試行しています。


注意:

FirstSiteIIに付属しているサンプル・データには、FSIIKeyword属性のデータは含まれていないため、このサンプル・コードではキーワードはまったく出力されません。このコードを実行する前に、一部のFSIIDocumentインスタンスを編集して、この属性のデータを追加してください。


<%@ page import="com.fatwire.system.*"%> 
<%@ page import="com.fatwire.assetapi.data.*"%>
<%@ page import="com.fatwire.assetapi.query.*"%>
<%@ page import="java.util.*"%>
<cs:ftcs>
<%
Session ses = SessionFactory.getSession();
AssetDataManager mgr = (AssetDataManager) ses.getManager( AssetDataManager.class.getName() );

Query query = new SimpleQuery( "Document_C", "FSII Document", 
null, Collections.singletonList( "FSIIKeyword" ) );

for( AssetData data : mgr.read( query ) )
{
AttributeData attrData = data.getAttributeData( "FSIIKeyword" );
List retData = attrData.getDataAsList();
out.println( "id:" + data.getAssetId() );

for( Object o : retData )
{
out.println( "data:" + o );
}

out.println( "<br/>" );
}
%>
</cs:ftcs>

42.4.9 多言語アセット: 翻訳の取得

Asset APIでは、多言語アセットを扱うためのインタフェースとメソッドも用意されています。基本的に、多言語アセットを扱うためのメソッドはDimensionableAssetManager内にあります。これらのメソッドは、特定のアセットのすべてのロケールを取得したり、アセットの特定の翻訳を取得したりできます。

次の例では、グループをLocaleに設定したDimensionableAssetManager内のgetRelativesメソッドを使用して、まずアセットPage: 1118867611403の翻訳を取得してから、getRelativeメソッドを使用してこのアセットのfr_FR翻訳を取得します。

<%@ page import="com.fatwire.system.*"%> 
<%@ page import="com.fatwire.assetapi.data.*"%>
<%@ page import="com.fatwire.mda.DimensionableAssetManager"%>
<%@ page import="com.openmarket.xcelerate.asset.*"%>
<%@ page import="java.util.*"%>

<cs:ftcs>
<%
Session ses = SessionFactory.getSession();
DimensionableAssetManager mgr = (DimensionableAssetManager)ses.getManager(DimensionableAssetManager.class.getName());

AssetId page_asset = new AssetIdImpl("Page", 1118867611403L);

for( AssetId id : mgr.getRelatives( page_asset, null, "Locale" ))
{
out.println( id );
}
out.println( "<br/>" );

AssetId fr_translation = mgr.getRelative( page_asset, "fr_FR" );
out.println( fr_translation );

%>
</cs:ftcs>

42.4.10 アセットと属性の定義の読取り

Asset APIを使用すると、アセットのデータだけでなくアセットの定義にもアクセスできます。アセットの定義を構成している属性や各属性の型などの情報を取得するには、AssetTypeDefManagerというマネージャを使用します。次の例では、Document_Cからすべての定義情報を読み取って、ブラウザに出力することを試行しています。

<%@ page import="com.fatwire.system.*"%>
<%@ page import="com.fatwire.assetapi.def.*"%>
<%@ page import="java.util.*"%>
<%@ page import="com.fatwire.assetapi.query.*"%>
<cs:ftcs>
<%
Session ses = SessionFactory.getSession();
        AssetTypeDefManager mgr = (AssetTypeDefManager) ses.getManager( AssetTypeDefManager.class.getName() );

AssetTypeDef defMgr = mgr.findByName( "Document_C", "FSII Document" );

out.println( "Asset type description: " + defMgr.getDescription() );
out.println( "<br/>" );

for( AttributeDef attrDef : defMgr.getAttributeDefs() )
{
out.println( "Attribute name: " + attrDef.getName() );
out.println( "Attribute description: " + attrDef.getDescription() );
out.println( "is required: " + attrDef.isDataMandatory() );
out.println( "Attribute type: " + attrDef.getType() );
out.println( "<br/>" );
}

%>
</cs:ftcs>

42.4.11 キーと値のマッピングの読取り

Asset APIを使用すると、特定のCSElementやテンプレートのキーと値のマッピング・ペアにアクセスできます。次の例では、CSElementからすべてのマッピング・ペアを読み取ります。

<%@ page import="com.fatwire.system.*"%>
<%@ page import="com.fatwire.assetapi.data.*"%>
<%@ page import="com.fatwire.assetapi.query.*"%>
<%@ page import="java.util.*"%>
<cs:ftcs>
<%
Session ses = SessionFactory.getSession();
AssetDataManager mgr = (AssetDataManager)(ses.getManager(AssetDataManager.class.getName()));
Condition c = ConditionFactory.createCondition("name", OpTypeEnum.LIKE, "FSIICommon/Nav/LocaleForm");
Query query = new SimpleQuery("CSElement", null, c, null);
query.getProperties().setReadAll(true);
for (AssetData data : mgr.read(query))
{
   List<AttributeData>  mappingArray = (List<AttributeData>)data.getAttributeData("Mapping"). getData();
   for (int i=0; i<mappingArray.size(); i++)
   {
      HashMap mappingMap = (HashMap)mappingArray.get(i).getData();
      String key = (String)((AttributeData)mappingMap.get("key")).getData();
      String type =(String)((AttributeData)mappingMap.get("type")).getData();                   
      String value = (String)((AttributeData)mappingMap.get("value")).getData();
      String siteid = (String)((AttributeData)mappingMap.get("siteid")).getData();     

      out.println("Mapping Entry #"+String.valueOf(i+1));
      out.println("<br/>");
      out.println("Key: "+key);
      out.println("Type: "+type);

out.println("Value: "+value);

      out.println("Siteid: "+siteid);
      out.println("<br/>");
   }
}
%>
</cs:ftcs>

42.5 Asset APIによる書込み

Asset APIは、ベーシック・アセットおよび特定タイプのフレックス・アセットに対する書込み操作をサポートしています。サポートされている書込み操作は、アセットの作成、変更および削除です。サポートされているアセットは、ベーシック・アセット、フレックス・アセットおよびフレックス親です。これら以外のすべてのアセット・タイプ(フレックス親定義、フレックス・アセット定義、フレックス・フィルタおよびフレックス属性)は、現在サポートされていません。これらのアセット・タイプに対するいずれかの書込み操作(挿入または更新)が試行された場合は、UnsupportedOperationExceptionがスローされます。

この項の内容は、次のとおりです。

42.5.1 新規アセットの作成

Asset APIは、AssetDataManager.insert( List<AssetData> data )メソッドを使用して、WebCenter Sites内で新規アセットを作成します。このメソッドは、AssetDataのリストを受け取って、これらのAssetDataを使用してWebCenter Sites内で新規アセットを作成します。正常に実行された場合、このメソッドは、受け取ったAssetDataにこれらの新規作成したアセットのIDを移入します。

新規フレックス・アセットの作成

Asset APIは、AssetDataManager.newAssetDataメソッドとinsertメソッドを組み合せることで、新規フレックス・アセットを作成できます。newAssetDataメソッドは、nullまたは空のリスト/コレクションが移入されたすべてのAttributeDataオブジェクトとともに、空のAssetDataを返します。正しいサブタイプが指定されている場合は、flextemplateid(フレックス・アセット用)またはflexgroupid(フレックス親用)に値が自動的に移入されます。

<%@ page import="com.fatwire.system.*"%>
<%@ page import="com.fatwire.assetapi.data.*"%>
<%@ page import="com.fatwire.assetapi.query.*"%>
<%@ page import="com.openmarket.xcelerate.asset.AssetIdImpl"%>
<%@ page import="java.util.*"%>
<cs:ftcs>
<%
Session ses = SessionFactory.getSession();
AssetDataManager adm = (AssetDataManager) ses.getManager( AssetDataManager.class.getName() );
        MutableAssetData d = adm.newAssetData( "Content_C", "FSII Article" );
        d.getAttributeData( "name" ).setData( New Content" );
        d.getAttributeData( "FSIIHeadline" ).setData( "headline" );
        d.getAttributeData( "FSIIAbstract" ).setData( "abstract" );
        d.getAttributeData( "FSIIBody" ).setData( "body" );
        d.getAttributeData( "Publist" ).setData( Arrays.asList( "FirstSiteII" ) );
        d.setParents( Arrays.<AssetId>asList( new AssetIdImpl( "Content_P", 1112192431478L)) );
        adm.insert( Arrays.<AssetData>asList( d ));
        out.println( d.getAssetId() );        
%>
</cs:ftcs>

新規ベーシック・アセットの作成

Asset APIは、新規ベーシック・アセットを作成することもできます。

<%@ page import="com.fatwire.system.*"%>
<%@ page import="com.fatwire.assetapi.data.*"%>
<%@ page import="com.fatwire.assetapi.query.*"%>
<%@ page import="java.util.*"%>
<cs:ftcs>
<%
Session ses = SessionFactory.getSession();
AssetDataManager adm = (AssetDataManager) ses.getManager( AssetDataManager.class.getName() );
        MutableAssetData d = adm.newAssetData( "HelloArticle", "" );
        d.getAttributeData( "name" ).setData( New Hello Article" );
        d.getAttributeData( "headline" ).setData( "headline" );
        d.getAttributeData( "byline" ).setData( "abstract" );
        d.getAttributeData( "category" ).setData( "g" );
        BlobObject b = new BlobObjectImpl( "filename.txt", null, "body".getBytes() );
        d.getAttributeData( "urlbody" ).setData( b );
        d.getAttributeData( "Publist" ).setData( Arrays.asList( "HelloAssetWorld" ) );
        adm.insert( Arrays.<AssetData>asList( d ));
        out.println( d.getAssetId() );
%>
</cs:ftcs>

42.5.2 既存のアセットの更新

Asset APIでは、挿入に加えて、更新の操作もサポートされています。挿入と同様に、更新操作では、AssetDataのデータがWebCenter Sites内に保存されますが、既存のアセットが対象になります。そのアセットが存在しない場合は、更新を試行すると例外がスローされます。

<%@ page import="com.openmarket.xcelerate.asset.AssetIdImpl"%>
<%@ page import="com.fatwire.system.*"%>
<%@ page import="com.fatwire.assetapi.data.*"%>
<%@ page import="com.fatwire.assetapi.query.*"%>
<%@ page import="java.util.*"%>
<cs:ftcs>
<%
Session ses = SessionFactory.getSession();
AssetDataManager adm = (AssetDataManager) ses.getManager( AssetDataManager.class.getName() );
Iterable<AssetData> assets = adm.read( Arrays.<AssetId>asList( new AssetIdImpl( "HelloArticle", 1238171255471L), new AssetIdImpl( "Content_C", 1238171254486L)) );
        List<AssetData> sAssets = new ArrayList<AssetData>();
        for ( AssetData a : assets )
        {
            sAssets.add( a );
            a.getAttributeData( "name" ).setData( "Changed Name" );
        }
        adm.update( sAssets ); 
%>
</cs:ftcs>

42.5.3 既存のアセットの削除

Asset APIは、WebCenter Sitesからのアセットの削除もサポートしています。次の例では、2つのアセットに対するすべての参照を削除した後に、adm.deleteによって両方のアセットをWebCenter Sitesから削除できます。いずれかのアセットが他のアセットによって参照されている場合や、そのアセットが無効な場合は、例外がスローされます。例外がスローされると、削除プロセスは停止します。

<%@ page import="com.openmarket.xcelerate.asset.AssetIdImpl"%>
<%@ page import="com.fatwire.system.*"%>
<%@ page import="com.fatwire.assetapi.data.*"%>
<%@ page import="com.fatwire.assetapi.query.*"%>
<%@ page import="java.util.*"%>
<cs:ftcs>
<%
 Session ses = SessionFactory.getSession();
 AssetDataManager adm = (AssetDataManager) ses.getManager( AssetDataManager.class.getName() );
 adm.delete( Arrays.<AssetId>asList( new AssetIdImpl( "HelloArticle", 1238171255471L), new AssetIdImpl( "Content_C", 1238171254486L)) );
%>
</cs:ftcs>

42.5.4 多言語アセット

Asset APIは、多言語アセットの作成をサポートしています。多言語アセットを作成するには、2段階のプロセスを実行する必要があります。まず、そのアセットを作成して保存します。次に、ロケール情報を追加します。次の例では、新しいContent_Cアセットを作成して、そのロケールをen_USに設定します。

<%@ page import="com.fatwire.system.*"%>
<%@ page import="com.fatwire.assetapi.data.*"%>
<%@ page import="com.fatwire.mda.*"%>
<%@ page import="com.fatwire.mda.DimensionableAssetInstance.
                 DimensionParentRelationship"%>
<%@ page import="java.util.*"%>
<%@ page import="com.openmarket.xcelerate.asset.*"%>
<%@ page import="com.openmarket.xcelerate.common.*"%>
<cs:ftcs>

<%
Session ses = SessionFactory.getSession();

AssetDataManager adm = (AssetDataManager) ses.getManager( AssetDataManager.class.getName() );
MutableAssetData d = adm.newAssetData( "Content_C", "FSII Article" );
d.getAttributeData( "name" ).setData( New Content" );
d.getAttributeData( "FSIIHeadline" ).setData( "headline" );
d.getAttributeData( "FSIIAbstract" ).setData( "abstract" );
d.getAttributeData( "FSIIBody" ).setData( "body" );
d.getAttributeData( "Publist" ).setData( Arrays.asList( "FirstSiteII" ) );
d.setParents( Arrays.<AssetId>asList( new AssetIdImpl( "Content_P", 1112192431478L)) );
adm.insert( Arrays.<AssetData>asList( d ));
DimensionManager dam = (DimensionManager)ses.getManager(DimensionManager.class.getName());
Dimension dim = dam.loadDimension("en_US");
d.getAttributeData("Dimension") .setData(Arrays.asList(new Dimension[]{dim}));
DimensionParentRelationship dpr = new DimParentRelationshipImpl("Locale", d.getAssetId());
d.getAttributeData("Dimension-parent").setData(Arrays.asList(new DimensionParentRelationship[]{dpr}));
adm.update( Arrays.<AssetData>asList( d ));
%>
</cs:ftcs>

42.6 開発戦略

この項では、データ型と属性データ(これにより、WebCenter Sitesデータ型をJava型にマップします)とともに、問合せのタイプ(問合せのタイプの比較、それらの使用方法、およびサポートされている演算)について説明します。

この項の内容は、次のとおりです。

42.6.1 データ型と属性データ

AttributeDataには、データ型(WebCenter Sites固有の型)に関する情報と実際のデータが含まれています。これらの型は、AttributeTypeEnumで定義されています。AttributeData.getData()AttributeData.getDataAsList()は、特定のJava型のデータ・オブジェクトを返します。次の表では、WebCenter Sitesのデータ型とそれぞれに対応するJava型を示しています。

表42-1 WebCenter Sitesのデータ型とJava型

WebCenter Sitesのデータ型 Java型

INT

整数

FLOAT

倍精度

STRING

文字列

DATE

日付

MONEY

倍精度

LONG

Long型

LARGE_TEXT

文字列

ASSET

AssetId

BLOB

BlobObject


42.6.2 問合せのタイプ

Asset APIを使用すると、汎用/ベーシックとフレックスという2種類の問合せを実行できます。

2種類のアルゴリズムが存在し、一方では汎用アセット・インフラストラクチャが使用され(汎用/ベーシック問合せ)、もう一方ではアセットセットと検索状態が使用されます(フレックス問合せ)。汎用/ベーシック問合せは、フレックス・アセットとベーシック・アセットの両方に使用できますが、フレックス問合せはフレックス・アセットにしか使用できません。

これらの各アルゴリズムには、メリットとデメリットがあります。Asset APIの目標は、問合せメカニズムを統一して、最終的にはAsset APIのユーザーがアルゴリズムを選択する必要性をなくすことです。ただし現時点では、これらのアルゴリズムは同等ではないため、ユーザーはこれら2つのアルゴリズムのうち一方で提供されている特定の機能を希望する場合は、そのアルゴリズムを選択する必要があります。

QueryProperties.setIsBasicSearch( true )は、この問合せの汎用/基本検索を行うための問合せアルゴリズムを設定します。デフォルトでは、falseに設定されます。ベーシック・アセットの場合、設定は問題になりません。

どちらのタイプの問合せを選択すればよいでしょうか。簡単に言うと、フレックス・アセットのベーシック属性を検索する場合は、ベーシック問合せを使用します。そうでない場合は、デフォルト問合せを使用します。デフォルト問合せは、一般に使用されるほとんどの問合せに対応できます。状況はこれよりもやや微妙です。次に、各タイプの問合せに対する他の制約事項を示しています。

ベーシック/汎用問合せ

  • サブタイプを指定しない場合は、フレックス属性に基づいて検索することはできません。

  • フレックス定義に含まれていないフレックス属性に基づいて検索することはできません。

  • フレックス属性に基づいてソートすることはできません。

  • 大文字と小文字が区別されることは保証されません(データベースに依存します)。

  • AND演算は、異なるフィールド間のみで許可されます(たとえばname=name1 AND description=descr1は許可されますが、name=name1 AND name=name2は許可されません)。

  • OR演算は、同じフィールド名が使用された2つの条件についてのみ許可されます。OR条件は、フレックス属性については無効です。

フレックス問合せ

  • 条件にベーシック属性を含めることはできません(id、名前、説明など)。

  • ベーシック属性に基づいてソートすることはできません。

  • フレックス問合せは、サブタイプが指定されていなくても機能します。その場合は、すべてのサブタイプのデータが検索対象になります。

  • 条件で使用できる演算子は、LIKEEQUALSBETWEENおよびRICHTEXTのみです。

42.6.3 データ型と有効な問合せ演算

実行する問合せのタイプに応じて、特定のデータ型について許可される演算のタイプに関するさらなる制約が存在します。

一般に、フレックス・タイプ問合せ(フレックス・アセットのデフォルト問合せ)で許可されるOpTypeEnumsは、LIKEEQUALSBETWEENおよびRICHTEXTのみです。AssetSet/SearchStateタグからも同じ操作を実行できる点に注意してください。

他のOpTypeEnumsを使用するには、ベーシック/汎用問合せを使用する必要があります(そのためにはQueryProperties.setIsBasicSearch( true )を設定します)。このような問合せは、当然ながら、前述のベーシック問合せのルールに従う必要があります。

次の表では、ベーシック/汎用問合せで各データ型(単一値または複数値)について許可されている演算を示しています。

表42-2 許可される演算のセット

データ型 等しい NOT_EQUALS LIKE GREATER LESSTHAN RICHTEXT

INT

はい

はい

N

はい

はい


N

FLOAT

はい

はい

N

はい

はい


N

STRING

はい

はい

はい

はい

はい


N

DATE

はい

はい

N

はい

はい


N

MONEY

はい

はい

N

はい

はい


N

LONG

はい

はい

N

はい

はい


N

LARGE_TEXT

N

N

はい

N

N


N

ASSET

はい

はい

N

N

N


N

BLOB

N

N

N

N

N


N


次の表では、フレックス・タイプ問合せで各データ型(単一値または複数値)について許可されている演算を示しています。

表42-3 データ型ごとに許可される演算のセット

データ型 等しい NOT_EQUALS LIKE GREATER 未満 RICHTEXT

INT

はい


N



はい

N

FLOAT

はい


N



はい

N

STRING

はい


はい



はい

N

DATE

はい


N



はい

N

MONEY

はい


N



はい

N

LONG

はい


N



はい

N

LARGE_TEXT

N


はい



N

はい

ASSET

はい


N



はい

N

BLOB

N


N



N

はい


42.7 オプション: スタンドアロンJavaプログラムからAsset APIを使用するための設定

このチュートリアルでは、JSPテンプレートからAsset APIを使用する方法を紹介していますが、スタンドアロンJavaプログラムからAsset APIを使用することもできます。そのためには、単一のデータベース接続または接続プールを設定します(WebCenter Sitesの外部で)。


注意:

次の手順では、すべてのコンポーネントはインストール済のWebCenter Sitesに対してローカルであると想定しています。


単一のデータベース接続またはデータベース接続プールを設定する前に

  1. 次のファイルがJavaプログラムのクラスパス内に存在していることを確認します。

    • javaee.jartools.jar(どちらもJDK 1.5以降に付属しています)。

    • ServletRequest.properties。このファイルは、WEB-INF/classesフォルダからコピーできます。

    • wem_sso.xml: インストール済のWebCenter SitesにWEMがインストールされており、かつシングル・サインオンが(futuretense.ini内で)trueに設定されている場合に必要です。wem_sso.xmlファイルは、WEB-INF/classesフォルダからコピーできます。

    • WebCenter Sitesのすべてのバイナリ・ファイル(WEB-INF/libフォルダ内のjarファイル)。

  2. 次のどちらかの手順に進みます。

単一のデータベース接続を設定するには:

  1. Javaプログラムの次のシステム・プロパティを設定します。

    cs.dburl=<JDBC_URL_to_connect_to_DB>
    cs.dbdriver=<driverClass>
    cs.dbuid=<dbUserName>
    cs.dbpwd=<dbPassword>
    
  2. WebCenter Sitesのインストール・フォルダを確認して、そのフォルダ名をJVM引数として渡します。

    -Dcs.installDir=<install_dir>
    

データベース接続プールを設定するには:

  1. 次のjarファイルをクラスパスに追加します。commons-dbcp.jarファイル(WebCenter Sitesに付属)、およびcommons-pool.jarファイル(Apache Webサイトから入手可能)。

  2. データ・ソースと同じ名前のプロパティ・ファイルを作成します。

    次のことに注意してください。

    • データ・ソースの名前は、cs.dsnプロパティ(futuretense.ini内)の値です。

    • cs.dbconnpictureの値(同じくfuturetense.ini内)は、cs.dsnを参照している必要があります(cs.dbconnpicturecs.dsnの組合せによって有効なリソースを得る必要があります)。

      たとえば、次の組合せによって

      cs.dsn= csDataSourceおよび

      cs.dbconnpicture= java\:comp/env/$dsn

      次の有効なリソースが得られます。

      java:/csDataSource

      したがって、プロパティ・ファイルにはcsDataSource.properties (cs.dsnの値)という名前を付けます。

    • 作成するプロパティ・ファイルは、必ずJavaプログラムのクラスパス内に配置してください。

  3. プロパティ・ファイルを作成したら、このファイルに次のキーを追加します。

    driver=<driverClass>
    url=<JDBC_URL_to_connect_to_DB>
    maxconnections=<number_of_connections_to_pool>
    user=<dbUserName>
    password=<dbPassword>
    
  4. WebCenter Sitesのインストール・フォルダを確認して、そのフォルダ名をJVM引数として渡します。

    -Dcs.installDir=<install_dir>