This tutorial shows you how to use Jetspeed Services from the Jetexpress Portlet Application. Please note that all edits, unless explicity specified otherwise, are applied to the jetexpress-pa source tree. You will learn how to:
using the RoleManager, GroupManager, PortletAdministration, and Page Manager Jetspeed API interfaces.
Lets get started by entering a new portlet in the portlet.xml:
<portlet id="ServicesTutorialPortlet">
<description>Tutorial for using Jetspeed Services, such as PortalAdministration, PageManager, Registry.</description>
<portlet-name>ServicesTutorialPortlet</portlet-name>
<display-name>Jetspeed Services Tutorial Portlet</display-name>
<portlet-class>org.apache.portals.tutorials.ServicesTutorialPortlet</portlet-class>
<init-param>
<description>This parameter sets the template used in view mode.</description>
<name>ViewPage</name>
<value>/WEB-INF/view/services-tutorial.jsp</value>
</init-param>
<init-param>
<description>Comma-separated list of roles to create via Role Manager</description>
<name>roles</name>
<value>role1,role2,role3</value>
</init-param>
<init-param>
<description>Comma-separated list of groups to create via Group Manager</description>
<name>groups</name>
<value>group1,group2,group3</value>
</init-param>
<init-param>
<description>Comma-separated list of Users to create and Register via PortalAdminstration service</description>
<name>users</name>
<value>user1,user2,user3</value>
</init-param>
<init-param>
<description>Comma-separated list of roles to assign to a new user</description>
<name>registration-roles</name>
<value>user,role1,role2</value>
</init-param>
<init-param>
<description>Comma-separated list of groups to assign to a new user</description>
<name>registration-groups</name>
<value>group1,group2</value>
</init-param>
<init-param>
<name>portlet-icon</name>
<value>start-here.png</value>
</init-param>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>VIEW</portlet-mode>
</supports>
<supported-locale>en</supported-locale>
<portlet-info>
<title>Services Tutorial</title>
<short-title>Services</short-title>
<keywords>tutorial,services,jetspeed-services</keywords>
</portlet-info>
</portlet>
Jetspeed has an extended descriptor for defining extended portal features and services. Create a file jetspeed-portlet.xml in src/main/webapp/WEB-INF/, and add the following services under the <js:services> element. This tells Jetspeed what services you require:
<?xml version="1.0" encoding="UTF-8"?>
<portlet-app id="jetexpress-pa" version="1.0"
xmlns="http://portals.apache.org/jetspeed"
xmlns:js="http://portals.apache.org/jetspeed"
xmlns:dc="http://www.purl.org/dc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://portals.apache.org/jetspeed http://portals.apache.org/jetspeed-2/2.1/schemas/jetspeed-portlet.xsd">
<js:services>
<js:service name='GroupManager'/>
<js:service name='PageManager'/>
<js:service name='PortalAdministration'/>
<js:service name='PortletRegistryComponent'/>
<js:service name='RoleManager'/>
<js:service name='UserManager'/>
</js:services>
</portlet-app>
Create a new JSP page named services-tutorial.jsp in the src/main/webapp/WEB-INF/view/ directory. Enter the following code:
<%@ page language="java" session="true" %>
<%@ page import="javax.portlet.*" %>
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix='c'%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix='c'%>
<portlet:defineObjects/>
<portlet:actionURL var="newRolesAction"/>
<br/>
<div class='portlet-section-header'>Services Tutorial Portlet</div>
<form name="servicesTutorialForm" action="<c:out value="${newRolesAction}"/>" method="post">
<input type="submit" name='action' value="createRoles" class="portlet-form-button" />
<input type="submit" name='action' value="createGroups" class="portlet-form-button" />
<input type="submit" name='action' value="registerUsers" class="portlet-form-button" />
<input type="submit" name='action' value="modifyPages" class="portlet-form-button" />
<input type="submit" name='action' value="createSharedPages" class="portlet-form-button" />
</form>
<c:if test="${message != null}">
<div class='portlet-msg-info'><c:out value="${message}"/></div>
</c:if>
<c:if test="${errorMessage != null}">
<div class='portlet-msg-error'><c:out value="${errorMessage}"/></div>
</c:if>
Add the following data members to the portlet class:
private PortalAdministration admin; private PageManager pageManager; private RoleManager roleManager; private UserManager userManager; private GroupManager groupManager; protected PortletRegistry registry; private List registrationRoles; private List registrationGroups; private List newRoles; private List newGroups; private List newUsers;
Press Ctrl-Shift-O to resolve the class imports.
Implement the init(PortletConfig config) method:
@Override
public void init(PortletConfig config) throws PortletException {
super.init(config);
admin = (PortalAdministration) getPortletContext()
.getAttribute(CommonPortletServices.CPS_PORTAL_ADMINISTRATION);
if (null == admin) {
throw new PortletException("Failed to find the Portal Administration on portlet initialization");
}
userManager = (UserManager) getPortletContext().getAttribute(CommonPortletServices.CPS_USER_MANAGER_COMPONENT);
if (null == userManager) {
throw new PortletException("Failed to find the User Manager on portlet initialization");
}
roleManager = (RoleManager) getPortletContext().getAttribute(CommonPortletServices.CPS_ROLE_MANAGER_COMPONENT);
if (null == roleManager) {
throw new PortletException("Failed to find the Role Manager on portlet initialization");
}
groupManager = (GroupManager) getPortletContext().getAttribute(
CommonPortletServices.CPS_GROUP_MANAGER_COMPONENT);
if (null == groupManager) {
throw new PortletException("Failed to find the Group Manager on portlet initialization");
}
pageManager = (PageManager) getPortletContext().getAttribute(CommonPortletServices.CPS_PAGE_MANAGER_COMPONENT);
if (null == pageManager) {
throw new PortletException("Failed to find the Page Manager on portlet initialization");
}
registry = (PortletRegistry) getPortletContext().getAttribute(CommonPortletServices.CPS_REGISTRY_COMPONENT);
if (null == registry) {
throw new PortletException("Failed to find the Portlet Registry on portlet initialization");
}
this.newRoles = getInitParameterList(config, "roles");
this.newGroups = getInitParameterList(config, "groups");
this.newUsers = getInitParameterList(config, "users");
this.registrationRoles = getInitParameterList(config, "registration-roles");
this.registrationGroups = getInitParameterList(config, "registration-groups");
}
Add this helper function to the class:
protected List getInitParameterList(PortletConfig config, String ipName) {
String temp = config.getInitParameter(ipName);
if (temp == null)
return new ArrayList();
String[] temps = temp.split("\\,");
for (int ix = 0; ix < temps.length; ix++)
temps[ix] = temps[ix].trim();
return Arrays.asList(temps);
}
Write the doView method:
public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException {
request.setAttribute("message", request.getParameter("message"));
request.setAttribute("errorMessage", request.getParameter("errorMessage"));
super.doView(request, response);
}
Write the portletAction method:
public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException {
String action = request.getParameter("action");
try {
if (action != null) {
if (action.equals("createRoles")) {
String message = "Created " + createRoles() + " roles";
response.setRenderParameter("message", message);
} else if (action.equals("createGroups")) {
String message = "Created " + createGroups() + " groups";
response.setRenderParameter("message", message);
} else if (action.equals("registerUsers")) {
String message = "Registered " + registerUsers() + " users";
response.setRenderParameter("message", message);
} else if (action.equals("modifyPages")) {
String message = "Modified " + modifyPages() + " pages";
response.setRenderParameter("message", message);
} else if (action.equals("createSharedPages")) {
String message = "Created " + createSharedPages() + " pages";
response.setRenderParameter("message", message);
}
}
} catch (Exception e) {
response.setRenderParameter("serviceError", e.getMessage());
// TODO: proper logging
e.printStackTrace();
}
}
Finally implement the undefined methods using the Jetspeed Services:
| method | purpose |
|---|---|
| createRoles | using the roles init param, create new roles with the RoleManager service. If the role already exists, skip it. |
| createGroups | using the groups init param, create new groups with the GroupManager service. If the group already exists, skip it. |
| registerUsers | using the users init param, register new users with the PortalAdministration service. If the user already exists, skip it. |
| modifyPages | using the users init param, modify pages with the PageManager service. If the page doesnt exist, dont create it. Modifications: for user1, create a 1 column collection of 1 portlet, for user2, create a 2 column collection of 2 portlets, for user3 create a 3 column collection of 3 portets |
| createSharedPages | create a folder named /shared, create a page name /friends.psml. add some portlets to the page. grant public-view security constraint to the folder |