Open source nano proto related code

-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=87180572
This commit is contained in:
rocking 2015-02-25 12:34:28 -08:00 committed by Eric Anderson
parent c01af90d18
commit c60f0171cb
7 changed files with 267 additions and 0 deletions

View File

@ -24,6 +24,8 @@ $ make check
$ sudo make install
$ cd java
$ mvn install
$ cd ../javanano
$ mvn install
```
If you are comfortable with C++ compilation and autotools, you can specify a

View File

@ -31,6 +31,7 @@ subprojects {
oauth_client: 'com.google.oauth-client:google-oauth-client:1.18.0-rc',
okhttp: 'com.squareup.okhttp:okhttp:2.2.0',
protobuf: 'com.google.protobuf:protobuf-java:3.0.0-pre',
protobuf_nano: 'com.google.protobuf.nano:protobuf-javanano:2.6.2-pre',
protobuf_plugin: 'ws.antonov.gradle.plugins:gradle-plugin-protobuf:0.9.1',
// TODO: Unreleased dependencies.

7
nano/build.gradle Normal file
View File

@ -0,0 +1,7 @@
description = 'gRPC: Nano'
dependencies {
compile project(':grpc-core'),
libraries.protobuf_nano,
libraries.guava
}

View File

@ -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.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;
}
}

View File

@ -0,0 +1,72 @@
/*
* 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.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() {}
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();
}
}
};
}
}

View File

@ -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.nano;
import com.google.protobuf.nano.CodedInputByteBufferNano;
import com.google.protobuf.nano.MessageNano;
import java.io.IOException;
/**
* Parser for parsing nano proto messages.
*
* Should be implemented by generated code.
*/
public interface Parser <T extends MessageNano> {
T parse(CodedInputByteBufferNano input) throws IOException;
}

View File

@ -3,6 +3,7 @@ include ":grpc-core"
include ":grpc-stub"
include ":grpc-auth"
include ":grpc-okhttp"
include ":grpc-nano"
include ":grpc-netty"
include ":grpc-testing"
include ":grpc-compiler"
@ -15,6 +16,7 @@ project(':grpc-core').projectDir = "$rootDir/core" as File
project(':grpc-stub').projectDir = "$rootDir/stub" as File
project(':grpc-auth').projectDir = "$rootDir/auth" as File
project(':grpc-okhttp').projectDir = "$rootDir/okhttp" as File
project(':grpc-nano').projectDir = "$rootDir/nano" as File
project(':grpc-netty').projectDir = "$rootDir/netty" as File
project(':grpc-testing').projectDir = "$rootDir/testing" as File
project(':grpc-compiler').projectDir = "$rootDir/compiler" as File