001: /**
002: * $Id: TaskMembership.java,v 1.6 2007/02/06 22:10:19 pm95875 Exp $
003: * Copyright 2005 Sun Microsystems, Inc. All
004: * rights reserved. Use of this product is subject
005: * to license terms. Federal Acquisitions:
006: * Commercial Software -- Government Users
007: * Subject to Standard License Terms and
008: * Conditions.
009: *
010: * Sun, Sun Microsystems, the Sun logo, and Sun ONE
011: * are trademarks or registered trademarks of Sun Microsystems,
012: * Inc. in the United States and other countries.
013: */package com.sun.portal.portlet.service.tasksprocessor;
014:
015: import javax.servlet.ServletContext;
016: import javax.servlet.ServletConfig;
017: import javax.servlet.ServletException;
018:
019: import javax.servlet.http.HttpServlet;
020: import javax.servlet.http.HttpServletRequest;
021: import javax.servlet.http.HttpServletResponse;
022:
023: import com.sun.portal.portlet.service.taskshared.TaskCommonConstant;
024: import com.sun.portal.portlet.service.taskshared.TaskMembershipConstant;
025: import com.sun.portal.portlet.service.taskshared.TaskResult;
026: import com.sun.portal.portletappengine.LifecycleManager;
027: import com.sun.portal.portletcontainercommon.descriptor.DeploymentExtensionDescriptor;
028:
029: import com.sun.portal.portlet.service.provision.GenericPortletMembershipListener;
030: import com.sun.portal.portlet.service.provision.PortletMembershipEvent;
031: import com.sun.portal.portlet.service.provision.PortletMembershipException;
032: import com.sun.portal.portlet.service.provision.PortletMembershipListener;
033:
034: import javax.portlet.PortletContext;
035: import java.util.Map;
036: import java.util.List;
037: import java.util.Iterator;
038: import java.util.ArrayList;
039: import java.util.HashMap;
040:
041: import java.util.logging.Logger;
042: import java.util.logging.Level;
043: import com.sun.portal.log.common.PortalLogger;
044:
045: /**
046: *
047: * @author mjain
048: */
049: class TaskMembership {
050:
051: // Global variables
052: private LifecycleManager _lifecycleManager;
053: private static java.util.logging.Logger _logger = PortalLogger
054: .getLogger(TaskMembership.class);
055: private ServletContext _context;
056: private PortletContext _portletContext;
057: private DeploymentExtensionDescriptor _deploymentExtensionDescriptor;
058: private Map _listenerMap;
059: private boolean _initializationSuccessFul = true;
060:
061: /** Creates a new instance of TaskServicePortletMembership
062: * called by TasksProcessorServlet's init method
063: */
064: TaskMembership(ServletConfig config) throws ServletException {
065:
066: _lifecycleManager = (LifecycleManager) config
067: .getServletContext().getAttribute(
068: LifecycleManager.LIFECYCLE_MANAGER_PREFIX);
069: _portletContext = _lifecycleManager.getPortletContext();
070: _deploymentExtensionDescriptor = _lifecycleManager
071: .getDeploymentDescriptor()
072: .getDeploymentExtensionDescriptor();
073: _context = config.getServletContext();
074: _listenerMap = initializeListenerMap();
075:
076: }
077:
078: void process(HttpServletRequest req, HttpServletResponse res)
079: throws ServletException {
080:
081: if (_logger.isLoggable(Level.FINEST)) {
082: _logger.log(Level.FINEST, "TaskMembership start");
083: }
084:
085: /*
086: * make sure the initialization has gone ok before proceeding
087: */
088: checkInitializationSuccess();
089:
090: /*
091: * extract the information needed to call listeners from the request object
092: */
093: String action = (String) req
094: .getAttribute(TaskCommonConstant.TASK);
095:
096: Map inputHolder = (Map) req
097: .getAttribute(TaskCommonConstant.TASK_INPUT_HOLDER);
098: Map outputHolder = (Map) req
099: .getAttribute(TaskCommonConstant.TASK_OUTPUT_HOLDER);
100: String portletName = (String) inputHolder
101: .get(TaskCommonConstant.PORTLET_NAME);
102: PortletMembershipEvent membershipEvent = (PortletMembershipEvent) inputHolder
103: .get(TaskMembershipConstant.MEMBERSHIP_EVENT);
104: TaskResult taskResult = (TaskResult) outputHolder
105: .get(TaskMembershipConstant.MEMBERSHIP_RESULTS);
106: /*
107: * call the configured listeners
108: */
109:
110: PortletMembershipListener listener = null;
111: try {
112: List membershipListeners = (List) _listenerMap
113: .get(portletName);
114: // log if no listeners found for a portlet.
115: if (_logger.isLoggable(Level.FINEST)) {
116: if (membershipListeners == null) {
117: _logger
118: .log(
119: Level.FINEST,
120: "TaskMembership Listener:"
121: + "No listener configured for portlet:"
122: + portletName);
123: }
124: }
125: // iterate through the listener if found.
126: if (membershipListeners != null) {
127: Iterator membershipListenersIter = membershipListeners
128: .iterator();
129:
130: while (membershipListenersIter.hasNext()) {
131: listener = (PortletMembershipListener) membershipListenersIter
132: .next();
133: if (_logger.isLoggable(Level.FINEST)) {
134: _logger.log(Level.FINEST,
135: "Calling Membership Listener:"
136: + listener.getClass().getName()
137: + "\n" + "For action:" + action
138: + "\n" + "For event:"
139: + membershipEvent.toString());
140: }
141:
142: if (action.equals(TaskCommonConstant.MEMBER_ADDED)) {
143: listener.memberAdded(membershipEvent);
144: } else if (action
145: .equals(TaskCommonConstant.MEMBER_REMOVED)) {
146: listener.memberRemoved(membershipEvent);
147: }
148: }
149: taskResult.setStatus(TaskCommonConstant.STATUS_SUCCESS);
150: }
151: } catch (PortletMembershipException pe) {
152: pe.printStackTrace();
153: _logger.log(Level.SEVERE, "listener:"
154: + listener.getClass().getName() + "action:"
155: + action, pe);
156:
157: taskResult.setStatus(TaskCommonConstant.STATUS_ERROR);
158: taskResult.setException(pe);
159:
160: }
161:
162: }
163:
164: /*
165: * Called through init() once
166: * Returns a map that map a portlet name to instances of membership listeners
167: * based on the configuration found in sun-portlet.xml
168: */
169: private Map initializeListenerMap() throws ServletException {
170:
171: Map listenerNameMap = _deploymentExtensionDescriptor
172: .getMembershipListenerMap();
173: Map listenerInstanceMap = new HashMap();
174: if (listenerNameMap != null) {
175: Iterator portletNamesIter = listenerNameMap.keySet()
176: .iterator();
177: while (portletNamesIter.hasNext()) {
178: List listeners = new ArrayList();
179: String portletName = (String) portletNamesIter.next();
180: String listenerName = null;
181: try {
182:
183: List listenerNames = (List) listenerNameMap
184: .get(portletName);
185: if (listenerNames != null) {
186: Iterator listenerNamesIter = listenerNames
187: .iterator();
188: while (listenerNamesIter.hasNext()) {
189: listenerName = (String) listenerNamesIter
190: .next();
191: _logger.log(Level.FINEST,
192: "TaskMembership:Portlet:"
193: + portletName
194: + ":listener configured:"
195: + listenerName);
196: PortletMembershipListener listener = (PortletMembershipListener) Thread
197: .currentThread()
198: .getContextClassLoader().loadClass(
199: listenerName).newInstance();
200: listener.init(_portletContext, _context);
201: listeners.add(listener);
202: }
203: listenerInstanceMap.put(portletName, listeners);
204: }
205: } catch (Exception ex) {
206: _initializationSuccessFul = false;
207: throw new ServletException(
208: "TaskMembership:Membership :Initialization of listener failed:"
209: + listenerName, ex);
210: }
211:
212: }
213: }
214: return listenerInstanceMap;
215:
216: }
217:
218: private void checkInitializationSuccess() {
219: if (!_initializationSuccessFul) {
220: throw new IllegalStateException(
221: "Initialization of provisioning framework had failed. Check logs of the portlet webapp");
222: }
223: }
224: }
|