| /* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved. |
| * |
| * This program and the accompanying materials are made available under |
| * the terms of the Common Public License v1.0 which accompanies this distribution, |
| * and is available at http://www.eclipse.org/legal/cpl-v10.html |
| * |
| * $Id: Strings.java,v 1.1.1.1 2004/05/09 16:57:55 vlad_r Exp $ |
| */ |
| package com.vladium.util; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Set; |
| import java.util.StringTokenizer; |
| |
| // ---------------------------------------------------------------------------- |
| /** |
| * @author Vlad Roubtsov, (C) 2003 |
| */ |
| public |
| abstract class Strings |
| { |
| // public: ................................................................ |
| |
| |
| public static final String WHITE_SPACE = " \t\r\n"; |
| |
| |
| //TODO: add duplicate removal |
| public static String toListForm (final String [] strings, final char delimiter) |
| { |
| if (strings == null) return null; |
| if (strings.length == 0) return ""; |
| |
| final StringBuffer s = new StringBuffer (); |
| for (int i = 0, iLimit = strings.length; i < iLimit; ++ i) |
| { |
| if (i != 0) s.append (delimiter); |
| s.append (strings [i]); |
| } |
| |
| return s.toString (); |
| } |
| |
| public static String [] removeDuplicates (final String [] strings, final boolean removeNull) |
| { |
| if (strings == null) return strings; |
| |
| final int length = strings.length; |
| if (length == 0) return strings; |
| |
| final Set /* String */ _strings = new HashSet (length); |
| final List /* String */ _result = new ArrayList (length); |
| |
| for (int i = 0; i < length; ++ i) |
| { |
| final String s = strings [i]; |
| if (removeNull && (s == null)) continue; |
| |
| if (_strings.add (s)) _result.add (s); |
| } |
| |
| final int resultLength = _result.size (); |
| if (resultLength == length) |
| return strings; |
| else |
| { |
| final String [] result = new String [resultLength]; |
| _result.toArray (result); |
| |
| return result; |
| } |
| } |
| |
| /** |
| * Also removes duplicates. |
| * |
| * @param strings |
| * @param delimiters |
| * @param removeNull |
| * @return |
| */ |
| public static String [] merge (final String [] strings, final String delimiters, final boolean removeNull) |
| { |
| if (strings == null) return strings; |
| |
| final int length = strings.length; |
| if (length == 0) return strings; |
| |
| if ((delimiters == null) || (delimiters.length () == 0)) |
| throw new IllegalArgumentException ("null/empty input: delimiters"); |
| |
| final Set /* String */ _strings = new HashSet (length); |
| final List /* String */ _result = new ArrayList (length); |
| |
| for (int i = 0; i < length; ++ i) |
| { |
| final String s = strings [i]; |
| if (removeNull && (s == null)) continue; |
| |
| final StringTokenizer tokenizer = new StringTokenizer (s, delimiters); |
| while (tokenizer.hasMoreTokens ()) |
| { |
| final String ss = tokenizer.nextToken (); |
| if (_strings.add (ss)) _result.add (ss); |
| } |
| } |
| |
| final String [] result = new String [_result.size ()]; |
| _result.toArray (result); |
| |
| return result; |
| } |
| |
| /** |
| * Removes duplicates. |
| * |
| * @param delimiters |
| * @param processAtFiles |
| * @return |
| * @throws IOException |
| */ |
| public static String [] mergeAT (final String [] strings, final String delimiters, final boolean processAtFiles) |
| throws IOException |
| { |
| if (! processAtFiles) |
| return merge (strings, delimiters, true); |
| else |
| { |
| if (strings == null) return strings; |
| |
| final int length = strings.length; |
| if (length == 0) return strings; |
| |
| if ((delimiters == null) || (delimiters.length () == 0)) |
| throw new IllegalArgumentException ("null/empty input: delimiters"); |
| |
| final Set /* String */ _strings = new HashSet (length); |
| final List /* String */ _result = new ArrayList (length); |
| |
| for (int i = 0; i < length; ++ i) |
| { |
| final String s = strings [i]; |
| if (s == null) continue; |
| |
| final StringTokenizer tokenizer = new StringTokenizer (s, delimiters); |
| while (tokenizer.hasMoreTokens ()) |
| { |
| final String ss = tokenizer.nextToken (); |
| |
| if (ss.startsWith ("@")) |
| { |
| final String [] fileList = Files.readFileList (new File (ss.substring (1))); |
| for (int j = 0; j < fileList.length; ++ j) |
| { |
| final String sss = fileList [j]; |
| if (_strings.add (sss)) _result.add (sss); |
| } |
| } |
| else if (_strings.add (ss)) _result.add (ss); |
| } |
| } |
| |
| final String [] result = new String [_result.size ()]; |
| _result.toArray (result); |
| |
| return result; |
| } |
| } |
| |
| /** |
| * HTML attribute values can be quoted using either double or single quotes. |
| * Depending on the type of quote used, the other kind can be used unescaped |
| * within the attribute value. This method assumes that only double quotes |
| * are used for delimiting, hence this is the only kind that is escaped. |
| */ |
| public static void HTMLEscape (final String s, final StringBuffer append) |
| { |
| if (s == null) throw new IllegalArgumentException ("null input: s"); |
| if (append == null) throw new IllegalArgumentException ("null input: append"); |
| |
| final char [] chars; |
| if (USE_GET_CHARS) chars = s.toCharArray (); |
| |
| for (int i = 0, iLimit = s.length (); i < iLimit; ++ i) |
| { |
| final char c = USE_GET_CHARS ? chars [i] : s.charAt (i); |
| |
| switch (c) |
| { |
| case '<': |
| append.append ("<"); |
| break; |
| |
| case '>': |
| append.append (">"); |
| break; |
| |
| case '"': |
| append.append ("""); |
| break; |
| |
| case '&': |
| append.append ("&"); |
| break; |
| |
| default: |
| append.append (c); |
| |
| } // end of switch |
| } |
| } |
| |
| /** |
| * Same as {@link #HTMLEscape(String, StringBuffer)} but also replaces spaces |
| * with " "'s, which is handy for escaping code. |
| */ |
| public static void HTMLEscapeNB (final String s, final StringBuffer append) |
| { |
| if (s == null) throw new IllegalArgumentException ("null input: s"); |
| if (append == null) throw new IllegalArgumentException ("null input: append"); |
| |
| final char [] chars; |
| if (USE_GET_CHARS) chars = s.toCharArray (); |
| |
| for (int i = 0, iLimit = s.length (); i < iLimit; ++ i) |
| { |
| final char c = USE_GET_CHARS ? chars [i] : s.charAt (i); |
| |
| switch (c) |
| { |
| case ' ': |
| append.append ('\u00A0'); // don't use " ": a waste of space |
| break; |
| |
| case '\t': |
| append.append ("\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0"); // TODO: define a prop for this |
| break; |
| |
| // case '-': |
| // append.append ((char) 0x8209); |
| // break; |
| |
| case '<': |
| append.append ("<"); |
| break; |
| |
| case '>': |
| append.append (">"); |
| break; |
| |
| case '"': |
| append.append ("""); |
| break; |
| |
| case '&': |
| append.append ("&"); |
| break; |
| |
| default: |
| append.append (c); |
| |
| } // end of switch |
| } |
| } |
| |
| public static String HTMLEscape (final String s) |
| { |
| final StringBuffer buf = new StringBuffer (); |
| HTMLEscape (s, buf); |
| |
| return buf.toString (); |
| } |
| |
| public static String HTMLEscapeSP (final String s) |
| { |
| final StringBuffer buf = new StringBuffer (); |
| HTMLEscapeNB (s, buf); |
| |
| return buf.toString (); |
| } |
| |
| // protected: ............................................................. |
| |
| // package: ............................................................... |
| |
| // private: ............................................................... |
| |
| |
| private Strings () {} // prevent subclassing |
| |
| |
| private static final boolean USE_GET_CHARS = true; |
| |
| } // end of class |
| // ---------------------------------------------------------------------------- |