messagebytes.java
来自「精通tomcat书籍原代码,希望大家共同学习」· Java 代码 · 共 733 行 · 第 1/2 页
JAVA
733 行
/**
* Returns true if the message bytes starts with the specified string.
* @param s the string
*/
public boolean startsWith(String s) {
switch (type) {
case T_STR:
return strValue.startsWith( s );
case T_CHARS:
return charC.startsWith( s );
case T_BYTES:
return byteC.startsWith( s );
default:
return false;
}
}
/**
* Returns true if the message bytes starts with the specified string.
* @param s the string
* @param pos The start position
*/
public boolean startsWithIgnoreCase(String s, int pos) {
switch (type) {
case T_STR:
if( strValue==null ) return false;
if( strValue.length() < pos + s.length() ) return false;
for( int i=0; i<s.length(); i++ ) {
if( Ascii.toLower( s.charAt( i ) ) !=
Ascii.toLower( strValue.charAt( pos + i ))) {
return false;
}
}
return true;
case T_CHARS:
return charC.startsWithIgnoreCase( s, pos );
case T_BYTES:
return byteC.startsWithIgnoreCase( s, pos );
default:
return false;
}
}
// -------------------- Hash code --------------------
public int hashCode() {
if( hasHashCode ) return hashCode;
int code = 0;
if( caseSensitive )
code=hash();
else
code=hashIgnoreCase();
hashCode=code;
hasHashCode=true;
return code;
}
// normal hash.
private int hash() {
int code=0;
switch (type) {
case T_STR:
// We need to use the same hash function
for (int i = 0; i < strValue.length(); i++) {
code = code * 37 + strValue.charAt( i );
}
return code;
case T_CHARS:
return charC.hash();
case T_BYTES:
return byteC.hash();
default:
return 0;
}
}
// hash ignoring case
private int hashIgnoreCase() {
int code=0;
switch (type) {
case T_STR:
for (int i = 0; i < strValue.length(); i++) {
code = code * 37 + Ascii.toLower(strValue.charAt( i ));
}
return code;
case T_CHARS:
return charC.hashIgnoreCase();
case T_BYTES:
return byteC.hashIgnoreCase();
default:
return 0;
}
}
public int indexOf(char c) {
return indexOf( c, 0);
}
// Inefficient initial implementation. Will be replaced on the next
// round of tune-up
public int indexOf(String s, int starting) {
toString();
return strValue.indexOf( s, starting );
}
// Inefficient initial implementation. Will be replaced on the next
// round of tune-up
public int indexOf(String s) {
return indexOf( s, 0 );
}
public int indexOfIgnoreCase(String s, int starting) {
toString();
String upper=strValue.toUpperCase();
String sU=s.toUpperCase();
return upper.indexOf( sU, starting );
}
/**
* Returns true if the message bytes starts with the specified string.
* @param c the character
* @param starting The start position
*/
public int indexOf(char c, int starting) {
switch (type) {
case T_STR:
return strValue.indexOf( c, starting );
case T_CHARS:
return charC.indexOf( c, starting);
case T_BYTES:
return byteC.indexOf( c, starting );
default:
return -1;
}
}
/** Copy the src into this MessageBytes, allocating more space if
* needed
*/
public void duplicate( MessageBytes src ) throws IOException
{
switch( src.getType() ) {
case MessageBytes.T_BYTES:
type=T_BYTES;
ByteChunk bc=src.getByteChunk();
byteC.allocate( 2 * bc.getLength(), -1 );
byteC.append( bc );
break;
case MessageBytes.T_CHARS:
type=T_CHARS;
CharChunk cc=src.getCharChunk();
charC.allocate( 2 * cc.getLength(), -1 );
charC.append( cc );
break;
case MessageBytes.T_STR:
type=T_STR;
String sc=src.getString();
this.setString( sc );
break;
}
}
// -------------------- Deprecated code --------------------
// efficient int, long and date
// XXX used only for headers - shouldn't be
// stored here.
private int intValue;
private boolean hasIntValue=false;
private long longValue;
private boolean hasLongValue=false;
private Date dateValue;
private boolean hasDateValue=false;
/**
* @deprecated The buffer are general purpose, caching for headers should
* be done in headers. The second parameter allows us to pass a date format
* instance to avoid synchronization problems.
*/
public void setTime(long t, DateFormat df) {
// XXX replace it with a byte[] tool
recycle();
if( dateValue==null)
dateValue=new Date(t);
else
dateValue.setTime(t);
if( df==null )
strValue=DateTool.format1123(dateValue);
else
strValue=DateTool.format1123(dateValue,df);
hasStrValue=true;
hasDateValue=true;
type=T_STR;
}
public void setTime(long t) {
setTime( t, null );
}
/** Set the buffer to the representation of an int
*/
public void setInt(int i) {
byteC.allocate(16, 32);
int current = i;
byte[] buf = byteC.getBuffer();
int start = 0;
int end = 0;
if (i == 0) {
buf[end++] = (byte) '0';
}
if (i < 0) {
current = -i;
buf[end++] = (byte) '-';
}
while (current > 0) {
int digit = current % 10;
current = current / 10;
buf[end++] = HexUtils.HEX[digit];
}
byteC.setOffset(0);
byteC.setEnd(end);
// Inverting buffer
end--;
if (i < 0) {
start++;
}
while (end > start) {
byte temp = buf[start];
buf[start] = buf[end];
buf[end] = temp;
start++;
end--;
}
intValue=i;
hasStrValue=false;
hasHashCode=false;
hasIntValue=true;
hasLongValue=false;
hasDateValue=false;
type=T_BYTES;
}
/** Set the buffer to the representation of an long
*/
public void setLong(long l) {
byteC.allocate(32, 64);
long current = l;
byte[] buf = byteC.getBuffer();
int start = 0;
int end = 0;
if (l == 0) {
buf[end++] = (byte) '0';
}
if (l < 0) {
current = -l;
buf[end++] = (byte) '-';
}
while (current > 0) {
int digit = (int) (current % 10);
current = current / 10;
buf[end++] = HexUtils.HEX[digit];
}
byteC.setOffset(0);
byteC.setEnd(end);
// Inverting buffer
end--;
if (l < 0) {
start++;
}
while (end > start) {
byte temp = buf[start];
buf[start] = buf[end];
buf[end] = temp;
start++;
end--;
}
longValue=l;
hasStrValue=false;
hasHashCode=false;
hasIntValue=false;
hasLongValue=true;
hasDateValue=false;
type=T_BYTES;
}
/**
* @deprecated The buffer are general purpose, caching for headers should
* be done in headers
*/
public long getTime()
{
if( hasDateValue ) {
if( dateValue==null) return -1;
return dateValue.getTime();
}
long l=DateTool.parseDate( this );
if( dateValue==null)
dateValue=new Date(l);
else
dateValue.setTime(l);
hasDateValue=true;
return l;
}
// Used for headers conversion
/** Convert the buffer to an int, cache the value
*/
public int getInt()
{
if( hasIntValue )
return intValue;
switch (type) {
case T_BYTES:
intValue=byteC.getInt();
break;
default:
intValue=Integer.parseInt(toString());
}
hasIntValue=true;
return intValue;
}
// Used for headers conversion
/** Convert the buffer to an long, cache the value
*/
public long getLong() {
if( hasLongValue )
return longValue;
switch (type) {
case T_BYTES:
longValue=byteC.getLong();
break;
default:
longValue=Long.parseLong(toString());
}
hasLongValue=true;
return longValue;
}
// -------------------- Future may be different --------------------
private static MessageBytesFactory factory=new MessageBytesFactory();
public static void setFactory( MessageBytesFactory mbf ) {
factory=mbf;
}
public static class MessageBytesFactory {
protected MessageBytesFactory() {
}
public MessageBytes newInstance() {
return new MessageBytes();
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?