001: package com.protomatter.util;
002:
003: /**
004: * {{{ The Protomatter Software License, Version 1.0
005: * derived from The Apache Software License, Version 1.1
006: *
007: * Copyright (c) 1998-2002 Nate Sammons. All rights reserved.
008: *
009: * Redistribution and use in source and binary forms, with or without
010: * modification, are permitted provided that the following conditions
011: * are met:
012: *
013: * 1. Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * 2. Redistributions in binary form must reproduce the above copyright
017: * notice, this list of conditions and the following disclaimer in
018: * the documentation and/or other materials provided with the
019: * distribution.
020: *
021: * 3. The end-user documentation included with the redistribution,
022: * if any, must include the following acknowledgment:
023: * "This product includes software developed for the
024: * Protomatter Software Project
025: * (http://protomatter.sourceforge.net/)."
026: * Alternately, this acknowledgment may appear in the software itself,
027: * if and wherever such third-party acknowledgments normally appear.
028: *
029: * 4. The names "Protomatter" and "Protomatter Software Project" must
030: * not be used to endorse or promote products derived from this
031: * software without prior written permission. For written
032: * permission, please contact support@protomatter.com.
033: *
034: * 5. Products derived from this software may not be called "Protomatter",
035: * nor may "Protomatter" appear in their name, without prior written
036: * permission of the Protomatter Software Project
037: * (support@protomatter.com).
038: *
039: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
040: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
041: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
042: * DISCLAIMED. IN NO EVENT SHALL THE PROTOMATTER SOFTWARE PROJECT OR
043: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
044: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
045: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
046: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
047: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
048: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
049: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
050: * SUCH DAMAGE. }}}
051: */
052:
053: import java.util.*;
054:
055: /**
056: * Utility methods for manipulating strings.
057: */
058: public class StringUtil {
059: /**
060: * Private constructor so nobody constructs us.
061: */
062: private StringUtil() {
063: super ();
064: }
065:
066: /**
067: * Makes sure that a string has no more than n characters,
068: * and pads it with spaces if it does.
069: */
070: public static void pad(StringBuffer b, String s, int n) {
071: int l = s.length();
072: if (l == n) {
073: b.append(s);
074: return;
075: } else if (l > n) {
076: b.append(s.substring(0, n));
077: return;
078: } else {
079: b.append(s.substring(0, l));
080: while (l++ < n)
081: b.append(' ');
082: return;
083: }
084: }
085:
086: /**
087: * Makes sure that a string has no more than n characters,
088: * and pads it with spaces if it does.
089: */
090: public static String pad(String s, int n) {
091: int l = s.length();
092: if (l == n)
093: return s;
094: else if (l > n)
095: return s.substring(0, n);
096: else {
097: char[] carr = new char[n];
098: s.getChars(0, l, carr, 0);
099: while (l < n)
100: carr[l++] = ' ';
101: return new String(carr);
102: }
103: }
104:
105: /**
106: * Truncate a string to the given length.
107: * If s.length() <= n, returns s.
108: * Else, returns the first n characters of s.
109: */
110: public static String truncate(String s, int n) {
111: if (s.length() <= n)
112: return s;
113: else
114: return s.substring(0, n);
115: }
116:
117: /**
118: * Nicely truncate a string.
119: * Truncates s to n chars breaking s on whitespace,
120: * and adding a "..." to the end.
121: */
122: public static String truncateNicely(String s, int n) {
123: if (n <= 3) {
124: StringBuffer b = new StringBuffer(n);
125: for (int i = 0; i < n; i++)
126: b.append(".");
127: return b.toString();
128: }
129: int sublen = n - 3;
130: StringBuffer clippedtext = new StringBuffer();
131: StringTokenizer st = new StringTokenizer(s);
132: while (st.hasMoreTokens()) {
133: String word = st.nextToken();
134: int cliplen = clippedtext.length();
135: if (word.length() + cliplen + 1 <= sublen) {
136: if (cliplen == 0) {
137: clippedtext.append(word);
138: } else {
139: clippedtext.append(" ");
140: clippedtext.append(word);
141: }
142: } else {
143: if (clippedtext.length() == 0)
144: clippedtext.append(s.substring(0, sublen));
145: clippedtext.append("...");
146: break;
147: }
148: }
149: return clippedtext.toString();
150: }
151:
152: public static String replace(String inputString, String token,
153: String replacement) {
154: int index = 0;
155: int replacementLength = replacement.length();
156: int tokenLength = token.length();
157: String input = inputString;
158: while (true) {
159: index = input.indexOf(token, index);
160: if (index == -1) {
161: return input;
162: }
163: StringBuffer buf = new StringBuffer(input.length()
164: + replacementLength);
165: buf.append(input.substring(0, index));
166: buf.append(replacement);
167: buf.append(input.substring(index + tokenLength));
168: input = buf.toString();
169: }
170: }
171: }
|