package com.wesabe.servlet.normalizers; /** * Normalizes query strings. * * @author coda */ public class QueryStringNormalizer extends UriFragmentNormalizer { private static final char PARAM_SEPARATOR = '&'; private static final char PARAM_KEY_VALUE_SEPARATOR = '='; @Override public String normalize(String query) throws ValidationException { if (query == null) { return null; } StringBuilder queryBuilder = new StringBuilder(query.length() * 2); StringBuilder buffer = new StringBuilder(query.length()); for (int i = 0; i < query.length(); i++) { final char c = query.charAt(i); if (c == PARAM_SEPARATOR) { queryBuilder.append(normalizeParam(buffer.toString())); queryBuilder.append(c); buffer = new StringBuilder(query.length()); } else { buffer.append(c); } } queryBuilder.append(normalizeParam(buffer.toString())); return queryBuilder.toString(); } private String normalizeParam(String param) throws ValidationException { final int separatorIndex = param.indexOf(PARAM_KEY_VALUE_SEPARATOR); if (separatorIndex == -1) { return super.normalize(param); } final String key = param.substring(0, separatorIndex); final String value = param.substring(separatorIndex + 1); final StringBuilder builder = new StringBuilder(); builder.append(super.normalize(key)); builder.append('='); builder.append(super.normalize(value)); return builder.toString(); } }