All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.atlan.generators.ModelGenerator Maven / Gradle / Ivy

// Generated by delombok at Thu Oct 10 18:56:33 UTC 2024
/* SPDX-License-Identifier: Apache-2.0
   Copyright 2023 Atlan Pte. Ltd. */
package com.atlan.generators;

import com.atlan.model.typedefs.EntityDef;
import com.atlan.model.typedefs.EnumDef;
import com.atlan.model.typedefs.RelationshipDef;
import com.atlan.model.typedefs.StructDef;
import freemarker.template.Template;
import java.io.*;
import java.nio.charset.StandardCharsets;

public class ModelGenerator extends AbstractGenerator {
    @java.lang.SuppressWarnings("all")
    @lombok.Generated
    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ModelGenerator.class);

    public ModelGenerator(GeneratorConfig cfg) {
        super(cfg);
    }

    @Override
    public void generate() throws Exception {
        generateEnums();
        generateStructs();
        generateAssets();
        generateRelationships();
    }

    private void generateEnums() throws Exception {
        Template enumTemplate = ftl.getTemplate("enum.ftl");
        for (EnumDef enumDef : cache.getEnumDefCache().values()) {
            EnumGenerator generator = new EnumGenerator(enumDef, cfg);
            if (cfg.includeTypedef(enumDef)) {
                createDirectoryIdempotent(cfg.getPackagePath() + File.separator + EnumGenerator.DIRECTORY);
                String filename = cfg.getPackagePath() + File.separator + EnumGenerator.DIRECTORY + File.separator + generator.getClassName() + ".java";
                try (BufferedWriter fs = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), StandardCharsets.UTF_8))) {
                    enumTemplate.process(generator, fs);
                    cache.addEnumGenerator(enumDef.getName(), generator);
                } catch (IOException e) {
                    log.error("Unable to open file output: {}", filename, e);
                }
            } else {
                cache.addEnumGenerator(enumDef.getName(), generator);
            }
        }
    }

    private void generateStructs() throws Exception {
        Template structTemplate = ftl.getTemplate("struct.ftl");
        for (StructDef structDef : cache.getStructDefCache().values()) {
            StructGenerator generator = new StructGenerator(structDef, cfg);
            createDirectoryIdempotent(cfg.getPackagePath() + File.separator + StructGenerator.DIRECTORY);
            if (cfg.includeTypedef(structDef)) {
                String filename = cfg.getPackagePath() + File.separator + StructGenerator.DIRECTORY + File.separator + generator.getClassName() + ".java";
                try (BufferedWriter fs = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), StandardCharsets.UTF_8))) {
                    structTemplate.process(generator, fs);
                    cache.addStructGenerator(structDef.getName(), generator);
                } catch (IOException e) {
                    log.error("Unable to open file output: {}", filename, e);
                }
            } else {
                cache.addStructGenerator(structDef.getName(), generator);
            }
        }
        if (cfg.getPackageRoot().equals("com.atlan.model")) {
            Template abstractStructTemplate = ftl.getTemplate("AtlanStruct.ftl");
            createDirectoryIdempotent(cfg.getPackagePath() + File.separator + StructGenerator.DIRECTORY);
            String filename = cfg.getPackagePath() + File.separator + StructGenerator.DIRECTORY + File.separator + "AtlanStruct.java";
            try (BufferedWriter fs = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), StandardCharsets.UTF_8))) {
                ListGenerator generator = new ListGenerator(cache.getStructNames(), cfg.getGeneratorName());
                abstractStructTemplate.process(generator, fs);
            } catch (IOException e) {
                log.error("Unable to open file output: {}", filename, e);
            }
        }
    }

    private void generateAssets() throws Exception {
        // In the first pass, only cache the class names and the un-resolved generators
        // (need all class names resolved first, since they may all reference each other
        // in their resolved details)
        for (EntityDef entityDef : cache.getEntityDefCache().values()) {
            AssetGenerator generator = new AssetGenerator(entityDef, cfg);
            cache.addAssetGenerator(entityDef.getName(), generator);
        }
        // Then create an interface and class for every asset type
        Template interfaceTemplate = ftl.getTemplate("entity_interface.ftl");
        Template entityTemplate = ftl.getTemplate("entity.ftl");
        for (EntityDef entityDef : cache.getEntityDefCache().values()) {
            if (cfg.includeTypedef(entityDef)) {
                AssetGenerator generator = cache.getAssetGenerator(entityDef.getName());
                // Now that all are cached, render the inner details of the generator
                // before processing the template
                generator.resolveDetails();
                createDirectoryIdempotent(cfg.getPackagePath() + File.separator + AssetGenerator.DIRECTORY);
                String fInterface = cfg.getPackagePath() + File.separator + AssetGenerator.DIRECTORY + File.separator + "I" + generator.getClassName() + ".java";
                try (BufferedWriter fs = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fInterface), StandardCharsets.UTF_8))) {
                    interfaceTemplate.process(generator, fs);
                } catch (IOException e) {
                    log.error("Unable to open file output: {}", fInterface, e);
                }
                if (generator.getOriginalName().equals("Asset") || !generator.isAbstract()) {
                    // Only generate classes for non-abstract assets (leave the rest as interfaces)
                    String fClass = cfg.getPackagePath() + File.separator + AssetGenerator.DIRECTORY + File.separator + generator.getClassName() + ".java";
                    try (BufferedWriter fs = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fClass), StandardCharsets.UTF_8))) {
                        entityTemplate.process(generator, fs);
                    } catch (IOException e) {
                        log.error("Unable to open file output: {}", fClass, e);
                    }
                }
            }
        }
        if (cfg.getPackageRoot().equals("com.atlan.model")) {
            // Inject all these generated assets into the AttributeDefOptions class (regenerate it)
            Template attributeDefOptionsTemplate = ftl.getTemplate("AttributeDefOptions.ftl");
            String directory = "sdk" + File.separator + "src" + File.separator + "main" + File.separator + "java" + File.separator + "com" + File.separator + "atlan" + File.separator + "model" + File.separator + "typedefs";
            createDirectoryIdempotent(directory);
            String filename = directory + File.separator + "AttributeDefOptions.java";
            try (BufferedWriter fs = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), StandardCharsets.UTF_8))) {
                // Now that all are generated, output the generated switch-based deserialization
                SerdeGenerator generator = new SerdeGenerator(cache.getAssetGenerators(), cfg);
                attributeDefOptionsTemplate.process(generator, fs);
            } catch (IOException e) {
                log.error("Unable to open file output: {}", filename, e);
            }
        }
    }

    private void generateRelationships() throws Exception {
        Template relationshipTemplate = ftl.getTemplate("relationship.ftl");
        for (RelationshipDef relationshipDef : cache.getRelationshipDefCache().values()) {
            RelationshipGenerator generator = new RelationshipGenerator(relationshipDef, cfg);
            createDirectoryIdempotent(cfg.getPackagePath() + File.separator + RelationshipGenerator.DIRECTORY);
            // Only generate relationships model if there are any attributes on the relationship
            if (cfg.includeTypedef(relationshipDef) && relationshipDef.getAttributeDefs() != null && !relationshipDef.getAttributeDefs().isEmpty()) {
                String filename = cfg.getPackagePath() + File.separator + RelationshipGenerator.DIRECTORY + File.separator + generator.getClassName() + ".java";
                try (BufferedWriter fs = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), StandardCharsets.UTF_8))) {
                    relationshipTemplate.process(generator, fs);
                    cache.addRelationshipGenerator(relationshipDef.getName(), generator);
                } catch (IOException e) {
                    log.error("Unable to open file output: {}", filename, e);
                }
            } else {
                cache.addRelationshipGenerator(relationshipDef.getName(), generator);
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy