package org.glassfish.grizzly.websockets;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import jakarta.servlet.ReadListener;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.WriteListener;
public final class Utils {
static final ServletInputStream NULL_SERVLET_INPUT_STREAM = new ServletInputStream() {
@Override
public int read() throws IOException {
return -1;
}
@Override
public boolean isFinished() {
return true;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(final ReadListener readListener) {
try {
readListener.onAllDataRead();
} catch (IOException e) {
readListener.onError(e);
}
}
};
static final Reader NULL_READER = new Reader() {
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
return -1;
}
@Override
public void close() throws IOException {
}
};
static final ServletOutputStream NULL_SERVLET_OUTPUT_STREAM = new ServletOutputStream() {
private IOException ioe1;
private IOException ioe2;
@Override
public boolean isReady() {
return true;
}
@Override
public void setWriteListener(final WriteListener writeListener) {
if (ioe1 == null) {
ioe1 = new IOException("Can't write to a websocket using ServletOutputStream");
}
writeListener.onError(ioe1);
}
@Override
public void write(final int b) throws IOException {
if (ioe2 == null) {
ioe2 = new IOException("Can't write to a websocket using ServletOutputStream");
}
throw ioe2;
}
};
static final Writer NULL_WRITER = new Writer() {
private IOException ioe;
@Override
public void write(char[] cbuf, int off, int len) throws IOException {
if (ioe == null) {
ioe = new IOException("Can't write to a websocket using ServletWriter");
}
throw ioe;
}
@Override
public void flush() throws IOException {
}
@Override
public void close() throws IOException {
}
};
public static byte[] toArray(long length) {
long value = length;
byte[] b = new byte[8];
for (int i = 7; i >= 0 && value > 0; i--) {
b[i] = (byte) (value & 0xFF);
value >>= 8;
}
return b;
}
public static long toLong(byte[] bytes, int start, int end) {
long value = 0;
for (int i = start; i < end; i++) {
value <<= 8;
value ^= (long) bytes[i] & 0xFF;
}
return value;
}
public static List<String> toString(byte[] bytes) {
return toString(bytes, 0, bytes.length);
}
public static List<String> toString(byte[] bytes, int start, int end) {
List<String> list = new ArrayList<>();
for (int i = start; i < end; i++) {
list.add(Integer.toHexString(bytes[i] & 0xFF).toUpperCase(Locale.US));
}
return list;
}
}