プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebCenter Sitesでの開発
12c (12.2.1)
E72540-01
目次へ移動
目次

前
次

77 Asset APIの使用: チュートリアル

Asset APIチュートリアルはクイックリファレンスであり、Oracle WebCenter Sites Java APIリファレンスの代替ではありません。このチュートリアル全体を通じて取り上げられているコードサンプルは、Asset APIの使用方法を示しています。

Asset APIチュートリアルの使用の詳細は、次の項を参照してください。

77.1 Asset APIの理解

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

  • Asset APIは、非サーブレット・コンテキストでWebCenter Sitesをサポートしています。

    Asset APIが導入される前は、WebCenter Sitesでは、WebページやWebアプリケーションを作成するための手段として使用されるタグ(XMLとJSPの両方)という形で、プログラミング用の主要インタフェースが公開されていました。この意味において、WebCenter Sitesは、サーブレット・モデルを中核として厳密に構築されていたため、スタンドアロンJavaプログラム(EJBなど)などの他のコンテキストでは使用できませんでした。したがって、サーブレット・フレームワークに依存することなく、どのような環境でも使用できるAPIを作成する必要がありました。

  • Asset APIは、ベーシックとフレックスという2つのアセット・ファミリの取得操作、作成操作および変更操作を統一しています。

    • Asset APIは、AssetDataAttributeDataで両方のアセット・ファミリを表しています。

    • Asset APIは、フレックス・アセットとベーシック・アセットのどちらに対しても汎用のConditionオブジェクトとQueryオブジェクトを使用します。

  • Asset APIは、Javaオブジェクトという形でベーシック・アセット、フレックス・アセットおよびフレックス親アセットの作成と編集をサポートしています。

    注意:

    Asset APIでは、ロード対象のアセット以外の依存性が一切ログに記録されません。

77.2 主要インタフェース

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

  • com.fatwire.assetapi.dataパッケージには、データの読取りに役立つクラスが含まれています。

  • com.fatwire.assetapi.defの下のクラスは、アセットの定義用です。

  • com.fatwire.assetapi.queryパッケージには、問合せを作成するために必要な構成体が含まれています。詳細は、Oracle WebCenter Sites Java APIリファレンスを参照してください。

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

  • Session: APIからWebCenter Sitesへの主要なエントリ・ポイントです。Asset APIでなんらかの処理を実行するためには、セッションを取得する必要があります。

  • AssetDataManager: アセット・データを読み取るためのマネージャです。開発者は、ここで情報を問い合せることができるとともに、アセットのアソシエーションなどの情報を検索できます。

  • AssetTypeDefManager: アセット・タイプの定義を読み取るためのマネージャ。「定義」は、フレックス・アセットが重要となるWebCenter Sitesでロードされる条件です。ここでは、アセット・タイプの構造を定義するものと同様に、一般的な意味で使用されます。その結果、ベーシック・アセット・タイプにも定義があります。

  • AssetData: アセットのデータです。基本的には、AttributeDataインスタンスおよびアセット自体に関するその他の情報のコレクションです。

  • AssetId: アセット・タイプとIDの組合せです。

  • DimensionableAssetManager: 特定のアセットの翻訳を取得することで多言語アセットをサポートするマネージャです。

77.3 はじめに

このチュートリアルで満たす必要がある前提条件を次に示します。

77.4 Asset APIによる読取り

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

この項には次のトピックが含まれます:

77.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に属するセッションを取得することもできます。WebCenter Sitesによって稼働するWebアプリケーションは通常、実行時にこのユーザーとして実行されます。ただし、間違ったユーザー名とパスワードが指定された場合、エラーが発生します。
  2. このセッションを使用して、AssetDataManager.getManagerのハンドルを取得します。(AssetDataManager.class.getName()メソッドによってこの処理が実行されます。)
  3. Queryは、このユーザーの検索条件に基づいた結果を表しています。この例では、シンプルなバージョンのQueryを使用して、アセット・タイプ(Content_C)、サブタイプ(FSII Article)、および取得する属性のリスト(この場合は単にFSIIHeadline)を指定しています。すべてのアセットが目的であるため、3つ目のパラメータ(Conditionインスタンスを受け取ります)はnullです。Conditionsの使用方法の詳細は、「複雑な問合せの実行」を参照してください。
  4. AssetDataManagerread()メソッドは、AssetDataに対するIterableを返します。それぞれのアセット・データには、属性名に対するAttributeDataのインスタンスが含まれています。AttributeData.getData()は、属性自体の実際のデータを返します。

77.4.2 AssetIdの読取り

  • これらすべてのアセットのIDを把握するには、AssetIdインスタンスを返すAssetData.getAssetId()を使用します。

  • 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
    ...

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

また、アセットIDの属性を読み取ることもできます(テンプレートに渡されるか、プログラムによって取得されます)。

  • ここでは、AssetId (Content_C:1114083739888という「AssetIdの読取り」で使用したコードで示したものなど)を例として取り上げて、次のコードを使用して、名前、説明および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>
    

77.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のコレクションに格納された状態で取得する属性名のリストを渡しています。

  • 問合せ可能な属性の型とその方法について、いくつかの考慮事項が存在します。各種の問合せアルゴリズムの詳細は、「問合せのタイプ」を参照してください。

    簡単に言うと、一部のタイプの問合せは特定のアルゴリズムで実行できますが、他のアルゴリズムでは実行できません。これは、Assetタグ・ファミリとAssetSetタグ・ファミリにおける動作とまったく同じです。このことを例示するために、たとえば、価格(FSIIPrice)が179より高いすべての製品を読み取るとします。

    FSIIPriceは、MONEY型です。「データ型と有効な問合せ演算」表77-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>
    

77.4.5 複雑な問合せの実行

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

次のコードを使用して、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>

77.4.6 ソートによる結果の取得

次に示すように、フィールドをソートして結果を取得したり、ソート順を逆にしたりできます。

  • 価格によってソートされた結果を取得するには、次のコードを使用します(この例では、SortOrderとして昇順を指定しています)。

    <%@ 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
    
  • ソート順序を逆にするには、このコードの強調表示された行でtruefalseに変更します。

77.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>
    

77.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>

77.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>

77.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>

77.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>

77.5 Asset APIによる書込み

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

この項には次のトピックが含まれます:

77.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>
    

77.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>

77.5.3 既存のアセットの削除

Asset APIは、WebCenter Sitesからのアセットの削除もサポートしています。

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>

77.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>

77.6 開発戦略

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

この項には次のトピックが含まれます:

77.6.1 データ型と属性データ

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

表77-1に、WebCenter Sitesの型と対応するJava型のマッピングを示します。

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

WebCenter Sitesのデータ型 Java型

INT

Integer

FLOAT

Double

STRING

String

DATE

Date

MONEY

Double

LONG

Long

LARGE_TEXT

String

ASSET

AssetId

BLOB

BlobObject

77.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条件は、フレックス属性については無効です。

フレックス問合せ

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

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

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

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

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

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

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

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

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

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

データ型 EQUALS NOT_EQUALS LIKE GREATER LESSTHAN BETWEEN RICHTEXT

INT

不可

不可

FLOAT

不可

不可

STRING

不可

DATE

不可

不可

MONEY

不可

不可

LONG

不可

不可

LARGE_TEXT

不可

不可

不可

不可

不可

ASSET

不可

不可

不可

不可

BLOB

不可

不可

不可

不可

不可

不可

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

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

データ型 EQUALS NOT_EQUALS LIKE GREATER LESS THAN BETWEEN RICHTEXT

INT

不可

不可

FLOAT

不可

不可

STRING

不可

DATE

不可

不可

MONEY

不可

不可

LONG

不可

不可

LARGE_TEXT

不可

不可

ASSET

不可

不可

BLOB

不可

不可

不可

77.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フォルダからコピーできます。

    • SSOConfig.xml。ただし、WebCenter SitesインストールにWEMがインストールされており、シングル・サインオン(wcs_properties.json内)がtrueに設定されていることが前提です。SSOConfig.xmlファイルは、WEB-INF/classesフォルダからコピーできます。

    • cs-cache.xmlss-cache.xmllinked-cache.xmlおよびcas-cache.xml

    • SitesSecurityContext.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プロパティ(wcs_properties.json内)の値です。

    • cs.dbconnpictureの値(同じくwcs_properties.json内)は、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>