/** Receive notification of character data inside an element. */ @Override public void characters(char ch[], int start, int len) { while (len > 0 && Character.isWhitespace(ch[start])) { ++start; --len; } while (len > 0 && Character.isWhitespace(ch[start + len - 1])) { --len; } if (len > 0) { if (_chars.length() > 0) { _chars.append(' '); } _chars.append(ch, start, len); } }
/** * Tokenizes a command string into a list. * * @throws Exception if the command cannot be tokenized */ protected static LinkedList _tokenizeCommand(String cmd) throws Exception { LinkedList tokens = new LinkedList(); int startIndex = 0; int dQuoteAt = cmd.indexOf('"'); int sQuoteAt = cmd.indexOf('\''); if (dQuoteAt == -1 && sQuoteAt == -1) { StringTokenizer st = new StringTokenizer(cmd.trim()); while (st.hasMoreTokens()) { tokens.add(st.nextToken()); } return tokens; } char[] chArray = cmd.trim().toCharArray(); int endIndex = 0; boolean inQuotes = false; char c = 0; char lastc = 0; char lastqc = 0; StringBuffer sb = new StringBuffer(80); while (endIndex < chArray.length) { c = chArray[endIndex]; if (!Character.isWhitespace(c)) { if (c == '"' || c == '\'') { if (inQuotes && lastc != '\\' && lastqc == c) { tokens.add(sb.toString()); inQuotes = false; sb.setLength(0); } else if (!inQuotes) { inQuotes = true; lastqc = c; } else { sb.append(c); } } else if (c == '\\') { if (lastc == '\\') sb.append(c); } else { sb.append(c); } } else { if (inQuotes) { sb.append(c); } else { if (sb.length() > 0) { tokens.add(sb.toString()); sb.setLength(0); } } } lastc = c; ++endIndex; } if (inQuotes) { throw new Exception( WDExUtil.formatMessage(WDExConstants.UNTERMINATED_STRING, WDUtil.toArray(cmd))); } return tokens; }