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

io.quarkus.hibernate.orm.runtime.devconsole.HibernateOrmDevConsoleInfoSupplier Maven / Gradle / Ivy

package io.quarkus.hibernate.orm.runtime.devconsole;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.function.Supplier;

import org.hibernate.LockOptions;
import org.hibernate.boot.Metadata;
import org.hibernate.engine.spi.NamedQueryDefinition;
import org.hibernate.engine.spi.NamedSQLQueryDefinition;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.schema.TargetType;
import org.hibernate.tool.schema.internal.exec.ScriptTargetOutputToWriter;
import org.hibernate.tool.schema.spi.ScriptTargetOutput;
import org.hibernate.tool.schema.spi.TargetDescriptor;

import io.quarkus.hibernate.orm.runtime.PersistenceUnitUtil;

public class HibernateOrmDevConsoleInfoSupplier implements Supplier {

    public static final PersistenceUnitsInfo INSTANCE = new PersistenceUnitsInfo();

    public static void pushPersistenceUnit(String persistenceUnitName,
            Metadata metadata, ServiceRegistry serviceRegistry, String importFile) {
        List managedEntities = new ArrayList<>();
        for (PersistentClass entityBinding : metadata.getEntityBindings()) {
            managedEntities.add(new EntityInfo(entityBinding.getClassName(), entityBinding.getTable().getName()));
        }

        List namedQueries = new ArrayList<>();
        for (NamedQueryDefinition queryDefinition : metadata.getNamedQueryDefinitions()) {
            namedQueries.add(new QueryInfo(queryDefinition));
        }

        List namedNativeQueries = new ArrayList<>();
        for (NamedSQLQueryDefinition staticQueryDefinition : metadata.getNamedNativeQueryDefinitions()) {
            namedNativeQueries.add(new QueryInfo(staticQueryDefinition));
        }

        String createDDL = generateDDL(SchemaExport.Action.CREATE, metadata, serviceRegistry, importFile);
        String dropDDL = generateDDL(SchemaExport.Action.DROP, metadata, serviceRegistry, importFile);

        INSTANCE.persistenceUnits.put(persistenceUnitName, new PersistenceUnitInfo(persistenceUnitName, managedEntities,
                namedQueries, namedNativeQueries, createDDL, dropDDL));
    }

    public static void clearData() {
        INSTANCE.persistenceUnits.clear();
    }

    private static String generateDDL(SchemaExport.Action action, Metadata metadata, ServiceRegistry serviceRegistry,
            String importFiles) {
        SchemaExport schemaExport = new SchemaExport();
        schemaExport.setFormat(true);
        schemaExport.setDelimiter(";");
        schemaExport.setImportFiles(importFiles);
        StringWriter writer = new StringWriter();
        try {
            schemaExport.doExecution(action, false, metadata, serviceRegistry,
                    new TargetDescriptor() {
                        @Override
                        public EnumSet getTargetTypes() {
                            return EnumSet.of(TargetType.SCRIPT);
                        }

                        @Override
                        public ScriptTargetOutput getScriptTargetOutput() {
                            return new ScriptTargetOutputToWriter(writer) {
                                @Override
                                public void accept(String command) {
                                    super.accept(command);
                                }
                            };
                        }
                    });
        } catch (RuntimeException e) {
            StringWriter stackTraceWriter = new StringWriter();
            e.printStackTrace(new PrintWriter(stackTraceWriter));
            return "Could not generate DDL: \n" + stackTraceWriter.toString();
        }
        return writer.toString();
    }

    @Override
    public PersistenceUnitsInfo get() {
        return INSTANCE;
    }

    public static class PersistenceUnitsInfo {

        private final Map persistenceUnits = Collections
                .synchronizedMap(new TreeMap<>(new PersistenceUnitUtil.PersistenceUnitNameComparator()));

        public Collection getPersistenceUnits() {
            return persistenceUnits.values();
        }

        public int getNumberOfNamedQueries() {
            return persistenceUnits.values().stream().map(PersistenceUnitInfo::getAllNamedQueries)
                    .mapToInt(List::size).reduce(Integer::sum).orElse(0);
        }

        public int getNumberOfEntities() {
            return persistenceUnits.values().stream().map(PersistenceUnitInfo::getManagedEntities)
                    .mapToInt(List::size).reduce(Integer::sum).orElse(0);
        }

    }

    public static class PersistenceUnitInfo {

        private final String name;
        private final List managedEntities;
        private final List namedQueries;
        private final List namedNativeQueries;
        private final String createDDL;
        private final String dropDDL;

        public PersistenceUnitInfo(String name, List managedEntities, List namedQueries,
                List namedNativeQueries, String createDDL, String dropDDL) {
            this.name = name;
            this.managedEntities = managedEntities;
            this.namedQueries = namedQueries;
            this.namedNativeQueries = namedNativeQueries;
            this.createDDL = createDDL;
            this.dropDDL = dropDDL;
        }

        public String getName() {
            return name;
        }

        public List getManagedEntities() {
            return managedEntities;
        }

        public List getNamedQueries() {
            return namedQueries;
        }

        public List getNamedNativeQueries() {
            return namedNativeQueries;
        }

        public List getAllNamedQueries() {
            ArrayList allQueries = new ArrayList<>();
            allQueries.addAll(namedQueries);
            allQueries.addAll(namedNativeQueries);
            return allQueries;
        }

        public String getCreateDDL() {
            return createDDL;
        }

        public String getDropDDL() {
            return dropDDL;
        }

    }

    public static class EntityInfo {

        private final String className;
        private final String tableName;

        public EntityInfo(String className, String tableName) {
            this.className = className;
            this.tableName = tableName;
        }

        public String getClassName() {
            return className;
        }

        public String getTableName() {
            return tableName;
        }

    }

    public static class QueryInfo {

        private final String name;
        private final String query;
        private final boolean cacheable;
        private final String lockMode;
        private final String type;

        public QueryInfo(NamedQueryDefinition queryDefinition) {
            this.name = queryDefinition.getName();
            this.query = queryDefinition.getQuery();
            this.cacheable = queryDefinition.isCacheable();
            LockOptions lockOptions = queryDefinition.getLockOptions();
            this.lockMode = lockOptions != null && lockOptions.getLockMode() != null
                    ? lockOptions.getLockMode().name()
                    : "";
            this.type = queryDefinition instanceof NamedSQLQueryDefinition ? "native" : "JPQL";
        }

        public String getName() {
            return name;
        }

        public String getQuery() {
            return query;
        }

        public boolean isCacheable() {
            return cacheable;
        }

        public String getLockMode() {
            return lockMode;
        }

        public String getType() {
            return type;
        }

    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy