001: /*
002: * Copyright 2002 Sun Microsystems, Inc. All
003: * rights reserved. Use of this product is subject
004: * to license terms. Federal Acquisitions:
005: * Commercial Software -- Government Users
006: * Subject to Standard License Terms and
007: * Conditions.
008: *
009: * Sun, Sun Microsystems, the Sun logo, and Sun ONE
010: * are trademarks or registered trademarks of Sun Microsystems,
011: * Inc. in the United States and other countries.
012: */
013:
014: package com.sun.portal.container.portlet.impl;
015:
016: import java.util.Map;
017: import java.util.HashMap;
018: import java.util.List;
019: import java.util.ArrayList;
020: import java.util.Iterator;
021:
022: /**
023: * DispatcherState is the class that keeps the state information about
024: * what portlets have called the dispatcher to PAE. It controls which
025: * portlets can safely call the dispatcher to PAE and which portlets must
026: * wait. DispatcherState objects are stored as HttpServletRequest attribute
027: * by PortletContainer. Since there is no synchronizing code in this class,
028: * the user (PortletContainer) must make sure it syncs around calls to the
029: * class.
030: **/
031: public class DispatcherState {
032:
033: private int count;
034: private String runningAppName;
035: private boolean isSessionEnabled;
036:
037: /**
038: * Return whether the portlet can safely use dispatcher to PAE. If the
039: * return value is false, the caller should call wait(). It will be woke
040: * up by notifyAll() when all the portlets have exited the ciritical
041: * section. However, the portlet should call canEnter() again to make
042: * sure it is save to enter the cirtical section after being waken up.
043: *
044: * @param appName application name the portlet belongs to.
045: * @param portletSessionless ture if the portlet does not use session,
046: * false otherwise.
047: * @param serializeAll ture if serialization is needed at all time.
048: *
049: * @return ture if the portlet can safely use the dispatcher to PAE,
050: * false otherwise.
051: **/
052: public boolean canEnter(String appName,
053: boolean portletSessionEnabled, boolean serializeAll) {
054: if (serializeAll) {
055: if (runningAppName == null) {
056:
057: // nobody is running!
058:
059: runningAppName = appName;
060: isSessionEnabled = portletSessionEnabled;
061: count = 1;
062: return true;
063: } else {
064: return false;
065: }
066: } else {
067: if (runningAppName == null) {
068:
069: // nobody is running!
070:
071: runningAppName = appName;
072: isSessionEnabled = portletSessionEnabled;
073: count = 1;
074: return true;
075:
076: } else if (!isSessionEnabled && !portletSessionEnabled) {
077:
078: // Everybody is sessionless, join the party!
079:
080: count++;
081: return true;
082: } else {
083:
084: return false;
085:
086: }
087: }
088: }
089:
090: /**
091: * Return whether the portlet is the last one to exit the critical section
092: * for dispatcher to PAE. If the return value is true, the caller should
093: * call wakeThreads() to wake up waiting threads.
094: *
095: * @return ture when it is the last portlet to exit critical section,
096: * false otherwise.
097: **/
098: public boolean exit() {
099: count--;
100: if (count == 0) {
101: runningAppName = null;
102: return true;
103: } else {
104: return false;
105: }
106: }
107:
108: }
|