You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@portals.apache.org by ta...@apache.org on 2015/07/16 23:01:16 UTC
svn commit: r1691449 [19/29] - in /portals/site/jetspeed: ./ jetspeed-2.3/
jetspeed-2.3/jetspeed-guide-admin/ jetspeed-2.3/jetspeed-guide-admin/src/
jetspeed-2.3/jetspeed-guide-admin/src/site/
jetspeed-2.3/jetspeed-guide-admin/src/site/resources/ jetsp...
Added: portals/site/jetspeed/jetspeed-2.3/jetspeed-guide-dev/src/site/xdoc/guide-rest-api.xml
URL: http://svn.apache.org/viewvc/portals/site/jetspeed/jetspeed-2.3/jetspeed-guide-dev/src/site/xdoc/guide-rest-api.xml?rev=1691449&view=auto
==============================================================================
--- portals/site/jetspeed/jetspeed-2.3/jetspeed-guide-dev/src/site/xdoc/guide-rest-api.xml (added)
+++ portals/site/jetspeed/jetspeed-2.3/jetspeed-guide-dev/src/site/xdoc/guide-rest-api.xml Thu Jul 16 21:01:09 2015
@@ -0,0 +1,2719 @@
+<?xml version="1.0"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<document>
+ <properties>
+ <title>REST API</title>
+ <subtitle>Documentation for Jetspeed REST API</subtitle>
+ <authors>
+ <person name="Woonsan Ko" email="woonsan@apache.org"/>
+ </authors>
+ </properties>
+ <body>
+<section name="Jetspeed REST API Overview">
+<p>
+The Jetspeed REST API is an RESTful web services for clients (including AJAX clients) for making HTTP requests to Jetspeed services.
+</p>
+<p>
+The URLs for the Jetspeed REST API starts with the following:
+<source><![CDATA[
+http://hostname/contextname/services/
+]]></source>
+</p>
+<p>
+Typical use cases:
+</p>
+<ul>
+ <li><b>Page Customization and Portlet Placement</b> - To move, copy, add, or remove portlets on a page</li>
+ <li><b>Layout Selection</b> - change the layout (number of rows and columns, size of columns) on a page</li>
+ <li><b>Theme and Decorator Selection</b> - change the page theme and portlet decorators on a page.</li>
+ <li><b>Portlet Selectors</b> - provide a select-list of portlets to the end user</li>
+ <li><b>Security Configuration</b> - configure the security constraints or policy on a resource (page, portlet, folder, link, fragment), or portal wide</li>
+ <li><b>Menu Configuration</b> - create and edit menus for the Jetspeed Site</li>
+ <li><b>General Administration</b> - all use cases for general administration have not yet been explored.</li>
+</ul>
+<subsection name='Secured Access'>
+<p>
+All Jetspeed REST API requests run through
+a standard Jetspeed <a href='guide-pipeline.html'>Pipeline</a> request. This means that you can configure your web
+request with the usual array of Jetspeed components. The default REST services pipeline secures
+access to all requests. Each service may have its own security constraints. All
+requests made to a page will use the declarative security constraints configured for that page.
+REST request actions are enforced under edit or view mode, depending on the nature of the action.
+</p>
+</subsection>
+<subsection name='Flexible Message Media Types for Message Producers and Consumers'>
+<p>
+All Jetspeed REST API support dual Message Media Types for Message producers and consumers: 'application/json' and 'application/xml'
+with help of the underlying <a href="http://cxf.apache.org">Apache CXF</a> JAX-RS Server.
+Typically, web client applications can use JSON marshaling/unmarshaling by adding '_type=json' parameter in the request URLs.
+If the parameter is '_type=xml', then the messages are marshaled/unmarshaled as XML messages.
+If the '_type' parameter is not set by the client, the Jetspeed REST API read the 'Accept' HTTP request header to decide
+which is proper for the web client. Please see the documents of Apache CXF for details.
+</p>
+</subsection>
+<subsection name='WADL (Web Application Description Language) Support'>
+<p>
+You can retrieve <a href="http://www.w3.org/Submission/wadl/">WADL</a> description for each service simply by adding '?_wadl' query string.
+Apache CXF JAX-RS server, on which Jetspeed REST API depends, generates the WADL description for the service automatically.
+For example, you can request the following URL for 'Get Portlet Application' service of 'Portlet Registry Service'.
+<source><![CDATA[
+GET http://localhost:8080/jetspeed/services/portletregistry/application/demo/?_wadl
+]]></source>
+</p>
+</subsection>
+</section>
+
+<section name='Portlet Registry Service'>
+<p>
+The Portlet Registry Service is a HTTP request-based API, communicating over a simple REST (Representational State Transfer) protocol,
+providing information and management functionality on portlet applications and portlet definitions.
+This service is accessed over HTTP via the "/services/portletregistry" path on the portal URL:
+<source><![CDATA[
+http://hostname/contextname/services/portletregistry/
+]]></source>
+</p>
+
+<subsection name='Get Portlet Applications'>
+<table>
+ <tr>
+ <td>Entry path</td>
+ <td>/application/</td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td>Get portlet applications based on the path parameter or search query parameter.</td>
+ </tr>
+ <tr>
+ <td>HTTP Method</td>
+ <td>GET</td>
+ </tr>
+ <tr>
+ <td>Parameters</td>
+ <td>
+ <table>
+ <tr>
+ <th>Type</th>
+ <th>Name</th>
+ <th>Required</th>
+ <th>Default value</th>
+ <th>Example value</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>No</td>
+ <td></td>
+ <td>/demo/</td>
+ <td>
+ Portlet application name.
+ If the portlet application name path parameter is not provided, then
+ all portlet applications are retrieved.
+ </td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>query</td>
+ <td>No</td>
+ <td></td>
+ <td>demo</td>
+ <td>
+ Search query string to filter the results.
+ If you want to use multiple terms for the search query, you need to separate each teram by ' | '.
+ Because the URI should be encoded, the URI query value can be like 'demo%20%7C%20webcontent' when you try to
+ use query with two terms, 'demo' and 'webcontent'.
+ </td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>begin</td>
+ <td>No</td>
+ <td>-1</td>
+ <td>0</td>
+ <td>
+ The begin index of the page to be selected from the result.
+ If the value is -1, then it chooses the search result from the first index inclusively.
+ </td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>max</td>
+ <td>No</td>
+ <td>-1</td>
+ <td>10</td>
+ <td>
+ The maximum page size to be selected from the result.
+ If the value is -1, then it chooses the search result to the last index inclusively.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td>REST API examples</td>
+ <td>
+<source><![CDATA[
+GET http://localhost:8080/jetspeed/services/portletregistry/application/demo/?_type=json
+
+GET http://localhost:8080/jetspeed/services/portletregistry/application/?_type=json&query=demo&begin=0&max=10
+]]></source>
+ </td>
+ </tr>
+ <tr>
+ <td>JSON Response Example</td>
+ <td>
+<source><![CDATA[
+{
+ "beginIndex":-1,
+ "totalSize":1,
+ "applications":[
+ {
+ "name":"demo",
+ "contextPath":"/demo",
+ "applicationType":0,
+ "defaultNamespace":"",
+ "revision":2,
+ "checksum":2832348922,
+ "displayNames":[
+ {
+ "value":"Demoportlets",
+ "lang":"en",
+ "localeString":"en"
+ }
+ ],
+ "descriptions":[
+ {
+ "value":"Demo Portlets Applications",
+ "lang":"en",
+ "localeString":"en"
+ }
+ ],
+ "metadata":
+ {
+ "fields":[
+ {
+ "name":"title",
+ "value":"Title 1",
+ "localeString":"en"
+ },
+ {
+ "name":"title",
+ "value":"Eng Title",
+ "localeString":"en"
+ }
+ ]
+ },
+ "containerRuntimeOptions":[]
+ }
+ ]
+}
+]]></source>
+
+ </td>
+ </tr>
+ <tr>
+ <td>XML Response Example</td>
+ <td>
+<source><![CDATA[
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<data>
+ <beginIndex>-1</beginIndex>
+ <totalSize>1</totalSize>
+ <applications>
+ <application>
+ <applicationType>0</applicationType>
+ <checksum>2832348922</checksum>
+ <containerRuntimeOptions/>
+ <contextPath>/demo</contextPath>
+ <defaultNamespace/>
+ <descriptions>
+ <description>
+ <lang>en</lang>
+ <localeString>en</localeString>
+ <value>Demo Portlets Applications</value>
+ </description>
+ </descriptions>
+ <displayNames>
+ <displayName>
+ <lang>en</lang>
+ <localeString>en</localeString>
+ <value>Demoportlets</value>
+ </displayName>
+ </displayNames>
+ <metadata>
+ <fields>
+ <field>
+ <localeString>en</localeString>
+ <name>title</name>
+ <value>Title 1</value>
+ </field>
+ <field>
+ <localeString>en</localeString>
+ <name>title</name>
+ <value>Eng Title</value>
+ </field>
+ </fields>
+ </metadata>
+ <name>demo</name>
+ <revision>2</revision>
+ </application>
+ </applications>
+</data>
+]]></source>
+
+ </td>
+ </tr>
+</table>
+</subsection>
+
+
+<subsection name='Get Portlet Definitions'>
+<table>
+ <tr>
+ <td>Entry path</td>
+ <td>/definition/</td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td>Get portlet definitions based on the path parameter or query parameters.</td>
+ </tr>
+ <tr>
+ <td>HTTP Method</td>
+ <td>GET</td>
+ </tr>
+ <tr>
+ <td>Parameters</td>
+ <td>
+ <table>
+ <tr>
+ <th>Type</th>
+ <th>Name</th>
+ <th>Required</th>
+ <th>Default value</th>
+ <th>Example value</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>No</td>
+ <td></td>
+ <td>
+ /demo/
+ <br/>or<br/>
+ /demo/PickANumberPortlet/
+ </td>
+ <td>
+ Portlet application name (and possibly followed by portlet definition name).
+ If the portlet application name and portlet definition name path parameters are not provided, then
+ all portlet definitions are retrieved.
+ Also, if the portlet application name is provided but portlet definition name is not provided,
+ then all protlet definitions of the portlet application are retrieved.
+ </td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>query</td>
+ <td>No</td>
+ <td></td>
+ <td>admin | management</td>
+ <td>
+ Search query string to filter the results.
+ If you want to use multiple terms for the search query, you need to separate each teram by ' | '.
+ Because the URI should be encoded, the URI query value can be like 'admin%20%7C%20management' when you try to
+ use query with two terms, 'admin' and 'management'.
+ </td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>begin</td>
+ <td>No</td>
+ <td>-1</td>
+ <td>0</td>
+ <td>
+ The begin index of the page to be selected from the result.
+ If the value is -1, then it chooses the search result from the first index inclusively.
+ </td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>max</td>
+ <td>No</td>
+ <td>-1</td>
+ <td>10</td>
+ <td>
+ The maximum page size to be selected from the result.
+ If the value is -1, then it chooses the search result to the last index inclusively.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td>REST API examples</td>
+ <td>
+<source><![CDATA[
+GET http://localhost:8080/jetspeed/services/portletregistry/definition/?_type=json
+
+GET http://localhost:8080/jetspeed/services/portletregistry/definition/?_type=json&begin=0&max=5
+
+GET http://localhost:8080/jetspeed/services/portletregistry/definition/?_type=json&begin=0&max=5&query=admin%20%7C%20management
+
+GET http://localhost:8080/jetspeed/services/portletregistry/definition/demo/?_type=json
+
+GET http://localhost:8080/jetspeed/services/portletregistry/definition/demo/?_type=json&begin=0&max=5
+
+GET http://localhost:8080/jetspeed/services/portletregistry/definition/demo/PickANumberPortlet/?_type=json
+]]></source>
+ </td>
+ </tr>
+ <tr>
+ <td>JSON Response Example</td>
+ <td>
+<source><![CDATA[
+{
+ "beginIndex":-1,
+ "totalSize":1,
+ "definitions":[
+ {
+ "uniqueName":"demo::PickANumberPortlet",
+ "portletName":"PickANumberPortlet",
+ "applicationName":"demo",
+ "portletIcon":"applications-games.png",
+ "portletInfo":
+ {
+ "title":"Pick a Number",
+ "keywords":"fun,game,pick"
+ },
+ "displayNames":[
+ {
+ "value":"Pick a number game",
+ "lang":"en",
+ "localeString":"en"
+ }
+ ],
+ "descriptions":[
+ {
+ "value":"This portlet runs the popular 'Pick A Number' guessing game. The goal is to guess, in the least number of guesses, a number between [1..{Range}]",
+ "lang":"en",
+ "localeString":"en"
+ }
+ ],
+ "supports":[
+ {
+ "mimeType":"text/html",
+ "windowStates":[],
+ "portletModes":["view","help","edit","about","edit_defaults","preview","print"]
+ }
+ ],
+ "languages":[
+ {
+ "localeString":"en",
+ "title":"Pick a Number",
+ "keywords":"fun,game,pick"
+ },
+ {
+ "localeString":"fr",
+ "title":"Pick a Number",
+ "keywords":"fun,game,pick"
+ },
+ {
+ "localeString":"ja",
+ "title":"æ°å½ã¦ã²ã¼ã ",
+ "keywords":"fun,game,pick"
+ }
+ ],
+ "metadata":
+ {
+ "fields":[
+ {
+ "name":"title",
+ "value":"Pick a Number",
+ "localeString":"en"
+ },
+ {
+ "name":"creator",
+ "value":"J2 Team",
+ "localeString":"en"
+ }
+ ]
+ },
+ "containerRuntimeOptions":[],
+ "initParams":[
+ {
+ "paramName":"ViewPage",
+ "paramValue":"/WEB-INF/demo/simple/PickANumber.jsp",
+ "descriptions":[]
+ },
+ {
+ "paramName":"HelpPage",
+ "paramValue":"/WEB-INF/demo/simple/PickANumberHelp.jsp",
+ "descriptions":[]
+ },
+ {
+ "paramName":"EditPage",
+ "paramValue":"/WEB-INF/demo/simple/PickANumberEdit.jsp",
+ "descriptions":[]
+ },
+ {
+ "paramName":"portlet-icon",
+ "paramValue":"applications-games.png",
+ "descriptions":[]
+ }
+ ]
+ }
+ ]
+}
+]]></source>
+
+ </td>
+ </tr>
+ <tr>
+ <td>XML Response Example</td>
+ <td>
+<source><![CDATA[
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<data>
+ <beginIndex>-1</beginIndex>
+ <totalSize>1</totalSize>
+ <definitions>
+ <definition>
+ <applicationName>demo</applicationName>
+ <containerRuntimeOptions/>
+ <descriptions>
+ <description>
+ <lang>en</lang>
+ <localeString>en</localeString>
+ <value>
+ This portlet runs the popular 'Pick A Number' guessing game. The goal is to guess, in the least number of guesses, a number between [1..{Range}]
+ </value>
+ </description>
+ </descriptions>
+ <displayNames>
+ <displayName>
+ <lang>en</lang>
+ <localeString>en</localeString>
+ <value>Pick a number game</value>
+ </displayName>
+ </displayNames>
+ <initParams>
+ <initParam>
+ <descriptions/>
+ <paramName>ViewPage</paramName>
+ <paramValue>/WEB-INF/demo/simple/PickANumber.jsp</paramValue>
+ </initParam>
+ <initParam>
+ <descriptions/>
+ <paramName>HelpPage</paramName>
+ <paramValue>/WEB-INF/demo/simple/PickANumberHelp.jsp</paramValue>
+ </initParam>
+ <initParam>
+ <descriptions/>
+ <paramName>EditPage</paramName>
+ <paramValue>/WEB-INF/demo/simple/PickANumberEdit.jsp</paramValue>
+ </initParam>
+ <initParam>
+ <descriptions/>
+ <paramName>portlet-icon</paramName>
+ <paramValue>applications-games.png</paramValue>
+ </initParam>
+ </initParams>
+ <languages>
+ <language>
+ <keywords>fun,game,pick</keywords>
+ <title>Pick a Number</title>
+ <localeString>en</localeString>
+ </language>
+ <language>
+ <keywords>fun,game,pick</keywords>
+ <title>Pick a Number</title>
+ <localeString>fr</localeString>
+ </language>
+ <language>
+ <keywords>fun,game,pick</keywords>
+ <title>æ°å½ã¦ã²ã¼ã </title>
+ <localeString>ja</localeString>
+ </language>
+ </languages>
+ <metadata>
+ <fields>
+ <field>
+ <localeString>en</localeString>
+ <name>title</name>
+ <value>Pick a Number</value>
+ </field>
+ <field>
+ <localeString>en</localeString>
+ <name>creator</name>
+ <value>J2 Team</value>
+ </field>
+ </fields>
+ </metadata>
+ <portletIcon>applications-games.png</portletIcon>
+ <portletInfo>
+ <keywords>fun,game,pick</keywords>
+ <title>Pick a Number</title>
+ </portletInfo>
+ <portletName>PickANumberPortlet</portletName>
+ <supports>
+ <support>
+ <mimeType>text/html</mimeType>
+ <portletModes>
+ <portletMode>view</portletMode>
+ <portletMode>help</portletMode>
+ <portletMode>edit</portletMode>
+ <portletMode>about</portletMode>
+ <portletMode>edit_defaults</portletMode>
+ <portletMode>preview</portletMode>
+ <portletMode>print</portletMode>
+ </portletModes>
+ <windowStates/>
+ </support>
+ </supports>
+ <uniqueName>demo::PickANumberPortlet</uniqueName>
+ </definition>
+ </definitions>
+</data>
+]]></source>
+ </td>
+ </tr>
+</table>
+</subsection>
+
+
+</section>
+
+<section name='Page Layout Service'>
+<p>
+The Page Layout Service is a HTTP request-based API, communicating over a simple REST (Representational State Transfer) protocol,
+providing information and management functionality on the layout of the content page and its content fragments.
+This service is accessed over HTTP via the "/services/pagelayout" path on the portal URL:
+<source><![CDATA[
+http://hostname/contextname/services/pagelayout/
+]]></source>
+</p>
+
+<subsection name='Get Content Page'>
+<table>
+ <tr>
+ <td>Entry path</td>
+ <td>/page/</td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td>Get content page of the current request context.</td>
+ </tr>
+ <tr>
+ <td>HTTP Method</td>
+ <td>GET</td>
+ </tr>
+ <tr>
+ <td>Parameters</td>
+ <td>
+ <table>
+ <tr>
+ <th>Type</th>
+ <th>Name</th>
+ <th>Required</th>
+ <th>Default value</th>
+ <th>Example value</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>HEADER</td>
+ <td>X-Portal-Path</td>
+ <td>No</td>
+ <td>/</td>
+ <td>/default-page.psml</td>
+ <td>
+ The current portal page path.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td>HTTP Errors</td>
+ <td>HTTP Error 403 Forbidden when having no VIEW access on the current content page.</td>
+ </tr>
+ <tr>
+ <td>REST API examples</td>
+ <td>
+<source><![CDATA[
+GET http://localhost:8080/jetspeed/services/pagelayout/page/?_type=json
+
+With the following request header:
+ X-Portal-Path: /jetspeed.psml
+]]></source>
+ </td>
+ </tr>
+ <tr>
+ <td>JSON Response Example</td>
+ <td>
+<source><![CDATA[
+{
+ "name":"default-page.psml",
+ "id":"/default-page.psml",
+ "path":"/default-page.psml",
+ "url":"/default-page.psml",
+ "title":"Dashboard",
+ "shortTitle":"Dashboard",
+ "fragment":
+ {
+ "name":"jetspeed-layouts::VelocityThreeColumns",
+ "properties":{"sizes":"15%,70%,15%"},
+ "id":"template-top2",
+ "type":"layout",
+ "locked":true,
+ "fragments":[
+ {
+ "name":"j2-admin::SpaceNavigator",
+ "properties":{"decorator":"clear","y":"80.0","x":"12.0","jsdesktop":"detached=true"},
+ "id":"template-top2.jsSpaceNavigator",
+ "type":"portlet",
+ "locked":true,
+ "decorator":"clear"
+ },
+ {
+ "name":"j2-admin::PageNavigator",
+ "properties":{"z":"201.0","row":"0","width":"40.0","height":"388.0","column":"0","y":"104.0","x":"1.0"},
+ "id":"template-top2.jsPageNavigator",
+ "type":"portlet",
+ "locked":true
+ },
+ {
+ "name":"jetspeed-layouts::VelocityOneColumn",
+ "properties":{"row":"0","column":"1"},
+ "id":"template-top2.page-template.dashboard-1000",
+ "type":"layout",
+ "locked":false,
+ "fragments":[
+ {
+ "name":"j2-admin::LoginPortlet",
+ "properties":{"row":"0","column":"0"},
+ "id":"template-top2.page-template.dashboard-1000.dashboard-1003",
+ "type":"portlet",
+ "locked":false
+ },
+ {
+ "name":"j2-admin::LocaleSelector",
+ "properties":{"row":"1","column":"0"},
+ "id":"template-top2.page-template.dashboard-1000.dashboard-1007",
+ "type":"portlet",
+ "locked":false
+ }
+ ]
+ },
+ {
+ "name":"j2-admin::JetspeedToolbox",
+ "properties":{"y":"10.0","x":"440.0","jsdesktop":"detached=true"},
+ "id":"template-top2.jsToolbox",
+ "type":"portlet",
+ "locked":true
+ }
+ ]
+ }
+ }
+]]></source>
+
+ </td>
+ </tr>
+ <tr>
+ <td>XML Response Example</td>
+ <td>
+<source><![CDATA[
+<page>
+ <id>/default-page.psml</id>
+ <name>default-page.psml</name>
+ <path>/default-page.psml</path>
+ <shortTitle>Dashboard</shortTitle>
+ <title>Dashboard</title>
+ <url>/default-page.psml</url>
+ <fragment>
+ <id>template-top2</id>
+ <locked>true</locked>
+ <name>jetspeed-layouts::VelocityThreeColumns</name>
+ <type>layout</type>
+ <properties>
+ <entry>
+ <key>sizes</key>
+ <value>15%,70%,15%</value>
+ </entry>
+ </properties>
+ <fragments>
+ <fragment>
+ <decorator>clear</decorator>
+ <id>template-top2.jsSpaceNavigator</id>
+ <locked>true</locked>
+ <name>j2-admin::SpaceNavigator</name>
+ <type>portlet</type>
+ <properties>
+ <entry>
+ <key>decorator</key>
+ <value>clear</value>
+ </entry>
+ <entry>
+ <key>y</key>
+ <value>80.0</value>
+ </entry>
+ <entry>
+ <key>x</key>
+ <value>12.0</value>
+ </entry>
+ <entry>
+ <key>jsdesktop</key>
+ <value>detached=true</value>
+ </entry>
+ </properties>
+ </fragment>
+ <fragment>
+ <id>template-top2.jsPageNavigator</id>
+ <locked>true</locked>
+ <name>j2-admin::PageNavigator</name>
+ <type>portlet</type>
+ <properties>
+ <entry>
+ <key>z</key>
+ <value>201.0</value>
+ </entry>
+ <entry>
+ <key>row</key>
+ <value>0</value>
+ </entry>
+ <entry>
+ <key>width</key>
+ <value>40.0</value>
+ </entry>
+ <entry>
+ <key>height</key>
+ <value>388.0</value>
+ </entry>
+ <entry>
+ <key>column</key>
+ <value>0</value>
+ </entry>
+ <entry>
+ <key>y</key>
+ <value>104.0</value>
+ </entry>
+ <entry>
+ <key>x</key>
+ <value>1.0</value>
+ </entry>
+ </properties>
+ </fragment>
+ <fragment>
+ <id>template-top2.page-template.dashboard-1000</id>
+ <locked>false</locked>
+ <name>jetspeed-layouts::VelocityOneColumn</name>
+ <type>layout</type>
+ <properties>
+ <entry>
+ <key>row</key>
+ <value>0</value>
+ </entry>
+ <entry>
+ <key>column</key>
+ <value>1</value>
+ </entry>
+ </properties>
+ <fragments>
+ <fragment>
+ <id>template-top2.page-template.dashboard-1000.dashboard-1003</id>
+ <locked>false</locked>
+ <name>j2-admin::LoginPortlet</name>
+ <type>portlet</type>
+ <properties>
+ <entry>
+ <key>row</key>
+ <value>0</value>
+ </entry>
+ <entry>
+ <key>column</key>
+ <value>0</value>
+ </entry>
+ </properties>
+ </fragment>
+ <fragment>
+ <id>template-top2.page-template.dashboard-1000.dashboard-1007</id>
+ <locked>false</locked>
+ <name>j2-admin::LocaleSelector</name>
+ <type>portlet</type>
+ <properties>
+ <entry>
+ <key>row</key>
+ <value>1</value>
+ </entry>
+ <entry>
+ <key>column</key>
+ <value>0</value>
+ </entry>
+ </properties>
+ </fragment>
+ </fragments>
+ </fragment>
+ <fragment>
+ <id>template-top2.jsToolbox</id>
+ <locked>true</locked>
+ <name>j2-admin::JetspeedToolbox</name>
+ <type>portlet</type>
+ <properties>
+ <entry>
+ <key>y</key>
+ <value>10.0</value>
+ </entry>
+ <entry>
+ <key>x</key>
+ <value>440.0</value>
+ </entry>
+ <entry>
+ <key>jsdesktop</key>
+ <value>detached=true</value>
+ </entry>
+ </properties>
+ </fragment>
+ </fragments>
+ </fragment>
+</page>
+]]></source>
+ </td>
+ </tr>
+</table>
+</subsection>
+
+
+<subsection name='Get Content Fragment'>
+<table>
+ <tr>
+ <td>Entry path</td>
+ <td>/fragment/</td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td>Get content fragment based on the fragment ID path parameter.</td>
+ </tr>
+ <tr>
+ <td>HTTP Method</td>
+ <td>GET</td>
+ </tr>
+ <tr>
+ <td>Parameters</td>
+ <td>
+ <table>
+ <tr>
+ <th>Type</th>
+ <th>Name</th>
+ <th>Required</th>
+ <th>Default value</th>
+ <th>Example value</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>HEADER</td>
+ <td>X-Portal-Path</td>
+ <td>No</td>
+ <td>/</td>
+ <td>/default-page.psml</td>
+ <td>
+ The current portal page path.
+ </td>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>Yes</td>
+ <td></td>
+ <td>/template-top2.page-template.dashboard-1000.dashboard-1003/</td>
+ <td>
+ The ID of the fragment to retrieve.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td>HTTP Errors</td>
+ <td>HTTP Error 403 Forbidden when having no VIEW access on the current content page.</td>
+ </tr>
+ <tr>
+ <td>REST API examples</td>
+ <td>
+<source><![CDATA[
+GET http://localhost:8080/jetspeed/services/pagelayout/fragment/template-top2.page-template.dashboard-1000.dashboard-1003/?_type=json
+
+With the following request header:
+ X-Portal-Path: /jetspeed.psml
+]]></source>
+ </td>
+ </tr>
+ <tr>
+ <td>JSON Response Example</td>
+ <td>
+<source><![CDATA[
+{
+ "name":"j2-admin::LoginPortlet",
+ "id":"template-top2.page-template.dashboard-1000.dashboard-1003",
+ "type":"portlet",
+ "locked":false,
+ "properties":{"row":"0","column":"2"}
+}
+]]></source>
+
+ </td>
+ </tr>
+ <tr>
+ <td>XML Response Example</td>
+ <td>
+<source><![CDATA[
+<fragment>
+ <id>template-top2.page-template.dashboard-1000.dashboard-1003</id>
+ <locked>false</locked>
+ <name>j2-admin::LoginPortlet</name>
+ <type>portlet</type>
+ <properties>
+ <entry>
+ <key>row</key>
+ <value>0</value>
+ </entry>
+ <entry>
+ <key>column</key>
+ <value>2</value>
+ </entry>
+ </properties>
+</fragment>
+]]></source>
+ </td>
+ </tr>
+</table>
+</subsection>
+
+<subsection name='Add Content Fragment'>
+<table>
+ <tr>
+ <td>Entry path</td>
+ <td>/fragment/</td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td>Add a content fragment to the content page based on the fragment type path parameter and the portlet name path parameter.</td>
+ </tr>
+ <tr>
+ <td>HTTP Method</td>
+ <td>POST</td>
+ </tr>
+ <tr>
+ <td>Parameters</td>
+ <td>
+ <table>
+ <tr>
+ <th>Type</th>
+ <th>Name</th>
+ <th>Required</th>
+ <th>Default value</th>
+ <th>Example value</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>HEADER</td>
+ <td>X-Portal-Path</td>
+ <td>No</td>
+ <td>/</td>
+ <td>/default-page.psml</td>
+ <td>
+ The current portal page path.
+ </td>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>Yes</td>
+ <td></td>
+ <td>/portlet/demo::PickANumberPortlet/</td>
+ <td>
+ The fragment type and the portlet name to add.
+ The first path part can be either 'portlet' or 'layout',
+ and the second path part must be the portlet name.
+ </td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>row</td>
+ <td>No</td>
+ <td>-1</td>
+ <td>0</td>
+ <td>
+ The row position of the added fragment.
+ </td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>col</td>
+ <td>No</td>
+ <td>-1</td>
+ <td>0</td>
+ <td>
+ The column position of the added fragment.
+ </td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>minrowscol</td>
+ <td>No</td>
+ <td>false</td>
+ <td>true</td>
+ <td>
+ The flag to use the least used column index to add the fragment.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td>HTTP Errors</td>
+ <td>HTTP Error 403 Forbidden when having no EDIT access on the current content page.</td>
+ </tr>
+ <tr>
+ <td>REST API examples</td>
+ <td>
+<source><![CDATA[
+POST http://localhost:8080/jetspeed/services/pagelayout/fragment/portlet/demo::PickANumberPortlet/?_type=json
+
+With the following request header:
+ X-Portal-Path: /default-page.psml
+]]></source>
+ </td>
+ </tr>
+ <tr>
+ <td>JSON Response Example</td>
+ <td>
+<source><![CDATA[
+{
+ "name":"demo::PickANumberPortlet",
+ "id":"template-top2.page-template.dashboard-1000.P-125fec68f7c-10000",
+ "type":"portlet",
+ "locked":false,
+ "properties":{"row":"2","column":"2"}
+}
+]]></source>
+
+ </td>
+ </tr>
+ <tr>
+ <td>XML Response Example</td>
+ <td>
+<source><![CDATA[
+<fragment>
+ <id>template-top2.page-template.dashboard-1000.P-125fec68f7c-10000</id>
+ <locked>false</locked>
+ <name>demo::PickANumberPortlet</name>
+ <type>portlet</type>
+ <properties>
+ <entry>
+ <key>row</key>
+ <value>2</value>
+ </entry>
+ <entry>
+ <key>column</key>
+ <value>2</value>
+ </entry>
+ </properties>
+</fragment>
+]]></source>
+ </td>
+ </tr>
+</table>
+</subsection>
+
+<subsection name='Delete Content Fragment'>
+<table>
+ <tr>
+ <td>Entry path</td>
+ <td>/fragment/</td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td>Deletes the content fragment of the content page based on the fragment ID path parameter.</td>
+ </tr>
+ <tr>
+ <td>HTTP Method</td>
+ <td>DELETE</td>
+ </tr>
+ <tr>
+ <td>Parameters</td>
+ <td>
+ <table>
+ <tr>
+ <th>Type</th>
+ <th>Name</th>
+ <th>Required</th>
+ <th>Default value</th>
+ <th>Example value</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>HEADER</td>
+ <td>X-Portal-Path</td>
+ <td>No</td>
+ <td>/</td>
+ <td>/default-page.psml</td>
+ <td>
+ The current portal page path.
+ </td>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>Yes</td>
+ <td></td>
+ <td>/template-top2.page-template.dashboard-1000.dashboard-1003/</td>
+ <td>
+ The ID of the fragment to delete.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td>HTTP Errors</td>
+ <td>HTTP Error 403 Forbidden when having no EDIT access on the current content page.</td>
+ </tr>
+ <tr>
+ <td>REST API examples</td>
+ <td>
+<source><![CDATA[
+DELETE http://localhost:8080/jetspeed/services/pagelayout/fragment/template-top2.page-template.dashboard-1000.P-125fac24b80-10000/?_type=json
+
+With the following request header:
+ X-Portal-Path: /default-page.psml
+]]></source>
+ </td>
+ </tr>
+ <tr>
+ <td>JSON Response Example</td>
+ <td>
+<source><![CDATA[
+{
+ "name":"demo::PickANumberPortlet",
+ "id":"template-top2.page-template.dashboard-1000.P-125fec68f7c-10000",
+ "type":"portlet",
+ "locked":false,
+ "properties":{"row":"2","column":"2"}
+}
+]]></source>
+
+ </td>
+ </tr>
+ <tr>
+ <td>XML Response Example</td>
+ <td>
+<source><![CDATA[
+<fragment>
+ <id>template-top2.page-template.dashboard-1000.P-125fec68f7c-10000</id>
+ <locked>false</locked>
+ <name>demo::PickANumberPortlet</name>
+ <type>portlet</type>
+ <properties>
+ <entry>
+ <key>row</key>
+ <value>2</value>
+ </entry>
+ <entry>
+ <key>column</key>
+ <value>2</value>
+ </entry>
+ </properties>
+</fragment>
+]]></source>
+ </td>
+ </tr>
+</table>
+</subsection>
+
+<subsection name='Move Content Fragment'>
+<table>
+ <tr>
+ <td>Entry path</td>
+ <td>
+ /fragment/{id}/pos/
+ <br/><br/>
+ <em>Note: The '{id}' must be replaced by the fragment ID path parameter.</em>
+ </td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td>Moves the content fragment based on the query parameters.</td>
+ </tr>
+ <tr>
+ <td>HTTP Method</td>
+ <td>PUT</td>
+ </tr>
+ <tr>
+ <td>Parameters</td>
+ <td>
+ <table>
+ <tr>
+ <th>Type</th>
+ <th>Name</th>
+ <th>Required</th>
+ <th>Default value</th>
+ <th>Example value</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>HEADER</td>
+ <td>X-Portal-Path</td>
+ <td>No</td>
+ <td>/</td>
+ <td>/default-page.psml</td>
+ <td>
+ The current portal page path.
+ </td>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>Yes</td>
+ <td></td>
+ <td>/template-top2.page-template.dashboard-1000.dashboard-1003/</td>
+ <td>
+ The ID of the fragment to move.
+ </td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>layout</td>
+ <td>No</td>
+ <td></td>
+ <td>template-top2.page-template.dashboard-1000</td>
+ <td>
+ The ID of the target layout fragment to which the content fragment should be moved.
+ If this is not provided, the current parent layout fragment is used.
+ </td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>dir</td>
+ <td>No</td>
+ <td></td>
+ <td>down</td>
+ <td>The moving direction. This can be either 'up', 'down', 'left' or 'right'.</td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>row</td>
+ <td>No</td>
+ <td>-1</td>
+ <td>0</td>
+ <td>The row position of the content fragment to move.</td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>col</td>
+ <td>No</td>
+ <td>-1</td>
+ <td>0</td>
+ <td>The column position of the content fragment to move.</td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>x</td>
+ <td>No</td>
+ <td>-1</td>
+ <td>20</td>
+ <td>The absolute left position of the content fragment to move.</td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>y</td>
+ <td>No</td>
+ <td>-1</td>
+ <td>20</td>
+ <td>The absolute top position of the content fragment to move.</td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>z</td>
+ <td>No</td>
+ <td>-1</td>
+ <td>1000</td>
+ <td>The Z-INDEX of the content fragment to move.</td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>w</td>
+ <td>No</td>
+ <td>-1</td>
+ <td>400</td>
+ <td>The width of the content fragment to move.</td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>h</td>
+ <td>No</td>
+ <td>-1</td>
+ <td>300</td>
+ <td>The height of the content fragment to move.</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td>HTTP Errors</td>
+ <td>HTTP Error 403 Forbidden when having no EDIT access on the current content page.</td>
+ </tr>
+ <tr>
+ <td>REST API examples</td>
+ <td>
+<source><![CDATA[
+PUT http://localhost:8080/jetspeed/services/pagelayout/fragment/template-top2.page-template.dashboard-1000.dashboard-1007/pos/?_type=json&col=0&row=0
+
+With the following request header:
+ X-Portal-Path: /default-page.psml
+]]></source>
+ </td>
+ </tr>
+ <tr>
+ <td>JSON Response Example</td>
+ <td>
+<source><![CDATA[
+{
+ "name":"j2-admin::LocaleSelector",
+ "id":"template-top2.page-template.dashboard-1000.dashboard-1007",
+ "type":"portlet",
+ "locked":false,
+ "properties":{"row":"1","column":"2"}
+}
+]]></source>
+
+ </td>
+ </tr>
+ <tr>
+ <td>XML Response Example</td>
+ <td>
+<source><![CDATA[
+<fragment>
+ <id>template-top2.page-template.dashboard-1000.dashboard-1007</id>
+ <locked>false</locked>
+ <name>j2-admin::LocaleSelector</name>
+ <type>portlet</type>
+ <properties>
+ <entry>
+ <key>row</key>
+ <value>1</value>
+ </entry>
+ <entry>
+ <key>column</key>
+ <value>2</value>
+ </entry>
+ </properties>
+</fragment>
+]]></source>
+ </td>
+ </tr>
+</table>
+</subsection>
+
+<subsection name='Change the portlet mode and window state on Content Fragment'>
+<table>
+ <tr>
+ <td>Entry path</td>
+ <td>
+ /fragment/{id}/mod/
+ <br/><br/>
+ <em>Note: The '{id}' must be replaced by the fragment ID path parameter.</em>
+ </td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>HTTP Method</td>
+ <td>PUT</td>
+ </tr>
+ <tr>
+ <td>Parameters</td>
+ <td>
+ <table>
+ <tr>
+ <th>Type</th>
+ <th>Name</th>
+ <th>Required</th>
+ <th>Default value</th>
+ <th>Example value</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>HEADER</td>
+ <td>X-Portal-Path</td>
+ <td>No</td>
+ <td>/</td>
+ <td>/default-page.psml</td>
+ <td>
+ The current portal page path.
+ </td>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>Yes</td>
+ <td></td>
+ <td>/template-top2.page-template.dashboard-1000.dashboard-1003/</td>
+ <td>
+ The ID of the fragment to modify.
+ </td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>mode</td>
+ <td>Yes</td>
+ <td></td>
+ <td>View</td>
+ <td>The portlet mode of the content fragment.</td>
+ </tr>
+ <tr>
+ <td>QUERY</td>
+ <td>state</td>
+ <td>Yes</td>
+ <td></td>
+ <td>Normal</td>
+ <td>The window state of the content fragment.</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td>HTTP Errors</td>
+ <td>HTTP Error 403 Forbidden when having no EDIT access on the current content page.</td>
+ </tr>
+ <tr>
+ <td>REST API examples</td>
+ <td>
+<source><![CDATA[
+PUT http://localhost:8080/jetspeed/services/pagelayout/fragment/template-top2.page-template.dashboard-1000.dashboard-1007/mode/?_type=json&mode=View&state=Normal
+
+With the following request header:
+ X-Portal-Path: /default-page.psml
+]]></source>
+ </td>
+ </tr>
+ <tr>
+ <td>JSON Response Example</td>
+ <td>
+<source><![CDATA[
+{
+ "name":"j2-admin::LocaleSelector",
+ "id":"template-top2.page-template.dashboard-1000.dashboard-1007",
+ "type":"portlet",
+ "mode":"View",
+ "state":"Normal",
+ "locked":false,
+ "properties":{"row":"1","column":"2"}
+}
+]]></source>
+
+ </td>
+ </tr>
+ <tr>
+ <td>XML Response Example</td>
+ <td>
+<source><![CDATA[
+<fragment>
+ <id>template-top2.page-template.dashboard-1000.dashboard-1007</id>
+ <locked>false</locked>
+ <name>j2-admin::LocaleSelector</name>
+ <type>portlet</type>
+ <mode>View</mode>
+ <state>Normal</state>
+ <properties>
+ <entry>
+ <key>row</key>
+ <value>1</value>
+ </entry>
+ <entry>
+ <key>column</key>
+ <value>2</value>
+ </entry>
+ </properties>
+</fragment>
+]]></source>
+ </td>
+ </tr>
+</table>
+</subsection>
+
+<subsection name='Get Decoration of Content Fragment'>
+<table>
+ <tr>
+ <td>Entry path</td>
+ <td>/decoration/fragment/</td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td>Retrieves decoration of the content fragment based on the fragment ID path parameter.</td>
+ </tr>
+ <tr>
+ <td>HTTP Method</td>
+ <td>GET</td>
+ </tr>
+ <tr>
+ <td>Parameters</td>
+ <td>
+ <table>
+ <tr>
+ <th>Type</th>
+ <th>Name</th>
+ <th>Required</th>
+ <th>Default value</th>
+ <th>Example value</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>HEADER</td>
+ <td>X-Portal-Path</td>
+ <td>No</td>
+ <td>/</td>
+ <td>/default-page.psml</td>
+ <td>
+ The current portal page path.
+ </td>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>Yes</td>
+ <td></td>
+ <td>/template-top2.page-template.dashboard-1000.dashboard-1003/</td>
+ <td>
+ The ID of the fragment to retrieve.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td>HTTP Errors</td>
+ <td>HTTP Error 403 Forbidden when having no VIEW access on the current content page.</td>
+ </tr>
+ <tr>
+ <td>REST API examples</td>
+ <td>
+<source><![CDATA[
+GET http://localhost:8080/jetspeed/services/pagelayout/decoration/fragment/template-top2.page-template.dashboard-1000.dashboard-1007/pos/?_type=json
+
+With the following request header:
+ X-Portal-Path: /default-page.psml
+]]></source>
+ </td>
+ </tr>
+ <tr>
+ <td>JSON Response Example</td>
+ <td>
+<source><![CDATA[
+{
+ "name":"jetspeed",
+ "basePath":"/decorations/portlet/jetspeed",
+ "actionsOption":"SHOW",
+ "styleSheet":"decorations/portlet/jetspeed/css/styles.css",
+ "baseCSSClass":"jetspeed",
+ "decoratorActions":[
+ {
+ "name":"Configure",
+ "link":"decorations/portlet/jetspeed/images/config.gif",
+ "action":"http://localhost:8080/jetspeed/services/_ns:YXRlbXBsYXRlLXRvcDIucGFnZS10ZW1wbGF0ZS5kYXNoYm9hcmQtMTAwMC5kYXNoYm9hcmQtMTAwM3xjNA__/",
+ "actionType":"mode",
+ "actionName":"config",
+ "alt":"Configure"
+ },
+ {
+ "name":"Minimize",
+ "link":"decorations/portlet/jetspeed/images/minimized.gif",
+ "action":"http://localhost:8080/jetspeed/services/_ns:YXRlbXBsYXRlLXRvcDIucGFnZS10ZW1wbGF0ZS5kYXNoYm9hcmQtMTAwMC5kYXNoYm9hcmQtMTAwM3xkMQ__/",
+ "actionType":"state",
+ "actionName":"minimized",
+ "alt":"Minimize"
+ },
+ {
+ "name":"Maximize",
+ "link":"decorations/portlet/jetspeed/images/maximized.gif",
+ "action":"http://localhost:8080/jetspeed/services/_ns:YXRlbXBsYXRlLXRvcDIucGFnZS10ZW1wbGF0ZS5kYXNoYm9hcmQtMTAwMC5kYXNoYm9hcmQtMTAwM3xkMg__/",
+ "actionType":"state",
+ "actionName":"maximized",
+ "alt":"Maximize"
+ }
+ ]
+}
+]]></source>
+
+ </td>
+ </tr>
+ <tr>
+ <td>XML Response Example</td>
+ <td>
+<source><![CDATA[
+<decoration>
+ <name>jetspeed</name>
+ <actionsOption>SHOW</actionsOption>
+ <baseCSSClass>jetspeed</baseCSSClass>
+ <basePath>/decorations/portlet/jetspeed</basePath>
+ <styleSheet>decorations/portlet/jetspeed/css/styles.css</styleSheet>
+ <decoratorActions>
+ <decoratorAction>
+ <action>http://localhost:8080/jetspeed/services/_ns:YXRlbXBsYXRlLXRvcDIucGFnZS10ZW1wbGF0ZS5kYXNoYm9hcmQtMTAwMC5kYXNoYm9hcmQtMTAwM3xjNA__/</action>
+ <actionName>config</actionName>
+ <actionType>mode</actionType>
+ <alt>Configure</alt>
+ <link>decorations/portlet/jetspeed/images/config.gif</link>
+ <name>Configure</name>
+ </decoratorAction>
+ <decoratorAction>
+ <action>http://localhost:8080/jetspeed/services/_ns:YXRlbXBsYXRlLXRvcDIucGFnZS10ZW1wbGF0ZS5kYXNoYm9hcmQtMTAwMC5kYXNoYm9hcmQtMTAwM3xkMQ__/</action>
+ <actionName>minimized</actionName>
+ <actionType>state</actionType>
+ <alt>Minimize</alt>
+ <link>decorations/portlet/jetspeed/images/minimized.gif</link>
+ <name>Minimize</name>
+ </decoratorAction>
+ <decoratorAction>
+ <action>http://localhost:8080/jetspeed/services/_ns:YXRlbXBsYXRlLXRvcDIucGFnZS10ZW1wbGF0ZS5kYXNoYm9hcmQtMTAwMC5kYXNoYm9hcmQtMTAwM3xkMg__/</action>
+ <actionName>maximized</actionName>
+ <actionType>state</actionType>
+ <alt>Maximize</alt>
+ <link>decorations/portlet/jetspeed/images/maximized.gif</link>
+ <name>Maximize</name>
+ </decoratorAction>
+ </decoratorActions>
+</decoration>
+]]></source>
+ </td>
+ </tr>
+</table>
+</subsection>
+
+</section>
+
+<section name='Page Management Service'>
+<p>
+The Page Management Service is a HTTP request-based API, communicating over a simple REST (Representational State Transfer) protocol,
+providing information and management functionality on portal page nodes such as pages, folders and links.
+This service is accessed over HTTP via the "/services/pagemanagement" path on the portal URL:
+<source><![CDATA[
+http://hostname/contextname/services/pagemanagement/
+]]></source>
+</p>
+<p>
+ <em>
+ Node: All operations of this service are allowed only to those who has the right to edit the target node.
+ Those who has the right to view only will get the HTTP Error 403 Forbidden.
+ </em>
+</p>
+
+<subsection name='Get Node'>
+<table>
+ <tr>
+ <td>Entry path</td>
+ <td>/</td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td>Get node based on the type parameter and the path parameter.</td>
+ </tr>
+ <tr>
+ <td>HTTP Method</td>
+ <td>GET</td>
+ </tr>
+ <tr>
+ <td>Parameters</td>
+ <td>
+ <table>
+ <tr>
+ <th>Type</th>
+ <th>Name</th>
+ <th>Required</th>
+ <th>Default value</th>
+ <th>Example value</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>Yes</td>
+ <td></td>
+ <td>
+ One of the following:
+ <br/>
+ <ul>
+ <li>/.psml</li>
+ <li>/folder</li>
+ <li>/.link</li>
+ </ul>
+ </td>
+ <td>
+ The first path parameter is for the node type:
+ <br/>
+ <ul>
+ <li>.psml : Page node</li>
+ <li>folder : Folder node</li>
+ <li>.link : Link node</li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>Yes</td>
+ <td></td>
+ <td>/default-page.psml</td>
+ <td>
+ The node path to retrieve.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td>REST API examples</td>
+ <td>
+<source><![CDATA[
+GET http://localhost:8080/jetspeed/services/pagemanagement/.psml/default-page.psml?_type=json
+]]></source>
+ </td>
+ </tr>
+ <tr>
+ <td>JSON Response Example</td>
+ <td>
+<source><![CDATA[
+{
+ "id":"/default-page.psml",
+ "name":"default-page.psml",
+ "type":".psml",
+ "path":"/default-page.psml",
+ "title":"Welcome to Jetspeed",
+ "shortTitle":"Welcome to Jetspeed",
+ "hidden":false,
+ "url":"/default-page.psml",
+ "constraintsEnabled":true,
+ "permissionsEnabled":false,
+ "effectiveDefaultLayoutDecorator":"jetspeed",
+ "effectiveDefaultPortletDecorator":"jetspeed",
+ "dirty":false,
+ "metadata":
+ {
+ "fields":[
+ {
+ "name":"title",
+ "value":"Welcome to Jetspeed",
+ "localeString":"en"
+ },
+ {
+ "name":"title",
+ "value":"Bienvenido a Jetspeed 2",
+ "localeString":"es"
+ }
+ ]
+ }
+}
+]]></source>
+
+ </td>
+ </tr>
+ <tr>
+ <td>XML Response Example</td>
+ <td>
+<source><![CDATA[
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<page>
+ <id>/default-page.psml</id>
+ <name>default-page.psml</name>
+ <type>.psml</type>
+ <path>/default-page.psml</path>
+ <title>Welcome to Jetspeed</title>
+ <shortTitle>Welcome to Jetspeed</shortTitle>
+ <hidden>false</hidden>
+ <url>/default-page.psml</url>
+ <constraintsEnabled>true</constraintsEnabled>
+ <permissionsEnabled>false</permissionsEnabled>
+ <effectiveDefaultLayoutDecorator>jetspeed</effectiveDefaultLayoutDecorator>
+ <effectiveDefaultPortletDecorator>jetspeed</effectiveDefaultPortletDecorator>
+ <dirty>false</dirty>
+ <metadata>
+ <fields>
+ <field>
+ <localeString>fr</localeString>
+ <name>title</name>
+ <value>Bienvenue a Jetspeed</value>
+ </field>
+ <field>
+ <localeString>es</localeString>
+ <name>title</name>
+ <value>Bienvenido a Jetspeed 2</value>
+ </field>
+ </fields>
+ </metadata>
+</page>
+]]></source>
+
+ </td>
+ </tr>
+</table>
+</subsection>
+
+<subsection name='Delete Node'>
+<table>
+ <tr>
+ <td>Entry path</td>
+ <td>/</td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td>Delete node based on the type parameter and the path parameter.</td>
+ </tr>
+ <tr>
+ <td>HTTP Method</td>
+ <td>GET</td>
+ </tr>
+ <tr>
+ <td>Parameters</td>
+ <td>
+ <table>
+ <tr>
+ <th>Type</th>
+ <th>Name</th>
+ <th>Required</th>
+ <th>Default value</th>
+ <th>Example value</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>Yes</td>
+ <td></td>
+ <td>
+ One of the following:
+ <br/>
+ <ul>
+ <li>/.psml</li>
+ <li>/folder</li>
+ <li>/.link</li>
+ </ul>
+ </td>
+ <td>
+ The first path parameter is for the node type:
+ <br/>
+ <ul>
+ <li>.psml : Page node</li>
+ <li>folder : Folder node</li>
+ <li>.link : Link node</li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>Yes</td>
+ <td></td>
+ <td>/default-page.psml</td>
+ <td>
+ The node path to delete.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td>REST API examples</td>
+ <td>
+<source><![CDATA[
+DELETE http://localhost:8080/jetspeed/services/pagemanagement/.psml/default-page.psml?_type=json
+]]></source>
+ </td>
+ </tr>
+ <tr>
+ <td>JSON Response Example</td>
+ <td>
+<source><![CDATA[
+{
+ "id":"/default-page.psml",
+ "name":"default-page.psml",
+ "type":".psml",
+ "path":"/default-page.psml",
+ "title":"Welcome to Jetspeed",
+ "shortTitle":"Welcome to Jetspeed",
+ "hidden":false,
+ "url":"/default-page.psml",
+ "constraintsEnabled":true,
+ "permissionsEnabled":false,
+ "effectiveDefaultLayoutDecorator":"jetspeed",
+ "effectiveDefaultPortletDecorator":"jetspeed",
+ "dirty":false,
+ "metadata":
+ {
+ "fields":[
+ {
+ "name":"title",
+ "value":"Welcome to Jetspeed",
+ "localeString":"en"
+ },
+ {
+ "name":"title",
+ "value":"Bienvenido a Jetspeed 2",
+ "localeString":"es"
+ }
+ ]
+ }
+}
+]]></source>
+
+ </td>
+ </tr>
+ <tr>
+ <td>XML Response Example</td>
+ <td>
+<source><![CDATA[
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<page>
+ <id>/default-page.psml</id>
+ <name>default-page.psml</name>
+ <type>.psml</type>
+ <path>/default-page.psml</path>
+ <title>Welcome to Jetspeed</title>
+ <shortTitle>Welcome to Jetspeed</shortTitle>
+ <hidden>false</hidden>
+ <url>/default-page.psml</url>
+ <constraintsEnabled>true</constraintsEnabled>
+ <permissionsEnabled>false</permissionsEnabled>
+ <effectiveDefaultLayoutDecorator>jetspeed</effectiveDefaultLayoutDecorator>
+ <effectiveDefaultPortletDecorator>jetspeed</effectiveDefaultPortletDecorator>
+ <dirty>false</dirty>
+ <metadata>
+ <fields>
+ <field>
+ <localeString>fr</localeString>
+ <name>title</name>
+ <value>Bienvenue a Jetspeed</value>
+ </field>
+ <field>
+ <localeString>es</localeString>
+ <name>title</name>
+ <value>Bienvenido a Jetspeed 2</value>
+ </field>
+ </fields>
+ </metadata>
+</page>
+]]></source>
+
+ </td>
+ </tr>
+</table>
+</subsection>
+
+<subsection name='Copy Node'>
+<table>
+ <tr>
+ <td>Entry path</td>
+ <td>/copy/</td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td>Copy node based on the type parameter, the path parameter and the form request parameters</td>
+ </tr>
+ <tr>
+ <td>HTTP Method</td>
+ <td>GET</td>
+ </tr>
+ <tr>
+ <td>Parameters</td>
+ <td>
+ <table>
+ <tr>
+ <th>Type</th>
+ <th>Name</th>
+ <th>Required</th>
+ <th>Default value</th>
+ <th>Example value</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>Yes</td>
+ <td></td>
+ <td>
+ One of the following:
+ <br/>
+ <ul>
+ <li>/.psml</li>
+ <li>/folder</li>
+ <li>/.link</li>
+ </ul>
+ </td>
+ <td>
+ The first path parameter is for the node type:
+ <br/>
+ <ul>
+ <li>.psml : Page node</li>
+ <li>folder : Folder node</li>
+ <li>.link : Link node</li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>Yes</td>
+ <td></td>
+ <td>/default-page.psml</td>
+ <td>
+ The source node path to copy
+ </td>
+ </tr>
+ <tr>
+ <td>FORM</td>
+ <td>target</td>
+ <td>Yes</td>
+ <td></td>
+ <td>/Examples/default-page.psml</td>
+ <td>
+ The target node path to copy
+ </td>
+ </tr>
+ <tr>
+ <td>FORM</td>
+ <td>deep</td>
+ <td>No</td>
+ <td></td>
+ <td>true or false</td>
+ <td>
+ The flag whether copy deeply or not
+ </td>
+ </tr>
+ <tr>
+ <td>FORM</td>
+ <td>merge</td>
+ <td>Yes</td>
+ <td></td>
+ <td>true or false</td>
+ <td>
+ The flag whether copy with merging on the existing target node or not.
+ </td>
+ </tr>
+ <tr>
+ <td>FORM</td>
+ <td>owner</td>
+ <td>Yes</td>
+ <td></td>
+ <td>/Examples/default-page.psml</td>
+ <td>
+ The owner name.
+ </td>
+ </tr>
+ <tr>
+ <td>FORM</td>
+ <td>copyids</td>
+ <td>Yes</td>
+ <td></td>
+ <td>true or false</td>
+ <td>
+ The flag whether copy the fragment IDs of pages to the target node or not.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td>REST API examples</td>
+ <td>
+<source><![CDATA[
+POST http://localhost:8080/jetspeed/services/pagemanagement/copy/.psml/default-page.psml?_type=json
+
+With the following request form parameters:
+ target=/Examples/default-page.psml&deep=true&merge=true©ids=false
+]]></source>
+ </td>
+ </tr>
+ <tr>
+ <td>JSON Response Example</td>
+ <td>
+<source><![CDATA[
+{
+ "id":"/Examples/default-page.psml",
+ "name":"default-page.psml",
+ "type":".psml",
+ "path":"/Examples/default-page.psml",
+ "title":"Welcome to Jetspeed",
+ "shortTitle":"Welcome to Jetspeed",
+ "hidden":false,
+ "url":"/Examples/default-page.psml",
+ "constraintsEnabled":true,
+ "permissionsEnabled":false,
+ "effectiveDefaultLayoutDecorator":"jetspeed",
+ "effectiveDefaultPortletDecorator":"jetspeed",
+ "dirty":false,
+ "metadata":
+ {
+ "fields":[
+ {
+ "name":"title",
+ "value":"Welcome to Jetspeed",
+ "localeString":"en"
+ },
+ {
+ "name":"title",
+ "value":"Bienvenido a Jetspeed 2",
+ "localeString":"es"
+ }
+ ]
+ }
+}
+]]></source>
+
+ </td>
+ </tr>
+ <tr>
+ <td>XML Response Example</td>
+ <td>
+<source><![CDATA[
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<page>
+ <id>/Examples/default-page.psml</id>
+ <name>default-page.psml</name>
+ <type>.psml</type>
+ <path>/Examples/default-page.psml</path>
+ <title>Welcome to Jetspeed</title>
+ <shortTitle>Welcome to Jetspeed</shortTitle>
+ <hidden>false</hidden>
+ <url>/Examples/default-page.psml</url>
+ <constraintsEnabled>true</constraintsEnabled>
+ <permissionsEnabled>false</permissionsEnabled>
+ <effectiveDefaultLayoutDecorator>jetspeed</effectiveDefaultLayoutDecorator>
+ <effectiveDefaultPortletDecorator>jetspeed</effectiveDefaultPortletDecorator>
+ <dirty>false</dirty>
+ <metadata>
+ <fields>
+ <field>
+ <localeString>fr</localeString>
+ <name>title</name>
+ <value>Bienvenue a Jetspeed</value>
+ </field>
+ <field>
+ <localeString>es</localeString>
+ <name>title</name>
+ <value>Bienvenido a Jetspeed 2</value>
+ </field>
+ </fields>
+ </metadata>
+</page>
+]]></source>
+
+ </td>
+ </tr>
+</table>
+</subsection>
+
+<subsection name='Move Node'>
+<table>
+ <tr>
+ <td>Entry path</td>
+ <td>/move/</td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td>Move node based on the type parameter, the path parameter and the form request parameters</td>
+ </tr>
+ <tr>
+ <td>HTTP Method</td>
+ <td>GET</td>
+ </tr>
+ <tr>
+ <td>Parameters</td>
+ <td>
+ <table>
+ <tr>
+ <th>Type</th>
+ <th>Name</th>
+ <th>Required</th>
+ <th>Default value</th>
+ <th>Example value</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>Yes</td>
+ <td></td>
+ <td>
+ One of the following:
+ <br/>
+ <ul>
+ <li>/.psml</li>
+ <li>/folder</li>
+ <li>/.link</li>
+ </ul>
+ </td>
+ <td>
+ The first path parameter is for the node type:
+ <br/>
+ <ul>
+ <li>.psml : Page node</li>
+ <li>folder : Folder node</li>
+ <li>.link : Link node</li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>Yes</td>
+ <td></td>
+ <td>/default-page.psml</td>
+ <td>
+ The source node path to move
+ </td>
+ </tr>
+ <tr>
+ <td>FORM</td>
+ <td>target</td>
+ <td>Yes</td>
+ <td></td>
+ <td>/Examples/default-page.psml</td>
+ <td>
+ The target node path to move
+ </td>
+ </tr>
+ <tr>
+ <td>FORM</td>
+ <td>deep</td>
+ <td>No</td>
+ <td></td>
+ <td>true or false</td>
+ <td>
+ The flag whether move deeply or not
+ </td>
+ </tr>
+ <tr>
+ <td>FORM</td>
+ <td>merge</td>
+ <td>Yes</td>
+ <td></td>
+ <td>true or false</td>
+ <td>
+ The flag whether move with merging on the existing target node or not.
+ </td>
+ </tr>
+ <tr>
+ <td>FORM</td>
+ <td>owner</td>
+ <td>Yes</td>
+ <td></td>
+ <td>/Examples/default-page.psml</td>
+ <td>
+ The owner name.
+ </td>
+ </tr>
+ <tr>
+ <td>FORM</td>
+ <td>copyids</td>
+ <td>Yes</td>
+ <td></td>
+ <td>true or false</td>
+ <td>
+ The flag whether move the fragment IDs of pages to the target node or not.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td>REST API examples</td>
+ <td>
+<source><![CDATA[
+POST http://localhost:8080/jetspeed/services/pagemanagement/move/.psml/default-page.psml?_type=json
+
+With the following request form parameters:
+ target=/Examples/default-page.psml&deep=true&merge=true©ids=false
+]]></source>
+ </td>
+ </tr>
+ <tr>
+ <td>JSON Response Example</td>
+ <td>
+<source><![CDATA[
+{
+ "id":"/Examples/default-page.psml",
+ "name":"default-page.psml",
+ "type":".psml",
+ "path":"/Examples/default-page.psml",
+ "title":"Welcome to Jetspeed",
+ "shortTitle":"Welcome to Jetspeed",
+ "hidden":false,
+ "url":"/Examples/default-page.psml",
+ "constraintsEnabled":true,
+ "permissionsEnabled":false,
+ "effectiveDefaultLayoutDecorator":"jetspeed",
+ "effectiveDefaultPortletDecorator":"jetspeed",
+ "dirty":false,
+ "metadata":
+ {
+ "fields":[
+ {
+ "name":"title",
+ "value":"Welcome to Jetspeed",
+ "localeString":"en"
+ },
+ {
+ "name":"title",
+ "value":"Bienvenido a Jetspeed 2",
+ "localeString":"es"
+ }
+ ]
+ }
+}
+]]></source>
+
+ </td>
+ </tr>
+ <tr>
+ <td>XML Response Example</td>
+ <td>
+<source><![CDATA[
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<page>
+ <id>/Examples/default-page.psml</id>
+ <name>default-page.psml</name>
+ <type>.psml</type>
+ <path>/Examples/default-page.psml</path>
+ <title>Welcome to Jetspeed</title>
+ <shortTitle>Welcome to Jetspeed</shortTitle>
+ <hidden>false</hidden>
+ <url>/Examples/default-page.psml</url>
+ <constraintsEnabled>true</constraintsEnabled>
+ <permissionsEnabled>false</permissionsEnabled>
+ <effectiveDefaultLayoutDecorator>jetspeed</effectiveDefaultLayoutDecorator>
+ <effectiveDefaultPortletDecorator>jetspeed</effectiveDefaultPortletDecorator>
+ <dirty>false</dirty>
+ <metadata>
+ <fields>
+ <field>
+ <localeString>fr</localeString>
+ <name>title</name>
+ <value>Bienvenue a Jetspeed</value>
+ </field>
+ <field>
+ <localeString>es</localeString>
+ <name>title</name>
+ <value>Bienvenido a Jetspeed 2</value>
+ </field>
+ </fields>
+ </metadata>
+</page>
+]]></source>
+
+ </td>
+ </tr>
+</table>
+</subsection>
+
+<subsection name='Update Node Info'>
+<table>
+ <tr>
+ <td>Entry path</td>
+ <td>/info/</td>
+ </tr>
+ <tr>
+ <td>Description</td>
+ <td>Update node info based on the type parameter, the path parameter and the form request parameters</td>
+ </tr>
+ <tr>
+ <td>HTTP Method</td>
+ <td>GET</td>
+ </tr>
+ <tr>
+ <td>Parameters</td>
+ <td>
+ <table>
+ <tr>
+ <th>Type</th>
+ <th>Name</th>
+ <th>Required</th>
+ <th>Default value</th>
+ <th>Example value</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>Yes</td>
+ <td></td>
+ <td>
+ One of the following:
+ <br/>
+ <ul>
+ <li>/.psml</li>
+ <li>/folder</li>
+ <li>/.link</li>
+ </ul>
+ </td>
+ <td>
+ The first path parameter is for the node type:
+ <br/>
+ <ul>
+ <li>.psml : Page node</li>
+ <li>folder : Folder node</li>
+ <li>.link : Link node</li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>PATH</td>
+ <td></td>
+ <td>Yes</td>
+ <td></td>
+ <td>/default-page.psml</td>
+ <td>
+ The target node path to move
+ </td>
+ </tr>
+ <tr>
+ <td>FORM</td>
+ <td>title</td>
+ <td>No</td>
+ <td></td>
+ <td>Welcome to Jetspeed</td>
+ <td>
+ The title of the node.
+ </td>
+ </tr>
+ <tr>
+ <td>FORM</td>
+ <td>shorttitle</td>
+ <td>No</td>
+ <td></td>
+ <td>Welcome</td>
+ <td>
+ The short title of the node.
+ </td>
+ </tr>
+ <tr>
+ <td>FORM</td>
+ <td>hidden</td>
+ <td>No</td>
+ <td></td>
+ <td>true or false</td>
+ <td>
+ The flag whether the target node is hidden or not.
+ </td>
+ </tr>
+ <tr>
+ <td>FORM</td>
+ <td>skin</td>
+ <td>No</td>
+ <td></td>
+ <td>jetspeed</td>
+ <td>
+ The skin name of the target node.
+ </td>
+ </tr>
+ <tr>
+ <td>FORM</td>
+ <td>version</td>
+ <td>No</td>
+ <td></td>
+ <td>true or false</td>
+ <td>
+ The version of the target node.
+ </td>
+ </tr>
+ <tr>
+ <td>FORM</td>
+ <td>docorder</td>
+ <td>No</td>
+ <td></td>
+ <td>default-page.psml, min.psml</td>
+ <td>
+ The document order of the target node. The target node must be a folder node. Otherwise, this parameter will be just ignored.
+ </td>
+ </tr>
+ <tr>
+ <td>FORM</td>
+ <td>url</td>
+ <td>No</td>
+ <td></td>
+ <td>http://portals.apache.org</td>
+ <td>
+ The url of the target node. The target node must be a link node. Otherwise, this parameter will be just ignored.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td>REST API examples</td>
+ <td>
+<source><![CDATA[
+POST http://localhost:8080/jetspeed/services/pagemanagement/info/.psml/default-page.psml?_type=json
+
+With the following request form parameters:
+ title=Welcome to Jetspeed-2 Enterprise Portal
+]]></source>
+ </td>
+ </tr>
+ <tr>
+ <td>JSON Response Example</td>
+ <td>
+<source><![CDATA[
+{
+ "id":"/Examples/default-page.psml",
+ "name":"default-page.psml",
+ "type":".psml",
+ "path":"/Examples/default-page.psml",
+ "title":"Welcome to Jetspeed-2 Enterprise Portal",
+ "shortTitle":"Welcome to Jetspeed",
+ "hidden":false,
+ "url":"/Examples/default-page.psml",
+ "constraintsEnabled":true,
+ "permissionsEnabled":false,
+ "effectiveDefaultLayoutDecorator":"jetspeed",
+ "effectiveDefaultPortletDecorator":"jetspeed",
+ "dirty":false,
+ "metadata":
+ {
+ "fields":[
+ {
+ "name":"title",
+ "value":"Welcome to Jetspeed",
+ "localeString":"en"
+ },
+ {
+ "name":"title",
+ "value":"Bienvenido a Jetspeed 2",
+ "localeString":"es"
+ }
+ ]
+ }
+}
+]]></source>
+
+ </td>
+ </tr>
+ <tr>
+ <td>XML Response Example</td>
+ <td>
+<source><![CDATA[
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<page>
+ <id>/Examples/default-page.psml</id>
+ <name>default-page.psml</name>
+ <type>.psml</type>
+ <path>/Examples/default-page.psml</path>
+ <title>Welcome to Jetspeed-2 Enterprise Portal</title>
+ <shortTitle>Welcome to Jetspeed</shortTitle>
+ <hidden>false</hidden>
+ <url>/Examples/default-page.psml</url>
+ <constraintsEnabled>true</constraintsEnabled>
+ <permissionsEnabled>false</permissionsEnabled>
+ <effectiveDefaultLayoutDecorator>jetspeed</effectiveDefaultLayoutDecorator>
+ <effectiveDefaultPortletDecorator>jetspeed</effectiveDefaultPortletDecorator>
+ <dirty>false</dirty>
+ <metadata>
+ <fields>
+ <field>
+ <localeString>fr</localeString>
+ <name>title</name>
+ <value>Bienvenue a Jetspeed</value>
+ </field>
+ <field>
+ <localeString>es</localeString>
+ <name>title</name>
+ <value>Bienvenido a Jetspeed 2</value>
+ </field>
+ </fields>
+ </metadata>
+</page>
+]]></source>
+
+ </td>
+ </tr>
+</table>
+</subsection>
+
+</section>
+<section name='Spring Assembly'>
+<p>
+The Jetspeed REST Services are configured in the Spring Assembly.
+Here is the core part of the Spring Assembly. Each service component is configured in the resource providers.
+</p>
+<source><![CDATA[
+ <!--
+ The internal server factory.
+ Each JAX-RS service component is registered by "resourceProvider" property.
+ -->
+ <bean id="cxfJaxrsServerFactoryBean" class="org.apache.cxf.jaxrs.JAXRSServerFactoryBean">
+ <meta key="j2:cat" value="default" />
+ <property name="address" value="/" />
+ <property name="destinationFactory" ref="cxfDestinationFactory" />
+ <property name="providers">
+ <list>
+ <ref bean="jaxrsJsonProvider" />
+ </list>
+ </property>
+ <property name="resourceProviders">
+ <list>
+ <bean class="org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider">
+ <meta key="j2:cat" value="default" />
+ <constructor-arg ref="jaxrsPortletRegistryService" />
+ </bean>
+ <bean class="org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider">
+ <meta key="j2:cat" value="default" />
+ <constructor-arg ref="jaxrsPageLayoutService" />
+ </bean>
+ <bean class="org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider">
+ <meta key="j2:cat" value="default" />
+ <constructor-arg ref="jaxrsPageManagementService" />
+ </bean>
+ </list>
+ </property>
+ </bean>
+
+ <!-- Portlet Registry JAX-RS Service -->
+ <bean id="jaxrsPortletRegistryService" class="org.apache.jetspeed.services.rest.PortletRegistryService">
+ <meta key="j2:cat" value="default" />
+ <constructor-arg ref="org.apache.jetspeed.security.SecurityAccessController" />
+ <constructor-arg ref="org.apache.jetspeed.components.portletregistry.PortletRegistry" />
+ <constructor-arg ref="org.apache.jetspeed.search.SearchEngine" />
+ </bean>
+
+ <!-- Portal Page Layout Management JAX-RS Service -->
+ <bean id="jaxrsPageLayoutService" class="org.apache.jetspeed.services.rest.PageLayoutService">
+ <meta key="j2:cat" value="default" />
+ <constructor-arg ref="org.apache.jetspeed.layout.PageLayoutComponent" />
+ <constructor-arg ref="org.apache.jetspeed.components.portletregistry.PortletRegistry" />
+ <constructor-arg ref="PortletActionSecurityBehavior" />
+ </bean>
+
+ <!-- Portal Page Management JAX-RS Service -->
+ <bean id="jaxrsPageManagementService" class="org.apache.jetspeed.services.rest.PageManagementService">
+ <meta key="j2:cat" value="default" />
+ <constructor-arg ref="org.apache.jetspeed.page.PageManager" />
+ </bean>
+]]></source>
+
+</section>
+</body>
+</document>
+
Added: portals/site/jetspeed/jetspeed-2.3/jetspeed-guide-dev/src/site/xdoc/guide-security.xml
URL: http://svn.apache.org/viewvc/portals/site/jetspeed/jetspeed-2.3/jetspeed-guide-dev/src/site/xdoc/guide-security.xml?rev=1691449&view=auto
==============================================================================
--- portals/site/jetspeed/jetspeed-2.3/jetspeed-guide-dev/src/site/xdoc/guide-security.xml (added)
+++ portals/site/jetspeed/jetspeed-2.3/jetspeed-guide-dev/src/site/xdoc/guide-security.xml Thu Jul 16 21:01:09 2015
@@ -0,0 +1,67 @@
+<?xml version="1.0"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<document>
+ <properties>
+ <title>Guide to Security</title>
+ <subtitle>Security Configuration Overview</subtitle>
+ <authors>
+ <person name="David Le Strat" email="dlestrat@apache.org" />
+ </authors>
+ </properties>
+ <body>
+ <section name="Configuring Jetspeed-2 Security">
+ <p>
+ An overview of Jetspeed-2 security architecture is
+ available
+ <a href="arch.html">
+ here
+ </a>
+ .
+ </p>
+ <subsection name="Guide to Authentication Configuration">
+ <p>
+ Jetspeed-2 provides a
+ <a
+ href="login-module.html">
+ LoginModule implementation
+ </a>
+ that leverage the security SPI model to interact
+ with multiple authentication mechanisms.
+ </p>
+ <p>
+ Jetspeed authentication configuration is managed by the <i>security-spi-atn.xml</i> located in
+ the <a href="../deployguide/config-overrides.html">portal application assembly directory</a>. Jetspeed-2
+ supports authentication against:
+ <ul>
+ <li>A <a href="../deployguide/security-config.html#security-spi-atn_xml">relational database</a> (default authentication implementation).</li>
+ <li>A <a href="../deployguide/ldap.html">LDAP authentication</a> implementation.</li>
+ </ul>
+ </p>
+ </subsection>
+ <subsection name="Guide to Authorization Configuration">
+ <p>
+ Jetspeed-2 provides a <a href="atz-jaas.html">relational database backed JAAS policy implementation</a>.
+ </p>
+ <p>
+ Jetspeed-2 authorization implementation relies on a SPI model as well and is configured through <code>security-spi-atz.xml</code>.
+ Configuration details are available <a href="../deployguide/security-config.html">here</a>.
+ </p>
+ </subsection>
+ </section>
+ </body>
+</document>
\ No newline at end of file