API

Ajax XML API は、単純な HTTP リクエストベースの API で、REST (Representational State Transfer) プロトコル上での通信を行います。 API へは、以下のようなポータル URL パスの "ajaxapi" サーブレット経由で HTTP を使ってアクセスします。

http://hostname/contextname/ajaxapi

リクエストパラメータとページ

リクエストパラメータは、リクエストした API の動作と、追加の API パラメータを指定します。 リクエストが参照しているページは、HTTP URL 内に含まれます。 ですので、もしページを変更するリクエストを作成したい場合は、ページは以下のような HTTP URL 内で指定します。

http://localhost:8080/jetspeed/ajaxapi/Public/db-browser.psml
標準の PALポータルプロファイリングを使ったページ検索アルゴリズムが、ページを決定します。 PALポータルのプロファイリングルールにより、ユーザーのためのページを検索するため、URL に含まれていなくても動作します。 たとえば、
http://localhost:8080/jetspeed/ajaxapi
という URL は、現在のユーザのデフォルトページを表示します。

リクエストパラメータは、API それぞれで固有です。 多くの場合、"action" パラメータというリクエストパラメータは必要になります (デフォルトの場合を除く)。 デフォルトのアクションは "action=getpage" です。 これは、プロファイリングルールにより検索された PSML ページの XML 表現を返します (PSML は XML 形式です)。 リクエストパラメータのそれぞれの例は以下の表を参照してください。

現時点で利用可能な API を示します。

ページの取得

API:getpage
コンポーネント:AjaxGetPage
説明:getpage は、ページマネージャから、PSML に保存されたページを取得します。
パラメータ:
pageURL に含まれます
actiongetportlets (省略可、これがデフォルトのアクションです)
API の例:

			
http://localhost:8080/jetspeed/ajaxapi/Public/content.psml
XML レスポンス:

<js>
<status>success</status>
<action>getpage</action>
  <page hidden="false">
  <defaults layout-decorator="tigris" portlet-decorator="tigris"/>
  <name>public.psml</name>
  <path>/Public/public.psml</path>
  <title>Public Share</title>
  <short-title>Public Share</short-title>
  <metadata name="title" xml:lang="es">Carpeta compartida</metadata>
  <fragment id="ps-1000" type="layout" name="jetspeed-layouts::VelocityTwoColumns" decorator="">
    <fragment id="ps-1001" type="portlet" name="rss::RSS" decorator="">
      <property name="row" value="0"/>
      <property name="column" value="0"/>
    </fragment>
	<fragment id="ps-1002" type="portlet" name="demo::BookmarkPortlet" decorator="">
      <property name="row" value="1"/>
      <property name="column" value="1"/>
    </fragment>
	<fragment id="ps-1003" type="portlet" name="jsf-demo::CalendarPortlet" decorator="">
      <property name="row" value="0"/>
      <property name="column" value="1"/>
    </fragment>
	<fragment id="P-1080bff9b03-10000" type="portlet" name="jsf-demo::CalendarPortlet" decorator="">
      <property name="row" value="1"/>
      <property name="column" value="0"/>
    </fragment>
  </fragment>
</page>
</js>

絶対位置で移動

API:moveabs
コンポーネント:AjaxMovePortletAbsolute
説明:ページ上のポートレットの絶対位置をリクエストパラメータで指定した row と col に従って移動する。
パラメータ:
pageURL に含まれます
actionmoveabs
id移動させたいポートレットのポートレット PSML フラグメント ID
rowポートレットフラグメントを置きたい位置の絶対的な行位置 (ゼロベース)
colポートレットフラグメントを置きたい位置の絶対的な列位置 (ゼロベース)
API の例:

			
http://localhost:8080/jetspeed/ajaxapi/Public/public.psml?action=moveabs&id=ps-1003&row=0&col=1			
XML レスポンス:

<js>
   <status>success</status>
    <action>moveabs</action>
    <id>ps-1003</id>
	<old_position>
      <col>1</col>
      <row>1</row>
    </old_position>
	<new_position>
      <col>1</col>
      <row>0</row>
    </new_position>
</js>						

移動

API:moveleft, moveright, moveup, movedown
コンポーネント:AjaxMovePortletLeft, AjaxMovePortletRight, AjaxMovePortletUp, AjaxMoveDown
説明:アクションを指定して、ページ上のポートレットを相対的なある位置から移動する。
パラメータ:
pageURL に含まれます
actionmoveleft, moveright, moveup, movedown
id移動させたいポートレットのポートレット PSML フラグメント ID
API の例:

			
http://localhost:8080/jetspeed/ajaxapi/Public/public.psml?action=movedown&id=ps-1003
XML レスポンス:

<js>
   <status>success</status>
    <action>movedown</action>
    <id>ps-1003</id>
	<old_position>
      <col>1</col>
      <row>0</row>
    </old_position>
	<new_position>
      <col>1</col>
      <row>1</row>
    </new_position>
</js>						

ポートレットの追加

API:add
コンポーネント:AjaxAddPortlet
説明:現在のページに新しいポートレットを追加します。ポートレットは指定する行と列の場所に追加することが可能です。もし、行も列も指定されない場合は、デフォルトでそれぞれ 0 に設定されます。
パラメータ:
pageURL に含まれます
actionadd
idページに配置したいポートレットのフルネーム。PALポータルのポートレットの命名規則を使って指定します (ポートレットアプリケーション名::ポートレット名)
row省略可: 新しいポートレットフラグメントを置きたい場所の行位置の絶対指定 (ゼロベース)
col省略可: 新しいポートレットフラグメントを置きたい場所の列位置の絶対指定 (ゼロベース)
API の例:

			
http://localhost:8080/jetspeed/ajaxapi/Public/public.psml?action=add&id=jsf-demo::CalendarPortlet
XML レスポンス:

<js>
  <status>success</status>
  <action>add</action>
  <id>jsf-demo::CalendarPortlet</id>
  <new_position>
    <col>0</col>
    <row>0</row>
  </new_position>
</js>

ポートレットの削除

API:remove
コンポーネント:AjaxRemovePortlet
説明:現在のページから新たにポートレットを削除する。
パラメータ:
pageURL に含まれる
actionremove
id削除したいポートレットのポートレット PSML ID
API の例:

			
http://localhost:8080/jetspeed/ajaxapi/Public/public.psml?action=remove&id=ps-1003
XML レスポンス:

<js>
  <status>success</status>
  <action>remove</action>
  <id>jsf-demo::CalendarPortlet</id>
  <new_position>
    <col>0</col>
    <row>0</row>
  </new_position>
</js>

ポートレットの取得

API:getportlets
コンポーネント:AjaxGetPortlets
説明:ポートレットの取得は、現在のサブジェクトで利用可能な (ソートされた) ポートレットのリストを返します。ポートレットリストはフィルタリングされ、現在のサブジェクトで表示可能なポートレットが返されます。PALポータルセキュリティポリシー (JAAS) は、このフィルタリングを実行します。ポートレット (のリスト) は、それぞれのポートレットの名前、表示名、説明の記述された XML フォーマットで返されます。
パラメータ:
pageURL に含まれる
actiongetportlets
filterまだ実装されていません。照会のフィルタを定義します。
API の例:

			
http://localhost:8080/jetspeed/ajaxapi?action=getportlets
XML レスポンス:

<js>
<status>success</status>
<action>getportlets</action>
-
	<portlets>
<portlet name="demo::AttributeScopePortlet" displayName="Attribute Scope Demo" description="$portlet.Description">
        </portlet>
<portlet name="demo::BookmarkPortlet" displayName="Bookmark Portlet" description="Bookmark Portlet">
        </portlet>
<portlet name="demo::BookmarkPortletForXHTMLBasic" displayName="Bookmark Portlet for XHTML Basic" description="Bookmark Portlet for XHTML Basic">
        </portlet>
<portlet name="demo::CSSDemoPortlet" displayName="CSS Demo Portlet" description="$portlet.Description">
        </portlet>
....
<portlet name="rss::RSS" displayName="RSS Portlet" description="RSS Portlet">
        </portlet>
<portlet name="rss::RomeRSS" displayName="Rome RSS Portlet" description="Rome RSS Portlet">
        </portlet>
</portlets>
</js>

Spring アセンブリ

AjaxRequestService は、Ajax リクエストを扱う Spring のコンポーネントです。これは、Ajax リクエストの特別な処理のために、Ajax パイプライン内でフックされます。以下が Spring アセンブリです。それぞれの API は Ajax サービス内で設定されます。

	
<bean id="AjaxRequestService" class="org.apache.jetspeed.ajax.AjaxRequestServiceImpl">
    <constructor-arg index="0">
        <map>
            <entry key="moveabs">
                <ref bean="AjaxMovePortletAbsolute"/>
            </entry>
            <entry key="moveleft">
                <ref bean="AjaxMovePortletLeft"/>
            </entry>
            <entry key="moveright">
                <ref bean="AjaxMovePortletRight"/>
            </entry>
            <entry key="moveup">
                <ref bean="AjaxMovePortletUp"/>
            </entry>
            <entry key="movedown">
                <ref bean="AjaxMovePortletDown"/>
            </entry>
            <entry key="add">
                <ref bean="AjaxAddPortlet"/>
            </entry>
            <entry key="remove">
                <ref bean="AjaxRemovePortlet"/>
            </entry>
            <entry key="getportlets">
                <ref bean="AjaxGetPortlets"/>
            </entry>
            <entry key="getpage">
                <ref bean="AjaxGetPage"/>
            </entry>
        </map>
    </constructor-arg>
    <constructor-arg index="1">
        <ref bean="AjaxVelocityEngine"/>
    </constructor-arg>
</bean>