/** * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.upload; import java.util.HashMap; import java.util.Map; /** * * @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a> */ class ParameterParser { private char[] chars_ = null; private int pos = 0; private int len = 0; private int i1 = 0, i2 = 0; private boolean lowerCaseNames = false; private boolean hasChar() { return this.pos < this.len; } private String getToken(boolean quoted) { while ((i1 < i2) && (Character.isWhitespace(chars_[i1]))) i1++; while ((i2 > i1) && (Character.isWhitespace(chars_[i2 - 1]))) i2--; if (quoted && ((i2 - i1) >= 2) && (chars_[i1] == '"') && (chars_[i2 - 1] == '"')) { i1++; i2--; } if (i2 > i1) return new String(chars_, i1, i2 - i1); return null; } private boolean isOneOf(char ch, final char[] charray) { for (int i = 0; i < charray.length; i++) { if (ch != charray[i]) continue; return true; } return false; } private String parseToken(final char[] terminators) { char ch; i1 = pos; i2 = pos; while (hasChar()) { ch = chars_[pos]; if (isOneOf(ch, terminators)) break; i2++; pos++; } return getToken(false); } private String parseQuotedToken(final char[] terminators) { char ch; i1 = pos; i2 = pos; boolean quoted = false; boolean charEscaped = false; while (hasChar()) { ch = chars_[pos]; if (!quoted && isOneOf(ch, terminators)) break; if (!charEscaped && ch == '"') quoted = !quoted; charEscaped = (!charEscaped && ch == '\\'); i2++; pos++; } return getToken(true); } public void setLowerCaseNames(boolean b) { this.lowerCaseNames = b; } public Map<String, String> parse(final String str, char separator) { if (str == null) return new HashMap<String, String>(); chars_ = str.toCharArray(); int offset = 0; int length = chars_.length; HashMap<String, String> params = new HashMap<String, String>(); this.pos = offset; this.len = length; String paramName = null; String paramValue = null; while (hasChar()) { paramName = parseToken(new char[] { '=', separator }); paramValue = null; if (hasChar() && (chars_[pos] == '=')) { pos++; paramValue = parseQuotedToken(new char[] { separator }); } if (hasChar() && (chars_[pos] == separator)) pos++; if ((paramName != null) && (paramName.length() > 0)) { if (this.lowerCaseNames) paramName = paramName.toLowerCase(); params.put(paramName, paramValue); } } return params; } }