simplify naming for serialize functions

This commit is contained in:
David Renshaw 2014-10-01 13:15:46 -04:00
parent fdb7c8ad9c
commit db04e2da5e
6 changed files with 92 additions and 101 deletions

View file

@ -5,12 +5,12 @@ import java.io.IOException;
public final class Packed implements Compression { public final class Packed implements Compression {
public void writeBuffered(org.capnproto.BufferedOutputStream writer, public void writeBuffered(org.capnproto.BufferedOutputStream writer,
org.capnproto.MessageBuilder message) throws IOException { org.capnproto.MessageBuilder message) throws IOException {
org.capnproto.SerializePacked.writeMessage(writer, message); org.capnproto.SerializePacked.write(writer, message);
writer.flush(); writer.flush();
} }
public org.capnproto.MessageReader newBufferedReader( public org.capnproto.MessageReader newBufferedReader(
org.capnproto.BufferedInputStream inputStream) throws IOException { org.capnproto.BufferedInputStream inputStream) throws IOException {
return org.capnproto.SerializePacked.newReader(inputStream); return org.capnproto.SerializePacked.read(inputStream);
} }
} }

View file

@ -5,12 +5,12 @@ import java.io.IOException;
public final class Uncompressed implements Compression { public final class Uncompressed implements Compression {
public final void writeBuffered(org.capnproto.BufferedOutputStream writer, public final void writeBuffered(org.capnproto.BufferedOutputStream writer,
org.capnproto.MessageBuilder message) throws IOException { org.capnproto.MessageBuilder message) throws IOException {
org.capnproto.Serialize.writeMessage(writer, message); org.capnproto.Serialize.write(writer, message);
writer.flush(); writer.flush();
} }
public final org.capnproto.MessageReader newBufferedReader( public final org.capnproto.MessageReader newBufferedReader(
org.capnproto.BufferedInputStream inputStream) throws IOException { org.capnproto.BufferedInputStream inputStream) throws IOException {
return org.capnproto.ByteChannelMessageReader.create(inputStream); return org.capnproto.Serialize.read(inputStream);
} }
} }

View file

@ -42,12 +42,12 @@ public class AddressbookMain {
bobPhones.get(1).setType(Person.PhoneNumber.Type.WORK); bobPhones.get(1).setType(Person.PhoneNumber.Type.WORK);
bob.getEmployment().setUnemployed(org.capnproto.Void.VOID); bob.getEmployment().setUnemployed(org.capnproto.Void.VOID);
SerializePacked.writeMessageUnbuffered((new FileOutputStream(FileDescriptor.out)).getChannel(), SerializePacked.writeUnbuffered((new FileOutputStream(FileDescriptor.out)).getChannel(),
message); message);
} }
public static void printAddressBook() throws java.io.IOException { public static void printAddressBook() throws java.io.IOException {
MessageReader message = SerializePacked.newReaderUnbuffered( MessageReader message = SerializePacked.readUnbuffered(
(new FileInputStream(FileDescriptor.in)).getChannel()); (new FileInputStream(FileDescriptor.in)).getChannel());
AddressBook.Reader addressbook = message.getRoot(AddressBook.factory); AddressBook.Reader addressbook = message.getRoot(AddressBook.factory);
for(Person.Reader person : addressbook.getPeople()) { for(Person.Reader person : addressbook.getPeople()) {

View file

@ -1,82 +0,0 @@
package org.capnproto;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.ReadableByteChannel;
import java.util.ArrayList;
public final class ByteChannelMessageReader {
static ByteBuffer makeByteBuffer(int bytes) {
ByteBuffer result = ByteBuffer.allocate(bytes);
result.order(ByteOrder.LITTLE_ENDIAN);
result.mark();
return result;
}
public static void fillBuffer(ByteBuffer buffer, ReadableByteChannel bc) throws IOException {
while(buffer.hasRemaining()) {
int r = bc.read(buffer);
if (r < 0) {
throw new IOException("premature EOF");
}
// TODO check for r == 0 ?.
}
}
public static MessageReader create(ReadableByteChannel bc) throws IOException {
ByteBuffer firstWord = makeByteBuffer(Constants.BYTES_PER_WORD);
fillBuffer(firstWord, bc);
int segmentCount = 1 + firstWord.getInt(0);
int segment0Size = 0;
if (segmentCount > 0) {
segment0Size = firstWord.getInt(4);
}
int totalWords = segment0Size;
if (segmentCount > 512) {
throw new IOException("too many segments");
}
// in words
ArrayList<Integer> moreSizes = new ArrayList<Integer>();
if (segmentCount > 1) {
ByteBuffer moreSizesRaw = makeByteBuffer(4 * (segmentCount & ~1));
fillBuffer(moreSizesRaw, bc);
for (int ii = 0; ii < segmentCount - 1; ++ii) {
int size = moreSizesRaw.getInt(ii * 4);
moreSizes.add(size);
totalWords += size;
}
}
// TODO check that totalWords is reasonable
ByteBuffer allSegments = makeByteBuffer(totalWords * Constants.BYTES_PER_WORD);
fillBuffer(allSegments, bc);
ByteBuffer[] segmentSlices = new ByteBuffer[segmentCount];
allSegments.rewind();
segmentSlices[0] = allSegments.slice();
segmentSlices[0].limit(segment0Size * Constants.BYTES_PER_WORD);
segmentSlices[0].order(ByteOrder.LITTLE_ENDIAN);
int offset = segment0Size;
for (int ii = 1; ii < segmentCount; ++ii) {
allSegments.position(offset * Constants.BYTES_PER_WORD);
segmentSlices[ii] = allSegments.slice();
segmentSlices[ii].limit(moreSizes.get(ii - 1) * Constants.BYTES_PER_WORD);
segmentSlices[ii].order(ByteOrder.LITTLE_ENDIAN);
offset += moreSizes.get(ii - 1);
}
return new MessageReader(segmentSlices);
}
}

View file

@ -1,14 +1,87 @@
package org.capnproto; package org.capnproto;
import java.io.IOException; import java.io.IOException;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel; import java.nio.channels.WritableByteChannel;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.util.ArrayList;
public final class Serialize { public final class Serialize {
public static void writeMessage(WritableByteChannel outputChannel, static ByteBuffer makeByteBuffer(int bytes) {
MessageBuilder message) throws IOException { ByteBuffer result = ByteBuffer.allocate(bytes);
result.order(ByteOrder.LITTLE_ENDIAN);
result.mark();
return result;
}
public static void fillBuffer(ByteBuffer buffer, ReadableByteChannel bc) throws IOException {
while(buffer.hasRemaining()) {
int r = bc.read(buffer);
if (r < 0) {
throw new IOException("premature EOF");
}
// TODO check for r == 0 ?.
}
}
public static MessageReader read(ReadableByteChannel bc) throws IOException {
ByteBuffer firstWord = makeByteBuffer(Constants.BYTES_PER_WORD);
fillBuffer(firstWord, bc);
int segmentCount = 1 + firstWord.getInt(0);
int segment0Size = 0;
if (segmentCount > 0) {
segment0Size = firstWord.getInt(4);
}
int totalWords = segment0Size;
if (segmentCount > 512) {
throw new IOException("too many segments");
}
// in words
ArrayList<Integer> moreSizes = new ArrayList<Integer>();
if (segmentCount > 1) {
ByteBuffer moreSizesRaw = makeByteBuffer(4 * (segmentCount & ~1));
fillBuffer(moreSizesRaw, bc);
for (int ii = 0; ii < segmentCount - 1; ++ii) {
int size = moreSizesRaw.getInt(ii * 4);
moreSizes.add(size);
totalWords += size;
}
}
// TODO check that totalWords is reasonable
ByteBuffer allSegments = makeByteBuffer(totalWords * Constants.BYTES_PER_WORD);
fillBuffer(allSegments, bc);
ByteBuffer[] segmentSlices = new ByteBuffer[segmentCount];
allSegments.rewind();
segmentSlices[0] = allSegments.slice();
segmentSlices[0].limit(segment0Size * Constants.BYTES_PER_WORD);
segmentSlices[0].order(ByteOrder.LITTLE_ENDIAN);
int offset = segment0Size;
for (int ii = 1; ii < segmentCount; ++ii) {
allSegments.position(offset * Constants.BYTES_PER_WORD);
segmentSlices[ii] = allSegments.slice();
segmentSlices[ii].limit(moreSizes.get(ii - 1) * Constants.BYTES_PER_WORD);
segmentSlices[ii].order(ByteOrder.LITTLE_ENDIAN);
offset += moreSizes.get(ii - 1);
}
return new MessageReader(segmentSlices);
}
public static void write(WritableByteChannel outputChannel,
MessageBuilder message) throws IOException {
ByteBuffer[] segments = message.getSegmentsForOutput(); ByteBuffer[] segments = message.getSegmentsForOutput();
int tableSize = (segments.length + 2) & (~1); int tableSize = (segments.length + 2) & (~1);

View file

@ -2,26 +2,26 @@ package org.capnproto;
public final class SerializePacked { public final class SerializePacked {
public static MessageReader newReader(BufferedInputStream input) throws java.io.IOException { public static MessageReader read(BufferedInputStream input) throws java.io.IOException {
PackedInputStream packedInput = new PackedInputStream(input); PackedInputStream packedInput = new PackedInputStream(input);
return ByteChannelMessageReader.create(packedInput); return Serialize.read(packedInput);
} }
public static MessageReader newReaderUnbuffered(java.nio.channels.ReadableByteChannel input) throws java.io.IOException { public static MessageReader readUnbuffered(java.nio.channels.ReadableByteChannel input) throws java.io.IOException {
PackedInputStream packedInput = new PackedInputStream(new BufferedInputStreamWrapper(input)); PackedInputStream packedInput = new PackedInputStream(new BufferedInputStreamWrapper(input));
return ByteChannelMessageReader.create(packedInput); return Serialize.read(packedInput);
} }
public static void writeMessage(BufferedOutputStream output, public static void write(BufferedOutputStream output,
MessageBuilder message) throws java.io.IOException { MessageBuilder message) throws java.io.IOException {
PackedOutputStream packedOutputStream = new PackedOutputStream(output); PackedOutputStream packedOutputStream = new PackedOutputStream(output);
Serialize.writeMessage(packedOutputStream, message); Serialize.write(packedOutputStream, message);
} }
public static void writeMessageUnbuffered(java.nio.channels.WritableByteChannel output, public static void writeUnbuffered(java.nio.channels.WritableByteChannel output,
MessageBuilder message) throws java.io.IOException { MessageBuilder message) throws java.io.IOException {
BufferedOutputStreamWrapper buffered = new BufferedOutputStreamWrapper(output); BufferedOutputStreamWrapper buffered = new BufferedOutputStreamWrapper(output);
writeMessage(buffered, message); write(buffered, message);
buffered.flush(); buffered.flush();
} }
} }