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 |