139 lines
3.8 KiB
JavaScript
139 lines
3.8 KiB
JavaScript
const utils = require('./utils')
|
|
|
|
const COLLECTION_REGEX = /\[?([^\[\]]+)\]?/
|
|
const LAST_ELEMENT_REGEX = /(.*)\.([a-zA-Z_0-9]+$)/
|
|
|
|
const RESERVED_WORDS = [
|
|
'abstract', 'assert', 'boolean', 'break' , 'byte', 'case',
|
|
'catch', 'char', 'class', 'const', 'continue', 'default',
|
|
'double', 'do', 'else', 'enum', 'extends', 'false',
|
|
'final', 'finally', 'float', 'for','goto', 'if',
|
|
'implements', 'import', 'instanceof', 'int', 'interface', 'long',
|
|
'native', 'new', 'null', 'package', 'private', 'protected',
|
|
'public', 'return', 'short', 'static', 'strictfp', 'super',
|
|
'switch', 'synchronized', 'this', 'throw', 'throws', 'transient',
|
|
'true', 'try', 'void', 'volatile', 'while'
|
|
]
|
|
|
|
const SUPPORTED_TYPES = {
|
|
boolean: {
|
|
name: 'Boolean',
|
|
},
|
|
'date-iso8601': {
|
|
name: 'LocalDate',
|
|
imports: [ 'java.time.LocalDate', 'com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer', 'com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer' ],
|
|
serializer: 'LocalDateSerializer',
|
|
deserializer: 'LocalDateSerializer'
|
|
},
|
|
'date-time-iso8601': {
|
|
name: 'LocalDateTime',
|
|
imports: [ 'java.time.LocalDateTime', 'com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer', 'com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer' ],
|
|
serializer: 'LocalDateTimeSerializer',
|
|
deserializer: 'LocalDateTimeDeserializer'
|
|
},
|
|
decimal: {
|
|
name: 'BigDecimal',
|
|
imports: [ 'java.math.BigDecimal' ]
|
|
},
|
|
double: {
|
|
name: 'Double'
|
|
},
|
|
integer: {
|
|
name: 'Integer',
|
|
required_type: 'int'
|
|
},
|
|
long: {
|
|
name: 'Long',
|
|
},
|
|
object: {
|
|
name: 'Map<String, Object>',
|
|
imports: [ 'java.util.Map' ]
|
|
},
|
|
json: {
|
|
name: "Object"
|
|
},
|
|
string: {
|
|
name: 'String'
|
|
},
|
|
unit: {
|
|
name: 'Void'
|
|
},
|
|
uuid: {
|
|
name: 'UUID',
|
|
imports: [ 'java.util.UUID' ]
|
|
}
|
|
}
|
|
|
|
function getCustomType(type, namespace, suffix='') {
|
|
|
|
let match = LAST_ELEMENT_REGEX.exec(type)
|
|
let name = ''
|
|
let importstatement = null
|
|
if(match) {
|
|
name = utils.pascalcase(match[2])+suffix
|
|
importstatement = `${match[1].replace('enums', 'models')}.${name}`
|
|
}else {
|
|
name = utils.pascalcase(type)+suffix
|
|
importstatement = `${namespace}.models.${name}`
|
|
}
|
|
|
|
return {
|
|
name,
|
|
baseType: name,
|
|
fullQualifiedName: importstatement,
|
|
imports: [ importstatement ]
|
|
}
|
|
}
|
|
|
|
function mapCollection(type) {
|
|
let baseType = type.name
|
|
return {
|
|
name: `List<${baseType}>`,
|
|
baseType,
|
|
isEnum: type.isEnum,
|
|
fullQualifiedName: type.fullQualifiedName,
|
|
imports: [ ...(type.imports || []), 'java.util.List' ],
|
|
isCollection: true
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
mapJavaType: (type, namespace, suffix='') => {
|
|
const baseType = COLLECTION_REGEX.exec(type)[1]
|
|
let javaType = SUPPORTED_TYPES[baseType] || getCustomType(baseType, namespace, suffix)
|
|
|
|
if(type.startsWith('[')) {
|
|
javaType = mapCollection(javaType);
|
|
}
|
|
|
|
javaType.imports = javaType.imports || []
|
|
|
|
return {
|
|
...javaType,
|
|
raw: type,
|
|
|
|
}
|
|
},
|
|
mapDefaultValue(type, value) {
|
|
if(!value) {
|
|
return value
|
|
}
|
|
if(type === 'string' || type.name === 'String') {
|
|
return `"${value}"`
|
|
}
|
|
if(value == '[]') {
|
|
return "List.of()"
|
|
}
|
|
if(type.isEnum) {
|
|
return `${type.name}.${value.toUpperCase()}`
|
|
}
|
|
return value
|
|
},
|
|
|
|
safeName(name) {
|
|
if(RESERVED_WORDS.includes(name)) {
|
|
return `${name}Value`;
|
|
}
|
|
return name;
|
|
}
|
|
} |