Imported Upstream version 1.5.1

This commit is contained in:
Mario Fetka
2020-09-22 02:25:22 +02:00
commit 434d6067d9
2103 changed files with 928962 additions and 0 deletions

74
java/pbrpcgen/build.xml Normal file
View File

@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- You may freely edit this file. See commented blocks below for -->
<!-- some examples of how to customize the build. -->
<!-- (If you delete it and reopen the project it will be recreated.) -->
<!-- By default, only the Clean and Build commands use this build script. -->
<!-- Commands such as Run, Debug, and Test only use this build script if -->
<!-- the Compile on Save feature is turned off for the project. -->
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
<!-- in the project's Project Properties dialog box.-->
<project name="pbrpcgen" default="default" basedir=".">
<description>Builds, tests, and runs the project pbrpcgen.</description>
<import file="nbproject/build-impl.xml"/>
<!--
There exist several targets which are by default empty and which can be
used for execution of your tasks. These targets are usually executed
before and after some main targets. They are:
-pre-init: called before initialization of project properties
-post-init: called after initialization of project properties
-pre-compile: called before javac compilation
-post-compile: called after javac compilation
-pre-compile-single: called before javac compilation of single file
-post-compile-single: called after javac compilation of single file
-pre-compile-test: called before javac compilation of JUnit tests
-post-compile-test: called after javac compilation of JUnit tests
-pre-compile-test-single: called before javac compilation of single JUnit test
-post-compile-test-single: called after javac compilation of single JUunit test
-pre-jar: called before JAR building
-post-jar: called after JAR building
-post-clean: called after cleaning build products
(Targets beginning with '-' are not intended to be called on their own.)
Example of inserting an obfuscator after compilation could look like this:
<target name="-post-compile">
<obfuscate>
<fileset dir="${build.classes.dir}"/>
</obfuscate>
</target>
For list of available properties check the imported
nbproject/build-impl.xml file.
Another way to customize the build is by overriding existing main targets.
The targets of interest are:
-init-macrodef-javac: defines macro for javac compilation
-init-macrodef-junit: defines macro for junit execution
-init-macrodef-debug: defines macro for class debugging
-init-macrodef-java: defines macro for class execution
-do-jar-with-manifest: JAR building (if you are using a manifest)
-do-jar-without-manifest: JAR building (if you are not using a manifest)
run: execution of project
-javadoc-build: Javadoc generation
test-report: JUnit report generation
An example of overriding the target for project execution could look like this:
<target name="run" depends="pbrpcgen-impl.jar">
<exec dir="bin" executable="launcher.exe">
<arg file="${dist.jar}"/>
</exec>
</target>
Notice that the overridden target depends on the jar target and not only on
the compile target as the regular run target does. Again, for a list of available
properties which you can use, check the target you are overriding in the
nbproject/build-impl.xml file.
-->
</project>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="../lib/protobuf-java-2.5.0.jar"/>
<classpathentry kind="output" path="build/classes"/>
</classpath>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>xtreemfs_pbrpcgen</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@@ -0,0 +1,3 @@
Manifest-Version: 1.0
X-COMMENT: Main-Class will be added automatically by build

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
build.xml.data.CRC32=ab7e35e7
build.xml.script.CRC32=3c7d4959
build.xml.stylesheet.CRC32=28e38971@1.38.1.45
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=ab7e35e7
nbproject/build-impl.xml.script.CRC32=64bc69d8
nbproject/build-impl.xml.stylesheet.CRC32=0ae3a408@1.44.1.45

View File

@@ -0,0 +1,6 @@
compile.on.save=true
do.depend=false
do.jar=true
javac.debug=true
javadoc.preview=true
user.properties.file=/home/kleineweber/.netbeans/7.0/build.properties

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?><project-private xmlns="http://www.netbeans.org/ns/project-private/1">
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
</project-private>

View File

@@ -0,0 +1,76 @@
annotation.processing.enabled=true
annotation.processing.enabled.in.editor=false
annotation.processing.run.all.processors=true
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
application.title=pbrpcgen
application.vendor=kleineweber
build.classes.dir=${build.dir}/classes
build.classes.excludes=**/*.java,**/*.form
# This directory is removed when the project is cleaned:
build.dir=build
build.generated.dir=${build.dir}/generated
build.generated.sources.dir=${build.dir}/generated-sources
# Only compile against the classpath explicitly listed here:
build.sysclasspath=ignore
build.test.classes.dir=${build.dir}/test/classes
build.test.results.dir=${build.dir}/test/results
# Uncomment to specify the preferred debugger connection transport:
#debug.transport=dt_socket
debug.classpath=\
${run.classpath}
debug.test.classpath=\
${run.test.classpath}
# This directory is removed when the project is cleaned:
dist.dir=dist
dist.jar=${dist.dir}/pbrpcgen.jar
dist.javadoc.dir=${dist.dir}/javadoc
endorsed.classpath=
excludes=
file.reference.protobuf-java-2.5.0.jar=../lib/protobuf-java-2.5.0.jar
includes=**
jar.compress=false
javac.classpath=\
${file.reference.protobuf-java-2.5.0.jar}
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false
javac.processorpath=\
${javac.classpath}
javac.source=1.5
javac.target=1.5
javac.test.classpath=\
${javac.classpath}:\
${build.classes.dir}:\
${libs.junit.classpath}:\
${libs.junit_4.classpath}
javac.test.processorpath=\
${javac.test.classpath}
javadoc.additionalparam=
javadoc.author=false
javadoc.encoding=${source.encoding}
javadoc.noindex=false
javadoc.nonavbar=false
javadoc.notree=false
javadoc.private=false
javadoc.splitindex=true
javadoc.use=true
javadoc.version=false
javadoc.windowtitle=
main.class=
manifest.file=manifest.mf
meta.inf.dir=${src.dir}/META-INF
mkdist.disabled=false
platform.active=default_platform
run.classpath=\
${javac.classpath}:\
${build.classes.dir}
# Space-separated list of JVM arguments used when running the project
# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
# or test-sys-prop.name=value to set system properties for unit tests):
run.jvmargs=
run.test.classpath=\
${javac.test.classpath}:\
${build.test.classes.dir}
source.encoding=UTF-8
src.dir=src
test.src.dir=test

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.java.j2seproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
<name>pbrpcgen</name>
<source-roots>
<root id="src.dir"/>
</source-roots>
<test-roots>
<root id="test.src.dir"/>
</test-roots>
</data>
</configuration>
</project>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,98 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: PBRPC.proto
package org.xtreemfs.foundation.pbrpc.generatedinterfaces;
public final class PBRPC {
private PBRPC() {}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistry registry) {
registry.add(org.xtreemfs.foundation.pbrpc.generatedinterfaces.PBRPC.procId);
registry.add(org.xtreemfs.foundation.pbrpc.generatedinterfaces.PBRPC.dataIn);
registry.add(org.xtreemfs.foundation.pbrpc.generatedinterfaces.PBRPC.dataOut);
registry.add(org.xtreemfs.foundation.pbrpc.generatedinterfaces.PBRPC.interfaceId);
}
public static final int PROC_ID_FIELD_NUMBER = 50001;
/**
* <code>extend .google.protobuf.MethodOptions { ... }</code>
*/
public static final
com.google.protobuf.GeneratedMessage.GeneratedExtension<
com.google.protobuf.DescriptorProtos.MethodOptions,
java.lang.Integer> procId = com.google.protobuf.GeneratedMessage
.newFileScopedGeneratedExtension(
java.lang.Integer.class,
null);
public static final int DATA_IN_FIELD_NUMBER = 50004;
/**
* <code>extend .google.protobuf.MethodOptions { ... }</code>
*/
public static final
com.google.protobuf.GeneratedMessage.GeneratedExtension<
com.google.protobuf.DescriptorProtos.MethodOptions,
java.lang.Boolean> dataIn = com.google.protobuf.GeneratedMessage
.newFileScopedGeneratedExtension(
java.lang.Boolean.class,
null);
public static final int DATA_OUT_FIELD_NUMBER = 50003;
/**
* <code>extend .google.protobuf.MethodOptions { ... }</code>
*/
public static final
com.google.protobuf.GeneratedMessage.GeneratedExtension<
com.google.protobuf.DescriptorProtos.MethodOptions,
java.lang.Boolean> dataOut = com.google.protobuf.GeneratedMessage
.newFileScopedGeneratedExtension(
java.lang.Boolean.class,
null);
public static final int INTERFACE_ID_FIELD_NUMBER = 50002;
/**
* <code>extend .google.protobuf.ServiceOptions { ... }</code>
*/
public static final
com.google.protobuf.GeneratedMessage.GeneratedExtension<
com.google.protobuf.DescriptorProtos.ServiceOptions,
java.lang.Integer> interfaceId = com.google.protobuf.GeneratedMessage
.newFileScopedGeneratedExtension(
java.lang.Integer.class,
null);
public static com.google.protobuf.Descriptors.FileDescriptor
getDescriptor() {
return descriptor;
}
private static com.google.protobuf.Descriptors.FileDescriptor
descriptor;
static {
java.lang.String[] descriptorData = {
"\n\013PBRPC.proto\022\016xtreemfs.pbrpc\032 google/pr" +
"otobuf/descriptor.proto:1\n\007proc_id\022\036.goo" +
"gle.protobuf.MethodOptions\030\321\206\003 \001(\007:1\n\007da" +
"ta_in\022\036.google.protobuf.MethodOptions\030\324\206" +
"\003 \001(\010:2\n\010data_out\022\036.google.protobuf.Meth" +
"odOptions\030\323\206\003 \001(\010:7\n\014interface_id\022\037.goog" +
"le.protobuf.ServiceOptions\030\322\206\003 \001(\007B3\n1or" +
"g.xtreemfs.foundation.pbrpc.generatedint" +
"erfaces"
};
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
public com.google.protobuf.ExtensionRegistry assignDescriptors(
com.google.protobuf.Descriptors.FileDescriptor root) {
descriptor = root;
procId.internalInit(descriptor.getExtensions().get(0));
dataIn.internalInit(descriptor.getExtensions().get(1));
dataOut.internalInit(descriptor.getExtensions().get(2));
interfaceId.internalInit(descriptor.getExtensions().get(3));
return null;
}
};
com.google.protobuf.Descriptors.FileDescriptor
.internalBuildGeneratedFileFrom(descriptorData,
new com.google.protobuf.Descriptors.FileDescriptor[] {
com.google.protobuf.DescriptorProtos.getDescriptor(),
}, assigner);
}
// @@protoc_insertion_point(outer_class_scope)
}

View File

@@ -0,0 +1,586 @@
package org.xtreemfs.pbrpcgen;
import com.google.protobuf.DescriptorProtos.DescriptorProto;
import com.google.protobuf.DescriptorProtos.EnumDescriptorProto;
import com.google.protobuf.DescriptorProtos.FieldDescriptorProto;
import com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Type;
import com.google.protobuf.compiler.PluginProtos.CodeGeneratorRequest;
import com.google.protobuf.compiler.PluginProtos.CodeGeneratorResponse;
import com.google.protobuf.compiler.PluginProtos.CodeGeneratorResponse.File;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.google.protobuf.DescriptorProtos.FileDescriptorProto;
import com.google.protobuf.DescriptorProtos.MethodDescriptorProto;
import com.google.protobuf.DescriptorProtos.ServiceDescriptorProto;
import com.google.protobuf.Descriptors;
import com.google.protobuf.Descriptors.FieldDescriptor;
import com.google.protobuf.ExtensionRegistry;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import org.xtreemfs.foundation.pbrpc.generatedinterfaces.PBRPC;
public class RPCCPPSourceGenerator {
private static final Map<Type,String> ttt;
private static final Map<Type,String> tttr;
static {
ttt = new HashMap();
ttt.put(Type.TYPE_BOOL,"boolean");
ttt.put(Type.TYPE_BYTES,"ByteString");
ttt.put(Type.TYPE_DOUBLE,"double");
ttt.put(Type.TYPE_FIXED32,"uint32_t");
ttt.put(Type.TYPE_FIXED64,"uint64_t");
ttt.put(Type.TYPE_FLOAT,"float");
ttt.put(Type.TYPE_STRING,"std::string");
tttr = new HashMap();
tttr.put(Type.TYPE_BOOL,"List<Boolean>");
tttr.put(Type.TYPE_BYTES,"List<ByteString>");
tttr.put(Type.TYPE_DOUBLE,"List<Double>");
tttr.put(Type.TYPE_FIXED32,"List<Integer>");
tttr.put(Type.TYPE_FIXED64,"List<Long>");
tttr.put(Type.TYPE_FLOAT,"List<Float>");
tttr.put(Type.TYPE_STRING,"List<String>");
}
//public static final String PACKAGE = "org.xtreemfs.foundation.pbrpc.generated";
public static void main(String[] args) throws Exception {
final String ONE_INDENT = " ";
ExtensionRegistry er = ExtensionRegistry.newInstance();
PBRPC.registerAllExtensions(er);
CodeGeneratorRequest rq = CodeGeneratorRequest.parseFrom(System.in,er);
CodeGeneratorResponse.Builder responseBuilder = CodeGeneratorResponse.newBuilder();
Map<String,TypeDef> typeDefs = new HashMap();
Map<FieldDescriptor, Object> map = rq.getAllFields();
// System.err.println(map);
for (Entry<FieldDescriptor, Object> files : map.entrySet()) {
if (files.getKey().getName().equals("proto_file")) {
for (FileDescriptorProto proto : (List<FileDescriptorProto>) files.getValue()) {
java.io.File filchen = new java.io.File(proto.getName());
System.err.println("proto name: "+proto.getName());
final String fileName = proto.getName().replace(".proto", ".pb.h");
System.err.println("include: "+fileName);
String pkgName = proto.getPackage();
if (pkgName.length() > 0)
pkgName = pkgName+".";
for (DescriptorProto msg : proto.getMessageTypeList()) {
TypeDef def = new TypeDef();
def.fullName = proto.getPackage().replace(".", "::")+"::"+msg.getName();
def.message = msg;
def.fileName = fileName;
typeDefs.put("."+pkgName+msg.getName(),def);
}
for (EnumDescriptorProto msg : proto.getEnumTypeList()) {
TypeDef def = new TypeDef();
def.fullName = proto.getPackage().replace(".", "::")+"::"+msg.getName();
def.message = null;
def.fileName = fileName;
typeDefs.put("."+pkgName+msg.getName(),def);
}
}
}
}
System.err.println("typedefs: "+typeDefs.keySet());
Set<String> includes = new HashSet();
for (Entry<FieldDescriptor, Object> files : map.entrySet()) {
if (files.getKey().getName().equals("proto_file")) {
// This generator is executed multiple times with different sets
// of files. Therefore it shall only write the
// "get_request_message" file if files like DIR.proto, MRC.proto
// or OSD.proto are parsed.
boolean writeFileGetRequestMessage = false;
String fileNameGetRequestMessageH = "xtreemfs/get_request_message.h";
String fileNameGetRequestMessageCC = "xtreemfs/get_request_message.cc";
String includeGuardGetRequestMessage = "CPP_GENERATED_XTREEMFS_GET_REQUEST_MESSAGE_H_";
StringBuilder codeBuilderGetRequestMessageH = new StringBuilder();
StringBuilder codeBuilderGetRequestMessageCC = new StringBuilder();
codeBuilderGetRequestMessageH.append("//automatically generated at "+new Date()+"\n");
codeBuilderGetRequestMessageH.append("//(c) "+((new Date()).getYear()+1900)+". See LICENSE file for details.\n\n");
codeBuilderGetRequestMessageCC.append("//automatically generated at "+new Date()+"\n");
codeBuilderGetRequestMessageCC.append("//(c) "+((new Date()).getYear()+1900)+". See LICENSE file for details.\n\n");
codeBuilderGetRequestMessageH.append("#ifndef "+ includeGuardGetRequestMessage +"\n");
codeBuilderGetRequestMessageH.append("#define "+ includeGuardGetRequestMessage +"\n\n");
codeBuilderGetRequestMessageH.append("#include <stdint.h>\n");
codeBuilderGetRequestMessageH.append("\n");
codeBuilderGetRequestMessageH.append("namespace google {\n");
codeBuilderGetRequestMessageH.append("namespace protobuf {\n");
codeBuilderGetRequestMessageH.append("class Message;\n");
codeBuilderGetRequestMessageH.append("} // namespace protobuf\n");
codeBuilderGetRequestMessageH.append("} // namespace google\n");
codeBuilderGetRequestMessageH.append("\n");
codeBuilderGetRequestMessageCC.append("#include \"" + fileNameGetRequestMessageH + "\"\n\n");
codeBuilderGetRequestMessageCC.append("@@@INCLUDE@@@\n");
boolean initializedGetRequestMessage = false;
String[] namespaceTokensGetRequestMessage = null;
for (FileDescriptorProto proto : (List<FileDescriptorProto>) files.getValue()) {
final String cppPackage = proto.getPackage();
System.err.println("package: "+cppPackage);
//final String filePrefix = cppPackage.replace(".", "/");
java.io.File filchen = new java.io.File(proto.getName());
final String msgName = filchen.getName().replace(".proto", "");
System.err.println("proto: "+proto.getName());
boolean addThisFileToGetRequestMessage = false;
if (filchen.getName().equals("DIR.proto") || filchen.getName().equals("MRC.proto") || filchen.getName().equals("OSD.proto")) {
writeFileGetRequestMessage = true;
addThisFileToGetRequestMessage = true;
}
//printMessage(proto.getMessageTypeList());
final String[] namespaceTokens = cppPackage.split("\\.");
if (writeFileGetRequestMessage && !initializedGetRequestMessage) {
namespaceTokensGetRequestMessage = namespaceTokens.clone();
for (int i = 0; i < namespaceTokens.length; i++) {
codeBuilderGetRequestMessageH.append("namespace " + namespaceTokens[i] + " {\n");
codeBuilderGetRequestMessageCC.append("namespace " + namespaceTokens[i] + " {\n");
}
codeBuilderGetRequestMessageH.append("\n");
codeBuilderGetRequestMessageH.append(
"google::protobuf::Message* GetMessageForProcID(uint32_t interface_id,\n");
codeBuilderGetRequestMessageH.append(
" uint32_t proc_id);\n\n");
codeBuilderGetRequestMessageCC.append("\n");
codeBuilderGetRequestMessageCC.append(
"google::protobuf::Message* GetMessageForProcID(uint32_t interface_id,\n");
codeBuilderGetRequestMessageCC.append(
" uint32_t proc_id) {\n");
codeBuilderGetRequestMessageCC.append(
" switch (interface_id) {\n");
initializedGetRequestMessage = true;
}
for (ServiceDescriptorProto srv : proto.getServiceList()) {
int interfaceId = srv.getOptions().getExtension(PBRPC.interfaceId);
if (addThisFileToGetRequestMessage) {
codeBuilderGetRequestMessageCC.append(
"// Generated from " + filchen.getName() + "\n");
codeBuilderGetRequestMessageCC.append(
" case " + interfaceId + ": {\n");
codeBuilderGetRequestMessageCC.append(
" switch (proc_id) {\n");
}
// proto.getName() returns the file name of the .proto file
// e.g. "xtreemfs/DIR.proto"
// Example: "xtreemfs/DIR.proto" -> "DIRServiceClient"
String className = (new java.io.File(proto.getName())).getName().replace(".proto", "ServiceClient");
// Example: "xtreemfs/DIR.proto" -> "xtreemfs/DIRServiceClient.h"
String classFileName = proto.getName().replace(".proto", "ServiceClient.h");
String classNameConst = (new java.io.File(proto.getName())).getName().replace(".proto", "ServiceConstants");
String classFileNameConst = proto.getName().replace(".proto", "ServiceConstants.h");
StringBuilder codeBuilder = new StringBuilder();
StringBuilder codeBuilderConst = new StringBuilder();
codeBuilderConst.append("//automatically generated from "+filchen.getName()+" at "+new Date()+"\n");
codeBuilderConst.append("//(c) "+((new Date()).getYear()+1900)+". See LICENSE file for details.\n\n");
codeBuilderConst.append("#ifndef "+classNameConst.toUpperCase()+"_H_\n");
codeBuilderConst.append("#define "+classNameConst.toUpperCase()+"_H_\n");
codeBuilderConst.append("#include <stdint.h>\n\n");
for (int i = 0; i < namespaceTokens.length; i++) {
codeBuilderConst.append("namespace " + namespaceTokens[i] + " {\n");
}
codeBuilderConst.append("\n");
codeBuilderConst.append("const uint32_t INTERFACE_ID_" + (new java.io.File(proto.getName())).getName().replace(".proto", "").toUpperCase() + " = " + interfaceId + ";\n");
//imports
codeBuilder.append("//automatically generated from "+filchen.getName()+" at "+new Date()+"\n");
codeBuilder.append("//(c) "+((new Date()).getYear()+1900)+". See LICENSE file for details.\n\n");
codeBuilder.append("#ifndef "+className.toUpperCase()+"_H\n");
codeBuilder.append("#define "+className.toUpperCase()+"_H\n\n");
codeBuilder.append("#include <stdint.h>\n");
codeBuilder.append("#include \"pbrpc/RPC.pb.h\"\n");
codeBuilder.append("#include \"rpc/client.h\"\n");
codeBuilder.append("#include \"rpc/sync_callback.h\"\n");
codeBuilder.append("#include \"rpc/callback_interface.h\"\n");
codeBuilder.append("@@@INCLUDE@@@\n");
codeBuilder.append("\n");
String indent = "";
for (int i = 0; i < namespaceTokens.length; i++) {
codeBuilder.append("namespace "+namespaceTokens[i]+" {\n");
indent = indent + ONE_INDENT;
}
codeBuilder.append(indent+"using ::xtreemfs::rpc::Client;\n");
codeBuilder.append(indent+"using ::xtreemfs::rpc::CallbackInterface;\n");
codeBuilder.append(indent+"using ::xtreemfs::rpc::SyncCallback;\n\n");
codeBuilder.append(indent+"class " + className + " {\n\n");
codeBuilder.append(indent+"public:\n");
//methods
codeBuilder.append(indent+ONE_INDENT+className+"(Client* client) : client_(client) {\n");
codeBuilder.append(indent+ONE_INDENT+"}\n\n");
codeBuilder.append(indent+ONE_INDENT+"virtual ~"+className+"() {\n");
codeBuilder.append(indent+ONE_INDENT+"}\n\n");
for (MethodDescriptorProto method: srv.getMethodList()) {
System.err.println("input type: "+method.getInputType());
final String inputType = typeDefs.get(method.getInputType()).fullName;//msgName+method.getInputType();
final String returnType = typeDefs.get(method.getOutputType()).fullName;//msgName+method.getOutputType();
includes.add(typeDefs.get(method.getInputType()).fileName);
includes.add(typeDefs.get(method.getOutputType()).fileName);
final int procId = method.getOptions().getExtension(PBRPC.procId);
codeBuilderConst.append("const uint32_t PROC_ID_"+method.getName().toUpperCase()+" = " + procId + ";\n");
final boolean data_in = method.getOptions().hasExtension(PBRPC.dataIn) ? method.getOptions().getExtension(PBRPC.dataIn) : false;
final String dataValue = data_in ? "data" : "null";
String inputTypeBuilder = "new " + inputType + "()";
if (inputTypeBuilder.contains("emptyResponse")) {
inputTypeBuilder = "NULL";
}
String returnTypeBuilder = "new "+returnType+"()";
if (returnType.contains("emptyResponse"))
returnTypeBuilder = "NULL";
if (addThisFileToGetRequestMessage) {
codeBuilderGetRequestMessageCC.append(
" case " + procId + ": {\n");
codeBuilderGetRequestMessageCC.append(
" return " + inputTypeBuilder + ";\n");
codeBuilderGetRequestMessageCC.append(
" break;\n");
codeBuilderGetRequestMessageCC.append(
" }\n");
}
codeBuilder.append(indent+ONE_INDENT+"void "+method.getName()+"(const std::string &address,\n");
codeBuilder.append(indent+ONE_INDENT+ONE_INDENT+"const xtreemfs::pbrpc::Auth& auth,\n");
codeBuilder.append(indent+ONE_INDENT+ONE_INDENT+"const xtreemfs::pbrpc::UserCredentials &creds,");
if (!inputType.contains("emptyRequest"))
codeBuilder.append("\n"+indent+ONE_INDENT+ONE_INDENT+"const "+inputType+"* request,");
if (data_in)
codeBuilder.append("const char* data, uint32_t data_length,");
codeBuilder.append("\n"+indent+ONE_INDENT+ONE_INDENT+"CallbackInterface<"+returnType+"> *callback, void *context = NULL) {\n");
if (!data_in)
codeBuilder.append(indent+ONE_INDENT+ONE_INDENT+"const char* data = NULL; uint32_t data_length = 0;\n");
if (inputType.contains("emptyRequest"))
codeBuilder.append(indent+ONE_INDENT+ONE_INDENT+inputType+"* request = NULL;\n");
codeBuilder.append(indent+ONE_INDENT+ONE_INDENT+"client_->sendRequest(address, "+interfaceId+", "+procId+",\n");
codeBuilder.append(indent+ONE_INDENT+ONE_INDENT+ONE_INDENT+" creds, auth, request, data, data_length, "+returnTypeBuilder+",\n");
codeBuilder.append(indent+ONE_INDENT+ONE_INDENT+ONE_INDENT+" context, callback);\n");
codeBuilder.append(indent+ONE_INDENT+"}\n\n");
codeBuilder.append(indent+ONE_INDENT+"SyncCallback<"+returnType+">* "+method.getName()+"_sync(const std::string &address,\n");
codeBuilder.append(indent+ONE_INDENT+ONE_INDENT+"const xtreemfs::pbrpc::Auth& auth,\n");
codeBuilder.append(indent+ONE_INDENT+ONE_INDENT+"const xtreemfs::pbrpc::UserCredentials &creds");
if (!inputType.contains("emptyRequest"))
codeBuilder.append("\n"+indent+ONE_INDENT+ONE_INDENT+", const "+inputType+"* request");
if (data_in)
codeBuilder.append(", const char* data, uint32_t data_length");
codeBuilder.append(") {\n");
if (!data_in)
codeBuilder.append(indent+ONE_INDENT+ONE_INDENT+"const char* data = NULL; uint32_t data_length = 0;\n");
if (inputType.contains("emptyRequest"))
codeBuilder.append(indent+ONE_INDENT+ONE_INDENT+inputType+"* request = NULL;\n");
codeBuilder.append(indent+ONE_INDENT+ONE_INDENT+"SyncCallback<"+returnType+">* sync_cb = new SyncCallback<"+returnType+">();\n");
codeBuilder.append(indent+ONE_INDENT+ONE_INDENT+"client_->sendRequest(address, "+interfaceId+", "+procId+",\n");
codeBuilder.append(indent+ONE_INDENT+ONE_INDENT+ONE_INDENT+" creds, auth, request, data, data_length, "+returnTypeBuilder+",\n");
codeBuilder.append(indent+ONE_INDENT+ONE_INDENT+ONE_INDENT+" NULL, sync_cb);\n");
codeBuilder.append(indent+ONE_INDENT+ONE_INDENT+"return sync_cb;\n");
codeBuilder.append(indent+ONE_INDENT+"}\n\n");
/*codeBuilder.append(" public RPCResponse<"+returnType+"> " + method.getName() + "(");
codeBuilder.append("InetSocketAddress server, Auth authHeader, UserCredentials userCreds, "+inputType+" input");
if (data_in)
codeBuilder.append(", ReusableBuffer data");
codeBuilder.append(") throws IOException {\n");
codeBuilder.append(" if (server == null) server = defaultServer;\n");
codeBuilder.append(" if (server == null) throw new IllegalArgumentException(\"defaultServer must be set in constructor if you want to pass null as server in calls\");\n");
codeBuilder.append(" RPCResponse<"+returnType+"> response = new RPCResponse<"+returnType+">("+returnType+".getDefaultInstance());\n");
codeBuilder.append(" client.sendRequest(server, authHeader, userCreds, "+interfaceId+", "+procId+", input, "+dataValue+", response, false);\n");
codeBuilder.append(" return response;\n");
codeBuilder.append(" }\n\n");
String[] unrolled = unrollInputMessage(proto, method.getInputType(), typeDefs);
codeBuilder.append(" public RPCResponse<"+returnType+"> " + method.getName() + "(");
codeBuilder.append("InetSocketAddress server, Auth authHeader, UserCredentials userCreds");
if (unrolled[0].length() > 0) {
codeBuilder.append(", ");
codeBuilder.append(unrolled[0]);
}
if (data_in)
codeBuilder.append(", ReusableBuffer data");
codeBuilder.append(") throws IOException {\n");
codeBuilder.append(" "+unrolled[1]+"\n");
codeBuilder.append(" return ");
codeBuilder.append(method.getName());
codeBuilder.append("(server, authHeader, userCreds, msg");
if (data_in)
codeBuilder.append(", data");
codeBuilder.append(");\n");
codeBuilder.append(" }\n\n");
*
*/
}
// codeBuilder.append(" public static void " +
// msg.getName() + "() {\n");
//
// for (FieldDescriptorProto field : msg.getFieldList())
// {
//
// String type = field.getTypeName();
// if(type.startsWith("."))
// type = type.substring(1);
//
// field.getType();
//
// codeBuilder.append(" public " + type + " " +
// field.getName() + ";\n");
// }
//
codeBuilder.append(indent+"private:\n");
codeBuilder.append(indent+ONE_INDENT+"Client* client_;\n");
codeBuilder.append(indent+"};\n");
for (int i = 0; i < namespaceTokens.length; i++) {
indent = indent.substring(ONE_INDENT.length());
codeBuilder.append(indent);
codeBuilder.append("}\n");
}
codeBuilder.append("#endif //"+className.toUpperCase()+"_H\n");
codeBuilderConst.append("\n");
for (int i = Math.max(0, namespaceTokens.length - 1); i >= 0; i--) {
codeBuilderConst.append("} // namespace " + namespaceTokens[i] + "\n");
}
codeBuilderConst.append("\n");
codeBuilderConst.append("#endif // "+className.toUpperCase()+"_H_\n");
String file = codeBuilder.toString();
String extraIncludes = "";
for (String incl : includes) {
extraIncludes += "#include \""+incl+"\"\n";
}
file = file.replace("@@@INCLUDE@@@", extraIncludes);
//filePrefix+"/"+className + ".cpp"
File f = File.newBuilder().setName(classFileName).setContent(
file).build();
responseBuilder.addFile(f);
f = File.newBuilder().setName(classFileNameConst).setContent(
codeBuilderConst.toString()).build();
responseBuilder.addFile(f);
if (addThisFileToGetRequestMessage) {
codeBuilderGetRequestMessageCC.append(
" default: {\n");
codeBuilderGetRequestMessageCC.append(
" return NULL;\n");
codeBuilderGetRequestMessageCC.append(
" }\n");
codeBuilderGetRequestMessageCC.append(
" }\n");
codeBuilderGetRequestMessageCC.append(
" break;\n");
codeBuilderGetRequestMessageCC.append(
" }\n");
}
}
}
if (writeFileGetRequestMessage) {
codeBuilderGetRequestMessageCC.append(
" default: {\n");
codeBuilderGetRequestMessageCC.append(
" return NULL;\n");
codeBuilderGetRequestMessageCC.append(
" }\n");
codeBuilderGetRequestMessageCC.append(
" }\n");
codeBuilderGetRequestMessageCC.append(
"}\n");
codeBuilderGetRequestMessageCC.append("\n");
for (int i = Math.max(0, namespaceTokensGetRequestMessage.length - 1); i >= 0; i--) {
codeBuilderGetRequestMessageH.append("} // namespace " + namespaceTokensGetRequestMessage[i] + "\n");
codeBuilderGetRequestMessageCC.append("} // namespace " + namespaceTokensGetRequestMessage[i] + "\n");
}
codeBuilderGetRequestMessageH.append("\n");
codeBuilderGetRequestMessageH.append("#endif // " + includeGuardGetRequestMessage + "\n");
String extraIncludes = "";
for (String incl : includes) {
extraIncludes += "#include \""+incl+"\"\n";
}
File f = File.newBuilder().setName(fileNameGetRequestMessageH).setContent(codeBuilderGetRequestMessageH.toString()).build();
responseBuilder.addFile(f);
String fileContentGetRequestMessageCC = codeBuilderGetRequestMessageCC.toString();
fileContentGetRequestMessageCC = fileContentGetRequestMessageCC.replace("@@@INCLUDE@@@", extraIncludes);
f = File.newBuilder().setName(fileNameGetRequestMessageCC).setContent(fileContentGetRequestMessageCC).build();
responseBuilder.addFile(f);
}
}
}
responseBuilder.build().writeTo(System.out);
}
private static String[] unrollInputMessage(FileDescriptorProto file, String type, Map<String,TypeDef> typeDefs) {
TypeDef unrollType = typeDefs.get(type);
if (unrollType == null) {
System.err.println("could not find message '"+type+"' to unroll");
System.exit(1);
}
DescriptorProto message = unrollType.message;
StringBuilder list = new StringBuilder();
StringBuilder builder = new StringBuilder("final "+unrollType.fullName+" msg = "+unrollType.fullName+".newBuilder().");
boolean wasEmpty = false;
for (int i = 0; i < message.getFieldCount(); i++) {
wasEmpty = false;
final FieldDescriptorProto field = message.getField(i);
final String FName = field.getName().substring(0, 1).toUpperCase()+field.getName().substring(1);
switch (field.getType()) {
case TYPE_MESSAGE:
case TYPE_ENUM: {
TypeDef fieldType = typeDefs.get(field.getTypeName());
if (fieldType == null) {
System.err.println("could not find message '"+field.getTypeName()+"' for field "+field.getName());
System.exit(1);
}
if (field.getLabel() == FieldDescriptorProto.Label.LABEL_REPEATED) {
list.append("List<"+fieldType.fullName+"> "+field.getName());
builder.append("addAll"+FName+"("+field.getName()+")");
} else {
if (!field.getTypeName().contains("emptyRequest")) {
list.append(fieldType.fullName+" "+field.getName());
builder.append("set"+FName+"("+field.getName()+")");
} else {
System.out.println("empty field: "+field.getName());
wasEmpty = true;
}
}
break;
}
default: {
if (field.getLabel() == FieldDescriptorProto.Label.LABEL_REPEATED) {
list.append(tttr.get(field.getType())+" "+field.getName());
builder.append("addAll"+FName+"("+field.getName()+")");
} else {
list.append(ttt.get(field.getType())+" "+field.getName());
builder.append("set"+FName+"("+field.getName()+")");
}
break;
}
}
builder.append(".");
if ((i < message.getFieldCount()-1) && !wasEmpty) {
list.append(", ");
}
if ((i == message.getFieldCount()-1) && wasEmpty) {
list.delete(list.length()-2,list.length());
}
}
if (message.getFieldCount() > 0)
builder.append("build();");
else
builder = new StringBuilder("final "+unrollType.fullName+" msg = "+unrollType.fullName+".getDefaultInstance();");
return new String[]{list.toString(),builder.toString()};
}
private static void printMessage(List<DescriptorProto> msgs) {
for (DescriptorProto msg : msgs) {
System.err.println("message type: "+msg.getName());
for (FieldDescriptorProto field : msg.getFieldList()) {
switch (field.getType()) {
case TYPE_MESSAGE: {
System.err.println(" "+field.getName()+": "+field.getTypeName()+", "+field.getLabel().toString());
printMessage(msg.getNestedTypeList());
break;
}
case TYPE_ENUM: {
System.err.println(" "+field.getName()+": "+field.getTypeName());
break;
}
case TYPE_GROUP: {
System.err.println(" "+field.getName()+": List<"+field.getTypeName()+">");
break;
}
default: {
System.err.println(" "+field.getName()+": "+ttt.get(field.getType())+","+field.getLabel().toString());
break;
}
}
}
}
}
private static class TypeDef {
DescriptorProto message;
String fullName;
String fileName;
}
}

View File

@@ -0,0 +1,424 @@
package org.xtreemfs.pbrpcgen;
import com.google.protobuf.DescriptorProtos.DescriptorProto;
import com.google.protobuf.DescriptorProtos.EnumDescriptorProto;
import com.google.protobuf.DescriptorProtos.FieldDescriptorProto;
import com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Type;
import com.google.protobuf.compiler.PluginProtos.CodeGeneratorRequest;
import com.google.protobuf.compiler.PluginProtos.CodeGeneratorResponse;
import com.google.protobuf.compiler.PluginProtos.CodeGeneratorResponse.File;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.google.protobuf.DescriptorProtos.FileDescriptorProto;
import com.google.protobuf.DescriptorProtos.MethodDescriptorProto;
import com.google.protobuf.DescriptorProtos.ServiceDescriptorProto;
import com.google.protobuf.Descriptors.FieldDescriptor;
import com.google.protobuf.ExtensionRegistry;
import java.util.Date;
import java.util.HashMap;
import org.xtreemfs.foundation.pbrpc.generatedinterfaces.PBRPC;
public class RPCSourceGenerator {
private static final Map<Type,String> ttt;
private static final Map<Type,String> tttr;
static {
ttt = new HashMap();
ttt.put(Type.TYPE_BOOL,"boolean");
ttt.put(Type.TYPE_BYTES,"ByteString");
ttt.put(Type.TYPE_DOUBLE,"double");
ttt.put(Type.TYPE_FIXED32,"int");
ttt.put(Type.TYPE_FIXED64,"long");
ttt.put(Type.TYPE_FLOAT,"float");
ttt.put(Type.TYPE_STRING,"String");
tttr = new HashMap();
tttr.put(Type.TYPE_BOOL,"List<Boolean>");
tttr.put(Type.TYPE_BYTES,"List<ByteString>");
tttr.put(Type.TYPE_DOUBLE,"List<Double>");
tttr.put(Type.TYPE_FIXED32,"List<Integer>");
tttr.put(Type.TYPE_FIXED64,"List<Long>");
tttr.put(Type.TYPE_FLOAT,"List<Float>");
tttr.put(Type.TYPE_STRING,"List<String>");
}
private static final String EMPTY_REQUEST = "emptyRequest";
private static final String EMPTY_RESPONSE = "emptyResponse";
//public static final String PACKAGE = "org.xtreemfs.foundation.pbrpc.generated";
public static void main(String[] args) throws Exception {
ExtensionRegistry er = ExtensionRegistry.newInstance();
PBRPC.registerAllExtensions(er);
CodeGeneratorRequest rq = CodeGeneratorRequest.parseFrom(System.in,er);
CodeGeneratorResponse.Builder responseBuilder = CodeGeneratorResponse.newBuilder();
Map<String,TypeDef> typeDefs = new HashMap();
Map<FieldDescriptor, Object> map = rq.getAllFields();
// System.err.println(map);
for (Entry<FieldDescriptor, Object> files : map.entrySet()) {
if (files.getKey().getName().equals("proto_file")) {
for (FileDescriptorProto proto : (List<FileDescriptorProto>) files.getValue()) {
java.io.File filchen = new java.io.File(proto.getName());
final String fileName = filchen.getName().replace(".proto", "");
String pkgName = proto.getPackage();
if (pkgName.length() > 0)
pkgName = pkgName+".";
for (DescriptorProto msg : proto.getMessageTypeList()) {
TypeDef def = new TypeDef();
def.fullName = fileName+"."+msg.getName();
def.message = msg;
def.fileName = fileName;
typeDefs.put("."+pkgName+msg.getName(),def);
}
for (EnumDescriptorProto msg : proto.getEnumTypeList()) {
TypeDef def = new TypeDef();
def.fullName = fileName+"."+msg.getName();
def.message = null;
def.fileName = fileName;
typeDefs.put("."+pkgName+msg.getName(),def);
}
}
}
}
System.err.println("typedefs: "+typeDefs.keySet());
for (Entry<FieldDescriptor, Object> files : map.entrySet()) {
if (files.getKey().getName().equals("proto_file")) {
for (FileDescriptorProto proto : (List<FileDescriptorProto>) files.getValue()) {
final String javaPackage = proto.getOptions().getJavaPackage();
final String filePrefix = javaPackage.replace(".", "/");
java.io.File filchen = new java.io.File(proto.getName());
final String msgName = filchen.getName().replace(".proto", "");
//printMessage(proto.getMessageTypeList());
for (ServiceDescriptorProto srv : proto.getServiceList()) {
// proto.getName() returns the file name of the .proto file
// e.g. "xtreemfs/DIR.proto"
// Example: "xtreemfs/DIR.proto" -> "DIRServiceClient"
String className = (new java.io.File(proto.getName())).getName().replace(".proto", "ServiceClient");
String classNameConst = (new java.io.File(proto.getName())).getName().replace(".proto", "ServiceConstants");
StringBuilder codeBuilder = new StringBuilder();
StringBuilder codeBuilderConst = new StringBuilder();
codeBuilder.append("//automatically generated from "+filchen.getName()+" at "+new Date()+"\n");
codeBuilder.append("//(c) "+((new Date()).getYear()+1900)+". See LICENSE file for details.\n\n");
codeBuilder.append("package " + javaPackage + ";\n\n");
codeBuilderConst.append("//automatically generated from "+filchen.getName()+" at "+new Date()+"\n");
codeBuilderConst.append("//(c) "+((new Date()).getYear()+1900)+". See LICENSE file for details.\n\n");
codeBuilderConst.append("package " + javaPackage + ";\n\n");
codeBuilderConst.append("import com.google.protobuf.Message;\n");
codeBuilderConst.append("\n");
codeBuilderConst.append("public class " + classNameConst + " {\n\n");
//imports
codeBuilder.append("import java.io.IOException;\n");
codeBuilder.append("import java.util.List;\n");
codeBuilder.append("import java.net.InetSocketAddress;\n");
codeBuilder.append("import com.google.protobuf.Message;\n");
codeBuilder.append("import com.google.protobuf.ByteString;\n");
codeBuilder.append("import org.xtreemfs.foundation.buffer.ReusableBuffer;\n");
codeBuilder.append("import org.xtreemfs.foundation.pbrpc.generatedinterfaces.RPC.Auth;\n");
codeBuilder.append("import org.xtreemfs.foundation.pbrpc.generatedinterfaces.RPC.UserCredentials;\n");
codeBuilder.append("import org.xtreemfs.foundation.pbrpc.client.RPCNIOSocketClient;\n");
codeBuilder.append("import org.xtreemfs.foundation.pbrpc.client.RPCResponse;\n");
codeBuilder.append("\n");
codeBuilder.append("public class " + className + " {\n\n");
//member declarations
codeBuilder.append(" private RPCNIOSocketClient client;\n");
codeBuilder.append(" private InetSocketAddress defaultServer;\n");
codeBuilder.append("\n");
//methods
codeBuilder.append(" public "+className+"(RPCNIOSocketClient client, InetSocketAddress defaultServer) {\n");
codeBuilder.append(" this.client = client;\n");
codeBuilder.append(" this.defaultServer = defaultServer;\n");
codeBuilder.append(" }\n\n");
int interfaceId = srv.getOptions().getExtension(PBRPC.interfaceId);
codeBuilderConst.append(" public static final int INTERFACE_ID = " + interfaceId + ";\n");
StringBuilder cbRequest = new StringBuilder("\n public static Message getRequestMessage(int procId) {\n");
cbRequest.append(" switch (procId) {\n");
StringBuilder cbResponse = new StringBuilder("\n public static Message getResponseMessage(int procId) {\n");
cbResponse.append(" switch (procId) {\n");
for (MethodDescriptorProto method: srv.getMethodList()) {
System.err.println("input type: "+method.getInputType());
final String inputType = typeDefs.get(method.getInputType()).fullName;//msgName+method.getInputType();
final String returnType = typeDefs.get(method.getOutputType()).fullName;//msgName+method.getOutputType();
final int procId = method.getOptions().getExtension(PBRPC.procId);
final boolean isEmptyResponse = returnType.contains(EMPTY_RESPONSE);
final boolean isEmptyRequest = inputType.contains(EMPTY_REQUEST);
codeBuilderConst.append(" public static final int PROC_ID_"+method.getName().toUpperCase()+" = " + procId + ";\n");
if (isEmptyResponse)
cbResponse.append(" case "+procId+": return null;\n");
else
cbResponse.append(" case "+procId+": return "+returnType+".getDefaultInstance();\n");
if (isEmptyRequest)
cbRequest.append(" case "+procId+": return null;\n");
else
cbRequest.append(" case "+procId+": return "+inputType+".getDefaultInstance();\n");
final boolean data_in = method.getOptions().hasExtension(PBRPC.dataIn) ? method.getOptions().getExtension(PBRPC.dataIn) : false;
final String dataValue = data_in ? "data" : "null";
if (isEmptyResponse) {
codeBuilder.append(" public RPCResponse " + method.getName() + "(");
} else {
codeBuilder.append(" public RPCResponse<"+returnType+"> " + method.getName() + "(");
}
codeBuilder.append("InetSocketAddress server, Auth authHeader, UserCredentials userCreds, "+inputType+" input");
if (data_in)
codeBuilder.append(", ReusableBuffer data");
codeBuilder.append(") throws IOException {\n");
codeBuilder.append(" if (server == null) server = defaultServer;\n");
codeBuilder.append(" if (server == null) throw new IllegalArgumentException(\"defaultServer must be set in constructor if you want to pass null as server in calls\");\n");
if (!isEmptyResponse) {
codeBuilder.append(" RPCResponse<"+returnType+"> response = new RPCResponse<"+returnType+">("+returnType+".getDefaultInstance());\n");
} else {
codeBuilder.append(" RPCResponse response = new RPCResponse(null);\n");
}
codeBuilder.append(" client.sendRequest(server, authHeader, userCreds, "+interfaceId+", "+procId+", input, "+dataValue+", response, false);\n");
codeBuilder.append(" return response;\n");
codeBuilder.append(" }\n\n");
String[] unrolled = unrollInputMessage(proto, method.getInputType(), typeDefs);
if (isEmptyResponse) {
codeBuilder.append(" public RPCResponse " + method.getName() + "(");
} else {
codeBuilder.append(" public RPCResponse<"+returnType+"> " + method.getName() + "(");
}
codeBuilder.append("InetSocketAddress server, Auth authHeader, UserCredentials userCreds");
if (unrolled[0].length() > 0) {
codeBuilder.append(", ");
codeBuilder.append(unrolled[0]);
}
if (data_in)
codeBuilder.append(", ReusableBuffer data");
codeBuilder.append(") throws IOException {\n");
codeBuilder.append(" "+unrolled[1]+"\n");
codeBuilder.append(" return ");
codeBuilder.append(method.getName());
codeBuilder.append("(server, authHeader, userCreds,");
if (isEmptyRequest) {
codeBuilder.append("null");
} else {
codeBuilder.append("msg");
}
if (data_in)
codeBuilder.append(", data");
codeBuilder.append(");\n");
codeBuilder.append(" }\n\n");
}
codeBuilder.append(" public boolean clientIsAlive() {\n");
codeBuilder.append(" return client.isAlive();\n");
codeBuilder.append(" }\n");
// codeBuilder.append(" public static void " +
// msg.getName() + "() {\n");
//
// for (FieldDescriptorProto field : msg.getFieldList())
// {
//
// String type = field.getTypeName();
// if(type.startsWith("."))
// type = type.substring(1);
//
// field.getType();
//
// codeBuilder.append(" public " + type + " " +
// field.getName() + ";\n");
// }
//
codeBuilder.append("}");
cbResponse.append(" default: throw new RuntimeException(\"unknown procedure id\");\n");
cbRequest.append(" default: throw new RuntimeException(\"unknown procedure id\");\n");
cbRequest.append(" }\n }\n\n");
cbResponse.append(" }\n }\n\n");
codeBuilderConst.append(cbRequest);
codeBuilderConst.append(cbResponse);
codeBuilderConst.append("\n}");
File f = File.newBuilder().setName(filePrefix+"/"+className + ".java").setContent(
codeBuilder.toString()).build();
responseBuilder.addFile(f);
f = File.newBuilder().setName(filePrefix+"/"+classNameConst + ".java").setContent(
codeBuilderConst.toString()).build();
responseBuilder.addFile(f);
}
}
}
}
responseBuilder.build().writeTo(System.out);
}
private static String[] unrollInputMessage(FileDescriptorProto file, String type, Map<String,TypeDef> typeDefs) {
TypeDef unrollType = typeDefs.get(type);
if (unrollType == null) {
System.err.println("could not find message '"+type+"' to unroll");
System.exit(1);
}
DescriptorProto message = unrollType.message;
StringBuilder list = new StringBuilder();
StringBuilder builder = new StringBuilder("final "+unrollType.fullName+" msg = "+unrollType.fullName+".newBuilder().");
boolean wasEmpty = false;
for (int i = 0; i < message.getFieldCount(); i++) {
wasEmpty = false;
final FieldDescriptorProto field = message.getField(i);
final String FName = field.getName().substring(0, 1).toUpperCase()+field.getName().substring(1);
switch (field.getType()) {
case TYPE_MESSAGE:
case TYPE_ENUM: {
TypeDef fieldType = typeDefs.get(field.getTypeName());
if (fieldType == null) {
System.err.println("could not find message '"+field.getTypeName()+"' for field "+field.getName());
System.exit(1);
}
if (field.getLabel() == FieldDescriptorProto.Label.LABEL_REPEATED) {
list.append("List<"+fieldType.fullName+"> "+field.getName());
builder.append("addAll"+camelCase(FName)+"("+field.getName()+")");
} else {
if (!field.getTypeName().contains("emptyRequest")) {
list.append(fieldType.fullName+" "+field.getName());
builder.append("set"+camelCase(FName)+"("+field.getName()+")");
} else {
System.out.println("empty field: "+field.getName());
wasEmpty = true;
}
}
break;
}
default: {
if (field.getLabel() == FieldDescriptorProto.Label.LABEL_REPEATED) {
list.append(tttr.get(field.getType())+" "+field.getName());
builder.append("addAll"+camelCase(FName)+"("+field.getName()+")");
} else {
list.append(ttt.get(field.getType())+" "+field.getName());
builder.append("set"+camelCase(FName)+"("+field.getName()+")");
}
break;
}
}
builder.append(".");
if ((i < message.getFieldCount()-1) && !wasEmpty) {
list.append(", ");
}
if ((i == message.getFieldCount()-1) && wasEmpty) {
list.delete(list.length()-2,list.length());
}
}
if (message.getFieldCount() > 0)
builder.append("build();");
else {
if (unrollType.fullName.contains(EMPTY_REQUEST)) {
builder = new StringBuilder("");
} else {
builder = new StringBuilder("final "+unrollType.fullName+" msg = "+unrollType.fullName+".getDefaultInstance();");
}
}
return new String[]{list.toString(),builder.toString()};
}
private static String camelCase(String name) {
int pos = name.indexOf('_');
while ((pos >= 0) && (pos+2 <= name.length())) {
String tmp = name.substring(0,pos);
tmp += name.substring(pos+1, pos+2).toUpperCase();
tmp += name.substring(pos+2);
name = tmp;
pos = name.indexOf('_');
}
return name;
}
private static void printMessage(List<DescriptorProto> msgs) {
for (DescriptorProto msg : msgs) {
System.err.println("message type: "+msg.getName());
for (FieldDescriptorProto field : msg.getFieldList()) {
switch (field.getType()) {
case TYPE_MESSAGE: {
System.err.println(" "+field.getName()+": "+field.getTypeName()+", "+field.getLabel().toString());
printMessage(msg.getNestedTypeList());
break;
}
case TYPE_ENUM: {
System.err.println(" "+field.getName()+": "+field.getTypeName());
break;
}
case TYPE_GROUP: {
System.err.println(" "+field.getName()+": List<"+field.getTypeName()+">");
break;
}
default: {
System.err.println(" "+field.getName()+": "+ttt.get(field.getType())+","+field.getLabel().toString());
break;
}
}
}
}
}
private static class TypeDef {
DescriptorProto message;
String fullName;
String fileName;
}
}