From 64d85b00d57fba83e23149ffe8a5d1f013fb2e65 Mon Sep 17 00:00:00 2001 From: Francesco Date: Fri, 22 Sep 2023 12:57:09 +0200 Subject: [PATCH] WIP --- .../dbadmin/DbAdminAutoConfiguration.java | 63 +++++++++++++++++-- .../controller/DefaultDbAdminController.java | 62 ++++++------------ .../{ailef/dbadmin/model => repo}/Action.java | 7 ++- .../repository => repo}/ActionRepository.java | 12 ++-- 4 files changed, 86 insertions(+), 58 deletions(-) rename src/main/java/tech/{ailef/dbadmin/model => repo}/Action.java (80%) rename src/main/java/tech/{ailef/dbadmin/repository => repo}/ActionRepository.java (50%) diff --git a/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java b/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java index 61fd8cc..a84d5ef 100644 --- a/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java +++ b/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java @@ -1,5 +1,7 @@ package tech.ailef.dbadmin; +import java.net.URL; +import java.util.List; import java.util.Properties; import javax.sql.DataSource; @@ -10,20 +12,31 @@ 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.core.env.Environment; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.persistenceunit.PersistenceManagedTypes; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; @ConditionalOnProperty(name = "dbadmin.enabled", matchIfMissing = true) @ComponentScan @EnableConfigurationProperties(DbAdminProperties.class) -@AutoConfiguration +//@AutoConfiguration +@EnableJpaRepositories( + entityManagerFactoryRef = "internalEntityManagerFactory", + transactionManagerRef = "internalTransactionManager", + basePackages = { "tech.repo" } +) public class DbAdminAutoConfiguration { @Autowired Environment env; - - private static DataSource internalDataSource() { + + @Bean + public DataSource internalDataSource() { DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); dataSourceBuilder.driverClassName("org.h2.Driver"); dataSourceBuilder.url("jdbc:h2:file:./dbadmin_internal"); @@ -32,19 +45,57 @@ public class DbAdminAutoConfiguration { return dataSourceBuilder.build(); } - public static LocalContainerEntityManagerFactoryBean internalEntityManager() { + @Bean + public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory() { LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); factoryBean.setDataSource(internalDataSource()); factoryBean.setPersistenceUnitName("internal"); factoryBean.setPersistenceProvider(new HibernatePersistenceProvider()); - factoryBean.setPackagesToScan("tech.ailef.dbadmin.model"); +// factoryBean.setManagedTypes(new PersistenceManagedTypes() { +// +// @Override +// public URL getPersistenceUnitRootUrl() { +// return null; +// } +// +// @Override +// public List getManagedPackages() { +// return List.of("tech.ailef.dbadmin.model", "tech.ailef.dbadmin.repository"); +// } +// +// @Override +// public List getManagedClassNames() { +// return List.of("tech.ailef.dbadmin.model.Action"); +// } +// }); + factoryBean.setPackagesToScan("tech.repo"); //, "tech.ailef.dbadmin.repository"); +// List ts = new ArrayList<>(); +// factoryBean.setManagedTypes(ts); 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; } + +// @Bean +// public EntityManager getInternalEntityManager() { +//// if (internalEntityManager == null) { +// LocalContainerEntityManagerFactoryBean emf = internalEntityManager(); +// EntityManagerFactory factory = emf.getNativeEntityManagerFactory(); +// return factory.createEntityManager(); +//// } +//// return internalEntityManager; +// } + + @Bean + public PlatformTransactionManager internalTransactionManager() { + JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(internalEntityManagerFactory().getObject()); + return transactionManager; + } + + } \ 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 94d3915..9c21fb8 100644 --- a/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java +++ b/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java @@ -1,28 +1,17 @@ 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; @@ -35,19 +24,14 @@ 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.persistence.PersistenceUnit; 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; @@ -57,6 +41,8 @@ import tech.ailef.dbadmin.dto.PaginatedResult; import tech.ailef.dbadmin.dto.QueryFilter; import tech.ailef.dbadmin.exceptions.InvalidPageException; import tech.ailef.dbadmin.misc.Utils; +import tech.repo.Action; +import tech.repo.ActionRepository; /** * The main DbAdmin controller that register most of the routes of the web interface. @@ -73,32 +59,18 @@ public class DefaultDbAdminController { @Autowired private DbAdmin dbAdmin; - private EntityManager entityManager; + @PersistenceUnit(unitName = "internal") + private EntityManagerFactory entityManagerFactory; - @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(); - } +// private EntityManager entityManager; + @Autowired + private ActionRepository repo; -// @Autowired -// private ApplicationContext applicationContext; +// @PostConstruct +// public void initialize() { +// this.entityManager = entityManagerFactory.createEntityManager(); +// } -// public void displayAllBeans() { -// String[] allBeanNames = applicationContext.getBeanDefinitionNames(); -// for(String beanName : allBeanNames) { -// System.out.println(beanName); -// } -// } - /** * Home page with list of schemas * @param model @@ -108,10 +80,12 @@ public class DefaultDbAdminController { @GetMapping // @Transactional("internalTransactionManager") public String index(Model model, @RequestParam(required = false) String query) { -// Action a = new Action(); -// a.setDescription("ciao"); + Action a = new Action(); + a.setDescription("ciao"); // a.setId(1); -// new ActionRepository(entityManger).save(a); + Action save = repo.save(a); + System.out.println(save); + // repo.save(a); // displayAllBeans(); diff --git a/src/main/java/tech/ailef/dbadmin/model/Action.java b/src/main/java/tech/repo/Action.java similarity index 80% rename from src/main/java/tech/ailef/dbadmin/model/Action.java rename to src/main/java/tech/repo/Action.java index b9ebbf8..288b9d6 100644 --- a/src/main/java/tech/ailef/dbadmin/model/Action.java +++ b/src/main/java/tech/repo/Action.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.model; +package tech.repo; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -28,5 +28,10 @@ public class Action { public void setDescription(String description) { this.description = description; } + + @Override + public String toString() { + return "Action [id=" + id + ", description=" + description + "]"; + } } diff --git a/src/main/java/tech/ailef/dbadmin/repository/ActionRepository.java b/src/main/java/tech/repo/ActionRepository.java similarity index 50% rename from src/main/java/tech/ailef/dbadmin/repository/ActionRepository.java rename to src/main/java/tech/repo/ActionRepository.java index e9b99f5..52fea0e 100644 --- a/src/main/java/tech/ailef/dbadmin/repository/ActionRepository.java +++ b/src/main/java/tech/repo/ActionRepository.java @@ -1,16 +1,14 @@ -package tech.ailef.dbadmin.repository; +package tech.repo; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.support.SimpleJpaRepository; +import org.springframework.stereotype.Component; 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); - } +@Repository +//@Component +public interface ActionRepository extends JpaRepository { }