mirror of
https://github.com/google/flatbuffers.git
synced 2026-07-02 17:58:18 +00:00
new maven jar called flatbuffers-java-grpc which contains utility … (#4558)
* new maven jar called flatbuffers-java-grpc which contains utility class supporting generated code for grpc over flatbuffers; grpc java unit test based on maven and junit (maven is used only for simplicity of testing); removed straneous namespace_test/NamespaceA/TableInC.java which is not longer used in the test and no longer generated but contains complilation errors if java compiler picks it up * moved java grpc tests files according to review request * Added missing generated code for Java gRPC. Change-Id: Iada090fe2e99b80a4b7c2f8e39c838a992a1feae * added missing name and url
This commit is contained in:
committed by
Wouter van Oortmerssen
parent
0c86929e39
commit
99a8a68a80
42
grpc/flatbuffers-java-grpc/pom.xml
Normal file
42
grpc/flatbuffers-java-grpc/pom.xml
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>com.google.flatbuffers</groupId>
|
||||||
|
<artifactId>flatbuffers-parent</artifactId>
|
||||||
|
<version>1.8.0</version>
|
||||||
|
</parent>
|
||||||
|
<artifactId>flatbuffers-java-grpc</artifactId>
|
||||||
|
<name>${project.artifactId}</name>
|
||||||
|
<packaging>bundle</packaging>
|
||||||
|
<description>
|
||||||
|
Utilities supporting generated code for GRPC
|
||||||
|
</description>
|
||||||
|
<developers>
|
||||||
|
<developer>
|
||||||
|
<name>Wouter van Oortmerssen</name>
|
||||||
|
</developer>
|
||||||
|
<developer>
|
||||||
|
<name>Yuri Finkelstein</name>
|
||||||
|
<url>https://github.com/yfinkelstein</url>
|
||||||
|
</developer>
|
||||||
|
</developers>
|
||||||
|
<properties>
|
||||||
|
<gRPC.version>1.8.0</gRPC.version>
|
||||||
|
</properties>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.flatbuffers</groupId>
|
||||||
|
<artifactId>flatbuffers-java</artifactId>
|
||||||
|
<version>${project.parent.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-core</artifactId>
|
||||||
|
<version>${gRPC.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
||||||
|
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014 Google Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.google.flatbuffers.grpc;
|
||||||
|
|
||||||
|
import com.google.flatbuffers.Table;
|
||||||
|
import io.grpc.Drainable;
|
||||||
|
import io.grpc.KnownLength;
|
||||||
|
import io.grpc.MethodDescriptor;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
public class FlatbuffersUtils {
|
||||||
|
abstract public static class FBExtactor <T extends Table> {
|
||||||
|
T extract (InputStream stream) throws IOException {
|
||||||
|
if (stream instanceof KnownLength) {
|
||||||
|
int size = stream.available();
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(size);
|
||||||
|
stream.read(buffer.array());
|
||||||
|
return extract(buffer);
|
||||||
|
} else
|
||||||
|
throw new RuntimeException("The class " + stream.getClass().getCanonicalName() + " does not extend from KnownLength ");
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract T extract(ByteBuffer buffer);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static class FBInputStream extends InputStream implements Drainable, KnownLength {
|
||||||
|
private final ByteBuffer buffer;
|
||||||
|
private final int size;
|
||||||
|
@Nullable private ByteArrayInputStream inputStream;
|
||||||
|
|
||||||
|
FBInputStream(ByteBuffer buffer) {
|
||||||
|
this.buffer = buffer;
|
||||||
|
this.size = buffer.remaining();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void makeStreamIfNotAlready() {
|
||||||
|
if (inputStream == null)
|
||||||
|
inputStream = new ByteArrayInputStream(buffer.array(), buffer.position(), size);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int drainTo(OutputStream target) throws IOException {
|
||||||
|
target.write(buffer.array(), buffer.position(), size);
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read() throws IOException {
|
||||||
|
makeStreamIfNotAlready();
|
||||||
|
return inputStream.read();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read(byte[] b, int off, int len) throws IOException {
|
||||||
|
makeStreamIfNotAlready();
|
||||||
|
if (inputStream == null) {
|
||||||
|
if (len >= size) {
|
||||||
|
System.arraycopy(buffer.array(), buffer.position(), b, off, size);
|
||||||
|
return size;
|
||||||
|
} else {
|
||||||
|
makeStreamIfNotAlready();
|
||||||
|
return inputStream.read(b, off, len);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
return inputStream.read(b, off, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int available() throws IOException {
|
||||||
|
return inputStream == null ? size : inputStream.available();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T extends Table> MethodDescriptor.Marshaller<T> marshaller(final Class<T> clazz, final FBExtactor<T> extractor) {
|
||||||
|
return new MethodDescriptor.ReflectableMarshaller<T>() {
|
||||||
|
@Override
|
||||||
|
public Class<T> getMessageClass() {
|
||||||
|
return clazz;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InputStream stream(T value) {
|
||||||
|
return new FBInputStream (value.getByteBuffer());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T parse(InputStream stream) {
|
||||||
|
try {
|
||||||
|
return extractor.extract(stream);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
213
grpc/pom.xml
Normal file
213
grpc/pom.xml
Normal file
@@ -0,0 +1,213 @@
|
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>com.google.flatbuffers</groupId>
|
||||||
|
<artifactId>flatbuffers-parent</artifactId>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
<version>1.8.0</version>
|
||||||
|
<name>flatbuffers-parent</name>
|
||||||
|
<description>parent pom for flatbuffers java artifacts</description>
|
||||||
|
<properties>
|
||||||
|
<scm.url>https://github.com/google/flatbuffers</scm.url>
|
||||||
|
<scm.connection>scm:git:${scm.url}.git</scm.connection>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<licenses>
|
||||||
|
<license>
|
||||||
|
<name>The Apache Software License, Version 2.0</name>
|
||||||
|
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
||||||
|
<distribution>repo</distribution>
|
||||||
|
</license>
|
||||||
|
</licenses>
|
||||||
|
|
||||||
|
<issueManagement>
|
||||||
|
<system>GitHub</system>
|
||||||
|
<url>https://github.com/google/flatbuffers/issues</url>
|
||||||
|
</issueManagement>
|
||||||
|
|
||||||
|
<developers>
|
||||||
|
<developer>
|
||||||
|
<name>Wouter van Oortmerssen</name>
|
||||||
|
</developer>
|
||||||
|
</developers>
|
||||||
|
|
||||||
|
<url>${scm.url}</url>
|
||||||
|
|
||||||
|
<scm>
|
||||||
|
<connection>${scm.connection}</connection>
|
||||||
|
<developerConnection>${scm.connection}</developerConnection>
|
||||||
|
<url>${scm.url}</url>
|
||||||
|
<tag>HEAD</tag>
|
||||||
|
</scm>
|
||||||
|
|
||||||
|
<distributionManagement>
|
||||||
|
<snapshotRepository>
|
||||||
|
<id>ossrh</id>
|
||||||
|
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
|
||||||
|
</snapshotRepository>
|
||||||
|
</distributionManagement>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.12</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<extensions>
|
||||||
|
<extension>
|
||||||
|
<!--
|
||||||
|
os-maven-plugin is a Maven extension/plugin that generates various useful platform-dependent
|
||||||
|
project properties normalized from ${os.detected.name} and ${os.detected.arch}.
|
||||||
|
-->
|
||||||
|
<groupId>kr.motd.maven</groupId>
|
||||||
|
<artifactId>os-maven-plugin</artifactId>
|
||||||
|
<version>1.5.0.Final</version>
|
||||||
|
</extension>
|
||||||
|
</extensions>
|
||||||
|
<pluginManagement>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.6.1</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<version>3.0.2</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
<version>3.0.1</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>2.19.1</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>2.10.4</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>build-helper-maven-plugin</artifactId>
|
||||||
|
<version>1.12</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-dependency-plugin</artifactId>
|
||||||
|
<version>2.8</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-deploy-plugin</artifactId>
|
||||||
|
<version>2.7</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-gpg-plugin</artifactId>
|
||||||
|
<version>1.5</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-release-plugin</artifactId>
|
||||||
|
<version>2.5.3</version>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>exec-maven-plugin</artifactId>
|
||||||
|
<version>1.5.0</version>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</pluginManagement>
|
||||||
|
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>1.6</source>
|
||||||
|
<target>1.6</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<includes>
|
||||||
|
<include>**/*Test.java</include>
|
||||||
|
</includes>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-sources</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-javadocs</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.felix</groupId>
|
||||||
|
<artifactId>maven-bundle-plugin</artifactId>
|
||||||
|
<version>3.0.1</version>
|
||||||
|
<extensions>true</extensions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.sonatype.plugins</groupId>
|
||||||
|
<artifactId>nexus-staging-maven-plugin</artifactId>
|
||||||
|
<version>1.6.7</version>
|
||||||
|
<extensions>true</extensions>
|
||||||
|
<configuration>
|
||||||
|
<serverId>ossrh</serverId>
|
||||||
|
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
|
||||||
|
<autoReleaseAfterClose>true</autoReleaseAfterClose>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-gpg-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>sign-artifacts</id>
|
||||||
|
<phase>verify</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>sign</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-release-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<autoVersionSubmodules>true</autoVersionSubmodules>
|
||||||
|
<useReleaseProfile>false</useReleaseProfile>
|
||||||
|
<releaseProfiles>release</releaseProfiles>
|
||||||
|
<goals>deploy</goals>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<modules>
|
||||||
|
<!-- consider the benefits of publishing all maven artifacts in this project
|
||||||
|
|
||||||
|
<module>flatbuffers-compiler</module>
|
||||||
|
<module>flatbuffers-java</module>
|
||||||
|
|
||||||
|
-->
|
||||||
|
<module>flatbuffers-java-grpc</module>
|
||||||
|
</modules>
|
||||||
|
|
||||||
|
</project>
|
||||||
119
grpc/tests/JavaGrpcTest.java
Normal file
119
grpc/tests/JavaGrpcTest.java
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014 Google Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import MyGame.Example.Monster;
|
||||||
|
import MyGame.Example.MonsterStorageGrpc;
|
||||||
|
import MyGame.Example.Stat;
|
||||||
|
import com.google.flatbuffers.FlatBufferBuilder;
|
||||||
|
import io.grpc.ManagedChannel;
|
||||||
|
import io.grpc.ManagedChannelBuilder;
|
||||||
|
import io.grpc.Server;
|
||||||
|
import io.grpc.ServerBuilder;
|
||||||
|
import org.junit.Assert;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Demonstrates basic client-server interaction using grpc-java over netty.
|
||||||
|
*/
|
||||||
|
public class JavaGrpcTest {
|
||||||
|
static final String BIG_MONSTER_NAME = "big-monster";
|
||||||
|
static final short nestedMonsterHp = 600;
|
||||||
|
static final short nestedMonsterMana = 1024;
|
||||||
|
static final int numStreamedMsgs = 10;
|
||||||
|
|
||||||
|
static class MyService extends MonsterStorageGrpc.MonsterStorageImplBase {
|
||||||
|
@Override
|
||||||
|
public void store(Monster request, io.grpc.stub.StreamObserver<Stat> responseObserver) {
|
||||||
|
Assert.assertEquals(request.name(), BIG_MONSTER_NAME);
|
||||||
|
Assert.assertEquals(request.hp(), nestedMonsterHp);
|
||||||
|
Assert.assertEquals(request.mana(), nestedMonsterMana);
|
||||||
|
System.out.println("Received store request from " + request.name());
|
||||||
|
// Create a response from the incoming request name.
|
||||||
|
FlatBufferBuilder builder = new FlatBufferBuilder();
|
||||||
|
int statOffset = Stat.createStat(builder, builder.createString("Hello " + request.name()), 100, 10);
|
||||||
|
builder.finish(statOffset);
|
||||||
|
Stat stat = Stat.getRootAsStat(builder.dataBuffer());
|
||||||
|
responseObserver.onNext(stat);
|
||||||
|
responseObserver.onCompleted();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void retrieve(Stat request, io.grpc.stub.StreamObserver<Monster> responseObserver) {
|
||||||
|
// Create 10 monsters for streaming response.
|
||||||
|
for (int i=0; i<numStreamedMsgs; i++) {
|
||||||
|
FlatBufferBuilder builder = new FlatBufferBuilder();
|
||||||
|
int i1 = builder.createString(request.id() + " No." + i);
|
||||||
|
Monster.startMonster(builder);
|
||||||
|
Monster.addName(builder, i1);
|
||||||
|
int i2 = Monster.endMonster(builder);
|
||||||
|
Monster.finishMonsterBuffer(builder, i2);
|
||||||
|
Monster monster = Monster.getRootAsMonster(builder.dataBuffer());
|
||||||
|
responseObserver.onNext(monster);
|
||||||
|
}
|
||||||
|
responseObserver.onCompleted();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static int startServer() throws IOException {
|
||||||
|
Server server = ServerBuilder.forPort(0).addService(new MyService()).build().start();
|
||||||
|
return server.getPort();
|
||||||
|
}
|
||||||
|
|
||||||
|
@org.junit.Test
|
||||||
|
public void testMonster() throws IOException {
|
||||||
|
int port = startServer();
|
||||||
|
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", port)
|
||||||
|
// Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid
|
||||||
|
// needing certificates.
|
||||||
|
.usePlaintext(true)
|
||||||
|
.directExecutor()
|
||||||
|
.build();
|
||||||
|
|
||||||
|
MonsterStorageGrpc.MonsterStorageBlockingStub stub = MonsterStorageGrpc.newBlockingStub(channel);
|
||||||
|
|
||||||
|
FlatBufferBuilder builder = new FlatBufferBuilder();
|
||||||
|
|
||||||
|
int o_string = builder.createString(BIG_MONSTER_NAME);
|
||||||
|
Monster.startMonster(builder);
|
||||||
|
Monster.addName(builder, o_string);
|
||||||
|
Monster.addHp(builder, nestedMonsterHp);
|
||||||
|
Monster.addMana(builder, nestedMonsterMana);
|
||||||
|
int monster1 = Monster.endMonster(builder);
|
||||||
|
Monster.finishMonsterBuffer(builder, monster1);
|
||||||
|
|
||||||
|
ByteBuffer buffer = builder.dataBuffer();
|
||||||
|
Monster monsterRequest = Monster.getRootAsMonster(buffer);
|
||||||
|
Stat stat = stub.store(monsterRequest);
|
||||||
|
Assert.assertEquals(stat.id(), "Hello " + BIG_MONSTER_NAME);
|
||||||
|
System.out.println("Received stat response from service: " + stat.id());
|
||||||
|
|
||||||
|
|
||||||
|
Iterator<Monster> iterator = stub.retrieve(stat);
|
||||||
|
int counter = 0;
|
||||||
|
while(iterator.hasNext()) {
|
||||||
|
Monster m = iterator.next();
|
||||||
|
System.out.println("Received monster " + m.name());
|
||||||
|
counter ++;
|
||||||
|
}
|
||||||
|
Assert.assertEquals(counter, numStreamedMsgs);
|
||||||
|
System.out.println("FlatBuffers GRPC client/server test: completed successfully");
|
||||||
|
}
|
||||||
|
}
|
||||||
4
grpc/tests/java-grpc-test.sh
Executable file
4
grpc/tests/java-grpc-test.sh
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# NOTE: make sure `mvn install` in /gprc is executed before running this test
|
||||||
|
mvn test
|
||||||
73
grpc/tests/pom.xml
Normal file
73
grpc/tests/pom.xml
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>com.google.flatbuffers</groupId>
|
||||||
|
<artifactId>flatbuffers-parent</artifactId>
|
||||||
|
<version>1.8.0</version>
|
||||||
|
</parent>
|
||||||
|
<artifactId>grpc-test</artifactId>
|
||||||
|
<description>Example/Test project demonstrating usage of flatbuffers with GRPC-Java instead of protobufs
|
||||||
|
</description>
|
||||||
|
<properties>
|
||||||
|
<gRPC.version>1.8.0</gRPC.version>
|
||||||
|
</properties>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.flatbuffers</groupId>
|
||||||
|
<artifactId>flatbuffers-java</artifactId>
|
||||||
|
<version>${project.parent.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.flatbuffers</groupId>
|
||||||
|
<artifactId>flatbuffers-java-grpc</artifactId>
|
||||||
|
<version>${project.parent.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-stub</artifactId>
|
||||||
|
<version>${gRPC.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.grpc</groupId>
|
||||||
|
<artifactId>grpc-netty</artifactId>
|
||||||
|
<version>${gRPC.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.12</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>build-helper-maven-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>add-source</id>
|
||||||
|
<phase>generate-sources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>add-test-source</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<sources>
|
||||||
|
<source>${project.basedir}</source>
|
||||||
|
<source>${project.basedir}/../../tests</source>
|
||||||
|
</sources>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
<!--<testSourceDirectory>${project.basedir}</testSourceDirectory>-->
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
|
|
||||||
350
tests/MyGame/Example/MonsterStorageGrpc.java
Normal file
350
tests/MyGame/Example/MonsterStorageGrpc.java
Normal file
@@ -0,0 +1,350 @@
|
|||||||
|
//Generated by flatc compiler (version 1.8.0) on Dec 28 2017 10:07:47
|
||||||
|
//If you make any local changes, they will be lost
|
||||||
|
//source: monster_test.fbs
|
||||||
|
|
||||||
|
package MyGame.Example;
|
||||||
|
|
||||||
|
import com.google.flatbuffers.grpc.FlatbuffersUtils;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import static io.grpc.MethodDescriptor.generateFullMethodName;
|
||||||
|
import static io.grpc.stub.ClientCalls.asyncBidiStreamingCall;
|
||||||
|
import static io.grpc.stub.ClientCalls.asyncClientStreamingCall;
|
||||||
|
import static io.grpc.stub.ClientCalls.asyncServerStreamingCall;
|
||||||
|
import static io.grpc.stub.ClientCalls.asyncUnaryCall;
|
||||||
|
import static io.grpc.stub.ClientCalls.blockingServerStreamingCall;
|
||||||
|
import static io.grpc.stub.ClientCalls.blockingUnaryCall;
|
||||||
|
import static io.grpc.stub.ClientCalls.futureUnaryCall;
|
||||||
|
import static io.grpc.stub.ServerCalls.asyncBidiStreamingCall;
|
||||||
|
import static io.grpc.stub.ServerCalls.asyncClientStreamingCall;
|
||||||
|
import static io.grpc.stub.ServerCalls.asyncServerStreamingCall;
|
||||||
|
import static io.grpc.stub.ServerCalls.asyncUnaryCall;
|
||||||
|
import static io.grpc.stub.ServerCalls.asyncUnimplementedStreamingCall;
|
||||||
|
import static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
@javax.annotation.Generated(
|
||||||
|
value = "by gRPC proto compiler",
|
||||||
|
comments = "Source: monster_test.fbs")
|
||||||
|
public final class MonsterStorageGrpc {
|
||||||
|
|
||||||
|
private MonsterStorageGrpc() {}
|
||||||
|
|
||||||
|
public static final String SERVICE_NAME = "MyGame.Example.MonsterStorage";
|
||||||
|
|
||||||
|
// Static method descriptors that strictly reflect the proto.
|
||||||
|
@io.grpc.ExperimentalApi("https://github.com/grpc/grpc-java/issues/1901")
|
||||||
|
@java.lang.Deprecated // Use {@link #getStoreMethod()} instead.
|
||||||
|
public static final io.grpc.MethodDescriptor<MyGame.Example.Monster,
|
||||||
|
MyGame.Example.Stat> METHOD_STORE = getStoreMethod();
|
||||||
|
|
||||||
|
private static volatile io.grpc.MethodDescriptor<MyGame.Example.Monster,
|
||||||
|
MyGame.Example.Stat> getStoreMethod;
|
||||||
|
|
||||||
|
private static volatile FlatbuffersUtils.FBExtactor<MyGame.Example.Monster> extractorOfMonster;
|
||||||
|
private static FlatbuffersUtils.FBExtactor<MyGame.Example.Monster> getExtractorOfMonster() {
|
||||||
|
if (extractorOfMonster != null) return extractorOfMonster;
|
||||||
|
synchronized (MonsterStorageGrpc.class) {
|
||||||
|
if (extractorOfMonster != null) return extractorOfMonster;
|
||||||
|
extractorOfMonster = new FlatbuffersUtils.FBExtactor<MyGame.Example.Monster>() {
|
||||||
|
public MyGame.Example.Monster extract (ByteBuffer buffer) {
|
||||||
|
return MyGame.Example.Monster.getRootAsMonster(buffer);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return extractorOfMonster;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static volatile FlatbuffersUtils.FBExtactor<MyGame.Example.Stat> extractorOfStat;
|
||||||
|
private static FlatbuffersUtils.FBExtactor<MyGame.Example.Stat> getExtractorOfStat() {
|
||||||
|
if (extractorOfStat != null) return extractorOfStat;
|
||||||
|
synchronized (MonsterStorageGrpc.class) {
|
||||||
|
if (extractorOfStat != null) return extractorOfStat;
|
||||||
|
extractorOfStat = new FlatbuffersUtils.FBExtactor<MyGame.Example.Stat>() {
|
||||||
|
public MyGame.Example.Stat extract (ByteBuffer buffer) {
|
||||||
|
return MyGame.Example.Stat.getRootAsStat(buffer);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return extractorOfStat;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@io.grpc.ExperimentalApi("https://github.com/grpc/grpc-java/issues/1901")
|
||||||
|
public static io.grpc.MethodDescriptor<MyGame.Example.Monster,
|
||||||
|
MyGame.Example.Stat> getStoreMethod() {
|
||||||
|
io.grpc.MethodDescriptor<MyGame.Example.Monster, MyGame.Example.Stat> getStoreMethod;
|
||||||
|
if ((getStoreMethod = MonsterStorageGrpc.getStoreMethod) == null) {
|
||||||
|
synchronized (MonsterStorageGrpc.class) {
|
||||||
|
if ((getStoreMethod = MonsterStorageGrpc.getStoreMethod) == null) {
|
||||||
|
MonsterStorageGrpc.getStoreMethod = getStoreMethod =
|
||||||
|
io.grpc.MethodDescriptor.<MyGame.Example.Monster, MyGame.Example.Stat>newBuilder()
|
||||||
|
.setType(io.grpc.MethodDescriptor.MethodType.UNARY)
|
||||||
|
.setFullMethodName(generateFullMethodName(
|
||||||
|
"MyGame.Example.MonsterStorage", "Store"))
|
||||||
|
.setSampledToLocalTracing(true)
|
||||||
|
.setRequestMarshaller(FlatbuffersUtils.marshaller(
|
||||||
|
MyGame.Example.Monster.class, getExtractorOfMonster()))
|
||||||
|
.setResponseMarshaller(FlatbuffersUtils.marshaller(
|
||||||
|
MyGame.Example.Stat.class, getExtractorOfStat()))
|
||||||
|
.setSchemaDescriptor(null)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return getStoreMethod;
|
||||||
|
}
|
||||||
|
|
||||||
|
@io.grpc.ExperimentalApi("https://github.com/grpc/grpc-java/issues/1901")
|
||||||
|
@java.lang.Deprecated // Use {@link #getRetrieveMethod()} instead.
|
||||||
|
public static final io.grpc.MethodDescriptor<MyGame.Example.Stat,
|
||||||
|
MyGame.Example.Monster> METHOD_RETRIEVE = getRetrieveMethod();
|
||||||
|
|
||||||
|
private static volatile io.grpc.MethodDescriptor<MyGame.Example.Stat,
|
||||||
|
MyGame.Example.Monster> getRetrieveMethod;
|
||||||
|
|
||||||
|
@io.grpc.ExperimentalApi("https://github.com/grpc/grpc-java/issues/1901")
|
||||||
|
public static io.grpc.MethodDescriptor<MyGame.Example.Stat,
|
||||||
|
MyGame.Example.Monster> getRetrieveMethod() {
|
||||||
|
io.grpc.MethodDescriptor<MyGame.Example.Stat, MyGame.Example.Monster> getRetrieveMethod;
|
||||||
|
if ((getRetrieveMethod = MonsterStorageGrpc.getRetrieveMethod) == null) {
|
||||||
|
synchronized (MonsterStorageGrpc.class) {
|
||||||
|
if ((getRetrieveMethod = MonsterStorageGrpc.getRetrieveMethod) == null) {
|
||||||
|
MonsterStorageGrpc.getRetrieveMethod = getRetrieveMethod =
|
||||||
|
io.grpc.MethodDescriptor.<MyGame.Example.Stat, MyGame.Example.Monster>newBuilder()
|
||||||
|
.setType(io.grpc.MethodDescriptor.MethodType.SERVER_STREAMING)
|
||||||
|
.setFullMethodName(generateFullMethodName(
|
||||||
|
"MyGame.Example.MonsterStorage", "Retrieve"))
|
||||||
|
.setSampledToLocalTracing(true)
|
||||||
|
.setRequestMarshaller(FlatbuffersUtils.marshaller(
|
||||||
|
MyGame.Example.Stat.class, getExtractorOfStat()))
|
||||||
|
.setResponseMarshaller(FlatbuffersUtils.marshaller(
|
||||||
|
MyGame.Example.Monster.class, getExtractorOfMonster()))
|
||||||
|
.setSchemaDescriptor(null)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return getRetrieveMethod;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new async stub that supports all call types for the service
|
||||||
|
*/
|
||||||
|
public static MonsterStorageStub newStub(io.grpc.Channel channel) {
|
||||||
|
return new MonsterStorageStub(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new blocking-style stub that supports unary and streaming output calls on the service
|
||||||
|
*/
|
||||||
|
public static MonsterStorageBlockingStub newBlockingStub(
|
||||||
|
io.grpc.Channel channel) {
|
||||||
|
return new MonsterStorageBlockingStub(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new ListenableFuture-style stub that supports unary calls on the service
|
||||||
|
*/
|
||||||
|
public static MonsterStorageFutureStub newFutureStub(
|
||||||
|
io.grpc.Channel channel) {
|
||||||
|
return new MonsterStorageFutureStub(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public static abstract class MonsterStorageImplBase implements io.grpc.BindableService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public void store(MyGame.Example.Monster request,
|
||||||
|
io.grpc.stub.StreamObserver<MyGame.Example.Stat> responseObserver) {
|
||||||
|
asyncUnimplementedUnaryCall(getStoreMethod(), responseObserver);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public void retrieve(MyGame.Example.Stat request,
|
||||||
|
io.grpc.stub.StreamObserver<MyGame.Example.Monster> responseObserver) {
|
||||||
|
asyncUnimplementedUnaryCall(getRetrieveMethod(), responseObserver);
|
||||||
|
}
|
||||||
|
|
||||||
|
@java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
|
||||||
|
return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
|
||||||
|
.addMethod(
|
||||||
|
getStoreMethod(),
|
||||||
|
asyncUnaryCall(
|
||||||
|
new MethodHandlers<
|
||||||
|
MyGame.Example.Monster,
|
||||||
|
MyGame.Example.Stat>(
|
||||||
|
this, METHODID_STORE)))
|
||||||
|
.addMethod(
|
||||||
|
getRetrieveMethod(),
|
||||||
|
asyncServerStreamingCall(
|
||||||
|
new MethodHandlers<
|
||||||
|
MyGame.Example.Stat,
|
||||||
|
MyGame.Example.Monster>(
|
||||||
|
this, METHODID_RETRIEVE)))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public static final class MonsterStorageStub extends io.grpc.stub.AbstractStub<MonsterStorageStub> {
|
||||||
|
private MonsterStorageStub(io.grpc.Channel channel) {
|
||||||
|
super(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
private MonsterStorageStub(io.grpc.Channel channel,
|
||||||
|
io.grpc.CallOptions callOptions) {
|
||||||
|
super(channel, callOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
@java.lang.Override
|
||||||
|
protected MonsterStorageStub build(io.grpc.Channel channel,
|
||||||
|
io.grpc.CallOptions callOptions) {
|
||||||
|
return new MonsterStorageStub(channel, callOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public void store(MyGame.Example.Monster request,
|
||||||
|
io.grpc.stub.StreamObserver<MyGame.Example.Stat> responseObserver) {
|
||||||
|
asyncUnaryCall(
|
||||||
|
getChannel().newCall(getStoreMethod(), getCallOptions()), request, responseObserver);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public void retrieve(MyGame.Example.Stat request,
|
||||||
|
io.grpc.stub.StreamObserver<MyGame.Example.Monster> responseObserver) {
|
||||||
|
asyncServerStreamingCall(
|
||||||
|
getChannel().newCall(getRetrieveMethod(), getCallOptions()), request, responseObserver);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public static final class MonsterStorageBlockingStub extends io.grpc.stub.AbstractStub<MonsterStorageBlockingStub> {
|
||||||
|
private MonsterStorageBlockingStub(io.grpc.Channel channel) {
|
||||||
|
super(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
private MonsterStorageBlockingStub(io.grpc.Channel channel,
|
||||||
|
io.grpc.CallOptions callOptions) {
|
||||||
|
super(channel, callOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
@java.lang.Override
|
||||||
|
protected MonsterStorageBlockingStub build(io.grpc.Channel channel,
|
||||||
|
io.grpc.CallOptions callOptions) {
|
||||||
|
return new MonsterStorageBlockingStub(channel, callOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public MyGame.Example.Stat store(MyGame.Example.Monster request) {
|
||||||
|
return blockingUnaryCall(
|
||||||
|
getChannel(), getStoreMethod(), getCallOptions(), request);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public java.util.Iterator<MyGame.Example.Monster> retrieve(
|
||||||
|
MyGame.Example.Stat request) {
|
||||||
|
return blockingServerStreamingCall(
|
||||||
|
getChannel(), getRetrieveMethod(), getCallOptions(), request);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public static final class MonsterStorageFutureStub extends io.grpc.stub.AbstractStub<MonsterStorageFutureStub> {
|
||||||
|
private MonsterStorageFutureStub(io.grpc.Channel channel) {
|
||||||
|
super(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
private MonsterStorageFutureStub(io.grpc.Channel channel,
|
||||||
|
io.grpc.CallOptions callOptions) {
|
||||||
|
super(channel, callOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
@java.lang.Override
|
||||||
|
protected MonsterStorageFutureStub build(io.grpc.Channel channel,
|
||||||
|
io.grpc.CallOptions callOptions) {
|
||||||
|
return new MonsterStorageFutureStub(channel, callOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public com.google.common.util.concurrent.ListenableFuture<MyGame.Example.Stat> store(
|
||||||
|
MyGame.Example.Monster request) {
|
||||||
|
return futureUnaryCall(
|
||||||
|
getChannel().newCall(getStoreMethod(), getCallOptions()), request);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final int METHODID_STORE = 0;
|
||||||
|
private static final int METHODID_RETRIEVE = 1;
|
||||||
|
|
||||||
|
private static final class MethodHandlers<Req, Resp> implements
|
||||||
|
io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
|
||||||
|
io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>,
|
||||||
|
io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>,
|
||||||
|
io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {
|
||||||
|
private final MonsterStorageImplBase serviceImpl;
|
||||||
|
private final int methodId;
|
||||||
|
|
||||||
|
MethodHandlers(MonsterStorageImplBase serviceImpl, int methodId) {
|
||||||
|
this.serviceImpl = serviceImpl;
|
||||||
|
this.methodId = methodId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@java.lang.Override
|
||||||
|
@java.lang.SuppressWarnings("unchecked")
|
||||||
|
public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
|
||||||
|
switch (methodId) {
|
||||||
|
case METHODID_STORE:
|
||||||
|
serviceImpl.store((MyGame.Example.Monster) request,
|
||||||
|
(io.grpc.stub.StreamObserver<MyGame.Example.Stat>) responseObserver);
|
||||||
|
break;
|
||||||
|
case METHODID_RETRIEVE:
|
||||||
|
serviceImpl.retrieve((MyGame.Example.Stat) request,
|
||||||
|
(io.grpc.stub.StreamObserver<MyGame.Example.Monster>) responseObserver);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new AssertionError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@java.lang.Override
|
||||||
|
@java.lang.SuppressWarnings("unchecked")
|
||||||
|
public io.grpc.stub.StreamObserver<Req> invoke(
|
||||||
|
io.grpc.stub.StreamObserver<Resp> responseObserver) {
|
||||||
|
switch (methodId) {
|
||||||
|
default:
|
||||||
|
throw new AssertionError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static volatile io.grpc.ServiceDescriptor serviceDescriptor;
|
||||||
|
|
||||||
|
public static io.grpc.ServiceDescriptor getServiceDescriptor() {
|
||||||
|
io.grpc.ServiceDescriptor result = serviceDescriptor;
|
||||||
|
if (result == null) {
|
||||||
|
synchronized (MonsterStorageGrpc.class) {
|
||||||
|
result = serviceDescriptor;
|
||||||
|
if (result == null) {
|
||||||
|
serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)
|
||||||
|
.setSchemaDescriptor(null)
|
||||||
|
.addMethod(getStoreMethod())
|
||||||
|
.addMethod(getRetrieveMethod())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
// automatically generated by the FlatBuffers compiler, do not modify
|
|
||||||
|
|
||||||
package NamespaceA;
|
|
||||||
|
|
||||||
import java.nio.*;
|
|
||||||
import java.lang.*;
|
|
||||||
import java.util.*;
|
|
||||||
import com.google.flatbuffers.*;
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public final class TableInC extends Table {
|
|
||||||
public static TableInC getRootAsTableInC(ByteBuffer _bb) { return getRootAsTableInC(_bb, new TableInC()); }
|
|
||||||
public static TableInC getRootAsTableInC(ByteBuffer _bb, TableInC obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__init(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
|
|
||||||
public TableInC __init(int _i, ByteBuffer _bb) { bb_pos = _i; bb = _bb; return this; }
|
|
||||||
|
|
||||||
public NamespaceA.TableInFirstNS referToA1() { return referToA1(new NamespaceA.TableInFirstNS()); }
|
|
||||||
public NamespaceA.TableInFirstNS referToA1(NamespaceA.TableInFirstNS obj) { int o = __offset(4); return o != 0 ? obj.__init(__indirect(o + bb_pos), bb) : null; }
|
|
||||||
public SecondTableInA referToA2() { return referToA2(new SecondTableInA()); }
|
|
||||||
public SecondTableInA referToA2(SecondTableInA obj) { int o = __offset(6); return o != 0 ? obj.__init(__indirect(o + bb_pos), bb) : null; }
|
|
||||||
|
|
||||||
public static int createTableInC(FlatBufferBuilder builder,
|
|
||||||
int refer_to_a1Offset,
|
|
||||||
int refer_to_a2Offset) {
|
|
||||||
builder.startObject(2);
|
|
||||||
TableInC.addReferToA2(builder, refer_to_a2Offset);
|
|
||||||
TableInC.addReferToA1(builder, refer_to_a1Offset);
|
|
||||||
return TableInC.endTableInC(builder);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void startTableInC(FlatBufferBuilder builder) { builder.startObject(2); }
|
|
||||||
public static void addReferToA1(FlatBufferBuilder builder, int referToA1Offset) { builder.addOffset(0, referToA1Offset, 0); }
|
|
||||||
public static void addReferToA2(FlatBufferBuilder builder, int referToA2Offset) { builder.addOffset(1, referToA2Offset, 0); }
|
|
||||||
public static int endTableInC(FlatBufferBuilder builder) {
|
|
||||||
int o = builder.endObject();
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user