Jetspeed Services

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:

  • add new roles
  • add new groups
  • register new users
  • manipulate pages
  • get a filtered list of portlets

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>
  • Create a portlet in the org.apache.portals.tutorials package named ServicesTutorialPortlet.java extending GenericServletPortlet.
  • Override and implement the init, doView and processAction methods

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

The End

Previous