From a5c7f1f4c7454b48fb1cc46bad68df2238ba88db Mon Sep 17 00:00:00 2001 From: Tom Schindl Date: Mon, 28 Oct 2024 00:27:12 +0100 Subject: [PATCH] generating java-server service APIs --- dsl/src/cli/java-client-api/base-dto.ts | 21 ++-- dsl/src/cli/java-client-api/union.ts | 16 +-- dsl/src/cli/java-gen-utils.ts | 15 ++- dsl/src/cli/java-server-jakarta-ws/enum.ts | 4 +- .../cli/java-server-jakarta-ws/generator.ts | 4 +- dsl/src/cli/java-server-jakarta-ws/record.ts | 8 +- dsl/src/cli/java-server-jakarta-ws/service.ts | 6 +- dsl/src/cli/java-server-jakarta-ws/union.ts | 99 +++++++++++++------ dsl/src/cli/java-server/base-dto.ts | 15 +++ dsl/src/cli/java-server/builder-factory.ts | 31 ++++++ dsl/src/cli/java-server/enum.ts | 0 dsl/src/cli/java-server/generator.ts | 45 +++++++++ dsl/src/cli/java-server/record.ts | 21 ++++ dsl/src/cli/java-server/union.ts | 30 ++++++ dsl/src/cli/main.ts | 2 + 15 files changed, 259 insertions(+), 58 deletions(-) create mode 100644 dsl/src/cli/java-server/base-dto.ts create mode 100644 dsl/src/cli/java-server/builder-factory.ts create mode 100644 dsl/src/cli/java-server/enum.ts create mode 100644 dsl/src/cli/java-server/generator.ts create mode 100644 dsl/src/cli/java-server/record.ts create mode 100644 dsl/src/cli/java-server/union.ts diff --git a/dsl/src/cli/java-client-api/base-dto.ts b/dsl/src/cli/java-client-api/base-dto.ts index 7ad3c6f..5f7dada 100644 --- a/dsl/src/cli/java-client-api/base-dto.ts +++ b/dsl/src/cli/java-client-api/base-dto.ts @@ -1,13 +1,20 @@ import { CompositeGeneratorNode, NL, toString } from "langium/generate"; import { Artifact } from "../artifact-generator.js"; -import { JavaClientAPIGeneratorConfig, toPath } from "../java-gen-utils.js"; +import { generateCompilationUnit, JavaClientAPIGeneratorConfig, JavaImportsCollector, toPath } from "../java-gen-utils.js"; export function generateBaseDTO(artifactConfig: JavaClientAPIGeneratorConfig): Artifact { const packageName = `${artifactConfig.rootPackageName}.dto`; + + return { + name: 'BaseDTO.java', + content: toString(generateCompilationUnit(packageName, new JavaImportsCollector(packageName), generateBaseDTOContent())), + path: toPath(artifactConfig.targetFolder, packageName) + } +} + +export function generateBaseDTOContent() { const node = new CompositeGeneratorNode() - node.append('// Generated by RSD - Do not modify',NL) - node.append(`package ${packageName};`, NL, NL) node.append(`public interface BaseDTO {`,NL) node.indent( child => { child.append(`public interface Builder {`, NL) @@ -17,9 +24,5 @@ export function generateBaseDTO(artifactConfig: JavaClientAPIGeneratorConfig): A child.append('}',NL) }); node.append('}',NL) - return { - name: 'BaseDTO.java', - content: toString(node), - path: toPath(artifactConfig.targetFolder, packageName) - } -} + return node; +} \ No newline at end of file diff --git a/dsl/src/cli/java-client-api/union.ts b/dsl/src/cli/java-client-api/union.ts index ca52d79..bd1655e 100644 --- a/dsl/src/cli/java-client-api/union.ts +++ b/dsl/src/cli/java-client-api/union.ts @@ -34,6 +34,15 @@ export function generateUnion(t: MResolvedUnionType, artifactConfig: JavaClientA const importCollector = new JavaImportsCollector(packageName); const fqn = importCollector.importType.bind(importCollector); + + return { + name: `${t.name}DTO.java`, + content: toString(generateCompilationUnit(packageName, importCollector, generateUnionContent(t, artifactConfig, fqn))), + path: toPath(artifactConfig.targetFolder, packageName) + }; +} + +export function generateUnionContent(t: MResolvedUnionType, artifactConfig: JavaClientAPIGeneratorConfig, fqn: (type: string) => string) { const node = new CompositeGeneratorNode(); node.append(`public interface ${t.name}DTO extends BaseDTO {`,NL) @@ -73,10 +82,5 @@ export function generateUnion(t: MResolvedUnionType, artifactConfig: JavaClientA } node.append('}',NL) - - return { - name: `${t.name}DTO.java`, - content: toString(generateCompilationUnit(packageName, importCollector, node)), - path: toPath(artifactConfig.targetFolder, packageName) - }; + return node; } \ No newline at end of file diff --git a/dsl/src/cli/java-gen-utils.ts b/dsl/src/cli/java-gen-utils.ts index 2e44f4d..81c932b 100644 --- a/dsl/src/cli/java-gen-utils.ts +++ b/dsl/src/cli/java-gen-utils.ts @@ -66,7 +66,13 @@ export type JavaRestClientJDKGeneratorConfig = ArtifactGenerationConfig & { nativeTypeSubstitues?: Record } -export type JavaServerJakartaWSConfig = ArtifactGenerationConfig & { +export type JavaServerJakartaWSGeneratorConfig = ArtifactGenerationConfig & { + targetFolder: string + rootPackageName: string + nativeTypeSubstitues?: Record +} + +export type JavaServerGeneratorConfig = ArtifactGenerationConfig & { targetFolder: string rootPackageName: string nativeTypeSubstitues?: Record @@ -82,7 +88,12 @@ export function isJavaRestClientJDKGeneratorConfig(config: ArtifactGeneratorConf && 'rootPackageName' in config && typeof config.rootPackageName === 'string'; } -export function isJavaServerJakartaWSConfig(config: ArtifactGeneratorConfig): config is JavaServerJakartaWSConfig { +export function isJavaServerJakartaWSConfig(config: ArtifactGeneratorConfig): config is JavaServerJakartaWSGeneratorConfig { + return 'targetFolder' in config && typeof config.targetFolder === 'string' + && 'rootPackageName' in config && typeof config.rootPackageName === 'string'; +} + +export function isJavaServerConfig(config: ArtifactGeneratorConfig): config is JavaServerGeneratorConfig { return 'targetFolder' in config && typeof config.targetFolder === 'string' && 'rootPackageName' in config && typeof config.rootPackageName === 'string'; } diff --git a/dsl/src/cli/java-server-jakarta-ws/enum.ts b/dsl/src/cli/java-server-jakarta-ws/enum.ts index 4b45cd7..635fe5d 100644 --- a/dsl/src/cli/java-server-jakarta-ws/enum.ts +++ b/dsl/src/cli/java-server-jakarta-ws/enum.ts @@ -1,10 +1,10 @@ import { CompositeGeneratorNode, NL, toString } from "langium/generate"; import { Artifact } from "../artifact-generator.js"; -import { JavaServerJakartaWSConfig, toPath } from "../java-gen-utils.js"; +import { JavaServerJakartaWSGeneratorConfig, toPath } from "../java-gen-utils.js"; import { MEnumType, MInlineEnumType } from "../model.js"; -export function generateEnum(t: MEnumType, artifactConfig: JavaServerJakartaWSConfig): Artifact { +export function generateEnum(t: MEnumType, artifactConfig: JavaServerJakartaWSGeneratorConfig): Artifact { const packageName = `${artifactConfig.rootPackageName}.rest.dto`; const node = new CompositeGeneratorNode() diff --git a/dsl/src/cli/java-server-jakarta-ws/generator.ts b/dsl/src/cli/java-server-jakarta-ws/generator.ts index 96fb6fa..1d9f56c 100644 --- a/dsl/src/cli/java-server-jakarta-ws/generator.ts +++ b/dsl/src/cli/java-server-jakarta-ws/generator.ts @@ -1,7 +1,7 @@ import chalk from "chalk"; import { isMEnumType, isMRecordType, isMUnionType, MResolvedRSDModel, MResolvedUserType } from "../model.js"; import { Artifact, ArtifactGenerationConfig, ArtifactGeneratorConfig } from "../artifact-generator.js"; -import { isJavaServerJakartaWSConfig, JavaServerJakartaWSConfig } from "../java-gen-utils.js"; +import { isJavaServerJakartaWSConfig, JavaServerJakartaWSGeneratorConfig } from "../java-gen-utils.js"; import { isDefined } from "../util.js"; import { generateRecord } from "./record.js"; import { generateUnion } from "./union.js"; @@ -21,7 +21,7 @@ export function generate(model: MResolvedRSDModel, generatorConfig: ArtifactGene return result; } -function generateType(t: MResolvedUserType, artifactConfig: JavaServerJakartaWSConfig): Artifact | undefined { +function generateType(t: MResolvedUserType, artifactConfig: JavaServerJakartaWSGeneratorConfig): Artifact | undefined { if( isMEnumType(t) ) { } else if( isMRecordType(t) ) { diff --git a/dsl/src/cli/java-server-jakarta-ws/record.ts b/dsl/src/cli/java-server-jakarta-ws/record.ts index df82f74..b541405 100644 --- a/dsl/src/cli/java-server-jakarta-ws/record.ts +++ b/dsl/src/cli/java-server-jakarta-ws/record.ts @@ -1,11 +1,11 @@ import { CompositeGeneratorNode, NL, toString } from "langium/generate"; import { Artifact } from "../artifact-generator.js"; -import { builtinToJavaType, generateCompilationUnit, JavaImportsCollector, JavaServerJakartaWSConfig, resolveObjectType, resolveType, toPath } from "../java-gen-utils.js"; +import { builtinToJavaType, generateCompilationUnit, JavaImportsCollector, JavaServerJakartaWSGeneratorConfig, resolveObjectType, resolveType, toPath } from "../java-gen-utils.js"; import { allRecordProperties, isMInlineEnumType, isMKeyProperty, isMProperty, isMRevisionProperty, MResolvedRecordType } from "../model.js"; import { toFirstUpper } from "../util.js"; import { generateInlineEnum } from "./enum.js"; -export function generateRecord(t: MResolvedRecordType, artifactConfig: JavaServerJakartaWSConfig): Artifact | undefined { +export function generateRecord(t: MResolvedRecordType, artifactConfig: JavaServerJakartaWSGeneratorConfig): Artifact | undefined { if( t.resolved.unions.length === 1 ) { return undefined; } @@ -21,7 +21,7 @@ export function generateRecord(t: MResolvedRecordType, artifactConfig: JavaServe }; } -export function generateRecordContent(t: MResolvedRecordType, artifactConfig: JavaServerJakartaWSConfig, fqn: (type: string) => string): CompositeGeneratorNode { +export function generateRecordContent(t: MResolvedRecordType, artifactConfig: JavaServerJakartaWSGeneratorConfig, fqn: (type: string) => string): CompositeGeneratorNode { const node = new CompositeGeneratorNode(); const allProps = allRecordProperties(t); @@ -29,7 +29,7 @@ export function generateRecordContent(t: MResolvedRecordType, artifactConfig: Ja node.append(`public record ${t.name}DTO(`,NL) node.indent( param => { allProps.forEach( (property, idx, arr) => { - const end = idx + 1 < arr.length ? ',' : ') {' + const end = idx + 1 < arr.length ? ',' : `) implements ${artifactConfig.rootPackageName}.service.dto.${t.name}DTO {` if( isMKeyProperty(property) ) { param.append(`${builtinToJavaType(property.type, fqn)} ${property.name}`, end, NL) } else if( isMRevisionProperty(property) ) { diff --git a/dsl/src/cli/java-server-jakarta-ws/service.ts b/dsl/src/cli/java-server-jakarta-ws/service.ts index 21f9c5f..0f63ac3 100644 --- a/dsl/src/cli/java-server-jakarta-ws/service.ts +++ b/dsl/src/cli/java-server-jakarta-ws/service.ts @@ -1,11 +1,11 @@ import { CompositeGeneratorNode, NL, toString } from "langium/generate"; import { Artifact } from "../artifact-generator.js"; -import { generateCompilationUnit, JavaImportsCollector, JavaRestClientJDKGeneratorConfig, toPath } from "../java-gen-utils.js"; +import { generateCompilationUnit, JavaImportsCollector, JavaServerJakartaWSGeneratorConfig, toPath } from "../java-gen-utils.js"; import { MResolvedOperation, MResolvedService } from "../model.js"; import { toFirstUpper } from "../util.js"; import { toType } from "../java-client-api/shared.js"; -export function generateService(s: MResolvedService, artifactConfig: JavaRestClientJDKGeneratorConfig): Artifact[] { +export function generateService(s: MResolvedService, artifactConfig: JavaServerJakartaWSGeneratorConfig): Artifact[] { const result : Artifact[] = []; const serviceDTOs = s.operations .filter( o => o.parameters.filter( p => p.meta?.rest?.source === undefined).length > 1 ) @@ -15,7 +15,7 @@ export function generateService(s: MResolvedService, artifactConfig: JavaRestCli return result; } -function generateServiceDTO(s: MResolvedService, o: MResolvedOperation, artifactConfig: JavaRestClientJDKGeneratorConfig): Artifact { +function generateServiceDTO(s: MResolvedService, o: MResolvedOperation, artifactConfig: JavaServerJakartaWSGeneratorConfig): Artifact { const packageName = `${artifactConfig.rootPackageName}.rest.dto`; const importCollector = new JavaImportsCollector(packageName); diff --git a/dsl/src/cli/java-server-jakarta-ws/union.ts b/dsl/src/cli/java-server-jakarta-ws/union.ts index d863830..505d4e8 100644 --- a/dsl/src/cli/java-server-jakarta-ws/union.ts +++ b/dsl/src/cli/java-server-jakarta-ws/union.ts @@ -1,12 +1,11 @@ import { CompositeGeneratorNode, IndentNode, NL, toString } from "langium/generate"; import { Artifact } from "../artifact-generator.js"; -import { builtinToJavaType, generateCompilationUnit, JavaImportsCollector, JavaServerJakartaWSConfig, resolveObjectType, resolveType, toPath } from "../java-gen-utils.js"; -import { allRecordProperties, isMInlineEnumType, isMKeyProperty, isMProperty, isMRevisionProperty, MKeyProperty, MProperty, MResolvedRecordType, MResolvedUnionType, MRevisionProperty } from "../model.js"; -import { generateInlineEnum } from "./enum.js"; +import { builtinToJavaType, generateCompilationUnit, JavaImportsCollector, JavaServerJakartaWSGeneratorConfig, resolveObjectType, resolveType, toPath } from "../java-gen-utils.js"; +import { allRecordProperties, isMKeyProperty, isMRevisionProperty, MKeyProperty, MProperty, MResolvedRecordType, MResolvedUnionType, MRevisionProperty } from "../model.js"; import { toFirstUpper } from "../util.js"; -export function generateUnion(t: MResolvedUnionType, artifactConfig: JavaServerJakartaWSConfig): Artifact { - const packageName = `${artifactConfig.rootPackageName}.rest.dto!`; +export function generateUnion(t: MResolvedUnionType, artifactConfig: JavaServerJakartaWSGeneratorConfig): Artifact { + const packageName = `${artifactConfig.rootPackageName}.rest.dto`; const importCollector = new JavaImportsCollector(packageName); const fqn = importCollector.importType.bind(importCollector); @@ -25,22 +24,16 @@ export function generateUnion(t: MResolvedUnionType, artifactConfig: JavaServerJ } ); node.append('})',NL) - node.append(`public abstract class ${t.name}DTO {`,NL) - t.resolved.sharedProps - .filter(isMProperty) - .filter(p => p.variant === 'inline-enum') - .forEach( p => { - const inlineEnum = p.type; - if( isMInlineEnumType(inlineEnum) ) { - generateInlineEnum(inlineEnum, toFirstUpper(p.name), node) - } - }); - + node.append(`public abstract class ${t.name}DTO implements ${artifactConfig.rootPackageName}.service.dto.${t.name}DTO {`,NL) node.indent( child => { t.resolved.sharedProps.forEach( p => generateProperty(child, p, artifactConfig, fqn) ) }) + node.indent( child => { + t.resolved.sharedProps.forEach( p => generatePropertyAccess(child, p, artifactConfig, fqn) ) + }) + node.indent( child => { childRecords.forEach( r => { @@ -59,31 +52,24 @@ export function generateUnion(t: MResolvedUnionType, artifactConfig: JavaServerJ }; } -function generateUnionRecordContent(node: IndentNode, t: MResolvedRecordType, p: MResolvedUnionType, artifactConfig: JavaServerJakartaWSConfig, fqn: (type: string) => string) { - node.append(`public static class ${t.name}DTO extends ${p.name}DTO {`,NL) +function generateUnionRecordContent(node: IndentNode, t: MResolvedRecordType, p: MResolvedUnionType, artifactConfig: JavaServerJakartaWSGeneratorConfig, fqn: (type: string) => string) { + node.append(`public static class ${t.name}DTO extends ${p.name}DTO implements ${artifactConfig.rootPackageName}.service.dto.${p.name}DTO.${t.name}DTO {`,NL) const sharedProps = t.resolved.unions.flatMap(u => u.resolved.sharedProps); const allProps = allRecordProperties(t); - allProps - .filter(isMProperty) - .filter(p => p.variant === 'inline-enum') - .filter(p => !sharedProps.includes(p)) - .forEach( p => { - const inlineEnum = p.type; - if( isMInlineEnumType(inlineEnum) ) { - generateInlineEnum(inlineEnum, toFirstUpper(p.name), node) - } - }); - + node.indent( child => { allProps.filter(p => !sharedProps.includes(p)).forEach( p => generateProperty(child, p, artifactConfig, fqn)) }) + node.indent( child => { + allProps.filter(p => !sharedProps.includes(p)).forEach( p => generatePropertyAccess(child, p, artifactConfig, fqn)) + }) node.append('}',NL) } -function generateProperty(node: IndentNode, property: MKeyProperty | MRevisionProperty | MProperty, artifactConfig: JavaServerJakartaWSConfig, fqn: (type: string) => string) { +function generateProperty(node: IndentNode, property: MKeyProperty | MRevisionProperty | MProperty, artifactConfig: JavaServerJakartaWSGeneratorConfig, fqn: (type: string) => string) { if( isMKeyProperty(property) ) { node.append(`public ${builtinToJavaType(property.type, fqn)} ${property.name};`,NL) } else if( isMRevisionProperty(property) ) { @@ -105,4 +91,57 @@ function generateProperty(node: IndentNode, property: MKeyProperty | MRevisionPr node.append(`public ${toFirstUpper(property.name)} ${property.name};`,NL) } } +} + +function generatePropertyAccess(node: IndentNode, property: MKeyProperty | MRevisionProperty | MProperty, artifactConfig: JavaServerJakartaWSGeneratorConfig, fqn: (type: string) => string) { + node.appendNewLine(); + if( isMKeyProperty(property) ) { + node.append(`public ${builtinToJavaType(property.type, fqn)} ${property.name}() {`,NL) + node.indent( body => { + body.append(`return this.${property.name};`,NL); + } ) + node.append('}',NL); + } else if( isMRevisionProperty(property) ) { + node.append(`public ${builtinToJavaType(property.type, fqn)} ${property.name}() {`,NL) + node.indent( body => { + body.append(`return this.${property.name};`,NL); + } ) + node.append('}', NL) + } else { + if( property.variant === 'union' || property.variant === 'record' ) { + if( property.array ) { + node.append(`public ${fqn('java.util.List')}<${property.type}DTO> ${property.name}() {`,NL) + node.indent( body => { + body.append(`return this.${property.name};`,NL); + } ) + node.append('}', NL) + } else { + node.append(`public ${property.type}DTO ${property.name}() {`,NL) + node.indent( body => { + body.append(`return this.${property.name};`,NL); + } ) + node.append('}', NL) + } + } else if( typeof property.type === 'string' ) { + if( property.array ) { + node.append(`public ${fqn('java.util.List')}<${resolveObjectType(property.type, artifactConfig.nativeTypeSubstitues, fqn)}> ${property.name}() {`,NL) + node.indent( body => { + body.append(`return this.${property.name};`,NL); + } ) + node.append('}', NL) + } else { + node.append(`public ${resolveType(property.type, artifactConfig.nativeTypeSubstitues, fqn)} ${property.name}() {`,NL) + node.indent( body => { + body.append(`return this.${property.name};`,NL); + } ) + node.append('}', NL) + } + } else { + node.append(`public ${toFirstUpper(property.name)} ${property.name}() {`,NL) + node.indent( body => { + body.append(`return this.${property.name};`,NL); + } ) + node.append('}', NL); + } + } } \ No newline at end of file diff --git a/dsl/src/cli/java-server/base-dto.ts b/dsl/src/cli/java-server/base-dto.ts new file mode 100644 index 0000000..8967a48 --- /dev/null +++ b/dsl/src/cli/java-server/base-dto.ts @@ -0,0 +1,15 @@ +import { toString } from "langium/generate"; + +import { Artifact } from "../artifact-generator.js"; +import { generateCompilationUnit, JavaClientAPIGeneratorConfig, JavaImportsCollector, toPath } from "../java-gen-utils.js"; +import { generateBaseDTOContent } from "../java-client-api/base-dto.js"; + +export function generateBaseDTO(artifactConfig: JavaClientAPIGeneratorConfig): Artifact { + const packageName = `${artifactConfig.rootPackageName}.service.dto`; + + return { + name: 'BaseDTO.java', + content: toString(generateCompilationUnit(packageName, new JavaImportsCollector(packageName), generateBaseDTOContent())), + path: toPath(artifactConfig.targetFolder, packageName) + } +} \ No newline at end of file diff --git a/dsl/src/cli/java-server/builder-factory.ts b/dsl/src/cli/java-server/builder-factory.ts new file mode 100644 index 0000000..25eed81 --- /dev/null +++ b/dsl/src/cli/java-server/builder-factory.ts @@ -0,0 +1,31 @@ +import { expandToString } from "langium/generate"; + +import { Artifact } from "../artifact-generator.js"; +import { JavaClientAPIGeneratorConfig, toPath } from "../java-gen-utils.js"; + +export function generateDTOBuilderFactory(artifactConfig: JavaClientAPIGeneratorConfig): Artifact { + const packageName = `${artifactConfig.rootPackageName}.service`; + + return { + name: 'DTOBuilderFactory.java', + content: generateDTOBuilderFactoryContent(packageName), + path: toPath(artifactConfig.targetFolder, packageName) + } +} + +function generateDTOBuilderFactoryContent(packageName: string) { + const content = expandToString` + // Generated by RSD - Do not modify + package ${packageName}; + + import ${packageName}.dto.BaseDTO; + + public interface DTOBuilderFactory { + public interface Builder { + public BaseDTO build(); + } + + public T builder(Class type); + }` + return content; +} \ No newline at end of file diff --git a/dsl/src/cli/java-server/enum.ts b/dsl/src/cli/java-server/enum.ts new file mode 100644 index 0000000..e69de29 diff --git a/dsl/src/cli/java-server/generator.ts b/dsl/src/cli/java-server/generator.ts new file mode 100644 index 0000000..9fd77ba --- /dev/null +++ b/dsl/src/cli/java-server/generator.ts @@ -0,0 +1,45 @@ +import chalk from "chalk"; +import { Artifact, ArtifactGenerationConfig, ArtifactGeneratorConfig } from "../artifact-generator.js"; +import { isMEnumType, isMRecordType, isMUnionType, MResolvedRSDModel, MResolvedUserType } from "../model.js"; +import { isJavaServerConfig, JavaServerGeneratorConfig } from "../java-gen-utils.js"; +import { isDefined } from "../util.js"; +import { generateRecord } from "./record.js"; +import { generateBaseDTO } from "./base-dto.js"; +import { generateUnion } from "./union.js"; +import { generateDTOBuilderFactory } from "./builder-factory.js"; + +export function generate(model: MResolvedRSDModel, generatorConfig: ArtifactGenerationConfig, artifactConfig: ArtifactGeneratorConfig): readonly Artifact[] { + console.log(chalk.cyan('Generating Java-Server')); + + if( ! isJavaServerConfig(artifactConfig) ) { + console.log(chalk.red(' Invalid configuration passed aborted artifact generation')); + return []; + } + + const result = model.elements.map( e => generateType(e, model, artifactConfig) ).filter(isDefined) + result.push(generateBaseDTO(artifactConfig)) + result.push(generateDTOBuilderFactory(artifactConfig)) + // result.push(...model.services.flatMap( e => generateService(e, artifactConfig))) + + return result; +} + +function generateType(t: MResolvedUserType, model: MResolvedRSDModel, artifactConfig: JavaServerGeneratorConfig): Artifact | undefined { + if( isMEnumType(t) ) { + if( artifactConfig.nativeTypeSubstitues && t.name in artifactConfig.nativeTypeSubstitues ) { + console.log(chalk.magenta(` Skipped ${t.name}:`), `Using native ${artifactConfig.nativeTypeSubstitues[t.name]}`); + return undefined; + } + //return generateEnum(t, artifactConfig); + } else if( isMRecordType(t) ) { + return generateRecord(t, model, artifactConfig); + } else if( isMUnionType(t) ) { + return generateUnion(t, artifactConfig) + } + return undefined +} + +export default { + name: 'java-server-base', + generate +} \ No newline at end of file diff --git a/dsl/src/cli/java-server/record.ts b/dsl/src/cli/java-server/record.ts new file mode 100644 index 0000000..fe30f91 --- /dev/null +++ b/dsl/src/cli/java-server/record.ts @@ -0,0 +1,21 @@ +import { toString } from "langium/generate"; +import { Artifact } from "../artifact-generator.js"; +import { generateCompilationUnit, JavaImportsCollector, JavaServerGeneratorConfig, toPath } from "../java-gen-utils.js"; +import { MResolvedRecordType, MResolvedRSDModel } from "../model.js"; +import { generateRecordContent } from "../java-client-api/record.js"; + +export function generateRecord(t: MResolvedRecordType, model: MResolvedRSDModel, artifactConfig: JavaServerGeneratorConfig): Artifact | undefined { + if( t.resolved.unions.length === 1 ) { + return undefined; + } + const packageName = `${artifactConfig.rootPackageName}.service.dto`; + + const importCollector = new JavaImportsCollector(packageName); + const fqn = importCollector.importType.bind(importCollector); + + return { + name: `${t.name}DTO.java`, + content: toString(generateCompilationUnit(packageName, importCollector, generateRecordContent(t, artifactConfig, fqn))), + path: toPath(artifactConfig.targetFolder, packageName) + }; +} \ No newline at end of file diff --git a/dsl/src/cli/java-server/union.ts b/dsl/src/cli/java-server/union.ts new file mode 100644 index 0000000..4a61f42 --- /dev/null +++ b/dsl/src/cli/java-server/union.ts @@ -0,0 +1,30 @@ +import { + toString +} from "langium/generate"; + +import { + JavaImportsCollector, + JavaClientAPIGeneratorConfig, generateCompilationUnit, toPath +} from "../java-gen-utils.js"; +import { + MResolvedUnionType, +} from "../model.js"; +import { + Artifact +} from "../artifact-generator.js"; +import { generateUnionContent } from "../java-client-api/union.js"; + + +export function generateUnion(t: MResolvedUnionType, artifactConfig: JavaClientAPIGeneratorConfig): Artifact { + const packageName = `${artifactConfig.rootPackageName}.service.dto`; + + const importCollector = new JavaImportsCollector(packageName); + const fqn = importCollector.importType.bind(importCollector); + + + return { + name: `${t.name}DTO.java`, + content: toString(generateCompilationUnit(packageName, importCollector, generateUnionContent(t, artifactConfig, fqn))), + path: toPath(artifactConfig.targetFolder, packageName) + }; +} diff --git a/dsl/src/cli/main.ts b/dsl/src/cli/main.ts index 68955a7..4dbb986 100644 --- a/dsl/src/cli/main.ts +++ b/dsl/src/cli/main.ts @@ -16,6 +16,7 @@ import { Artifact, ArtifactGenerator, isArtifactGenerationConfig } from './artif import JavaClientAPI from './java-client-api/generator.js'; import JavaRestClientJDK from './java-rest-client-jdk/generator.js'; import JavaServerJakartaWS from './java-server-jakarta-ws/generator.js'; +import JavaServer from './java-server/generator.js'; import { existsSync } from 'node:fs'; @@ -28,6 +29,7 @@ const generatorRegistry = new Map(); generatorRegistry.set(JavaClientAPI.name, JavaClientAPI); generatorRegistry.set(JavaRestClientJDK.name, JavaRestClientJDK); generatorRegistry.set(JavaServerJakartaWS.name, JavaServerJakartaWS); +generatorRegistry.set(JavaServer.name, JavaServer); export const generateAction = async (fileName: string, opts: ModelGenerateOptions): Promise => { const services = createRemoteServiceDescriptionServices(NodeFileSystem);