public void createMessage()

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, "}");
  }