UNPKG

@asyncapi/java-spring-cloud-stream-template

Version:

Java Spring Cloud Stream template for AsyncAPI generator.

138 lines (117 loc) 5.04 kB
// vim: set ts=2 sw=2 sts=2 expandtab : const fs = require('fs'); const path = require('path'); const ApplicationModel = require('../lib/applicationModel.js'); const _ = require('lodash'); const applicationModel = new ApplicationModel('post'); // To enable debug logging, set the env var DEBUG="postProcess" with whatever things you want to see. const debugPostProcess = require('debug')('postProcess'); const sourceHead = '/src/main/java/'; module.exports = { 'generate:after': generator => { const asyncapi = generator.asyncapi; const sourcePath = generator.targetDir + sourceHead; // NEW const defaultJavaPackage = getDefaultJavaPackage(generator); const defaultJavaPackageDir = getDefaultJavaPackageDir(generator, defaultJavaPackage); asyncapi.allSchemas().forEach((schema, schemaName) => { processSchema(generator, schemaName, schema, sourcePath, defaultJavaPackageDir); }); // Rename the pom file if necessary, and only include Application.java when an app is requested. const artifactType = generator.templateParams['artifactType']; if (artifactType === 'library') { fs.renameSync(path.resolve(generator.targetDir, 'pom.lib'), path.resolve(generator.targetDir, 'pom.xml')); fs.unlinkSync(path.resolve(generator.targetDir, 'pom.app')); fs.unlinkSync(path.resolve(sourcePath, 'Application.java')); } else { fs.renameSync(path.resolve(generator.targetDir, 'pom.app'), path.resolve(generator.targetDir, 'pom.xml')); fs.unlinkSync(path.resolve(generator.targetDir, 'pom.lib')); if (defaultJavaPackageDir) { moveFile(sourcePath, defaultJavaPackageDir, 'Application.java'); } } applicationModel.reset(); // Must clear its cache for when we run the jest tests. } }; function getDefaultJavaPackage(generator) { const asyncapi = generator.asyncapi; const info = asyncapi.info(); let javaPackage = generator.templateParams['javaPackage']; const extensions = info.extensions(); if (!javaPackage && info && extensions) { javaPackage = extensions['x-java-package']; } debugPostProcess(`getDefaultJavaPackage: ${javaPackage}`); return javaPackage; } function getDefaultJavaPackageDir(generator, defaultJavaPackage) { let defaultPackageDir; if (defaultJavaPackage) { const packageDir = packageToPath(defaultJavaPackage); defaultPackageDir = `${generator.targetDir}${sourceHead}${packageDir}`; } debugPostProcess(`getDefaultJavaPackageDir: ${defaultPackageDir}`); return defaultPackageDir; } function packageToPath(javaPackage) { return javaPackage.replace(/\./g, '/'); } function processSchema(generator, schemaName, schema, sourcePath, defaultJavaPackageDir) { const fileName = getFileName(schemaName); const filePath = path.resolve(sourcePath, fileName); debugPostProcess(`processSchema ${schemaName}`); debugPostProcess(schema); const modelClass = applicationModel.getModelClass({schema, schemaName}); const javaName = modelClass.getClassName(); if ((schema.type() && schema.type() !== 'object') || _.startsWith(javaName, 'Anonymous')) { debugPostProcess(`deleting ${filePath}`); if (fs.existsSync(filePath)) { fs.unlinkSync(filePath); } } else { const packageDir = getPackageDir(generator, defaultJavaPackageDir, modelClass); debugPostProcess(`packageDir: ${packageDir}`); if (packageDir) { moveFile(sourcePath, packageDir, fileName); } debugPostProcess(`javaName: ${javaName} schemaName: ${schemaName}`); if (javaName !== schemaName) { const currentPath = packageDir || sourcePath; const newPath = path.resolve(currentPath, `${javaName}.java`); const oldPath = path.resolve(currentPath, fileName); fs.renameSync(oldPath, newPath); debugPostProcess(`Renamed class file ${schemaName} to ${javaName}`); } } } function getFileName(schemaName) { const trimmedSchemaName = trimSchemaName(schemaName); return `${trimmedSchemaName}.java`; } function trimSchemaName(schemaName) { let trimmedSchemaName = schemaName; if (schemaName.startsWith('<')) { trimmedSchemaName = schemaName.replace('<', ''); trimmedSchemaName = trimmedSchemaName.replace(/>$/, ''); } return trimmedSchemaName; } function getPackageDir(generator, defaultJavaPackageDir, modelClass) { const fileSpecificPackage = modelClass.getJavaPackage(); if (fileSpecificPackage) { const packagePath = packageToPath(fileSpecificPackage); return `${generator.targetDir}${sourceHead}${packagePath}`; } return defaultJavaPackageDir; } function moveFile(oldDirectory, newDirectory, fileName) { if (!fs.existsSync(newDirectory)) { fs.mkdirSync(newDirectory, { recursive: true }); debugPostProcess(`Made directory ${newDirectory}`); } const oldPath = path.resolve(oldDirectory, fileName); const newPath = path.resolve(newDirectory, fileName); fs.copyFileSync(oldPath, newPath); fs.unlinkSync(oldPath); debugPostProcess(`Moved ${fileName} from ${oldPath} to ${newPath}`); }