leds-spark-lib
Version:
Biblioteca de geração de código
226 lines (212 loc) • 8.18 kB
JavaScript
import { CompositeGeneratorNode, expandToString, expandToStringWithNL, toString, isLocalEntity, getRef, capitalizeString } from "../../models/model.js";
export function generateModel(cls, is_supertype, relations, package_name, importedEntities) {
const supertype = getRef(cls.superType);
const is_abstract = cls?.is_abstract;
const external_relations = relations.filter(relation => relation.tgt.$container != cls.$container);
return expandToStringWithNL `
package ${package_name}.models;
import lombok.Data;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.experimental.SuperBuilder;
import jakarta.persistence.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Set;
import java.util.HashSet;
import java.util.Objects;
import java.util.UUID;
import java.time.LocalDate;
import java.util.Date;
import java.math.BigDecimal;
${external_relations.map(relation => `import ${package_name.replace(cls.$container.name.toLowerCase(), relation.tgt.$container.name.toLowerCase())}.models.${relation.tgt.name};`).join('\n')}
${supertype ? generateImportSuperEntity(package_name, cls, supertype, importedEntities) : undefined}
${is_abstract ? undefined : ``}
${is_abstract ? `` : ``}
${!is_supertype ? '@Inheritance(strategy = InheritanceType.SINGLE_TABLE)' : undefined}
public ${is_abstract ? `abstract` : undefined} class ${cls.name} ${supertype ? `extends ${supertype.name}` : ''} implements Serializable {
${is_abstract ? `
protected (strategy=GenerationType.IDENTITY)
Long id;` : undefined}
${!supertype && !is_abstract ? `
private (strategy=GenerationType.IDENTITY)
Long id;` : undefined}
${cls.attributes.map(a => generateAttribute(a, is_abstract)).join('\n')}
${generateRelations(cls, relations)}
${generateEnum(cls)}
.Default
private LocalDateTime createdAt = LocalDateTime.now();
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || this.getClass() != o.getClass()) return false;
${cls.name} elem = (${cls.name}) o;
return getId().equals(elem.getId());
}
public int hashCode() {
return Objects.hash(getId());
}
public String toString() {
return "${cls.name} {" +
"id="+this.id+
${cls.attributes.map(a => `", ${a.name}='"+this.${a.name}+"'"+`).join('\n')}
${isLocalEntity(supertype) ? supertype?.attributes.map(a => `", ${a.name}='"+this.${a.name}+"'"+`).join('\n') : undefined}
${cls.enumentityatributes.map(a => `", ${a.name.toLowerCase()}='"+this.${a.name.toLowerCase()}+"'"+`).join('\n')}
'}';
}
}
`;
}
function generateImportSuperEntity(package_name, entity, supertype, importedEntities) {
if (isLocalEntity(supertype)) {
return `import ${package_name.replace(entity.$container.name.toLowerCase(), generateImportEntity(supertype, importedEntities))}.models.${supertype.name};`;
}
const moduleImport = importedEntities.get(supertype);
if (moduleImport) {
return `import ${moduleImport.package_path}.models.${supertype.name};`;
}
return `import ${generateImportEntity(supertype, importedEntities)}.models.${supertype.name};`;
}
function generateImportEntity(entity, importedEntities) {
if (isLocalEntity(entity)) {
return `${entity.$container.name.toLowerCase()}`;
}
const moduleImport = importedEntities.get(entity);
return `${moduleImport?.library.toLocaleLowerCase()}.${entity.$container.name.toLowerCase()}`;
}
function generateAttribute(attribute, is_abstract) {
return expandToStringWithNL `
${generateUniqueCollumn(attribute)}
${is_abstract ? `protected` : `private`} ${capitalizeString(toString(generateTypeAttribute(attribute)) ?? 'NOTYPE')} ${attribute.name};
`;
}
function generateUniqueCollumn(attribute) {
if (attribute?.unique) {
return "@Column(unique=true)";
}
return "";
}
function generateTypeAttribute(attribute) {
const type = attribute.type.toString().toLowerCase();
switch (type) {
case "date":
return "LocalDate";
case "datetime":
return "LocalDateTime";
case "cpf":
case "cnpj":
case "email":
case "mobilephonenumber":
case "phonenumber":
case "zipcode":
case "string":
return "String";
case "boolean":
return "Boolean";
case "integer":
return "Integer";
case "decimal":
case "currency":
return "BigDecimal";
case "file":
return "byte[]";
case "uuid":
return "UUID";
case "void":
return "void";
default:
return "String"; // fallback para tipos não reconhecidos
}
}
function generateRelations(cls, relations) {
const node = new CompositeGeneratorNode();
for (const rel of relations) {
node.append(generateRelation(cls, rel));
node.appendNewLine();
}
return toString(node);
}
function generateRelation(cls, { tgt, card, owner }) {
switch (card) {
case "OneToOne":
if (owner) {
return expandToStringWithNL `
private ${tgt.name} ${tgt.name.toLowerCase()};
`;
}
else {
return expandToStringWithNL `
.Default
private ${tgt.name} ${tgt.name.toLowerCase()} = null;
`;
}
case "OneToMany":
if (owner) {
return '';
}
else {
return expandToStringWithNL `
.Default
Set<${tgt.name}> ${tgt.name.toLowerCase()}s = new HashSet<>();
`;
}
case "ManyToOne":
if (owner) {
return expandToStringWithNL `
private ${tgt.name} ${tgt.name.toLowerCase()};
`;
}
else {
return '';
}
case "ManyToMany":
if (owner) {
return expandToStringWithNL `
.Default
private Set<${tgt.name}> ${tgt.name.toLowerCase()}s = new HashSet<>();
`;
}
else {
return expandToStringWithNL `
.Default
private Set<${tgt.name}> ${tgt.name.toLowerCase()}s = new HashSet<>();
`;
}
}
}
function createEnum(enumEntityAtribute) {
const enumType = getRef(enumEntityAtribute.type);
return expandToString `
.Default
private ${enumType?.name} ${enumEntityAtribute.name.toLowerCase()} = ${enumType?.name}.${enumType?.attributes[0].name.toUpperCase()};
`;
}
function generateEnum(cls) {
return expandToStringWithNL `
${cls.enumentityatributes.map(enumEntityAtribute => createEnum(enumEntityAtribute)).join("\n")}
`;
}
//# sourceMappingURL=model-generator.js.map