/* * 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.felix.ipojo.manipulator; import java.util.ArrayList; import java.util.List; /** * Parse on OSGi Manifest clause. * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a> */ public class QuotedTokenizer { /** * String to parse. */ String m_string; /** * Index. */ int m_index = 0; /** * Default separator to use. */ String m_separators; /** * Does the tokenizer returns token. */ boolean m_returnTokens; /** * Peek. */ String m_peek; /** * Separator. */ char m_separator; /** * Constructors. * @param string : input String. * @param separators : separators. * @param returnTokens : should the tokenizer return tokens ? */ public QuotedTokenizer(String string, String separators, boolean returnTokens) { if (string == null) { throw new IllegalArgumentException("string argument must be not null"); } this.m_string = string; this.m_separators = separators; this.m_returnTokens = returnTokens; } /** * Constructors. * Set returnTokens to false. * @param string : input String. * @param separators : separators */ public QuotedTokenizer(String string, String separators) { this(string, separators, false); } /** * Get the next token. * @param separators : separators to used. * @return : the next token. */ public String nextToken(String separators) { m_separator = 0; if (m_peek != null) { String tmp = m_peek; m_peek = null; return tmp; } if (m_index == m_string.length()) { return null; } StringBuffer sb = new StringBuffer(); while (m_index < m_string.length()) { char c = m_string.charAt(m_index++); if (Character.isWhitespace(c)) { if (m_index == m_string.length()) { break; } else { continue; } } if (separators.indexOf(c) >= 0) { if (m_returnTokens) { m_peek = Character.toString(c); } else { m_separator = c; } break; } switch (c) { case '"': case '\'': quotedString(sb, c); break; default: sb.append(c); } } String result = sb.toString().trim(); if (result.length() == 0 && m_index == m_string.length()) { return null; } return result; } /** * Get the next token. * Used the defined separators. * @return the next token. */ public String nextToken() { return nextToken(m_separators); } /** * Append the next quote to the given String Buffer. * @param sb : accumulator. * @param c : quote. */ private void quotedString(StringBuffer sb, char c) { char quote = c; while (m_index < m_string.length()) { c = m_string.charAt(m_index++); if (c == quote) { break; } if (c == '\\' && m_index < m_string.length() && m_string.charAt(m_index + 1) == quote) { c = m_string.charAt(m_index++); } sb.append(c); } } public String[] getTokens() { return getTokens(0); } /** * Get the list of tokens. * @param cnt : array length. * @return : the array of token. */ private String[] getTokens(int cnt) { String token = nextToken(); if (token == null) { return new String[cnt]; } String[] result = getTokens(cnt + 1); result[cnt] = token; return result; } public char getSeparator() { return m_separator; } /** * Get token list. * @return the list of token. */ public List<String> getTokenSet() { List<String> list = new ArrayList<String>(); String token = nextToken(); while (token != null) { list.add(token); token = nextToken(); } return list; } }