asyncapi / modelina

A library for generating typed models based on inputs such as AsyncAPI, OpenAPI, and JSON Schema documents with high customization
https://modelina.org
Apache License 2.0
295 stars 170 forks source link

JavaGenerator and JavaFileGenerator has too different arguments #1577

Open Tenischev opened 10 months ago

Tenischev commented 10 months ago

Reason/Context

I observed the strange difference between how JavaGenerator and JavaFileGenerator are instanced and used. Issue found during exploration of possibility to use Modelina for model generation in Java spring template, see #https://github.com/asyncapi/java-spring-template/pull/342 In case of JavaGenerator:

const generator = new JavaGenerator({
  collectionType: "List",
  presets: [
    {
      preset: JAVA_COMMON_PRESET,
      options: {
        classToString: true
      }
    }
  ]
});

// const input = ...AsyncAPI document
const models = await generator.generate(input)

In case of JavaFileGenerator:

        const javaGenerator = new modelina.JavaFileGenerator();

        javaGenerator.generateToFiles(generator.asyncapi, path.resolve(generator.targetDir, 'src/main/java/com/asyncapi/modelina/'), {
            collectionType: "List",
            presets: [
                {
                    preset: modelina.JAVA_COMMON_PRESET,
                    options: {
                        equal: true,
                        hashCode: true,
                        classToString: true
                    }
                }
            ]
        }, true)

So, difference in how options are passed.

Description

I would expect similar way to create an instance of JavaGenerator and JavaFileGenerator. Thus JavaFileGenerator is instanced with options and generateToFiles method is not require them. This means, that AbstractFileGenerator interface also should be changed.

During Slack discussion there was argument from @jonaslagoni that options are passed to generateToFiles because of package name which is related to outputPath. But for Java class it would be incorrect if outputPath not match with package name. Thus, additionally I would suggest to use following logic to determine destination path where files will be stored: resultPath = outputDir + packageName e.g. outputDir = "generated-source" packageName = "com.asyncapi.template.java" then resultPath = generated-source/com/asyncapi/template/java

github-actions[bot] commented 6 months ago

This issue has been automatically marked as stale because it has not had recent activity :sleeping:

It will be closed in 120 days if no further activity occurs. To unstale this issue, add a comment with a detailed explanation.

There can be many reasons why some specific issue has no activity. The most probable cause is lack of time, not lack of interest. AsyncAPI Initiative is a Linux Foundation project not owned by a single for-profit company. It is a community-driven initiative ruled under open governance model.

Let us figure out together how to push this issue forward. Connect with us through one of many communication channels we established here.

Thank you for your patience :heart:

github-actions[bot] commented 2 months ago

This issue has been automatically marked as stale because it has not had recent activity :sleeping:

It will be closed in 120 days if no further activity occurs. To unstale this issue, add a comment with a detailed explanation.

There can be many reasons why some specific issue has no activity. The most probable cause is lack of time, not lack of interest. AsyncAPI Initiative is a Linux Foundation project not owned by a single for-profit company. It is a community-driven initiative ruled under open governance model.

Let us figure out together how to push this issue forward. Connect with us through one of many communication channels we established here.

Thank you for your patience :heart: