Skip to content

Commit

Permalink
修正ProtobufIDLProxy生成源代码时,不能正常对内部类的引用进行解析
Browse files Browse the repository at this point in the history
message DataInfo {
    enum DataVisibility {
    PUBLIC = 1;
    PRIVATE = 2;
    }
...
}

message DataStatus {
    optional DataInfo.DataVisibility visibility = 1;
}
  • Loading branch information
xiemalin committed Feb 25, 2016
1 parent e4ee6ef commit 3ea682a
Show file tree
Hide file tree
Showing 6 changed files with 196 additions and 113 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ jprotobuf-1.x JDK 6 或以上版本
<dependency>
<groupId>com.baidu</groupId>
<artifactId>jprotobuf</artifactId>
<version>1.9.4</version>
<version>1.9.5</version>
</dependency>
```
[下载发行包](http://repo1.maven.org/maven2/com/baidu/jprotobuf/)
Expand Down
2 changes: 1 addition & 1 deletion jprotobuf-precompile-plugin/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
</parent>
<groupId>com.baidu</groupId>
<artifactId>jprotobuf-precompile-plugin</artifactId>
<version>1.2.1</version>
<version>1.2.2</version>
<packaging>maven-plugin</packaging>
<name>jprotobuf-precompile-plugin</name>
<description>This plugin will do compile jprotobuf pojo class after compile execute</description>
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

<groupId>com.baidu</groupId>
<artifactId>jprotobuf</artifactId>
<version>1.9.4</version>
<version>1.9.5</version>

<name>Jprotobuf</name>
<description>A very useful utility library for java programmer using google protobuf.</description>
Expand Down
87 changes: 65 additions & 22 deletions src/main/java/com/baidu/bjf/remoting/protobuf/ProtobufIDLProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,7 @@ private static List<Class> createClass(ProtoFile protoFile, boolean multi, boole
writeSourceCode(cd, sourceOutputDir);
}
compiledClass.add(cd.name);
// all enum type class will be ingored to use directly
// all enum type class will be ignored to use directly
}

for (MessageType mt : messageTypes) {
Expand Down Expand Up @@ -474,6 +474,7 @@ private static CodeDependent hasDependency(List<CodeDependent> cds, Set<String>
Iterator<CodeDependent> iterator = cds.iterator();
while (iterator.hasNext()) {
CodeDependent next = iterator.next();
compiledClass.addAll(next.subClasses);
if (!next.isDepndency()) {
compiledClass.add(next.name);
iterator.remove();
Expand All @@ -493,7 +494,8 @@ private static CodeDependent hasDependency(List<CodeDependent> cds, Set<String>
Set<String> guessLoadedClass = new HashSet<String>(compiledClass);
iterator = cds.iterator();
while (iterator.hasNext()) {
guessLoadedClass.add(iterator.next().name);
CodeDependent codeDependent = iterator.next();
guessLoadedClass.add(codeDependent.name);
}

// to check while message's dependency is missed
Expand All @@ -512,7 +514,7 @@ private static CodeDependent hasDependency(List<CodeDependent> cds, Set<String>
if (!guessLoadedClass.contains(dependClass)) {
throw new RuntimeException("Message '"
+ StringUtils.removeEnd(next.name, DEFAULT_SUFFIX_CLASSNAME) + "' depend on message '"
+ StringUtils.removeEnd(dependClass, DEFAULT_SUFFIX_CLASSNAME) + "' is missed");
+ dependClass.replace(DEFAULT_SUFFIX_CLASSNAME, "")+ "' is missed");
}
}
}
Expand All @@ -538,20 +540,27 @@ private static CodeDependent createCodeByType(ProtoFile protoFile, EnumType type
}
}

String simpleName = defaultClsName + DEFAULT_SUFFIX_CLASSNAME;
String simpleName = getProxyClassName(defaultClsName);

// To generate class
StringBuilder code = new StringBuilder();
if (topLevelClass) {
// define package
code.append("package ").append(packageName).append(CODE_END);
code.append("\n");
if (!StringUtils.isEmpty(packageName)) {
code.append("package ").append(packageName).append(CODE_END);
code.append("\n");
}
// add import;
code.append("import com.baidu.bjf.remoting.protobuf.EnumReadable;\n");
}

// define class
code.append("public enum ").append(simpleName).append(" implements EnumReadable {\n");
if (topLevelClass) {
code.append("public enum ");
} else {
code.append("public static enum ");
}
code.append(simpleName).append(" implements EnumReadable {\n");

Iterator<Value> iter = type.getValues().iterator();
while (iter.hasNext()) {
Expand Down Expand Up @@ -602,8 +611,10 @@ private static CodeDependent createCodeByType(ProtoFile protoFile, MessageType t
StringBuilder code = new StringBuilder();
if (topLevelClass) {
// define package
code.append("package ").append(packageName).append(CODE_END);
code.append("\n");
if (!StringUtils.isEmpty(packageName)) {
code.append("package ").append(packageName).append(CODE_END);
code.append("\n");
}
// add import;
code.append("import com.baidu.bjf.remoting.protobuf.FieldType;\n");
code.append("import com.baidu.bjf.remoting.protobuf.EnumReadable;\n");
Expand All @@ -622,7 +633,7 @@ private static CodeDependent createCodeByType(ProtoFile protoFile, MessageType t
List<Field> fields = type.getFields();

// get nested types
List<Type> nestedTypes = fetchAllNestedTypes(type);
List<Type> nestedTypes = fetchAllNestedTypes(type, false);
List<Type> checkNestedTypes = new ArrayList<Type>(nestedTypes);

// to check if has nested classes and check has Enum type
Expand All @@ -639,9 +650,11 @@ private static CodeDependent createCodeByType(ProtoFile protoFile, MessageType t
generateProtobufDefinedForField(code, field, enumNames);

FieldType fType = typeMapping.get(field.getType());
String javaType;
String javaType = "";
if (fType == null) {
javaType = field.getType() + DEFAULT_SUFFIX_CLASSNAME;
String jType = field.getType();
javaType = getProxyClassName(jType);

if (!isNestedTypeDependency(field.getType(), checkNestedTypes)) {
cd.addDependency(javaType);
}
Expand Down Expand Up @@ -676,21 +689,27 @@ private static CodeDependent createCodeByType(ProtoFile protoFile, MessageType t

code.append(CODE_END);
}

// to check if has nested classes
if (nestedTypes != null && topLevelClass) {
if (nestedTypes != null) {
for (Type t : nestedTypes) {
CodeDependent nestedCd;
String fqname = t.getFullyQualifiedName();
String subClsName = getProxyClassName(fqname);

if (t instanceof EnumType) {
nestedCd = createCodeByType(protoFile, (EnumType) t, false);
enumNames.add(t.getName());
} else {
nestedCd = createCodeByType(protoFile, (MessageType) t, enumNames, false, checkNestedTypes);
}

nestedCd.addSubClass(subClsName);

code.append(nestedCd.code);
// merge dependency
cd.dependencies.addAll(nestedCd.dependencies);

cd.subClasses.addAll(nestedCd.subClasses);
}
}

Expand All @@ -710,17 +729,20 @@ private static CodeDependent createCodeByType(ProtoFile protoFile, MessageType t
* @param type
* @return
*/
private static List<Type> fetchAllNestedTypes(MessageType type) {
private static List<Type> fetchAllNestedTypes(MessageType type, boolean all) {
List<Type> ret = new ArrayList<Type>();

List<Type> nestedTypes = type.getNestedTypes();
ret.addAll(nestedTypes);
for (Type t : nestedTypes) {
if (t instanceof MessageType) {
List<Type> subNestedTypes = fetchAllNestedTypes((MessageType) t);
ret.addAll(subNestedTypes);
}
if (all) {
for (Type t : nestedTypes) {
if (t instanceof MessageType) {
List<Type> subNestedTypes = fetchAllNestedTypes((MessageType) t, false);
ret.addAll(subNestedTypes);
}
}
}


return ret;
}
Expand Down Expand Up @@ -788,7 +810,7 @@ private static Class checkClass(ProtoFile protoFile, Type type) {
}
}

String simpleName = defaultClsName + DEFAULT_SUFFIX_CLASSNAME;
String simpleName = getProxyClassName(defaultClsName);
String className = packageName + "." + simpleName;

Class<?> c = null;
Expand All @@ -801,6 +823,21 @@ private static Class checkClass(ProtoFile protoFile, Type type) {

return c;
}

private static String getProxyClassName(String name) {

String ret = "";
if (name.indexOf('.') != -1) {
String[] split = name.split("\\.");
for (String string : split) {
ret += getProxyClassName(string) + ".";
}
ret = StringUtils.removeEnd(ret, ".");
} else {
ret = name + DEFAULT_SUFFIX_CLASSNAME;
}
return ret;
}

/**
* google Protobuf IDL message dependency result
Expand All @@ -814,10 +851,16 @@ private static class CodeDependent {
private String pkg;
private Set<String> dependencies = new HashSet<String>();
private String code;

private Set<String> subClasses = new HashSet<String>();

private boolean isDepndency() {
return !dependencies.isEmpty();
}

private void addSubClass(String name) {
subClasses.add(name);
}

private void addDependency(String name) {
dependencies.add(name);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@
public interface Compiler {

/**
* TODO
* do compile java source.
*
* @param code Java source code
* @param classLoader current classloader
* @param os target output compiled byte code
Expand All @@ -36,5 +37,11 @@ public interface Compiler {
Class<?> compile(String className, String code, ClassLoader classLoader, OutputStream os, long timestamp);


/**
* do load java byte code by class name
*
* @param className full class name
* @return byte code as byte array
*/
byte[] loadBytes(String className);
}
Loading

0 comments on commit 3ea682a

Please sign in to comment.