KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > vladium > util > Strings


1 /* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
2  *
3  * This program and the accompanying materials are made available under
4  * the terms of the Common Public License v1.0 which accompanies this distribution,
5  * and is available at http://www.eclipse.org/legal/cpl-v10.html
6  *
7  * $Id: Strings.java,v 1.1.1.1 2004/05/09 16:57:55 vlad_r Exp $
8  */

9 package com.vladium.util;
10
11 import java.io.File JavaDoc;
12 import java.io.IOException JavaDoc;
13 import java.util.ArrayList JavaDoc;
14 import java.util.HashSet JavaDoc;
15 import java.util.List JavaDoc;
16 import java.util.Set JavaDoc;
17 import java.util.StringTokenizer JavaDoc;
18
19 // ----------------------------------------------------------------------------
20
/**
21  * @author Vlad Roubtsov, (C) 2003
22  */

23 public
24 abstract class Strings
25 {
26     // public: ................................................................
27

28     
29     public static final String JavaDoc WHITE_SPACE = " \t\r\n";
30     
31     
32     //TODO: add duplicate removal
33
public static String JavaDoc toListForm (final String JavaDoc [] strings, final char delimiter)
34     {
35         if (strings == null) return null;
36         if (strings.length == 0) return "";
37         
38         final StringBuffer JavaDoc s = new StringBuffer JavaDoc ();
39         for (int i = 0, iLimit = strings.length; i < iLimit; ++ i)
40         {
41             if (i != 0) s.append (delimiter);
42             s.append (strings [i]);
43         }
44         
45         return s.toString ();
46     }
47     
48     public static String JavaDoc [] removeDuplicates (final String JavaDoc [] strings, final boolean removeNull)
49     {
50         if (strings == null) return strings;
51         
52         final int length = strings.length;
53         if (length == 0) return strings;
54         
55         final Set JavaDoc /* String */ _strings = new HashSet JavaDoc (length);
56         final List JavaDoc /* String */ _result = new ArrayList JavaDoc (length);
57         
58         for (int i = 0; i < length; ++ i)
59         {
60             final String JavaDoc s = strings [i];
61             if (removeNull && (s == null)) continue;
62             
63             if (_strings.add (s)) _result.add (s);
64         }
65         
66         final int resultLength = _result.size ();
67         if (resultLength == length)
68             return strings;
69         else
70         {
71             final String JavaDoc [] result = new String JavaDoc [resultLength];
72             _result.toArray (result);
73             
74             return result;
75         }
76     }
77     
78     /**
79      * Also removes duplicates.
80      *
81      * @param strings
82      * @param delimiters
83      * @param removeNull
84      * @return
85      */

86     public static String JavaDoc [] merge (final String JavaDoc [] strings, final String JavaDoc delimiters, final boolean removeNull)
87     {
88         if (strings == null) return strings;
89         
90         final int length = strings.length;
91         if (length == 0) return strings;
92         
93         if ((delimiters == null) || (delimiters.length () == 0))
94             throw new IllegalArgumentException JavaDoc ("null/empty input: delimiters");
95         
96         final Set JavaDoc /* String */ _strings = new HashSet JavaDoc (length);
97         final List JavaDoc /* String */ _result = new ArrayList JavaDoc (length);
98         
99         for (int i = 0; i < length; ++ i)
100         {
101             final String JavaDoc s = strings [i];
102             if (removeNull && (s == null)) continue;
103             
104             final StringTokenizer JavaDoc tokenizer = new StringTokenizer JavaDoc (s, delimiters);
105             while (tokenizer.hasMoreTokens ())
106             {
107                 final String JavaDoc ss = tokenizer.nextToken ();
108                 if (_strings.add (ss)) _result.add (ss);
109             }
110         }
111         
112         final String JavaDoc [] result = new String JavaDoc [_result.size ()];
113         _result.toArray (result);
114             
115         return result;
116     }
117     
118     /**
119      * Removes duplicates.
120      *
121      * @param delimiters
122      * @param processAtFiles
123      * @return
124      * @throws IOException
125      */

126     public static String JavaDoc [] mergeAT (final String JavaDoc [] strings, final String JavaDoc delimiters, final boolean processAtFiles)
127         throws IOException JavaDoc
128     {
129         if (! processAtFiles)
130             return merge (strings, delimiters, true);
131         else
132         {
133             if (strings == null) return strings;
134         
135             final int length = strings.length;
136             if (length == 0) return strings;
137             
138             if ((delimiters == null) || (delimiters.length () == 0))
139                 throw new IllegalArgumentException JavaDoc ("null/empty input: delimiters");
140             
141             final Set JavaDoc /* String */ _strings = new HashSet JavaDoc (length);
142             final List JavaDoc /* String */ _result = new ArrayList JavaDoc (length);
143             
144             for (int i = 0; i < length; ++ i)
145             {
146                 final String JavaDoc s = strings [i];
147                 if (s == null) continue;
148                 
149                 final StringTokenizer JavaDoc tokenizer = new StringTokenizer JavaDoc (s, delimiters);
150                 while (tokenizer.hasMoreTokens ())
151                 {
152                     final String JavaDoc ss = tokenizer.nextToken ();
153                         
154                     if (ss.startsWith ("@"))
155                     {
156                         final String JavaDoc [] fileList = Files.readFileList (new File JavaDoc (ss.substring (1)));
157                         for (int j = 0; j < fileList.length; ++ j)
158                         {
159                             final String JavaDoc sss = fileList [j];
160                             if (_strings.add (sss)) _result.add (sss);
161                         }
162                     }
163                     else if (_strings.add (ss)) _result.add (ss);
164                 }
165             }
166             
167             final String JavaDoc [] result = new String JavaDoc [_result.size ()];
168             _result.toArray (result);
169                 
170             return result;
171         }
172     }
173     
174     /**
175      * HTML attribute values can be quoted using either double or single quotes.
176      * Depending on the type of quote used, the other kind can be used unescaped
177      * within the attribute value. This method assumes that only double quotes
178      * are used for delimiting, hence this is the only kind that is escaped.
179      */

180     public static void HTMLEscape (final String JavaDoc s, final StringBuffer JavaDoc append)
181     {
182         if (s == null) throw new IllegalArgumentException JavaDoc ("null input: s");
183         if (append == null) throw new IllegalArgumentException JavaDoc ("null input: append");
184         
185         final char [] chars;
186         if (USE_GET_CHARS) chars = s.toCharArray ();
187         
188         for (int i = 0, iLimit = s.length (); i < iLimit; ++ i)
189         {
190             final char c = USE_GET_CHARS ? chars [i] : s.charAt (i);
191             
192             switch (c)
193             {
194                 case '<':
195                     append.append ("&lt;");
196                     break;
197                     
198                 case '>':
199                     append.append ("&gt;");
200                     break;
201
202                 case '"':
203                     append.append ("&#34;");
204                     break;
205                     
206                 case '&':
207                     append.append ("&amp;");
208                     break;
209                 
210                 default:
211                     append.append (c);
212                 
213             } // end of switch
214
}
215     }
216     
217     /**
218      * Same as {@link #HTMLEscape(String, StringBuffer)} but also replaces spaces
219      * with "&nbsp;"'s, which is handy for escaping code.
220      */

221     public static void HTMLEscapeNB (final String JavaDoc s, final StringBuffer JavaDoc append)
222     {
223         if (s == null) throw new IllegalArgumentException JavaDoc ("null input: s");
224         if (append == null) throw new IllegalArgumentException JavaDoc ("null input: append");
225         
226         final char [] chars;
227         if (USE_GET_CHARS) chars = s.toCharArray ();
228         
229         for (int i = 0, iLimit = s.length (); i < iLimit; ++ i)
230         {
231             final char c = USE_GET_CHARS ? chars [i] : s.charAt (i);
232             
233             switch (c)
234             {
235                 case ' ':
236                     append.append ('\u00A0'); // don't use "&#160;": a waste of space
237
break;
238                     
239                 case '\t':
240                     append.append ("\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0"); // TODO: define a prop for this
241
break;
242                     
243 // case '-':
244
// append.append ((char) 0x8209);
245
// break;
246

247                 case '<':
248                     append.append ("&lt;");
249                     break;
250                     
251                 case '>':
252                     append.append ("&gt;");
253                     break;
254
255                 case '"':
256                     append.append ("&#34;");
257                     break;
258                     
259                 case '&':
260                     append.append ("&amp;");
261                     break;
262                 
263                 default:
264                     append.append (c);
265                 
266             } // end of switch
267
}
268     }
269     
270     public static String JavaDoc HTMLEscape (final String JavaDoc s)
271     {
272         final StringBuffer JavaDoc buf = new StringBuffer JavaDoc ();
273         HTMLEscape (s, buf);
274         
275         return buf.toString ();
276     }
277     
278     public static String JavaDoc HTMLEscapeSP (final String JavaDoc s)
279     {
280         final StringBuffer JavaDoc buf = new StringBuffer JavaDoc ();
281         HTMLEscapeNB (s, buf);
282         
283         return buf.toString ();
284     }
285     
286     // protected: .............................................................
287

288     // package: ...............................................................
289

290     // private: ...............................................................
291

292     
293     private Strings () {} // prevent subclassing
294

295     
296     private static final boolean USE_GET_CHARS = true;
297
298 } // end of class
299
// ----------------------------------------------------------------------------
Popular Tags