/* * $Id: ImgTag.java 471754 2006-11-06 14:55:09Z husted $ * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.struts.taglib.html; import org.apache.struts.config.ModuleConfig; import org.apache.struts.taglib.TagUtils; import org.apache.struts.util.MessageResources; import org.apache.struts.util.ModuleUtils; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.JspException; import java.util.Iterator; import java.util.Map; /** * <p>Generate an IMG tag to the specified image URI. </p> * * <p>TODO:</p> * * <ul> * * <li>Make the <strong>alt</strong> and <strong>src</strong> settable from * properties (for i18n)</li> * * </ul> * * @version $Rev: 471754 $ */ public class ImgTag extends BaseHandlerTag { /** * The message resources for this package. */ protected static MessageResources messages = MessageResources.getMessageResources(Constants.Package + ".LocalStrings"); // ------------------------------------------------------------- Properties /** * The property to specify where to align the image. */ protected String align = null; /** * The border size around the image. */ protected String border = null; /** * The image height. */ protected String height = null; /** * The horizontal spacing around the image. */ protected String hspace = null; /** * The image name for named images. */ protected String imageName = null; /** * Server-side image map declaration. */ protected String ismap = null; /** * The JSP bean name for query parameters. */ protected String name = null; /** * The module-relative path, starting with a slash character, of the image * to be displayed by this rendered tag. */ protected String page = null; /** * The message resources key under which we should look up the * <code>page</code> attribute for this generated tag, if any. */ protected String pageKey = null; /** * The module-relative action (beginning with a slash) which will be used * as the source for this image. */ protected String action = null; /** * The module prefix (beginning with a slash) which will be used to find * the action for this link. */ protected String module = null; /** * In situations where an image is dynamically generated (such as to * create a chart graph), this specifies the single-parameter request * parameter name to generate. */ protected String paramId = null; /** * The single-parameter JSP bean name. */ protected String paramName = null; /** * The single-parameter JSP bean property. */ protected String paramProperty = null; /** * The single-parameter JSP bean scope. */ protected String paramScope = null; /** * The JSP bean property name for query parameters. */ protected String property = null; /** * The scope of the bean specified by the name property, if any. */ protected String scope = null; /** * The image source URI. */ protected String src = null; /** * The message resources key under which we should look up the * <code>src</code> attribute for this generated tag, if any. */ protected String srcKey = null; /** * Client-side image map declaration. */ protected String usemap = null; /** * The vertical spacing around the image. */ protected String vspace = null; /** * The image width. */ protected String width = null; protected boolean useLocalEncoding = false; // ----------------------------------------------------- Constructor public ImgTag() { super(); doDisabled = false; } public String getAlign() { return (this.align); } public void setAlign(String align) { this.align = align; } public String getBorder() { return (this.border); } public void setBorder(String border) { this.border = border; } public String getHeight() { return (this.height); } public void setHeight(String height) { this.height = height; } public String getHspace() { return (this.hspace); } public void setHspace(String hspace) { this.hspace = hspace; } public String getImageName() { return (this.imageName); } public void setImageName(String imageName) { this.imageName = imageName; } public String getIsmap() { return (this.ismap); } public void setIsmap(String ismap) { this.ismap = ismap; } public String getName() { return (this.name); } public void setName(String name) { this.name = name; } public String getPage() { return (this.page); } public void setPage(String page) { this.page = page; } public String getPageKey() { return (this.pageKey); } public void setPageKey(String pageKey) { this.pageKey = pageKey; } public String getAction() { return (this.action); } public void setAction(String action) { this.action = action; } public String getModule() { return (this.module); } public void setModule(String module) { this.module = module; } public String getParamId() { return (this.paramId); } public void setParamId(String paramId) { this.paramId = paramId; } public String getParamName() { return (this.paramName); } public void setParamName(String paramName) { this.paramName = paramName; } public String getParamProperty() { return (this.paramProperty); } public void setParamProperty(String paramProperty) { this.paramProperty = paramProperty; } public String getParamScope() { return (this.paramScope); } public void setParamScope(String paramScope) { this.paramScope = paramScope; } public String getProperty() { return (this.property); } public void setProperty(String property) { this.property = property; } public String getScope() { return (this.scope); } public void setScope(String scope) { this.scope = scope; } public String getSrc() { return (this.src); } public void setSrc(String src) { this.src = src; } public String getSrcKey() { return (this.srcKey); } public void setSrcKey(String srcKey) { this.srcKey = srcKey; } public String getUsemap() { return (this.usemap); } public void setUsemap(String usemap) { this.usemap = usemap; } public String getVspace() { return (this.vspace); } public void setVspace(String vspace) { this.vspace = vspace; } public String getWidth() { return (this.width); } public void setWidth(String width) { this.width = width; } public boolean isUseLocalEncoding() { return useLocalEncoding; } public void setUseLocalEncoding(boolean b) { useLocalEncoding = b; } // --------------------------------------------------------- Public Methods /** * Render the beginning of the IMG tag. * * @throws JspException if a JSP exception has occurred */ public int doStartTag() throws JspException { // Evaluate the body of this tag return (EVAL_BODY_TAG); } /** * Render the end of the IMG tag. * * @throws JspException if a JSP exception has occurred */ public int doEndTag() throws JspException { // Generate the name definition or image element HttpServletResponse response = (HttpServletResponse) pageContext.getResponse(); StringBuffer results = new StringBuffer("<img"); String tmp = src(); String srcurl = url(tmp); if (srcurl != null) { prepareAttribute(results, "src", response.encodeURL(srcurl)); } prepareAttribute(results, "name", getImageName()); prepareAttribute(results, "height", getHeight()); prepareAttribute(results, "width", getWidth()); prepareAttribute(results, "align", getAlign()); prepareAttribute(results, "border", getBorder()); prepareAttribute(results, "hspace", getHspace()); prepareAttribute(results, "vspace", getVspace()); prepareAttribute(results, "ismap", getIsmap()); prepareAttribute(results, "usemap", getUsemap()); results.append(prepareStyles()); results.append(prepareEventHandlers()); prepareOtherAttributes(results); results.append(getElementClose()); TagUtils.getInstance().write(pageContext, results.toString()); return (EVAL_PAGE); } /** * Release any acquired resources. */ public void release() { super.release(); border = null; height = null; hspace = null; imageName = null; ismap = null; name = null; page = null; pageKey = null; action = null; paramId = null; paramName = null; paramProperty = null; paramScope = null; property = null; scope = null; src = null; srcKey = null; usemap = null; vspace = null; width = null; } // ------------------------------------------------------ Protected Methods /** * Convenience method to throw a "imgTag.src" exception. * * @throws JspException */ private void throwImgTagSrcException() throws JspException { JspException e = new JspException(messages.getMessage("imgTag.src")); TagUtils.getInstance().saveException(pageContext, e); throw e; } /** * Convenience method to test whether this is the default module. * * @param config Our Moduleconfig * @return True if this is the default module or contextRelative is set */ private boolean srcDefaultReference(ModuleConfig config) { return (config == null); } /** * Return the base source URL that will be rendered in the * <code>src</code> property for this generated element, or * <code>null</code> if there is no such URL. * * @throws JspException if an error occurs */ protected String src() throws JspException { // Deal with a direct context-relative page that has been specified if (this.page != null) { if ((this.src != null) || (this.srcKey != null) || (this.pageKey != null)) { throwImgTagSrcException(); } ModuleConfig config = ModuleUtils.getInstance().getModuleConfig(this.module, (HttpServletRequest) pageContext.getRequest(), pageContext.getServletContext()); HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); String pageValue = this.page; if (!srcDefaultReference(config)) { pageValue = TagUtils.getInstance().pageURL(request, this.page, config); } return (request.getContextPath() + pageValue); } // Deal with an indirect context-relative page that has been specified if (this.pageKey != null) { if ((this.src != null) || (this.srcKey != null)) { throwImgTagSrcException(); } ModuleConfig config = ModuleUtils.getInstance().getModuleConfig(this.module, (HttpServletRequest) pageContext.getRequest(), pageContext.getServletContext()); HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); String pageValue = TagUtils.getInstance().message(pageContext, getBundle(), getLocale(), this.pageKey); if (!srcDefaultReference(config)) { pageValue = TagUtils.getInstance().pageURL(request, pageValue, config); } return (request.getContextPath() + pageValue); } if (this.action != null) { if ((this.src != null) || (this.srcKey != null)) { throwImgTagSrcException(); } return TagUtils.getInstance().getActionMappingURL(action, module, pageContext, false); } // Deal with an absolute source that has been specified if (this.src != null) { if (this.srcKey != null) { throwImgTagSrcException(); } return (this.src); } // Deal with an indirect source that has been specified if (this.srcKey == null) { throwImgTagSrcException(); } return TagUtils.getInstance().message(pageContext, getBundle(), getLocale(), this.srcKey); } /** * Return the specified src URL, modified as necessary with optional * request parameters. * * @param url The URL to be modified (or null if this url will not be * used) * @throws JspException if an error occurs preparing the URL */ protected String url(String url) throws JspException { if (url == null) { return (url); } String charEncoding = "UTF-8"; if (useLocalEncoding) { charEncoding = pageContext.getResponse().getCharacterEncoding(); } // Start with an unadorned URL as specified StringBuffer src = new StringBuffer(url); // Append a single-parameter name and value, if requested if ((paramId != null) && (paramName != null)) { if (src.toString().indexOf('?') < 0) { src.append('?'); } else { src.append("&"); } src.append(paramId); src.append('='); Object value = TagUtils.getInstance().lookup(pageContext, paramName, paramProperty, paramScope); if (value != null) { src.append(TagUtils.getInstance().encodeURL(value.toString(), charEncoding)); } } // Just return the URL if there is no bean to look up if ((property != null) && (name == null)) { JspException e = new JspException(messages.getMessage("getter.name")); TagUtils.getInstance().saveException(pageContext, e); throw e; } if (name == null) { return (src.toString()); } // Look up the map we will be using Object mapObject = TagUtils.getInstance().lookup(pageContext, name, property, scope); Map map = null; try { map = (Map) mapObject; } catch (ClassCastException e) { TagUtils.getInstance().saveException(pageContext, e); throw new JspException(messages.getMessage("imgTag.type")); } // Append the required query parameters boolean question = (src.toString().indexOf("?") >= 0); Iterator keys = map.keySet().iterator(); while (keys.hasNext()) { String key = (String) keys.next(); Object value = map.get(key); if (value == null) { if (question) { src.append("&"); } else { src.append('?'); question = true; } src.append(key); src.append('='); // Interpret null as "no value specified" } else if (value instanceof String[]) { String[] values = (String[]) value; for (int i = 0; i < values.length; i++) { if (question) { src.append("&"); } else { src.append('?'); question = true; } src.append(key); src.append('='); src.append(TagUtils.getInstance().encodeURL(values[i], charEncoding)); } } else { if (question) { src.append("&"); } else { src.append('?'); question = true; } src.append(key); src.append('='); src.append(TagUtils.getInstance().encodeURL(value.toString(), charEncoding)); } } // Return the final result return (src.toString()); } }