001: /*
002: * Copyright 2004-2005 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: package com.sun.portal.portletcontainercommon.descriptor;
014:
015: import java.util.List;
016: import java.util.ArrayList;
017: import java.util.Map;
018: import java.util.HashMap;
019: import java.util.Iterator;
020: import java.util.LinkedHashMap;
021: import java.util.logging.Logger;
022:
023: import org.jdom.Element;
024: import org.jdom.Namespace;
025:
026: /**
027: * This class loads the portlet deployment extension descriptor.
028: * <P>
029: * Currently, we only use two extension element:
030: * <UL>
031: * <LI>the sessionless element: by default sessionless is false, if a
032: * portlet does not have this defined, then it means the portlet uses
033: * session, if sessionless is defined as "1", then it means the
034: * portlet does not use session.
035: * <LI>the save perference in render permission: this is per
036: * application setting. By default it is false, if it is defined as
037: * "1", then it means save is allowed, if it is defined as "0", then
038: * it means save if not allowed.
039: * </UL>
040: */
041: public class DeploymentExtensionDescriptor {
042: // Portlet Descriptor Element Names
043: public static final String SAVE_PREFERENCES_IN_RENDER_PERMISSION = "save-preferences-in-render-permission";
044: public static final String EXTENSION_ELEMENT = "extension-element";
045: public static final String DEPLOYMENT_EXTENSION = "deployment-extension";
046: public static final String SESSION_ENABLED = "session-enabled";
047: public static final String EVENTS = "events";
048: public static final String GENERATES_EVENTS = "generates-event";
049: public static final String CONSUMES_EVENTS = "consumes-event";
050: public static final String LISTENER = "listener";
051: public static final String LISTENER_CLASS = "listener-class";
052: public static final String PROVISION = "provision";
053: public static final String MEMBERSHIP = "membership";
054:
055: // Global variable
056: private List _sessionDisabledList = new ArrayList();
057: private boolean _savePerferencesPermission = false;
058: private Map _extensionProvisionListenerMap = new HashMap();
059: private Map _extensionMembershipListenerMap = new HashMap();
060:
061: private LinkedHashMap genMap = null;
062: private LinkedHashMap conMap = null;
063:
064: public DeploymentExtensionDescriptor(Logger logger) {
065: genMap = new LinkedHashMap();
066: conMap = new LinkedHashMap();
067: }
068:
069: public void load(Element element, Namespace namespace)
070: throws DeploymentDescriptorException {
071:
072: String permission = element.getChildTextTrim(
073: SAVE_PREFERENCES_IN_RENDER_PERMISSION, namespace);
074: if (permission != null && permission.equals("1")) {
075: _savePerferencesPermission = true;
076: }
077: List portletElements = element.getChildren(
078: PortletsDescriptor.PORTLET, namespace);
079: Iterator iterator = portletElements.iterator();
080: while (iterator.hasNext()) {
081: Element portletElement = (Element) iterator.next();
082: String portletName = portletElement.getChildTextTrim(
083: PortletDescriptor.PORTLET_NAME, namespace);
084: List depExtElements = portletElement.getChildren(
085: DEPLOYMENT_EXTENSION, namespace);
086: if (!depExtElements.isEmpty()) {
087: Iterator iterator1 = depExtElements.iterator();
088:
089: while (iterator1.hasNext()) {
090: Element depExtElement = (Element) iterator1.next();
091: List extensionElements = depExtElement.getChildren(
092: EXTENSION_ELEMENT, namespace);
093: String sessionEnabled = null;
094: boolean stop = false;
095: Iterator itor = extensionElements.iterator();
096:
097: while (itor.hasNext() && !stop) {
098: Element extensionElement = (Element) itor
099: .next();
100:
101: sessionEnabled = extensionElement
102: .getChildTextTrim(SESSION_ENABLED,
103: namespace);
104: // found sessionless definition, stop!
105: if (sessionEnabled != null) {
106: stop = true;
107: }
108:
109: }
110: if (sessionEnabled != null
111: && sessionEnabled.equals("0")) {
112: _sessionDisabledList.add(portletName);
113: }
114: }
115: }
116: //Parsing the sun-portlet.xml for getting the event registration info
117: //for portlets.
118: ArrayList consumesEvents = new ArrayList();
119: ArrayList generatesEvents = new ArrayList();
120: List evtElements = portletElement.getChildren(EVENTS,
121: namespace);
122: if (!evtElements.isEmpty()) {
123: Iterator itEvt = evtElements.iterator();
124: while (itEvt.hasNext()) {
125: Element evt = (Element) itEvt.next();
126: List genEvtElements = evt.getChildren(
127: GENERATES_EVENTS, namespace);
128: if (genEvtElements != null) {
129: for (Iterator i = genEvtElements.iterator(); i
130: .hasNext();) {
131: Element evtElement = (Element) i.next();
132: generatesEvents.add(evtElement
133: .getTextTrim());
134: }
135: }
136: List conEvtElements = evt.getChildren(
137: CONSUMES_EVENTS, namespace);
138: if (conEvtElements != null) {
139: for (Iterator i = conEvtElements.iterator(); i
140: .hasNext();) {
141: Element evtElement = (Element) i.next();
142: consumesEvents
143: .add(evtElement.getTextTrim());
144: }
145: }
146: }
147: }
148: genMap.put(portletName, generatesEvents);
149: conMap.put(portletName, consumesEvents);
150: }
151:
152: //
153: // Get all provision listeners
154: Element provisionElement = element.getChild(PROVISION,
155: namespace);
156:
157: if (provisionElement != null) {
158: List listenerElements = provisionElement.getChildren(
159: LISTENER, namespace);
160: Iterator listenerElementsIter = listenerElements.iterator();
161: while (listenerElementsIter.hasNext()) {
162: Element listenerElement = (Element) listenerElementsIter
163: .next();
164: String portletName = listenerElement.getChildTextTrim(
165: PortletDescriptor.PORTLET_NAME, namespace);
166:
167: List listeners = (List) _extensionProvisionListenerMap
168: .get(portletName);
169: if (listeners == null) {
170: listeners = new ArrayList();
171: }
172: listeners.add(listenerElement.getChildTextTrim(
173: LISTENER_CLASS, namespace));
174:
175: _extensionProvisionListenerMap.put(portletName,
176: listeners);
177: }
178: }
179:
180: // Get all membership listeners
181: Element membershipElement = element.getChild(MEMBERSHIP,
182: namespace);
183:
184: if (membershipElement != null) {
185: List listenerElements = membershipElement.getChildren(
186: LISTENER, namespace);
187: Iterator listenerElementsIter = listenerElements.iterator();
188: while (listenerElementsIter.hasNext()) {
189: Element listenerElement = (Element) listenerElementsIter
190: .next();
191: String portletName = listenerElement.getChildTextTrim(
192: PortletDescriptor.PORTLET_NAME, namespace);
193:
194: List listeners = (List) _extensionMembershipListenerMap
195: .get(portletName);
196: if (listeners == null) {
197: listeners = new ArrayList();
198: }
199: listeners.add(listenerElement.getChildTextTrim(
200: LISTENER_CLASS, namespace));
201:
202: _extensionMembershipListenerMap.put(portletName,
203: listeners);
204: }
205: }
206: }
207:
208: //Method to return the map of portlets-generated events
209: public LinkedHashMap getGeneratedEvents() {
210: return genMap;
211: }
212:
213: //Method to return the map of portlets-consume events
214: public LinkedHashMap getConsumeEvents() {
215: return conMap;
216: }
217:
218: /*
219: * For a given portlet name, find out whether the portlet uses session.
220: *
221: * @param portletName portlet name
222: * @return true if the portlet uses session, false otherwise
223: */
224: public boolean sessionEnabled(String portletName) {
225: boolean sessionEnabled = true;
226:
227: if (_sessionDisabledList.contains(portletName)) {
228: sessionEnabled = false;
229: }
230: return sessionEnabled;
231: }
232:
233: /*
234: * Returns whether the portlet app allows preferences values to be
235: * saved in the render method.
236: *
237: * @return true if preferences can be saved in the render method,
238: * false if not.
239: */
240: public boolean isSavePreferencesAllowed() {
241: return _savePerferencesPermission;
242: }
243:
244: public Map getProvisionListenerMap() {
245: return _extensionProvisionListenerMap;
246: }
247:
248: public Map getMembershipListenerMap() {
249: return _extensionMembershipListenerMap;
250: }
251:
252: public String toString() {
253: StringBuffer sb = new StringBuffer(
254: "DeploymentExtensionDescriptor ");
255:
256: Iterator iterator = _sessionDisabledList.iterator();
257: sb.append("[ portlets without session: ");
258:
259: while (iterator.hasNext()) {
260: sb.append((String) iterator.next()).append(", ");
261: }
262:
263: sb.append("]");
264:
265: sb.append("[ save preferences is allowed: ");
266: sb.append(_savePerferencesPermission);
267: sb.append(" ]");
268: sb.append("\n");
269: sb.append("[ ProvisionListenerMap:");
270: sb.append(getProvisionListenerMap());
271: sb.append(" ]");
272: sb.append("\n");
273: sb.append("[ MembershipListenerMap:");
274: sb.append(getMembershipListenerMap());
275: sb.append(" ]");
276:
277: return sb.toString();
278: }
279:
280: }
|