From 88f411af4e38980b171d052ee882c1b6de95d977 Mon Sep 17 00:00:00 2001 From: Francesco Date: Fri, 22 Sep 2023 12:16:30 +0200 Subject: [PATCH] WIP --- .../dbadmin/DbAdminAutoConfiguration.java | 57 ++++++------------- .../controller/DefaultDbAdminController.java | 56 +++++++++++++++++- .../dbadmin/dbmapping/DbAdminRepository.java | 10 ++-- .../java/tech/ailef/dbadmin/model/Action.java | 6 +- .../dbadmin/repository/ActionRepository.java | 16 ++++++ src/main/resources/application.properties | 2 +- 6 files changed, 98 insertions(+), 49 deletions(-) create mode 100644 src/main/java/tech/ailef/dbadmin/repository/ActionRepository.java diff --git a/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java b/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java index 8a01e7c..61fd8cc 100644 --- a/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java +++ b/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java @@ -1,22 +1,19 @@ package tech.ailef.dbadmin; -import java.util.HashMap; +import java.util.Properties; import javax.sql.DataSource; +import org.hibernate.jpa.HibernatePersistenceProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Primary; import org.springframework.core.env.Environment; -import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; -import org.springframework.transaction.PlatformTransactionManager; @ConditionalOnProperty(name = "dbadmin.enabled", matchIfMissing = true) @ComponentScan @@ -26,17 +23,8 @@ public class DbAdminAutoConfiguration { @Autowired Environment env; -// @Bean -// @Primary -//// @ConfigurationProperties("spring.datasource.dbadmin") -// public DataSourceProperties internalDataSourceProperties() { -// return new DataSourceProperties(); -// } - - @Bean -// @Primary - public DataSource internalDataSource() { - DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); + private static DataSource internalDataSource() { + DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); dataSourceBuilder.driverClassName("org.h2.Driver"); dataSourceBuilder.url("jdbc:h2:file:./dbadmin_internal"); dataSourceBuilder.username("sa"); @@ -44,28 +32,19 @@ public class DbAdminAutoConfiguration { return dataSourceBuilder.build(); } - @Bean -// @Primary - public LocalContainerEntityManagerFactoryBean primeEntityManager() { - LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); - em.setDataSource(internalDataSource()); - em.setPackagesToScan("tech.ailef.dbadmin.model"); - HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); - em.setJpaVendorAdapter(vendorAdapter); - HashMap properties = new HashMap<>(); - properties.put("spring.jpa.hibernate.ddl-auto", env.getProperty("spring.jpa.hibernate.ddl-auto")); -// properties.put("hibernate.dialect", env.getProperty("hibernate.dialect")); - em.setJpaPropertyMap(properties); - return em; - } - - @Bean -// @Primary - public PlatformTransactionManager primeTransactionManager() { - JpaTransactionManager transactionManager = new JpaTransactionManager(); - transactionManager.setEntityManagerFactory(primeEntityManager().getObject()); - return transactionManager; - } - + public static LocalContainerEntityManagerFactoryBean internalEntityManager() { + LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); + factoryBean.setDataSource(internalDataSource()); + factoryBean.setPersistenceUnitName("internal"); + factoryBean.setPersistenceProvider(new HibernatePersistenceProvider()); + factoryBean.setPackagesToScan("tech.ailef.dbadmin.model"); + factoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); + Properties properties = new Properties(); + properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); + properties.setProperty("hibernate.hbm2ddl.auto", "update"); + factoryBean.setJpaProperties(properties); + factoryBean.afterPropertiesSet(); + return factoryBean; + } } \ No newline at end of file diff --git a/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java b/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java index 0f1bd7b..94d3915 100644 --- a/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java +++ b/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java @@ -1,17 +1,28 @@ package tech.ailef.dbadmin.controller; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.net.URL; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Properties; import java.util.Set; import java.util.stream.Collectors; +import javax.sql.DataSource; + +import org.hibernate.dialect.H2Dialect; +import org.hibernate.dialect.Oracle12cDialect; +import org.hibernate.jpa.HibernatePersistenceProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.http.HttpStatus; import org.springframework.jdbc.UncategorizedSQLException; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.util.LinkedMultiValueMap; @@ -24,10 +35,19 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.server.ResponseStatusException; import org.springframework.web.servlet.mvc.support.RedirectAttributes; - +import static org.hibernate.cfg.AvailableSettings.*; +import jakarta.annotation.PostConstruct; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.SharedCacheMode; +import jakarta.persistence.ValidationMode; +import jakarta.persistence.spi.ClassTransformer; +import jakarta.persistence.spi.PersistenceUnitInfo; +import jakarta.persistence.spi.PersistenceUnitTransactionType; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import tech.ailef.dbadmin.DbAdmin; +import tech.ailef.dbadmin.DbAdminAutoConfiguration; import tech.ailef.dbadmin.DbAdminProperties; import tech.ailef.dbadmin.dbmapping.DbAdminRepository; import tech.ailef.dbadmin.dbmapping.DbObject; @@ -52,6 +72,32 @@ public class DefaultDbAdminController { @Autowired private DbAdmin dbAdmin; + + private EntityManager entityManager; + + @PostConstruct + public void initialize() { +// params.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); +// params.put("spring.jpa.database-platform", "org.hibernate.dialect.H2Dialect"); + LocalContainerEntityManagerFactoryBean emf = DbAdminAutoConfiguration.internalEntityManager(); + EntityManagerFactory factory = emf.getNativeEntityManagerFactory(); + entityManager = factory.createEntityManager(); + +// EntityManagerFactory emf = new HibernatePersistenceProvider().createEntityManagerFactory("internal", params); + +// entityManager = entityManagerFactory.createEntityManager(); +// entityManager = emf.createEntityManager(); + } + +// @Autowired +// private ApplicationContext applicationContext; + +// public void displayAllBeans() { +// String[] allBeanNames = applicationContext.getBeanDefinitionNames(); +// for(String beanName : allBeanNames) { +// System.out.println(beanName); +// } +// } /** * Home page with list of schemas @@ -60,7 +106,15 @@ public class DefaultDbAdminController { * @return */ @GetMapping +// @Transactional("internalTransactionManager") public String index(Model model, @RequestParam(required = false) String query) { +// Action a = new Action(); +// a.setDescription("ciao"); +// a.setId(1); +// new ActionRepository(entityManger).save(a); +// repo.save(a); +// displayAllBeans(); + List schemas = dbAdmin.getSchemas(); if (query != null && !query.isBlank()) { schemas = schemas.stream().filter(s -> { diff --git a/src/main/java/tech/ailef/dbadmin/dbmapping/DbAdminRepository.java b/src/main/java/tech/ailef/dbadmin/dbmapping/DbAdminRepository.java index d94bc46..d33efea 100644 --- a/src/main/java/tech/ailef/dbadmin/dbmapping/DbAdminRepository.java +++ b/src/main/java/tech/ailef/dbadmin/dbmapping/DbAdminRepository.java @@ -18,9 +18,9 @@ import org.springframework.data.jpa.repository.support.SimpleJpaRepository; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.simple.SimpleJdbcInsert; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import jakarta.transaction.Transactional; import tech.ailef.dbadmin.dto.PaginatedResult; import tech.ailef.dbadmin.dto.PaginationInfo; import tech.ailef.dbadmin.dto.QueryFilter; @@ -128,18 +128,18 @@ public class DbAdminRepository { * @param schema * @param params */ - @Transactional + @Transactional("transactionManager") public void update(DbObjectSchema schema, Map params, Map files) { schema.getJpaRepository().update(schema, params, files); } @SuppressWarnings("unchecked") - @Transactional + @Transactional("transactionManager") private void save(DbObjectSchema schema, DbObject o) { schema.getJpaRepository().save(o.getUnderlyingInstance()); } - @Transactional + @Transactional("transactionManager") public void attachManyToMany(DbObjectSchema schema, Object id, Map> params) { Optional optional = findById(schema, id); @@ -256,7 +256,7 @@ public class DbAdminRepository { * @return */ @SuppressWarnings("unchecked") - @Transactional + @Transactional("transactionManager") public void delete(DbObjectSchema schema, String id) { schema.getJpaRepository().deleteById(id); } diff --git a/src/main/java/tech/ailef/dbadmin/model/Action.java b/src/main/java/tech/ailef/dbadmin/model/Action.java index b7a338f..b9ebbf8 100644 --- a/src/main/java/tech/ailef/dbadmin/model/Action.java +++ b/src/main/java/tech/ailef/dbadmin/model/Action.java @@ -9,15 +9,15 @@ import jakarta.persistence.Id; public class Action { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private int id; + private Integer id; private String description; - public int getId() { + public Integer getId() { return id; } - public void setId(int id) { + public void setId(Integer id) { this.id = id; } diff --git a/src/main/java/tech/ailef/dbadmin/repository/ActionRepository.java b/src/main/java/tech/ailef/dbadmin/repository/ActionRepository.java new file mode 100644 index 0000000..e9b99f5 --- /dev/null +++ b/src/main/java/tech/ailef/dbadmin/repository/ActionRepository.java @@ -0,0 +1,16 @@ +package tech.ailef.dbadmin.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.support.SimpleJpaRepository; +import org.springframework.stereotype.Repository; + +import jakarta.persistence.EntityManager; +import tech.ailef.dbadmin.model.Action; + +public class ActionRepository extends SimpleJpaRepository { + + public ActionRepository(EntityManager em) { + super(Action.class, em); + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 314afad..10468fd 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,4 +1,4 @@ -spring.jpa.hibernate.ddl-auto=create +#spring.jpa.hibernate.ddl-auto=create #spring.datasource.dbadmin.url=jdbc:h2:file:./database #spring.datasource.dbadmin.username=sa