Jetspeed Services

This tutorial shows you how to use Jetspeed Services from the Express Demo Portlet Application. Please note that all edits, unless explicity specified otherwise, are applied to the express-demo PA source tree. We 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>com.bluesunrise.portal.portlets.services.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. Edit the jetspeed-portlet.xml found in src/webapp/WEB-INF/, and add the following services under the <js:services> element. This tells Jetspeed what services you require:

	
	 	
        <js:service name='GroupManager'/>    
        <js:service name='PageManager'/>    
        <js:service name='PortalAdministration'/>        
        <js:service name='PortletRegistryComponent'/>
        <js:service name='RoleManager'/>	 
        <js:service name='UserManager'/>        
	     
	

Create a new JSP page named services-tutorial.jsp in the src/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/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>

<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 new package using Eclipse: com.bluesunrise.portal.portlets.services
  • Create a portlet in the above 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 two above class imports.

Enter the following code into the init(PortletConfig config) method, replacing whats there:

	
	 
	    super.init();
        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();
		}
	}	 
	     
	

Implement the undefined methods using the Jetspeed Services...

methodpurpose
createRolesusing the roles init param, create new roles with the RoleManager service. If the role already exists, skip it.
createGroupsusing the groups init param, create new groups with the GroupManager service. If the group already exists, skip it.
registerUsersusing the users init param, register new users with the PortalAdministration service. If the user already exists, skip it.
modifyPagesusing 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
createSharedPagescreate a folder named /shared, create a page name /friends.psml. add some portlets to the page. grant public-view security constraint to the folder

Previous