/** * Licensed under the Artistic License; you may not use this file * except in compliance with the License. * You may obtain a copy of the License at * * http://displaytag.sourceforge.net/license.html * * THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ package org.displaytag.decorator; import javax.servlet.jsp.PageContext; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.displaytag.properties.MediaTypeEnum; import org.displaytag.util.TagConstants; /** * This takes the string that is passed in, and "auto-links" it, it turns email addresses into hyperlinks, and also * turns things that looks like URLs into hyperlinks as well. * @author Fabrizio Giustina * @version $Revision: 8904 $ ($Author: charles $) */ public class AutolinkColumnDecorator implements DisplaytagColumnDecorator { /** * Instance used for the "autolink" tag attribute. */ public static final DisplaytagColumnDecorator INSTANCE = new AutolinkColumnDecorator(); /** * "://". */ private static final String URL_DELIM = "://"; //$NON-NLS-1$ /** * Urls. */ private static final String[] URLS_PREFIXES = // new String[]{"http", "https", "ftp"}; //$NON-NLS-1$ //$NON-NLS-1$ //$NON-NLS-1$ /** * @see org.displaytag.decorator.DisplaytagColumnDecorator#decorate(Object, PageContext, MediaTypeEnum) */ public Object decorate(Object columnValue, PageContext pageContext, MediaTypeEnum media) { if (columnValue == null) { return null; } String work = columnValue.toString(); int urlBegin; StringBuffer buffer = new StringBuffer(); // First check for email addresses. while ((urlBegin = work.indexOf('@')) != -1) { int start = 0; int end = work.length() - 1; // scan backwards... for (int j = urlBegin; j >= 0; j--) { if (Character.isWhitespace(work.charAt(j))) { start = j + 1; break; } } // scan forwards... for (int j = urlBegin; j <= end; j++) { if (Character.isWhitespace(work.charAt(j))) { end = j - 1; break; } } String email = work.substring(start, end + 1); buffer.append(work.substring(0, start)).append("<a href=\"mailto:") //$NON-NLS-1$ .append(email + "\">") //$NON-NLS-1$ .append(email).append("</a>"); //$NON-NLS-1$ if (end == work.length()) { work = TagConstants.EMPTY_STRING; } else { work = work.substring(end + 1); } } work = buffer.toString() + work; buffer = new StringBuffer(); // Now check for urls... while ((urlBegin = work.indexOf(URL_DELIM)) != -1) { // scan backwards... int fullUrlBegin = urlBegin; StringBuffer prefixBuffer = new StringBuffer(10); for (int j = fullUrlBegin - 1; j >= 0; j--) { if (Character.isWhitespace(work.charAt(j))) { fullUrlBegin = j + 1; break; } fullUrlBegin = j; prefixBuffer.append(work.charAt(j)); } if (!ArrayUtils.contains(URLS_PREFIXES, StringUtils.reverse(prefixBuffer.toString()))) { buffer.append(work.substring(0, urlBegin + 3)); work = work.substring(urlBegin + 3); continue; } int urlEnd = work.length(); // scan forwards... for (int j = urlBegin; j < urlEnd; j++) { if (Character.isWhitespace(work.charAt(j))) { urlEnd = j; break; } } String url = work.substring(fullUrlBegin, urlEnd); buffer.append(work.substring(0, fullUrlBegin)).append("<a href=\"")//$NON-NLS-1$ .append(url).append("\">")//$NON-NLS-1$ .append(url).append("</a>"); //$NON-NLS-1$ if (urlEnd >= work.length()) { work = TagConstants.EMPTY_STRING; } else { work = work.substring(urlEnd); } } buffer.append(work); return buffer.toString(); } }