/* * 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; import java.io.File; import java.util.StringTokenizer; import org.apache.jetspeed.capability.CapabilityMap; import org.apache.turbine.services.servlet.TurbineServlet; /** * This default implementation of PortletSkin stores every property * as a Map of text properties * * @author <a href="mailto:raphael@apache.org">Rapha謖 Luta</a> * @author <a href="mailto:paulsp@apache.org">Paul Spencer</a> * @author <a href="mailto:weaver@apache.org">Scott T. Weaver</a> * @version $Id: BasePortletSkin.java,v 1.7 2004/02/23 04:05:35 jford Exp $ */ public class BasePortletSkin extends java.util.HashMap implements PortletSkin { public String name = null; private CapabilityMap cm; private static final String[] VALID_EXTENSIONS = new String[] { "gif", "jpg", "png" }; /** * Returns the name of this color scheme * @return the color scheme name */ public String getName() { return this.name; } /** Sets the name of this Skin */ public void setName(String name) { this.name = name; } /** * Returns the color to use for displaying the portlet text * @return the text color value in HTML format (#RRGGBB) */ public String getTextColor() { return (String)get(TEXT_COLOR); } /** * Sets the color to use for displaying the portlet text * @param color the text color value in HTML format (#RRGGBB) */ public void setTextColor(String color) { if (color!=null) { put(TEXT_COLOR,color); } } /** * Returns the color to use for displaying the portlet background * @return the text color value in HTML format (#RRGGBB) */ public String getBackgroundColor() { return (String)get(BACKGROUND_COLOR); } /** * Sets the color to use for displaying the portlet background * @param backgroundColor the background color value in HTML format (#RRGGBB) */ public void setBackgroundColor(String color) { if (color!=null) { put(BACKGROUND_COLOR,color); } } /** * Returns the color to use for displaying the portlet title text * @return the text color value in HTML format (#RRGGBB) */ public String getTitleTextColor() { return (String)get(TITLE_TEXT_COLOR); } /** * Sets the color to use for displaying the portlet title text * @param titleColor the title color value in HTML format (#RRGGBB) */ public void setTitleTextColor(String color) { if (color!=null) { put(TITLE_TEXT_COLOR,color); } } /** * Returns the color to use for displaying the portlet title background * @return the background color value in HTML format (#RRGGBB) */ public String getTitleBackgroundColor() { return (String)get(TITLE_BACKGROUND_COLOR); } /** * Sets the color to use for displaying the portlet title background * @param titleColor the title color value in HTML format (#RRGGBB) */ public void setTitleBackgroundColor(String color) { if (color!=null) { put(TITLE_BACKGROUND_COLOR,color); } } /** * Returns the color to use for displaying an highlighted text * @return the text color value in HTML format (#RRGGBB) */ public String getHighlightTextColor() { return (String)get(HIGHLIGHT_TEXT_COLOR); } /** * Sets the color to use for displaying an highlighted text * @param titleColor a color value in HTML format (#RRGGBB) */ public void setHighlightTextColor(String color) { if (color!=null) { put(HIGHLIGHT_TEXT_COLOR,color); } } /** * Returns the color to use for displaying an highlighted background * @return the background color value in HTML format (#RRGGBB) */ public String getHighlightBackgroundColor() { return (String)get(HIGHLIGHT_BACKGROUND_COLOR); } /** * Sets the color to use for displaying an highlighted background * @param titleColor the title color value in HTML format (#RRGGBB) */ public void setHighlightBackgroundColor(String color) { if (color!=null) { put(HIGHLIGHT_BACKGROUND_COLOR,color); } } /** * Returns the CSS class to use for the portlet overall * @return the CSS class to use (PortletStyleClass) */ public String getPortletStyleClass() { return (String)get(PORTLET_STYLE_CLASS); } /** * Sets the CSS class to use for the portlet overall * @param portletStyleClass the new class to be used */ public void setPortletStyleClass(String portletStyleClass) { if (portletStyleClass!=null) { put(PORTLET_STYLE_CLASS,portletStyleClass); } } /** * Returns the CSS class to use for the portlet title * @return the CSS class to use (TitleStyleClass) */ public String getTitleStyleClass() { return (String)get(TITLE_STYLE_CLASS); } /** * Sets the CSS class to use for the portlet title * @param titleStyleClass the new class to be used */ public void setTitleStyleClass(String titleStyleClass) { if (titleStyleClass!=null) { put(TITLE_STYLE_CLASS,titleStyleClass); } } /** * Returns the CSS class to use for the portlet content * @return the CSS class to use (ContentStyleClass) */ public String getContentStyleClass() { return (String)get(CONTENT_STYLE_CLASS); } /** * Sets the CSS class to use for the portlet content * @param contentStyleClass the new class to be used */ public void setContentStyleClass(String contentStyleClass) { if (contentStyleClass!=null) { put(CONTENT_STYLE_CLASS,contentStyleClass); } } /** * Returns the CSS class to use overall for the tabbed control * @return the CSS class to use (TabStyleClass) */ public String getTabStyleClass() { return (String)get(TAB_STYLE_CLASS); } /** * Sets the CSS class to use for overall for the tabbed control * @param tabStyleClass the new class to be used */ public void setTabStyleClass(String tabStyleClass) { if (tabStyleClass!=null) { put(TAB_STYLE_CLASS,tabStyleClass); } } /** * Returns the CSS class to use on the title of the tabbed control * @return the CSS class to use (TabTitleStyleClass) */ public String getTabTitleStyleClass() { return (String)get(TAB_TITLE_STYLE_CLASS); } /** * Sets the CSS class to use on the title of the tabbed control * @param tabTitleStyleClass the new class to be used */ public void setTabTitleStyleClass(String tabTitleStyleClass) { if (tabTitleStyleClass!=null) { put(TAB_TITLE_STYLE_CLASS,tabTitleStyleClass); } } /** * Returns the CSS class to use on the control of the tabbed control * @return the CSS class to use (TabContentStyleClass) */ public String getTabContentStyleClass() { return (String)get(TAB_CONTENT_STYLE_CLASS); } /** * Sets the CSS class to use on the control of the tabbed control * @param tabContentStyleClass the new class to be used */ public void setTabContentStyleClass(String tabContentStyleClass) { if (tabContentStyleClass!=null) { put(TAB_CONTENT_STYLE_CLASS,tabContentStyleClass); } } /** * Returns the CSS class to use on the control of the Highlighted title tab or menu item * @return the CSS class to use (HighlightTitleStyleClass) */ public String getHighlightTitleStyleClass() { return (String)get(HIGHLIGHT_TITLE_STYLE_CLASS); } /** * Sets the CSS class to use on the control of the Highlighted title tab or menu item * @param highlightTitleStyleClass the new class to be used */ public void setHighlightTitleStyleClass(String highlightTitleStyleClass) { if (highlightTitleStyleClass!=null) { put(HIGHLIGHT_TITLE_STYLE_CLASS, highlightTitleStyleClass); } } /** * Returns the CSS class to use for the controller overall * @return the CSS class to use (ControllerStyleClass) */ public String getControllerStyleClass() { return (String)get(CONTROLLER_STYLE_CLASS); } /** * Sets the CSS class to use for the controller overall * @param controllerStyleClass the new class to be used */ public void setControllerStyleClass(String controllerStyleClass) { if (controllerStyleClass!=null) { put(CONTROLLER_STYLE_CLASS,controllerStyleClass); } } /** * Returns the CSS class to use for the global skin rendering * @see org.apache.jetspeed.portal.PortletSkin#getPortletSkinClass() */ public String getPortletSkinClass() { return (String)get(PORTLET_SKIN_CLASS); } /** * Sets the CSS class to use for the global skin rendering * @param portletSkinClass the new class to be used */ public void setPortletSkinClass(String portletSkinClass) { if (portletSkinClass!=null) { put(PORTLET_SKIN_CLASS,portletSkinClass); } } /** * @see org.apache.jetspeed.portal.PortletSkin#getImage(String, String) */ public String getImage(String name, String dftPath) { if (containsKey("image-" + name)) { return buildMediaTypeSpecificPath((String) get("image-" + name)); } String path = imageDiscovery(name); if (path != null) { return path; } else { return dftPath; } } /** * This allows the PortalToolKit to make the PortletSkin aware * of the current user-agents's capabilities * @param CapabilityMap cm Current capaibilities of the user-agent * @author <a href="mailto:weaver@apache.org">Scott T. Weaver</a> */ public void setCapabilityMap(CapabilityMap cm) { this.cm = cm; } /** * builds a media type specific path for the relative path provided */ private String buildMediaTypeSpecificPath(String relativePath) { String path = "images/" + cm.getPreferredMediaType() + "/skins/" + relativePath; return path; } /** * builds a media type specific path using this skin's name. */ private String buildMediaTypeSpecificPath() { return buildMediaTypeSpecificPath(name); } private String imageDiscovery(String imageName) { String imagePathes = (String) get("image.paths"); boolean hasExtension = hasImageExtension(imageName); String fullPath = null; if (imagePathes != null) { StringTokenizer tokenizer = new StringTokenizer(imagePathes, ","); while (tokenizer.hasMoreTokens()) { fullPath = buildValidImage( buildMediaTypeSpecificPath(tokenizer.nextToken()), imageName, hasExtension); if (fullPath != null) { return fullPath; } } } if (fullPath == null) { String skinBasedPath = buildMediaTypeSpecificPath(); fullPath = buildValidImage(skinBasedPath, imageName, hasExtension); } return fullPath; } /** * Does the path contain a valid image extension? */ private boolean hasImageExtension(String path) { return (path.indexOf(".gif") > -1) || (path.indexOf(".jpg") > -1) || (path.indexOf(".png") > -1); } /** * makes every attempt to locate a valid image based on the combination * of an absoulte path and relative path or name. The relPath may pr may not * contain a valid image extension (.gif, .png, .jpg). */ private String buildValidImage(String absPath, String relPath, boolean hasExtension) { String path = null; if (hasExtension) { path = absPath + "/" + relPath; if (fileExists(path)) { return path; } } else { for (int i = 0; i < VALID_EXTENSIONS.length; i++) { path = absPath + "/" + relPath + "." + VALID_EXTENSIONS[i]; if (fileExists(path)) { return path; } } } return null; } /** * Does this <code>path</code> exist in the current file system. */ private boolean fileExists(String path) { File testPath = null; testPath = new File(TurbineServlet.getRealPath(path)); if (testPath.exists()) { testPath = null; return true; } else { testPath = null; return false; } } }