generator-reddgen
Version:
Reddgen is a development platform to quickly generate, develop, & deploy modern web applications & microservice architectures.
494 lines (473 loc) • 16.6 kB
JavaScript
/**
* Copyright 2013-2022 the original author or authors from the Reddgen project.
*
* This file is part of the Reddgen project, see https://www.reddgen.tech/
* for more information.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const _ = require('lodash');
const chalk = require('chalk');
const fs = require('fs');
const entityServerCleanup = require('./cleanup');
const utils = require('../utils');
const constants = require('../generator-constants');
const { CASSANDRA, COUCHBASE, MONGODB, NEO4J, SQL } = require('../../jdl/reddgen/database-types');
const { ELASTICSEARCH } = require('../../jdl/reddgen/search-engine-types');
const { MapperTypes, ServiceTypes } = require('../../jdl/reddgen/entity-options');
const { EHCACHE, CAFFEINE, INFINISPAN, REDIS } = require('../../jdl/reddgen/cache-types');
const { writeEntityCouchbaseFiles } = require('./files-couchbase');
const { MAPSTRUCT } = MapperTypes;
const { SERVICE_CLASS, SERVICE_IMPL } = ServiceTypes;
/* Constants use throughout */
const INTERPOLATE_REGEX = constants.INTERPOLATE_REGEX;
const SERVER_MAIN_SRC_DIR = constants.SERVER_MAIN_SRC_DIR;
const SERVER_MAIN_RES_DIR = constants.SERVER_MAIN_RES_DIR;
const TEST_DIR = constants.TEST_DIR;
const SERVER_TEST_SRC_DIR = constants.SERVER_TEST_SRC_DIR;
const cassandraChangelogFiles = {
dbChangelog: [
{
condition: generator => generator.databaseType === CASSANDRA && !generator.skipDbChangelog,
path: SERVER_MAIN_RES_DIR,
templates: [
{
file: 'config/cql/changelog/added_entity.cql',
renameTo: generator => `config/cql/changelog/${generator.changelogDate}_added_entity_${generator.entityClass}.cql`,
},
],
},
],
};
const modelFiles = {
model: [
{
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/domain/Entity.java.rg',
renameTo: generator => `${generator.entityAbsoluteFolder}/domain/${generator.persistClass}.java.rg`,
},
],
},
],
modelTestFiles: [
{
path: SERVER_TEST_SRC_DIR,
templates: [
{
file: 'package/domain/EntityTest.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/domain/${generator.persistClass}Test.java`,
},
],
},
],
};
/**
* The default is to use a file path string. It implies use of the template method.
* For any other config an object { file:.., method:.., template:.. } can be used
*/
const entityFiles = {
server: [
{
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/domain/Entity.java.rg.javax_validation',
renameTo: generator => `${generator.entityAbsoluteFolder}/domain/${generator.persistClass}.java.rg.javax_validation`,
},
],
},
{
condition: generator => generator.databaseTypeSql && generator.reactive,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/domain/Entity.java.rg.spring_data_reactive',
renameTo: generator => `${generator.entityAbsoluteFolder}/domain/${generator.persistClass}.java.rg.spring_data_reactive`,
},
],
},
{
condition: generator => generator.databaseTypeSql && generator.requiresPersistableImplementation,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/domain/Entity.java.rg.spring_data_persistable',
renameTo: generator => `${generator.entityAbsoluteFolder}/domain/${generator.persistClass}.java.rg.spring_data_persistable`,
},
],
},
{
condition: generator => generator.databaseTypeSql && generator.reactive && generator.requiresPersistableImplementation,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/domain/EntityCallback.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/domain/${generator.persistClass}Callback.java`,
},
],
},
{
condition: generator => generator.databaseTypeSql && !generator.reactive && generator.requiresPersistableImplementation,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/domain/Entity.java.rg.javax_lifecycle_events',
renameTo: generator => `${generator.entityAbsoluteFolder}/domain/${generator.persistClass}.java.rg.javax_lifecycle_events`,
},
],
},
{
condition: generator => generator.databaseTypeCassandra,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/domain/Entity.java.rg.spring_data_cassandra',
renameTo: generator => `${generator.entityAbsoluteFolder}/domain/${generator.persistClass}.java.rg.spring_data_cassandra`,
},
],
},
{
condition: generator => generator.databaseTypeNeo4j,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/domain/Entity.java.rg.spring_data_neo4j',
renameTo: generator => `${generator.entityAbsoluteFolder}/domain/${generator.persistClass}.java.rg.spring_data_neo4j`,
},
],
},
{
condition: generator => generator.databaseTypeSql && !generator.reactive,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/domain/Entity.java.rg.javax_persistence',
renameTo: generator => `${generator.entityAbsoluteFolder}/domain/${generator.persistClass}.java.rg.javax_persistence`,
},
],
},
{
condition: generator => generator.databaseTypeMongodb,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/domain/Entity.java.rg.spring_data_mongodb',
renameTo: generator => `${generator.entityAbsoluteFolder}/domain/${generator.persistClass}.java.rg.spring_data_mongodb`,
},
],
},
{
condition: generator => generator.databaseTypeSql && !generator.reactive && generator.enableHibernateCache,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/domain/Entity.java.rg.hibernate_cache',
renameTo: generator => `${generator.entityAbsoluteFolder}/domain/${generator.persistClass}.java.rg.hibernate_cache`,
},
],
},
{
condition: generator => generator.searchEngineElasticsearch,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/domain/Entity.java.rg.elastic_search',
renameTo: generator => `${generator.entityAbsoluteFolder}/domain/${generator.persistClass}.java.rg.elastic_search`,
},
],
},
],
};
const restFiles = {
restFiles: [
{
condition: generator => !generator.embedded,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/web/rest/EntityResource.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/web/rest/${generator.entityClass}Resource.java`,
},
],
},
],
restTestFiles: [
{
condition: generator => !generator.embedded,
path: SERVER_TEST_SRC_DIR,
templates: [
{
file: 'package/web/rest/EntityResourceIT.java',
options: {
context: {
_,
chalkRed: chalk.red,
fs,
SERVER_TEST_SRC_DIR,
},
},
renameTo: generator => `${generator.entityAbsoluteFolder}/web/rest/${generator.entityClass}ResourceIT.java`,
},
],
},
],
};
const filteringFiles = {
filteringFiles: [
{
condition: generator => generator.jpaMetamodelFiltering,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/service/criteria/EntityCriteria.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/service/criteria/${generator.entityClass}Criteria.java`,
},
{
file: 'package/service/EntityQueryService.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/service/${generator.entityClass}QueryService.java`,
},
],
},
],
};
const elasticSearchFiles = {
elasticSearchFiles: [
{
condition: generator => generator.searchEngine === ELASTICSEARCH && !generator.embedded,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/repository/search/EntitySearchRepository.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/repository/search/${generator.entityClass}SearchRepository.java`,
},
],
},
],
};
const respositoryFiles = {
respositoryFiles: [
{
condition: generator => !generator.reactive && !generator.embedded && generator.databaseType !== COUCHBASE,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/repository/EntityRepository.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/repository/${generator.entityClass}Repository.java`,
},
],
},
{
condition: generator => !generator.reactive && generator.databaseTypeSql && !generator.embedded && generator.containsBagRelationships,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/repository/EntityRepositoryWithBagRelationships.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/repository/${generator.entityClass}RepositoryWithBagRelationships.java`,
},
{
file: 'package/repository/EntityRepositoryWithBagRelationshipsImpl.java',
renameTo: generator =>
`${generator.entityAbsoluteFolder}/repository/${generator.entityClass}RepositoryWithBagRelationshipsImpl.java`,
},
],
},
{
condition: generator => generator.reactive && !generator.embedded && generator.databaseType !== COUCHBASE,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/repository/EntityRepository_reactive.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/repository/${generator.entityClass}Repository.java`,
},
],
},
{
condition: generator => generator.reactive && generator.databaseType === SQL && !generator.embedded,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/repository/EntityRepositoryInternalImpl_reactive.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/repository/${generator.entityClass}RepositoryInternalImpl.java`,
},
{
file: 'package/repository/EntitySqlHelper_reactive.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/repository/${generator.entityClass}SqlHelper.java`,
},
{
file: 'package/repository/rowmapper/EntityRowMapper.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/repository/rowmapper/${generator.entityClass}RowMapper.java`,
},
],
},
],
};
const serviceFiles = {
serviceFiles: [
{
condition: generator => generator.service === SERVICE_IMPL && !generator.embedded,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/service/EntityService.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/service/${generator.entityClass}Service.java`,
},
{
file: 'package/service/impl/EntityServiceImpl.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/service/impl/${generator.entityClass}ServiceImpl.java`,
},
],
},
{
condition: generator => generator.service === SERVICE_CLASS && !generator.embedded,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/service/impl/EntityServiceImpl.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/service/${generator.entityClass}Service.java`,
},
],
},
],
};
const dtoFiles = {
dtoFiles: [
{
condition: generator => generator.dto === MAPSTRUCT,
path: SERVER_MAIN_SRC_DIR,
templates: [
{
file: 'package/service/dto/EntityDTO.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/service/dto/${generator.asDto(generator.entityClass)}.java`,
},
{
file: 'package/service/mapper/BaseEntityMapper.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/service/mapper/EntityMapper.java`,
},
{
file: 'package/service/mapper/EntityMapper.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/service/mapper/${generator.entityClass}Mapper.java`,
},
],
},
],
dtoTestFiles: [
{
condition: generator => generator.dto === MAPSTRUCT,
path: SERVER_TEST_SRC_DIR,
templates: [
{
file: 'package/service/dto/EntityDTOTest.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/service/dto/${generator.asDto(generator.entityClass)}Test.java`,
},
],
},
{
condition: generator => generator.dto === MAPSTRUCT && [SQL, MONGODB, COUCHBASE, NEO4J].includes(generator.databaseType),
path: SERVER_TEST_SRC_DIR,
templates: [
{
file: 'package/service/mapper/EntityMapperTest.java',
renameTo: generator => `${generator.entityAbsoluteFolder}/service/mapper/${generator.entityClass}MapperTest.java`,
},
],
},
],
};
const gatlingFiles = {
gatlingFiles: [
{
condition: generator => generator.gatlingTests,
path: TEST_DIR,
templates: [
{
file: 'gatling/user-files/simulations/EntityGatlingTest.scala',
options: { interpolate: INTERPOLATE_REGEX },
renameTo: generator => `gatling/user-files/simulations/${generator.entityClass}GatlingTest.scala`,
},
],
},
],
};
const serverFiles = {
...cassandraChangelogFiles,
...modelFiles,
...entityFiles,
...restFiles,
...filteringFiles,
...elasticSearchFiles,
...respositoryFiles,
...serviceFiles,
...dtoFiles,
...gatlingFiles,
};
module.exports = {
writeFiles,
serverFiles,
customizeFiles,
};
function writeFiles() {
return {
setUp() {
this.javaDir = `${this.packageFolder}/`;
this.testDir = `${this.packageFolder}/`;
},
cleanupOldServerFiles() {
entityServerCleanup.cleanupOldFiles(this, `${SERVER_MAIN_SRC_DIR}${this.javaDir}`, `${SERVER_TEST_SRC_DIR}${this.testDir}`);
},
writeServerFiles() {
if (this.skipServer) return undefined;
// write server side files
if (this.reactive) {
return this.writeFilesToDisk(serverFiles, ['reactive', '']);
}
return this.writeFilesToDisk(serverFiles);
},
writeEnumFiles() {
this.fields.forEach(field => {
if (!field.fieldIsEnum) {
return;
}
const fieldType = field.fieldType;
const enumInfo = {
...utils.getEnumInfo(field, this.clientRootFolder),
frontendAppName: this.frontendAppName,
packageName: this.packageName,
entityAbsolutePackage: this.entityAbsolutePackage || this.packageName,
};
// eslint-disable-next-line no-console
if (!this.skipServer) {
const pathToTemplateFile = `${this.fetchFromInstalledReddgen(
'entity-server/templates'
)}/${SERVER_MAIN_SRC_DIR}package/domain/enumeration/Enum.java.ejs`;
this.template(
pathToTemplateFile,
`${SERVER_MAIN_SRC_DIR}${this.entityAbsoluteFolder}/domain/enumeration/${fieldType}.java`,
this,
{},
enumInfo
);
}
});
},
...writeEntityCouchbaseFiles(),
};
}
function customizeFiles() {
if (this.databaseType === SQL) {
if ([EHCACHE, CAFFEINE, INFINISPAN, REDIS].includes(this.cacheProvider) && this.enableHibernateCache) {
this.addEntityToCache(this.entityAbsoluteClass, this.relationships, this.packageName, this.packageFolder, this.cacheProvider);
}
}
}