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

前
 
次
 

81 Community-Gadgets: 機能のカスタマイズ

Community-Gadgets Webアプリケーションは、CSS、テンプレート、検索エンジン最適化(SEO)などの多数のカスタマイズ可能な拡張ポイントを提供しています。これらを使用して、Community-Gadgetsウィジェットの外観と機能性を変更できます。ただし、カスタマイズ可能な拡張ポイントを使用しても、特定のWebサイト設計や使用戦略がウィジェットに適用されていることが原因で、特定の顧客のプロジェクト要件を常に満たせるとはかぎりません。このようなシナリオでは、WebCenter Sitesデータ構造を直接操作し、それらをページ・テンプレートでカスタム手法を使用して個別にレンダリングすることを検討してください。

この章では、WebCenter Sitesデータ構造について詳しく説明します。次の項で構成されます。

81.1 Community-Gadgetsのデータ・モデルの概要

Community-Gadgetsは、WebCenter Sitesをデータ・リポジトリとして利用し、Webエクスペリエンス管理(WEM)フレームワークによって提供されるREST APIを通じてそのWebCenter Sitesと通信します。Community-Gadgetsのデータ構造をWebCenter Sitesリポジトリに格納することによって、WebCenter Sitesのアセット・モデルやキャッシング・システムを活用できます。

Community-Gadgets Webアプリケーションのオブジェクト・データ・モデルは、次のカテゴリとオブジェクトによって構成されます。

第81.1.1項「コメント」

第81.1.2項「レビュー」

第81.1.3項「評価」

第81.1.4項「投票」

第81.1.5項「トピック」

第81.1.6項「訪問者」

第81.1.7項「ガジェットとダッシュボード」

図81-1は、これらのカテゴリとオブジェクトを図式化したものです。ユーザー生成コンテンツ・セクションでは、ビジネス・オブジェクトがコメントやレビューなどのCommunityウィジェットに関連付けられている様子が示されています。ユーザー生成コンテンツ(UGC)の各エントリには、それが登録済ユーザーによって投稿された場合、ユーザー・オブジェクトのセットが関連付けられます(訪問者セクション)。

図81-1 カテゴリとオブジェクトのレイアウト

図81-1の説明が続きます
「図81-1 カテゴリとオブジェクトのレイアウト」の説明

図81-1に表示されているオブジェクトは、表81-1に示すように、WebCenter Sitesのデータベース表に格納されます。

表81-1 オブジェクトのデータベース表名

オブジェクト データベース表名

CommentFeed

cg_comment_feed

CommentRecord

cg_comment_record

ReviewFeed

cg_review_feed

ReviewRecord

cg_review_record

RatingFeed

cg_rating_feed

RatingRecord

cg_rating_record

Polls

cg_poll

Topics

cg_topic

User

cg_user

UserIdentity

cg_user_id

UserLink

cg_user_link


81.1.1 コメント

コメントには、次の種類のプライマリ・オブジェクトが関連付けられます。

81.1.1.1 CommentFeed

このオブジェクトは、ウィジェットがデプロイされているWebページの計算された概要情報を表します。CommentFeedオブジェクトは、「コメント」ウィジェットがデプロイされているページが最初にアクセスされたときにデータベースに作成されます。

コメントとそのコメントが表示されるページの間の関係を決定するために、Community-Gadgets Webアプリケーションは、WebページのURL(ウィジェットのデプロイメント・タグ内にあるアプリケーション生成キー)、またはリソースID(ウィジェットのデプロイ時に管理者が指定可能)を使用します。WebページのURLがキーとして利用可能である場合は、そのページURLから生成されたハッシュがCommentFeedオブジェクト内に記録されます。リソースIDが指定されている場合は、そのリソースIDがCommentFeedオブジェクト内に記録されます。CommentFeedオブジェクトは複数のコメントを保持し、コメントを表すCommentRecordオブジェクトと1対多のアソシエーションを持ちます。

CommentFeedオブジェクトは、WebCenter Sites内ではcg_comment_feedベーシック・アセットとして格納され、それに対応してデータベース内ではcg_comment_feed表として格納されます。表81-2は、このアセットの構造の説明です。

表81-2 "cg_comment_feed" AssetTypeの構造

プロパティ 説明

id

BIGINT

一意のアセット識別子またはAssetTypeの主キー。

cos_resource_id

VARCHAR(256)

ディスカッションの識別子。これは、Community-Gadgetsが、訪問者がコメントを投稿したページとコメントのリストを関連付けるために使用する論理リンクです。このリンクは、ウィジェットのデプロイ時に、デプロイメント・ページの「リソースID」フィールドの値、またはウィジェット・コード・スニペット内のresource_id属性を指定することによって確立されます。指定されていない場合、Community-GadgetsはページURLのハッシュをリソースIDとして使用します。resource_id生成の独自の戦略を立てることをお薦めします。たとえば、データベース内でこのオブジェクトをより簡単に検索できるようにするため、ページIDをリソースIDとして使用できます。

cos_url

VARCHAR(256)

コメント・ディスカッション・スレッドをホストするURL。

cos_date_created

DATE

フィード・オブジェクトが作成された日付。

cos_date_modified

DATE

フィードの最新の変更日。

cos_modified_by

VARCHAR(256)

フィードを最後に変更したユーザーのID。

cos_owner

VARCHAR(256)

フィード・オブジェクトを作成したユーザーのID。(フィード・オブジェクトは、最初のページ・ロード時にウィジェットがデプロイされた直後に作成されます。通常、これはゲスト・セッションを使用して実行されるため、-1が典型的な値です。)

cos_approved_count

BIGINT

モデレーションを正常にパスし、訪問者に対して表示されるコメントの数。

cos_pending_count

BIGINT

モデレーションをまだパスしていないコメントの数。

cos_ext_type

VARCHAR(256)

コンテンツ・カテゴリのID。ファイル、記事、ブログなど、コメントの添付先コンテンツのタイプを示します。(デプロイメント・ページのResource Typeパラメータとして、またはウィジェット・デプロイメント・コード・スニペットのresource_type属性として指定されます。)

cos_resource_title

VARCHAR(256)

「コメント」ウィジェットがデプロイされるページのタイトル。デフォルトでは、ここにはウィンドウ・タイトルの値が記録されます。ページ・デザイナは、デプロイメント・コード・スニペット内のresource_title属性を指定することによってこの値をカスタマイズできます。

cos_posting_status

VARCHAR(256)

Adminインタフェースを通じてトピック・ページによって定義される投稿ステータスの状態。可能な値: openclosed


81.1.1.2 CommentRecord

このオブジェクトは、サイト・ページの訪問者によって投稿されたコメントを表します。これは、cos_root_idフィールドを介して多対1でCommentFeedオブジェクトに論理的にリンクされます。つまり、多数のCommentRecordオブジェクトを1つのCommentFeedオブジェクトにリンクできます。

表81-3 cg_comment_record assetTypeの構造

プロパティ 説明

id

BIGINT

コメントの識別子。

cos_text

VARCHAR(4000)

投稿されたコメントの内容。VARCHAR(4000)データ型は、WebCenter Sitesがインストールされているデータベースに対する、最も効率的な記憶域タイプ(CLOBなど)に変換されます。

cos_root_id

BIGINT

会話が行われているページを表すCommentFeedオブジェクトへのアソシエーション。ここには、対応するcg_comment_feed.id項目の値が格納されます。

この列を使用して、1つのページに投稿されたすべてのコメントを問い合せることができます。

cos_state_value

VARCHAR(450)

コメントの状態。コメントのモデレーションのステージを表します。

手動モデレーションが有効な場合、次の値になることがあります。

  • pending.new(新規投稿)

  • pending.modified(手動モデレーション)

コメントがモデレーションをパスしたか、または自動パブリッシュされた場合、値は次のようになります。

  • approved.all

コメントが自動フィルタまたはモデレータによってパスにならなかった場合、値は次のようになります。

  • inappropriate.robotdetected

  • inappropriate.humandetected

モデレータのナビゲーションを簡素化するため、Communityインタフェースにはこれらのカテゴリに基づくフィルタが含まれています。

cos_owner

BIGINT

コメントを投稿した訪問者のID。ゲストによるエントリである場合は-1

cos_owner_ip

VARCHAR(256)

コメントの投稿元のクライアントのIPアドレス。

cos_guest_name

VARCHAR(450)

コメント・エントリを投稿した登録済ユーザーまたはゲストの表示名。Communityインタフェース内では、このフィールドを使用して、データベースに追加リクエストをすることなくコメントを作成者名でソートして表示できます。

cos_guest_email

VARCHAR(450)

コメントの権限設定によってゲスト(未認証の訪問者)による投稿が可能になっており、訪問者に対して電子メールIDの指定が求められる場合、この列に電子メールIDが保存されます。

cos_level

BIGINT

コメントに対する返信が有効になっている場合の、コメント・スレッド内でのコメントのレベル。この数字が大きいほど、ツリーのより深い場所にコメントが投稿されています。

初期値は1です。

cos_parentid

BIGINT

返信が投稿された直接の親コメントのID。

cos_parent0id

cos_parent9id

BIGINT

階層内でのコメントの親のチェーン。リーフからルートへのパスです。

cos_flagged

VARCHAR(32)

trueまたはfalseのいずれか。他の訪問者によってコメントにフラグが付けられ、報告されたかどうかに基づきます。

cos_flagged_count

BIGINT

コメントにフラグが付けられた回数。

cos_record_rank

VARCHAR(450)

コメントに対する有用性レポート(「はい」および「いいえ」)の数。カンマで区切られ、0から始まります。初期値は0,0です。

cos_record_rank_calculated

INTEGER

他の訪問者によって報告された有用性に基づいて事前計算されたコメントのランク。「はい」の数から「いいえ」の数を減算することによって計算されます。

cos_date_created

DATE

コメントが投稿された日付。

cos_date_modified

DATE

コメントの最新の変更日付(登録済ユーザーは自分のコメントを変更できます。モデレータがコメントを変更する場合もあります)。

cos_reply_count

BIGINT

ディスカッション・スレッドが有効になっており、コメントに返信を投稿できる場合、現在のコメントに対する返信数がここに記録されます。

この数は再帰的ではないため、直接の子コメントのみが考慮されます(子の子は除外される)。

cos_thread_order

VARCHAR(450)

特定の書式で生成される文字列。単純なWEM REST問合せとアルファベット順の順序付けを使用するスレッド階層によるコメントの順序付けを有効にします。生成戦略は次のとおりです。

  • これがルート・レベルのコメントである場合(別のコメントに対する返信として投稿されたものでない場合)、cos_date_createdフィールドの値(16進数形式)が記録されます。

  • コメントに親コメントがある場合、親のcg_comment_record.cos_thread_orderフィールドとアンダースコア(_)フィールド、およびcos_date_createdフィールド(16進数形式)が連結された値になります。


81.1.2 レビュー

レビューには、次の種類のプライマリ・オブジェクトが関連付けられます。これらのオブジェクトは、コメントのオブジェクトと似ています。

81.1.2.1 ReviewFeed

このオブジェクトは、サイト・ページに投稿されたレビューのリストを表します。ReviewFeedオブジェクトは、第81.1.1.1項「CommentFeed」で説明したCommentFeedオブジェクトに非常に似ています。Community-Gadgetsは、同じコード・インフラストラクチャを使用して、これらのオブジェクトを処理します。ただし、データベース・スキーマ・レベルのメンテナンスを簡易化するために、CommentFeedおよびReviewFeedのデータは2つの個別の表に格納されます。CommentFeedとReviewFeedの唯一の相違は、ReviewFeedにはすべての投稿されたレビューを対象に計算された平均ランクに関する追加情報が含まれる点です。

ReviewFeedオブジェクトは、「レビュー」ウィジェットがデプロイされているページが最初にアクセスされたときにデータベースに作成されます。

レビューとそのレビューが表示されるページの間の関係を決定するために、Community-Gadgetsは、WebページのURL(ウィジェットのデプロイメント・タグ内にあるアプリケーション生成キー)、またはリソースID(ウィジェットのデプロイ時に管理者が指定可能)を使用します。WebページのURLがキーとして利用可能である場合は、そのページURLから生成されたハッシュがReviewFeedオブジェクト内に記録されます。リソースIDが指定されている場合は、そのリソースIDがReviewFeedオブジェクト内に記録されます。ReviewFeedオブジェクトは複数のレビューを保持し、レビューを表すReviewRecordオブジェクトと1対多のアソシエーションを持ちます。

レビュー・フィード・オブジェクトは、WebCenter Sites内ではcg_review_feedベーシック・アセットとして格納され、それに対応してデータベース内ではcg_review_feed表として格納されます。表81-4は、このアセットの構造の説明です。

表81-4 cg_review_feed AssetTypeの構造

プロパティ 説明

id

BIGINT

一意のアセット識別子またはAssetTypeの主キー。

cos_resource_id

VARCHAR(256)

ディスカッションの識別子。これは、Community-Gadgetsが、レビューされたトピックが投稿されたページとレビューのリストを関連付けるために使用する論理リンクです。このリンクは、ウィジェットのデプロイ時に、デプロイメント・ページの「リソースID」フィールドの値、またはウィジェット・コード・スニペット内のresource_id属性を指定することによって確立されます。指定されていない場合、Community-GadgetsはページURLのハッシュをリソースIDとして使用します。resource_id生成の独自の戦略を立てることをお薦めします。たとえば、データベース内でこのオブジェクトをより簡単に検索できるようにするため、ページIDをリソースIDとして使用できます。

cos_url

VARCHAR(256)

レビューが投稿されたディスカッションをホストするURL。

cos_date_created

DATE

フィード・オブジェクトが作成された日付。

cos_date_modified

DATE

フィードの最新の変更日。

cos_modified_by

VARCHAR(256)

フィードを最後に変更したユーザーのID。

cos_owner

VARCHAR(256)

フィード・オブジェクトを作成したユーザーのID。(フィード・オブジェクトは、最初のページ・ロード時にウィジェットがデプロイされた直後に作成されます。通常、これはゲスト・セッションを使用して実行されるため、-1が典型的な値です。)

cos_approved_count

BIGINT

モデレーションを正常にパスし、訪問者に対して表示されるレビューの数。

cos_pending_count

BIGINT

モデレーションをまだパスしていないレビューの数。

cos_rank

FLOAT

ページに投稿されたレビューに付けられたすべてのランクの平均(算術平均として計算される)。たとえば、ページに2つのレビューが投稿され、1つには星3つが、もう1つには星5つが与えられた場合、このフィールドの値は3+5/2 = 4となります。

cos_rank_precalculation

VARCHAR(450)

投稿されたランクの数のカンマ区切りリスト。このリストには全部で5つの項目が格納されます。リストのそれぞれの位置(索引)には、レビューに与えられたそれぞれの星の数のカウント数が格納されます。たとえば、3つのレビューがあり、1つのレビューに星3つが与えられ、他の2つのレビューに星5つが与えられた場合、残りの位置には0が置かれ、このリストには0,0,1,0,2が格納されます。対応する位置の投稿されたレビュー数に注目します。具体的な位置から、投票数/星の数を知ることができます。

cos_thumbs_up_rank

VARCHAR(450)

レビューのタイプがサムズ・アップ/ダウンに設定されている場合は、このフィールドに投票が記録されます。これは非正規化されたフィールドであり、サムズ・アップとサムズ・ダウンの数がカンマに区切られて格納されます。たとえば、レビューが3つあり、そのうち2つにサムズ・アップが付けられ、1つにサムズ・ダウンが付けられた場合、このフィールドの値は2,1,になります。

cos_ext_type

VARCHAR(256)

ファイル、記事、ブログなど、レビューが付加されるコンテンツの種類を表す、コンテンツ・カテゴリのID。(デプロイメント・ページのResource Typeパラメータとして、またはウィジェット・デプロイメント・コード・スニペットのresource_type属性として指定されます。)

cos_resource_title

VARCHAR(256)

「レビュー」ウィジェットがデプロイされるページのタイトル。デフォルトでは、ここにはウィンドウ・タイトルの値が記録されます。ページ・デザイナは、デプロイメント・コード・スニペット内のresource_title属性を指定することによってこの値をカスタマイズできます。

cos_posting_status

VARCHAR(256)

adminインタフェースを通じてトピック・ページによって定義される投稿ステータスの状態。可能な値: open、closed


81.1.2.2 ReviewRecord

このオブジェクトは、サイト・ページの訪問者によって投稿されたレビューを表します。これは、cos_root_idフィールドを介して多対1でReviewFeedオブジェクトに論理的にリンクされます。

表81-5 cg_review_record AssetTypeの構造

プロパティ 説明

id

BIGINT

レビューの識別子。

cos_text

VARCHAR(4000)

投稿されたレビューの内容。VARCHAR(4000)データ型は、WebCenter Sitesがインストールされているデータベースに対する、最も効率的な記憶域タイプ(CLOBなど)に変換されます。

cos_title

VARCHAR(450)

投稿されたレビューのタイトル。

cos_rank

FLOAT

訪問者によってレビューに与えられた星の数(ランク)。評価タイプがサムズ・アップ/ダウンの場合、5がサムズ・アップの値であり、1がサムズ・ダウンの値です。

cos_thumbs_up

INTEGER

評価タイプがサムズ・アップ/ダウンに構成されている場合、ここにランク値が格納されます。1がサムズ・アップの値であり、-1がサムズ・ダウンの値です。

cos_rating_type

INTEGER

与えられたレビュー・ランクのタイプ。可能な値コードは次のとおりです。

0: 星

1: サムズ・アップ/ダウン

cos_root_id

BIGINT

レビューが送信されたページを表すReviewFeedオブジェクトへのアソシエーション。

ここには、対応するcg_review_feed.id項目の値が格納されます。この列を使用して、1つのページに投稿されたすべてのレビューを問い合せることができます。

cos_state_value

VARCHAR(450)

レビューの状態。コンテンツのモデレーションのステージを表します。手動モデレーションが有効な場合、次の値になることがあります。

  • pending.new(新規投稿)

  • pending.modified(手動モデレーションが行われた)

レビューがモデレーションをパスしたか、または自動パブリッシュされた場合、値は次のようになります。

  • approved.all

レビューが自動フィルタまたはモデレータによってパスにならなかった場合、値は次のようになります。

  • inappropriate.robotdetected

  • inappropriate.humandetected

モデレータのナビゲーションを簡素化するため、Communityインタフェースにはこれらのカテゴリに基づくフィルタが含まれています。

cos_owner

BIGINT

レビューを投稿した訪問者のID。ゲストによるエントリである場合は-1

cos_owner_ip

VARCHAR(256)

レビューの投稿元のクライアントのIPアドレス。

cos_guest_name

VARCHAR(450)

レビュー・エントリを投稿した登録済ユーザーまたはゲストの表示名。Communityインタフェース内では、このフィールドを使用して、データベースに追加リクエストをすることなくレビューを作成者名でソートして表示できます。

cos_guest_email

VARCHAR(450)

レビューの権限設定によってゲスト(未認証の訪問者)による投稿が可能になっており、訪問者に対して電子メールIDの指定が求められる場合、この列に電子メールIDの値が保存されます。

cos_flagged

VARCHAR(32)

trueまたはfalseのいずれか。他の訪問者によってレビューにフラグが付けられ、報告されたかどうかに基づきます。

cos_flagged_count

BIGINT

他の訪問者がレビューにフラグを付けた回数。

cos_record_rank

VARCHAR(450)

レビューに対する有用性レポート(「はい」および「いいえ」)の数。カンマで区切られ、0から始まります。初期値は0,0です。

cos_record_rank_calculated

INTEGER

他の訪問者によって報告された有用性に基づいて事前計算されたレビューのランク。「はい」の数から「いいえ」の数を減算した値です。

cos_date_created

DATE

レビューが投稿された日付。

cos_date_modified

DATE

レビューの最新の変更日。(登録済ユーザーのみが自分のレビューを変更できます。必要に応じてモデレータがレビューを変更することも可能です。)


81.1.3 評価

このオブジェクトには、トピックまたはページ上の投稿に対して訪問者が与えた評価のリストが格納されます。これはReviewFeedオブジェクトに酷似しています。

Ratingsオブジェクトは、「評価」ウィジェットがWebサイトにデプロイされた後、Webページが最初にアクセスされたときにデータベースに作成されます。

評価とその評価が表示されるページの間の関係を決定するために、Community-Gadgetsは、WebページのURL(ウィジェットのデプロイメント・タグ内にあるアプリケーション生成キー)、またはリソースID(ウィジェットのデプロイ時に管理者が指定可能)を使用します。WebページのURLがキーとして利用可能である場合は、そのページURLから生成されたハッシュがRatingFeedオブジェクト内に記録されます。リソースIDが指定されている場合は、そのリソースIDがRatingFeedオブジェクト内に記録されます。RatingFeedオブジェクトは複数の評価を保持し、評価を表すRatingRecordオブジェクトと1対多のアソシエーションを持ちます。

評価フィード・オブジェクトは、WebCenter Sites内ではcg_rating_feedベーシック・アセットとして格納され、それに対応してデータベース内ではcg_rating_feed表として格納されます。

評価には、次の種類のプライマリ・オブジェクトが関連付けられます。

表81-6および表81-7は、cg_rating_feed assetTypeの構造の説明です。

81.1.3.1 RatingFeed

表81-6 cg_rating_feed AssetTypeの構造

プロパティ 説明

id

BIGINT

ページに投稿された評価のリストを保持するオブジェクトの識別子。

cos_resource_id

VARCHAR(256)

特定のWebページ上における評価の識別子。

これは、Community-Gadgetsが評価のリストと該当するページを関連付けることができるようにするための論理リンクです。このリンクは、ウィジェットのデプロイ時に、デプロイメント・ページの「リソースID」フィールドの値、またはウィジェット・コード・スニペット内のresource_id属性を指定することによって確立されます。この値は生成することも、手動で入力することもできます。この値が指定されない場合、Community-GadgetsはページURLのハッシュをリソースIDとして使用します。

resource_id生成の独自の戦略を立てることをお薦めします。たとえば、データベース内でこのオブジェクトをより簡単に検索できるようにするため、ページIDをリソースIDとして使用するという方法が考えられます。

cos_url

VARCHAR(256)

訪問者が評価を設定したWebページのURL。

cos_date_created

DATE

フィード・オブジェクトが作成された日付。

cos_date_modified

DATE

フィードの最終変更日。

cos_owner

VARCHAR(256)

最初にフィード・オブジェクトを作成したユーザーのID。(これは最初のページ・ロード時にウィジェットがデプロイされた直後に発生します。通常、フィード・オブジェクトはゲスト・セッションを通じて作成されるため、-1が典型的な値です。)

cos_approved_count

BIGINT

モデレーションを正常にパスし、一般的な評価計算でカウントされる評価の数。

cos_pending_count

BIGINT

モデレーションをまだパスしていない評価の数。

cos_stars_rank

FLOAT

訪問者によって投稿されたすべての星タイプの評価の平均(算術平均)。たとえば、2つの評価があり、1つは星3つのランク、もう1つは星5つのランクである場合、この値は3+5/2 = 4と計算されます。

cos_stars_rank_precalculation

VARCHAR(450)

評価の数のカンマ区切りリスト。このリストには全部で5つの項目が格納されます。リストのそれぞれの位置(索引)には、与えられたそれぞれの星の数のカウント数が格納されます。たとえば評価が3つあり、そのうち1つに星3つが与えられ、他の2つに星5つが与えられた場合、このリストの0は欠落している位置を示します。そのため、リストは0,0,1,0,2となります。対応する位置の評価の数に注意してください。具体的な位置から、投票数/星の数を知ることができます。

cos_thumbs_up_rank

VARCHAR(450)

評価のタイプがサムズ・アップ/ダウンに設定されている場合は、このフィールドに評価が記録されます。これは非正規化されたフィールドであり、サムズ・アップとサムズ・ダウンの数がカンマに区切られて格納されます。たとえば評価が3つあり、そのうち2つがサムズ・アップで、1つがサムズ・ダウンである場合、格納される値は2,1になります。

cos_likeit_count

BIGINT

like itの評価タイプがデプロイされている場合、このフィールドに「いいね」の数が記録されます。

cos_recommend_count

BIGINT

recommendの評価タイプがデプロイされている場合、このフィールドに「お薦め」の数が記録されます。

cos_ext_type

VARCHAR(256)

コンテンツ・カテゴリのID。ファイル、記事、ブログなど、評価の添付先コンテンツのタイプを示します。デプロイメント・ページのResource Typeパラメータの値として、またはウィジェット・デプロイメント・コード・スニペットのresource_type属性として指定されます。

cos_resource_title

VARCHAR(256)

「評価」ウィジェットがデプロイされるページのタイトル。デフォルトでは、ウィンドウ・タイトルの値がページ・タイトルとして記録されます。ページ・デザイナは、デプロイメント・コード・スニペット内のresource_title属性を指定することによってこの値をカスタマイズできます。


81.1.3.2 RatingRecord

このオブジェクトは、サイト・ページの訪問者によって投稿された評価を表します。これは、「cos_root_id」フィールドを介してRatingFeedオブジェクトに論理的にリンクされます。このオブジェクトは、多対1関係モデルに基づいています。

表81-7 cg_rating_record AssetTypeの構造

プロパティ 説明

id

BIGINT

評価の識別子。

cos_thumbs_up

INTEGER

評価のタイプがサムズ・アップ/ダウンに構成されている場合、ここにランク値が記録されます。1がサムズ・アップの値であり、-1がサムズ・ダウンの値です。

cos_rating_type_value

INTEGER

評価ランクのタイプ。

可能な値コードは次のとおりです。

0: 星

1: サムズ・アップ/ダウン

2: いいね

3: お薦め

cos_root_id

BIGINT

評価が送信されたページを表すRatingFeedオブジェクトへのアソシエーション。ここには、対応するcg_rating_feed.id項目の値が記録されます。この列を使用して、1つのページに投稿されたすべての評価を問い合せることができます。

cos_state_value

VARCHAR(450)

評価の状態。内容のモデレーションのステージを表します。

手動モデレーションが有効な場合、値はpending.new(新規投稿)またはpending.modified(手動モデレーション)になることがあります。

評価がモデレーションをパスしたか、または自動パブリッシュされた場合、値はapproved.allになります。

評価が自動フィルタまたはモデレータによってパスにならなかった場合、値はinappropriate.robotdetectedまたはinappropriate.humandetectedになります。

モデレータのナビゲーションを簡素化するため、Communityインタフェースの右側のパネルにはこれらのカテゴリのフィルタが用意されています。

cos_owner

BIGINT

評価を投稿した訪問者のID。ゲストによるエントリの場合は-1

cos_owner_ip

VARCHAR(256)

評価の投稿元のクライアントのIPアドレス。

cos_guest_name

VARCHAR(450)

評価を与えた登録済ユーザーまたはゲストの表示名。Communityインタフェース内では、このフィールドを使用して、データベースに追加リクエストをすることなく評価を作成者名でソートして表示できます。


81.1.4 投票

投票機能はデータベース内の1つの表によって表されます。管理者が投票を作成するときに、対応する行がこの表に追加されます(表81-8)。

表81-8 cg_poll AssetTypeの構造

プロパティ 説明

id

BIGINT

投票インスタンスの識別子。

cos_uid

VARCHAR(256)

投票インスタンスの一意の文字列による識別子。これは通常のIDとともにデプロイメント・コード・スニペットに埋め込まれます。データ移行時に整数のIDが失われた場合は、システムはUIDによってこの投票を見つけることができます。これにより、既存のデプロイメントの破損を防止できます。

cos_chart_type

INTEGER

投票結果を表示するグラフのタイプ。

可能な値は次のとおりです。

  • 0: 円グラフ

  • 1: 棒グラフ

  • 2: フラットな結果(オプションでパーセントが表示される)

cos_theme

INTEGER

Webサイト上で投票に適用されるテーマのID。可能な値は次のとおりです。

  • 0: 基本

  • 1: 詳細

  • 2: デザインなし

  • 3: オープン・デザイン

cos_start_date

DATE

投票が開始される日付。投票キャンペーンの開始日です。

cos_finish_date

DATE

投票が終了し、これ以上投票できなくなる日付。投票キャンペーンの終了日です。

cos_result_required

VARCHAR(32)

投票後に結果を表示するかどうかを指定するブール値(trueまたはfalse)。

cos_results_view

INTEGER

投票結果をどのように表示するかを指定します。

  • 0: コンテキスト・メニュー

  • 1: インプレース

  • 投票ウィジェットの内部

cos_results_width

INTEGER

投票結果のコンテキスト・メニューの幅(ピクセル単位)。

cos_title

VARCHAR(450)

投票のタイトル。

cos_question

VARCHAR(450)

投票の主な質問。

cos_options

VARCHAR(4000)

JSON形式による投票で選択可能な投票オプションのリスト。メタデータには、Community-Gadgetsが内部で使用する投票のID、オプション・タイトル、色および残りの投票数が含まれます。例:

[{"id":"n0","count":1,"color":"#1751a7","value":"Avatar"},{"id":"n1","count":0,"color":"#8aa717","value":"Matrix"}]

cos_thankyou_note

VARCHAR(450)

訪問者に対して投票後に表示されるメッセージ。

cos_disclaimer_required

VARCHAR(32)

投票の免責事項テキストを表示するかどうかを指定するブール値(trueまたはfalse)。

cos_disclaimer

VARCHAR(450)

投票ウィジェットの下部に表示される免責事項テキスト。

cos_votes

INTEGER

現在の投票キャンペーンの合計投票数。


81.1.5 トピック

トピック機能によって、「コミュニティ」ウィジェットのレビュー数、評価値などの統計を収集し事前に計算できるため、後から収集された情報をより簡単かつ効率的に問い合せることができます。訪問者のフィードバックの事前計算と最適化は重要です。このタイプのコンテンツは、サイトのホーム・ページや、最もディスカッションされている/最もレビューされている/最も評価が高い記事をリストする訪問者のダッシュボードに表示されることがあるためです。

CommunityウィジェットがデプロイされたWebページや、それらのページで実行されたアクティビティは、トピック機能の主要な関心事になります。したがって統計は、CommentFeed、ReviewFeed、RatingFeedなどの複数の表にわたって集計されます。

表81-9 cg_topic AssetTypeの構造

プロパティ 説明

id

BIGINT

トピック・インスタンスの識別子。

cos_url

VARCHAR(450)

ウィジェットがデプロイされるページのURL。

cos_title

VARCHAR(450)

トピックが関連付けられたページのHTMLタイトル。

cos_resource_id

VARCHAR(450)

UGCコンテンツをウィジェットのデプロイ先ページにリンクするための、ページのリソースID。

cos_date_created

DATE

トピックが作成された日付。ウィジェットのデプロイ先ページが、ブラウザで最初にアクセスされた日付です。

cos_comments_feed_id

BIGINT

対応するCommentFeedオブジェクトとCommentFeed.idフィールドの間の関係。これは、統計の集計対象となっているソース・オブジェクトです。

cos_comment_count

BIGINT

特定のトピックが関連付けられたページで投稿されたコメント数。

cos_comments_resource_type

VARCHAR(450)

ページにデプロイされた「コメント」ウィジェットに割り当てられたコンテンツ・カテゴリ(ブログ、記事など)。デフォルトのカテゴリ値の場合もあれば、「外観」設定ページにアップロードされたカスタマイズされたカテゴリの場合もあります。

cos_comments_date_modified

DATE

CommentFeedオブジェクトが統計値(投稿されたコメント数など)で最後に更新された日付。

cos_reviews_feed_id

BIGINT

トピックが関連付けられたReviewFeedオブジェクトとの関係。

cos_review_count

BIGINT

トピックが関連付けられたページで投稿されたレビュー数。

cos_reviews_resource_type

VARCHAR(450)

ページにデプロイされた「レビュー」ウィジェットに割り当てられたコンテンツ・カテゴリ(ブログ、記事など)。デフォルトのカテゴリの場合もあれば、「外観」設定ページにアップロードされてカスタマイズされたカテゴリの場合もあります。

cos_reviews_date_modified

DATE

ReviewFeedオブジェクトが統計値(投稿されたレビュー数、ランクなど)で最後に更新された日付。

cos_ratings_feed_id

BIGINT

特定のトピックが関連付けられたRatingFeedオブジェクトとの関係。

cos_rating_count

BIGINT

このトピックが関連付けられたページに投稿された評価数。

cos_ratings_resource_type

VARCHAR(450)

ページにデプロイされた「評価」ウィジェットに割り当てられたコンテンツ・カテゴリ(ブログ、記事など)。デフォルトのカテゴリの場合もあれば、「外観」設定ページにアップロードされてカスタマイズされたカテゴリの場合もあります。

cos_ratings_date_modified

DATE

RatingFeedオブジェクトが統計値(投稿された評価数、ランクなど)で最後に更新された日付。

cos_rank

FLOAT

他のトピックと比較した場合の現在のトピックのランク。現在のランキングのスキーマは頻度の統計に基づいており、次のフィールドの合計として計算されます。cos_review_count + cos_comment_count + cos_rating_count


81.1.6 訪問者

訪問者には、次の種類のプライマリ・オブジェクトが関連付けられます。

81.1.6.1 User

User表は、Community-Gadgetsによって保持される訪問者プロファイルを表します。この表には、表示名、電子メール、アバターの画像など、訪問者の個人情報データが含まれます。

表81-10 cg_user AssetTypeの構造

プロパティ 説明

id

BIGINT

ユーザー・プロファイルの識別子。

cos_email

VARCHAR(450)

Webサイトの訪問者の電子メール。訪問者がFacebook、Twitter、Googleを使用して、またはJanrainを通じてログインした場合、この情報は入力されない可能性があります。ローカルに登録した訪問者は、この情報を使用することで、必要に応じてパスワードを復元できます。

cos_display_name

VARCHAR(450)

ユーザーの表示名。訪問者が登録時に入力するか、またはユーザーがログインで使用したソーシャル・ネットワーキング・サービスから取得されます。

cos_profile_type_code

INTEGER

ユーザー・プロファイルのタイプ。

可能な値は次のとおりです。

  • 0: 通常のユーザーまたは訪問者

  • 1: 編集権限のあるユーザーまたは管理ユーザー(コンテンツ・モデレータなど)

  • 2: システム・ユーザー、または内部で接続をオープンする際にシステムが使用するユーザー。

packed_identities

VARCHAR(4000)

JSON形式による、訪問者のアイデンティティの非正規化されたリスト。これらのアイデンティティは認証時に使用されるため、このプロファイルにリンクされます。

例: [{"username":"john"}]

usernameフィールドは、対応するUserIdentityエントリにUserIdentity.cos_usernameフィールドを通じて関連付けられます。(Janrain経由で)ソーシャル・ネットワーク・サービスを使用してログインしたユーザーの訪問者プロファイルでは、ユーザー名に「jr:」の接頭辞が付加されます。

[{"username":"jr:http://twitter.com/account/profile?user_id=3333333"}]

cos_picture_blob

BINARY

ソーシャル・ネットワーキング・サービスを使用せずにローカルで登録したローカル・ユーザーのプロファイルでは、このフィールドにカスタマイズされたアバターが格納されます。

cos_picture_url

VARCHAR(450)

ソーシャル・ネットワーキング・サービスを使用してログインしたユーザーのプロファイルでは、ここにアバター画像のURLが格納されます。


81.1.6.2 UserIdentity

訪問者の資格証明を保存する2つのオプションとして、LDAPとWebCenter Sitesデータベースがあります。デフォルトでは、データベース・オプションが設定されます。

データベースが使用される場合、ユーザーの資格証明はUserIdentity表に格納され、対応する訪問者プロファイルにはUserLink表を使用して関連付けられます。

表81-11 cg_user_id AssetTypeの構造

プロパティ 説明

id

BIGINT

ユーザーの資格証明の識別子。

cos_username

VARCHAR(256)

認証で使用されるユーザー名。

cos_email

VARCHAR(256)

ユーザーの電子メール。必要に応じてユーザーのパスワードを復元する目的で使用されます。

cos_provider_id

VARCHAR(256)

訪問者の認証で使用されるアイデンティティ・プロバイダのタイプ。

可能な値は次のとおりです。

  • none: 内部で接続をオープンしたシステム・ユーザーのアイデンティティである場合。

  • ldap: 訪問者がLDAPを通じて認証される場合

  • wem-db: WebCenter Sites assetTypeを使用するCommunity-Gadgetsプラグインを通じて訪問者が認証される場合。

cos_encryption_type

VARCHAR(256)

ユーザー・アイデンティティのパスワードを保護するために適用される暗号化アルゴリズム。システムの現在のバージョンで使用されるアルゴリズムはSHA-256です。

cos_password

VARCHAR(256)

認証で使用されるパスワードの暗号化された値。


81.1.6.3 UserLink

表81-12では、訪問者のアイデンティティ(認証の資格証明を保持する)と訪問者のユーザー・プロファイルを適切に関連付けるために、UserIdentityをUserにリンクします。これは非正規化された表であるため、UserIdentity表のいくつかのフィールドもここにキャッシュされます。

表81-12 cg_user_link AssetTypeの構造

プロパティ 説明

id

BIGINT

ユーザー・リンクの識別子。

cos_username

VARCHAR(256)

UserIdentityオブジェクトのユーザー名。このリンクによってUserオブジェクトが関連付けられます。

cos_email

VARCHAR(256)

UserIdentityオブジェクトの電子メール。このリンクによってUserオブジェクトが関連付けられます。

cos_provider_id

VARCHAR(256)

UserIdentityオブジェクトのアイデンティティ・プロバイダ・コード。このリンクによってUserオブジェクトが関連付けられます。

可能な値は次のとおりです。

  • ext_auth: 訪問者がFacebookやTwitterなどのソーシャル・ネットワークを通じて、またはJanrainを通じて訪問した場合。

  • none: 内部で接続をオープンするシステム・ユーザーのアイデンティティである場合。

  • ldap: 訪問者がLDAPを通じて認証される場合

  • wem-db: WebCenter Sitesのアセットを使用するCommunity-Gadgetsプラグインを通じて訪問者が認証される場合。

cos_account_id

BIGINT

Userオブジェクトの識別子。このリンクによってUserIdentityオブジェクトが関連付けられます。


81.1.7 ガジェットとダッシュボード

ガジェットとダッシュボードの機能には、次の種類のプライマリ・オブジェクトが関連付けられます。

81.1.7.1 Gadget

Gadget表は、Community-Gadgetsによって保持されるガジェット・ユーザー設定を表します。

表81-13 cg_gadget AssetTypeの構造

プロパティ 説明

id

BIGINT

ガジェットの識別子。

original_gadget_id

BIGINT

特定のガジェットの継承元であるGadgetオブジェクトとの関係。

title

VARCHAR(256)

ガジェットのタイトル。

gadget_owner_id

BIGINT

特定のGadgetが関連付けられたUserオブジェクトとの関係。

packed_type

VARCHAR(256)

Gadgetオブジェクトのタイプ。

可能な値:

  • user_dash: 末端の訪問者がダッシュボードにリンクしたガジェット。

  • site_dash: 管理者がGadgetsインタフェースでダッシュボードにリンクしたガジェット。

  • site_registry: サイトのGadgetカタログに追加されたガジェット・オブジェクト。

  • global_registry: グローバルなGadgetカタログに追加されたガジェット・オブジェクト。

opensocial_descriptor_url

VARCHAR(4000)

Gadgetsインタフェースでガジェットが登録された際の登録元のOpenSocial XML記述子のURL。

gadgetset_id

BIGINT

特定のGadgetが関連付けられたGadgetSetオブジェクトとの関係。

packed_attributes

VARCHAR(4000)

特定のGadgetオブジェクトのCommunity-Gadgets固有のガジェット属性(JSON形式)。

packed_categories

VARCHAR(4000)

特定のGadgetオブジェクトに割り当てられたカテゴリの空白区切りリスト。

packed_preferences

VARCHAR(4000)

特定のGadgetオブジェクトの設定(JSON形式)。

gadget_iconid

BIGINT

ガジェットのアイコンが格納されているBLOBオブジェクトとの関係。

gadget_previewid

BIGINT

ガジェットのプレビューが格納されているBLOBオブジェクトとの関係。

gadget_thumbnailid

BIGINT

ガジェットのサムネイルが格納されているBLOBオブジェクトとの関係。


81.1.7.2 OpenSocialDescriptor

OpenSocialDescriptor表は、Gadgetsインタフェースでガジェットを登録する際に使用されるOpenSocialガジェットXML記述子を表します。

表81-14 cg_open_social_descriptor AssetTypeの構造

プロパティ 説明

id

BIGINT

OpenSocialDescriptorの識別子。

source_gadget_id

BIGINT

特定のOpenSocialガジェット記述子が関連付けられたGadgetオブジェクトとの関係。

site_id

BIGINT

記述子が作成されたサイトの名前。

gadget_links

VARCHAR(4000)

特定のOpenSocialガジェット記述子でのGadgetオブジェクトに対するリンクの非正規化されたリスト(JSON形式)。例: [{"siteId":"FirstSiteII", "gadgetId":1337101669171, "siteRegistry":false}, ...]

packed_info

VARCHAR(4000)

ガジェット記述子の設定の非正規化されたリスト(JSON形式)。この設定は、ガジェットXML記述子から読み取られます。


81.1.7.3 SingleGadgetData

SingleGadgetData表は、個別にデプロイされたガジェットに対する、認可されたユーザーの設定を表します。

表81-15 cg_single_gadget_data AssetTypeの構造

プロパティ 説明

Id

BIGINT

SingleGadgetDataの識別子。

gadget_id

BIGINT

特定のデータが関連付けられたGadgetオブジェクトとの関係。

user_id

BIGINT

特定のデータが関連付けられたUserオブジェクトとの関係。

resource_id

BIGINT

ガジェットの識別子。これは、Community-Gadgetsが、訪問者がコメントを投稿したページとデプロイされたガジェットを関連付けるために使用する論理リンクです。このリンクは、ウィジェットのデプロイ時に、デプロイメント・ページの「リソースID」フィールドの値、またはウィジェット・コード・スニペット内のresource_id属性を指定することによって確立されます。resource_id生成の独自の戦略を立てることをお薦めします。たとえば、データベース内でこのオブジェクトをより簡単に検索できるようにするため、ページIDをリソースIDとして使用できます。

data_value

VARCHAR(4000)

ガジェット記述子の設定の非正規化されたリスト(JSON形式)。この設定は、ガジェットXML記述子から読み取られます。


81.1.7.4 GadgetSet

GadgetSet表は、ダッシュボードの設定を表します。

表81-16 ダッシュボードのプロパティ

プロパティ 説明

id

BIGINT

GadgetSetの識別子。

user_id

BIGINT

特定のGadgetSetが関連付けられたUserオブジェクトとの関係。

packed_type

VARCHAR(256)

GadgetSetPossibleの値のタイプ:

  • user_dash: 末端のユーザーのダッシュボード

  • site_dash: 管理サイドのユーザーのダッシュボード

packed_ui_settings

VARCHAR(4000)

URLパラメータとして格納されるダッシュボード・インタフェースの設定。


81.2 CSSおよびウィジェット・テンプレートのカスタマイズ

Communityウィジェットは、次の方法でカスタマイズできます。

次の項で、これらのカスタマイズを実行する方法について説明します。

81.2.1 CSSのカスタマイズ: カラー・スキーマとスキニング

CSSをカスタマイズする一般的な手順は次のとおりです。

  1. ウィジェットの標準のCSSスキンをダウンロードします。

  2. カスタマイズが必要なインタフェース・エレメントのCSSスタイルを変更します。

  3. カスタマイズしたCSSを適用します。

全体的なプロセスは同じですが、「コメント」ウィジェットおよび「レビュー」ウィジェットのCSSスタイルのカスタマイズは、他のウィジェットのカスタマイズとは異なります。

この項は、次のトピックで構成されています。

81.2.1.1 「コメント」ウィジェットおよび「レビュー」ウィジェットのカスタマイズ

「コメント」および「レビュー」の場合、Communityインタフェースのウィジェットの「外観」ページからデフォルトのCSSをダウンロードし、それを変更してアップロードしなおします。Community-Gadgetsは、CSSがカスタマイズされている間もそのCSSをホストし続けるので、いつでも好きなときにCSSを変更できます。

CommentsのCSSをカスタマイズするには:

  1. Communityインタフェースに管理者としてログインします。

  2. 「コメント」メニューから「構成」「外観」を選択し、「コメントの外観」ページを表示します。

  3. 「一般」セクションで、「カスタムCSSのアップロード」フィールドの隣にある「現在のCSSのダウンロード」をクリックします。

    図81-2 現在のCSSのダウンロード

    図81-2の説明が続きます
    「図81-2 現在のCSSのダウンロード」の説明

  4. ダウンロードしたCSSを編集するためにFireFoxで開きます。

  5. 「表示」メニューから「Firebug」を選択します。

  6. FireBugメニューから「要素を調査」を選択します。CSSが図81-3のように表示されます。

    図81-3 FireBugで開かれたCSS

    図81-3の説明が続きます
    「図81-3 FireBugで開かれたCSS」の説明

  7. Commentsコード全体を含むDIVエレメントには、wsdk-records-recordクラスが含まれます。このクラスを検索するには、以前にダウンロードしたデフォルトのCSSで次を見つけます。

    .wsdk-records .wsdk-records-record
    { 
    border-top: 1px dashed #666;
    clear: both; 
    overflow: hidden; 
    margin: 5px 0px; 
    }
    Now, let's apply some customizations, for example change the default text
     color and size, and border:
    .wsdk-records .wsdk-records-record
    { 
    border-top: 2px solid orange; 
    color: #359AD3;
    font-size:15px;
    clear: both;
    overflow: hidden; 
    margin: 10px 0px; 
    }
    We can also find that background color is defined in the next div inside this
     container div, marked with CSS class "wsdk-state-default". Let's also define
     a custom background color:
    .wsdk-state-default 
    { 
    background: silver; 
    }
    
  8. 必要に応じてwsdk-records-recordクラスをカスタマイズし(図81-4)、変更内容を保存します。

    図81-4 変更されたCSS

    図81-4の説明が続きます
    「図81-4 変更されたCSS」の説明

  9. カスタマイズしたCSSをアップロードするために、Communityインタフェースに戻ります。

  10. 「コメント」メニューから「構成」「外観」を選択し、「コメントの外観」ページを表示します。

  11. 「一般」セクションで、スキンをデフォルトからカスタムに変更し、「カスタムCSSのアップロード」フィールドの隣にある「参照」をクリックして、カスタマイズしたCSSファイルを選択します。

  12. 「保存」をクリックします。

  13. Webページをリフレッシュしてウィジェットをリフレッシュし、CSSに加えた変更がウィジェットのインタフェースに反映されるかどうかを確認します。

「レビュー」ウィジェットのCSSをカスタマイズするには、「レビュー」に移動し、「構成」「外観」を選択します。次に、前述の手順を実行します(手順3から手順12)。

81.2.1.2 他のウィジェットのカスタマイズ

「コメント」と「レビュー」以外のウィジェットをカスタマイズするには、この項で説明する一般的なアプローチを使用できます。状況によっては、ここで説明するアプローチを使用して「コメント」ウィジェットや「レビュー」ウィジェットをカスタマイズすることもできます。

この項で説明するアプローチと、「コメント」ウィジェットや「レビュー」ウィジェットで説明した内容の主な違いは、他のウィジェット用のカスタマイズされたCSSは、Community-Gadgets Webアプリケーションでホストされなくなるという点です。通常、カスタマイズされたCSSは、コメントがデプロイされるWebサイトでホストされます。

次の手順を実行して、レビュー機能のアドオンである「上位ランクのトピック」ウィジェットをカスタマイズします。

ページ・テンプレートへのデプロイメント・タグとCSSタグのコピー

  1. Community-Gadgetsに管理者としてログインします。

  2. 「レビュー」メニューから、「デプロイ」「上位ランクのトピック」を選択します。

    「上位ランクのレビューのデプロイメント」フォームが表示されます(図81-5)。

    図81-5 上位ランクのレビューのデプロイメント

    図81-5の説明が続きます
    「図81-5 上位ランクのレビューのデプロイメント」の説明

  3. 「リソース・タイプ」「評価」「トピック数」および「次以降を含む」の各フィールドに必要な情報を入力します。「次以降を含む」フィールドを選択すると、最初の日付を選択するためのカレンダが表示されます。

  4. 「タグ」フィールドと「CSSタグ」フィールドの内容をコピーし、Webページ・テンプレートに貼り付けます。CSSは、前述のフィールドに追加された情報に基づいて更新されます。「タグ」フィールドの内容をテンプレートの<body>セクションに挿入します。「CSSタグ」フィールドの内容をページ・テンプレートの<head>セクションに挿入します。

  5. コード・スニペットをデプロイします。

    ページがレンダリングされると、上位ランクのトピックのデフォルトのルック・アンド・フィールは図81-6のようになります。

    図81-6 テンプレート内にタグが挿入された後の上位ランクのトピック

    図81-6の説明が続きます
    「図81-6 テンプレート内にタグが挿入された後の上位ランクのトピック」の説明

CSSのカスタマイズ

最初に、デプロイした「CSSタグ」フィールドの内容に含まれているID属性およびHREF属性を確認します。ID属性の値は、カスタマイズ時に変更しないようにする必要があります。この項の手順で示すとおり、HREFの値は変更します。

<link 
id="cos_css" 
type="text/css" 
rel="stylesheet" href="http://localhost:8280/cg/wsdk/skin/wsdk.topics.css?site_id=FirstSiteII&gateway=true" 
/>

CSSをカスタマイズする前に、インターネット・ブラウザでHREFの場所にアクセスし、そのコンテンツをダウンロードします。

  1. ダウンロードされたCSSの中で、トピック・リンクのCSSクラスを見つけます。ウィジェットの構造を調べます。

  2. トピックのヘッドラインとトピックのリンクの色をカスタマイズするには、それぞれのコード・スニペットを見つけます。.fw_topics .headlineおよび.fw_topics .topicを検索します。Webサイトの設計仕様に基づいて、次のコードを変更します。

    .fw_topics .headline h1 {
    color: #359AD3;
    font-size: 16px;
    }
    .fw_topics .topic {
    font-size: 14px;
    padding: 5px;
    font-weight: bold;
    text-decoration: none;
    }
    .fw_topics .topic a {
        color: orange;
        font-size: 12px;
        text-decoration: none;
    }
    
    
  3. CSSをWebサイトに適用するには:

    1. Webサイトのスタイルが格納されているフォルダにCSSをコピーします。

    2. 以前にページ・テンプレートにコピーしたCSSの中で、デフォルトの場所を、カスタマイズしたCSSにアクセス可能な新しいURLに置き換えます。たとえば、CSSをskinsフォルダにコピーした場合は、HREFエレメントは次のようになります。

      <link 
      id="cos_css" 
      type="text/css" 
      rel="stylesheet" href="http://localhost:8180/cs/skins/wsdk.topics.css" 
      />
      

      注意:

      Community-Gadgets Webアプリケーションはウィジェットをロードするときに、cos_css IDを持つ<link>エレメントのページを検索するため、ID属性はcos_cssに等しいままにしておく必要があります。このIDが存在する場合は、アプリケーションは継続してウィジェットをレンダリングします。このIDが存在しない場合、アプリケーションはデフォルトのCSSスキンを求める明示的なリクエストを作成し、それをページに適用します。そのため、cos_cssをID属性値として使用すると、Community-Gadgetsが適用済のカスタマイズを上書きするのを回避できます。


  4. 変更したばかりのCSSを含むウィジェットを使用しているページを再ロードし、カスタマイズが適用されていることを確認します(図81-7)。

    図81-7 ウィジェットに適用されたカスタマイズ

    図81-7の説明が続きます
    「図81-7 ウィジェットに適用されたカスタマイズ」の説明


ヒント:

同じページに複数のCommunityウィジェットをデプロイする場合、すべてのウィジェットのCSSファイルを1回のネットワーク・コールでロードすることによって、ネットワーク・コールの回数を最適化してください。Community-Gadgetsでは、<link/>タグ内にウィジェット名のコロン区切りリストを指定することで、このオプションがサポートされます。つまり、ウィジェット名を個別の<link/>エレメントに入れる必要はありません。例:

<link 
id="cos_css" 
type="text/css" 
rel="stylesheet" href=" http://localhost:8280/cg/wsdk/skin/<widget name #1>:<widget name #2>:<widget name #3>.css?site_id=FirstSiteII&gateway=true " 
/>

ウィジェット名の例は、wsdk.topicsおよびcomments-summaryです。特定のウィジェットの実際の値は、対応するデプロイメント・ページの「CSSタグ」フィールドで確認できます。


81.2.2 ウィジェット・テンプレートのカスタマイズ

大きな変更(「コメント」ウィジェットのアクションのリンクを、そのウィジェットの下部から上部に変更するなど)を行う場合は、プロジェクトの要件に応じてウィジェット・テンプレートをカスタマイズできます。

ウィジェット・テンプレートは、ブラウザ側でJavaScriptを使用して動的にレンダリングされます。これらのテンプレートは、Google Closure Templatesテクノロジに基づいています。

カスタマイズで利用可能な一連のテンプレート・ディレクティブが用意されています。詳細は、GoogleドキュメントのWebサイト(http://code.google.com/closure/templates/docs/commands.html)を参照してください。

この項で説明されている情報を適用する前に、Googleドキュメントのprintif/elseforおよびforeachの各文の説明を必ず読み、内容を理解しておいてください。

この項は、次のトピックで構成されています。

81.2.2.1 Communityウィジェットのテンプレートの理解

この項では、ウィジェット・テンプレート・テクノロジと構文について説明します。Community-Gadgetsテンプレート内で宣言されたテンプレートを対応するWebCenter Sitesテンプレート名に変換することで、どのようにアタッチ・ポイントをオーバーライドできるかを説明します。この項では、Community-Gadgetsでのカスタマイズに使用できるアタッチ・ポイントについて説明し、さらに、テンプレートのカスタマイズ時にウィジェット構造をナビゲートして必要なアタッチ・ポイントを見つける方法を説明します。

この項は、次のトピックで構成されています。

81.2.2.1.1 コンテキスト変数のアクセス・ポイント

テンプレートを変更する場合、開発者は訪問者の権限(Communityインタフェースで構成)および変数を扱う必要があります。Community-Gadgetsの各テンプレートには標準の$stack変数が含まれており、これらのコンテキスト変数や権限を見つけるのに利用できます。たとえば、次のタグを使用して、ローカライズ可能なリソースをテンプレートに挿入できます。

<h1>Welcome to {$stack.resources.get('label.comments')} Widget </h1>

$stack.resources変数は、cg.war/WEB-INF/classes/i18n_resources/widgets/cos.commonsおよびcg.war/WEB-INF/classes/i18n_resources/widgets/<widget name>で宣言されているすべてのリソースのアクセス・ポイントです。

81.2.2.1.2 動的スクリプティング

JavaScriptの{script}ディレクティブを使用して、テンプレート内に動的なロジックを構築できます。

{script}
var lastIndex = 10;
{/script}

{script}の中で定義した変数は、$$マークを使用することで他のクロージャ・ディレクティブ内でも利用可能です。たとえば、$$lastIndexがあります。

{for $index in range($$lastIndex)}
For loop: Iteration #{$index + 1} of {$$lastIndex} in total
<br />
{/for}

Googleのクロージャ・テンプレートの変数を{script}タグ内でアクセスする必要があるシナリオでは、通常の{$var}構文を使用できます。

{for $index in range(2)}
   {script}
          alert({$index});
   {/script}
{/for}

{script}内で生成されたデータは、次の方法でWebページに表示できます。

  • {script}タグを閉じ、以前に宣言したデータを{$$variable}}構文を使用して出力する。

  • Community-Gadgetsが提供するシステム出力変数を使用し、{script}文内でoutput.append(variable)を使用してJavaScriptから直接結果を出力する。

    {script}
           var message= "Hello World!";
           output.append(message);
    {/script}
    
81.2.2.1.3 ウィジェットのソースとテンプレート

cg.war/js/widgetsディレクトリには、Community-Gadgets Webアプリケーションに同梱されているウィジェット・ソースのリストがあります。たとえば、Comments-Gadgetsウィジェットのコードは、cg.war/js/widgets/wsdk.commentsディレクトリに格納されています。それぞれのウィジェットのディレクトリには、.shtmlファイル、ウィジェット・レイアウト定義およびウィジェット・インタフェースのレンダリング・プロセスのメイン・エントリ・ポイントが含まれています。たとえば、comments_layout_view.shtmlファイルは、「コメント」ウィジェットのメイン・エントリ・ポイントです。

81.2.2.1.4 Model-View-Controllerパターン

ウィジェットのインタフェースを構築するために、Community-GadgetsではModel-View-Controller (MVC)パターンを使用します。したがって、それぞれのインタフェースのリージョンには、Model、ViewおよびControllerに対応する3つのアイテムが含まれています。例:

comments_layout_action.js (Controller)
comments_layout_model.js (Model)
comments_layout_view.shtml (View)
81.2.2.1.5 Model-View-Controllerのリージョン

ウィジェットのインタフェースを構築するために、Community-Gadgetsではテンプレート(.shtml)の定義ではなく、MVCの定義を扱います。

たとえば、CommentsのレイアウトのMVCリージョンは、cg.war/js/widgets/<WidgetName>/...ディレクトリ内の/comments_layoutのIDによって特定できます。特殊文字の/は、ウィジェット・フォルダの相対パスを表します。対応する他のMVCエンティティを参照および検出するには、comments_layout MVC接頭辞と、_view.shtml (viewには、バインディング付きのHTMLページが含まれる)などの接尾辞を組み合せて使用します。したがって、特定のインタフェース・リージョンのMVC定義は、そのウィジェット・フォルダ内の相対パス、および特定のモデル、ビューまたはコントローラの検出に使用されるMVCエンティティの接頭辞によって特定されます。

これらのMVC IDはテンプレート全体で頻繁に使用されるため、これらのMVC IDの理解は、ウィジェットのインタフェースを構築する上で不可欠な要素です。

81.2.2.1.6 ネストされたテンプレート

MVCのエンティティが処理され、そのテンプレートがレンダリングされるときに、別のMVCエンティティをテンプレート内に再帰的に含めることができます。これにより、小さなインタフェースの部品を組み合せながら複雑なインタフェースを構築できます。

テンプレートのネストを可能にするには、他のテンプレートをネストするテンプレートに次のタグを追加します。たとえば、「レビュー」ウィジェットの中に「ログイン・バー」ウィジェットをネストできます。

<div attachPoint="/sample"></div>

テンプレートにこのタグを含めると、Community-Gadgetsはウィジェットのルート・フォルダcg.war/js/widgets/<WidgetName>/から、sample_action.jsおよびsample_view.shtmlを検索します。

attachPoint=""構文以外に、bindMvc=""ディレクティブには、ネストされたテンプレート(たとえば、bindMvc="wsdk.ui.input")も含まれます。ただし、このディレクティブは特定のウィジェット・フォルダ階層の外部にあるテンプレートをコールするため、現在のウィジェット・フォルダ階層のテンプレートは含みません。これにより、Community-Gadgets内の複数のウィジェット間でコンポーネントを再利用できます。

81.2.2.1.7 カスタマイズのワークフロー

前の項では、アタッチ・ポイントを使用してテンプレートをネストする方法について説明しました。この項では、テンプレートを通じてアタッチ・ポイントをカスタマイズまたはオーバーライドする方法について説明します。

Community-GadgetsがウィジェットのJavaScriptバンドルをコンパイルする場合は、WebCenter Sitesから、WebCenter Sitesテンプレートとして定義された任意のウィジェット・テンプレート・カスタマイズをダウンロードし、それらをJavaScriptにコンパイルして、ウィジェットに適用します。Community-GadgetsとWebCenter Sites間の対応付けを作成できるテンプレート名の規定は、http://{host}:{port}/cs/ContentServer?pagename={site name}/cg/{widget}/{attach point}_view.shtml&ft_ss=trueで指定されます。また、Community-Gadgetsで特定のテンプレートが検出可能になります。

(/sampleテンプレートなどの)テンプレートをカスタマイズするには、最初に、Community-Gadgetsが構成された本番のWebCenter Sitesシステム上でWebCenter Sitesテンプレート・アセットを作成する必要があります。

アタッチ・ポイントをWebCenter Sitesのテンプレート名に変換するには、次のフォーマットを使用します。

http://{host}:{port}/cs/ContentServer
?pagename={site name}/cg/{widget}/{attach point}_view.shtml
&ft_ss=true

たとえば、「hello-world」ウィジェットのいずれかのテンプレートの中にattachPoint="/sample"というアタッチ・ポイントがある場合、次のようなWebCenter Sitesに対するHTTPリクエストに変換されます。

http://{host}:{port}/cs/ContentServer
?pagename={site name}/cg/hello-world/sample_view.shtml
&ft_ss=true

カスタムのCommunity-Gadgetsテンプレートの場合は、cos/hello-world/sample_view.shtmlというWebCenter Sitesのネーミング規則に従って、WebCenter Sites内に対応するテンプレートを作成する必要があります。

bindMvcは、事前定義されたアタッチ・ポイントのセットであり、ネストされたテンプレートで使用できます。表81-3には、作成したテンプレート内でbindMvc=""属性構文を使用してネストできる、テンプレートのリストが記載されています。再利用可能なウィジェット・コードが格納されているcg.war/js/widgets.commonsディレクトリの対応するサブディレクトリ内に、デフォルトのテンプレートがあります。

コンポーネントをオーバーライドするには、マッピング(表81-17)を使用してMVCの名前を、WebCenter Sites内で作成するテンプレートの名前にバインドします。

表81-17 MVCの名前をテンプレートの名前にバインドするためのマッピング

バインドされるMVC オーバーライドするテンプレートの名前

wsdk.ui.stars

cg/wsdk.ui.stars/stars_view.shtml

wsdk.ui.thumbs

cg/wsdk.ui.thumbs/thumbs_view.shtml

wsdk.ui.input

cg/wsdk.ui.input/input_view.shtml

wsdk.ui.textarea

cg/wsdk.ui.textarea/textarea_view.shtml

wsdk.ui.pagination

cg/wsdk.ui.pagination/pagination_view.shtml

wsdk.ui.session

cg/wsdk.ui.session/session_view.shtml


81.2.2.1.8 ウィジェット・テンプレート構造におけるアタッチ・ポイント

Communityウィジェットのインタフェースと機能は、特定の方法で構造化されたテンプレートを利用して構築されます。図81-8は、「コメント」ウィジェットの構造を示しています。カスタマイズの際は、この構造をナビゲーション・マップとして利用できます。

図81-8 「コメント」ウィジェットの構造

図81-8の説明が続きます
「図81-8 「コメント」ウィジェットの構造」の説明

訪問者のアクションに応じて動的に呼び出されレンダリングされるアタッチ・ポイントは、テンプレート内で直接参照されることはありません。たとえば、訪問者がコメントの「編集」または「削除」のリンクをクリックすると呼び出されるアタッチ・ポイントがあります。これらのイベントのダイアログ・ボックスは、ウィジェットの初期ロード・フェーズではレンダリングできず、後でプログラムでロードされます。

そのような動的なダイアログ・ボックスのアタッチ・ポイントの例をいくつか示します。

「レビュー」ウィジェットのテンプレートとアタッチ・ポイントの構造を、図81-11に示します。レビューへのフラグ設定、レビューの編集および削除のアタッチ・ポイントはコメントの場合と同じであり、それぞれ/record_list/record/flag/flag、/record_list/record/edit/formおよび/record_list/record/remove/removeになります。

図81-11 「レビューの投稿」ページ

図81-11の説明が続きます
「図81-11 「レビューの投稿」ページ」の説明

コメントやレビューの投稿フォームには、「プレビュー」ボタンが含まれています。このボタンをクリックすると、コンテキスト・メニューとともにレンダリングされたコメントまたはプレビュー(図81-12)が表示されます。

図81-12 「プレビュー」ポップアップ・ダイアログ・ボックス

図81-12の説明が続きます
「図81-12 「プレビュー」ポップアップ・ダイアログ・ボックス」の説明

コメントおよびレビューのいずれでも、/record_list/record/preview/previewというアタッチ・ポイントによってこのポップアップ機能が作成されます。


ヒント:

Community-Gadgets Webアプリケーションは、本番のWebCenter Sitesのインスタンスから、カスタマイズされたテンプレートをロードします。ただし、本番のインスタンスには、これらのテンプレートを管理するための編集用のインタフェースがない場合があります。したがって、最初は開発環境からスタートし、本番用および管理用のCommunity-Gadgetsサーバー・インスタンスから、編集用のインタフェースを備えたWebCenter Sitesの単一インスタンスをポイントすることをお薦めします。このアプローチを使用すると、テンプレートを作成して、Community-Gadgets内でルック・アンド・フィールを確認できます。テンプレートを作成してテストしたら、それらを開発環境からエクスポートして本番環境にインポートしたり、カスタム・テンプレートを目的の場所にパブリッシュすることができます。


81.2.2.2 サンプル・テンプレートの作成

WebCenter SitesのAdvancedインタフェースを使用してサンプル・テンプレートを作成するには:

  1. 本番環境および管理環境のものを含め、すべてのCommunity-Gadgetsサーバーを停止します。

  2. 本番環境のWebCenter Sitesインスタンスを起動します。

    以降の手順では、サーバーはローカル・ホストのポート8080で実行されていると想定します。

  3. http://localhost:8080/cs/loginにアクセスしてWebCenter Sitesにログインし、テンプレートのカスタマイズが必要なサイトを選択します。

  4. そのサイトのAdvancedインタフェース・アプリケーションを起動します。

  5. カスタマイズ可能なテンプレートを作成するには、「新規」をクリックします。

    図81-13 WebCenter SitesのAdvancedインタフェース: 「新規」

    図81-13の説明が続きます
    「図81-13 WebCenter SitesのAdvancedインタフェース: 「新規」」の説明

  6. 右側の表で、「テンプレート」の隣にある「新規テンプレート」リンクをクリックします。

    図81-14 「新規テンプレート」リンク

    図81-14の説明が続きます
    「図81-14 「新規テンプレート」リンク」の説明

  7. 「割当て先」を任意の値に設定します(この値はここでは適切でないため)。「続行」をクリックします。

  8. 「名前」フィールドに、オーバーライドされるアタッチ・ポイントをcg/{widget}/{attach point}_view.shtmlの形式で指定します。

  9. 「対象アセット・タイプ」フィールドで「様々なアセット・タイプに適用可能」を選択し、「続行」をクリックします。

  10. 「使用」フィールドで、「エレメントはHTMLページ全体を定義するため、外部から呼び出すことができます。」を選択します。

  11. 「テンプレート・エレメントを作成しますか。」フィールドで、「JSP」をクリックします。

  12. 「エレメント・ロジック」フィールドで、終了タグ</cs:ftcs>の直前にテンプレート・コンテンツを入力します。テンプレート・コンテンツには、次の文、およびCommunity-Gadgets内にキャッシュされたテンプレートを無効にするための必須エレメントを含める必要があります。

    <%-- Record dependencies for the Template --%>
    <ics:if condition='<%=ics.GetVar("tid")!=null%>'><ics:then><render:logdep cid='<%=ics.GetVar("tid")%>' c="Template"/></ics:then></ics:if>
    
  13. テンプレートのコンテンツについては、Community-Gadgetsのファイル・システムに移動し、cg.war/js/widgets/{widget}/{attach point}_view.shtmlにあるデフォルトのコンテンツをコピーします。

  14. 「続行」をクリックします。

  15. 「サイト・エントリ」ページで、「保存」をクリックします。

  16. 新しく作成したテンプレートがHTTPを通じてCommunity-Gadgetsで利用できることを確認するには、ブラウザに次の形式でテンプレートのURLを入力します。

    http://{host}:{port}/cs/ContentServer?pagename={site}/cg{attach point}_view.shtml&ft_ss=true 
    
  17. Community-Gadgetsサーバーを起動し、デプロイされているウィジェットにカスタマイズ内容が適用されていることを確認します。

81.2.2.3 カスタム・データ・セットのロード

シナリオによっては、既存のテンプレート内のカスタマイズされたプロジェクト固有のデータをロードする必要があります。これを行うには、Community-Gadgetsに対してデータをRESTサービスとして公開します(JSONP形式)。

RESTサービスを作成したら、システム・ローダー変数を使用してテンプレートからそのサービスを呼び出します。テンプレートがレンダリングされる前にカスタム・データがロードされるようにするには、ページの先頭の{script.preload}セクションにこの起動を含める必要があります。

{script.preload}
       loader.loadData(url, params, key);
{/script.preload}
  • url: データを提供するJSONPエンドポイントのURLアドレス。

  • params: 問合せをパラメータ化する必要がある場合に、JSONPエンドポイントに対してGETのパラメータとして渡されるパラメータ。

  • key: この変数には返された結果セットとデータが格納され、$stack.keyでアクセスできます。

  1. 例として、JSONP RESTサービス・エンドポイントとして使用するdata.jspファイルを作成します。このファイルには次のコンテンツを含めます。

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"    pageEncoding="ISO-8859-1"%>
    <% 
    out.write(request.getParameter("cosrestcallback"));
    %>({ responseCode : "OK", data : ["foo","bar"]});
    

    この例では、応答はJSON形式で提供され、そこにはレスポンス・コードとデータ配列によるサンプル・データが格納されます。JSONのレスポンスは、Community-Gadgetsで使用されるJSONPプロトコルに従って、コールバックの名前によってラップされます。

  2. data.jspファイルを、Community-Gadgetsのwebappフォルダにデプロイします。

  3. Community-Gadgetsにはサンプル・ウィジェットが用意されており、ウィジェット・テクノロジを試すためのサンドボックスとして利用できます。そのソースは、cg.war/js/widget/sample.widgetコード内にあります。cg/sample.widget/layout_view.shtmlという名前のWebCenter Sitesのカスタム・テンプレートを作成するには、第81.2.2.2項「サンプル・テンプレートの作成」で説明している手順に従います。

  4. カスタマイズされたテンプレート内のscript.preloadセクションで指定されたデータをダウンロードし、それをページに出力します。

  5. Community-GadgetsのURLを自分の場所に置き換えます。

    図81-1は、ロードされた後のサンプル・データ・コードを示しています。

    例81-1 ロードされたサンプル・データ

    <%@ taglib prefix="cs" uri="futuretense_cs/ftcs1_0.tld"
    %><%@ taglib prefix="asset" uri="futuretense_cs/asset.tld"
    %><%@ taglib prefix="assetset" uri="futuretense_cs/assetset.tld"
    %><%@ taglib prefix="commercecontext" uri="futuretense_cs/commercecontext.tld"
    %><%@ taglib prefix="ics" uri="futuretense_cs/ics.tld"
    %><%@ taglib prefix="listobject" uri="futuretense_cs/listobject.tld"
    %><%@ taglib prefix="render" uri="futuretense_cs/render.tld"
    %><%@ taglib prefix="siteplan" uri="futuretense_cs/siteplan.tld"
    %><%@ taglib prefix="searchstate" uri="futuretense_cs/searchstate.tld"
    %><%@ page import="COM.FutureTense.Interfaces.*,
                       COM.FutureTense.Util.ftMessage,
                       COM.FutureTense.Util.ftErrors"
    %><cs:ftcs><%-- /cos/sample.widget/layout_view.shtml
    --%>
    <%-- Record dependencies for the Template --%>
    <ics:if condition='<%=ics.GetVar("tid")!=null%>'><ics:then><render:logdep cid='<%=ics.GetVar("tid")%>' c="Template"/></ics:then></ics:if>
            {script.preload}
                 loader.loadData("http://localhost:8280/cg/data.jsp",{}, "customData");
            {/script.preload}
            <div>
    <h1>Welcome to Sample Widget. Data Load Demo</h1>
    <br />
    Data loaded with response code = "{$stack.customData.responseCode}  "
    <br />
    Custom data loaded:&nbsp;&nbsp;
    {script}
        var data = {$stack.customData.data};
        for(var dataIdx in data)
        {
        var item = data[dataIdx];
        {/script}
        {$$item},&nbsp;&nbsp;&nbsp;
        {script}
        }
    {/script}
    </cs:ftcs>
    

81.3 カスタム・ワード・フィルタの作成

Community-Gadgetsでは、CommunityウィジェットがデプロイされたWebサイトに訪問者がフィードバックを投稿できます。不適切な内容、スパムまたはなんらかの不正な情報がWebサイト上にパブリッシュされる事態を防ぐために、Community-Gadgetsには、コンテンツをフィルタリングするためのユーザー生成コンテンツ(UGC)フィルタリング・サブシステムが用意されています。

フィルタリング・システムのデフォルトの構成は、ワード・フィルタ・ファイル(制限付きワードのリスト)に依存します。このファイルは、Communityインタフェースで「設定」「制限付きワード」の順に選択することでアップロードできます。制限付きワードのリストをアップロードし、Communityインタフェースで「設定」「モデレート」の順に選択して自動モデレートを有効にすると、Community-Gadgetsは、訪問者が投稿したコンテンツが調べ、各ワードをリスト内のワードと比較します。投稿されたコメントまたはレビューに制限付きワードが含まれる場合は、「不適切」とマークされ、Webサイトで公開されません。


注意:

特殊文字を含む禁止ワードが「不適切」とマークされ、「承認済」とマークされないようにするには、例81-2に示されている構文を使用して、カスタム・ワード・フィルタを作成する必要があります。


デフォルトのコンテンツ・フィルタの動作をカスタマイズする必要が生じることがあります。たとえば、スパムの検出と防御のための統計的推測と高度な手法の機能を提供するサード・パーティ・ライブラリと統合するために、Community-Gadgetsはプラッガブル・ワード・フィルタ・モデルを備えています。これにより、カスタム・ワード・フィルタをゼロから作成できます。

カスタム・ワード・フィルタを作成するには、最初にワード・フィルタのロジックが含まれたJavaクラスを作成する必要があります。次に、このクラスをコンパイルし、JARファイルとしてアセンブルして、Community-Gadgetsのデプロイメントにプラグインできるようにします。

  1. IDEで新規Javaプロジェクトを作成します。

  2. プロジェクトのクラスパスに、com.fatwire.cos.moderation.filter.WordFilterインタフェースが格納されたJARライブラリを追加します。このライブラリのJARは、cg.war/WEB-INF/lib/cos-api-11.1.1.8.0.jarにあるCommunity-Gadgets Webアプリケーションからコピーできます。

    例81-2に、WordFilterインタフェースを示します。

    例81-2 新規Javaプロジェクト

    package com.fatwire.cos.moderation.filter;
    import java.util.Set;
    /**
     * The word filter interface that needs to be implemented
     * when developing and plugging-in a custom word filter
     * to Community-Gadgets Server.
     * The content is assigned to "Inappropriate" category and isn't
     * shown on web site once any of the filters registered in the system
     * reports an abuse.
     * @author e_shevchenko
     *
     * May 16, 2011
     */
    public interface WordFilter
    {
        /**
         * The filter method makes a decision whether content
         * specified can be shown on web site or not 
         * @param text the content submitted by visitor
         * @param profanityWords the list of prohibited words uploaded on 
         * "Moderation" page in the Community interface
         * @return true if an abuse detected and false if content
         * can be shown on web site
         */
        boolean filter(StringBuffer text, Set<String> profanityWords);
    }
    
  3. プロジェクト内に新規Javaクラス(例: cos.demo.DemoFilter)を作成します。

  4. このクラスが次のWordFilterインタフェースを実装することを宣言します。

    package cos.demo;
    
    import java.util.Set;
    import com.fatwire.cos.moderation.filter.WordFilter;
    
    public class DemoFilter
         implements WordFilter
    {
         @Override
        public boolean filter(StringBuffer text, 
                              Set<String> profanityWords)
        {
           // Add filter logic here
           return false;
       }
    }
    
  5. filterメソッド本体にカスタムの実装を追加します。

    filterメソッドは2つのパラメータをとります。1つは訪問者が送信したソース・テキストで、もう1つはCommunityインタフェースを通じてテキスト・ファイルとしてアップロードされた制限付きワードのリストです。要件に基づいて、既存の制限付きワードのリストを使用するか、またはサード・パーティの制限付きワードのデータベースを使用するかを選択できます。

    次の例は、ユーザー生成コンテンツにdemoという単語が含まれているかどうかを確認する方法を示しています。

    package cos.demo;
    import java.util.Set;
    import com.fatwire.cos.moderation.filter.WordFilter;
    public class DemoFilter
        implements WordFilter
    {
        @Override
        public boolean filter(StringBuffer text, Set<String> profanityWords)
        {
            boolean result = false;
            if(null != text )
            {
                result = text.toString().contains("demo");
            }
            return result;
        }
    }
    
  6. フィルタ・クラスの内容を実装し、コンパイルします。

  7. コンパイルしたクラスをfilter-demo.jarというJARファイルにパッケージ化します。

  8. Community-Gadgets Webアプリケーションのクラス・ローダーがこのカスタム・フィルタを利用できるようにするには、管理環境と本番環境の両方のcg.war/WEB-INF/libディレクトリにfilter-demo.jarファイルをコピーします。

  9. Community-Gadgets Webアプリケーションがカスタム・フィルタを検出できるようにするには、cg.war/WEB-INF/classesディレクトリにあるcos_word_filters.xml構成ファイルにこのフィルタをプラグインします。

    <?xml version="1.0" encoding="UTF-8" ?>
    <word-filters>
    <word-filter
    className="com.fatwire.cos.records.moderation.filter.DefaultWordFilter"
    />
    </word-filters>
    
  10. デフォルトのワード・フィルタを置き換えます。管理環境と本番環境の両方で、cos word filters.xmlファイルから既存の<word-filter/>エレメントを削除し、作成したクラスへの参照が含まれる新しいエレメントを追加します。新しいcos word filters.xmlファイルの内容は次のようになります。

    <?xml version="1.0" encoding="UTF-8" ?>
    <word-filters>
        <word-filter className="cos.demo.DemoFilter"/>
    </word-filters>
    
  11. 管理システムと本番システムの両方で、Community-Gadgetsサーバーを再起動します。

  12. 自動ワード・フィルタリングを有効にするには、Communityインタフェースにアクセスし、「設定」「モデレート」を選択し、「自動モデレート」セクションで「制限付きワードに対する自動モデレート」を選択します(図81-15)。

    図81-15 制限付きワードに対する自動モデレート

    図81-15の説明が続きます
    「図81-15 制限付きワードに対する自動モデレート」の説明

  13. Webサイトで、demoという単語を含んだコメントまたはレビューを投稿します。投稿が「不適切」カテゴリに割り当てられ、パブリッシュされないことを確認します。

81.4 CAPTCHAジェネレータの作成

CAPTCHAテクノロジは、Webサイトを攻撃する可能性のある自動スパム・システムのロボットを特定するのに役立ちます。Community-Gadgetsには、CAPTCHAのカスタム実装用のプラグイン・モデルが備わっています。

この項では、単純なCAPTCHAジェネレータを作成し、それをCommunity-Gadgetsにプラグインする方法について説明します。この手順は、カスタム・ワード・フィルタの作成手順と似ています。CAPTCHAジェネレータを作成するには、必要なインタフェースを実装する新しいクラスを作成し、このクラスをコンパイルしてJARファイルとしてパッケージ化し、Community-Gadgetsサーバーにデプロイします。

  1. IDEで新規Javaプロジェクトdemo-captchaを作成します。

  2. プロジェクトのクラスパスに、プロジェクト用のJARライブラリを追加します。必要なJARは、Community Webアプリケーションのディレクトリからコピーできます(cg.war/WEB-INF/lib/cos-api-11.1.1.8.0.jarにある)。

  3. cos-api-11.1.1.8.0.jarファイルから、実装対象のインタフェースcom.fatwire.cos.captcha.CaptchaGeneratorを抽出します。例81-3に、このインタフェースの内容を示します。

    例81-3 com.fatwire.cos.captcha.CaptchaGeneratorインタフェース

    package com.fatwire.cos.captcha;
    /**
     * The interface that needs to be implemented when 
     * creating plug-in that generates CAPTCHA to be shown to 
     * visitors when UGC is submitted.
     * 
     * It's a factory that generates complex Captcha objects that are managed
     * by Community-Gadgets Server and utilized when CAPTCHA is rendered for visitors
     * and when it's validated on content submission
     * 
     * @author alex
     *
     * Oct 17, 2011
     */
    public interface CaptchaGenerator
    {
        /**
         * Factory method that creates a new captcha object 
         * that consists of challenge text 
         * and challenge image to shown to visitors
         * @return
         */
        public Captcha generate();
    }
    
  4. demo-captchaプロジェクト内に、cos.demo.DemoGeneratorという名前の新規Javaクラスを作成します(例81-4)。

    例81-4 demo-captchaプロジェクト

    package cos.demo;
    import com.fatwire.cos.captcha.Captcha;
    import com.fatwire.cos.captcha.CaptchaGenerator;
    public class DemoGenerator
        implements CaptchaGenerator
    {
        @Override
        public Captcha generate()
        {
            // Add implementation
            return null;
        }
    }
    
  5. CaptchaGeneratorインタフェースを実装します。

  6. 例81-5に示すように、generateメソッドを実装します。

    最初にチャレンジ・テキストを生成してから、生成されたテキストを表示するイメージを作成します。テキストとイメージの準備が整ったら、CaptchaFactoryクラスを利用して、それらをCaptchaオブジェクトにパッケージします。Captchaオブジェクトのカスタム実装を作成するかわりに、このファクトリを使用することを強くお薦めします。これは、ファクトリによって構築されているCaptchaオブジェクトがすでにシリアライズ可能で、クラスタ・メンバー間で安全に共有できるからです。カスタム実装を作成することを選択した場合は、Captchaオブジェクトをシリアライズ可能にしてください。

    例81-5 generateメソッド

    package cos.demo;
    import com.fatwire.cos.captcha.Captcha;
    import com.fatwire.cos.captcha.CaptchaFactory;
    import com.fatwire.cos.captcha.CaptchaGenerator;
    public class DemoGenerator
        implements CaptchaGenerator
    {
        @Override
        public Captcha generate()
        {
            String challenge = "foo_bar";// Add generation
            byte[] image = generateImage(challenge); // Generate image
            return CaptchaFactory.create(challenge, image);
        }
    }
    
  7. コンパイルしたクラスをcaptcha-demo.jarというJARファイルにパッケージ化します。

  8. Community-Gadgetsのクラス・ローダーがこのジェネレータを利用できるようにするには、管理環境と本番環境の両方のcg.war/WEB-INF/libディレクトリにcaptcha-demo.jarファイルをコピーします。

  9. Community-Gadgetsがジェネレータを検出できるようにするには、ジェネレータを構成ファイルにプラグインします。cg.war/WEB-INF/classesディレクトリ内に、次の内容のcos_captcha.xmlファイルを作成します。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <captcha-generator className="cos.demo.DemoGenerator"/>
    
  10. 管理システムと本番システムの両方で、Community-Gadgetsサーバーを再起動します。

  11. コメントでCAPTCHAを有効にするには、Communityインタフェースにアクセスし、「コメント」「構成」「権限」を選択し、「コメントできるユーザー」セクションで「ユーザーは検証コードを入力する必要がある」を選択します(図81-16)。

    図81-16 CAPTCHAの有効化

    図81-16の説明が続きます
    「図81-16 CAPTCHAの有効化」の説明

  12. 前述の手順を繰り返して、レビューでもCAPTCHAを有効にします。

  13. 「コメント」ウィジェットまたは「レビュー」ウィジェットを、ログイン・バーのサポートありでデプロイします。

  14. CAPTCHAチャレンジのフィールドが表示され、CAPTCHAの画像がレンダリングされることを確認するには、Webサイトの「登録」リンクをクリックします。また、コメントまたはレビューをゲストとして投稿してみます。フォーム内にCAPTCHAが表示されます。

81.5 ダッシュボード・テーマのカスタマイズ

管理者はCSSファイルを使用して、ダッシュボード内の既存のテーマを変更できます。

ダッシュボード・テーマをカスタマイズするには:

  1. Gadgetsインタフェースを開きます。

  2. 「設定」メニューから「外観設定」を選択します(図81-17)。

    図81-17 Gadgetsインタフェース - 「外観設定」ページ

    図81-17の説明が続きます
    「図81-17 Gadgetsインタフェース - 「外観設定」ページ」の説明

  3. 「外観設定」ページの「一般」セクションで、「カスタムCSSのアップロード」フィールドの隣にある「現在のCSSのダウンロード」リンクをクリックし、gadgets_dashboard.cssファイルを自分のコンピュータに保存します。

  4. このダウンロードしたCSSファイル内のダッシュボード・テーマのCSSスタイルを変更します。たとえば、Blueテーマを変更するには、次の行を見つけ、必要に応じてそれらを変更します。

    共通のダッシュボード背景色:

    .gas.gas_blue{
    background-color: #d7e9f2;
    }
    

    ガジェットのヘッダーの左、右およびコンテンツの画像:

    .gas.gas_blue .gas_gadgetHeader_left {
    background-image: url(../../admin-gadgets/images/BlueLeftTop.png);
    }
    
    .gas.gas_blue .gas_gadgetHeader_right {
    background-image: url(../../admin-gadgets/images/BlueTopRight.png);
    }
    
    .gas.gas_blue .gas_gadgetHeader {
    background-image: url(../../admin-gadgets/images/BlueStrip.png);
    }
    

    ガジェットのヘッダーのアクションの背景:

    .gas.gas_blue .gas_gadgetActions {
    background-image: url(../../admin-gadgets/images/BlueStrip.png);
    }
    

    ガジェットのヘッダーのアクション・ボタン:

    .gas.gas_blue .gas_gadgetHeader_content a.gas_close {
    background-image: url(../../admin-gadgets/images/BlueDeleteOff.png);
    }
    
    .gas.gas_blue .gas_gadgetHeader_content a.gas_expand {
    background-image: url(../../admin-gadgets/images/BlueWSOpenOff.png);
    }
    
    .gas.gas_blue .gas_gadgetHeader_content a.gas_collapse {
    background-image: url(../../admin-gadgets/images/BlueWSCollapsedOff.png);
    }
    User toolbar collors (gadget settings)
    
    .gas.gas_blue .gas_UserPrefs_content {
    background-color: #d7e9f2;
    color: #ffffff;
    }
    

    パネル・テーマのアイコン:

    .gas .gas_setup .gas_setupIcon_theme_blue {
    background-image: url(../../admin-gadgets/images/gasThemeBlue.png);
    }
    
    * html .gas .gas_setup .gas_setupIcon_theme_blue {
    background-image: url(../../admin-gadgets/images/gasThemeBlue.gif);
    }
    
  5. 変更したファイルを保存します。

  6. 「スキン」ドロップダウン・リストから「カスタム」を選択します。

    これにより、カスタマイズしたgadgets_dashboard.cssファイルをアップロードするためのフィールドが有効になります(図81-17を参照)。

  7. 「カスタムCSSのアップロード」フィールドの隣にある「参照」をクリックします。

  8. 「ファイルのアップロード」ダイアログ・ボックスで、変更したgadgets_dashboard.cssファイルを選択し、「開く」をクリックします。

  9. 「外観設定」ページで、「保存」をクリックします。

81.6 Community-Gadgetsのイベント処理

Community-Gadgetsでは、すべてのイベントはCoSEventクラスから継承されます。顧客監視で使用されるイベントの例として、CommentEventReviewEventRatingEventおよびExternalAuthEventがあります。

すべてのイベントには、メジャー・タイプとマイナー・タイプがあります。これらのタイプはイベントを特定するのに役立ちます。メジャー・タイプは、各イベントが属するシステムの部分を表します。これは、CoSEventMajorTypeによって表されます。可能な値は、ALLCOMMENTREVIEWおよびRATINGです。ALLは、すべての可能なメジャー・タイプを指します。

イベント・マイナー・タイプは実行されたアクションを示し、CoSEventMinorTypeでイベントが表示されます。指定可能な値は、ALLCREATEDMODIFIEDDELETEDおよびREPORTEDです。REPORTEDは、コメントおよびレビューにフラグが付くと表示されます。ALLは、すべての可能なマイナー・タイプを指しています。

イベントは、リスナーによって処理されます。すべてのリスナーは、CoSEventListenerクラスから継承されます。リスナーは、どのイベント(たとえば、CommentEventまたはReviewEvent)を処理するかを知っている必要があります。

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

81.6.1 イベントのエンティティ

すべてのイベント・エンティティの親クラスはCoSEventです。完全なクラス名は、com.fatwire.cos.events.CoSEventです。このクラスは、cg.war/WEB-INF/libs/cos-api-11.1.1.8.0.jarライブラリにあります。

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

81.6.1.1 CommentEventエンティティ

CommunityEventエンティティは、コメントの作成、変更および削除で使用されます。フル・クラス名はcom.fatwire.cos.records.events.CommentEventです。このクラスは、cg.war/WEB-INF/libs/cos-shared-11.1.1.8.0.jarライブラリにあります。

  • サポートされるメジャー・タイプ: ALLCOMMENT

  • サポートされるマイナー・タイプ: ALLCREATEDMODIFIEDDELETEDREPORTED

表81-18 CommunityEventのメソッド

メソッド宣言 メソッド定義

Long getFeedId()

CommentsFeedオブジェクトへのリンク

String getSiteId()

イベントが発生したサイトの名前

ModerateContentState getRecordState()

モデレーションの状態を示します。可能な値:

  • RECORD_PENDING_NEW

  • RECORD_PENDING_MODIFIED

  • RECORD_PENDING

  • RECORD_APPROVED

  • RECORD_INAPPROPRIATE_ROBOT_DETECTED

  • RECORD_INAPPROPRIATE_HUMAN_DETECTED

  • RECORD_INAPPROPRIATE


81.6.1.2 ReviewEventエンティティ

ReviewEventエンティティは、レビューの作成、変更および削除で発生します。フル・クラス名はcom.fatwire.cos.records.events.ReviewEventです。このクラスは、cg.war/WEB-INF/libs/cos-shared-11.1.1.8.0.jarライブラリにあります。

  • サポートされるメジャー・タイプ: ALLCOMMENT

  • サポートされるマイナー・タイプ: ALLCREATEDMODIFIEDDELETEDREPORTED

表81-19 ReviewEventのメソッド

メソッド宣言 メソッド定義

Long getFeedId()

ReviewsFeedオブジェクトへのリンク

String getSiteId()

イベントが発生したサイトの名前

ModerateContentState getRecordState()

モデレーションの状態を示します。可能な値:

  • RECORD_PENDING_NEW

  • RECORD_PENDING_MODIFIED

  • RECORD_PENDING

  • RECORD_APPROVED

  • RECORD_INAPPROPRIATE_ROBOT_DETECTED

  • RECORD_INAPPROPRIATE_HUMAN_DETECTED

  • RECORD_INAPPROPRIATE


81.6.1.3 RatingEventエンティティ

RatingEventエンティティは、評価の作成および削除で発生します。フル・クラス名はcom.fatwire.cos.records.events.RatingEventです。このクラスは、cg.war/WEB-INF/libs/cos-shared-11.1.1.8.0.jarライブラリにあります。

  • サポートされるメジャー・タイプ: ALLRATING

  • サポートされるマイナー・タイプ: ALLCREATEDDELETED

表81-20 RatingEventのメソッド

メソッド宣言 メソッド定義

Long getFeedId()

RatingFeedオブジェクトへのリンク

String getSiteId()

イベントが発生したサイトの名前

ModerateContentState getRecordState()

モデレーションの状態を示します。可能な値:

  • RECORD_APPROVED

  • RECORD_INAPPROPRIATE_ROBOT_DETECTED

  • RECORD_INAPPROPRIATE_HUMAN_DETECTED

  • RECORD_INAPPROPRIATE


81.6.1.4 ExternalAuthEventエンティティ

ExternalAuthEventエンティティは、外部の認証プロバイダによって正常に認証された場合に発生します。フル・クラス名はcom.fatwire.cos.events.api.ExternalAuthEventです。このクラスは、cg.war/WEB-INF/libs/cos-api-11.1.1.8.0.jarライブラリにあります。

  • サポートされるメジャー・タイプ: ALL

  • サポートされるマイナー・タイプ: ALL

表81-21 ExternalAuthEventEventのメソッド

メソッド宣言 メソッド定義

String getAuthenticatorId()

外部認証プロバイダの識別子

JSONObject getRawData()

JSONObjectクラスで外部認証プロバイダから受信したデータ。これはプロバイダ(たとえば、Facebook、Twitter)によって異なります。プロバイダ固有の方法で解析する必要があります。


81.6.2 イベントのリスナー

イベントのリスナーは、すべてのイベントのリスニングおよびアクティビティのログ記録で使用されます。すべてのリスナーは、CoSEventListenerクラスから継承されます。リスナーは、どのイベント(たとえば、CommentEventまたはReviewEvent)を処理するかを知っている必要があります。

フル・クラス名はcom.fatwire.cos.events.CoSEventListenerです。このクラスは、cg.war/WEB-INF/libs/cos-api-11.1.1.8.0.jarライブラリにあります。

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

81.6.2.1 単純なリスナーの作成

この例では、すべてのイベントのログを記録するリスナーの作成方法を示します。cos-api-11.1.1.8.0.jarライブラリが必要です。

単純なリスナーを作成するには

  1. 抽象クラスCoSEventListenerを拡張して、SampleListenerクラスを作成します。

    public class SampleListener extends com.fatwire.cos.events.CoSEventListener
    
  2. リスナーが記録するメジャー・タイプとマイナー・タイプを選択し(この例ではALL)、クラスのコンストラクタでそれらのタイプを設定します。

    public SampleListener () {
       setMajorType(CoSEventMajorType.ALL);
       setMinorType(CoSEventMinorType.ALL);
    }
    
  3. void process (CoSEvent event)およびint getTaskCount()という、2つの関数を実装します。これらは親の抽象クラスでは実装されていません。

    private final static Logger LOG = Logger.getLogger(SampleListener.class);
    private AtomicInteger counter = new AtomicInteger();
    
    @Override
    public void process(CoSEvent event) {
        counter.incrementAndGet();
        try{
            LOG.info("Process event: " + event.getClass() + ": " + event);
        } finally {
            counter.decrementAndGet();
        }
    }
    
    @Override
    public int getTaskCount(){
        return counter.get();
    }
    

    完了すると、完全なクラス・ファイルは次のようになります。

    package com.example.listeners;
    
    import java.util.concurrent.atomic.AtomicInteger;
    
    import org.apache.log4j.Logger;
    
    import com.fatwire.cos.events.CoSEvent;
    import com.fatwire.cos.events.CoSEventListener;
    import com.fatwire.cos.events.CoSEventMajorType
    import com.fatwire.cos.events.CoSEventMinorType
    
    public class SampleListener extends CoSEventListener
    {
        private final static Logger LOG = Logger.getLogger(SampleListener.class);
        private AtomicInteger counter = new AtomicInteger();
    
        public SampleListener () {
           setMajorType(CoSEventMajorType.ALL );
           setMinorType(CoSEventMinorType.ALL );
        }
    
        @Override
        public void process(CoSEvent event) {
            counter.incrementAndGet();
            try{
                LOG.info("Process event: " + event.getClass() + ": " + event);
            } finally {
                counter.decrementAndGet();
            }
        }
    
        @Override
        public int getTaskCount(){
            return counter.get();
        }
    }
    
  4. Community-Gadgetsの構成にこのリスナーを追加します。

    cg.war/WEB-INF/classesフォルダにあるlisteners.xmlファイルを開き、リスナー・クラスのBeanを追加します。

    <bean id="sampleListener" class="com.example.listeners.SampleListener" />
    

81.6.2.2 イベント通知リスナーの開発 - processメソッド

processメソッドは、イベントのタイプがALLに設定されている場合にイベントをフィルタリングできます。

@Override
public void process(CoSEvent event) {
    if(event instanceof CommentEvent) {
        sendCommentNotification(event);
    } else if (event instanceof ReviewEvent) {
        sendReviewsNotification(event);
    }
}

81.6.2.3 イベント通知リスナーの開発 - 電子メールの送信

このリスナーは、アドレスまたはアドレス・グループに対して通知テキスト付きのMIME電子メールを送信できます。そのための1つの方法として、JavaMail APIを使用した送信機能の開発があります。また、Community-Gadgetsの電子メール機能を使用すると、クラス・ファイル(クラスパスにcos-core-11.1.1.8.0.jarが必要)内に2行のコードを追加することによって電子メールの送信が可能になります。

...
import com.fatwire.cos.core.CoS;
...
CoS.instance().getEmailFacility().send(mimeMessage);
...

mimeMessageを生成するには、次のようなコードが使用されます。

private MimeMessage generateEmail(CoSEvent event, String emails) throws
  AddressException, MessagingException {
        Session session = null;
        MimeMessage msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress("noreply@samplenotify.example.com"));
        msg.setSentDate(new java.util.Date()); 
        msg.setRecipients(javax.mail.Message.RecipientType.TO,
            InternetAddress.parse(emails));
        msg.setSubject("==Notification subject==");
        
        Multipart multipart = new MimeMultipart("alternative"); 
        BodyPart messageBodyPart = new MimeBodyPart(); 
        messageBodyPart.setContent("<SOME NOTIFY TEXT>",
                                   "text/plain;charset=\"UTF-8\"");
        multipart.addBodyPart(messageBodyPart);

        msg.setContent(multipart);
        msg.saveChanges();
        
        return msg;
    }

注意:

メッセージ本文の内容を生成するには、Velocityライブラリや他のテンプレート・エンジンを使用できます。前述の"<SOME NOTIFY TEXT>"トークンではなく、生成されたテンプレートを使用する必要があります。


リスナーの作成が完了すると、完全なクラス・ファイルは次の例のようになります。このクラス・ファイルは、cos-api-11.1.1.8.0.jarcos-core-11.1.1.8.0.jarおよびcos-shared-11.1.1.8.0.jarを必要とします。

package com.fatwire.cos.shared;

import java.util.concurrent.atomic.AtomicInteger;

import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import com.fatwire.cos.core.CoS;
import com.fatwire.cos.events.CoSEvent;
import com.fatwire.cos.events.CoSEventListener;
import com.fatwire.cos.events.CoSEventMajorType;
import com.fatwire.cos.events.CoSEventMinorType;
import com.fatwire.cos.records.events.CommentEvent;
import com.fatwire.cos.records.events.ReviewEvent;

public class NotificationListener extends CoSEventListener {

    private AtomicInteger counter = new AtomicInteger();

    public NotificationListener () {
       setMajorType(CoSEventMajorType.ALL );
       setMinorType(CoSEventMinorType.ALL );
    }

    @Override
    public void process(CoSEvent event) {
        counter.incrementAndGet();
        try {
            if(event instanceof CommentEvent) {
                sendCommentNotification((CommentEvent)event);
            } else if (event instanceof ReviewEvent) {
                sendReviewsNotification((ReviewEvent)event);
            }
        } finally {
            counter.decrementAndGet();
        }
    }   

    @Override
    public int getTaskCount() {
        return 0;
    }

    private void sendCommentNotification(CommentEvent event) {
        MimeMessage mimeMessage = null;
        String site = event.getSiteId();
        try {
            mimeMessage = generateEmail(event, site ,
                "moderator_comments@samplenotify.example.com");
        } catch (Throwable e) {
            e.printStackTrace();
        }
        sendEmail(mimeMessage); 
    }

    private void sendReviewsNotification(ReviewEvent event) {
        // send notification only for creating review event
        if (event.getMinorType().equals(CoSEventMinorType.CREATED)) {
            MimeMessage mimeMessage = null;
            String site = event.getSiteId();
            try {
                mimeMessage = generateEmail(event, site,
                    "moderator_reviews@samplenotify.example.com");
            } catch (Throwable e) {
                e.printStackTrace();
            }
            sendEmail(mimeMessage); 
        }
    }

    private void sendEmail(MimeMessage mimeMessage) {
        CoS.instance().getEmailFacility().send(mimeMessage);
    }

    private MimeMessage generateEmail(CoSEvent event, String site,
        String emails) throws AddressException, MessagingException {
        Session session = null;
        MimeMessage msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress("noreply@samplenotify.example.com"));
        msg.setSentDate(new java.util.Date()); 
        msg.setRecipients(javax.mail.Message.RecipientType.TO,
                          InternetAddress.parse(emails));
        msg.setSubject("==Notification subject== from " + site + " site");

        Multipart multipart = new MimeMultipart("alternative"); 
        BodyPart messageBodyPart = new MimeBodyPart(); 
        messageBodyPart.setContent("<SOME NOTIFY TEXT>",
                                   "text/plain;charset=\"UTF-8\"");
        multipart.addBodyPart(messageBodyPart);

        msg.setContent(multipart);
        msg.saveChanges();

        return msg;
    }

}

ファイルを作成したら、次のBeanをlistentes.xmlに追加します。

<bean id="sampleListener" class="com.example.listeners.NotificationListener" />