From c1873f27fbc9a05c5f4836dc52b00a2fd3b52fb9 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Thu, 30 Sep 2021 09:16:06 +0200 Subject: [PATCH] import dedup events from UI --- .../organizations/MainApplication.java | 7 ---- .../controller/AdminController.java | 15 ++++++- .../OpenaireInternalApiController.java | 25 ++---------- .../importer/ImportExecutor.java | 40 +++++++++++++++++++ .../html/pages/admin/lastImport.html | 4 +- .../resources/html/pages/admin/utils.html | 4 ++ .../static/resources/js/organizations.js | 6 +++ 7 files changed, 69 insertions(+), 32 deletions(-) create mode 100644 apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/importer/ImportExecutor.java diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/MainApplication.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/MainApplication.java index d8699efd..7e24b9d0 100644 --- a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/MainApplication.java +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/MainApplication.java @@ -3,11 +3,9 @@ package eu.dnetlib.organizations; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; -import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.EnableScheduling; import eu.dnetlib.common.app.AbstractDnetApp; -import eu.dnetlib.organizations.importer.ImportExecution; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; @@ -40,9 +38,4 @@ public class MainApplication extends AbstractDnetApp { .build()); } - @Bean - public ImportExecution lastImportExecution() { - return new ImportExecution(); - } - } diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/AdminController.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/AdminController.java index 34ff6783..960e356b 100644 --- a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/AdminController.java +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/AdminController.java @@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.RestController; import eu.dnetlib.common.controller.AbstractDnetController; import eu.dnetlib.organizations.importer.ImportExecution; +import eu.dnetlib.organizations.importer.ImportExecutor; import eu.dnetlib.organizations.model.SystemConfiguration; import eu.dnetlib.organizations.model.utils.VocabularyTerm; import eu.dnetlib.organizations.model.view.UserView; @@ -40,7 +41,7 @@ public class AdminController extends AbstractDnetController { private SystemConfigurationRepository systemConfigurationRepository; @Autowired - private ImportExecution lastImportExecution; + private ImportExecutor importExecutor; @Autowired private DatabaseUtils dbUtils; @@ -111,7 +112,7 @@ public class AdminController extends AbstractDnetController { @GetMapping("/api/lastImportStatus") private ImportExecution lastImportExecution(final Authentication authentication) { if (UserInfo.isSuperAdmin(authentication)) { - return lastImportExecution; + return importExecutor.getLastImportExecution(); } else { throw new RuntimeException("User not authorized"); } @@ -160,4 +161,14 @@ public class AdminController extends AbstractDnetController { throw new RuntimeException("User not authorized"); } } + + @GetMapping("/api/restartSuggestionsImport") + public List restartSuggestionsImport(final Authentication authentication) { + if (UserInfo.isSuperAdmin(authentication)) { + importExecutor.startImport("the portal, user: " + authentication.getName()); + return Arrays.asList("The import is running"); + } else { + throw new RuntimeException("User not authorized"); + } + } } diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/OpenaireInternalApiController.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/OpenaireInternalApiController.java index c3dd6748..047e6236 100644 --- a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/OpenaireInternalApiController.java +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/OpenaireInternalApiController.java @@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RestController; import eu.dnetlib.common.controller.AbstractDnetController; import eu.dnetlib.organizations.importer.ImportExecution; -import eu.dnetlib.organizations.importer.ImportStatus; +import eu.dnetlib.organizations.importer.ImportExecutor; import eu.dnetlib.organizations.utils.DatabaseUtils; @RestController @@ -29,7 +29,7 @@ public class OpenaireInternalApiController extends AbstractDnetController { private String httpsProxy; @Autowired - private ImportExecution lastImportExecution; + private ImportExecutor importExecutor; private static final Log log = LogFactory.getLog(OpenaireInternalApiController.class); @@ -40,24 +40,7 @@ public class OpenaireInternalApiController extends AbstractDnetController { throw new RuntimeException("Call received by blaklisted ip (https proxy): " + req.getRemoteAddr()); } - synchronized (lastImportExecution) { - if (lastImportExecution.getStatus() != ImportStatus.RUNNING) { - lastImportExecution.startNew("Importing dedup events - request from " + req.getRemoteAddr()); - new Thread(() -> { - try { - databaseUtils.importDedupEvents(); - lastImportExecution.complete(); - } catch (final Throwable e) { - lastImportExecution.fail(e); - } - }).start(); - } else { - final long now = System.currentTimeMillis(); - return new ImportExecution(null, now, now, ImportStatus.NOT_LAUNCHED, "An other import is running"); - } - - } - return lastImportExecution; + return importExecutor.startImport("IP " + req.getRemoteAddr()); } @GetMapping("/import/dedupEvents/status") @@ -66,7 +49,7 @@ public class OpenaireInternalApiController extends AbstractDnetController { log.warn("Call received by blaklisted ip (https proxy): " + req.getRemoteAddr()); throw new RuntimeException("Call received by blaklisted ip (https proxy): " + req.getRemoteAddr()); } - return lastImportExecution; + return importExecutor.getLastImportExecution(); } @GetMapping("/refresh/fulltextIndex") diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/importer/ImportExecutor.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/importer/ImportExecutor.java new file mode 100644 index 00000000..d9e1ca0a --- /dev/null +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/importer/ImportExecutor.java @@ -0,0 +1,40 @@ +package eu.dnetlib.organizations.importer; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import eu.dnetlib.organizations.utils.DatabaseUtils; + +@Component +public class ImportExecutor { + + @Autowired + private DatabaseUtils databaseUtils; + + private final ImportExecution lastImportExecution = new ImportExecution(); + + public ImportExecution getLastImportExecution() { + return lastImportExecution; + } + + public ImportExecution startImport(final String caller) { + synchronized (lastImportExecution) { + if (lastImportExecution.getStatus() != ImportStatus.RUNNING) { + lastImportExecution.startNew("Importing dedup events - request from " + caller); + new Thread(() -> { + try { + databaseUtils.importDedupEvents(); + lastImportExecution.complete(); + } catch (final Throwable e) { + lastImportExecution.fail(e); + } + }).start(); + } else { + final long now = System.currentTimeMillis(); + return new ImportExecution(null, now, now, ImportStatus.NOT_LAUNCHED, "An other import is running"); + } + + } + return lastImportExecution; + } +} diff --git a/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/lastImport.html b/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/lastImport.html index 42162bd7..0a9a930a 100644 --- a/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/lastImport.html +++ b/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/lastImport.html @@ -1,6 +1,6 @@

Last import of suggestions

- + @@ -21,6 +21,6 @@ - +
Message
{{lastImport.message}}
{{lastImport.message}}
\ No newline at end of file diff --git a/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/utils.html b/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/utils.html index eba71d0e..0e20385a 100644 --- a/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/utils.html +++ b/apps/dnet-orgs-database-application/src/main/resources/static/resources/html/pages/admin/utils.html @@ -21,6 +21,10 @@ {{invalidSuggestedCountriesMessage}} + + + {{suggestionImportMessage}} - to see the current import execution click here + diff --git a/apps/dnet-orgs-database-application/src/main/resources/static/resources/js/organizations.js b/apps/dnet-orgs-database-application/src/main/resources/static/resources/js/organizations.js index 1ca5036c..8aa37a12 100644 --- a/apps/dnet-orgs-database-application/src/main/resources/static/resources/js/organizations.js +++ b/apps/dnet-orgs-database-application/src/main/resources/static/resources/js/organizations.js @@ -812,6 +812,7 @@ orgsModule.controller('utilsCtrl', function ($scope, $http) { $scope.fulltextIndexMessage = ''; $scope.consistencyCheckMessage = ''; $scope.invalidSuggestedCountriesMessage = ''; + $scope.suggestionImportMessage = ''; $scope.refreshFulltextIndex = function() { $scope.fulltextIndexMessage = '...'; @@ -827,6 +828,11 @@ orgsModule.controller('utilsCtrl', function ($scope, $http) { $scope.invalidSuggestedCountriesMessage = '...'; call_http_get($http, 'api/verifyCountriesInSuggestions', function(res) { $scope.invalidSuggestedCountriesMessage = res.data[0]; }); } + + $scope.restartSuggestionsImport = function() { + $scope.suggestionImportMessage = '...'; + call_http_get($http, 'api/restartSuggestionsImport', function(res) { $scope.suggestionImportMessage = res.data[0]; }); + } });