/* * Copyright 2000-2001,2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jetspeed.portal.controls; import java.util.Enumeration; import java.util.Iterator; import java.util.Vector; // Jetspeed imports import org.apache.jetspeed.om.registry.PortletControlEntry; import org.apache.jetspeed.om.registry.MediaTypeEntry; import org.apache.jetspeed.om.security.JetspeedUser; import org.apache.jetspeed.portal.Portlet; import org.apache.jetspeed.portal.PortletState; import org.apache.jetspeed.portal.PortletConfig; import org.apache.jetspeed.portal.PortletSet; import org.apache.jetspeed.portal.PortletControl; import org.apache.jetspeed.portal.PortletControlConfig; import org.apache.jetspeed.portal.PortletController; import org.apache.jetspeed.portal.PortletException; import org.apache.jetspeed.portal.portlets.AbstractPortlet; import org.apache.jetspeed.portal.security.portlets.PortletWrapper; import org.apache.jetspeed.services.Registry; import org.apache.jetspeed.services.JetspeedSecurity; import org.apache.jetspeed.util.MimeType; import org.apache.jetspeed.services.resources.JetspeedResources; // Turbine imports import org.apache.turbine.util.RunData; // ECS imports import org.apache.ecs.ElementContainer; import org.apache.ecs.ConcreteElement; import org.apache.ecs.StringElement; /** * The PortletControl acts both as a decoration around a Portlet or PortletSet * and also as the window manager for the enclosed Portlet(Set). * As such it controls the operation that may be performed on this portlet * and whether the portlet content should be displayed or not. * PortletControl also delegates all Portlet and PortletSet methods to its * inner object and can thus be transparently cascaded or substituted to * a simple portlet wherever in a PSML object tree. * * @author <a href="mailto:raphael@apache.org">Rapha謖 Luta</a> * @author <a href="mailto:sgala@apache.org">Santiago Gala</a> * @version $Id: AbstractPortletControl.java,v 1.22 2004/03/29 21:16:27 taylor Exp $ */ public abstract class AbstractPortletControl extends AbstractPortlet implements PortletControl { public static final String COLOR = "#CCCCCC"; public static final String BACKGROUND_COLOR = "#FFFFFF"; public static final String TITLE_COLOR = "#DDDDDD"; public static final String WIDTH = "100%"; private Portlet portlet = null; private PortletControlConfig conf = null; // PortletControl specifc interface /** * @return the PortletControl specific configuration */ public PortletControlConfig getConfig() { return this.conf; } /** * Sets the PortletControl specific configuration * @param conf the new PortletControl configuration */ public void setConfig(PortletControlConfig conf) { this.conf=conf; } /** * Sets the portlet to be managed by this control * * @param portlet the new portlet to be managed by the control */ public void setPortlet(Portlet portlet) { this.portlet=portlet; } /** * Retrieves the portlet managed by this control * @return the portlet object managed or null */ public Portlet getPortlet() { return this.portlet; } /** * Initializes the control and associates it with a portlet * * @param portlet the portlet to be managed by this control */ public void init( Portlet portlet ) { this.setPortlet( portlet ); } /** * Returns the color to use for displaying the portlet text * * This method is deprecated and is only useful for ECS * based Control implementation * @deprecated * @return the text color value in HTML format (#RRGGBB) */ public String getColor() { return getPortlet().getPortletConfig().getPortletSkin().getTextColor(); } /** * Sets the color to use for displaying the portlet text * * This method is deprecated and is only useful for ECS * based Control implementation * @deprecated * @param color the text color value in HTML format (#RRGGBB) */ public void setColor(String color) { getPortlet().getPortletConfig().getPortletSkin().setTextColor( color ); } /** * Returns the color to use for displaying the portlet background * * This method is deprecated and is only useful for ECS * based Control implementation * @deprecated * @return the text color value in HTML format (#RRGGBB) */ public String getBackgroundColor() { return getPortlet().getPortletConfig().getPortletSkin().getBackgroundColor(); } /** * Sets the color to use for displaying the portlet background * * This method is deprecated and is only useful for ECS * based Control implementation * @deprecated * @param backgroundColor the background color value in HTML format (#RRGGBB) */ public void setBackgroundColor(String backgroundColor) { getPortlet().getPortletConfig().getPortletSkin().setBackgroundColor( backgroundColor ); } /** * Returns the color to use for displaying the portlet title * * This method is deprecated and is only useful for ECS * based Control implementation * @deprecated * @return the text color value in HTML format (#RRGGBB) */ public String getTitleColor() { return getPortlet().getPortletConfig().getPortletSkin().getTitleBackgroundColor(); } /** * Sets the color to use for displaying the portlet title * * This method is deprecated and is only useful for ECS * based Control implementation * @deprecated * @param titleColor the title color value in HTML format (#RRGGBB) */ public void setTitleColor(String titleColor) { getPortlet().getPortletConfig().getPortletSkin().setTitleBackgroundColor( titleColor ); } /** * Returns the width of the managed portlet relative to the size of * portlet control. * This method is deprecated and is only useful for ECS * based Control implementation * @deprecated * @return the size value. May be expressed in percentages (eg, "80%") */ public String getWidth() { return getPortlet().getPortletConfig().getSkin( "width", WIDTH ); } /** * Sets the width of the managed portlet relative to the size of * portlet control. * * This method is deprecated and is only useful for ECS * based Control implementation * @deprecated * @param width the width of portlet. Must be a positive, non nul integer */ public void setWidth(int width) { getPortlet().getPortletConfig().setSkin( "width", String.valueOf(width) ); } /** * Sets the width of the managed portlet relative to the size of * portlet control. * * This method is deprecated and is only useful for ECS * based Control implementation * @deprecated * @param width the width of portlet. Must be parseable as a positive, non * nul integer or a percentage */ public void setWidth(String width) { getPortlet().getPortletConfig().setSkin( "width", width ); } // Portlet interface implementation, delegates everything // to the managed portlet /** * @return the inner portlet config object */ public PortletConfig getPortletConfig() { if (getPortlet()==null) return null; return getPortlet().getPortletConfig(); } /** * Updates the managed portlet config object * * @param portletConfig the new portet config object */ public void setPortletConfig(PortletConfig portletConfig) { if (getPortlet()==null) return; getPortlet().setPortletConfig(portletConfig); } /** * @return the inner portlet name */ public String getName() { if (getPortlet()==null) return null; return getPortlet().getName(); } /** * Updates the managed portlet name * * @param name the new portet name */ public void setName(String name) { if (getPortlet()!=null) getPortlet().setName(name); } /** * @return the inner portlet title */ public String getTitle() { if (getPortlet()==null) return null; return getPortlet().getTitle(); } /** * Set the title for the inner portlet * * @param title the new portlet title */ public void setTitle( String title ) { if (getPortlet()!=null) getPortlet().setTitle(title); } /** * @return the inner portlet description */ public String getDescription() { if (getPortlet()==null) return null; return getPortlet().getDescription(); } /** * Set the description for the inner portlet * * @param description the new portlet description */ public void setDescription( String description ) { if (getPortlet()!=null) getPortlet().setDescription(description); } /** * Inits the inner portlet */ public void init() throws PortletException { if (getPortlet()!=null) getPortlet().init(); } /** * Returns the content of inner portlet * * @param rundata the RunData for the request */ public ConcreteElement getContent(RunData rundata) { Portlet portlet = getPortlet(); if (portlet == null) { return new ElementContainer(); } // Check to see if the portlet allows view // If the current security context disallows view, // do not display the portlet OR the control decorator if (portlet instanceof PortletWrapper) { PortletWrapper wrapper = (PortletWrapper)portlet; if (!wrapper.getAllowView(rundata)) { if (JetspeedResources.getBoolean("defaultportletcontrol.hide.decorator", true)) { return new StringElement(""); } } } return portlet.getContent( rundata ); } /** @see Portlet#supportsType */ public boolean supportsType( MimeType mimeType ) { boolean allowed = true; if (getPortlet()!=null) { allowed = getPortlet().supportsType( mimeType ); } // the inner portlet does not support the type, return immediately... if (allowed) { // we now need to check that the control also supports the type... PortletControlEntry entry = (PortletControlEntry)Registry.getEntry(Registry.PORTLET_CONTROL, getConfig().getName() ); String baseType = mimeType.toString(); if (entry!=null) { Iterator i = entry.listMediaTypes(); while(i.hasNext()) { String name = (String)i.next(); MediaTypeEntry media = (MediaTypeEntry)Registry.getEntry(Registry.MEDIA_TYPE, name); if (media != null) { if (baseType.equals(media.getMimeType())) { allowed = true; break; } } } } } return allowed; } // delegate the portletSet interface to the stored PortletSet // or emulate a 1-element portletSet /** * @return the size of the inner portletSet, 1 if the inner portlet * is not a set, or 0 if there's no inner portlet */ public int size() { if (getPortlet() instanceof PortletSet) return ((PortletSet)getPortlet()).size(); return ((getPortlet()==null)?0:1); } /** * @return an array of portlet contained within the inner PortletSet * or the inner portlet */ public Portlet[] toArray() { if (getPortlet() instanceof PortletSet) return ((PortletSet)getPortlet()).toArray(); Portlet[] p = new Portlet[1]; p[0]=getPortlet(); return p; } /** * Returns the Portlet at the given position if the control manages * a PortletSet, else the inner portlet if the queried position is 0 * * @param pos the queried position. Must be strictly smaller than the * value of size() * @return the portlet object stored at this position */ public Portlet getPortletAt(int pos) { if (getPortlet() instanceof PortletSet) return ((PortletSet)getPortlet()).getPortletAt(pos); if (pos==0) return getPortlet(); else return null; } /** * Returns the elements contained within the inner PortletSet or the * inner portlet * * @return an enumeration of portlets */ public Enumeration getPortlets() { if (getPortlet() instanceof PortletSet) return ((PortletSet)getPortlet()).getPortlets(); Vector v = new Vector(); if (getPortlet()!=null) v.addElement(getPortlet()); return v.elements(); } /** * Adds a portlet to the inner portletSet * * @param portlet the portlet to add */ public synchronized void addPortlet(Portlet portlet) { if (getPortlet() instanceof PortletSet) ((PortletSet)getPortlet()).addPortlet(portlet); } /** * Adds a portlet to the inner portletSet at the explicit position * * @param portlet the portlet to add * @param position the position of the new portlet */ public synchronized void addPortlet(Portlet portlet, int position) { if (getPortlet() instanceof PortletSet) ((PortletSet)getPortlet()).addPortlet(portlet,position); } /** * Adds a portlet to the inner portletSet within the given constraints * * @param portlet the portlet to add * @param constraints the portlet layout constraints */ public synchronized void addPortlet(Portlet portlet, PortletSet.Constraints constraints) { if (getPortlet() instanceof PortletSet) ((PortletSet)getPortlet()).addPortlet(portlet,constraints); } /** * Adds a portlet to the inner portletSet within the given constraints at the * specific position * * @param portlet the portlet to add * @param constraint the portlet layout constraints * @param position the portlet required position */ public synchronized void addPortlet(Portlet portlet, PortletSet.Constraints constraint, int position) { if (getPortlet() instanceof PortletSet) ((PortletSet)getPortlet()).addPortlet(portlet,constraint,position); } /** * @return the controller for the inner portletSet or null */ public PortletController getController() { if (getPortlet() instanceof PortletSet) return ((PortletSet)getPortlet()).getController(); return null; } /** * Sets the controller for the inner PortletSet. Has no effect if their * is no inner portletSet * * @parama controller the new controller for the inner portletSet */ public synchronized void setController(PortletController controller) { if (getPortlet() instanceof PortletSet) ((PortletSet)getPortlet()).setController(controller); } // Delegate PortletState Interface /** * Implements the default close behavior: any authenticated user may * remove a portlet from his page * * @param rundata the RunData object for the current request */ public boolean allowClose( RunData rundata ) { Portlet p = getPortlet(); if (p==null) return false; if ((p instanceof PortletSet) ||(JetspeedSecurity.checkPermission((JetspeedUser) rundata.getUser(), p, JetspeedSecurity.PERMISSION_CLOSE))) { if (p instanceof PortletState) { return ((PortletState)p).allowClose(rundata); } } return false; } /** * Returns true if this portlet is currently closed */ public boolean isClosed(RunData rundata) { Portlet p = getPortlet(); if ( (p!=null) && (p instanceof PortletState) ) { return ((PortletState)p).isClosed(rundata); } return false; } /** * Toggles the portlet state between closed and normal * * @param minimized the new portlet state * @param data the RunData for this request */ public void setClosed(boolean close, RunData rundata) { Portlet p = getPortlet(); if ( (p!=null) && (p instanceof PortletState) ) { ((PortletState)p).setClosed(close, rundata); } } /** * Implements the default info behavior: any authenticated user may * get information on a portlet * * @param rundata the RunData object for the current request */ public boolean allowInfo( RunData rundata ) { Portlet p = getPortlet(); if (p==null) return false; if ((p instanceof PortletSet) ||(JetspeedSecurity.checkPermission((JetspeedUser) rundata.getUser(), p, JetspeedSecurity.PERMISSION_INFO))) { if (p instanceof PortletState) { return ((PortletState)p).allowInfo(rundata); } } return false; } /** * Implements the default customize behavior: any authenticated user may * customize a portlet * * @param rundata the RunData object for the current request */ public boolean allowCustomize( RunData rundata ) { Portlet p = getPortlet(); if (p==null) return false; if ((p instanceof PortletSet) ||(JetspeedSecurity.checkPermission((JetspeedUser) rundata.getUser(), p, JetspeedSecurity.PERMISSION_CUSTOMIZE))) { if (p instanceof PortletState) { return ((PortletState)p).allowCustomize(rundata); } } return false; } /** * Implements the default maximize behavior: any authenticated user may * maximize a portlet * * @param rundata the RunData object for the current request */ public boolean allowMaximize( RunData rundata ) { Portlet p = getPortlet(); if (p==null) return false; if ((p instanceof PortletSet) ||(JetspeedSecurity.checkPermission((JetspeedUser) rundata.getUser(), p, JetspeedSecurity.PERMISSION_MAXIMIZE))) { if (p instanceof PortletState) { return ((PortletState)p).allowMaximize(rundata); } } return false; } /** * Implements the default info behavior: any authenticated user may * minimize a portlet * * @param rundata the RunData object for the current request */ public boolean allowMinimize( RunData rundata ) { Portlet p = getPortlet(); if (p==null) return false; if ((p instanceof PortletSet) ||(JetspeedSecurity.checkPermission((JetspeedUser) rundata.getUser(), p, JetspeedSecurity.PERMISSION_MINIMIZE))) { if (p instanceof PortletState) { return ((PortletState)p).allowMinimize(rundata); } } return false; } /** * Implements the default info behavior: any authenticated user may * display portlet in print friendly format * * @param rundata the RunData object for the current request */ public boolean allowPrintFriendly( RunData rundata ) { Portlet p = getPortlet(); if (p==null) return false; if ((p instanceof PortletSet) ||(JetspeedSecurity.checkPermission((JetspeedUser) rundata.getUser(), p, JetspeedSecurity.PERMISSION_PRINT_FRIENDLY))) { if (p instanceof PortletState) { return ((PortletState)p).allowPrintFriendly(rundata); } } return false; } /** * Returns true if this portlet is currently minimized */ public boolean isMinimized(RunData rundata) { Portlet p = getPortlet(); if ( (p!=null) && (p instanceof PortletState) ) { return ((PortletState)p).isMinimized(rundata); } return false; } /** Change the portlet visibility state ( minimized <-> normal ) @param minimize True if the portlet change to minimized @param rundata A RunData object */ public void setMinimized( boolean minimize, RunData rundata ) { Portlet p = getPortlet(); if ( (p!=null) && (p instanceof PortletState) ) { ((PortletState)p).setMinimized( minimize, rundata); } } public String getID() { return this.portlet.getID(); } public void setID(String id) { this.portlet.setID(id); } /** Returns the Portlet with the given id */ public Portlet getPortletByID(String id) { Portlet p = getPortlet(); if (null == p) return null; if (p instanceof PortletSet) { Enumeration e = ((PortletSet)p).getPortlets(); Portlet portlet = null; while ( e.hasMoreElements() ) { portlet = (Portlet)e.nextElement(); if (portlet.getID().equals(id)) return portlet; } return portlet; } return null; } /** Returns the Portlet with the given name */ public Portlet getPortletByName(String name) { Portlet p = getPortlet(); if (null == p) return null; if (p instanceof PortletSet) { Enumeration e = ((PortletSet)p).getPortlets(); Portlet portlet = null; while ( e.hasMoreElements() ) { portlet = (Portlet)e.nextElement(); if (portlet.getName().equals(name)) return portlet; } return portlet; } return null; } }