/** * 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.camel.util; import java.util.ArrayList; import java.util.List; /** * Utility class for parsing quoted string which is intended for parameters, separated by comma. */ public final class StringQuoteHelper { private StringQuoteHelper() { } /** * Returns the text wrapped double quotes */ public static String doubleQuote(String text) { return quote(text, "\""); } /** * Returns the text wrapped single quotes */ public static String singleQuote(String text) { return quote(text, "'"); } /** * Wraps the text in the given quote text * * @param text the text to wrap in quotes * @param quote the quote text added to the prefix and postfix of the text * * @return the text wrapped in the given quotes */ public static String quote(String text, String quote) { return quote + text + quote; } /** * Splits the input safely honoring if values is enclosed in quotes. * <p/> * Though this method does not support double quoting values. A quoted value * must start with the same start and ending quote, which is either a single * quote or double quote value. * <p/> * Will <i>trim</i> each splitted value by default. * * @param input the input * @param separator the separator char to split the input, for example a comma. * @return the input splitted, or <tt>null</tt> if the input is null. */ public static String[] splitSafeQuote(String input, char separator) { return splitSafeQuote(input, separator, true); } /** * Splits the input safely honoring if values is enclosed in quotes. * <p/> * Though this method does not support double quoting values. A quoted value * must start with the same start and ending quote, which is either a single * quote or double quote value. * \ * @param input the input * @param separator the separator char to split the input, for example a comma. * @param trim whether to trim each splitted value * @return the input splitted, or <tt>null</tt> if the input is null. */ public static String[] splitSafeQuote(String input, char separator, boolean trim) { if (input == null) { return null; } if (input.indexOf(separator) == -1) { // no separator in data, so return single string with input as is return new String[]{trim ? input.trim() : input}; } List<String> answer = new ArrayList<String>(); StringBuilder sb = new StringBuilder(); boolean singleQuoted = false; boolean doubleQuoted = false; boolean skipLeadingWhitespace = true; for (int i = 0; i < input.length(); i++) { char ch = input.charAt(i); char prev = i > 0 ? input.charAt(i - 1) : 0; boolean isQuoting = singleQuoted || doubleQuoted; if (!doubleQuoted && ch == '\'') { if (singleQuoted && prev == ch && sb.length() == 0) { // its an empty quote so add empty text answer.add(""); } // special logic needed if this quote is the end if (i == input.length() - 1) { if (singleQuoted && sb.length() > 0) { String text = sb.toString(); // do not trim a quoted string answer.add(text); sb.setLength(0); } } singleQuoted = !singleQuoted; continue; } else if (!singleQuoted && ch == '"') { if (doubleQuoted && prev == ch && sb.length() == 0) { // its an empty quote so add empty text answer.add(""); } // special logic needed if this quote is the end if (i == input.length() - 1) { if (doubleQuoted && sb.length() > 0) { String text = sb.toString(); // do not trim a quoted string answer.add(text); sb.setLength(0); } } doubleQuoted = !doubleQuoted; continue; } else if (!isQuoting && ch == ' ') { if (skipLeadingWhitespace) { continue; } } else if (!isQuoting && ch == separator) { // add as answer if we are not in a quote if (sb.length() > 0) { String text = sb.toString(); if (trim) { text = text.trim(); } answer.add(text); sb.setLength(0); } // we should avoid adding the separator continue; } sb.append(ch); } // any leftover if (sb.length() > 0) { String text = sb.toString(); if (trim) { text = text.trim(); } answer.add(text); } return answer.toArray(new String[answer.size()]); } }