FormattedParameters.java |
/* * $Id: FormattedParameters.java,v 1.7 2010/11/18 20:35:05 agoubard Exp $ * * See the COPYRIGHT file for redistribution and use restrictions. */ package org.xins.common; import java.util.Iterator; import java.util.Map; import org.xins.common.text.URLEncoding; import org.w3c.dom.Element; /** * Convert parameters to (semi) human readable text. * * @version $Revision: 1.7 $ $Date: 2010/11/18 20:35:05 $ * @author <a href="mailto:ernst@ernstdehaan.com">Ernst de Haan</a> * @author <a href="mailto:anthony.goubard@japplis.com">Anthony Goubard</a> * * @since XINS 2.0 */ public class FormattedParameters { /** * The parameters to serialize. This field can be <code>null</code>. */ private final Map<String, String> _parameters; /** * The data section. */ private final Element _dataSection; /** * The value if there is no parameters and data section. */ private final String _valueIfEmpty; /** * The prefix if there is at least a parameter or a data section. */ private final String _prefixIfNotEmpty; /** * The maximum limit of serialized value characters. */ private final int _maxValueLength; /** * The String representation of the parameters. */ private String _asString; /** * Constructs a new <code>FormattedParameters</code> object. * * @param parameters * the parameters, can be <code>null</code>. */ public FormattedParameters(Map<String, String> parameters) { this(parameters, null); } /** * Constructs a new <code>FormattedParameters</code> object. * * @param parameters * the parameters, can be <code>null</code>. * * @param dataSection * the data section, can be <code>null</code>. */ public FormattedParameters(Map<String, String> parameters, Element dataSection) { this(parameters, dataSection, "-", null, -1); } /** * Constructs a new <code>FormattedParameters</code> object. * * @param parameters * the parameters, can be <code>null</code>. * * @param dataSection * the data section, can be <code>null</code>. * * @param valueIfEmpty * the value to return if there is no parameter and no data section, can be <code>null</code>. * * @param prefixIfNotEmpty * the prefix to add if there is a parameter or a data section, can be <code>null</code>. * * @param maxValueLength * the maximum of characters to set for the value, if the value is longer * than this limit '...' will be added after the limit. * If the value is -1, no limit will be set. */ public FormattedParameters(Map<String, String> parameters, Element dataSection, String valueIfEmpty, String prefixIfNotEmpty, int maxValueLength) { _parameters = parameters; _dataSection = dataSection; _valueIfEmpty = valueIfEmpty; _prefixIfNotEmpty = prefixIfNotEmpty; _maxValueLength = maxValueLength; } /** * String representation of the parameters including the data section. * * @return * the String representation of the request. */ public String toString() { // The String representation has already been created. if (_asString != null) { return _asString; } Iterator names = (_parameters == null) ? null : _parameters.keySet().iterator(); // If there are no parameters, then just return a hyphen if ((names == null || ! names.hasNext()) && _dataSection == null) { _asString = _valueIfEmpty; return _asString; } StringBuffer buffer = new StringBuffer(160); if (_prefixIfNotEmpty != null) { buffer.append(_prefixIfNotEmpty); } boolean first = true; while (names != null && names.hasNext()) { // Get the name and value String name = (String) names.next(); String value = _parameters.get(name); // If the value is null or an empty string, then output nothing if (value == null || value.length() == 0) { continue; } // Append an ampersand, except for the first entry if (!first) { buffer.append('&'); } else { first = false; } // Append the key and the value, separated by an equals sign buffer.append(URLEncoding.encode(name)); buffer.append('='); String encodedValue; if (_maxValueLength == -1 || value.length() <= _maxValueLength) { encodedValue = URLEncoding.encode(value); } else { encodedValue = URLEncoding.encode(value.substring(0, _maxValueLength)) + "..."; } buffer.append(encodedValue); } if (_dataSection != null) { if (!first) { buffer.append('&'); } buffer.append("_data="); buffer.append(URLEncoding.encode(_dataSection.toString())); } _asString = buffer.toString(); return _asString; } }