/*
* Copyright (C) 2014 Indeed Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.indeed.imhotep.io;
import com.google.common.io.ByteStreams;
import com.google.protobuf.Message;
import com.indeed.imhotep.frontend.protobuf.ImhotepFrontendRequest;
import com.indeed.imhotep.frontend.protobuf.ImhotepFrontendResponse;
import com.indeed.imhotep.protobuf.GroupMultiRemapMessage;
import com.indeed.imhotep.protobuf.GroupRemapMessage;
import com.indeed.imhotep.protobuf.ImhotepRequest;
import com.indeed.imhotep.protobuf.ImhotepResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* @author jsgroth
*
* static utility methods for sending and receiving imhotep protobufs
*/
public final class ImhotepProtobufShipping {
private ImhotepProtobufShipping() {}
public static void sendProtobuf(Message request, OutputStream os) throws IOException {
os.write(Bytes.intToBytes(request.getSerializedSize()));
request.writeTo(os);
os.flush();
}
public static ImhotepRequest readRequest(InputStream is) throws IOException {
return ImhotepRequest.parseFrom(readPayloadStream(is));
}
public static GroupMultiRemapMessage readGroupMultiRemapMessage(InputStream is) throws IOException {
return GroupMultiRemapMessage.parseFrom(readPayloadStream(is));
}
public static GroupRemapMessage readGroupRemapMessage(InputStream is) throws IOException {
return GroupRemapMessage.parseFrom(readPayloadStream(is));
}
public static ImhotepResponse readResponse(InputStream is) throws IOException {
return ImhotepResponse.parseFrom(readPayloadStream(is));
}
public static ImhotepFrontendRequest readFrontendRequest(InputStream is) throws IOException {
return ImhotepFrontendRequest.parseFrom(readPayloadStream(is));
}
public static ImhotepFrontendResponse readFrontendResponse(InputStream is) throws IOException {
return ImhotepFrontendResponse.parseFrom(readPayloadStream(is));
}
private static InputStream readPayloadStream(InputStream is) throws IOException {
final byte[] payloadLengthBytes = new byte[4];
ByteStreams.readFully(is, payloadLengthBytes);
final int payloadLength = Bytes.bytesToInt(payloadLengthBytes);
return ByteStreams.limit(is, payloadLength);
}
}