From e0c9cad16f6f1ab8d4532674c621a36fd0057004 Mon Sep 17 00:00:00 2001 From: dre0059 <eliska.dreveniakova@vsb.cz> Date: Tue, 29 Apr 2025 12:09:49 +0200 Subject: [PATCH] Sofisticated graph of references --- data/demo.mv.db | Bin 21037056 -> 21037056 bytes data/demo.trace.db | 267 ++++++++++++++++++ .../controller/DocumentController.java | 51 +++- .../controller/StatisticsController.java | 44 +++ .../repository/CategoryRepository.java | 2 +- .../service/HeaderService.java | 10 - .../resources/static/assets/logo_FEI_en.png | Bin 0 -> 27668 bytes .../resources/templates/about-project.html | 123 ++++++++ .../templates/citation-timeline.html | 238 ++++++++++++++++ src/main/resources/templates/view-all.html | 2 +- src/main/resources/templates/view-pdf.html | 77 ++++- 11 files changed, 795 insertions(+), 19 deletions(-) create mode 100644 src/main/resources/static/assets/logo_FEI_en.png create mode 100644 src/main/resources/templates/about-project.html create mode 100644 src/main/resources/templates/citation-timeline.html diff --git a/data/demo.mv.db b/data/demo.mv.db index c687424bbc764ff63cdef9e93a82885258976e41..7ce692294bc8c4f8f1c7c478ed4243370dcb0e91 100644 GIT binary patch delta 146609 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 delta 16421 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 diff --git a/data/demo.trace.db b/data/demo.trace.db index 3cde3d5..761ae41 100644 --- a/data/demo.trace.db +++ b/data/demo.trace.db @@ -3366,3 +3366,270 @@ insert into documents (abstract_text,category_id,content,doi,notes,publication_y org.h2.jdbc.JdbcSQLDataException: Hodnota je prÃliÅ¡ dlhá pre stĺpec "TITLE CHARACTER VARYING(255)": "'The in vitro induction of human immunodeficiency virus (HIV) replication in pur... (311)" Value too long for column "TITLE CHARACTER VARYING(255)": "'The in vitro induction of human immunodeficiency virus (HIV) replication in pur... (311)"; SQL statement: insert into documents (abstract_text,category_id,content,doi,notes,publication_year,publisher,status,target,title,id) values (?,?,?,?,?,?,?,?,?,?,default) [22001-232] +2025-04-29 11:42:42.721697+02:00 database: flush +org.h2.message.DbException: VÅ¡eobecná chyba: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/elidr/pdf-processor/data/demo.mv.db [2.3.232/7]" +General error: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/elidr/pdf-processor/data/demo.mv.db [2.3.232/7]" [50000-232] + at org.h2.message.DbException.get(DbException.java:212) + at org.h2.message.DbException.convert(DbException.java:407) + at org.h2.mvstore.db.Store.lambda$new$0(Store.java:122) + at org.h2.mvstore.MVStore.handleException(MVStore.java:1546) + at org.h2.mvstore.MVStore.panic(MVStore.java:371) + at org.h2.mvstore.MVStore.<init>(MVStore.java:291) + at org.h2.mvstore.MVStore$Builder.open(MVStore.java:2035) + at org.h2.mvstore.db.Store.<init>(Store.java:133) + at org.h2.engine.Database.<init>(Database.java:326) + at org.h2.engine.Engine.openSession(Engine.java:92) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:344) + at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:124) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) + at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:98) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.getConnectionUrl(H2ConsoleAutoConfiguration.java:94) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1597) + at java.base/java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:395) + at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:261) + at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:261) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:571) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:636) + at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:291) + at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:656) + at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:662) + at java.base/java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:667) + at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.logDataSources(H2ConsoleAutoConfiguration.java:86) + at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.lambda$h2Console$0(H2ConsoleAutoConfiguration.java:69) + at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.withThreadContextClassLoader(H2ConsoleAutoConfiguration.java:78) + at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.h2Console(H2ConsoleAutoConfiguration.java:69) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:171) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiateWithFactoryMethod(SimpleInstantiationStrategy.java:88) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:168) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:645) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1351) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1181) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204) + at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:211) + at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:202) + at org.springframework.boot.web.servlet.ServletContextInitializerBeans.addServletContextInitializerBeans(ServletContextInitializerBeans.java:97) + at org.springframework.boot.web.servlet.ServletContextInitializerBeans.<init>(ServletContextInitializerBeans.java:86) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getServletContextInitializerBeans(ServletWebServerApplicationContext.java:266) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.selfInitialize(ServletWebServerApplicationContext.java:240) + at org.springframework.boot.web.embedded.tomcat.TomcatStarter.onStartup(TomcatStarter.java:52) + at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4426) + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) + at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1203) + at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1193) + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) + at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) + at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:148) + at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:749) + at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:772) + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) + at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1203) + at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1193) + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) + at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) + at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:148) + at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:749) + at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:203) + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) + at org.apache.catalina.core.StandardService.startInternal(StandardService.java:415) + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) + at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:870) + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) + at org.apache.catalina.startup.Tomcat.start(Tomcat.java:437) + at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:128) + at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:107) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:516) + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:222) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:188) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:162) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:621) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) + at com.dre0059.articleprocessor.ArticleProcessorApplication.main(ArticleProcessorApplication.java:10) +Caused by: org.h2.jdbc.JdbcSQLNonTransientException: VÅ¡eobecná chyba: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/elidr/pdf-processor/data/demo.mv.db [2.3.232/7]" +General error: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/elidr/pdf-processor/data/demo.mv.db [2.3.232/7]" [50000-232] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:566) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 98 more +Caused by: org.h2.mvstore.MVStoreException: The file is locked: C:/Users/elidr/pdf-processor/data/demo.mv.db [2.3.232/7] + at org.h2.mvstore.DataUtils.newMVStoreException(DataUtils.java:996) + at org.h2.mvstore.SingleFileStore.lockFileChannel(SingleFileStore.java:143) + at org.h2.mvstore.SingleFileStore.open(SingleFileStore.java:117) + at org.h2.mvstore.SingleFileStore.open(SingleFileStore.java:81) + at org.h2.mvstore.MVStore.<init>(MVStore.java:286) + ... 92 more +2025-04-29 11:42:44.133669+02:00 database: flush +org.h2.message.DbException: VÅ¡eobecná chyba: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/elidr/pdf-processor/data/demo.mv.db [2.3.232/7]" +General error: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/elidr/pdf-processor/data/demo.mv.db [2.3.232/7]" [50000-232] + at org.h2.message.DbException.get(DbException.java:212) + at org.h2.message.DbException.convert(DbException.java:407) + at org.h2.mvstore.db.Store.lambda$new$0(Store.java:122) + at org.h2.mvstore.MVStore.handleException(MVStore.java:1546) + at org.h2.mvstore.MVStore.panic(MVStore.java:371) + at org.h2.mvstore.MVStore.<init>(MVStore.java:291) + at org.h2.mvstore.MVStore$Builder.open(MVStore.java:2035) + at org.h2.mvstore.db.Store.<init>(Store.java:133) + at org.h2.engine.Database.<init>(Database.java:326) + at org.h2.engine.Engine.openSession(Engine.java:92) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:344) + at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:124) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) + at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:98) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:126) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:467) + at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:320) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:129) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:81) + at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) + at org.hibernate.boot.model.relational.Database.<init>(Database.java:45) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:226) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:194) + at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1849) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) + at com.dre0059.articleprocessor.ArticleProcessorApplication.main(ArticleProcessorApplication.java:10) +Caused by: org.h2.jdbc.JdbcSQLNonTransientException: VÅ¡eobecná chyba: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/elidr/pdf-processor/data/demo.mv.db [2.3.232/7]" +General error: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/elidr/pdf-processor/data/demo.mv.db [2.3.232/7]" [50000-232] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:566) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 60 more +Caused by: org.h2.mvstore.MVStoreException: The file is locked: C:/Users/elidr/pdf-processor/data/demo.mv.db [2.3.232/7] + at org.h2.mvstore.DataUtils.newMVStoreException(DataUtils.java:996) + at org.h2.mvstore.SingleFileStore.lockFileChannel(SingleFileStore.java:143) + at org.h2.mvstore.SingleFileStore.open(SingleFileStore.java:117) + at org.h2.mvstore.SingleFileStore.open(SingleFileStore.java:81) + at org.h2.mvstore.MVStore.<init>(MVStore.java:286) + ... 54 more +2025-04-29 11:42:45.852115+02:00 database: flush +org.h2.message.DbException: VÅ¡eobecná chyba: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/elidr/pdf-processor/data/demo.mv.db [2.3.232/7]" +General error: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/elidr/pdf-processor/data/demo.mv.db [2.3.232/7]" [50000-232] + at org.h2.message.DbException.get(DbException.java:212) + at org.h2.message.DbException.convert(DbException.java:407) + at org.h2.mvstore.db.Store.lambda$new$0(Store.java:122) + at org.h2.mvstore.MVStore.handleException(MVStore.java:1546) + at org.h2.mvstore.MVStore.panic(MVStore.java:371) + at org.h2.mvstore.MVStore.<init>(MVStore.java:291) + at org.h2.mvstore.MVStore$Builder.open(MVStore.java:2035) + at org.h2.mvstore.db.Store.<init>(Store.java:133) + at org.h2.engine.Database.<init>(Database.java:326) + at org.h2.engine.Engine.openSession(Engine.java:92) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:344) + at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:124) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) + at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:98) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:126) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:467) + at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:46) + at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:39) + at org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcConnection(ImprovedExtractionContextImpl.java:63) + at org.hibernate.tool.schema.extract.spi.ExtractionContext.getQueryResults(ExtractionContext.java:43) + at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:39) + at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.initializeSequences(DatabaseInformationImpl.java:66) + at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.<init>(DatabaseInformationImpl.java:60) + at org.hibernate.tool.schema.internal.Helper.buildDatabaseInformation(Helper.java:185) + at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:93) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:280) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) + at java.base/java.util.HashMap.forEach(HashMap.java:1430) + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) + at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) + at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) + at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:324) + at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:463) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1849) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) + at com.dre0059.articleprocessor.ArticleProcessorApplication.main(ArticleProcessorApplication.java:10) +Caused by: org.h2.jdbc.JdbcSQLNonTransientException: VÅ¡eobecná chyba: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/elidr/pdf-processor/data/demo.mv.db [2.3.232/7]" +General error: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/elidr/pdf-processor/data/demo.mv.db [2.3.232/7]" [50000-232] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:566) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 64 more +Caused by: org.h2.mvstore.MVStoreException: The file is locked: C:/Users/elidr/pdf-processor/data/demo.mv.db [2.3.232/7] + at org.h2.mvstore.DataUtils.newMVStoreException(DataUtils.java:996) + at org.h2.mvstore.SingleFileStore.lockFileChannel(SingleFileStore.java:143) + at org.h2.mvstore.SingleFileStore.open(SingleFileStore.java:117) + at org.h2.mvstore.SingleFileStore.open(SingleFileStore.java:81) + at org.h2.mvstore.MVStore.<init>(MVStore.java:286) + ... 58 more diff --git a/src/main/java/com/dre0059/articleprocessor/controller/DocumentController.java b/src/main/java/com/dre0059/articleprocessor/controller/DocumentController.java index 4fef59b..379bc5b 100644 --- a/src/main/java/com/dre0059/articleprocessor/controller/DocumentController.java +++ b/src/main/java/com/dre0059/articleprocessor/controller/DocumentController.java @@ -2,7 +2,9 @@ package com.dre0059.articleprocessor.controller; import com.dre0059.articleprocessor.dto.DocumentDto; import com.dre0059.articleprocessor.dto.SimpleDocumentDto; +import com.dre0059.articleprocessor.model.Category; import com.dre0059.articleprocessor.model.Dokument; +import com.dre0059.articleprocessor.repository.CategoryRepository; import com.dre0059.articleprocessor.repository.DocumentRepository; import com.dre0059.articleprocessor.service.DocumentService; @@ -23,6 +25,9 @@ public class DocumentController { private final DocumentService documentService; + @Autowired + private CategoryRepository categoryRepository; + @Autowired private DocumentRepository dokumentRepository; @@ -53,23 +58,36 @@ public class DocumentController { var references = documentService.getReferencedDocumentsById(id); Dokument document = dokumentRepository.findById(id).get(); + if (documentService.getDocumentById(id) == null) { throw new IllegalArgumentException("Document with ID " + id + " not found."); } if(!document.getStatus().equals("Referenced")) - model.addAttribute("category", document.getCategory().getName()); + model.addAttribute("category", document.getCategory().getName()); model.addAttribute("author", document.authorsToString()); model.addAttribute("year", document.getYear()); model.addAttribute("doi", document.getDoi()); model.addAttribute("link", document.getTarget()); model.addAttribute("tags", document.tagsToString()); model.addAttribute("notes", document.getNotes()); + model.addAttribute("status", document.getStatus()); model.addAttribute("documentId", id); model.addAttribute("references", references); model.addAttribute("docTitle", documentService.getDocumentById(id).getTitle()); + // add category + if (document.getCategory() != null) { + model.addAttribute("category", document.getCategory().getName()); + model.addAttribute("currentCategoryId", document.getCategory().getId()); + } else { + model.addAttribute("category", "No category assigned"); + model.addAttribute("currentCategoryId", null); // Ak nie je kategória, nastavÃme na null + } + + model.addAttribute("categories", categoryRepository.findAll()); + return "view-pdf"; } @@ -104,4 +122,35 @@ public class DocumentController { return ResponseEntity.ok(response); } + + @PostMapping("/api/documents/{documentId}/setCategory") + @ResponseBody + public ResponseEntity<Map<String, Object>> setCategory(@PathVariable Long documentId, @RequestBody Map<String, String> payload) { + Dokument document = dokumentRepository.findById(documentId) + .orElseThrow(() -> new IllegalArgumentException("Document not found")); + + String categoryName = payload.get("categoryName"); + + // Skontrolujeme, Äi kategória existuje + Category category = categoryRepository.findByName(categoryName); + if (category == null) { + // Ak kategória neexistuje, môžeme buÄ priradiÅ¥ default hodnotu, alebo poslaÅ¥ error + return ResponseEntity.badRequest().body(Map.of("error", "Category with name '" + categoryName + "' not found")); + } + + document.setCategory(category); + dokumentRepository.save(document); + + Map<String, Object> response = new HashMap<>(); + response.put("success", true); + + return ResponseEntity.ok(response); + } + @GetMapping("/about") + public String aboutProject() { + return "about-project"; // názov HTML súboru bez prÃpony + } + + + } diff --git a/src/main/java/com/dre0059/articleprocessor/controller/StatisticsController.java b/src/main/java/com/dre0059/articleprocessor/controller/StatisticsController.java index 8a8348b..380f0c4 100644 --- a/src/main/java/com/dre0059/articleprocessor/controller/StatisticsController.java +++ b/src/main/java/com/dre0059/articleprocessor/controller/StatisticsController.java @@ -74,4 +74,48 @@ public class StatisticsController { return "statistics"; } + + // sofistikovaný graf + @GetMapping("/statistics/citation-timeline") + public String citationTimeline(@RequestParam("documentId") Long documentId, Model model) { + Optional<Dokument> mainDocOpt = documentRepository.findById(documentId); + + if (mainDocOpt.isEmpty()) { + return "redirect:/statistics"; + } + + Dokument mainDoc = mainDocOpt.get(); + + List<Map<String, Object>> references = mainDoc.getReferences().stream() + .map(ref -> { + Dokument cited = ref.getToDocument(); + Map<String, Object> refMap = new HashMap<>(); + refMap.put("title", cited.getTitle()); + refMap.put("year", cited.getPublicationYear()); + refMap.put("category", cited.getCategory() != null ? cited.getCategory().getName() : "Unknown"); + return refMap; + }) + .filter(refMap -> refMap.get("year") != null) + .collect(Collectors.toList()); + + // 🆕 ZÃskame vÅ¡etky existujúce kategórie pre Y-os grafu + List<Dokument> allDocuments = documentRepository.findAll(); + List<String> categories = allDocuments.stream() + .map(Dokument::getCategory) + .filter(Objects::nonNull) + .map(c -> c.getName()) + .distinct() + .sorted() + .collect(Collectors.toList()); + + model.addAttribute("mainArticleTitle", mainDoc.getTitle()); + model.addAttribute("mainArticleYear", mainDoc.getPublicationYear()); + model.addAttribute("mainArticleCategory", mainDoc.getCategory() != null ? mainDoc.getCategory().getName() : "Unknown"); + model.addAttribute("references", references); + model.addAttribute("categories", categories); // ✅ Dôležité pre JS + + return "citation-timeline"; + } + + } diff --git a/src/main/java/com/dre0059/articleprocessor/repository/CategoryRepository.java b/src/main/java/com/dre0059/articleprocessor/repository/CategoryRepository.java index 823a39d..23f6995 100644 --- a/src/main/java/com/dre0059/articleprocessor/repository/CategoryRepository.java +++ b/src/main/java/com/dre0059/articleprocessor/repository/CategoryRepository.java @@ -6,5 +6,5 @@ import org.springframework.stereotype.Repository; @Repository public interface CategoryRepository extends JpaRepository<Category, String> { - + Category findByName(String name); } diff --git a/src/main/java/com/dre0059/articleprocessor/service/HeaderService.java b/src/main/java/com/dre0059/articleprocessor/service/HeaderService.java index bcdfa43..d621352 100644 --- a/src/main/java/com/dre0059/articleprocessor/service/HeaderService.java +++ b/src/main/java/com/dre0059/articleprocessor/service/HeaderService.java @@ -84,16 +84,6 @@ public class HeaderService { System.out.println("Author list before checking duplicity: " + authorList); System.out.println("Author last names before checking duplicity: " + authorLastNames); - - // check duplicity of the document - /*if(documentRepository.existsByTitleAndAuthorsIn(title, authorLastNames)){ - System.out.println("Document with this title and authors already exist"); - - return null; - }*/ - - //Dokument dok = new Dokument(title, year, doi, publisher, "PDF"); - List<Author> savedAuthors = authorRepository.saveAll(authorList); Dokument dokument = documentRepository.findByTitleAndAuthorsIn(title, authorLastNames) diff --git a/src/main/resources/static/assets/logo_FEI_en.png b/src/main/resources/static/assets/logo_FEI_en.png new file mode 100644 index 0000000000000000000000000000000000000000..06d62423addb44af461bbaf0a5aeb84a07b2809d GIT binary patch literal 27668 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/templates/about-project.html b/src/main/resources/templates/about-project.html new file mode 100644 index 0000000..db4482d --- /dev/null +++ b/src/main/resources/templates/about-project.html @@ -0,0 +1,123 @@ +<!DOCTYPE html> +<html lang="en" xmlns:th="http://www.thymeleaf.org"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>About Project</title> + + <link rel="icon" type="image/x-icon" href="/assets/favicon.ico" /> + <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" rel="stylesheet" /> + <link href="https://fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic,700italic" rel="stylesheet" /> + <link rel="stylesheet" th:href="@{/styles.css}" /> + + <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> + + <style> + .navbar-nav .nav-link { + font-size: 1.2rem; + margin-right: 20px; + color: rgb(51, 102, 255); + } + + .navbar-nav .nav-link:hover { + color: #00134d; + } + + .navbar-nav .nav-link.active { + color: rgb(51, 102, 255) !important; + } + + .navbar-nav .nav-link.active:hover { + color: #00134d !important; + } + + .about-container { + max-width: 800px; + margin: 60px auto; + padding: 20px; + font-size: 1.2rem; + line-height: 1.8; + color: #333; + } + + h2.about-heading { + text-align: center; + margin-bottom: 30px; + font-size: 2rem; + font-weight: bold; + } + </style> +</head> + +<body> + +<!-- navbar --> +<nav class="navbar navbar-expand-lg navbar-light bg-light static-top"> + <div class="container"> + <a class="navbar-brand" href="/upload">Article Processor</a> + <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" + aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + <div class="collapse navbar-collapse justify-content-end" id="navbarNav"> + <ul class="navbar-nav"> + <li class="nav-item"> + <a class="nav-link" href="/upload">Upload</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/view">View all</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/statistics">Statistics</a> + </li> + <li class="nav-item"> + <a class="nav-link active" href="/about">About project</a> + </li> + </ul> + </div> + </div> +</nav> + +<header class="masthead"> + <div class="container position-relative"> + <div class="row justify-content-center"> + <div class="col-xl-8"> + <div class="text-center text-white"> + <h1 class="mb-4">About the project</h1> + </div> + </div> + </div> + </div> +</header> + +<!-- About Project Content --> +<div class="about-container"> + + <p> + <h2 class="about-heading">About the Project</h2> + This web application was developed as part of a bachelor's thesis with the goal of creating a simple and interactive + tool for processing scientific PDF documents. + </p> + <p> + The whole project was created at <strong>VÅ B Technical University of Ostrava</strong>. + </p> + <p> + It utilizes the open-source GROBID system to extract metadata such as + authors, titles, abstracts, and references. Users can upload PDF files, and the application automatically analyzes them + and stores the structured results in a database. + </p> + <p> + The application follows a clean three-layer architecture (MVC) and is built using Spring Boot and Java. Extracted data + is processed and displayed in a clear format, providing users with a user-friendly way to manage and browse academic content. + </p> + <img src="/assets/logo_FEI_en.png" alt="fei" style="max-width: 100%; margin-bottom: 20px;" /> +</div> + +<!-- Footer --> +<footer class="footer bg-light mt-5"> + <div class="container text-center"> + <p class="text-muted small">© EliÅ¡ka KozáÄiková 2025. All Rights Reserved.</p> + </div> +</footer> +</body> +</html> diff --git a/src/main/resources/templates/citation-timeline.html b/src/main/resources/templates/citation-timeline.html new file mode 100644 index 0000000..4baff6b --- /dev/null +++ b/src/main/resources/templates/citation-timeline.html @@ -0,0 +1,238 @@ + <!DOCTYPE html> + <html xmlns:th="http://www.thymeleaf.org"> + <head> + <meta charset="UTF-8"> + <title>Document Statistics</title> + <script src="https://cdn.plot.ly/plotly-1.58.5.min.js"></script> + + <link rel="icon" type="image/x-icon" href="/assets/favicon.ico" /> + <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" rel="stylesheet" /> + <link href="https://fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic,700italic" rel="stylesheet" /> + + <link rel="stylesheet" th:href="@{/styles.css}" /> + + <style> + .navbar-nav .nav-link { + font-size: 1.2rem; + margin-right: 20px; + color: rgb(51, 102, 255); + } + + .navbar-nav .nav-link:hover { + color: #00134d; + } + + .navbar-nav .nav-link.active { + color: rgb(51, 102, 255) !important; + } + + .navbar-nav .nav-link.active:hover { + color: #00134d !important; + } + + h2 { + color: #ffffff; + text-align: center; + margin-top: 30px; + } + + .chart-container { + display: flex; + justify-content: space-between; + flex-wrap: wrap; + gap: 20px; + margin-top: 30px; + } + + .chart-box { + flex: 1; + min-width: 400px; + height: 500px; + background-color: #6780a3; + border-radius: 12px; + padding: 15px; + overflow: hidden; + } + + .chart-box:hover { + transform: scale(1.01); + transition: transform 0.2s ease-in-out; + } + + .chart-box .js-plotly-plot { + position: absolute; + top: 0; + left: 0; + width: 100% !important; /* natiahne graf presne na Å¡Ãrku boxu */ + height: 100% !important; /* natiahne graf presne na výšku boxu */ + } + </style> + </head> + + <body> + <!-- Navbar --> + <nav class="navbar navbar-expand-lg navbar-light bg-light static-top"> + <div class="container"> + <a class="navbar-brand" href="/upload">Article Processor</a> + <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" + aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + <div class="collapse navbar-collapse justify-content-end" id="navbarNav"> + <ul class="navbar-nav"> + <li class="nav-item"> + <a class="nav-link" href="/upload">Upload</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/view">View all</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/statistics">Statistics</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/upload">About project</a> + </li> + </ul> + </div> + </div> + </nav> + + <!-- Page Content --> + <header class="masthead"> + <div class="container position-relative"> + <div class="row justify-content-center"> + <div class="col-xl-8"> + <div class="text-center text-white"> + <h1 class="mb-4">📊 Graph of references</h1> + </div> + </div> + </div> + </div> + </header> + + <!-- sofistikovaný graf --> + <div class="container mt-5"> + <div class="chart-container"> + <div id="referenceTimelineChart" class="chart-box"></div> + </div> + </div> + + + <script th:inline="javascript"> + // Predpokladám, že tieto údaje sú dostupné z backendu cez Thymeleaf. + const mainArticle = { + title: [[${mainArticleTitle}]], + year: [[${mainArticleYear}]], + category: [[${mainArticleCategory}]] + }; + + const references = [[${references}]]; + const categories = [[${categories}]]; // Kategórie, ktoré dostaneme z databázy + console.log("Categories received:", categories); + + // Predstavujeme kategórie ako mapu (indexovanie podľa názvu kategórie) + const categoryIndex = categories.reduce((acc, category, index) => { + acc[category] = index + 1; // ZaÄneme od 1, aby sme vyhli hodnotám 0 + return acc; + }, {}); + + // Funkcia pre zÃskanie Y-ovej hodnoty podľa kategórie + function getCategoryY(categoryName) { + return categoryIndex[categoryName] || 0; // Ak kategória nie je v zozname, použijeme hodnotu 0 + } + + // PripravÃme hlavný dokument + const mainTrace = { + x: [mainArticle.year], + y: [getCategoryY(mainArticle.category)], + mode: 'markers', + type: 'scatter', + name: mainArticle.title, + hoverinfo: 'text', + marker: { + size: 14, + color: 'gold' + }, + // Po kliknutà na marker sa zobrazà informácia + customdata: [{ title: mainArticle.title, year: mainArticle.year, category: mainArticle.category }] + }; + + // PripravÃme referencie + const referenceTrace = { + x: references.map(r => r.year), + y: references.map(r => getCategoryY(r.category)), + mode: 'markers', + type: 'scatter', + name: 'References', + text: references.map(r => r.title), + hoverinfo: 'text', + marker: { + size: 10, + color: '#66ccff' + }, + customdata: references.map(r => ({ title: r.title, year: r.year, category: r.category })) + }; + + // Spojovacie Äiary medzi referenciami a hlavným dokumentom + const connectionLines = references.map(ref => ({ + type: 'line', + x0: ref.year, + y0: getCategoryY(ref.category), + x1: mainArticle.year, + y1: getCategoryY(mainArticle.category), + line: { + color: '#ffffff', + width: 1.5, + dash: 'dot' + } + })); + + // Konfigurácia grafu + const layout = { + title: 'Chronological graph of categories & references', + paper_bgcolor: '#6780a3', + plot_bgcolor: '#6780a3', + font: { color: '#ffffff' }, + margin: { + l: 180, // zväÄšà ľavý okraj pre ÄitateľnosÅ¥ názvov kategórià + t: 150 // zväÄšà horný okraj pre pridanie odsadenia pod nadpis + }, + xaxis: { + title: 'Publication Year', + showgrid: true, + zeroline: false, + range: [1950, 2030] + }, + yaxis: { + title: 'Category', + tickmode: 'array', + tickvals: categories.map((_, index) => index + 1), + ticktext: categories, + showgrid: true, + automargin: true, + tickfont: { + size: 14 + } + }, + shapes: connectionLines, + legend: { + orientation: 'h', // horizontálne usporiadanie legendy + yanchor: 'bottom', // pozÃcia legendy + y: 1.1, // troÅ¡ku nad grafom + xanchor: 'center', + x: 0.5 + } + }; + + // Vytvorenie grafu bez pridania event listenera na kliknutie + Plotly.newPlot('referenceTimelineChart', [mainTrace, referenceTrace], layout, { responsive: true }); + </script> + + + <footer class="footer bg-light mt-5"> + <div class="container text-center"> + <p class="text-muted small">© EliÅ¡ka KozáÄiková 2025. All Rights Reserved.</p> + </div> + </footer> + </body> + </html> diff --git a/src/main/resources/templates/view-all.html b/src/main/resources/templates/view-all.html index cc516be..5150e3b 100644 --- a/src/main/resources/templates/view-all.html +++ b/src/main/resources/templates/view-all.html @@ -56,7 +56,7 @@ <a class="nav-link" href="/statistics">Statistics</a> </li> <li class="nav-item"> - <a class="nav-link" href="/upload">About project</a> + <a class="nav-link" href="/about">About project</a> </li> </ul> </div> diff --git a/src/main/resources/templates/view-pdf.html b/src/main/resources/templates/view-pdf.html index 6779709..a4a7f7e 100644 --- a/src/main/resources/templates/view-pdf.html +++ b/src/main/resources/templates/view-pdf.html @@ -12,7 +12,7 @@ <style> .navbar { - background-color : #dfe2ec !important; + background-color: #dfe2ec !important; } .navbar-nav .nav-link { font-size: 1.2rem; @@ -29,8 +29,15 @@ color: #00134d !important; } - .italic{ - font-style:italic; + .italic { + font-style: italic; + } + + /* Center the graph */ + #graphContainer { + display: flex; + justify-content: center; + margin-top: 20px; } </style> @@ -68,6 +75,11 @@ <div class="container mt-4"> <h2><span class="italic" th:text="${docTitle}"></span></h2> + <!-- Button to show graph of references --> + <div class="mt-4" id="graphContainer" style="display: none;"> + <button id="showGraphButton" class="btn btn-secondary">SHOW GRAPH OF REFERENCES</button> + </div> + <div class="row mt-4"> <div class="col-md-6"> <h3>Information about Document</h3> @@ -80,7 +92,6 @@ <p><strong>Tags:</strong> <span class="italic" th:text="${tags}"></span></p> <p><strong>Notes:</strong> <span class="italic" th:text="${notes}"></span></p> - <!-- Form for adding notes and delete document buttons --> <div class="d-flex justify-content-between mt-4"> <!-- Add Notes Button --> @@ -102,6 +113,16 @@ </div> </div> + <!-- choose Category --> + <form id="categoryForm" class="mt-3"> + <label for="categorySelect" class="form-label"><strong>Category:</strong></label> + <select id="categorySelect" class="form-select" name="category"> + <option th:each="category : ${categories}" th:value="${category.name}" th:text="${category.name}" + th:selected="${category.name == category}"></option> + </select> + <button type="button" class="btn btn-primary mt-2" id="saveCategoryButton">Save Category</button> + </form> + <h3 class="mt-4">References:</h3> <div class="table-responsive"> <table class="table table-bordered table-striped"> @@ -140,14 +161,48 @@ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script> -<script> +<script th:inline="javascript"> + // Check if the status is "PDF" and show the button + const status = [[${status}]]; // Get the status from the backend + + if (status === "PDF") { + document.getElementById("graphContainer").style.display = "block"; + } + + // Save the category to the document + document.getElementById("saveCategoryButton").addEventListener("click", function () { + const selectedCategoryName = document.getElementById("categorySelect").value; + let documentId = [[${documentId}]]; + + // Send the selected category to the backend to update the document + fetch(`/api/documents/${documentId}/setCategory`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ categoryName: selectedCategoryName }) // Send the selected category ID + }) + .then(response => { + if (response.ok) { + alert("Category updated successfully!"); + } else { + alert("Error updating category."); + } + }) + .catch(error => { + console.error("Error:", error); + alert("An error occurred."); + }); + }); + + // Handle notes addition document.getElementById("addNotesButton").addEventListener("click", function() { document.getElementById("notesForm").style.display = "block"; }); document.getElementById("saveNotesButton").addEventListener("click", function() { const notes = document.getElementById("notesTextarea").value; - const documentId = [[${documentId}]]; + const documentId = [[${documentId}]]; // Insert the documentId here (e.g., from Thymeleaf) fetch(`/api/documents/${documentId}/setNotes`, { method: 'POST', @@ -169,6 +224,16 @@ alert("Error saving notes!"); }); }); + + // "SHOW GRAPH OF REFERENCES" button + document.getElementById("showGraphButton").addEventListener("click", function() { + // Get the document ID from Thymeleaf model + const documentId = [[${documentId}]]; + + // Redirect to the citation timeline page + window.location.href = `/statistics/citation-timeline?documentId=${documentId}`; + }); </script> + </body> </html> -- GitLab