Imported Upstream version 1.5.1
This commit is contained in:
74
java/pbrpcgen/build.xml
Normal file
74
java/pbrpcgen/build.xml
Normal 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>
|
||||
7
java/pbrpcgen/eclipse-project/.classpath
Normal file
7
java/pbrpcgen/eclipse-project/.classpath
Normal 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>
|
||||
17
java/pbrpcgen/eclipse-project/.project
Normal file
17
java/pbrpcgen/eclipse-project/.project
Normal 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>
|
||||
3
java/pbrpcgen/manifest.mf
Normal file
3
java/pbrpcgen/manifest.mf
Normal file
@@ -0,0 +1,3 @@
|
||||
Manifest-Version: 1.0
|
||||
X-COMMENT: Main-Class will be added automatically by build
|
||||
|
||||
1040
java/pbrpcgen/nbproject/build-impl.xml
Normal file
1040
java/pbrpcgen/nbproject/build-impl.xml
Normal file
File diff suppressed because it is too large
Load Diff
8
java/pbrpcgen/nbproject/genfiles.properties
Normal file
8
java/pbrpcgen/nbproject/genfiles.properties
Normal 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
|
||||
6
java/pbrpcgen/nbproject/private/private.properties
Normal file
6
java/pbrpcgen/nbproject/private/private.properties
Normal 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
|
||||
3
java/pbrpcgen/nbproject/private/private.xml
Normal file
3
java/pbrpcgen/nbproject/private/private.xml
Normal 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>
|
||||
76
java/pbrpcgen/nbproject/project.properties
Normal file
76
java/pbrpcgen/nbproject/project.properties
Normal 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
|
||||
15
java/pbrpcgen/nbproject/project.xml
Normal file
15
java/pbrpcgen/nbproject/project.xml
Normal 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>
|
||||
4121
java/pbrpcgen/src/com/google/protobuf/compiler/PluginProtos.java
Normal file
4121
java/pbrpcgen/src/com/google/protobuf/compiler/PluginProtos.java
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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)
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
424
java/pbrpcgen/src/org/xtreemfs/pbrpcgen/RPCSourceGenerator.java
Normal file
424
java/pbrpcgen/src/org/xtreemfs/pbrpcgen/RPCSourceGenerator.java
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user