/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 1997-2010 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
* or packager/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
/*
* StringScanner.java
*
* Created on March 3, 2000
*/
package com.sun.jdo.spi.persistence.support.sqlstore.utility;
import java.util.*;
/**
* Helper class for breaking up a string.
* <P>
*<P>
*/
//
public class StringScanner
{
private static String intStrTable[] = new String[2048];
static int skipWhite(String s, int offset)
{
int end = s.length();
if (offset < 0)
return end;
while (offset < end && Character.isWhitespace(s.charAt(offset)))
offset++;
return offset;
}
static int skipTo(String s, int offset, String delim)
{
int end = s.length();
if (offset < 0)
return end;
while (offset < end && delim.indexOf(s.charAt(offset)) == -1)
offset++;
return offset;
}
static int skipTo(String s, int offset, char delim)
{
int end = s.length();
if (offset < 0)
return end;
while (offset < end && delim != s.charAt(offset))
offset++;
return offset;
}
static char charAt(String s, int offset)
{
if (offset < 0 || offset >= s.length())
return '\0';
return s.charAt(offset);
}
static int skipInt(String s, int offset)
{
int end = s.length();
if (offset < 0 || !Character.isDigit(s.charAt(offset)))
return end;
//
// Unlike the others, this can return the offset past the end
// of the string. The idea is that the caller wants to
// do a substring to get the integer.
//
while (offset < end && Character.isDigit(s.charAt(offset)))
offset++;
return offset;
}
public static String format(StringBuffer buf, String fmt, Object o1)
{
return format(buf, fmt, 1, o1, null, null, null, null, null, null,
null, null);
}
public static String format(StringBuffer buf, String fmt,
Object o1,
Object o2)
{
return format(buf, fmt, 2, o1, o2, null, null, null, null, null,
null, null);
}
public static String format(StringBuffer buf, String fmt,
Object o1,
Object o2,
Object o3)
{
return format(buf, fmt, 3, o1, o2, o3, null, null, null, null,
null, null);
}
public static String format(StringBuffer buf, String fmt,
Object o1,
Object o2,
Object o3,
Object o4)
{
return format(buf, fmt, 4, o1, o2, o3, o4, null, null, null,
null, null);
}
public static String format(StringBuffer buf, String fmt,
Object o1,
Object o2,
Object o3,
Object o4,
Object o5)
{
return format(buf, fmt, 5, o1, o2, o3, o4, o5, null, null, null, null);
}
public static String format(StringBuffer buf, String fmt,
Object o1,
Object o2,
Object o3,
Object o4,
Object o5,
Object o6)
{
return format(buf, fmt, 6, o1, o2, o3, o4, o5, o6, null, null, null);
}
public static String format(StringBuffer buf, String fmt,
Object o1,
Object o2,
Object o3,
Object o4,
Object o5,
Object o6,
Object o7)
{
return format(buf, fmt, 7, o1, o2, o3, o4, o5, o6, o7, null, null);
}
public static String format(StringBuffer buf, String fmt,
Object o1,
Object o2,
Object o3,
Object o4,
Object o5,
Object o6,
Object o7,
Object o8)
{
return format(buf, fmt, 8, o1, o2, o3, o4, o5, o6, o7, o8, null);
}
public static String format(StringBuffer buf, String fmt,
Object o1,
Object o2,
Object o3,
Object o4,
Object o5,
Object o6,
Object o7,
Object o8,
Object o9)
{
return format(buf, fmt, 9, o1, o2, o3, o4, o5, o6, o7, o8, o9);
}
public static String format(StringBuffer buf, String fmt,
int argcnt,
Object o1,
Object o2,
Object o3,
Object o4,
Object o5,
Object o6,
Object o7,
Object o8,
Object o9)
{
Object[] params = {o1, o2, o3, o4, o5, o6, o7, o8, o9};
int i = 0;
int begSubstr = 0;
int percent;
int nextParam = 0;
StringBuffer msg;
int fmtLen;
if (buf == null)
msg = new StringBuffer();
else
msg = buf;
fmtLen = fmt.length();
while ((percent = fmt.indexOf('%', i)) >= 0 && percent < (fmtLen - 1))
{
char c = fmt.charAt(percent + 1);
boolean leftJustify = false;
boolean raw = false;
int nextChar = percent;
if (c == '-')
{
nextChar++;
leftJustify = true;
if (nextChar + 1 < fmtLen)
c = fmt.charAt(nextChar + 1);
}
if (Character.isDigit(c))
{
int endInt = StringScanner.skipInt(fmt, nextChar + 1);
int size = Integer.parseInt(fmt.substring(nextChar + 1,endInt));
if (size == 0)
raw = true;
msg.append(fmt.substring(begSubstr, percent));
if (nextParam < argcnt)
{
Object p = params[nextParam++];
String val = p.toString();
int len = val.length();
if (!raw)
{
if (!leftJustify && len < size)
{
for (int j = 0; j < size - len; j++)
msg.append(" "); // NOI18N
}
else if (len > size)
{
val = val.substring(0, size);
}
}
msg.append(val);
if (leftJustify && len < size)
{
for (int j = 0; j < size - len; j++)
msg.append(" "); // NOI18N
}
}
else
{
/* throw (StringIndexOutOfBoundsException)
ErrorManager.createFormatAdd(
java.lang.StringIndexOutOfBoundsException.class,
ErrorManager.USER,
UtilMsgCat.SP_ERR_FMT_OUT_OF_RANGE,
(new Integer(nextParam)),
(new Integer(1)), (new Integer(argcnt)), fmt);
*/
}
i = endInt;
begSubstr = i;
}
else
{
i = nextChar + 1;
}
}
msg.append(fmt.substring(begSubstr, fmtLen));
return msg.toString();
}
static String createParamString(String message,
int argcnt,
Object param1,
Object param2,
Object param3,
Object param4,
Object param5,
Object param6,
Object param7,
Object param8,
Object param9)
{
if (argcnt < 1 || argcnt > 9)
return message;
Object[] p = null;
if (argcnt == 1)
{
Object[] params = {param1};
p = params;
}
else if (argcnt == 2)
{
Object[] params = {param1, param2};
p = params;
}
else if (argcnt == 3)
{
Object[] params = {param1, param2, param3};
p = params;
}
else if (argcnt == 4)
{
Object[] params = {param1, param2, param3, param4};
p = params;
}
else if (argcnt == 5)
{
Object[] params = {param1, param2, param3, param4, param5};
p = params;
}
else if (argcnt == 6)
{
Object[] params = {param1, param2, param3, param4, param5,
param6};
p = params;
}
else if (argcnt == 7)
{
Object[] params = {param1, param2, param3, param4, param5,
param6, param7};
p = params;
}
else if (argcnt == 8)
{
Object[] params = {param1, param2, param3, param4, param5,
param6, param7, param8};
p = params;
}
else if (argcnt == 9)
{
Object[] params = {param1, param2, param3, param4, param5,
param6, param7, param8, param9};
p = params;
}
//
// Decide if we should use our own formatting algorithm or
// call Java's MessageFormat.format(). Our own algorithm is
// about 20 times faster but cannot deal with templates.
// So, use our own if no template is involved. i.e. only
// positional parameters.
// e.g. {0} is OK but {0,ddd-mmm-yyyy} is not.
//
boolean useJava = false;
int lbrace, rbrace = 0;
int i = 0;
// look for the start of next positional parameter
while ((lbrace = message.indexOf('{', i)) >= 0)
{
// if the parameter doesn't end with a right brace, get
// out and use the Java formatter. Or if there are more
// than 1 character between the braces (e.g. {0,ddd-mmm-yyyy})
if ((rbrace = message.indexOf('}', lbrace + 1)) < 0 ||
(rbrace - lbrace) > 2)
{
useJava = true;
break;
}
i = rbrace + 1;
}
if (useJava)
{
return java.text.MessageFormat.format(message, p);
}
// Since we are using our own algorithm, we need to get rid of
// the pesty single quote escape character
int esc;
boolean foundEsc = false;
StringBuffer msg = new StringBuffer();
i = 0;
while ((esc = message.indexOf('\'', i)) >= 0)
{
msg.append(message.substring(i, esc));
msg.append(message.substring(esc + 1, esc + 2));
i = esc + 2;
foundEsc = true;
}
if (foundEsc)
{
msg.append(message.substring(i, message.length()));
message = msg.toString();
}
char c;
i = 0;
int msglen = message.length();
msg = new StringBuffer();
while ( (lbrace = message.indexOf('{', i)) >= 0
&& lbrace < msglen-1)
{
c = message.charAt(lbrace + 1);
if (Character.isDigit(c))
{
int pnum = c - '0';
if (0 <= pnum && pnum < argcnt)
{
Object pp = p[pnum];
msg.append(message.substring(i, lbrace));
if (pp == null)
{
msg.append("<null>"); // NOI18N
}
else
{
msg.append(pp.toString());
}
}
else
{
if (argcnt > 0)
{
/* throw (StringIndexOutOfBoundsException)
ErrorManager.createFormatAdd(
java.lang.StringIndexOutOfBoundsException.class,
ErrorManager.USER,
UtilMsgCat.SP_ERR_FMT_OUT_OF_RANGE,
(new Integer(pnum)),
(new Integer(1)), (new Integer(argcnt)), msg);
*/
}
else
{
/* throw (StringIndexOutOfBoundsException)
ErrorManager.createFormatAdd(
java.lang.StringIndexOutOfBoundsException.class,
ErrorManager.USER,
UtilMsgCat.SP_ERR_FMT_MISSING_PARAM,
(new Integer(pnum)), msg);
*/
}
}
i = lbrace + 3;
}
else
{
i = lbrace + 1;
}
}
msg.append(message.substring(i, msglen));
return msg.toString();
}
/**
* Return a string containing a "level" number of spaces.
* <P>
* Used for formatted print, this will return a string containing 4
* spaces for each specified level.
* @return The requested string.
* @param level The level to fill to.
*/
//
// CHANGES
// 6-aug-1997
// Created (jak)
//
//
public static String levelString(int level)
{
int i;
String str;
if (level <= 0)
return ""; // NOI18N
switch (level)
{
case 1:
return " "; // NOI18N
case 2:
return " "; // NOI18N
case 3:
return " "; // NOI18N
case 4:
return " "; // NOI18N
case 5:
return " "; // NOI18N
case 6:
return " "; // NOI18N
default:
str = new String(" "); // NOI18N
for (i = 6; i < level; i++)
str = str.concat(" "); // NOI18N
return str;
}
}
/**
* Split a string into sub-strings based on a given delimeter.
* <P>
* Split str based on the delimeter and return as an array of Strings.
* @return An array of sub-strings
* @param delimeter The string representing the delimeters.
* @param str The string to process.
*/
//
// CHANGES
// 12-jun-1997
// Created (jak)
// 6-aug-1997
// Moved from CommandShell (jak)
//
//
public static Vector splitString(String str, String delimeter)
{
int mark;
int start;
int delLen;
Vector list;
list = new Vector();
if (str != null)
{
mark = 0;
start = 0;
delLen = delimeter.length();
while ((start = str.indexOf(delimeter, mark)) != -1)
{
if (start != 0)
list.addElement((Object) str.substring(mark, start));
mark = start + delLen;
}
// Put in the last bit.
if (mark < str.length())
list.addElement((Object) str.substring(mark));
}
return list;
}
/**
* Fills a string with blanks to a given size.
* <P>
* Left or right fills the given string with spaces (' ').
* @return A new filled string.
* false.
* @param left true when the text should be left justified, otherwise
* @param len The desired length of the formatted string.
* @param str The string to process.
*/
//
// CHANGES
// 19-aug-1997
// Created (jak)
//
//
public static String fill(String str, int len, boolean left)
{
String nstr;
int startLen;
int diff;
if (str == null)
str = "null"; // NOI18N
startLen = str.length();
nstr = str;
while (startLen < len)
{
diff = len - startLen;
if (diff >= 10)
{
startLen += 10;
if (left)
nstr = nstr + " "; // NOI18N
else
nstr = " " + nstr; // NOI18N
continue;
}
else if (diff >= 8)
{
startLen += 8;
if (left)
nstr = nstr + " "; // NOI18N
else
nstr = " " + nstr; // NOI18N
continue;
}
else if (diff >= 4)
{
startLen += 4;
if (left)
nstr = nstr + " "; // NOI18N
else
nstr = " " + nstr; // NOI18N
continue;
}
else if (diff >= 2)
{
startLen += 2;
if (left)
nstr = nstr + " "; // NOI18N
else
nstr = " " + nstr; // NOI18N
continue;
}
else
{
startLen++;
if (left)
nstr = nstr + " "; // NOI18N
else
nstr = " " + nstr; // NOI18N
continue;
}
}
return nstr;
}
public static String createParamString(String fmt)
{
return fmt;
}
public static String createParamString(String fmt, Object obj1)
{
return StringScanner.createParamString(fmt, 1, obj1, null, null, null,
null, null, null, null, null);
}
public static String createParamString(String fmt, Object obj1, Object obj2)
{
return StringScanner.createParamString(fmt, 2, obj1, obj2, null, null,
null, null, null, null, null);
}
public static String createParamString(String fmt, Object obj1, Object obj2,
Object obj3)
{
return StringScanner.createParamString(fmt, 3, obj1, obj2, obj3, null,
null, null, null, null, null);
}
public static String createParamString(String fmt, Object obj1, Object obj2,
Object obj3, Object obj4)
{
return StringScanner.createParamString(fmt, 4, obj1, obj2, obj3, obj4,
null, null, null, null, null);
}
public static String createParamString(String fmt, Object obj1, Object obj2,
Object obj3, Object obj4,
Object obj5)
{
return StringScanner.createParamString(fmt, 5, obj1, obj2, obj3, obj4,
obj5, null, null, null, null);
}
public static String createParamString(String fmt, Object obj1, Object obj2,
Object obj3, Object obj4,
Object obj5, Object obj6)
{
return StringScanner.createParamString(fmt, 6, obj1, obj2, obj3, obj4,
obj5, obj6, null, null, null);
}
public static String createParamString(String fmt, Object obj1, Object obj2,
Object obj3, Object obj4,
Object obj5, Object obj6,
Object obj7)
{
return StringScanner.createParamString(fmt, 7, obj1, obj2, obj3, obj4,
obj5, obj6, obj7, null, null);
}
public static String createParamString(String fmt, Object obj1, Object obj2,
Object obj3, Object obj4,
Object obj5, Object obj6,
Object obj7, Object obj8)
{
return StringScanner.createParamString(fmt, 8, obj1, obj2, obj3, obj4,
obj5, obj6, obj7, obj8, null);
}
public static String createParamString(String fmt, Object obj1, Object obj2,
Object obj3, Object obj4,
Object obj5, Object obj6,
Object obj7, Object obj8,
Object obj9)
{
return StringScanner.createParamString(fmt, 9, obj1, obj2, obj3, obj4,
obj5, obj6, obj7, obj8, obj9);
}
public static String getIntStr(int num)
{
String str;
boolean big;
try
{
str = (String) StringScanner.intStrTable[num];
big = false;
}
catch (ArrayIndexOutOfBoundsException e)
{
str = null;
big = true;
}
if (str == null)
{
str = Integer.toString(num);
if (!big)
StringScanner.intStrTable[num] = str;
}
return str;
}
}