/*
* JBoss, Home of Professional Open Source.
* Copyright 2011, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.protocol.mgmt;
import java.io.DataInput;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.jboss.as.protocol.logging.ProtocolLogger;
import org.jboss.as.protocol.StreamUtils;
/**
* Utility class providing methods for common management tasks.
*
* @author John Bailey
*/
public final class ProtocolUtils {
public static FlushableDataOutput wrapAsDataOutput(final OutputStream os) {
return FlushableDataOutputImpl.create(os);
}
public static <A> ManagementRequestContext.AsyncTask<A> emptyResponseTask() {
return new ManagementRequestContext.AsyncTask<A>() {
@Override
public void execute(final ManagementRequestContext<A> context) throws Exception {
final ManagementResponseHeader header = ManagementResponseHeader.create(context.getRequestHeader());
final FlushableDataOutput output = context.writeMessage(header);
try {
output.writeByte(ManagementProtocol.RESPONSE_END);
output.close();
} finally {
StreamUtils.safeClose(output);
}
}
};
}
public static <A> void writeResponse(final ResponseWriter writer, final ManagementRequestContext<A> context) throws IOException {
final ManagementResponseHeader header = ManagementResponseHeader.create(context.getRequestHeader());
writeResponse(writer, context, header);
}
public static <A> void writeResponse(final ResponseWriter writer, final ManagementRequestContext<A> context, final ManagementResponseHeader header) throws IOException {
final FlushableDataOutput output = context.writeMessage(header);
try {
writer.write(output);
output.writeByte(ManagementProtocol.RESPONSE_END);
output.close();
} finally {
StreamUtils.safeClose(output);
}
}
public static void expectHeader(final InputStream input, int expected) throws IOException {
expectHeader(readByte(input), expected);
}
public static void expectHeader(final DataInput input, int expected) throws IOException {
expectHeader(input.readByte(), expected);
}
public static void expectHeader(final byte actual, int expected) throws IOException {
if (actual != (byte) expected) {
throw ProtocolLogger.ROOT_LOGGER.invalidByteToken(expected, actual);
}
}
public static int readInt(final InputStream in) throws IOException {
int ch1 = in.read();
int ch2 = in.read();
int ch3 = in.read();
int ch4 = in.read();
if ((ch1 | ch2 | ch3 | ch4) < 0)
throw new EOFException();
return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
}
public static void writeInt(final OutputStream out, final int v) throws IOException {
out.write((v >>> 24) & 0xFF);
out.write((v >>> 16) & 0xFF);
out.write((v >>> 8) & 0xFF);
out.write((v >>> 0) & 0xFF);
}
public static byte readByte(final InputStream stream) throws IOException {
int b = stream.read();
if (b == -1) {
throw new EOFException();
}
return (byte) b;
}
public interface ResponseWriter {
ResponseWriter EMPTY = new ResponseWriter() {
@Override
public void write(FlushableDataOutput output) throws IOException {
// nothing
}
};
void write(FlushableDataOutput output) throws IOException;
}
}