public static String chopAtWord(String string, int length) {
        if (string == null || string.isEmpty()) {
            return string;
        }

        char[] charArray = string.toCharArray();
        int sLength = string.length();
        if (length < sLength) {
            sLength = length;
        }

        // First check if there is a newline character before length; if so,
        // chop word there.
        for (int i = 0; i < sLength - 1; i++) {
            // Windows
            if (charArray[i] == '\r' && charArray[i + 1] == '\n') {
                return string.substring(0, i + 1);
            }
            // Unix
            else if (charArray[i] == '\n') {
                return string.substring(0, i);
            }
        }
        // Also check boundary case of Unix newline
        if (charArray[sLength - 1] == '\n') {
            return string.substring(0, sLength - 1);
        }

        // Done checking for newline, now see if the total string is less than
        // the specified chop point.
        if (string.length() < length) {
            return string;
        }

        // No newline, so chop at the first whitespace.
        for (int i = length - 1; i > 0; i--) {
            if (charArray[i] == ' ') {
                return string.substring(0, i).trim();
            }
        }

        // Did not find word boundary so return original String chopped at
        // specified length.
        return string.substring(0, length);
    }
Intelligently chops a String at a word boundary (whitespace) that occurs
at the specified index in the argument or before. However, if there is a
newline character before <code>length</code>, the String will be chopped
there. If no newline or whitespace is found in <code>string</code> up to
the index <code>length</code>, the String will chopped at <code>length</code>.
<p>
For example, chopAtWord("This is a nice String", 10) will return
"This is a" which is the first word boundary less than or equal to 10
characters into the original String.</p>

@param string the String to chop.
@param length the index in <code>string</code> to start looking for a
              whitespace boundary at.
@return a substring of <code>string</code> whose length is less than or
        equal to <code>length</code>, and that is chopped at whitespace.
xmppserver/src/main/java/org/jivesoftware/util/StringUtils.java