aboutsummaryrefslogtreecommitdiff
path: root/protobuf-nano
diff options
context:
space:
mode:
authorEric Anderson <ejona@google.com>2015-04-10 16:35:23 -0700
committerEric Anderson <ejona@google.com>2015-04-10 16:35:23 -0700
commit3666de4427460a307bfb86a7f93b3a04cb28f8c4 (patch)
tree7d81ac8c934937f26ab9079c3389db1315b1f9f2 /protobuf-nano
parente23f899491461e96271b5675298947b03f1527c4 (diff)
downloadgrpc-grpc-java-3666de4427460a307bfb86a7f93b3a04cb28f8c4.tar.gz
Use more precise names for protobuf and nano
io.grpc.nano sort of seems like a "small" version of grpc-java. And io.grpc.proto could also mean multiple things. Using "protobuf" and "protobuf nano" gets us consistent names that are still understandable, predictable, and more similar to protobuf project itself.
Diffstat (limited to 'protobuf-nano')
-rw-r--r--protobuf-nano/build.gradle7
-rw-r--r--protobuf-nano/src/main/java/io/grpc/protobuf/nano/DeferredNanoProtoInputStream.java137
-rw-r--r--protobuf-nano/src/main/java/io/grpc/protobuf/nano/NanoUtils.java73
-rw-r--r--protobuf-nano/src/main/java/io/grpc/protobuf/nano/Parser.java46
4 files changed, 263 insertions, 0 deletions
diff --git a/protobuf-nano/build.gradle b/protobuf-nano/build.gradle
new file mode 100644
index 000000000..7b5eea924
--- /dev/null
+++ b/protobuf-nano/build.gradle
@@ -0,0 +1,7 @@
+description = 'gRPC: Protobuf Nano'
+
+dependencies {
+ compile project(':grpc-core'),
+ libraries.protobuf_nano,
+ libraries.guava
+}
diff --git a/protobuf-nano/src/main/java/io/grpc/protobuf/nano/DeferredNanoProtoInputStream.java b/protobuf-nano/src/main/java/io/grpc/protobuf/nano/DeferredNanoProtoInputStream.java
new file mode 100644
index 000000000..f0aa1af2e
--- /dev/null
+++ b/protobuf-nano/src/main/java/io/grpc/protobuf/nano/DeferredNanoProtoInputStream.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2014, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.grpc.protobuf.nano;
+
+import com.google.common.io.ByteStreams;
+import com.google.protobuf.nano.CodedOutputByteBufferNano;
+import com.google.protobuf.nano.MessageNano;
+
+import io.grpc.DeferredInputStream;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import javax.annotation.Nullable;
+
+/**
+ * Implementation of {@link DeferredInputStream} backed by a nano proto.
+ */
+public class DeferredNanoProtoInputStream extends DeferredInputStream<MessageNano> {
+
+ // DeferredNanoProtoInputStream is first initialized with a *message*. *partial* is initially
+ // null.
+ // Once there has been a read operation on this stream, *message* is serialized to *partial* and
+ // set to null.
+ @Nullable private MessageNano message;
+ @Nullable private ByteArrayInputStream partial;
+
+ public DeferredNanoProtoInputStream(MessageNano message) {
+ this.message = message;
+ }
+
+ private void toPartial() {
+ if (message != null) {
+ partial = new ByteArrayInputStream(MessageNano.toByteArray(message));
+ message = null;
+ }
+ }
+
+ @Override
+ public int flushTo(OutputStream target) throws IOException {
+ // TODO(simonma): flushTo is an optimization of DeferredInputStream, for the implementations
+ // that can write data directly to OutputStream, if we don't support flushTo (by not extending
+ // DeferredInputStream), the caller will use ByteStreams.copy anyway. So consider extends
+ // InputStream directly or make a real optimization here (like save the byte[] and use it for a
+ // single target.write()).
+ int written = 0;
+ toPartial();
+ if (partial != null) {
+ written = (int) ByteStreams.copy(partial, target);
+ partial = null;
+ }
+ return written;
+ }
+
+ @Override
+ public int read() throws IOException {
+ toPartial();
+ if (partial != null) {
+ return partial.read();
+ }
+ return -1;
+ }
+
+ @Override
+ public int read(byte[] b, int off, int len) throws IOException {
+ if (message != null) {
+ int size = message.getSerializedSize();
+ if (size == 0) {
+ message = null;
+ partial = null;
+ return -1;
+ }
+ if (len >= size) {
+ // This is the only case that is zero-copy.
+ CodedOutputByteBufferNano output = CodedOutputByteBufferNano.newInstance(b, off, size);
+ message.writeTo(output);
+ output.checkNoSpaceLeft();
+
+ message = null;
+ partial = null;
+ return size;
+ }
+
+ toPartial();
+ }
+ if (partial != null) {
+ return partial.read(b, off, len);
+ }
+ return -1;
+ }
+
+ @Override
+ public int available() throws IOException {
+ if (message != null) {
+ return message.getSerializedSize();
+ } else if (partial != null) {
+ return partial.available();
+ }
+ return 0;
+ }
+
+ @Override
+ @Nullable
+ public MessageNano getDeferred() {
+ return message;
+ }
+}
diff --git a/protobuf-nano/src/main/java/io/grpc/protobuf/nano/NanoUtils.java b/protobuf-nano/src/main/java/io/grpc/protobuf/nano/NanoUtils.java
new file mode 100644
index 000000000..a64f16601
--- /dev/null
+++ b/protobuf-nano/src/main/java/io/grpc/protobuf/nano/NanoUtils.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2014, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.grpc.protobuf.nano;
+
+import com.google.common.io.ByteStreams;
+import com.google.protobuf.nano.CodedInputByteBufferNano;
+import com.google.protobuf.nano.MessageNano;
+
+import io.grpc.Marshaller;
+import io.grpc.Status;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Utility methods for using nano proto with grpc.
+ */
+public class NanoUtils {
+
+ private NanoUtils() {}
+
+ /** Adapt {@code parser} to a {@code Marshaller}. */
+ public static <T extends MessageNano> Marshaller<T> marshaller(final Parser<T> parser) {
+ return new Marshaller<T>() {
+ @Override
+ public InputStream stream(T value) {
+ return new DeferredNanoProtoInputStream(value);
+ }
+
+ @Override
+ public T parse(InputStream stream) {
+ try {
+ // TODO(simonma): Investigate whether we can do 0-copy here.
+ CodedInputByteBufferNano input =
+ CodedInputByteBufferNano.newInstance(ByteStreams.toByteArray(stream));
+ return parser.parse(input);
+ } catch (IOException ipbe) {
+ throw Status.INTERNAL.withDescription("Failed parsing nano proto message").withCause(ipbe)
+ .asRuntimeException();
+ }
+ }
+ };
+ }
+}
diff --git a/protobuf-nano/src/main/java/io/grpc/protobuf/nano/Parser.java b/protobuf-nano/src/main/java/io/grpc/protobuf/nano/Parser.java
new file mode 100644
index 000000000..a82e59f5c
--- /dev/null
+++ b/protobuf-nano/src/main/java/io/grpc/protobuf/nano/Parser.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2014, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.grpc.protobuf.nano;
+
+import com.google.protobuf.nano.CodedInputByteBufferNano;
+import com.google.protobuf.nano.MessageNano;
+
+import java.io.IOException;
+
+/**
+ * Parser for parsing nano proto messages.
+ *
+ * <p>Should be implemented by generated code.
+ */
+public interface Parser<T extends MessageNano> {
+ T parse(CodedInputByteBufferNano input) throws IOException;
+}