From c407404900948fb0a13162a73342ebb594064777 Mon Sep 17 00:00:00 2001 From: Francesco Date: Fri, 22 Sep 2023 00:35:48 +0200 Subject: [PATCH 01/12] WIP --- src/main/java/tech/ailef/dbadmin/DbAdmin.java | 3 +- .../dbadmin/DbAdminAutoConfiguration.java | 57 +++++++++++++++++++ .../java/tech/ailef/dbadmin/model/Action.java | 32 +++++++++++ src/main/resources/application.properties | 7 ++- 4 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 src/main/java/tech/ailef/dbadmin/model/Action.java diff --git a/src/main/java/tech/ailef/dbadmin/DbAdmin.java b/src/main/java/tech/ailef/dbadmin/DbAdmin.java index 35dc295..78e7f15 100644 --- a/src/main/java/tech/ailef/dbadmin/DbAdmin.java +++ b/src/main/java/tech/ailef/dbadmin/DbAdmin.java @@ -10,6 +10,7 @@ import java.util.Set; import java.util.logging.Logger; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.boot.autoconfigure.web.ServerProperties; @@ -48,7 +49,7 @@ import tech.ailef.dbadmin.misc.Utils; public class DbAdmin { private static final Logger logger = Logger.getLogger(DbAdmin.class.getName()); - @PersistenceContext +// @PersistenceContext private EntityManager entityManager; private List schemas = new ArrayList<>(); diff --git a/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java b/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java index 2b54652..8a01e7c 100644 --- a/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java +++ b/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java @@ -1,14 +1,71 @@ package tech.ailef.dbadmin; +import java.util.HashMap; + +import javax.sql.DataSource; + +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 @EnableConfigurationProperties(DbAdminProperties.class) @AutoConfiguration 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(); + dataSourceBuilder.driverClassName("org.h2.Driver"); + dataSourceBuilder.url("jdbc:h2:file:./dbadmin_internal"); + dataSourceBuilder.username("sa"); + dataSourceBuilder.password("password"); + 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; + } + + } \ No newline at end of file diff --git a/src/main/java/tech/ailef/dbadmin/model/Action.java b/src/main/java/tech/ailef/dbadmin/model/Action.java new file mode 100644 index 0000000..b7a338f --- /dev/null +++ b/src/main/java/tech/ailef/dbadmin/model/Action.java @@ -0,0 +1,32 @@ +package tech.ailef.dbadmin.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + +@Entity +public class Action { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + private String description; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 13b71fa..314afad 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,7 +1,8 @@ +spring.jpa.hibernate.ddl-auto=create -#spring.datasource.url=jdbc:h2:file:./database -#spring.datasource.username=sa -#spring.datasource.password=password +#spring.datasource.dbadmin.url=jdbc:h2:file:./database +#spring.datasource.dbadmin.username=sa +#spring.datasource.dbadmin.password=password #spring.h2.console.enabled=true #spring.jpa.show-sql=true From 88f411af4e38980b171d052ee882c1b6de95d977 Mon Sep 17 00:00:00 2001 From: Francesco Date: Fri, 22 Sep 2023 12:16:30 +0200 Subject: [PATCH 02/12] 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 From 64d85b00d57fba83e23149ffe8a5d1f013fb2e65 Mon Sep 17 00:00:00 2001 From: Francesco Date: Fri, 22 Sep 2023 12:57:09 +0200 Subject: [PATCH 03/12] 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 { } From 4e0ecb7ef384954ec594ca103ff401e10ed2f664 Mon Sep 17 00:00:00 2001 From: Francesco Date: Fri, 22 Sep 2023 16:52:41 +0200 Subject: [PATCH 04/12] WIP Multiple DataSources working --- .../dbadmin/DbAdminAutoConfiguration.java | 109 +++++++----------- .../controller/DefaultDbAdminController.java | 16 +-- src/main/java/tech/repo/ActionRepository.java | 1 - 3 files changed, 45 insertions(+), 81 deletions(-) diff --git a/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java b/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java index a84d5ef..26aa3e5 100644 --- a/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java +++ b/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java @@ -1,101 +1,72 @@ package tech.ailef.dbadmin; -import java.net.URL; -import java.util.List; 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.Configuration; 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; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import jakarta.persistence.EntityManager; +import tech.repo.Action; @ConditionalOnProperty(name = "dbadmin.enabled", matchIfMissing = true) @ComponentScan @EnableConfigurationProperties(DbAdminProperties.class) -//@AutoConfiguration +@Configuration @EnableJpaRepositories( entityManagerFactoryRef = "internalEntityManagerFactory", transactionManagerRef = "internalTransactionManager", basePackages = { "tech.repo" } ) +@EnableTransactionManagement public class DbAdminAutoConfiguration { - @Autowired - Environment env; - - @Bean + @Autowired + Environment env; + + @Bean public DataSource internalDataSource() { - DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); - dataSourceBuilder.driverClassName("org.h2.Driver"); - dataSourceBuilder.url("jdbc:h2:file:./dbadmin_internal"); - dataSourceBuilder.username("sa"); - dataSourceBuilder.password("password"); - return dataSourceBuilder.build(); + DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); + dataSourceBuilder.driverClassName("org.h2.Driver"); + dataSourceBuilder.url("jdbc:h2:file:./dbadmin_internal"); + dataSourceBuilder.username("sa"); + dataSourceBuilder.password("password"); + return dataSourceBuilder.build(); } - - @Bean - public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory() { - LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); - factoryBean.setDataSource(internalDataSource()); - factoryBean.setPersistenceUnitName("internal"); - factoryBean.setPersistenceProvider(new HibernatePersistenceProvider()); -// 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; - } - - + + @Bean + public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory() { + LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); + factoryBean.setDataSource(internalDataSource()); + factoryBean.setPersistenceUnitName("internal"); + factoryBean.setPackagesToScan("tech.repo"); // , "tech.ailef.dbadmin.repository"); + 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 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 9c21fb8..16c8d2b 100644 --- a/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java +++ b/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java @@ -13,6 +13,7 @@ import org.springframework.dao.DataIntegrityViolationException; import org.springframework.http.HttpStatus; import org.springframework.jdbc.UncategorizedSQLException; import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.Model; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -25,9 +26,9 @@ import org.springframework.web.multipart.MultipartFile; import org.springframework.web.server.ResponseStatusException; import org.springframework.web.servlet.mvc.support.RedirectAttributes; -import jakarta.annotation.PostConstruct; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.PersistenceContext; import jakarta.persistence.PersistenceUnit; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -59,18 +60,9 @@ public class DefaultDbAdminController { @Autowired private DbAdmin dbAdmin; - @PersistenceUnit(unitName = "internal") - private EntityManagerFactory entityManagerFactory; - -// private EntityManager entityManager; @Autowired private ActionRepository repo; -// @PostConstruct -// public void initialize() { -// this.entityManager = entityManagerFactory.createEntityManager(); -// } - /** * Home page with list of schemas * @param model @@ -78,11 +70,13 @@ public class DefaultDbAdminController { * @return */ @GetMapping -// @Transactional("internalTransactionManager") + @Transactional("internalTransactionManager") public String index(Model model, @RequestParam(required = false) String query) { Action a = new Action(); a.setDescription("ciao"); // a.setId(1); +// entityManagerFactory.createEntityManager().persist(a); +// entityManager.persist(a); Action save = repo.save(a); System.out.println(save); diff --git a/src/main/java/tech/repo/ActionRepository.java b/src/main/java/tech/repo/ActionRepository.java index 52fea0e..287ba81 100644 --- a/src/main/java/tech/repo/ActionRepository.java +++ b/src/main/java/tech/repo/ActionRepository.java @@ -8,7 +8,6 @@ import org.springframework.stereotype.Repository; import jakarta.persistence.EntityManager; @Repository -//@Component public interface ActionRepository extends JpaRepository { } From 72aa1417f30b9083edabd27ac670ece7a13c231a Mon Sep 17 00:00:00 2001 From: Francesco Date: Fri, 22 Sep 2023 16:55:50 +0200 Subject: [PATCH 05/12] WIP --- .../ailef/dbadmin/{ => external}/DbAdmin.java | 16 ++++++------ .../DbAdminAutoConfiguration.java | 8 +++--- .../{ => external}/DbAdminProperties.java | 2 +- .../annotations/ComputedColumn.java | 2 +- .../annotations/DisplayFormat.java | 2 +- .../annotations/DisplayImage.java | 2 +- .../annotations/DisplayName.java | 2 +- .../annotations/Filterable.java | 2 +- .../controller/DefaultDbAdminController.java | 26 +++++++++---------- .../controller/DownloadController.java | 14 +++++----- .../controller/GlobalController.java | 4 +-- .../rest/AutocompleteController.java | 10 +++---- .../rest/DefaultDbAdminRestController.java | 14 +++++----- .../dbmapping/AdvancedJpaRepository.java | 8 +++--- .../dbmapping/DbAdminRepository.java | 12 ++++----- .../{ => external}/dbmapping/DbField.java | 4 +-- .../{ => external}/dbmapping/DbFieldType.java | 6 ++--- .../dbmapping/DbFieldValue.java | 2 +- .../{ => external}/dbmapping/DbObject.java | 8 +++--- .../dbmapping/DbObjectSchema.java | 12 ++++----- .../dto/AutocompleteSearchResult.java | 4 +-- .../{ => external}/dto/CompareOperator.java | 2 +- .../{ => external}/dto/ListModelRequest.java | 1 + .../{ => external}/dto/PaginatedResult.java | 4 +-- .../{ => external}/dto/PaginationInfo.java | 4 +-- .../{ => external}/dto/QueryFilter.java | 2 +- .../exceptions/DbAdminException.java | 2 +- .../exceptions/InvalidPageException.java | 2 +- .../dbadmin/{ => external}/misc/Utils.java | 8 +++--- .../dbadmin/internal/model}/Action.java | 2 +- .../repository}/ActionRepository.java | 3 ++- 31 files changed, 96 insertions(+), 94 deletions(-) rename src/main/java/tech/ailef/dbadmin/{ => external}/DbAdmin.java (95%) rename src/main/java/tech/ailef/dbadmin/{ => external}/DbAdminAutoConfiguration.java (91%) rename src/main/java/tech/ailef/dbadmin/{ => external}/DbAdminProperties.java (97%) rename src/main/java/tech/ailef/dbadmin/{ => external}/annotations/ComputedColumn.java (90%) rename src/main/java/tech/ailef/dbadmin/{ => external}/annotations/DisplayFormat.java (89%) rename src/main/java/tech/ailef/dbadmin/{ => external}/annotations/DisplayImage.java (88%) rename src/main/java/tech/ailef/dbadmin/{ => external}/annotations/DisplayName.java (89%) rename src/main/java/tech/ailef/dbadmin/{ => external}/annotations/Filterable.java (92%) rename src/main/java/tech/ailef/dbadmin/{ => external}/controller/DefaultDbAdminController.java (95%) rename src/main/java/tech/ailef/dbadmin/{ => external}/controller/DownloadController.java (88%) rename src/main/java/tech/ailef/dbadmin/{ => external}/controller/GlobalController.java (91%) rename src/main/java/tech/ailef/dbadmin/{ => external}/controller/rest/AutocompleteController.java (80%) rename src/main/java/tech/ailef/dbadmin/{ => external}/controller/rest/DefaultDbAdminRestController.java (89%) rename src/main/java/tech/ailef/dbadmin/{ => external}/dbmapping/AdvancedJpaRepository.java (96%) rename src/main/java/tech/ailef/dbadmin/{ => external}/dbmapping/DbAdminRepository.java (95%) rename src/main/java/tech/ailef/dbadmin/{ => external}/dbmapping/DbField.java (95%) rename src/main/java/tech/ailef/dbadmin/{ => external}/dbmapping/DbFieldType.java (97%) rename src/main/java/tech/ailef/dbadmin/{ => external}/dbmapping/DbFieldValue.java (94%) rename src/main/java/tech/ailef/dbadmin/{ => external}/dbmapping/DbObject.java (96%) rename src/main/java/tech/ailef/dbadmin/{ => external}/dbmapping/DbObjectSchema.java (94%) rename src/main/java/tech/ailef/dbadmin/{ => external}/dto/AutocompleteSearchResult.java (82%) rename src/main/java/tech/ailef/dbadmin/{ => external}/dto/CompareOperator.java (94%) rename src/main/java/tech/ailef/dbadmin/{ => external}/dto/ListModelRequest.java (95%) rename src/main/java/tech/ailef/dbadmin/{ => external}/dto/PaginatedResult.java (82%) rename src/main/java/tech/ailef/dbadmin/{ => external}/dto/PaginationInfo.java (97%) rename src/main/java/tech/ailef/dbadmin/{ => external}/dto/QueryFilter.java (96%) rename src/main/java/tech/ailef/dbadmin/{ => external}/exceptions/DbAdminException.java (85%) rename src/main/java/tech/ailef/dbadmin/{ => external}/exceptions/InvalidPageException.java (90%) rename src/main/java/tech/ailef/dbadmin/{ => external}/misc/Utils.java (93%) rename src/main/java/tech/{repo => ailef/dbadmin/internal/model}/Action.java (93%) rename src/main/java/tech/{repo => ailef/dbadmin/internal/repository}/ActionRepository.java (79%) diff --git a/src/main/java/tech/ailef/dbadmin/DbAdmin.java b/src/main/java/tech/ailef/dbadmin/external/DbAdmin.java similarity index 95% rename from src/main/java/tech/ailef/dbadmin/DbAdmin.java rename to src/main/java/tech/ailef/dbadmin/external/DbAdmin.java index 78e7f15..d39ea13 100644 --- a/src/main/java/tech/ailef/dbadmin/DbAdmin.java +++ b/src/main/java/tech/ailef/dbadmin/external/DbAdmin.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin; +package tech.ailef.dbadmin.external; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -28,13 +28,13 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; import jakarta.persistence.OneToOne; import jakarta.persistence.PersistenceContext; -import tech.ailef.dbadmin.annotations.DisplayFormat; -import tech.ailef.dbadmin.dbmapping.AdvancedJpaRepository; -import tech.ailef.dbadmin.dbmapping.DbField; -import tech.ailef.dbadmin.dbmapping.DbFieldType; -import tech.ailef.dbadmin.dbmapping.DbObjectSchema; -import tech.ailef.dbadmin.exceptions.DbAdminException; -import tech.ailef.dbadmin.misc.Utils; +import tech.ailef.dbadmin.external.annotations.DisplayFormat; +import tech.ailef.dbadmin.external.dbmapping.AdvancedJpaRepository; +import tech.ailef.dbadmin.external.dbmapping.DbField; +import tech.ailef.dbadmin.external.dbmapping.DbFieldType; +import tech.ailef.dbadmin.external.dbmapping.DbObjectSchema; +import tech.ailef.dbadmin.external.exceptions.DbAdminException; +import tech.ailef.dbadmin.external.misc.Utils; /** * The main DbAdmin class responsible for the initialization phase. This class scans diff --git a/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java b/src/main/java/tech/ailef/dbadmin/external/DbAdminAutoConfiguration.java similarity index 91% rename from src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java rename to src/main/java/tech/ailef/dbadmin/external/DbAdminAutoConfiguration.java index 26aa3e5..98ba0f1 100644 --- a/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java +++ b/src/main/java/tech/ailef/dbadmin/external/DbAdminAutoConfiguration.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin; +package tech.ailef.dbadmin.external; import java.util.Properties; @@ -21,7 +21,7 @@ import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import jakarta.persistence.EntityManager; -import tech.repo.Action; +import tech.ailef.dbadmin.internal.model.Action; @ConditionalOnProperty(name = "dbadmin.enabled", matchIfMissing = true) @ComponentScan @@ -30,7 +30,7 @@ import tech.repo.Action; @EnableJpaRepositories( entityManagerFactoryRef = "internalEntityManagerFactory", transactionManagerRef = "internalTransactionManager", - basePackages = { "tech.repo" } + basePackages = { "tech.ailef.dbadmin.internal.repository" } ) @EnableTransactionManagement public class DbAdminAutoConfiguration { @@ -52,7 +52,7 @@ public class DbAdminAutoConfiguration { LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); factoryBean.setDataSource(internalDataSource()); factoryBean.setPersistenceUnitName("internal"); - factoryBean.setPackagesToScan("tech.repo"); // , "tech.ailef.dbadmin.repository"); + factoryBean.setPackagesToScan("tech.ailef.dbadmin.internal.model"); // , "tech.ailef.dbadmin.repository"); factoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); Properties properties = new Properties(); properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); diff --git a/src/main/java/tech/ailef/dbadmin/DbAdminProperties.java b/src/main/java/tech/ailef/dbadmin/external/DbAdminProperties.java similarity index 97% rename from src/main/java/tech/ailef/dbadmin/DbAdminProperties.java rename to src/main/java/tech/ailef/dbadmin/external/DbAdminProperties.java index 6ccfe69..eeef629 100644 --- a/src/main/java/tech/ailef/dbadmin/DbAdminProperties.java +++ b/src/main/java/tech/ailef/dbadmin/external/DbAdminProperties.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin; +package tech.ailef.dbadmin.external; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/tech/ailef/dbadmin/annotations/ComputedColumn.java b/src/main/java/tech/ailef/dbadmin/external/annotations/ComputedColumn.java similarity index 90% rename from src/main/java/tech/ailef/dbadmin/annotations/ComputedColumn.java rename to src/main/java/tech/ailef/dbadmin/external/annotations/ComputedColumn.java index 3ddd1d9..5c759da 100644 --- a/src/main/java/tech/ailef/dbadmin/annotations/ComputedColumn.java +++ b/src/main/java/tech/ailef/dbadmin/external/annotations/ComputedColumn.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.annotations; +package tech.ailef.dbadmin.external.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/tech/ailef/dbadmin/annotations/DisplayFormat.java b/src/main/java/tech/ailef/dbadmin/external/annotations/DisplayFormat.java similarity index 89% rename from src/main/java/tech/ailef/dbadmin/annotations/DisplayFormat.java rename to src/main/java/tech/ailef/dbadmin/external/annotations/DisplayFormat.java index 4f5637c..7e7641e 100644 --- a/src/main/java/tech/ailef/dbadmin/annotations/DisplayFormat.java +++ b/src/main/java/tech/ailef/dbadmin/external/annotations/DisplayFormat.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.annotations; +package tech.ailef.dbadmin.external.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/tech/ailef/dbadmin/annotations/DisplayImage.java b/src/main/java/tech/ailef/dbadmin/external/annotations/DisplayImage.java similarity index 88% rename from src/main/java/tech/ailef/dbadmin/annotations/DisplayImage.java rename to src/main/java/tech/ailef/dbadmin/external/annotations/DisplayImage.java index 6daee38..00898dc 100644 --- a/src/main/java/tech/ailef/dbadmin/annotations/DisplayImage.java +++ b/src/main/java/tech/ailef/dbadmin/external/annotations/DisplayImage.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.annotations; +package tech.ailef.dbadmin.external.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/tech/ailef/dbadmin/annotations/DisplayName.java b/src/main/java/tech/ailef/dbadmin/external/annotations/DisplayName.java similarity index 89% rename from src/main/java/tech/ailef/dbadmin/annotations/DisplayName.java rename to src/main/java/tech/ailef/dbadmin/external/annotations/DisplayName.java index 9a6030f..dbe43c1 100644 --- a/src/main/java/tech/ailef/dbadmin/annotations/DisplayName.java +++ b/src/main/java/tech/ailef/dbadmin/external/annotations/DisplayName.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.annotations; +package tech.ailef.dbadmin.external.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/tech/ailef/dbadmin/annotations/Filterable.java b/src/main/java/tech/ailef/dbadmin/external/annotations/Filterable.java similarity index 92% rename from src/main/java/tech/ailef/dbadmin/annotations/Filterable.java rename to src/main/java/tech/ailef/dbadmin/external/annotations/Filterable.java index 1792021..2f40d79 100644 --- a/src/main/java/tech/ailef/dbadmin/annotations/Filterable.java +++ b/src/main/java/tech/ailef/dbadmin/external/annotations/Filterable.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.annotations; +package tech.ailef.dbadmin.external.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java b/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java similarity index 95% rename from src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java rename to src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java index 16c8d2b..fa30a6c 100644 --- a/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java +++ b/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.controller; +package tech.ailef.dbadmin.external.controller; import java.util.ArrayList; import java.util.HashMap; @@ -32,18 +32,18 @@ import jakarta.persistence.PersistenceContext; import jakarta.persistence.PersistenceUnit; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import tech.ailef.dbadmin.DbAdmin; -import tech.ailef.dbadmin.DbAdminProperties; -import tech.ailef.dbadmin.dbmapping.DbAdminRepository; -import tech.ailef.dbadmin.dbmapping.DbObject; -import tech.ailef.dbadmin.dbmapping.DbObjectSchema; -import tech.ailef.dbadmin.dto.CompareOperator; -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; +import tech.ailef.dbadmin.external.DbAdmin; +import tech.ailef.dbadmin.external.DbAdminProperties; +import tech.ailef.dbadmin.external.dbmapping.DbAdminRepository; +import tech.ailef.dbadmin.external.dbmapping.DbObject; +import tech.ailef.dbadmin.external.dbmapping.DbObjectSchema; +import tech.ailef.dbadmin.external.dto.CompareOperator; +import tech.ailef.dbadmin.external.dto.PaginatedResult; +import tech.ailef.dbadmin.external.dto.QueryFilter; +import tech.ailef.dbadmin.external.exceptions.InvalidPageException; +import tech.ailef.dbadmin.external.misc.Utils; +import tech.ailef.dbadmin.internal.model.Action; +import tech.ailef.dbadmin.internal.repository.ActionRepository; /** * The main DbAdmin controller that register most of the routes of the web interface. diff --git a/src/main/java/tech/ailef/dbadmin/controller/DownloadController.java b/src/main/java/tech/ailef/dbadmin/external/controller/DownloadController.java similarity index 88% rename from src/main/java/tech/ailef/dbadmin/controller/DownloadController.java rename to src/main/java/tech/ailef/dbadmin/external/controller/DownloadController.java index aef8b27..36c8863 100644 --- a/src/main/java/tech/ailef/dbadmin/controller/DownloadController.java +++ b/src/main/java/tech/ailef/dbadmin/external/controller/DownloadController.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.controller; +package tech.ailef.dbadmin.external.controller; import java.util.Optional; @@ -17,12 +17,12 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.server.ResponseStatusException; -import tech.ailef.dbadmin.DbAdmin; -import tech.ailef.dbadmin.dbmapping.DbAdminRepository; -import tech.ailef.dbadmin.dbmapping.DbFieldValue; -import tech.ailef.dbadmin.dbmapping.DbObject; -import tech.ailef.dbadmin.dbmapping.DbObjectSchema; -import tech.ailef.dbadmin.exceptions.DbAdminException; +import tech.ailef.dbadmin.external.DbAdmin; +import tech.ailef.dbadmin.external.dbmapping.DbAdminRepository; +import tech.ailef.dbadmin.external.dbmapping.DbFieldValue; +import tech.ailef.dbadmin.external.dbmapping.DbObject; +import tech.ailef.dbadmin.external.dbmapping.DbObjectSchema; +import tech.ailef.dbadmin.external.exceptions.DbAdminException; /** * Controller to serve file or images (`@DisplayImage`) diff --git a/src/main/java/tech/ailef/dbadmin/controller/GlobalController.java b/src/main/java/tech/ailef/dbadmin/external/controller/GlobalController.java similarity index 91% rename from src/main/java/tech/ailef/dbadmin/controller/GlobalController.java rename to src/main/java/tech/ailef/dbadmin/external/controller/GlobalController.java index d90239a..7d8640c 100644 --- a/src/main/java/tech/ailef/dbadmin/controller/GlobalController.java +++ b/src/main/java/tech/ailef/dbadmin/external/controller/GlobalController.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.controller; +package tech.ailef.dbadmin.external.controller; import java.util.Map; @@ -7,7 +7,7 @@ import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ModelAttribute; import jakarta.servlet.http.HttpServletRequest; -import tech.ailef.dbadmin.DbAdminProperties; +import tech.ailef.dbadmin.external.DbAdminProperties; /** * This class registers some ModelAttribute objects that are diff --git a/src/main/java/tech/ailef/dbadmin/controller/rest/AutocompleteController.java b/src/main/java/tech/ailef/dbadmin/external/controller/rest/AutocompleteController.java similarity index 80% rename from src/main/java/tech/ailef/dbadmin/controller/rest/AutocompleteController.java rename to src/main/java/tech/ailef/dbadmin/external/controller/rest/AutocompleteController.java index a1e2f6f..7f42dca 100644 --- a/src/main/java/tech/ailef/dbadmin/controller/rest/AutocompleteController.java +++ b/src/main/java/tech/ailef/dbadmin/external/controller/rest/AutocompleteController.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.controller.rest; +package tech.ailef.dbadmin.external.controller.rest; import java.util.List; import java.util.stream.Collectors; @@ -11,10 +11,10 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import tech.ailef.dbadmin.DbAdmin; -import tech.ailef.dbadmin.dbmapping.DbAdminRepository; -import tech.ailef.dbadmin.dbmapping.DbObjectSchema; -import tech.ailef.dbadmin.dto.AutocompleteSearchResult; +import tech.ailef.dbadmin.external.DbAdmin; +import tech.ailef.dbadmin.external.dbmapping.DbAdminRepository; +import tech.ailef.dbadmin.external.dbmapping.DbObjectSchema; +import tech.ailef.dbadmin.external.dto.AutocompleteSearchResult; /** * API controller for autocomplete results diff --git a/src/main/java/tech/ailef/dbadmin/controller/rest/DefaultDbAdminRestController.java b/src/main/java/tech/ailef/dbadmin/external/controller/rest/DefaultDbAdminRestController.java similarity index 89% rename from src/main/java/tech/ailef/dbadmin/controller/rest/DefaultDbAdminRestController.java rename to src/main/java/tech/ailef/dbadmin/external/controller/rest/DefaultDbAdminRestController.java index 83410d7..45bc7f2 100644 --- a/src/main/java/tech/ailef/dbadmin/controller/rest/DefaultDbAdminRestController.java +++ b/src/main/java/tech/ailef/dbadmin/external/controller/rest/DefaultDbAdminRestController.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.controller.rest; +package tech.ailef.dbadmin.external.controller.rest; import java.util.HashMap; import java.util.List; @@ -14,12 +14,12 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import tech.ailef.dbadmin.DbAdmin; -import tech.ailef.dbadmin.DbAdminProperties; -import tech.ailef.dbadmin.dbmapping.DbAdminRepository; -import tech.ailef.dbadmin.dbmapping.DbObjectSchema; -import tech.ailef.dbadmin.dto.PaginatedResult; -import tech.ailef.dbadmin.exceptions.DbAdminException; +import tech.ailef.dbadmin.external.DbAdmin; +import tech.ailef.dbadmin.external.DbAdminProperties; +import tech.ailef.dbadmin.external.dbmapping.DbAdminRepository; +import tech.ailef.dbadmin.external.dbmapping.DbObjectSchema; +import tech.ailef.dbadmin.external.dto.PaginatedResult; +import tech.ailef.dbadmin.external.exceptions.DbAdminException; @RestController @RequestMapping(value = {"/${dbadmin.baseUrl}/api", "/${dbadmin.baseUrl}/api/"}) diff --git a/src/main/java/tech/ailef/dbadmin/dbmapping/AdvancedJpaRepository.java b/src/main/java/tech/ailef/dbadmin/external/dbmapping/AdvancedJpaRepository.java similarity index 96% rename from src/main/java/tech/ailef/dbadmin/dbmapping/AdvancedJpaRepository.java rename to src/main/java/tech/ailef/dbadmin/external/dbmapping/AdvancedJpaRepository.java index 9904b2d..e08efd0 100644 --- a/src/main/java/tech/ailef/dbadmin/dbmapping/AdvancedJpaRepository.java +++ b/src/main/java/tech/ailef/dbadmin/external/dbmapping/AdvancedJpaRepository.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.dbmapping; +package tech.ailef.dbadmin.external.dbmapping; import java.io.IOException; import java.time.LocalDate; @@ -21,9 +21,9 @@ import jakarta.persistence.criteria.CriteriaUpdate; import jakarta.persistence.criteria.Path; import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; -import tech.ailef.dbadmin.dto.CompareOperator; -import tech.ailef.dbadmin.dto.QueryFilter; -import tech.ailef.dbadmin.exceptions.DbAdminException; +import tech.ailef.dbadmin.external.dto.CompareOperator; +import tech.ailef.dbadmin.external.dto.QueryFilter; +import tech.ailef.dbadmin.external.exceptions.DbAdminException; @SuppressWarnings("rawtypes") public class AdvancedJpaRepository extends SimpleJpaRepository { diff --git a/src/main/java/tech/ailef/dbadmin/dbmapping/DbAdminRepository.java b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbAdminRepository.java similarity index 95% rename from src/main/java/tech/ailef/dbadmin/dbmapping/DbAdminRepository.java rename to src/main/java/tech/ailef/dbadmin/external/dbmapping/DbAdminRepository.java index d33efea..8126c77 100644 --- a/src/main/java/tech/ailef/dbadmin/dbmapping/DbAdminRepository.java +++ b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbAdminRepository.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.dbmapping; +package tech.ailef.dbadmin.external.dbmapping; import java.io.IOException; import java.util.ArrayList; @@ -21,11 +21,11 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import tech.ailef.dbadmin.dto.PaginatedResult; -import tech.ailef.dbadmin.dto.PaginationInfo; -import tech.ailef.dbadmin.dto.QueryFilter; -import tech.ailef.dbadmin.exceptions.DbAdminException; -import tech.ailef.dbadmin.exceptions.InvalidPageException; +import tech.ailef.dbadmin.external.dto.PaginatedResult; +import tech.ailef.dbadmin.external.dto.PaginationInfo; +import tech.ailef.dbadmin.external.dto.QueryFilter; +import tech.ailef.dbadmin.external.exceptions.DbAdminException; +import tech.ailef.dbadmin.external.exceptions.InvalidPageException; /** * Implements the basic CRUD operations (and some more) diff --git a/src/main/java/tech/ailef/dbadmin/dbmapping/DbField.java b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbField.java similarity index 95% rename from src/main/java/tech/ailef/dbadmin/dbmapping/DbField.java rename to src/main/java/tech/ailef/dbadmin/external/dbmapping/DbField.java index 752fdf0..60acb03 100644 --- a/src/main/java/tech/ailef/dbadmin/dbmapping/DbField.java +++ b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbField.java @@ -1,10 +1,10 @@ -package tech.ailef.dbadmin.dbmapping; +package tech.ailef.dbadmin.external.dbmapping; import java.lang.reflect.Field; import com.fasterxml.jackson.annotation.JsonIgnore; -import tech.ailef.dbadmin.annotations.DisplayImage; +import tech.ailef.dbadmin.external.annotations.DisplayImage; public class DbField { protected String dbName; diff --git a/src/main/java/tech/ailef/dbadmin/dbmapping/DbFieldType.java b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbFieldType.java similarity index 97% rename from src/main/java/tech/ailef/dbadmin/dbmapping/DbFieldType.java rename to src/main/java/tech/ailef/dbadmin/external/dbmapping/DbFieldType.java index 389b5a2..05bb705 100644 --- a/src/main/java/tech/ailef/dbadmin/dbmapping/DbFieldType.java +++ b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbFieldType.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.dbmapping; +package tech.ailef.dbadmin.external.dbmapping; import java.io.IOException; import java.math.BigDecimal; @@ -11,8 +11,8 @@ import org.springframework.web.multipart.MultipartFile; import jakarta.persistence.ManyToMany; import jakarta.persistence.OneToMany; import jakarta.persistence.OneToOne; -import tech.ailef.dbadmin.dto.CompareOperator; -import tech.ailef.dbadmin.exceptions.DbAdminException; +import tech.ailef.dbadmin.external.dto.CompareOperator; +import tech.ailef.dbadmin.external.exceptions.DbAdminException; public enum DbFieldType { INTEGER { diff --git a/src/main/java/tech/ailef/dbadmin/dbmapping/DbFieldValue.java b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbFieldValue.java similarity index 94% rename from src/main/java/tech/ailef/dbadmin/dbmapping/DbFieldValue.java rename to src/main/java/tech/ailef/dbadmin/external/dbmapping/DbFieldValue.java index 82d68a9..0dd7918 100644 --- a/src/main/java/tech/ailef/dbadmin/dbmapping/DbFieldValue.java +++ b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbFieldValue.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.dbmapping; +package tech.ailef.dbadmin.external.dbmapping; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/src/main/java/tech/ailef/dbadmin/dbmapping/DbObject.java b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbObject.java similarity index 96% rename from src/main/java/tech/ailef/dbadmin/dbmapping/DbObject.java rename to src/main/java/tech/ailef/dbadmin/external/dbmapping/DbObject.java index f4dc026..0da11bc 100644 --- a/src/main/java/tech/ailef/dbadmin/dbmapping/DbObject.java +++ b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbObject.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.dbmapping; +package tech.ailef.dbadmin.external.dbmapping; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -11,9 +11,9 @@ import jakarta.persistence.ManyToMany; import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; import jakarta.persistence.OneToOne; -import tech.ailef.dbadmin.annotations.DisplayName; -import tech.ailef.dbadmin.exceptions.DbAdminException; -import tech.ailef.dbadmin.misc.Utils; +import tech.ailef.dbadmin.external.annotations.DisplayName; +import tech.ailef.dbadmin.external.exceptions.DbAdminException; +import tech.ailef.dbadmin.external.misc.Utils; public class DbObject { private Object instance; diff --git a/src/main/java/tech/ailef/dbadmin/dbmapping/DbObjectSchema.java b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbObjectSchema.java similarity index 94% rename from src/main/java/tech/ailef/dbadmin/dbmapping/DbObjectSchema.java rename to src/main/java/tech/ailef/dbadmin/external/dbmapping/DbObjectSchema.java index 0578909..89b2c7e 100644 --- a/src/main/java/tech/ailef/dbadmin/dbmapping/DbObjectSchema.java +++ b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbObjectSchema.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.dbmapping; +package tech.ailef.dbadmin.external.dbmapping; import java.lang.reflect.Method; import java.util.ArrayList; @@ -16,11 +16,11 @@ import jakarta.persistence.ManyToMany; import jakarta.persistence.OneToMany; import jakarta.persistence.OneToOne; import jakarta.persistence.Table; -import tech.ailef.dbadmin.DbAdmin; -import tech.ailef.dbadmin.annotations.ComputedColumn; -import tech.ailef.dbadmin.annotations.Filterable; -import tech.ailef.dbadmin.exceptions.DbAdminException; -import tech.ailef.dbadmin.misc.Utils; +import tech.ailef.dbadmin.external.DbAdmin; +import tech.ailef.dbadmin.external.annotations.ComputedColumn; +import tech.ailef.dbadmin.external.annotations.Filterable; +import tech.ailef.dbadmin.external.exceptions.DbAdminException; +import tech.ailef.dbadmin.external.misc.Utils; public class DbObjectSchema { /** diff --git a/src/main/java/tech/ailef/dbadmin/dto/AutocompleteSearchResult.java b/src/main/java/tech/ailef/dbadmin/external/dto/AutocompleteSearchResult.java similarity index 82% rename from src/main/java/tech/ailef/dbadmin/dto/AutocompleteSearchResult.java rename to src/main/java/tech/ailef/dbadmin/external/dto/AutocompleteSearchResult.java index 0cf2f55..a714bd0 100644 --- a/src/main/java/tech/ailef/dbadmin/dto/AutocompleteSearchResult.java +++ b/src/main/java/tech/ailef/dbadmin/external/dto/AutocompleteSearchResult.java @@ -1,6 +1,6 @@ -package tech.ailef.dbadmin.dto; +package tech.ailef.dbadmin.external.dto; -import tech.ailef.dbadmin.dbmapping.DbObject; +import tech.ailef.dbadmin.external.dbmapping.DbObject; public class AutocompleteSearchResult { private Object id; diff --git a/src/main/java/tech/ailef/dbadmin/dto/CompareOperator.java b/src/main/java/tech/ailef/dbadmin/external/dto/CompareOperator.java similarity index 94% rename from src/main/java/tech/ailef/dbadmin/dto/CompareOperator.java rename to src/main/java/tech/ailef/dbadmin/external/dto/CompareOperator.java index 6f850e7..fbeb373 100644 --- a/src/main/java/tech/ailef/dbadmin/dto/CompareOperator.java +++ b/src/main/java/tech/ailef/dbadmin/external/dto/CompareOperator.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.dto; +package tech.ailef.dbadmin.external.dto; public enum CompareOperator { GT { diff --git a/src/main/java/tech/ailef/dbadmin/dto/ListModelRequest.java b/src/main/java/tech/ailef/dbadmin/external/dto/ListModelRequest.java similarity index 95% rename from src/main/java/tech/ailef/dbadmin/dto/ListModelRequest.java rename to src/main/java/tech/ailef/dbadmin/external/dto/ListModelRequest.java index 7e9e82e..4fb3463 100644 --- a/src/main/java/tech/ailef/dbadmin/dto/ListModelRequest.java +++ b/src/main/java/tech/ailef/dbadmin/external/dto/ListModelRequest.java @@ -1,3 +1,4 @@ +package tech.ailef.dbadmin.external.dto; //package tech.ailef.dbadmin.dto; // //import java.util.Set; diff --git a/src/main/java/tech/ailef/dbadmin/dto/PaginatedResult.java b/src/main/java/tech/ailef/dbadmin/external/dto/PaginatedResult.java similarity index 82% rename from src/main/java/tech/ailef/dbadmin/dto/PaginatedResult.java rename to src/main/java/tech/ailef/dbadmin/external/dto/PaginatedResult.java index 9e2085c..8f2def9 100644 --- a/src/main/java/tech/ailef/dbadmin/dto/PaginatedResult.java +++ b/src/main/java/tech/ailef/dbadmin/external/dto/PaginatedResult.java @@ -1,8 +1,8 @@ -package tech.ailef.dbadmin.dto; +package tech.ailef.dbadmin.external.dto; import java.util.List; -import tech.ailef.dbadmin.dbmapping.DbObject; +import tech.ailef.dbadmin.external.dbmapping.DbObject; public class PaginatedResult { private PaginationInfo pagination; diff --git a/src/main/java/tech/ailef/dbadmin/dto/PaginationInfo.java b/src/main/java/tech/ailef/dbadmin/external/dto/PaginationInfo.java similarity index 97% rename from src/main/java/tech/ailef/dbadmin/dto/PaginationInfo.java rename to src/main/java/tech/ailef/dbadmin/external/dto/PaginationInfo.java index 11cc31a..4d0dcb8 100644 --- a/src/main/java/tech/ailef/dbadmin/dto/PaginationInfo.java +++ b/src/main/java/tech/ailef/dbadmin/external/dto/PaginationInfo.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.dto; +package tech.ailef.dbadmin.external.dto; import java.util.ArrayList; import java.util.List; @@ -8,7 +8,7 @@ import java.util.stream.IntStream; import org.springframework.util.MultiValueMap; -import tech.ailef.dbadmin.misc.Utils; +import tech.ailef.dbadmin.external.misc.Utils; /** * Attached as output to requests that have a paginated response, diff --git a/src/main/java/tech/ailef/dbadmin/dto/QueryFilter.java b/src/main/java/tech/ailef/dbadmin/external/dto/QueryFilter.java similarity index 96% rename from src/main/java/tech/ailef/dbadmin/dto/QueryFilter.java rename to src/main/java/tech/ailef/dbadmin/external/dto/QueryFilter.java index 2d52b3c..63a77e9 100644 --- a/src/main/java/tech/ailef/dbadmin/dto/QueryFilter.java +++ b/src/main/java/tech/ailef/dbadmin/external/dto/QueryFilter.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.dto; +package tech.ailef.dbadmin.external.dto; import java.util.Objects; diff --git a/src/main/java/tech/ailef/dbadmin/exceptions/DbAdminException.java b/src/main/java/tech/ailef/dbadmin/external/exceptions/DbAdminException.java similarity index 85% rename from src/main/java/tech/ailef/dbadmin/exceptions/DbAdminException.java rename to src/main/java/tech/ailef/dbadmin/external/exceptions/DbAdminException.java index 08c52b1..4c97285 100644 --- a/src/main/java/tech/ailef/dbadmin/exceptions/DbAdminException.java +++ b/src/main/java/tech/ailef/dbadmin/external/exceptions/DbAdminException.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.exceptions; +package tech.ailef.dbadmin.external.exceptions; public class DbAdminException extends RuntimeException { private static final long serialVersionUID = 8120227031645804467L; diff --git a/src/main/java/tech/ailef/dbadmin/exceptions/InvalidPageException.java b/src/main/java/tech/ailef/dbadmin/external/exceptions/InvalidPageException.java similarity index 90% rename from src/main/java/tech/ailef/dbadmin/exceptions/InvalidPageException.java rename to src/main/java/tech/ailef/dbadmin/external/exceptions/InvalidPageException.java index c71f367..325efc8 100644 --- a/src/main/java/tech/ailef/dbadmin/exceptions/InvalidPageException.java +++ b/src/main/java/tech/ailef/dbadmin/external/exceptions/InvalidPageException.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.exceptions; +package tech.ailef.dbadmin.external.exceptions; /** * Thrown during the computation of pagination if the requested diff --git a/src/main/java/tech/ailef/dbadmin/misc/Utils.java b/src/main/java/tech/ailef/dbadmin/external/misc/Utils.java similarity index 93% rename from src/main/java/tech/ailef/dbadmin/misc/Utils.java rename to src/main/java/tech/ailef/dbadmin/external/misc/Utils.java index 06f3632..93a2357 100644 --- a/src/main/java/tech/ailef/dbadmin/misc/Utils.java +++ b/src/main/java/tech/ailef/dbadmin/external/misc/Utils.java @@ -1,4 +1,4 @@ -package tech.ailef.dbadmin.misc; +package tech.ailef.dbadmin.external.misc; import java.util.ArrayList; import java.util.HashSet; @@ -8,9 +8,9 @@ import java.util.Set; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; -import tech.ailef.dbadmin.dto.CompareOperator; -import tech.ailef.dbadmin.dto.QueryFilter; -import tech.ailef.dbadmin.exceptions.DbAdminException; +import tech.ailef.dbadmin.external.dto.CompareOperator; +import tech.ailef.dbadmin.external.dto.QueryFilter; +import tech.ailef.dbadmin.external.exceptions.DbAdminException; public interface Utils { public static String camelToSnake(String v) { diff --git a/src/main/java/tech/repo/Action.java b/src/main/java/tech/ailef/dbadmin/internal/model/Action.java similarity index 93% rename from src/main/java/tech/repo/Action.java rename to src/main/java/tech/ailef/dbadmin/internal/model/Action.java index 288b9d6..ddc4494 100644 --- a/src/main/java/tech/repo/Action.java +++ b/src/main/java/tech/ailef/dbadmin/internal/model/Action.java @@ -1,4 +1,4 @@ -package tech.repo; +package tech.ailef.dbadmin.internal.model; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; diff --git a/src/main/java/tech/repo/ActionRepository.java b/src/main/java/tech/ailef/dbadmin/internal/repository/ActionRepository.java similarity index 79% rename from src/main/java/tech/repo/ActionRepository.java rename to src/main/java/tech/ailef/dbadmin/internal/repository/ActionRepository.java index 287ba81..fa9d71f 100644 --- a/src/main/java/tech/repo/ActionRepository.java +++ b/src/main/java/tech/ailef/dbadmin/internal/repository/ActionRepository.java @@ -1,4 +1,4 @@ -package tech.repo; +package tech.ailef.dbadmin.internal.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.support.SimpleJpaRepository; @@ -6,6 +6,7 @@ import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; import jakarta.persistence.EntityManager; +import tech.ailef.dbadmin.internal.model.Action; @Repository public interface ActionRepository extends JpaRepository { From e6065b3dc31c43f74fa75c8616e0f04987b18885 Mon Sep 17 00:00:00 2001 From: Francesco Date: Fri, 22 Sep 2023 16:56:50 +0200 Subject: [PATCH 06/12] WIP --- src/main/java/tech/ailef/dbadmin/external/DbAdmin.java | 4 ---- .../tech/ailef/dbadmin/external/DbAdminAutoConfiguration.java | 4 ---- .../dbadmin/external/controller/DefaultDbAdminController.java | 4 ---- .../controller/rest/DefaultDbAdminRestController.java | 2 -- .../ailef/dbadmin/internal/repository/ActionRepository.java | 3 --- 5 files changed, 17 deletions(-) diff --git a/src/main/java/tech/ailef/dbadmin/external/DbAdmin.java b/src/main/java/tech/ailef/dbadmin/external/DbAdmin.java index d39ea13..199b903 100644 --- a/src/main/java/tech/ailef/dbadmin/external/DbAdmin.java +++ b/src/main/java/tech/ailef/dbadmin/external/DbAdmin.java @@ -10,10 +10,7 @@ import java.util.Set; import java.util.logging.Logger; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.stereotype.Component; @@ -27,7 +24,6 @@ import jakarta.persistence.ManyToMany; import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; import jakarta.persistence.OneToOne; -import jakarta.persistence.PersistenceContext; import tech.ailef.dbadmin.external.annotations.DisplayFormat; import tech.ailef.dbadmin.external.dbmapping.AdvancedJpaRepository; import tech.ailef.dbadmin.external.dbmapping.DbField; diff --git a/src/main/java/tech/ailef/dbadmin/external/DbAdminAutoConfiguration.java b/src/main/java/tech/ailef/dbadmin/external/DbAdminAutoConfiguration.java index 98ba0f1..d29b180 100644 --- a/src/main/java/tech/ailef/dbadmin/external/DbAdminAutoConfiguration.java +++ b/src/main/java/tech/ailef/dbadmin/external/DbAdminAutoConfiguration.java @@ -4,7 +4,6 @@ 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.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -20,9 +19,6 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; -import jakarta.persistence.EntityManager; -import tech.ailef.dbadmin.internal.model.Action; - @ConditionalOnProperty(name = "dbadmin.enabled", matchIfMissing = true) @ComponentScan @EnableConfigurationProperties(DbAdminProperties.class) diff --git a/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java b/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java index fa30a6c..66a4946 100644 --- a/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java +++ b/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java @@ -26,10 +26,6 @@ import org.springframework.web.multipart.MultipartFile; import org.springframework.web.server.ResponseStatusException; import org.springframework.web.servlet.mvc.support.RedirectAttributes; -import jakarta.persistence.EntityManager; -import jakarta.persistence.EntityManagerFactory; -import jakarta.persistence.PersistenceContext; -import jakarta.persistence.PersistenceUnit; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import tech.ailef.dbadmin.external.DbAdmin; diff --git a/src/main/java/tech/ailef/dbadmin/external/controller/rest/DefaultDbAdminRestController.java b/src/main/java/tech/ailef/dbadmin/external/controller/rest/DefaultDbAdminRestController.java index 45bc7f2..3b46bf3 100644 --- a/src/main/java/tech/ailef/dbadmin/external/controller/rest/DefaultDbAdminRestController.java +++ b/src/main/java/tech/ailef/dbadmin/external/controller/rest/DefaultDbAdminRestController.java @@ -1,8 +1,6 @@ package tech.ailef.dbadmin.external.controller.rest; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/tech/ailef/dbadmin/internal/repository/ActionRepository.java b/src/main/java/tech/ailef/dbadmin/internal/repository/ActionRepository.java index fa9d71f..0243a4f 100644 --- a/src/main/java/tech/ailef/dbadmin/internal/repository/ActionRepository.java +++ b/src/main/java/tech/ailef/dbadmin/internal/repository/ActionRepository.java @@ -1,11 +1,8 @@ package tech.ailef.dbadmin.internal.repository; 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.internal.model.Action; @Repository From 6597a228f0d5ce9d61d39fec661f9e29f2a5914d Mon Sep 17 00:00:00 2001 From: Francesco Date: Fri, 22 Sep 2023 17:18:18 +0200 Subject: [PATCH 07/12] WIP --- .../controller/DefaultDbAdminController.java | 31 ++++--- .../ailef/dbadmin/internal/model/Action.java | 37 -------- .../dbadmin/internal/model/UserAction.java | 93 +++++++++++++++++++ .../internal/repository/ActionRepository.java | 4 +- src/main/resources/templates/logs.html | 50 ++++++++++ 5 files changed, 162 insertions(+), 53 deletions(-) delete mode 100644 src/main/java/tech/ailef/dbadmin/internal/model/Action.java create mode 100644 src/main/java/tech/ailef/dbadmin/internal/model/UserAction.java create mode 100644 src/main/resources/templates/logs.html diff --git a/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java b/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java index 66a4946..df9e74e 100644 --- a/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java +++ b/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java @@ -38,7 +38,7 @@ import tech.ailef.dbadmin.external.dto.PaginatedResult; import tech.ailef.dbadmin.external.dto.QueryFilter; import tech.ailef.dbadmin.external.exceptions.InvalidPageException; import tech.ailef.dbadmin.external.misc.Utils; -import tech.ailef.dbadmin.internal.model.Action; +import tech.ailef.dbadmin.internal.model.UserAction; import tech.ailef.dbadmin.internal.repository.ActionRepository; /** @@ -66,18 +66,7 @@ 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); -// entityManagerFactory.createEntityManager().persist(a); -// entityManager.persist(a); - Action save = repo.save(a); - System.out.println(save); - -// repo.save(a); -// displayAllBeans(); List schemas = dbAdmin.getSchemas(); if (query != null && !query.isBlank()) { @@ -282,6 +271,8 @@ public class DefaultDbAdminController { attr.addFlashAttribute("error", e.getMessage()); } + saveAction(new UserAction(schema.getTableName(), id, "DELETE")); + return "redirect:/" + properties.getBaseUrl() + "/model/" + className; } @@ -308,7 +299,7 @@ public class DefaultDbAdminController { if (countDeleted > 0) attr.addFlashAttribute("message", "Deleted " + countDeleted + " of " + ids.length + " items"); - + saveAction(new UserAction(schema.getTableName(), String.join(", ", ids), "DELETE")); return "redirect:/" + properties.getBaseUrl() + "/model/" + className; } @@ -371,6 +362,7 @@ public class DefaultDbAdminController { repository.attachManyToMany(schema, newPrimaryKey, multiValuedParams); pkValue = newPrimaryKey.toString(); attr.addFlashAttribute("message", "Item created successfully."); + saveAction(new UserAction(schema.getTableName(), pkValue, "CREATE")); } catch (DataIntegrityViolationException e) { attr.addFlashAttribute("errorTitle", "Unable to INSERT row"); attr.addFlashAttribute("error", e.getMessage()); @@ -394,6 +386,7 @@ public class DefaultDbAdminController { repository.update(schema, params, files); repository.attachManyToMany(schema, pkValue, multiValuedParams); attr.addFlashAttribute("message", "Item saved successfully."); + saveAction(new UserAction(schema.getTableName(), pkValue, "EDIT")); } catch (DataIntegrityViolationException e) { attr.addFlashAttribute("errorTitle", "Unable to UPDATE row (no changes applied)"); attr.addFlashAttribute("error", e.getMessage()); @@ -409,6 +402,7 @@ public class DefaultDbAdminController { Object newPrimaryKey = repository.create(schema, params, files, pkValue); repository.attachManyToMany(schema, newPrimaryKey, multiValuedParams); attr.addFlashAttribute("message", "Item created successfully"); + saveAction(new UserAction(schema.getTableName(), pkValue, "CREATE")); } catch (DataIntegrityViolationException e) { attr.addFlashAttribute("errorTitle", "Unable to INSERT row (no changes applied)"); attr.addFlashAttribute("error", e.getMessage()); @@ -427,6 +421,12 @@ public class DefaultDbAdminController { } } + @GetMapping("/logs") + public String logs(Model model) { + model.addAttribute("logs", repo.findAll()); + return "logs"; + } + @GetMapping("/settings") public String settings(Model model) { @@ -434,5 +434,8 @@ public class DefaultDbAdminController { return "settings"; } - + @Transactional("internalTransactionManager") + private UserAction saveAction(UserAction action) { + return repo.save(action); + } } diff --git a/src/main/java/tech/ailef/dbadmin/internal/model/Action.java b/src/main/java/tech/ailef/dbadmin/internal/model/Action.java deleted file mode 100644 index ddc4494..0000000 --- a/src/main/java/tech/ailef/dbadmin/internal/model/Action.java +++ /dev/null @@ -1,37 +0,0 @@ -package tech.ailef.dbadmin.internal.model; - -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; - -@Entity -public class Action { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Integer id; - - private String description; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getDescription() { - return description; - } - - 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/internal/model/UserAction.java b/src/main/java/tech/ailef/dbadmin/internal/model/UserAction.java new file mode 100644 index 0000000..ff93c7f --- /dev/null +++ b/src/main/java/tech/ailef/dbadmin/internal/model/UserAction.java @@ -0,0 +1,93 @@ +package tech.ailef.dbadmin.internal.model; + +import java.time.LocalDateTime; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; + +@Entity +public class UserAction { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + @Column(nullable = false) + private LocalDateTime createdAt; + + @Lob + @Column(nullable = false) + private String sql; + + @Column(nullable = false) + private String onTable; + + @Column(nullable = false) + private String primaryKey; + + @Column(nullable = false) + private String actionType; + + public UserAction() { + } + + public UserAction(String onTable, String primaryKey, String actionType) { + this.createdAt = LocalDateTime.now(); + this.sql = "SQL TODO"; + this.onTable = onTable; + this.actionType = actionType; + this.primaryKey = primaryKey; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public String getSql() { + return sql; + } + + public void setSql(String sql) { + this.sql = sql; + } + + public String getOnTable() { + return onTable; + } + + public void setOnTable(String onTable) { + this.onTable = onTable; + } + + public String getPrimaryKey() { + return primaryKey; + } + + public void setPrimaryKey(String primaryKey) { + this.primaryKey = primaryKey; + } + + public String getActionType() { + return actionType; + } + + public void setActionType(String actionType) { + this.actionType = actionType; + } + +} diff --git a/src/main/java/tech/ailef/dbadmin/internal/repository/ActionRepository.java b/src/main/java/tech/ailef/dbadmin/internal/repository/ActionRepository.java index 0243a4f..46df0be 100644 --- a/src/main/java/tech/ailef/dbadmin/internal/repository/ActionRepository.java +++ b/src/main/java/tech/ailef/dbadmin/internal/repository/ActionRepository.java @@ -3,9 +3,9 @@ package tech.ailef.dbadmin.internal.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import tech.ailef.dbadmin.internal.model.Action; +import tech.ailef.dbadmin.internal.model.UserAction; @Repository -public interface ActionRepository extends JpaRepository { +public interface ActionRepository extends JpaRepository { } diff --git a/src/main/resources/templates/logs.html b/src/main/resources/templates/logs.html new file mode 100644 index 0000000..5f391e8 --- /dev/null +++ b/src/main/resources/templates/logs.html @@ -0,0 +1,50 @@ + + + + + +
+ +
+
+
+ +

+ Logs +

+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + \ No newline at end of file From 49a9d58421f6b493b1ed225cd4e1243e625dbfd8 Mon Sep 17 00:00:00 2001 From: Francesco Date: Sat, 23 Sep 2023 16:17:57 +0200 Subject: [PATCH 08/12] WIP --- .../tech/ailef/dbadmin/external/DbAdmin.java | 12 +++ .../external/DbAdminAutoConfiguration.java | 4 + .../controller/DefaultDbAdminController.java | 38 +++++-- .../external/controller/GlobalController.java | 7 +- .../external/dbmapping/DbAdminRepository.java | 4 +- .../external/dto/ListModelRequest.java | 38 ------- .../external/dto/LogsSearchRequest.java | 98 +++++++++++++++++ .../dbadmin/external/dto/PaginatedResult.java | 14 ++- .../dbadmin/external/dto/PaginationInfo.java | 1 + .../ailef/dbadmin/external/misc/Utils.java | 2 + .../InternalDbAdminConfiguration.java | 12 +++ .../dbadmin/internal/model/UserAction.java | 7 +- .../internal/repository/ActionRepository.java | 8 +- .../repository/CustomActionRepository.java | 14 +++ .../CustomActionRepositoryImpl.java | 82 ++++++++++++++ .../internal/service/UserActionService.java | 40 +++++++ src/main/resources/static/js/logs.js | 12 +++ .../templates/fragments/resources.html | 44 +++++--- src/main/resources/templates/logs.html | 100 +++++++++++++----- 19 files changed, 441 insertions(+), 96 deletions(-) delete mode 100644 src/main/java/tech/ailef/dbadmin/external/dto/ListModelRequest.java create mode 100644 src/main/java/tech/ailef/dbadmin/external/dto/LogsSearchRequest.java create mode 100644 src/main/java/tech/ailef/dbadmin/internal/InternalDbAdminConfiguration.java create mode 100644 src/main/java/tech/ailef/dbadmin/internal/repository/CustomActionRepository.java create mode 100644 src/main/java/tech/ailef/dbadmin/internal/repository/CustomActionRepositoryImpl.java create mode 100644 src/main/java/tech/ailef/dbadmin/internal/service/UserActionService.java create mode 100644 src/main/resources/static/js/logs.js diff --git a/src/main/java/tech/ailef/dbadmin/external/DbAdmin.java b/src/main/java/tech/ailef/dbadmin/external/DbAdmin.java index 199b903..2de4e69 100644 --- a/src/main/java/tech/ailef/dbadmin/external/DbAdmin.java +++ b/src/main/java/tech/ailef/dbadmin/external/DbAdmin.java @@ -88,6 +88,18 @@ public class DbAdmin { }); } + /** + * Finds a schema by its table name + * @param tableName the table name on the database + * @return + * @throws DbAdminException if corresponding schema not found + */ + public DbObjectSchema findSchemaByTableName(String tableName) { + return schemas.stream().filter(s -> s.getTableName().equals(tableName)).findFirst().orElseThrow(() -> { + return new DbAdminException("Schema " + tableName + " not found."); + }); + } + /** * Finds a schema by its class * @param klass diff --git a/src/main/java/tech/ailef/dbadmin/external/DbAdminAutoConfiguration.java b/src/main/java/tech/ailef/dbadmin/external/DbAdminAutoConfiguration.java index d29b180..ed35dcb 100644 --- a/src/main/java/tech/ailef/dbadmin/external/DbAdminAutoConfiguration.java +++ b/src/main/java/tech/ailef/dbadmin/external/DbAdminAutoConfiguration.java @@ -11,6 +11,7 @@ import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.core.env.Environment; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; @@ -19,6 +20,8 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; +import tech.ailef.dbadmin.internal.InternalDbAdminConfiguration; + @ConditionalOnProperty(name = "dbadmin.enabled", matchIfMissing = true) @ComponentScan @EnableConfigurationProperties(DbAdminProperties.class) @@ -29,6 +32,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; basePackages = { "tech.ailef.dbadmin.internal.repository" } ) @EnableTransactionManagement +@Import(InternalDbAdminConfiguration.class) public class DbAdminAutoConfiguration { @Autowired Environment env; diff --git a/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java b/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java index df9e74e..5925d00 100644 --- a/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java +++ b/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java @@ -13,7 +13,6 @@ import org.springframework.dao.DataIntegrityViolationException; import org.springframework.http.HttpStatus; import org.springframework.jdbc.UncategorizedSQLException; import org.springframework.stereotype.Controller; -import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.Model; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -34,12 +33,13 @@ import tech.ailef.dbadmin.external.dbmapping.DbAdminRepository; import tech.ailef.dbadmin.external.dbmapping.DbObject; import tech.ailef.dbadmin.external.dbmapping.DbObjectSchema; import tech.ailef.dbadmin.external.dto.CompareOperator; +import tech.ailef.dbadmin.external.dto.LogsSearchRequest; import tech.ailef.dbadmin.external.dto.PaginatedResult; import tech.ailef.dbadmin.external.dto.QueryFilter; import tech.ailef.dbadmin.external.exceptions.InvalidPageException; import tech.ailef.dbadmin.external.misc.Utils; import tech.ailef.dbadmin.internal.model.UserAction; -import tech.ailef.dbadmin.internal.repository.ActionRepository; +import tech.ailef.dbadmin.internal.service.UserActionService; /** * The main DbAdmin controller that register most of the routes of the web interface. @@ -57,7 +57,14 @@ public class DefaultDbAdminController { private DbAdmin dbAdmin; @Autowired - private ActionRepository repo; + private UserActionService userActionService; + +// @Autowired +// private ActionRepository repo; +// +// @Autowired +// private CustomActionRepositoryImpl customRepo; + /** * Home page with list of schemas @@ -299,7 +306,11 @@ public class DefaultDbAdminController { if (countDeleted > 0) attr.addFlashAttribute("message", "Deleted " + countDeleted + " of " + ids.length + " items"); - saveAction(new UserAction(schema.getTableName(), String.join(", ", ids), "DELETE")); + + for (String id : ids) { + saveAction(new UserAction(schema.getTableName(), id, "DELETE")); + } + return "redirect:/" + properties.getBaseUrl() + "/model/" + className; } @@ -422,8 +433,19 @@ public class DefaultDbAdminController { } @GetMapping("/logs") - public String logs(Model model) { - model.addAttribute("logs", repo.findAll()); + public String logs(Model model, LogsSearchRequest searchRequest) { + model.addAttribute("activePage", "logs"); + model.addAttribute( + "page", + userActionService.findActions( + searchRequest.getTable(), + searchRequest.getActionType(), + searchRequest.getItemId(), + searchRequest.toPageRequest() + ) + ); + model.addAttribute("schemas", dbAdmin.getSchemas()); + model.addAttribute("searchRequest", searchRequest); return "logs"; } @@ -434,8 +456,8 @@ public class DefaultDbAdminController { return "settings"; } - @Transactional("internalTransactionManager") +// @Transactional("internalTransactionManager") private UserAction saveAction(UserAction action) { - return repo.save(action); + return userActionService.save(action); } } diff --git a/src/main/java/tech/ailef/dbadmin/external/controller/GlobalController.java b/src/main/java/tech/ailef/dbadmin/external/controller/GlobalController.java index 7d8640c..1b45540 100644 --- a/src/main/java/tech/ailef/dbadmin/external/controller/GlobalController.java +++ b/src/main/java/tech/ailef/dbadmin/external/controller/GlobalController.java @@ -36,7 +36,12 @@ public class GlobalController { * @return */ @ModelAttribute("baseUrl") - public String getBaseUrl(HttpServletRequest request) { + public String getBaseUrl() { return props.getBaseUrl(); } + + @ModelAttribute("requestUrl") + public String getRequestUrl(HttpServletRequest request) { + return request.getRequestURI(); + } } \ No newline at end of file diff --git a/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbAdminRepository.java b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbAdminRepository.java index 8126c77..aace47c 100644 --- a/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbAdminRepository.java +++ b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbAdminRepository.java @@ -117,7 +117,7 @@ public class DbAdminRepository { } - return new PaginatedResult( + return new PaginatedResult( new PaginationInfo(page, maxPage, pageSize, maxElement, null, new HashSet<>()), results ); @@ -227,7 +227,7 @@ public class DbAdminRepository { throw new InvalidPageException(); } - return new PaginatedResult( + return new PaginatedResult( new PaginationInfo(page, maxPage, pageSize, maxElement, query, queryFilters), jpaRepository.search(query, page, pageSize, sortKey, sortOrder, queryFilters).stream() .map(o -> new DbObject(o, schema)) diff --git a/src/main/java/tech/ailef/dbadmin/external/dto/ListModelRequest.java b/src/main/java/tech/ailef/dbadmin/external/dto/ListModelRequest.java deleted file mode 100644 index 4fb3463..0000000 --- a/src/main/java/tech/ailef/dbadmin/external/dto/ListModelRequest.java +++ /dev/null @@ -1,38 +0,0 @@ -package tech.ailef.dbadmin.external.dto; -//package tech.ailef.dbadmin.dto; -// -//import java.util.Set; -// -//public class ListModelRequest { -// private String className; -// -// private String query; -// -// private Integer page; -// -// private Integer pageSize; -// -// private String sortKey; -// -// private String sortOrder; -// -// private Set queryFilters; -// -// private PaginationInfo paginationInfo; -// -// public ListModelRequest(String className, String query, Integer page, Integer pageSize, String sortKey, -// String sortOrder, Set queryFilters, PaginationInfo paginationInfo) { -// super(); -// this.className = className; -// this.query = query; -// this.page = page; -// this.pageSize = pageSize; -// this.sortKey = sortKey; -// this.sortOrder = sortOrder; -// this.queryFilters = queryFilters; -// this.paginationInfo = paginationInfo; -// } -// -// -//// @RequestParam MultiValueMap otherParams, -//} diff --git a/src/main/java/tech/ailef/dbadmin/external/dto/LogsSearchRequest.java b/src/main/java/tech/ailef/dbadmin/external/dto/LogsSearchRequest.java new file mode 100644 index 0000000..e766731 --- /dev/null +++ b/src/main/java/tech/ailef/dbadmin/external/dto/LogsSearchRequest.java @@ -0,0 +1,98 @@ +package tech.ailef.dbadmin.external.dto; + +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; + +public class LogsSearchRequest { + private String table; + + private String actionType; + + private String itemId; + + private int page; + + private int pageSize; + + private String sortKey; + + private String sortOrder; + + public String getTable() { + return table == null || table.isBlank() || table.equalsIgnoreCase("Any") ? null : table; + } + + public void setTable(String table) { + this.table = table; + } + + public String getActionType() { + return actionType == null || actionType.isBlank() || actionType.equalsIgnoreCase("Any") ? null : actionType; + } + + public void setActionType(String actionType) { + this.actionType = actionType; + } + + public String getItemId() { + return itemId == null || itemId.isBlank() ? null : itemId; + } + + public void setItemId(String itemId) { + this.itemId = itemId; + } + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public String getSortKey() { + return sortKey; + } + + public void setSortKey(String sortKey) { + this.sortKey = sortKey; + } + + public String getSortOrder() { + return sortOrder; + } + + public void setSortOrder(String sortOrder) { + this.sortOrder = sortOrder; + } + + @Override + public String toString() { + return "LogsSearchRequest [table=" + table + ", actionType=" + actionType + ", itemId=" + itemId + ", page=" + + page + ", pageSize=" + pageSize + ", sortKey=" + sortKey + ", sortOrder=" + sortOrder + "]"; + } + + public PageRequest toPageRequest() { + int actualPage = page - 1 < 0 ? 0 : page - 1; + int actualPageSize = pageSize <= 0 ? 50 : pageSize; + if (sortKey == null) + return PageRequest.of(actualPage, actualPageSize); + + if (sortOrder == null) sortOrder = "ASC"; + + if (sortOrder.equals("DESC")) { + return PageRequest.of(actualPage, actualPageSize, Sort.by(sortKey).descending()); + } else { + return PageRequest.of(actualPage, actualPageSize, Sort.by(sortKey).ascending()); + } + } + +} diff --git a/src/main/java/tech/ailef/dbadmin/external/dto/PaginatedResult.java b/src/main/java/tech/ailef/dbadmin/external/dto/PaginatedResult.java index 8f2def9..da21851 100644 --- a/src/main/java/tech/ailef/dbadmin/external/dto/PaginatedResult.java +++ b/src/main/java/tech/ailef/dbadmin/external/dto/PaginatedResult.java @@ -4,12 +4,12 @@ import java.util.List; import tech.ailef.dbadmin.external.dbmapping.DbObject; -public class PaginatedResult { +public class PaginatedResult { private PaginationInfo pagination; - private List results; + private List results; - public PaginatedResult(PaginationInfo pagination, List page) { + public PaginatedResult(PaginationInfo pagination, List page) { this.pagination = pagination; this.results = page; } @@ -18,11 +18,15 @@ public class PaginatedResult { return pagination; } - public List getResults() { + public List getResults() { return results; } - public int getActualResults() { + public boolean isEmpty() { + return results.isEmpty(); + } + + public int getNumberOfResults() { return getResults().size(); } diff --git a/src/main/java/tech/ailef/dbadmin/external/dto/PaginationInfo.java b/src/main/java/tech/ailef/dbadmin/external/dto/PaginationInfo.java index 4d0dcb8..7e87237 100644 --- a/src/main/java/tech/ailef/dbadmin/external/dto/PaginationInfo.java +++ b/src/main/java/tech/ailef/dbadmin/external/dto/PaginationInfo.java @@ -35,6 +35,7 @@ public class PaginationInfo { */ private int pageSize; + // TODO: Check if used private long maxElement; private Set queryFilters; diff --git a/src/main/java/tech/ailef/dbadmin/external/misc/Utils.java b/src/main/java/tech/ailef/dbadmin/external/misc/Utils.java index 93a2357..6000746 100644 --- a/src/main/java/tech/ailef/dbadmin/external/misc/Utils.java +++ b/src/main/java/tech/ailef/dbadmin/external/misc/Utils.java @@ -24,6 +24,8 @@ public interface Utils { public static MultiValueMap computeParams(Set filters) { MultiValueMap r = new LinkedMultiValueMap<>(); + if (filters == null) + return r; r.put("filter_field", new ArrayList<>()); r.put("filter_op", new ArrayList<>()); diff --git a/src/main/java/tech/ailef/dbadmin/internal/InternalDbAdminConfiguration.java b/src/main/java/tech/ailef/dbadmin/internal/InternalDbAdminConfiguration.java new file mode 100644 index 0000000..c94fb08 --- /dev/null +++ b/src/main/java/tech/ailef/dbadmin/internal/InternalDbAdminConfiguration.java @@ -0,0 +1,12 @@ +package tech.ailef.dbadmin.internal; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@ConditionalOnProperty(name = "dbadmin.enabled", matchIfMissing = true) +@ComponentScan +@Configuration +public class InternalDbAdminConfiguration { + +} diff --git a/src/main/java/tech/ailef/dbadmin/internal/model/UserAction.java b/src/main/java/tech/ailef/dbadmin/internal/model/UserAction.java index ff93c7f..35ec6ae 100644 --- a/src/main/java/tech/ailef/dbadmin/internal/model/UserAction.java +++ b/src/main/java/tech/ailef/dbadmin/internal/model/UserAction.java @@ -2,6 +2,8 @@ package tech.ailef.dbadmin.internal.model; import java.time.LocalDateTime; +import org.springframework.format.datetime.standard.DateTimeFormatterFactory; + import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -89,5 +91,8 @@ public class UserAction { public void setActionType(String actionType) { this.actionType = actionType; } - + + public String getFormattedDate() { + return new DateTimeFormatterFactory("YYYY-MM-dd HH:mm:ss").createDateTimeFormatter().format(createdAt); + } } diff --git a/src/main/java/tech/ailef/dbadmin/internal/repository/ActionRepository.java b/src/main/java/tech/ailef/dbadmin/internal/repository/ActionRepository.java index 46df0be..eb64f46 100644 --- a/src/main/java/tech/ailef/dbadmin/internal/repository/ActionRepository.java +++ b/src/main/java/tech/ailef/dbadmin/internal/repository/ActionRepository.java @@ -1,11 +1,15 @@ package tech.ailef.dbadmin.internal.repository; +import java.util.List; + +import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import tech.ailef.dbadmin.internal.model.UserAction; @Repository -public interface ActionRepository extends JpaRepository { - +public interface ActionRepository extends JpaRepository, CustomActionRepository { + public List findAllByOnTableAndActionTypeAndPrimaryKey(String table, String actionType, String primaryKey, PageRequest pageRequest); + } diff --git a/src/main/java/tech/ailef/dbadmin/internal/repository/CustomActionRepository.java b/src/main/java/tech/ailef/dbadmin/internal/repository/CustomActionRepository.java new file mode 100644 index 0000000..50db002 --- /dev/null +++ b/src/main/java/tech/ailef/dbadmin/internal/repository/CustomActionRepository.java @@ -0,0 +1,14 @@ +package tech.ailef.dbadmin.internal.repository; + +import java.util.List; + +import org.springframework.data.domain.PageRequest; + +import tech.ailef.dbadmin.internal.model.UserAction; + +public interface CustomActionRepository { + public List findActions(String table, String actionType, String itemId, PageRequest pageRequest); + + public long countActions(String table, String actionType, String itemId); + +} diff --git a/src/main/java/tech/ailef/dbadmin/internal/repository/CustomActionRepositoryImpl.java b/src/main/java/tech/ailef/dbadmin/internal/repository/CustomActionRepositoryImpl.java new file mode 100644 index 0000000..176dce5 --- /dev/null +++ b/src/main/java/tech/ailef/dbadmin/internal/repository/CustomActionRepositoryImpl.java @@ -0,0 +1,82 @@ +package tech.ailef.dbadmin.internal.repository; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Component; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; +import tech.ailef.dbadmin.external.DbAdmin; +import tech.ailef.dbadmin.external.dbmapping.DbObjectSchema; +import tech.ailef.dbadmin.internal.model.UserAction; + +@Component +public class CustomActionRepositoryImpl implements CustomActionRepository { + + @PersistenceContext(unitName = "internal") + private EntityManager entityManager; + + @Autowired + private DbAdmin dbAdmin; + + @Override + public List findActions(String table, String actionType, String itemId, PageRequest page) { + + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery query = cb.createQuery(UserAction.class); + Root userAction = query.from(UserAction.class); + + List predicates = new ArrayList(); + if (table != null) + predicates.add(cb.equal(userAction.get("onTable"), table)); + if (actionType != null) + predicates.add(cb.equal(userAction.get("actionType"), actionType)); + if (itemId != null) + predicates.add(cb.equal(userAction.get("primaryKey"), itemId)); + + if (!predicates.isEmpty()) { + query.select(userAction) + .where(cb.and( + predicates.toArray(new Predicate[predicates.size()]))); + } + + return entityManager.createQuery(query) + .setMaxResults(page.getPageSize()) + .setFirstResult((int)page.getOffset()) + .getResultList(); + } + + @Override + public long countActions(String table, String actionType, String itemId) { + + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery query = cb.createQuery(Long.class); + Root userAction = query.from(UserAction.class); + + List predicates = new ArrayList<>(); + if (table != null) + predicates.add(cb.equal(userAction.get("onTable"), table)); + if (actionType != null) + predicates.add(cb.equal(userAction.get("actionType"), actionType)); + if (itemId != null) + predicates.add(cb.equal(userAction.get("primaryKey"), itemId)); + + if (!predicates.isEmpty()) { + query.select(cb.count(userAction)) + .where(cb.and( + predicates.toArray(new Predicate[predicates.size()]))); + } else { + query.select(cb.count(userAction)); + } + + return entityManager.createQuery(query).getSingleResult(); + } + +} \ No newline at end of file diff --git a/src/main/java/tech/ailef/dbadmin/internal/service/UserActionService.java b/src/main/java/tech/ailef/dbadmin/internal/service/UserActionService.java new file mode 100644 index 0000000..2721f8a --- /dev/null +++ b/src/main/java/tech/ailef/dbadmin/internal/service/UserActionService.java @@ -0,0 +1,40 @@ +package tech.ailef.dbadmin.internal.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import tech.ailef.dbadmin.external.dto.PaginatedResult; +import tech.ailef.dbadmin.external.dto.PaginationInfo; +import tech.ailef.dbadmin.internal.model.UserAction; +import tech.ailef.dbadmin.internal.repository.ActionRepository; +import tech.ailef.dbadmin.internal.repository.CustomActionRepositoryImpl; + +@Service +public class UserActionService { + @Autowired + private ActionRepository repo; + + @Autowired + private CustomActionRepositoryImpl customRepo; + + @Transactional("internalTransactionManager") + public UserAction save(UserAction a) { + return repo.save(a); + } + + public PaginatedResult findActions(String table, String actionType, String userId, PageRequest page) { + long count = customRepo.countActions(table, actionType, userId); + List actions = customRepo.findActions(table, actionType, userId, page); + int maxPage = (int)(Math.ceil ((double)count / page.getPageSize())); + + return new PaginatedResult<>( + new PaginationInfo(page.getPageNumber() + 1, maxPage, page.getPageSize(), count, null, null), + actions + ); + } + +} diff --git a/src/main/resources/static/js/logs.js b/src/main/resources/static/js/logs.js new file mode 100644 index 0000000..9aadf4d --- /dev/null +++ b/src/main/resources/static/js/logs.js @@ -0,0 +1,12 @@ +document.addEventListener("DOMContentLoaded", () => { + let form = document.getElementById('log-filter-form'); + + if (form == null) return; + + let selects = form.querySelectorAll('select'); + selects.forEach(select => { + select.addEventListener('change', function(e) { + form.submit(); + }); + }); +}); \ No newline at end of file diff --git a/src/main/resources/templates/fragments/resources.html b/src/main/resources/templates/fragments/resources.html index 22bd05c..a7dc215 100644 --- a/src/main/resources/templates/fragments/resources.html +++ b/src/main/resources/templates/fragments/resources.html @@ -10,6 +10,7 @@ + + Documentation | Spring Boot DB Admin Panel + + + + + + + + + +
+
+ +
+
+ + +
+
+
+
    + +
+
+
+ +

Spring Boot Database Admin documentation

+ +

1. Introduction

+ +

The following documentation outlines how to install, configure and customize Spring Boot Database Admin panel. Refer to this document for troubleshooting and if you still encounter problems, please report it as an issue on Github.

+
+

2. Getting started

+

Getting started with Spring Boot Database Admin requires including it as a dependency and then performing a simple configuration step.

+ +

2.1 Installation

+

At the moment the code is not yet distributed on Maven, so it is necessary to build and install manually. Clone the Github repo and mvn install the project into your local repository. Then, include the dependency in your pom.xml:

+ +
+<dependency>
+	<groupId>tech.ailef</groupId>
+	<artifactId>spring-boot-db-admin</artifactId>
+	<version>0.0.4</version>
+</dependency>
+
+
+

TIP The version in this snippet might be different from the one you pulled from Github. Make sure to edit it to match the version contained in the project's pom.xml file.

+ +

2.2 Configuration

+

After including the dependency, a few configuration steps are required on your end in order to integrate the library into your project.

+

The first one is configuring your application.properties file:

+ +
+# The first-level part of the URL path: http://localhost:8080/${baseUrl}/
+dbadmin.baseUrl=admin
+
+# The package that contains your @Entity classes
+dbadmin.modelsPackage=your.models.package
+
+# OPTIONAL PARAMETERS
+# Whether to enable to web interface
+# dbadmin.enabled=true
+#
+# Set to true if you need to run the tests, as it will customize
+# the database configuration for the internal DataSource
+# dbadmin.testMode=false
+
+
+ +

After this, you must tell Spring to import the Spring Boot Database Admin configuration. To do this, annotate your @SpringBootApplication class containing the main method with the following:

+ +
+@ImportAutoConfiguration(DbAdminAutoConfiguration.class)
+
+
+ +

This will autoconfigure the various Spring Boot Database Admin components when your application starts.

+

If everything is setup correctly, you will see Spring Boot Database Admin confirming it in the log messages that appear when you start your application. Keep in mind that if you specify the wrong models package, it will still work but provide you an empty interface. To check, visit http://localhost:8080/admin.

+
+

3. Customization

+

There are two ways to customize the appearance and behaviour of Spring Boot Database Admin:

+
    +
  1. Applying annotations on your @Entity classes, fields and methods
  2. +
  3. Using the Settings panel through the web interface
  4. +
+

Annotations are used primarily to customize behaviour and add custom logic to your classes. If, instead, you're looking to customize appearance of the web UI, it's most likley through the Settings panel.

+ +

3.1 Supported annotations

+ +

3.1.1 @DisplayName

+
+@DisplayName
+public String getFullName() {
+    return firstName + " " + lastName;
+}	
+
+
+ +

When displaying a reference to an item, by default we show its primary key. If a class has a @DisplayName, this method will be used in addition to the primary key whenever possible, giving the user a more readable option.

+ + + + + + + +

3.1.2 @DisplayFormat

+
+@DisplayFormat(format = "$%.2f")
+private Double price;
+
+	
+ +

Specify a format string to apply when displaying the field.

+ + +

3.1.3 @ComputedColumn

+
+@ComputedColumn
+public double totalSpent() {
+	double total = 0;
+	for (Order o : orders) {
+		total += o.total();
+	}
+	return total;
+}
+
+
+ +

This annotation can be used to add values computed at runtime that are shown like additional columns.

+ +

3.1.4 @Filterable

+ +
+@Filterable
+private LocalDate createdAt;
+
+
+ +

Place on one or more fields in a class to activate the faceted search feature. This will allow you to easily combine all these filters when operating on the table. Can only be placed on fields that correspond to physical columns on the table (e.g. no `@ManyToMany`/`@OneToMany`) and that are not binary (`byte[]`).

+ +

3.1.5 @DisplayImage

+ +
+@DisplayImage
+private byte[] image;
+
+
+ +

This annotation can be placed on binary fields to declare they are storing an image and that we want it displayed when possible. The image will be shown as a small thumbnail.

+ + + + + + + + +
+

4. Security

+

Spring Boot Database Admin does not implement authentication and/or authorization mechanisms. However, you can use a standard Spring security configuration in order to limit access to the web UI or specific parts of it.

+

All Spring Boot Database Admin routes start with the value of dbadmin.baseUrl property, and all write operations (edit, create, delete) are implemented as POST calls.

+
+
+ + +
+ + + \ No newline at end of file diff --git a/docs/style.css b/docs/style.css new file mode 100644 index 0000000..b048c14 --- /dev/null +++ b/docs/style.css @@ -0,0 +1,63 @@ +.main-content { + border-left: 1px solid #EEE; +} + +body { + color: #333; + background-color: #FAFAFA; +} + +p { + color: #111; +} + +code pre { + background-color: #DFDFDF; + padding: 5px; + border-radius: 5px; + font-size: 0.9rem; +} + + +h1, h2, h3, h4, h5, h6 { + font-weight: bold; + margin-top: 1.5rem; + margin-bottom: 1.5rem; + +} + +ol.toc { + list-style: none; +} + +.separator { + border-top: 1px solid #DDD; + width: 100%; + margin: 0 auto; + margin-top: 2rem; + margin-bottom: 2rem; + +} + +p.tip { + border-radius: 5px; + background-color: #D0DCF0; + padding: 1rem; + padding-top: 1.5rem; + margin-top: 2rem; + position: relative; +} + +p.tip span.title { + font-weight: bold; + padding: 5px; + padding-left: 10px; + padding-right: 10px; + top: 0; + transform: translateY(-50%); + position: absolute; + top: 0; + left: 20; + background-color: lightsalmon; + color: white; +} diff --git a/pom.xml b/pom.xml index c210c58..603f62d 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ tech.ailef spring-boot-db-admin - 0.0.4 + 0.1.0 spring-boot-db-admin Srping Boot DB Admin Dashboard diff --git a/src/main/resources/templates/settings.html b/src/main/resources/templates/settings.html index 577e9a5..c524c85 100644 --- a/src/main/resources/templates/settings.html +++ b/src/main/resources/templates/settings.html @@ -20,11 +20,11 @@ GENERAL - +