ポートレット仕様はどのようにしてポートレットアプリケーションがユーザー属性を使用できるのかについて定義をしています。 たとえば、JSR 168 の PLT.17.1 では、属性に関して portlet.xml で以下のように定義されます。
<portlet-app version="1.0" xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"> <user-attribute> <description>User Given Name</description> <name>user.name.given</name> </user-attribute> <user-attribute> <description>User Last Name</description> <name>user.name.family</name> </user-attribute> <user-attribute> <description>User eMail</description> <name>user.home-info.online.email</name> </user-attribute> ... </portlet-app>
このように属性が定義されると、ポートレットは PortletRequest インタフェースで定義された USER_INFO 定数を使って PortletRequest から変更できない Map としてログインしているユーザーの属性値にアクセスすることが可能になります。
Map userInfo = (Map)request.getAttribute(PortletRequest.USER_INFO); String givenName = (userInfo!=null) ? (String)userInfo.get("user.name.given") : ""; String lastName = (userInfo!=null) ? (String)userInfo.get("user.name.family") : ""; String email = (userInfo!=null) ? (String)userInfo.get("user.home-info.online.email") : "";
ポートレット仕様で定義されないのは、ポータルが定義されたユーザー属性をユーザーの具体的な属性にどのようにマッピングするかです。
PALポータルは具体的なユーザー属性を定義したり、そのユーザー属性へのアクセスを定義したりするためにとても柔軟な方法を提供しています。
ユーザー属性は PALポータルが情報を格納しておくためのデータベースとしている User Preferences を使って格納されます (これは PALポータルの殆んどのコンポーネントと同じ方法でカスタマイズできます)。 ユーザー属性の実装は PALポータルの java.util.prefs.Preferences の実装を利用しています。 ユーザー属性は User preferences 内の特定のノード下に格納されます。 そして任意の名前の属性を自由に含むことができます。 これらの具体的なユーザー属性は portlet.xml 内で以下のような 2 つの方法で定義されたユーザー属性にマップされます。
もし対象とするポータルとして PALポータルを利用して新しいポートレットアプリケーションを書いたのなら、ポータル内でユーザー属性と一致する User Attributes を定義することは簡単でしょう。
しかし、もし既に存在するポートレットアプリケーションを PALポータル上に配備したいのなら、ポートレットアプリケーションに必要な属性名と PALポータルの User Preferences に格納される具体的な属性名の間のミスマッチがあるかもしれません。
jetspeed-portlet.xml に PALポータル特有の設定やカスタマイズを記述することができます。 このファイルの配備は PALポータルで必須ではありません。 しかし、もしポートレットアプリケーションの war ファイル内の WEB-INF フォルダにこのドキュメントが見つかれば、処理が行われます。 PALポータル特有の設定は "http://portals.apache.org/jetspeed" 名前空間を使って定義します。
ユーザー属性のマッピングはカスタムのユーザー属性名を定義する "name" エレメントと、その属性名にマップされる具体的な属性名を定義する"name-link" エレメントを含む "user-attribute-ref" エレメントによって定義されます。
<portlet-app version="1.0" xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" xmlns:js="http://portals.apache.org/jetspeed"> <js:user-attribute-ref> <js:name>user-name-given</js:name> <js:name-link>user.name.given</js:name-link> </js:user-attribute> <js:user-attribute-ref> <js:name>user-name-family</js:name> <js:name-link>user.name.family</js:name-link> </js:user-attribute> ... </portlet-app>
先の例のようなカスタムのマッピングを使って、ポートレットは次のようにユーザー属性にアクセスできます。
Map userInfo = (Map)request.getAttribute(PortletRequest.USER_INFO); String givenName = (userInfo!=null) ? (String)userInfo.get("user-name-given") : ""; String lastName = (userInfo!=null) ? (String)userInfo.get("user-name-family") : ""; String email = (userInfo!=null) ? (String)userInfo.get("user.home-info.online.email") : "";
カスタムのマッピングが定義されていない email 属性も完全一致でのアクセスが可能であることに注意してください。