in common/common-protobuf/src/main/java/org/apache/servicecomb/codec/protobuf/schema/SchemaToProtoGenerator.java [299:369]
public void createMessage(Schema<?> schema) {
String ref = schema.get$ref();
if (ref != null) {
String typeName = ref.substring(Components.COMPONENTS_SCHEMAS_REF.length());
Schema<?> refSchema = openAPI.getComponents().getSchemas().get(typeName);
if (refSchema == null) {
throw new IllegalArgumentException("not found ref in components " + ref);
}
if (StringUtils.isEmpty(refSchema.getName())) {
refSchema.setName(typeName);
}
createMessage(refSchema);
return;
}
boolean wait = false;
//array or map
if (isArrayOrMap(schema)) {
Schema<?> mapOrArrayItem = arrayOrMapItem(schema);
if (findSchemaType(mapOrArrayItem) == null) {
createMessageTask(mapOrArrayItem);
wait = true;
} else {
if (createMapOrArrayMessageTask(mapOrArrayItem, true, schema)) {
wait = true;
}
}
}
//object
if (schema.getProperties() != null) {
for (Entry<String, Schema> entry : schema.getProperties().entrySet()) {
if (findSchemaType(entry.getValue()) == null) {
createMessageTask(entry.getValue());
wait = true;
} else if (isArrayOrMap(entry.getValue())) {
if (createMapOrArrayMessageTask(arrayOrMapItem(entry.getValue()), false, null)) {
wait = true;
}
}
}
}
if (wait) {
IdentifierRunnable runnable = new IdentifierRunnable(schema, () -> createMessage(schema));
if (!pending.contains(runnable)) {
pending.add(runnable);
}
return;
}
if (findSchemaType(schema) != null) {
return;
}
messages.add(schema.getName());
appendLine(msgStringBuilder, "message %s {", schema.getName());
List<Map.Entry<String, Schema>> sortedProperties = new ArrayList<>(schema.getProperties().entrySet());
sortedProperties.sort(Comparator.comparing(Map.Entry::getKey));
int tag = 1;
for (Entry<String, Schema> entry : sortedProperties) {
Schema property = entry.getValue();
String propertyType = findSchemaType(property);
appendLine(msgStringBuilder, " %s %s = %d;", propertyType, entry.getKey(), tag);
tag++;
}
appendLine(msgStringBuilder, "}");
}