You are viewing a plain text version of this content. The canonical link for it is here.
Posted to pluto-dev@portals.apache.org by bl...@apache.org on 2004/02/09 16:42:16 UTC

cvs commit: jakarta-pluto/portal/src/java/org/apache/pluto/portalImpl/aggregation PortletFragment.java

blumm       2004/02/09 07:42:16

  Modified:    portal/src/java/org/apache/pluto/portalImpl/aggregation
                        PortletFragment.java
  Added:       portal/src/webapp/WEB-INF/aggregation
                        PortletFragmentFooter.jsp PortletFragmentHeader.jsp
  Log:
  Submitted by:	Nick Lothian/nl@essential.com.au
  
  Better customization of Pluto's portal by introduction of
  PortletFragmentFooter.jsp and PortletFragmentHeader.jsp
  
  Now
  1) All Portlet Modes are displayed (not just the non-active ones), but only
  the non-active ones have a link.
  2) All Window States are displayed (not just the non-active ones), but only
  the non-active ones have a link.
  3) There is a " | " between the Portlet Modes and the Window States.
  
  
  Revision  Changes    Path
  1.1                  jakarta-pluto/portal/src/webapp/WEB-INF/aggregation/PortletFragmentFooter.jsp
  
  Index: PortletFragmentFooter.jsp
  ===================================================================
  		</td>
  	</tr>
  </table>
  
  
  
  1.1                  jakarta-pluto/portal/src/webapp/WEB-INF/aggregation/PortletFragmentHeader.jsp
  
  Index: PortletFragmentHeader.jsp
  ===================================================================
  <jsp:useBean id="portletInfo" type="org.apache.pluto.portalImpl.aggregation.PortletFragment.PortletInfo" scope="request" />
  <table border='1' cellpadding='1' cellspacing='1' width='100%' height='90%'>
  	<tr>
  		<td bgcolor='#DDDDDD'>
  			<table border='0' cellpadding='0' cellspacing='0' width='100%' height='10px'>
  				<tr>
  					<td>
  						<I><b><%= portletInfo.getTitle() %></b></I>
  					</td>
  					<td align='right'>
  						<font size='-3'>
  							<%
  				            java.util.List modeList = portletInfo.getAvailablePortletModes();
  				            java.util.Collections.sort(modeList);
  				            for (java.util.Iterator iter = modeList.iterator(); iter.hasNext();) {
  								org.apache.pluto.portalImpl.aggregation.PortletFragment.PortletModeInfo modeInfo = (org.apache.pluto.portalImpl.aggregation.PortletFragment.PortletModeInfo) iter.next();
  								if (!modeInfo.isCurrent()) {
  									%>
  									<a href="<%=modeInfo.getUrl() %>">
  									<%
  								}
  
  								out.print(modeInfo.getName());
  
  								if (!modeInfo.isCurrent()) {
  									%>
  									</a>&nbsp;
  									<%
  								}
  							}
  							%>
  							<%
  							java.util.List windowStateList = portletInfo.getAvailablePortletWindowStates();
  							java.util.Collections.sort(windowStateList);
  
  							if (modeList.size() > 0 && windowStateList.size() > 0) {
  							%>
  								&nbsp;|&nbsp;
  							<%
  							}
  							for (java.util.Iterator iter = windowStateList.iterator(); iter.hasNext();) {
  								org.apache.pluto.portalImpl.aggregation.PortletFragment.PortletWindowStateInfo stateInfo = (org.apache.pluto.portalImpl.aggregation.PortletFragment.PortletWindowStateInfo) iter.next();
  								if (!stateInfo.isCurrent()) {
  									%>
  									<a href="<%=stateInfo.getUrl()%>">
  									<%
  								}
  								out.println(stateInfo.getLabel());
  								if (!stateInfo.isCurrent()) {
  									%>
  									</a>&nbsp;
  									<%
  								}
  							}
  							%>
  						</font>
  					</td>
  				</tr>
  			</table>
  		</td>
  	</tr>
  	<tr>
  		<td>
  
  
  
  
  
  1.3       +398 -189  jakarta-pluto/portal/src/java/org/apache/pluto/portalImpl/aggregation/PortletFragment.java
  
  Index: PortletFragment.java
  ===================================================================
  RCS file: /home/cvs/jakarta-pluto/portal/src/java/org/apache/pluto/portalImpl/aggregation/PortletFragment.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- PortletFragment.java	20 Jan 2004 09:30:10 -0000	1.2
  +++ PortletFragment.java	9 Feb 2004 15:42:16 -0000	1.3
  @@ -60,11 +60,14 @@
   import java.io.IOException;
   import java.io.PrintWriter;
   import java.io.StringWriter;
  +import java.util.ArrayList;
   import java.util.Iterator;
  +import java.util.List;
   
   import javax.portlet.PortletMode;
   import javax.portlet.UnavailableException;
   import javax.portlet.WindowState;
  +import javax.servlet.RequestDispatcher;
   import javax.servlet.ServletConfig;
   import javax.servlet.ServletException;
   import javax.servlet.http.HttpServletRequest;
  @@ -94,209 +97,415 @@
   import org.apache.pluto.portalImpl.util.ObjectID;
   import org.apache.pluto.services.information.DynamicInformationProvider;
   import org.apache.pluto.services.information.PortalContextProvider;
  +import org.apache.pluto.services.log.Log;
   
  -
  +/**
  + * <p>Responsible for rendering a single Portlet.<p>
  + *
  + * <p>Requires two JSP files to exist, PortletFragmentHeader.jsp
  + * and PortletFragmentFooter.jsp. These pages define the header
  + * and footer of the portlet.</p>
  + *
  + * <p>A PortletFragment.PortletInfo object is added to the request
  + * attributes and makes information about the Portlet available to the
  + * header and footer JSP pages.</p>
  + *
  + * @author Stephan Hesmer
  + * @author Nick Lothian
  + *
  + */
   public class PortletFragment extends AbstractFragmentSingle {
  -
  +    
       private PortletWindow portletWindow = null;
   
  -    public PortletFragment(String id,
  -                           ServletConfig config, 
  +    public static final String PORTLET_ERROR_MSG = "Error occurred in portlet!";
  +
  +	public PortletFragment(String id,
  +                           ServletConfig config,
                              org.apache.pluto.portalImpl.aggregation.Fragment parent,
                              org.apache.pluto.portalImpl.om.page.Fragment fragDesc,
                              org.apache.pluto.portalImpl.aggregation.navigation.Navigation navigation)
  -            throws Exception 
  +            throws Exception
       {
  -        super(id, config, parent, fragDesc, navigation);           
  -        String portletEntityId = getInitParameters().getString("portlet");               
  -        PortletEntity portletEntity = PortletEntityRegistry.getPortletEntity(ObjectID.createFromString(portletEntityId));
  -        portletWindow = new PortletWindowImpl(getId());                
  -        ((PortletWindowCtrl)portletWindow).setPortletEntity(portletEntity);
  -        PortletWindowList windowList = portletEntity.getPortletWindowList();        
  -        ((PortletWindowListCtrl)windowList).add(portletWindow);        
  -    }
  +		super(id, config, parent, fragDesc, navigation);
  +		String portletEntityId = getInitParameters().getString("portlet");
  +		PortletEntity portletEntity = PortletEntityRegistry.getPortletEntity(ObjectID.createFromString(portletEntityId));
  +		portletWindow = new PortletWindowImpl(getId());
  +		((PortletWindowCtrl) portletWindow).setPortletEntity(portletEntity);
  +		PortletWindowList windowList = portletEntity.getPortletWindowList();
  +		((PortletWindowListCtrl) windowList).add(portletWindow);
  +	}
   
  -    public void service(HttpServletRequest request, HttpServletResponse response)
  +	public void service(HttpServletRequest request, HttpServletResponse response)
               throws ServletException, IOException
       {
  -        HttpServletRequest wrappedRequest = ServletObjectAccess.getServletRequest(request,portletWindow);
  +		HttpServletRequest wrappedRequest = ServletObjectAccess.getServletRequest(request, portletWindow);
  +		PrintWriter responseWriter = response.getWriter();
  +		StringWriter storedWriter = new StringWriter();
  +
  +		// load the Portlet
  +		// If there is an error loading, then we will save the error message and attempt
  +		// to render it inside the Portlet, so the Portal has a chance of still looking
  +		// okay
  +		String errorMsg = null;
  +		try {
  +			PortletContainerFactory.getPortletContainer().portletLoad(portletWindow, wrappedRequest, response);
  +		} catch (PortletContainerException e) {
  +			Log.error("Error in Portlet", e);
  +			errorMsg = getErrorMsg();
  +		} catch (Throwable t) {
  +			// If we catch any throwable, we want to try to continue
  +			// so that the rest of the portal renders correctly
  +			Log.error("Error in Portlet", t);
  +			if (t instanceof VirtualMachineError) {
  +				// if the Throwable is a VirtualMachineError then
  +				// it is very unlikely (!) that the portal is going
  +				// to render correctly.
  +				throw (Error) t;
  +			} else {
  +				errorMsg = getErrorMsg();
  +			}
  +
  +		}
  +
  +		PortalEnvironment env = (PortalEnvironment) request.getAttribute(PortalEnvironment.REQUEST_PORTALENV);
  +		PortalURL thisURL = env.getRequestedPortalURL();
  +
  +		PortalControlParameter thisControl = new PortalControlParameter(thisURL);
  +		if (thisControl.isOnePortletWindowMaximized()) {
  +			WindowState currentState = thisControl.getState(portletWindow);
  +			if (!WindowState.MAXIMIZED.equals(currentState)) {
  +				return;
  +			}
  +		}
  +
  +		PortletDefinition portletDefinition = portletWindow.getPortletEntity().getPortletDefinition();
  +		LanguageSet languageSet = portletDefinition.getLanguageSet();
  +		Language lang = languageSet.get(request.getLocale());
  +		String title = lang != null ? lang.getTitle() : "no title available";
  +
  +		// create a PortletInfo object. This is used to communicate with
  +		// the header and footer JSP pages for this portlet
  +		PortletInfo portletInfo = new PortletInfo();
  +
  +		if (!portletWindow.getPortletEntity().getPortletDefinition().getServletDefinition().isUnavailable()) {
  +			PrintWriter writer2 = new PrintWriter(storedWriter);
  +
  +			// create a wrapped response which the Portlet will be rendered to
  +			HttpServletResponse wrappedResponse = ServletObjectAccess.getStoredServletResponse(response, writer2);
  +
  +			try {
  +				// render the Portlet to the wrapped response, to be output later.
  +				PortletContainerFactory.getPortletContainer().renderPortlet(portletWindow, wrappedRequest, wrappedResponse);
  +			} catch (UnavailableException e) {
  +				Log.error("Portlet is Unavailable", e);
  +				writer2.println("the portlet is currently unavailable!");
  +
  +				ServletDefinitionCtrl servletDefinitionCtrl = (ServletDefinitionCtrl) ControllerObjectAccess.get(portletWindow.getPortletEntity().getPortletDefinition().getServletDefinition());
  +				if (e.isPermanent()) {
  +					servletDefinitionCtrl.setAvailable(Long.MAX_VALUE);
  +				} else {
  +					int unavailableSeconds = e.getUnavailableSeconds();
  +					if (unavailableSeconds <= 0) {
  +						unavailableSeconds = 60; // arbitrary default
  +					}
  +					servletDefinitionCtrl.setAvailable(System.currentTimeMillis() + unavailableSeconds * 1000);
  +				}
  +			} catch (Exception e) {
  +				Log.error("Error in Portlet", e);
  +				writer2.println(getErrorMsg());
  +			}
  +			String dyn_title = ((DynamicTitleServiceImpl) FactoryAccess.getDynamicTitleContainerService()).getDynamicTitle(portletWindow, request);
  +			if (dyn_title != null) {
  +				title = dyn_title;
  +			}
  +
  +		}
  +		// set the title, so the header JSP page can use it when rendering
  +		portletInfo.setTitle(title);
  +
  +		DynamicInformationProvider provider = FactoryAccess.getDynamicProvider(request);
  +		ContentType supported = portletDefinition.getContentTypeSet().get(wrappedRequest.getContentType());
  +		PortalContextProvider portalContextProvider = FactoryAccess.getStaticProvider().getPortalContextProvider();
  +
  +		// get the list of modes this Portlet supports
  +		if (supported != null && portalContextProvider != null) {
  +			// if portlet supports portlet modes
  +			Iterator modes = supported.getPortletModes();
  +			while (modes.hasNext()) {
  +				PortletMode mode = (PortletMode) modes.next();
  +
  +				// check whether portal also supports portlet mode
  +				boolean portalSupport = false;
  +				Iterator portalSupportedModes = portalContextProvider.getSupportedPortletModes().iterator();
  +				while (portalSupportedModes.hasNext()) {
  +					PortletMode portalSupportedMode = (PortletMode) portalSupportedModes.next();
  +					if (mode.equals(portalSupportedMode)) {
  +						portalSupport = true;
  +						break;
  +					}
  +				}
  +
  +				// create links for portlet modes in portlet header
  +				if (portalSupport) {
  +					env = (PortalEnvironment) request.getAttribute(PortalEnvironment.REQUEST_PORTALENV);
  +					PortalURL modeURL = env.getRequestedPortalURL();
  +
  +					PortalControlParameter control = new PortalControlParameter(modeURL);
  +					PortletMode currentMode = control.getMode(portletWindow);
  +					control.setMode(portletWindow, mode);
  +
  +					portletInfo.addPortletMode(mode, modeURL.toString(control, new Boolean(request.isSecure())), mode.equals(currentMode));
  +				}
  +			}
  +
  +			// get the list of window states this Portlet supports
  +			Iterator states = portalContextProvider.getSupportedWindowStates().iterator();
  +			while (states.hasNext()) {
  +				WindowState state = (WindowState) states.next();
  +				env = (PortalEnvironment) request.getAttribute(PortalEnvironment.REQUEST_PORTALENV);
  +				PortalURL stateURL = env.getRequestedPortalURL();
  +				PortalControlParameter control = new PortalControlParameter(stateURL);
  +				WindowState currentState = control.getState(portletWindow);
  +
  +				control.setState(portletWindow, state);
  +				portletInfo.addPortletWindowState(state.toString().substring(0, 3), stateURL.toString(control, new Boolean(request.isSecure())), state.equals(currentState));
  +			}
  +		}
  +		// output the header JSP page
  +		request.setAttribute("portletInfo", portletInfo);
  +		RequestDispatcher rd = getServletConfig().getServletContext().getRequestDispatcher(BASE_ROOT + "PortletFragmentHeader.jsp");
  +		rd.include(request, response);
  +		try {
  +			// output the Portlet
  +			// check if there is an error message
  +			if (errorMsg == null) {
  +				// no error message, so output the Portlet
  +				if (portletWindow.getPortletEntity().getPortletDefinition().getServletDefinition().isUnavailable()) {
  +					// the portlet is unavailable
  +					responseWriter.println("the portlet is currently unavailable!");
  +				} else {
  +					responseWriter.println(storedWriter.toString());
  +				}
  +			} else {
  +				// output the errror message
  +				responseWriter.println(errorMsg);
  +			}
  +		} finally {
  +			// output the footer JSP page
  +			RequestDispatcher rdFooter = getServletConfig().getServletContext().getRequestDispatcher(BASE_ROOT + "PortletFragmentFooter.jsp");
  +			rdFooter.include(request, response);
  +			request.removeAttribute("portletInfo");
  +		}
  +
  +	}
  +
  +	public void createURL(PortalURL url) {
  +		getParent().createURL(url);
  +		url.addLocalNavigation(getId());
  +	}
  +
  +	public boolean isPartOfURL(PortalURL url) {
  +		return true;
  +	}
  +
  +	public PortletWindow getPortletWindow() {
  +		return portletWindow;
  +	}
  +
  +	public class PortletInfo {
  +		private String title;
  +		private List availablePortletModes = new ArrayList();
  +		private List availablePortletWindowStates = new ArrayList();
  +
  +		/**
  +		 * @return
  +		 */
  +		public String getTitle() {
  +			return title;
  +		}
  +
  +		/**
  +		 * @param string
  +		 */
  +		public void setTitle(String string) {
  +			title = string;
  +		}
  +
  +		/**
  +		 * @return
  +		 */
  +		public List getAvailablePortletModes() {
  +			return availablePortletModes;
  +		}
  +
  +		public void addPortletMode(PortletMode mode, String activationURL, boolean isCurrent) {
  +			PortletModeInfo pmi = new PortletModeInfo(mode.toString(), activationURL, isCurrent);
  +			availablePortletModes.add(pmi);
  +		}
  +
  +		/**
  +		 * @return
  +		 */
  +		public List getAvailablePortletWindowStates() {
  +			return availablePortletWindowStates;
  +		}
  +
  +		public void addPortletWindowState(String stateLabel, String activationURL, boolean isCurrent) {
  +			PortletWindowStateInfo pwsi = new PortletWindowStateInfo(stateLabel, activationURL, isCurrent);
  +			availablePortletWindowStates.add(pwsi);
  +		}
  +
  +	}
  +
  +	public class PortletWindowStateInfo implements Comparable {
  +		private String label;
  +		private String url;
  +		private boolean isCurrent;
  +
  +		/**
  +		 * @see java.lang.Comparable#compareTo(java.lang.Object)
  +		 */
  +		public int compareTo(Object compare) {
  +			if (!(compare instanceof PortletWindowStateInfo)) {
  +				throw new ClassCastException(compare + " is not a " + PortletWindowStateInfo.class.getName());
  +			} else {
  +				PortletWindowStateInfo other = (PortletWindowStateInfo) compare;
  +				return this.getLabel().compareTo(other.getLabel());
  +			}
  +		}
  +		/**
  +		 * @param stateLabel
  +		 * @param activationURL
  +		 * @param isCurrent
  +		 */
  +		public PortletWindowStateInfo(String stateLabel, String activationURL, boolean isCurrent) {
  +			this.label = stateLabel;
  +			this.url = activationURL;
  +			this.isCurrent = isCurrent;
  +		}
  +		/**
  +		 * @return
  +		 */
  +		public String getLabel() {
  +			return label;
  +		}
  +
  +		/**
  +		 * @param string
  +		 */
  +		public void setLabel(String string) {
  +			label = string;
  +		}
  +
  +		/**
  +		 * @return
  +		 */
  +		public boolean isCurrent() {
  +			return isCurrent;
  +		}
  +
  +		/**
  +		 * @return
  +		 */
  +		public String getUrl() {
  +			return url;
  +		}
  +
  +		/**
  +		 * @param b
  +		 */
  +		public void setCurrent(boolean b) {
  +			isCurrent = b;
  +		}
  +
  +		/**
  +		 * @param string
  +		 */
  +		public void setUrl(String string) {
  +			url = string;
  +		}
  +
  +		public String toString() {
  +			return getLabel();
  +		}
  +
  +	}
  +
  +	public class PortletModeInfo implements Comparable {
  +		private String name;
  +		private String url;
  +		private boolean isCurrent;
  +
  +		public PortletModeInfo(String name, String url, boolean isCurrent) {
  +			this.name = name;
  +			this.url = url;
  +			this.isCurrent = isCurrent;
  +		}
  +
  +		/**
  +		 * @return
  +		 */
  +		public boolean isCurrent() {
  +			return isCurrent;
  +		}
  +
  +		/**
  +		 * @return
  +		 */
  +		public String getName() {
  +			return name;
  +		}
  +
  +		/**
  +		 * @return
  +		 */
  +		public String getUrl() {
  +			return url;
  +		}
  +
  +		/**
  +		 * @param b
  +		 */
  +		public void setCurrent(boolean b) {
  +			isCurrent = b;
  +		}
  +
  +		/**
  +		 * @param string
  +		 */
  +		public void setName(String string) {
  +			name = string;
  +		}
  +
  +		/**
  +		 * @param string
  +		 */
  +		public void setUrl(String string) {
  +			url = string;
  +		}
  +
  +		/**
  +		 * @see java.lang.Comparable#compareTo(java.lang.Object)
  +		 */
  +		public int compareTo(Object compare) {
  +			if (!(compare instanceof PortletModeInfo)) {
  +				throw new ClassCastException(compare + " is not a " + PortletModeInfo.class.getName());
  +			} else {
  +				PortletModeInfo other = (PortletModeInfo) compare;
  +				return this.getName().compareTo(other.getName());
  +			}
  +		}
  +
  +		public String toString() {
  +			return getName();
  +		}
  +	}
   
  -        try {
  -            PortletContainerFactory.
  -            getPortletContainer().
  -            portletLoad(portletWindow, wrappedRequest, response);
  -        } catch (PortletContainerException e) {
  -            e.printStackTrace(System.err);
  -        } catch (Throwable t) {
  -            t.printStackTrace(System.err);
  -        }
  -
  -        PortalEnvironment env = (PortalEnvironment)request.getAttribute(PortalEnvironment.REQUEST_PORTALENV);
  -        PortalURL thisURL = env.getRequestedPortalURL();
  -
  -        PortalControlParameter thisControl = new PortalControlParameter(thisURL);
  -        if (thisControl.isOnePortletWindowMaximized()) {
  -            WindowState currentState = thisControl.getState(portletWindow);
  -            if (!WindowState.MAXIMIZED.equals(currentState)) {
  -                return;
  -            }
  -        }
  -
  -        PrintWriter writer = response.getWriter();
  -        writer.println("<a name="+thisURL.getLocalNavigationAsString()+"></a>");
  -        PortletDefinition portletDefinition = portletWindow.getPortletEntity().getPortletDefinition();
  -        writer.println("<table border='1' cellpadding='1' cellspacing='1' width='100%' height='100%'>");
  -        writer.println("<tr><td bgcolor='#DDDDDD'>");
  -        // output title
  -        writer.println("<table border='0' cellpadding='0' cellspacing='0' width='100%' height='100%'>");
  -        writer.println("<tr><td>"); //width='70%'
  -
  -        LanguageSet languageSet = portletDefinition.getLanguageSet();
  -        Language lang = languageSet.get(request.getLocale());
  -        String title = lang != null ? lang.getTitle()
  -                                    : "no title available";
  -
  -        // get dynamic title
  -        StringWriter storedWriter = new StringWriter();
  -        
  -        if (!portletWindow.getPortletEntity().getPortletDefinition().getServletDefinition().isUnavailable())
  -        {
  -            PrintWriter writer2 = new PrintWriter(storedWriter);
  -            
  -            HttpServletResponse wrappedResponse = 
  -                ServletObjectAccess.getStoredServletResponse(response, writer2);
  -                        
  -            try {
  -                PortletContainerFactory.getPortletContainer().renderPortlet(portletWindow, wrappedRequest, wrappedResponse);
  -            } catch (PortletContainerException e) {
  -                e.printStackTrace(System.err);
  -                writer2.println("error occured in portlet!");
  -            } catch (UnavailableException e) {
  -                e.printStackTrace(System.err);
  -                writer2.println("the portlet is currently unavailable!");
  -                
  -                ServletDefinitionCtrl servletDefinitionCtrl = (ServletDefinitionCtrl)ControllerObjectAccess.get(portletWindow.getPortletEntity().getPortletDefinition().getServletDefinition());
  -                if (e.isPermanent()) {
  -                    servletDefinitionCtrl.setAvailable(Long.MAX_VALUE);
  -                } else {
  -                    int unavailableSeconds = e.getUnavailableSeconds();
  -                    if (unavailableSeconds <= 0) {
  -                        unavailableSeconds = 60; // arbitrary default
  -                    }
  -                    servletDefinitionCtrl.setAvailable(System.currentTimeMillis() + unavailableSeconds * 1000);
  -                }
  -            } catch (Throwable t) {
  -                t.printStackTrace(System.err);
  -                writer2.println("error occured in portlet!");
  -            }
  -            
  -            String dyn_title = 
  -            ((DynamicTitleServiceImpl)FactoryAccess.getDynamicTitleContainerService()).getDynamicTitle(portletWindow, request);            
  -            if (dyn_title!=null) title = dyn_title;            
  -        }                           
  -
  -        writer.println("<I><b>" + title + "</b></I>");
  -        writer.println("</td><td align='right'><font size='-3'>");
  -
  -        DynamicInformationProvider provider = FactoryAccess.getDynamicProvider(request);
  -        ContentType supported = portletDefinition.getContentTypeSet().get(wrappedRequest.getContentType());
  -        PortalContextProvider portalContextProvider = FactoryAccess.getStaticProvider().getPortalContextProvider();
  -
  -        if (supported != null && portalContextProvider != null) {
  -            // if portlet supports portlet modes
  -            Iterator modes = supported.getPortletModes();
  -            while (modes.hasNext()) {
  -                PortletMode mode = (PortletMode)modes.next();
  -
  -                // check whether portal also supports portlet mode
  -                boolean portalSupport = false;
  -                Iterator portalSupportedModes = portalContextProvider.getSupportedPortletModes().iterator();
  -                while (portalSupportedModes.hasNext()) {
  -                    PortletMode portalSupportedMode = (PortletMode)portalSupportedModes.next();
  -                    if (mode.equals(portalSupportedMode)) {
  -                        portalSupport = true;
  -                        break;
  -                    }
  -                }
  -
  -                // create links for portlet modes in portlet header
  -                if (portalSupport) {
  -                    env = (PortalEnvironment) request.getAttribute(PortalEnvironment.REQUEST_PORTALENV);
  -                    PortalURL modeURL = env.getRequestedPortalURL();
  -
  -                    PortalControlParameter control = new PortalControlParameter(modeURL);
  -                    PortletMode currentMode = control.getMode(portletWindow);
  -                    if (!mode.equals(currentMode)) {
  -                        control.setMode(portletWindow, mode);
  -                        writer.println("<a href='"+modeURL.toString(control,new Boolean(request.isSecure()))+"'>"+mode+"</a>&nbsp;");
  -                    }
  -                }
  -            }
  -
  -            // create links for window states in portlet header
  -            Iterator states = portalContextProvider.getSupportedWindowStates().iterator();
  -            while (states.hasNext()) {
  -                WindowState state = (WindowState)states.next();
  -                env = (PortalEnvironment) request.getAttribute(PortalEnvironment.REQUEST_PORTALENV);
  -                PortalURL stateURL = env.getRequestedPortalURL();
  -                PortalControlParameter control = new PortalControlParameter(stateURL);
  -                WindowState currentState = control.getState(portletWindow);
  -                if (!state.equals(currentState)) {
  -                    control.setState(portletWindow, state);
  -                    writer.println("<a href='"+stateURL.toString(control,new Boolean(request.isSecure()))+"'>"+state.toString().substring(0,3)+"</a>&nbsp;");
  -                }
  -            }
  -        }
  -        writer.println("</font></td></tr>");
  -        writer.println("</table>");
  -        // output body
  -        writer.println("</td></tr>");
  -        writer.println("<tr><td>");
  -        if (portletWindow.getPortletEntity().getPortletDefinition().getServletDefinition().isUnavailable()) {
  -            writer.println("the portlet is currently unavailable!");
  -        } else {
  -            writer.println(storedWriter.toString());
  -/*            
  -            try {
  -                PortletContainerFactory.getPortletContainer().renderPortlet(portletWindow, wrappedRequest, response);
  -            } catch (PortletContainerException e) {
  -                e.printStackTrace(System.err);
  -                writer.println("error occured in portlet!");
  -            } catch (UnavailableException e) {
  -                e.printStackTrace(System.err);
  -                writer.println("the portlet is currently unavailable!");
  -                ServletDefinitionCtrl servletDefinitionCtrl = (ServletDefinitionCtrl)ControllerObjectAccess.get(portletWindow.getPortletEntity().getPortletDefinition().getServletDefinition());
  -                if (e.isPermanent()) {
  -                    servletDefinitionCtrl.setAvailable(Long.MAX_VALUE);
  -                } else {
  -                    int unavailableSeconds = e.getUnavailableSeconds();
  -                    if (unavailableSeconds <= 0) {
  -                        unavailableSeconds = 60; // arbitrary default
  -                    }
  -                    servletDefinitionCtrl.setAvailable(System.currentTimeMillis() + unavailableSeconds * 1000);
  -                }
  -            } catch (Throwable t) {
  -                t.printStackTrace(System.err);
  -                writer.println("error occured in portlet!");
  -            }
  -*/            
  -        }
  -        writer.println("</td></tr>");
  -        writer.println("</table>");
  +    protected String getErrorMsg() {
  +        return PORTLET_ERROR_MSG;
       }
   
  -    public void createURL(PortalURL url)
  -    {
  -        getParent().createURL(url);
  -        url.addLocalNavigation(getId());
  -    }
   
  -    public boolean isPartOfURL(PortalURL url)
  -    {
  -        return true;
  -    }
   
  -    public PortletWindow getPortletWindow() {
  -        return portletWindow;
  -    }
   }