diff --git a/src/main/java/com/databasepreservation/common/api/v1/ActivityLogResource.java b/src/main/java/com/databasepreservation/common/api/v1/ActivityLogResource.java index c552cb275..4a642e658 100644 --- a/src/main/java/com/databasepreservation/common/api/v1/ActivityLogResource.java +++ b/src/main/java/com/databasepreservation/common/api/v1/ActivityLogResource.java @@ -1,10 +1,5 @@ package com.databasepreservation.common.api.v1; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Path; import javax.ws.rs.core.Context; @@ -13,10 +8,6 @@ import org.roda.core.data.exceptions.NotFoundException; import org.roda.core.data.exceptions.RequestNotValidException; import org.roda.core.data.utils.JsonUtils; -import org.roda.core.data.v2.index.filter.Filter; -import org.roda.core.data.v2.index.filter.FilterParameter; -import org.roda.core.data.v2.index.filter.SimpleFilterParameter; -import org.roda.core.data.v2.index.sublist.Sublist; import org.roda.core.data.v2.user.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,16 +17,12 @@ import com.databasepreservation.common.client.exceptions.RESTException; import com.databasepreservation.common.client.index.FindRequest; import com.databasepreservation.common.client.index.IndexResult; -import com.databasepreservation.common.client.index.facets.Facets; -import com.databasepreservation.common.client.index.sort.Sorter; import com.databasepreservation.common.client.models.activity.logs.ActivityLogEntry; import com.databasepreservation.common.client.models.activity.logs.ActivityLogWrapper; import com.databasepreservation.common.client.models.activity.logs.LogEntryState; -import com.databasepreservation.common.client.models.structure.ViewerColumn; -import com.databasepreservation.common.client.models.structure.ViewerDatabase; -import com.databasepreservation.common.client.models.structure.ViewerMetadata; import com.databasepreservation.common.client.services.ActivityLogService; import com.databasepreservation.common.server.ViewerFactory; +import com.databasepreservation.common.server.activity.log.strategies.ActivityLogStrategy; import com.databasepreservation.common.utils.ControllerAssistant; import com.databasepreservation.common.utils.I18nUtility; import com.databasepreservation.common.utils.UserUtility; @@ -69,7 +56,8 @@ public IndexResult find(FindRequest findRequest, String locale } finally { // register action controllerAssistant.registerAction(user, state, ViewerConstants.CONTROLLER_FILTER_PARAM, - JsonUtils.getJsonFromObject(findRequest.filter)); + JsonUtils.getJsonFromObject(findRequest.filter), ViewerConstants.CONTROLLER_FACET_PARAM, + JsonUtils.getJsonFromObject(findRequest.facets)); } } @@ -82,14 +70,11 @@ public ActivityLogWrapper retrieve(String logUUID) { controllerAssistant.checkRoles(user); try { - final ActivityLogEntry retrieve = ViewerFactory.getSolrManager().retrieve(ActivityLogEntry.class, logUUID); - final ViewerDatabase viewerDatabase = getViewerDatabase(retrieve.getParameters()); - if (viewerDatabase != null) { - retrieve.setParameters(replaceColumnSolrName(viewerDatabase.getMetadata(), retrieve.getParameters())); - } - return new ActivityLogWrapper(retrieve); - } catch (GenericException | NotFoundException | RequestNotValidException e) { + final ActivityLogStrategy strategy = ViewerFactory.getActivityLogStrategyFactory() + .getStrategy(retrieve.getActionComponent(), retrieve.getActionMethod()); + return strategy.apply(new ActivityLogWrapper(retrieve)); + } catch (GenericException | NotFoundException e) { state = LogEntryState.FAILURE; throw new RESTException(e); } finally { @@ -97,72 +82,4 @@ public ActivityLogWrapper retrieve(String logUUID) { controllerAssistant.registerAction(user, state, ViewerConstants.CONTROLLER_LOG_ID_PARAM, logUUID); } } - - private ViewerDatabase getViewerDatabase(Map parameters) - throws GenericException, RequestNotValidException { - - final String databaseUuid = parameters.get(ViewerConstants.CONTROLLER_DATABASE_ID_PARAM); - - if (databaseUuid == null) - return null; - - List fieldsToReturn = Collections.singletonList(ViewerConstants.SOLR_DATABASES_METADATA); - Filter filterParam = new Filter(new SimpleFilterParameter(ViewerConstants.INDEX_ID, databaseUuid)); - final IndexResult viewerDatabase = ViewerFactory.getSolrManager().find(ViewerDatabase.class, - filterParam, Sorter.NONE, new Sublist(), Facets.NONE, fieldsToReturn); - - if (viewerDatabase.getTotalCount() == 0) - return null; - - return viewerDatabase.getResults().get(0); - } - - private Map replaceColumnSolrName(ViewerMetadata metadata, Map parameters) - throws GenericException { - - final String jsonFilter = parameters.get(ViewerConstants.CONTROLLER_FILTER_PARAM); - final Filter filter = JsonUtils.getObjectFromJson(jsonFilter, Filter.class); - - final Map mapperSolrToDisplayName = getDisplayNameColumn(metadata, filter); - - for (FilterParameter filterParameter : filter.getParameters()) { - if (filterParameter.getName().startsWith(ViewerConstants.SOLR_INDEX_ROW_COLUMN_NAME_PREFIX)) { - filterParameter.setName(mapperSolrToDisplayName.get(filterParameter.getName())); - } - } - - final String jsonFromObject = JsonUtils.getJsonFromObject(filter); - parameters.put(ViewerConstants.CONTROLLER_FILTER_PARAM, jsonFromObject); - - return parameters; - } - - private String getTableIdFromFilter(Filter filter) { - for (FilterParameter filterParameter : filter.getParameters()) { - if (filterParameter.getName().equals(ViewerConstants.SOLR_ROWS_TABLE_ID) - && filterParameter instanceof SimpleFilterParameter) { - return ((SimpleFilterParameter) filterParameter).getValue(); - } - } - return null; - } - - private Map getDisplayNameColumn(ViewerMetadata metadata, Filter filter) { - Map solrNameToDisplayName = new HashMap<>(); - - String tableId = getTableIdFromFilter(filter); - - for (FilterParameter filterParameter : filter.getParameters()) { - if (filterParameter.getName().startsWith(ViewerConstants.SOLR_INDEX_ROW_COLUMN_NAME_PREFIX)) { - final List columns = metadata.getTableById(tableId).getColumns(); - - for (ViewerColumn column : columns) { - if (column.getSolrName().equals(filterParameter.getName())) { - solrNameToDisplayName.put(column.getSolrName(), column.getDisplayName()); - } - } - } - } - return solrNameToDisplayName; - } } diff --git a/src/main/java/com/databasepreservation/common/api/v1/DatabaseResource.java b/src/main/java/com/databasepreservation/common/api/v1/DatabaseResource.java index 56c5fa7e9..8ace6624d 100644 --- a/src/main/java/com/databasepreservation/common/api/v1/DatabaseResource.java +++ b/src/main/java/com/databasepreservation/common/api/v1/DatabaseResource.java @@ -128,29 +128,39 @@ public IndexResult findDatabases(FindRequest findRequest, String private IndexResult getViewerDatabaseIndexResult(FindRequest findRequest, ControllerAssistant controllerAssistant, User user, LogEntryState state) { + long count = 0; try { - return ViewerFactory.getSolrManager().find(ViewerDatabase.class, findRequest.filter, findRequest.sorter, - findRequest.sublist, findRequest.facets); + final IndexResult result = ViewerFactory.getSolrManager().find(ViewerDatabase.class, + findRequest.filter, findRequest.sorter, findRequest.sublist, findRequest.facets); + count = result.getTotalCount(); + return result; } catch (GenericException | RequestNotValidException e) { state = LogEntryState.FAILURE; throw new RESTException(e); } finally { // register action - controllerAssistant.registerAction(user, state); + controllerAssistant.registerAction(user, state, ViewerConstants.CONTROLLER_FILTER_PARAM, + JsonUtils.getJsonFromObject(findRequest.filter), ViewerConstants.CONTROLLER_SUBLIST_PARAM, + JsonUtils.getJsonFromObject(findRequest.sublist), ViewerConstants.CONTROLLER_RETRIEVE_COUNT, count); } } private IndexResult getViewerDatabaseIndexResult(FindRequest findRequest, List fieldsToReturn, ControllerAssistant controllerAssistant, User user, LogEntryState state) { + long count = 0; try { - return ViewerFactory.getSolrManager().find(ViewerDatabase.class, findRequest.filter, findRequest.sorter, - findRequest.sublist, findRequest.facets, fieldsToReturn); + final IndexResult result = ViewerFactory.getSolrManager().find(ViewerDatabase.class, findRequest.filter, findRequest.sorter, + findRequest.sublist, findRequest.facets, fieldsToReturn); + count = result.getTotalCount(); + return result; } catch (GenericException | RequestNotValidException e) { state = LogEntryState.FAILURE; throw new RESTException(e); } finally { // register action - controllerAssistant.registerAction(user, state); + controllerAssistant.registerAction(user, state, ViewerConstants.CONTROLLER_FILTER_PARAM, + JsonUtils.getJsonFromObject(findRequest.filter), ViewerConstants.CONTROLLER_SUBLIST_PARAM, + JsonUtils.getJsonFromObject(findRequest.sublist), ViewerConstants.CONTROLLER_RETRIEVE_COUNT, count); } } diff --git a/src/main/java/com/databasepreservation/common/api/v1/SIARDResource.java b/src/main/java/com/databasepreservation/common/api/v1/SIARDResource.java index 5e997c108..2aba5e30a 100644 --- a/src/main/java/com/databasepreservation/common/api/v1/SIARDResource.java +++ b/src/main/java/com/databasepreservation/common/api/v1/SIARDResource.java @@ -1,5 +1,9 @@ package com.databasepreservation.common.api.v1; +import java.nio.file.Paths; +import java.text.SimpleDateFormat; +import java.util.Date; + import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Path; import javax.ws.rs.core.Context; @@ -19,6 +23,7 @@ import com.databasepreservation.common.client.models.structure.ViewerDatabaseValidationStatus; import com.databasepreservation.common.client.models.structure.ViewerMetadata; import com.databasepreservation.common.client.services.SIARDService; +import com.databasepreservation.common.server.ViewerConfiguration; import com.databasepreservation.common.server.ViewerFactory; import com.databasepreservation.common.server.controller.SIARDController; import com.databasepreservation.common.utils.ControllerAssistant; @@ -39,7 +44,7 @@ public String uploadSIARD(String databaseUUID, String path) throws RESTException final User user = UserUtility.getUser(request); LogEntryState state = LogEntryState.SUCCESS; - controllerAssistant.checkRoles(UserUtility.getUser(request)); + controllerAssistant.checkRoles(user); try { return SIARDController.loadFromLocal(path, databaseUUID); } catch (GenericException e) { @@ -57,7 +62,7 @@ public String uploadMetadataSIARDServer(String path) { final User user = UserUtility.getUser(request); LogEntryState state = LogEntryState.SUCCESS; - controllerAssistant.checkRoles(UserUtility.getUser(request)); + controllerAssistant.checkRoles(user); try { return SIARDController.loadMetadataFromLocal(path); } catch (GenericException e) { @@ -74,7 +79,7 @@ public String uploadMetadataSIARD(String databaseUUID, String path) { final User user = UserUtility.getUser(request); LogEntryState state = LogEntryState.SUCCESS; - controllerAssistant.checkRoles(UserUtility.getUser(request)); + controllerAssistant.checkRoles(user); try { return SIARDController.loadMetadataFromLocal(databaseUUID, path); } catch (GenericException e) { @@ -166,7 +171,7 @@ public ViewerMetadata updateMetadataInformation(String databaseUUID, String path final User user = UserUtility.getUser(request); LogEntryState state = LogEntryState.SUCCESS; - controllerAssistant.checkRoles(UserUtility.getUser(request)); + controllerAssistant.checkRoles(user); try { return SIARDController.updateMetadataInformation(databaseUUID, path, parameters); } catch (GenericException e) { @@ -186,9 +191,11 @@ public Boolean validateSIARD(String databaseUUID, String SIARDPath, String valid final User user = UserUtility.getUser(request); LogEntryState state = LogEntryState.SUCCESS; - controllerAssistant.checkRoles(UserUtility.getUser(request)); + controllerAssistant.checkRoles(user); + String result = null; try { - return SIARDController.validateSIARD(databaseUUID, SIARDPath, validationReportPath, allowedTypePath, + result = getValidationReportPath(validationReportPath, SIARDPath); + return SIARDController.validateSIARD(databaseUUID, SIARDPath, result, allowedTypePath, skipAdditionalChecks); } catch (GenericException e) { state = LogEntryState.FAILURE; @@ -197,7 +204,7 @@ public Boolean validateSIARD(String databaseUUID, String SIARDPath, String valid // register action controllerAssistant.registerAction(user, state, ViewerConstants.CONTROLLER_DATABASE_ID_PARAM, databaseUUID, ViewerConstants.CONTROLLER_SIARD_PATH_PARAM, SIARDPath, ViewerConstants.CONTROLLER_REPORT_PATH_PARAM, - validationReportPath, ViewerConstants.CONTROLLER_SKIP_ADDITIONAL_CHECKS_PARAM, skipAdditionalChecks); + result, ViewerConstants.CONTROLLER_SKIP_ADDITIONAL_CHECKS_PARAM, skipAdditionalChecks); } } @@ -217,7 +224,7 @@ public void updateStatusValidate(String databaseUUID, ViewerDatabaseValidationSt final User user = UserUtility.getUser(request); LogEntryState state = LogEntryState.SUCCESS; - controllerAssistant.checkRoles(UserUtility.getUser(request)); + controllerAssistant.checkRoles(user); try { SIARDController.updateStatusValidate(databaseUUID, status); } finally { @@ -233,7 +240,7 @@ public void deleteSIARDFile(String databaseUUID, String path) { final User user = UserUtility.getUser(request); LogEntryState state = LogEntryState.SUCCESS; - controllerAssistant.checkRoles(UserUtility.getUser(request)); + controllerAssistant.checkRoles(user); try { SIARDController.deleteSIARDFileFromPath(path, databaseUUID); } catch (GenericException e) { @@ -252,7 +259,7 @@ public void deleteSIARDValidatorReportFile(String databaseUUID, String path) { final User user = UserUtility.getUser(request); LogEntryState state = LogEntryState.SUCCESS; - controllerAssistant.checkRoles(UserUtility.getUser(request)); + controllerAssistant.checkRoles(user); try { SIARDController.deleteValidatorReportFileFromPath(path, databaseUUID); } catch (GenericException e) { @@ -265,4 +272,15 @@ public void deleteSIARDValidatorReportFile(String databaseUUID, String path) { } } + private String getValidationReportPath(String validationReportPath, String siardPath) { + if (validationReportPath == null) { + String filename = Paths.get(siardPath).getFileName().toString().replaceFirst("[.][^.]+$", "") + "-" + + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + ".txt"; + validationReportPath = Paths + .get(ViewerConfiguration.getInstance().getSIARDReportValidationPath().toString(), filename).toAbsolutePath() + .toString(); + } + + return validationReportPath; + } } diff --git a/src/main/java/com/databasepreservation/common/api/v1/SearchResource.java b/src/main/java/com/databasepreservation/common/api/v1/SearchResource.java index 777c40464..4ef66a235 100644 --- a/src/main/java/com/databasepreservation/common/api/v1/SearchResource.java +++ b/src/main/java/com/databasepreservation/common/api/v1/SearchResource.java @@ -94,7 +94,8 @@ public IndexResult find(String databaseUUID, FindRequest findReques // register action controllerAssistant.registerAction(user, databaseUUID, state, ViewerConstants.CONTROLLER_DATABASE_ID_PARAM, databaseUUID, - ViewerConstants.CONTROLLER_FILTER_PARAM, JsonUtils.getJsonFromObject(findRequest)); + ViewerConstants.CONTROLLER_FILTER_PARAM, JsonUtils.getJsonFromObject(findRequest.filter), + ViewerConstants.CONTROLLER_SUBLIST_PARAM, JsonUtils.getJsonFromObject(findRequest.sublist)); } } diff --git a/src/main/java/com/databasepreservation/common/client/ViewerConstants.java b/src/main/java/com/databasepreservation/common/client/ViewerConstants.java index 3fb0e03d5..a1dbe0fab 100644 --- a/src/main/java/com/databasepreservation/common/client/ViewerConstants.java +++ b/src/main/java/com/databasepreservation/common/client/ViewerConstants.java @@ -422,8 +422,9 @@ public class ViewerConstants { public static final String CONTROLLER_ROW_ID_PARAM = "rowUUID"; public static final String CONTROLLER_COLUMN_ID_PARAM = "columnID"; public static final String CONTROLLER_LOG_ID_PARAM = "logID"; - public static final String CONTROLLER_FILENAME_PARAM = "rowUUID"; + public static final String CONTROLLER_FILENAME_PARAM = "filename"; public static final String CONTROLLER_FILTER_PARAM = "filter"; + public static final String CONTROLLER_FACET_PARAM = "facets"; public static final String CONTROLLER_EXPORT_PARAM = "export"; public static final String CONTROLLER_SUBLIST_PARAM = "sublist"; public static final String CONTROLLER_SKIP_ADDITIONAL_CHECKS_PARAM = "additional-checks"; @@ -439,7 +440,9 @@ public class ViewerConstants { */ public static final String CONTROLLER_ACTIVITY_LOG_RESOURCE = "com.databasepreservation.common.api.v1.ActivityLogResource"; public static final String CONTROLLER_DATABASE_RESOURCE = "com.databasepreservation.common.api.v1.DatabaseResource"; + public static final String CONTROLLER_EXPORT_RESOURCE = "com.databasepreservation.common.api.v1.ExportsResource"; public static final String CONTROLLER_FILE_RESOURCE = "com.databasepreservation.common.api.v1.FileResource"; + public static final String CONTROLLER_LOB_RESOURCE = "com.databasepreservation.common.api.v1.LobsResource"; public static final String CONTROLLER_SIARD_RESOURCE = "com.databasepreservation.common.api.v1.SIARDResource"; public static final String CONTROLLER_SEARCH_RESOURCE = "com.databasepreservation.common.api.v1.SearchResource"; public static final String CONTROLLER_USER_LOGIN_CONTROLLER = "com.databasepreservation.common.server.controller.UserLoginController"; diff --git a/src/main/java/com/databasepreservation/common/client/common/visualization/activity/log/ActivityLogDetailedPanel.java b/src/main/java/com/databasepreservation/common/client/common/visualization/activity/log/ActivityLogDetailedPanel.java index 63aeff3a7..ca95675f3 100644 --- a/src/main/java/com/databasepreservation/common/client/common/visualization/activity/log/ActivityLogDetailedPanel.java +++ b/src/main/java/com/databasepreservation/common/client/common/visualization/activity/log/ActivityLogDetailedPanel.java @@ -51,7 +51,7 @@ interface ActivityLogDetailedPanelUiBinder extends UiBinder instances = new HashMap<>(); - private ActivityLogEntry activityLogEntry; + private ActivityLogWrapper activityLogWrapper; public static ActivityLogDetailedPanel getInstance(String logUUID) { return instances.computeIfAbsent(logUUID, k -> new ActivityLogDetailedPanel(logUUID)); @@ -61,7 +61,7 @@ private ActivityLogDetailedPanel(String logUUID) { initWidget(uiBinder.createAndBindUi(this)); ActivityLogService.Util.call((ActivityLogWrapper wrapper) -> { - activityLogEntry = wrapper.getActivityLogEntry(); + activityLogWrapper = wrapper; init(); }).retrieve(logUUID); } @@ -70,6 +70,8 @@ private void init() { logHeader.setWidget(CommonClientUtils.getHeader(FontAwesomeIconManager.getTag(FontAwesomeIconManager.ACTIVITY_LOG), messages.activityLogDetailedHeaderText(), "h1")); + ActivityLogEntry activityLogEntry = activityLogWrapper.getActivityLogEntry(); + RowField dataField = RowField.createInstance(messages.activityLogTextForDate(), new HTML(Humanize.formatDateTime(activityLogEntry.getDatetime(), true))); RowField componentField = RowField.createInstance(messages.activityLogTextForComponent(), diff --git a/src/main/java/com/databasepreservation/common/client/common/visualization/activity/log/ActivityLogPanel.java b/src/main/java/com/databasepreservation/common/client/common/visualization/activity/log/ActivityLogPanel.java index 4bb56d2c7..9a7562f65 100644 --- a/src/main/java/com/databasepreservation/common/client/common/visualization/activity/log/ActivityLogPanel.java +++ b/src/main/java/com/databasepreservation/common/client/common/visualization/activity/log/ActivityLogPanel.java @@ -4,6 +4,8 @@ import java.util.List; import java.util.Map; +import org.roda.core.data.v2.index.filter.Filter; + import com.databasepreservation.common.client.ClientConfigurationManager; import com.databasepreservation.common.client.ViewerConstants; import com.databasepreservation.common.client.common.ContentPanel; @@ -30,7 +32,6 @@ import com.google.gwt.user.client.ui.Widget; import config.i18n.client.ClientMessages; -import org.roda.core.data.v2.index.filter.Filter; /** * @author Miguel Guimarães @@ -92,7 +93,6 @@ private ActivityLogPanel() { activityLogList.getSelectionModel().clear(); HistoryManager.gotoActivityLog(selected.getUuid()); } - }); searchPanel = new SearchPanel(ViewerConstants.DEFAULT_FILTER, ViewerConstants.INDEX_SEARCH, @@ -167,14 +167,4 @@ private void addSearchFieldPanel(final SearchFieldPanel searchFieldPanel) { public void handleBreadcrumb(BreadcrumbPanel breadcrumb) { BreadcrumbManager.updateBreadcrumb(breadcrumb, BreadcrumbManager.forActivityLog()); } - - /** - * This method is called immediately after a widget becomes attached to the - * browser's document. - */ - @Override - protected void onAttach() { - super.onAttach(); - activityLogList.refresh(); - } } diff --git a/src/main/java/com/databasepreservation/common/client/models/activity/logs/ActivityLogWrapper.java b/src/main/java/com/databasepreservation/common/client/models/activity/logs/ActivityLogWrapper.java index 2ef714748..e85386171 100644 --- a/src/main/java/com/databasepreservation/common/client/models/activity/logs/ActivityLogWrapper.java +++ b/src/main/java/com/databasepreservation/common/client/models/activity/logs/ActivityLogWrapper.java @@ -2,12 +2,49 @@ import java.io.Serializable; +import com.databasepreservation.common.client.common.search.SavedSearch; +import org.roda.core.data.v2.index.filter.Filter; +import org.roda.core.data.v2.index.sublist.Sublist; + +import com.databasepreservation.common.client.index.ExportRequest; +import com.databasepreservation.common.client.index.facets.Facets; +import com.databasepreservation.common.client.models.structure.ViewerDatabase; +import com.databasepreservation.common.client.models.structure.ViewerTable; + /** * @author Miguel Guimarães */ public class ActivityLogWrapper implements Serializable { private ActivityLogEntry activityLogEntry; + private boolean parameters = true; + + private PresenceState databasePresence = PresenceState.NONE; + private ViewerDatabase database; + + private PresenceState tablePresence = PresenceState.NONE; + private ViewerTable table; + + private PresenceState columnPresence = PresenceState.NONE; + private String columnName; + + private PresenceState rowPresence = PresenceState.NONE; + private String row; + + private PresenceState savedSearchPresence = PresenceState.NONE; + private SavedSearch savedSearch; + + private PresenceState filterPresence = PresenceState.NONE; + private Filter filter; + + private PresenceState sublistPresence = PresenceState.NONE; + private Sublist sublist; + + private PresenceState facetsPresence = PresenceState.NONE; + private Facets facets; + + private PresenceState exportRequestPresence = PresenceState.NONE; + private ExportRequest exportRequest; public ActivityLogWrapper() { } @@ -24,4 +61,155 @@ public void setActivityLogEntry(ActivityLogEntry activityLogEntry) { this.activityLogEntry = activityLogEntry; } + public boolean isParameters() { + return parameters; + } + + public void setParameters(boolean parameters) { + this.parameters = parameters; + } + + public PresenceState getDatabasePresence() { + return databasePresence; + } + + public void setDatabasePresence(PresenceState databasePresence) { + this.databasePresence = databasePresence; + } + + public ViewerDatabase getDatabase() { + return database; + } + + public void setDatabase(ViewerDatabase database) { + this.database = database; + } + + public PresenceState getTablePresence() { + return tablePresence; + } + + public void setTablePresence(PresenceState tablePresence) { + this.tablePresence = tablePresence; + } + + public ViewerTable getTable() { + return table; + } + + public void setTable(ViewerTable table) { + this.table = table; + } + + public PresenceState getFilterPresence() { + return filterPresence; + } + + public void setFilterPresence(PresenceState filterPresence) { + this.filterPresence = filterPresence; + } + + public Filter getFilter() { + return filter; + } + + public void setFilter(Filter filter) { + this.filter = filter; + } + + public PresenceState getSublistPresence() { + return sublistPresence; + } + + public void setSublistPresence(PresenceState sublistPresence) { + this.sublistPresence = sublistPresence; + } + + public Sublist getSublist() { + return sublist; + } + + public void setSublist(Sublist sublist) { + this.sublist = sublist; + } + + public PresenceState getFacetsPresence() { + return facetsPresence; + } + + public void setFacetsPresence(PresenceState facetsPresence) { + this.facetsPresence = facetsPresence; + } + + public Facets getFacets() { + return facets; + } + + public void setFacets(Facets facets) { + this.facets = facets; + } + + public PresenceState getExportRequestPresence() { + return exportRequestPresence; + } + + public void setExportRequestPresence(PresenceState exportRequestPresence) { + this.exportRequestPresence = exportRequestPresence; + } + + public ExportRequest getExportRequest() { + return exportRequest; + } + + public void setExportRequest(ExportRequest exportRequest) { + this.exportRequest = exportRequest; + } + + public String getColumnName() { + return columnName; + } + + public void setColumnName(String columnName) { + this.columnName = columnName; + } + + public PresenceState getColumnPresence() { + return columnPresence; + } + + public void setColumnPresence(PresenceState columnPresence) { + this.columnPresence = columnPresence; + } + + public PresenceState getRowPresence() { + return rowPresence; + } + + public void setRowPresence(PresenceState rowPresence) { + this.rowPresence = rowPresence; + } + + public String getRow() { + return row; + } + + public void setRow(String row) { + this.row = row; + } + + public PresenceState getSavedSearchPresence() { + return savedSearchPresence; + } + + public void setSavedSearchPresence(PresenceState savedSearchPresence) { + this.savedSearchPresence = savedSearchPresence; + } + + public SavedSearch getSavedSearch() { + return savedSearch; + } + + public void setSavedSearch(SavedSearch savedSearch) { + this.savedSearch = savedSearch; + } } diff --git a/src/main/java/com/databasepreservation/common/client/models/activity/logs/PresenceState.java b/src/main/java/com/databasepreservation/common/client/models/activity/logs/PresenceState.java new file mode 100644 index 000000000..dda828f32 --- /dev/null +++ b/src/main/java/com/databasepreservation/common/client/models/activity/logs/PresenceState.java @@ -0,0 +1,8 @@ +package com.databasepreservation.common.client.models.activity.logs; + +/** + * @author Miguel Guimarães + */ +public enum PresenceState { + YES, NO, NONE +} diff --git a/src/main/java/com/databasepreservation/common/client/models/structure/ViewerTable.java b/src/main/java/com/databasepreservation/common/client/models/structure/ViewerTable.java index ffb475ed5..e753d0483 100644 --- a/src/main/java/com/databasepreservation/common/client/models/structure/ViewerTable.java +++ b/src/main/java/com/databasepreservation/common/client/models/structure/ViewerTable.java @@ -209,6 +209,15 @@ public List getBinaryColumns() { return binaryColumns; } + @JsonIgnore + public ViewerColumn getColumnByIndexInEnclosingTable(int index) { + for (ViewerColumn column : columns) { + if (column.getColumnIndexInEnclosingTable() == index) + return column; + } + return null; + } + public boolean containsBinaryColumns() { for (ViewerColumn column : columns) { if (column.getType().getDbType().equals(ViewerType.dbTypes.BINARY)) { diff --git a/src/main/java/com/databasepreservation/common/server/ViewerFactory.java b/src/main/java/com/databasepreservation/common/server/ViewerFactory.java index a4ce0999a..02c851326 100644 --- a/src/main/java/com/databasepreservation/common/server/ViewerFactory.java +++ b/src/main/java/com/databasepreservation/common/server/ViewerFactory.java @@ -8,6 +8,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.databasepreservation.common.server.activity.log.strategies.ActivityLogStrategyFactory; import com.databasepreservation.common.server.index.DatabaseRowsSolrManager; import com.databasepreservation.common.server.index.factory.SolrClientFactory; @@ -21,6 +22,7 @@ public class ViewerFactory { private static DatabaseRowsSolrManager solrManager; private static ViewerConfiguration configuration; private static ConfigurationManager configurationManager; + private static ActivityLogStrategyFactory activityLogStrategyFactory; private static boolean instantiated = false; private static synchronized void instantiate() { @@ -29,6 +31,7 @@ private static synchronized void instantiate() { solrClient = SolrClientFactory.get().getSolrClient(); solrManager = new DatabaseRowsSolrManager(solrClient); configurationManager = new ConfigurationManager(); + activityLogStrategyFactory = new ActivityLogStrategyFactory(); instantiated = true; } } @@ -71,4 +74,9 @@ public static ConfigurationManager getConfigurationManager() { instantiate(); return configurationManager; } + + public static ActivityLogStrategyFactory getActivityLogStrategyFactory() { + instantiate(); + return activityLogStrategyFactory; + } } diff --git a/src/main/java/com/databasepreservation/common/server/activity/log/operations/ColumnOperation.java b/src/main/java/com/databasepreservation/common/server/activity/log/operations/ColumnOperation.java new file mode 100644 index 000000000..2650c698a --- /dev/null +++ b/src/main/java/com/databasepreservation/common/server/activity/log/operations/ColumnOperation.java @@ -0,0 +1,32 @@ +package com.databasepreservation.common.server.activity.log.operations; + +import com.databasepreservation.common.client.ViewerConstants; +import com.databasepreservation.common.client.models.activity.logs.ActivityLogWrapper; +import com.databasepreservation.common.client.models.activity.logs.PresenceState; +import com.databasepreservation.common.client.models.structure.ViewerColumn; + +/** + * @author Miguel Guimarães + */ +public class ColumnOperation implements Operation { + @Override + public ActivityLogWrapper execute(ActivityLogWrapper wrapper) { + int index = Integer.parseInt(wrapper.getActivityLogEntry().getParameters().get(ViewerConstants.CONTROLLER_COLUMN_ID_PARAM)); + + if (wrapper.getTable() == null) { + wrapper.setTablePresence(PresenceState.NO); + return wrapper; + } + + final ViewerColumn column = wrapper.getTable().getColumnByIndexInEnclosingTable(index); + + if (column == null) { + wrapper.setColumnPresence(PresenceState.NO); + } else { + wrapper.setColumnPresence(PresenceState.YES); + wrapper.setColumnName(column.getDisplayName()); + } + + return wrapper; + } +} diff --git a/src/main/java/com/databasepreservation/common/server/activity/log/operations/DatabaseOperation.java b/src/main/java/com/databasepreservation/common/server/activity/log/operations/DatabaseOperation.java new file mode 100644 index 000000000..88df2af13 --- /dev/null +++ b/src/main/java/com/databasepreservation/common/server/activity/log/operations/DatabaseOperation.java @@ -0,0 +1,67 @@ +package com.databasepreservation.common.server.activity.log.operations; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import com.databasepreservation.common.client.models.activity.logs.PresenceState; +import org.roda.core.data.exceptions.GenericException; +import org.roda.core.data.exceptions.RequestNotValidException; +import org.roda.core.data.v2.index.filter.Filter; +import org.roda.core.data.v2.index.filter.SimpleFilterParameter; +import org.roda.core.data.v2.index.sublist.Sublist; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.databasepreservation.common.client.ViewerConstants; +import com.databasepreservation.common.client.index.IndexResult; +import com.databasepreservation.common.client.index.facets.Facets; +import com.databasepreservation.common.client.index.sort.Sorter; +import com.databasepreservation.common.client.models.activity.logs.ActivityLogEntry; +import com.databasepreservation.common.client.models.activity.logs.ActivityLogWrapper; +import com.databasepreservation.common.client.models.structure.ViewerDatabase; +import com.databasepreservation.common.server.ViewerFactory; + +/** + * @author Miguel Guimarães + */ +public class DatabaseOperation implements Operation { + private static final Logger LOGGER = LoggerFactory.getLogger(DatabaseOperation.class); + + @Override + public ActivityLogWrapper execute(ActivityLogWrapper wrapper) { + try { + ActivityLogEntry log = wrapper.getActivityLogEntry(); + final ViewerDatabase viewerDatabase = getViewerDatabase(log.getParameters()); + if (viewerDatabase != null) { + wrapper.setDatabase(viewerDatabase); + wrapper.setDatabasePresence(PresenceState.YES); + } else { + wrapper.setDatabasePresence(PresenceState.NO); + } + } catch (GenericException | RequestNotValidException e) { + LOGGER.debug("Error executing the retrieve database information", e); + } + + return wrapper; + } + + private ViewerDatabase getViewerDatabase(Map parameters) + throws GenericException, RequestNotValidException { + + final String databaseUuid = parameters.get(ViewerConstants.CONTROLLER_DATABASE_ID_PARAM); + + if (databaseUuid == null) + return null; + + List fieldsToReturn = Arrays.asList(ViewerConstants.INDEX_ID, ViewerConstants.SOLR_DATABASES_METADATA); + Filter filterParam = new Filter(new SimpleFilterParameter(ViewerConstants.INDEX_ID, databaseUuid)); + final IndexResult viewerDatabase = ViewerFactory.getSolrManager().find(ViewerDatabase.class, + filterParam, Sorter.NONE, new Sublist(), Facets.NONE, fieldsToReturn); + + if (viewerDatabase.getTotalCount() == 0) + return null; + + return viewerDatabase.getResults().get(0); + } +} diff --git a/src/main/java/com/databasepreservation/common/server/activity/log/operations/ExportRequestOperation.java b/src/main/java/com/databasepreservation/common/server/activity/log/operations/ExportRequestOperation.java new file mode 100644 index 000000000..32d5ce134 --- /dev/null +++ b/src/main/java/com/databasepreservation/common/server/activity/log/operations/ExportRequestOperation.java @@ -0,0 +1,32 @@ +package com.databasepreservation.common.server.activity.log.operations; + +import com.databasepreservation.common.client.models.activity.logs.PresenceState; +import org.roda.core.data.exceptions.GenericException; +import org.roda.core.data.utils.JsonUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.databasepreservation.common.client.ViewerConstants; +import com.databasepreservation.common.client.index.ExportRequest; +import com.databasepreservation.common.client.models.activity.logs.ActivityLogWrapper; + +/** + * @author Miguel Guimarães + */ +public class ExportRequestOperation implements Operation { + private static final Logger LOGGER = LoggerFactory.getLogger(ExportRequestOperation.class); + + @Override + public ActivityLogWrapper execute(ActivityLogWrapper wrapper) { + try { + final String jsonExport = wrapper.getActivityLogEntry().getParameters().get(ViewerConstants.CONTROLLER_EXPORT_PARAM); + final ExportRequest exportRequest = JsonUtils.getObjectFromJson(jsonExport, ExportRequest.class); + wrapper.setExportRequest(exportRequest); + wrapper.setExportRequestPresence(PresenceState.YES); + } catch (GenericException e) { + LOGGER.debug("Error executing the export request information", e); + } + + return wrapper; + } +} diff --git a/src/main/java/com/databasepreservation/common/server/activity/log/operations/FacetsOperation.java b/src/main/java/com/databasepreservation/common/server/activity/log/operations/FacetsOperation.java new file mode 100644 index 000000000..a850573db --- /dev/null +++ b/src/main/java/com/databasepreservation/common/server/activity/log/operations/FacetsOperation.java @@ -0,0 +1,39 @@ +package com.databasepreservation.common.server.activity.log.operations; + +import com.databasepreservation.common.client.models.activity.logs.PresenceState; +import org.roda.core.data.exceptions.GenericException; +import org.roda.core.data.utils.JsonUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.databasepreservation.common.client.ViewerConstants; +import com.databasepreservation.common.client.index.facets.Facets; +import com.databasepreservation.common.client.models.activity.logs.ActivityLogWrapper; + +/** + * @author Miguel Guimarães + */ +public class FacetsOperation implements Operation { + private static final Logger LOGGER = LoggerFactory.getLogger(FacetsOperation.class); + + @Override + public ActivityLogWrapper execute(ActivityLogWrapper wrapper) { + try { + final String jsonFacets = wrapper.getActivityLogEntry().getParameters().get(ViewerConstants.CONTROLLER_FACET_PARAM); + Facets facets; + if (jsonFacets != null) { + wrapper.setFacetsPresence(PresenceState.YES); + facets = JsonUtils.getObjectFromJson(jsonFacets, Facets.class); + } else { + wrapper.setFacetsPresence(PresenceState.NO); + facets = Facets.NONE; + } + + wrapper.setFacets(facets); + } catch (GenericException e) { + LOGGER.debug("Error executing the facets operation", e); + } + + return wrapper; + } +} diff --git a/src/main/java/com/databasepreservation/common/server/activity/log/operations/FilterOperation.java b/src/main/java/com/databasepreservation/common/server/activity/log/operations/FilterOperation.java new file mode 100644 index 000000000..ac2aeff0f --- /dev/null +++ b/src/main/java/com/databasepreservation/common/server/activity/log/operations/FilterOperation.java @@ -0,0 +1,93 @@ +package com.databasepreservation.common.server.activity.log.operations; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.databasepreservation.common.client.models.activity.logs.PresenceState; +import org.roda.core.data.exceptions.GenericException; +import org.roda.core.data.utils.JsonUtils; +import org.roda.core.data.v2.index.filter.Filter; +import org.roda.core.data.v2.index.filter.FilterParameter; +import org.roda.core.data.v2.index.filter.SimpleFilterParameter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.databasepreservation.common.client.ViewerConstants; +import com.databasepreservation.common.client.models.activity.logs.ActivityLogEntry; +import com.databasepreservation.common.client.models.activity.logs.ActivityLogWrapper; +import com.databasepreservation.common.client.models.structure.ViewerColumn; +import com.databasepreservation.common.client.models.structure.ViewerMetadata; + +/** + * @author Miguel Guimarães + */ +public class FilterOperation implements Operation { + private static final Logger LOGGER = LoggerFactory.getLogger(FilterOperation.class); + + @Override + public ActivityLogWrapper execute(ActivityLogWrapper wrapper) { + try { + ActivityLogEntry log = wrapper.getActivityLogEntry(); + if (wrapper.getDatabasePresence().equals(PresenceState.YES)) { + wrapper.setFilter(replaceColumnSolrName(wrapper.getDatabase().getMetadata(), log.getParameters())); + wrapper.setFilterPresence(PresenceState.YES); + } else { + final String jsonFilter = log.getParameters().get(ViewerConstants.CONTROLLER_FILTER_PARAM); + final Filter filter = JsonUtils.getObjectFromJson(jsonFilter, Filter.class); + wrapper.setFilterPresence(PresenceState.YES); + wrapper.setFilter(filter); + } + } catch (GenericException e) { + LOGGER.debug("Error executing the retrieve filter information", e); + } + + return wrapper; + } + + private Filter replaceColumnSolrName(ViewerMetadata metadata, Map parameters) + throws GenericException { + + final String jsonFilter = parameters.get(ViewerConstants.CONTROLLER_FILTER_PARAM); + final Filter filter = JsonUtils.getObjectFromJson(jsonFilter, Filter.class); + + final Map mapperSolrToDisplayName = getDisplayNameColumn(metadata, filter); + + for (FilterParameter filterParameter : filter.getParameters()) { + if (filterParameter.getName().startsWith(ViewerConstants.SOLR_INDEX_ROW_COLUMN_NAME_PREFIX)) { + filterParameter.setName(mapperSolrToDisplayName.get(filterParameter.getName())); + } + } + + return filter; + } + + private String getTableIdFromFilter(Filter filter) { + for (FilterParameter filterParameter : filter.getParameters()) { + if (filterParameter.getName().equals(ViewerConstants.SOLR_ROWS_TABLE_ID) + && filterParameter instanceof SimpleFilterParameter) { + return ((SimpleFilterParameter) filterParameter).getValue(); + } + } + return null; + } + + private Map getDisplayNameColumn(ViewerMetadata metadata, Filter filter) { + Map solrNameToDisplayName = new HashMap<>(); + + String tableId = getTableIdFromFilter(filter); + + for (FilterParameter filterParameter : filter.getParameters()) { + if (filterParameter.getName().startsWith(ViewerConstants.SOLR_INDEX_ROW_COLUMN_NAME_PREFIX)) { + final List columns = metadata.getTableById(tableId).getColumns(); + + for (ViewerColumn column : columns) { + if (column.getSolrName().equals(filterParameter.getName())) { + solrNameToDisplayName.put(column.getSolrName(), column.getDisplayName()); + } + } + } + } + return solrNameToDisplayName; + } +} diff --git a/src/main/java/com/databasepreservation/common/server/activity/log/operations/Operation.java b/src/main/java/com/databasepreservation/common/server/activity/log/operations/Operation.java new file mode 100644 index 000000000..c5ac8123a --- /dev/null +++ b/src/main/java/com/databasepreservation/common/server/activity/log/operations/Operation.java @@ -0,0 +1,11 @@ +package com.databasepreservation.common.server.activity.log.operations; + +import com.databasepreservation.common.client.models.activity.logs.ActivityLogWrapper; + +/** + * @author Miguel Guimarães + */ +public interface Operation { + + ActivityLogWrapper execute(ActivityLogWrapper wrapper); +} diff --git a/src/main/java/com/databasepreservation/common/server/activity/log/operations/RowOperation.java b/src/main/java/com/databasepreservation/common/server/activity/log/operations/RowOperation.java new file mode 100644 index 000000000..4b4916e36 --- /dev/null +++ b/src/main/java/com/databasepreservation/common/server/activity/log/operations/RowOperation.java @@ -0,0 +1,55 @@ +package com.databasepreservation.common.server.activity.log.operations; + +import java.util.Collections; +import java.util.List; + +import org.roda.core.data.exceptions.GenericException; +import org.roda.core.data.exceptions.RequestNotValidException; +import org.roda.core.data.v2.index.filter.Filter; +import org.roda.core.data.v2.index.filter.SimpleFilterParameter; +import org.roda.core.data.v2.index.sublist.Sublist; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.databasepreservation.common.client.ViewerConstants; +import com.databasepreservation.common.client.index.IndexResult; +import com.databasepreservation.common.client.index.facets.Facets; +import com.databasepreservation.common.client.index.sort.Sorter; +import com.databasepreservation.common.client.models.activity.logs.ActivityLogWrapper; +import com.databasepreservation.common.client.models.activity.logs.PresenceState; +import com.databasepreservation.common.client.models.structure.ViewerRow; +import com.databasepreservation.common.server.ViewerFactory; + +/** + * @author Miguel Guimarães + */ +public class RowOperation implements Operation { + private static final Logger LOGGER = LoggerFactory.getLogger(RowOperation.class); + + @Override + public ActivityLogWrapper execute(ActivityLogWrapper wrapper) { + final String rowUUID = wrapper.getActivityLogEntry().getParameters().get(ViewerConstants.CONTROLLER_ROW_ID_PARAM); + + if (wrapper.getDatabase() != null) { + + try { + List fieldsToReturn = Collections.singletonList(ViewerConstants.INDEX_ID); + Filter filterParam = new Filter(new SimpleFilterParameter(ViewerConstants.INDEX_ID, rowUUID)); + final IndexResult viewerRow = ViewerFactory.getSolrManager().findRows(wrapper.getDatabase().getUuid(), + filterParam, Sorter.NONE, new Sublist(), Facets.NONE, fieldsToReturn); + + if (viewerRow.getTotalCount() == 0) { + wrapper.setRowPresence(PresenceState.NO); + } else { + wrapper.setRow(rowUUID); + wrapper.setRowPresence(PresenceState.YES); + } + + } catch (GenericException | RequestNotValidException e) { + LOGGER.debug("Error executing the retrieve database information", e); + } + } + + return wrapper; + } +} diff --git a/src/main/java/com/databasepreservation/common/server/activity/log/operations/SearchOperation.java b/src/main/java/com/databasepreservation/common/server/activity/log/operations/SearchOperation.java new file mode 100644 index 000000000..d9e6f0c8a --- /dev/null +++ b/src/main/java/com/databasepreservation/common/server/activity/log/operations/SearchOperation.java @@ -0,0 +1,73 @@ +package com.databasepreservation.common.server.activity.log.operations; + +import java.util.Collections; +import java.util.List; + +import org.roda.core.data.exceptions.GenericException; +import org.roda.core.data.exceptions.RequestNotValidException; +import org.roda.core.data.utils.JsonUtils; +import org.roda.core.data.v2.index.filter.Filter; +import org.roda.core.data.v2.index.filter.SimpleFilterParameter; +import org.roda.core.data.v2.index.sublist.Sublist; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.databasepreservation.common.client.ViewerConstants; +import com.databasepreservation.common.client.common.search.SavedSearch; +import com.databasepreservation.common.client.index.IndexResult; +import com.databasepreservation.common.client.index.facets.Facets; +import com.databasepreservation.common.client.index.sort.Sorter; +import com.databasepreservation.common.client.models.activity.logs.ActivityLogWrapper; +import com.databasepreservation.common.client.models.activity.logs.PresenceState; +import com.databasepreservation.common.server.ViewerFactory; + +/** + * @author Miguel Guimarães + */ +public class SearchOperation implements Operation { + private static final Logger LOGGER = LoggerFactory.getLogger(SearchOperation.class); + + @Override + public ActivityLogWrapper execute(ActivityLogWrapper wrapper) { + final String searchUUID = wrapper.getActivityLogEntry().getParameters() + .get(ViewerConstants.CONTROLLER_SAVED_SEARCH_UUID_PARAM); + + if (searchUUID == null) { + final String savedSearchJson = wrapper.getActivityLogEntry().getParameters() + .get(ViewerConstants.CONTROLLER_SAVED_SEARCH_PARAM); + try { + final SavedSearch savedSearch = JsonUtils.getObjectFromJson(savedSearchJson, SavedSearch.class); + if (savedSearch != null) { + wrapper.setSavedSearch(savedSearch); + wrapper.setSavedSearchPresence(PresenceState.YES); + } else { + wrapper.setSavedSearchPresence(PresenceState.NO); + } + } catch (GenericException e) { + LOGGER.debug("Error executing the retrieve saved search information", e); + } + } else { + + if (wrapper.getDatabase() != null) { + try { + List fieldsToReturn = Collections.singletonList(ViewerConstants.INDEX_ID); + Filter filterParam = new Filter(new SimpleFilterParameter(ViewerConstants.INDEX_ID, searchUUID)); + final IndexResult result = ViewerFactory.getSolrManager().find(SavedSearch.class, filterParam, + Sorter.NONE, new Sublist(), Facets.NONE, fieldsToReturn); + + if (result.getTotalCount() == 0) { + wrapper.setSavedSearchPresence(PresenceState.NO); + } else { + wrapper.setSavedSearch(result.getResults().get(0)); + wrapper.setSavedSearchPresence(PresenceState.YES); + } + + } catch (GenericException | RequestNotValidException e) { + LOGGER.debug("Error executing the retrieve database information", e); + } + } + } + + return wrapper; + } +} diff --git a/src/main/java/com/databasepreservation/common/server/activity/log/operations/SublistOperation.java b/src/main/java/com/databasepreservation/common/server/activity/log/operations/SublistOperation.java new file mode 100644 index 000000000..10650c2ec --- /dev/null +++ b/src/main/java/com/databasepreservation/common/server/activity/log/operations/SublistOperation.java @@ -0,0 +1,34 @@ +package com.databasepreservation.common.server.activity.log.operations; + +import com.databasepreservation.common.client.models.activity.logs.PresenceState; +import org.roda.core.data.exceptions.GenericException; +import org.roda.core.data.utils.JsonUtils; +import org.roda.core.data.v2.index.sublist.Sublist; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.databasepreservation.common.client.ViewerConstants; +import com.databasepreservation.common.client.models.activity.logs.ActivityLogWrapper; + +/** + * @author Miguel Guimarães + */ +public class SublistOperation implements Operation { + private static final Logger LOGGER = LoggerFactory.getLogger(SublistOperation.class); + + @Override + public ActivityLogWrapper execute(ActivityLogWrapper wrapper) { + try { + final String jsonFilter = wrapper.getActivityLogEntry().getParameters().get(ViewerConstants.CONTROLLER_SUBLIST_PARAM); + if (jsonFilter != null) { + final Sublist sublist = JsonUtils.getObjectFromJson(jsonFilter, Sublist.class); + wrapper.setSublist(sublist); + wrapper.setSublistPresence(PresenceState.YES); + } + } catch (GenericException e) { + LOGGER.debug("Error executing the sublist information", e); + } + + return wrapper; + } +} diff --git a/src/main/java/com/databasepreservation/common/server/activity/log/operations/TableOperation.java b/src/main/java/com/databasepreservation/common/server/activity/log/operations/TableOperation.java new file mode 100644 index 000000000..669e1a979 --- /dev/null +++ b/src/main/java/com/databasepreservation/common/server/activity/log/operations/TableOperation.java @@ -0,0 +1,28 @@ +package com.databasepreservation.common.server.activity.log.operations; + +import com.databasepreservation.common.client.ViewerConstants; +import com.databasepreservation.common.client.models.activity.logs.ActivityLogWrapper; +import com.databasepreservation.common.client.models.activity.logs.PresenceState; +import com.databasepreservation.common.client.models.structure.ViewerTable; + +/** + * @author Miguel Guimarães + */ +public class TableOperation implements Operation { + @Override + public ActivityLogWrapper execute(ActivityLogWrapper wrapper) { + final String tableUUID = wrapper.getActivityLogEntry().getParameters().get(ViewerConstants.CONTROLLER_TABLE_ID_PARAM); + + if (tableUUID != null) { + if (wrapper.getDatabase() != null) { + ViewerTable table = wrapper.getDatabase().getMetadata().getTable(tableUUID); + wrapper.setTable(table); + wrapper.setTablePresence(PresenceState.YES); + } else { + wrapper.setTablePresence(PresenceState.NO); + } + } + + return wrapper; + } +} diff --git a/src/main/java/com/databasepreservation/common/server/activity/log/strategies/ActivityLogStrategy.java b/src/main/java/com/databasepreservation/common/server/activity/log/strategies/ActivityLogStrategy.java new file mode 100644 index 000000000..be6e3bd50 --- /dev/null +++ b/src/main/java/com/databasepreservation/common/server/activity/log/strategies/ActivityLogStrategy.java @@ -0,0 +1,34 @@ +package com.databasepreservation.common.server.activity.log.strategies; + +import com.databasepreservation.common.client.models.activity.logs.ActivityLogWrapper; +import com.databasepreservation.common.server.activity.log.operations.Operation; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Miguel Guimarães + */ +public abstract class ActivityLogStrategy { + protected List operationList; + + public ActivityLogStrategy() { + operationList = new ArrayList<>(); + } + + public ActivityLogWrapper apply(ActivityLogWrapper wrapper) { + for (Operation operation : operationList) { + operation.execute(wrapper); + } + return wrapper; + } + + protected List getOperationList() { + return operationList; + } + + protected void clearOperationList() { + operationList.clear(); + operationList = new ArrayList<>(); + } +} diff --git a/src/main/java/com/databasepreservation/common/server/activity/log/strategies/ActivityLogStrategyFactory.java b/src/main/java/com/databasepreservation/common/server/activity/log/strategies/ActivityLogStrategyFactory.java new file mode 100644 index 000000000..c190db2cf --- /dev/null +++ b/src/main/java/com/databasepreservation/common/server/activity/log/strategies/ActivityLogStrategyFactory.java @@ -0,0 +1,142 @@ +package com.databasepreservation.common.server.activity.log.strategies; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.databasepreservation.common.client.ViewerConstants; +import com.databasepreservation.common.server.activity.log.operations.ColumnOperation; +import com.databasepreservation.common.server.activity.log.operations.DatabaseOperation; +import com.databasepreservation.common.server.activity.log.operations.ExportRequestOperation; +import com.databasepreservation.common.server.activity.log.operations.FacetsOperation; +import com.databasepreservation.common.server.activity.log.operations.FilterOperation; +import com.databasepreservation.common.server.activity.log.operations.RowOperation; +import com.databasepreservation.common.server.activity.log.operations.SearchOperation; +import com.databasepreservation.common.server.activity.log.operations.SublistOperation; +import com.databasepreservation.common.server.activity.log.operations.TableOperation; + +/** + * @author Miguel Guimarães + */ +public class ActivityLogStrategyFactory { + private static final Logger LOGGER = LoggerFactory.getLogger(ActivityLogStrategyFactory.class); + + private final ActivityLogStrategy noLogStrategy; + private final ActivityLogStrategy identityLogStrategy; + private final ActivityLogStrategy composeLogStrategy; + + public ActivityLogStrategyFactory() { + noLogStrategy = new NoLogStrategy(); + identityLogStrategy = new IdentityLogStrategy(); + composeLogStrategy = new ComposeLogStrategy(); + } + + public ActivityLogStrategy getStrategy(String actionComponent, String actionMethod) { + if (ViewerConstants.CONTROLLER_DATABASE_RESOURCE.equals(actionComponent)) { + switch (actionMethod) { + case "findRows": + composeLogStrategy.clearOperationList(); + composeLogStrategy.getOperationList().add(new DatabaseOperation()); + composeLogStrategy.getOperationList().add(new FilterOperation()); + composeLogStrategy.getOperationList().add(new FacetsOperation()); + composeLogStrategy.getOperationList().add(new SublistOperation()); + return composeLogStrategy; + case "findDatabases": + composeLogStrategy.clearOperationList(); + composeLogStrategy.getOperationList().add(new FilterOperation()); + composeLogStrategy.getOperationList().add(new FacetsOperation()); + composeLogStrategy.getOperationList().add(new SublistOperation()); + return composeLogStrategy; + case "retrieveRow": + case "retrieve": + case "deleteSolrData": + case "deleteDatabase": + composeLogStrategy.clearOperationList(); + composeLogStrategy.getOperationList().add(new DatabaseOperation()); + return composeLogStrategy; + } + } else if (ViewerConstants.CONTROLLER_EXPORT_RESOURCE.equals(actionComponent)) { + if ("getCSVResultsPost".equals(actionMethod)) { + composeLogStrategy.clearOperationList(); + composeLogStrategy.getOperationList().add(new DatabaseOperation()); + composeLogStrategy.getOperationList().add(new TableOperation()); + composeLogStrategy.getOperationList().add(new FilterOperation()); + composeLogStrategy.getOperationList().add(new SublistOperation()); + composeLogStrategy.getOperationList().add(new ExportRequestOperation()); + return composeLogStrategy; + } + } else if (ViewerConstants.CONTROLLER_LOB_RESOURCE.equals(actionComponent)) { + if ("getLOB".equals(actionMethod)) { + composeLogStrategy.clearOperationList(); + composeLogStrategy.getOperationList().add(new DatabaseOperation()); + composeLogStrategy.getOperationList().add(new TableOperation()); + composeLogStrategy.getOperationList().add(new ColumnOperation()); + composeLogStrategy.getOperationList().add(new RowOperation()); + return composeLogStrategy; + } + } else if (ViewerConstants.CONTROLLER_FILE_RESOURCE.equals(actionComponent)) { + switch (actionMethod) { + case "createSIARDFile": + return noLogStrategy; + case "getSIARDFile": + case "getValidationReportFile": + composeLogStrategy.clearOperationList(); + composeLogStrategy.getOperationList().add(new DatabaseOperation()); + return composeLogStrategy; + } + } else if (ViewerConstants.CONTROLLER_SEARCH_RESOURCE.equals(actionComponent)) { + switch (actionMethod) { + case "delete": + case "edit": + case "retrieve": + composeLogStrategy.clearOperationList(); + composeLogStrategy.getOperationList().add(new DatabaseOperation()); + composeLogStrategy.getOperationList().add(new SearchOperation()); + return composeLogStrategy; + case "find": + composeLogStrategy.clearOperationList(); + composeLogStrategy.getOperationList().add(new DatabaseOperation()); + composeLogStrategy.getOperationList().add(new FilterOperation()); + composeLogStrategy.getOperationList().add(new SublistOperation()); + return composeLogStrategy; + case "getSearchFields": + composeLogStrategy.clearOperationList(); + composeLogStrategy.getOperationList().add(new DatabaseOperation()); + composeLogStrategy.getOperationList().add(new TableOperation()); + return composeLogStrategy; + case "save": + composeLogStrategy.clearOperationList(); + composeLogStrategy.getOperationList().add(new DatabaseOperation()); + composeLogStrategy.getOperationList().add(new TableOperation()); + composeLogStrategy.getOperationList().add(new SearchOperation()); + return composeLogStrategy; + } + } else if (ViewerConstants.CONTROLLER_SIARD_RESOURCE.equals(actionComponent)) { + switch (actionMethod) { + case "deleteSIARDFile": + case "deleteSIARDValidatorReportFile": + case "updateMetadataInformation": + case "validateSIARD": + case "updateStatusValidate": + composeLogStrategy.clearOperationList(); + composeLogStrategy.getOperationList().add(new DatabaseOperation()); + return composeLogStrategy; + case "uploadMetadataSIARDServer": + case "uploadSIARD": + return identityLogStrategy; + } + } else if (ViewerConstants.CONTROLLER_ACTIVITY_LOG_RESOURCE.equals(actionComponent)) { + switch (actionMethod) { + case "find": + composeLogStrategy.clearOperationList(); + composeLogStrategy.getOperationList().add(new FilterOperation()); + composeLogStrategy.getOperationList().add(new FacetsOperation()); + composeLogStrategy.getOperationList().add(new SublistOperation()); + return composeLogStrategy; + case "retrieve": + return identityLogStrategy; + } + } + + return identityLogStrategy; + } +} diff --git a/src/main/java/com/databasepreservation/common/server/activity/log/strategies/ComposeLogStrategy.java b/src/main/java/com/databasepreservation/common/server/activity/log/strategies/ComposeLogStrategy.java new file mode 100644 index 000000000..3170d522b --- /dev/null +++ b/src/main/java/com/databasepreservation/common/server/activity/log/strategies/ComposeLogStrategy.java @@ -0,0 +1,10 @@ +package com.databasepreservation.common.server.activity.log.strategies; + +/** + * @author Miguel Guimarães + */ +public class ComposeLogStrategy extends ActivityLogStrategy { + public ComposeLogStrategy() { + super(); + } +} diff --git a/src/main/java/com/databasepreservation/common/server/activity/log/strategies/IdentityLogStrategy.java b/src/main/java/com/databasepreservation/common/server/activity/log/strategies/IdentityLogStrategy.java new file mode 100644 index 000000000..d774469b2 --- /dev/null +++ b/src/main/java/com/databasepreservation/common/server/activity/log/strategies/IdentityLogStrategy.java @@ -0,0 +1,18 @@ +package com.databasepreservation.common.server.activity.log.strategies; + +import com.databasepreservation.common.client.models.activity.logs.ActivityLogWrapper; + +/** + * @author Miguel Guimarães + */ +public class IdentityLogStrategy extends ActivityLogStrategy { + + public IdentityLogStrategy() { + super(); + } + + @Override + public ActivityLogWrapper apply(ActivityLogWrapper wrapper) { + return wrapper; + } +} diff --git a/src/main/java/com/databasepreservation/common/server/activity/log/strategies/NoLogStrategy.java b/src/main/java/com/databasepreservation/common/server/activity/log/strategies/NoLogStrategy.java new file mode 100644 index 000000000..4a7b2599f --- /dev/null +++ b/src/main/java/com/databasepreservation/common/server/activity/log/strategies/NoLogStrategy.java @@ -0,0 +1,19 @@ +package com.databasepreservation.common.server.activity.log.strategies; + +import com.databasepreservation.common.client.models.activity.logs.ActivityLogWrapper; + +/** + * @author Miguel Guimarães + */ +public class NoLogStrategy extends ActivityLogStrategy { + + public NoLogStrategy(){ + super(); + } + + @Override + public ActivityLogWrapper apply(ActivityLogWrapper wrapper) { + wrapper.setParameters(false); + return wrapper; + } +} diff --git a/src/main/java/com/databasepreservation/common/server/controller/SIARDController.java b/src/main/java/com/databasepreservation/common/server/controller/SIARDController.java index 0588f80b8..12c0426ed 100644 --- a/src/main/java/com/databasepreservation/common/server/controller/SIARDController.java +++ b/src/main/java/com/databasepreservation/common/server/controller/SIARDController.java @@ -560,13 +560,7 @@ public static boolean validateSIARD(String databaseUUID, String siardPath, Strin String allowedTypesPath, boolean skipAdditionalChecks) throws GenericException { Path reporterPath = ViewerConfiguration.getInstance().getReportPathForValidation(databaseUUID).toAbsolutePath(); boolean valid; - if (validationReportPath == null) { - String filename = Paths.get(siardPath).getFileName().toString().replaceFirst("[.][^.]+$", "") + "-" - + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + ".txt"; - validationReportPath = Paths - .get(ViewerConfiguration.getInstance().getSIARDReportValidationPath().toString(), filename).toAbsolutePath() - .toString(); - } + try (Reporter reporter = new Reporter(reporterPath.getParent().toString(), reporterPath.getFileName().toString())) { SIARDValidation siardValidation = SIARDValidation.newInstance(); siardValidation.validateModule(new SIARDValidateFactory()) diff --git a/src/main/resources/config/dbvtk-roles.properties b/src/main/resources/config/dbvtk-roles.properties index 3811f5d8a..689391bcf 100644 --- a/src/main/resources/config/dbvtk-roles.properties +++ b/src/main/resources/config/dbvtk-roles.properties @@ -23,8 +23,8 @@ roles.com.databasepreservation.common.api.v1.DatabaseResource.findRows=administr roles.com.databasepreservation.common.api.v1.DatabaseResource.findRows=users roles.com.databasepreservation.common.api.v1.DatabaseResource.retrieve=administrators roles.com.databasepreservation.common.api.v1.DatabaseResource.retrieve=users -roles.com.databasepreservation.common.api.v1.DatabaseResource.retrieveRows=administrators -roles.com.databasepreservation.common.api.v1.DatabaseResource.retrieveRows=users +roles.com.databasepreservation.common.api.v1.DatabaseResource.retrieveRow=administrators +roles.com.databasepreservation.common.api.v1.DatabaseResource.retrieveRow=users ################################################ # Export Resource # ################################################ diff --git a/src/main/resources/config/i18n/ServerMessages.properties b/src/main/resources/config/i18n/ServerMessages.properties index 4a4e83e70..e0a852ee7 100644 --- a/src/main/resources/config/i18n/ServerMessages.properties +++ b/src/main/resources/config/i18n/ServerMessages.properties @@ -12,6 +12,8 @@ ui.facets.ActivityLogEntry.state.UNKNOWN:Unknown ui.facets.ActivityLogEntry.actionComponent.com.databasepreservation.common.api.v1.ActivityLogResource:Activity log ui.facets.ActivityLogEntry.actionComponent.com.databasepreservation.common.api.v1.DatabaseResource:Database ui.facets.ActivityLogEntry.actionComponent.com.databasepreservation.common.api.v1.FileResource:File +ui.facets.ActivityLogEntry.actionComponent.com.databasepreservation.common.api.v1.ExportsResource:Export +ui.facets.ActivityLogEntry.actionComponent.com.databasepreservation.common.api.v1.LobsResource:LOBs ui.facets.ActivityLogEntry.actionComponent.com.databasepreservation.common.api.v1.SIARDResource:SIARD ui.facets.ActivityLogEntry.actionComponent.com.databasepreservation.common.api.v1.SearchResource:Saved searches ui.facets.ActivityLogEntry.actionComponent.com.databasepreservation.common.server.controller.UserLoginController:Login diff --git a/src/main/resources/config/i18n/ServerMessages_pt_PT.properties b/src/main/resources/config/i18n/ServerMessages_pt_PT.properties index 62520dc4d..08c0e288d 100644 --- a/src/main/resources/config/i18n/ServerMessages_pt_PT.properties +++ b/src/main/resources/config/i18n/ServerMessages_pt_PT.properties @@ -12,6 +12,8 @@ ui.facets.ActivityLogEntry.state.UNKNOWN:Desconhecido ui.facets.ActivityLogEntry.actionComponent.com.databasepreservation.common.api.v1.ActivityLogResource:Registo de atividades ui.facets.ActivityLogEntry.actionComponent.com.databasepreservation.common.api.v1.DatabaseResource:Base de dados ui.facets.ActivityLogEntry.actionComponent.com.databasepreservation.common.api.v1.FileResource:Ficheiros +ui.facets.ActivityLogEntry.actionComponent.com.databasepreservation.common.api.v1.ExportsResource:Exportação +ui.facets.ActivityLogEntry.actionComponent.com.databasepreservation.common.api.v1.LobsResource:LOBs ui.facets.ActivityLogEntry.actionComponent.com.databasepreservation.common.api.v1.SIARDResource:SIARD ui.facets.ActivityLogEntry.actionComponent.com.databasepreservation.common.api.v1.SearchResource:Pesquisas guardadas ui.facets.ActivityLogEntry.actionComponent.com.databasepreservation.common.server.controller.UserLoginController:Sessão \ No newline at end of file diff --git a/src/main/resources/config/i18n/client/ClientMessages.properties b/src/main/resources/config/i18n/client/ClientMessages.properties index 97172b50b..7e0ab281e 100644 --- a/src/main/resources/config/i18n/client/ClientMessages.properties +++ b/src/main/resources/config/i18n/client/ClientMessages.properties @@ -909,6 +909,8 @@ activityLogComponent[com.databasepreservation.common.api.v1.DatabaseResource]=Da activityLogComponent[com.databasepreservation.common.api.v1.FileResource]=File activityLogComponent[com.databasepreservation.common.api.v1.SIARDResource]=SIARD activityLogComponent[com.databasepreservation.common.api.v1.SearchResource]=Saved searches +activityLogComponent[com.databasepreservation.common.api.v1.ExportsResource]=Export +activityLogComponent[com.databasepreservation.common.api.v1.LobsResource]=LOBs activityLogComponent[com.databasepreservation.common.server.controller.UserLoginController]=Login activityLogFilterName={0} activityLogFilterName[tableId]=Table diff --git a/src/main/resources/config/i18n/client/ClientMessages_pt_PT.properties b/src/main/resources/config/i18n/client/ClientMessages_pt_PT.properties index 047f1b02d..1395d84e3 100644 --- a/src/main/resources/config/i18n/client/ClientMessages_pt_PT.properties +++ b/src/main/resources/config/i18n/client/ClientMessages_pt_PT.properties @@ -736,6 +736,8 @@ activityLogComponent[com.databasepreservation.common.api.v1.DatabaseResource]=Ba activityLogComponent[com.databasepreservation.common.api.v1.FileResource]=Ficheiros activityLogComponent[com.databasepreservation.common.api.v1.SIARDResource]=SIARD activityLogComponent[com.databasepreservation.common.api.v1.SearchResource]=Pesquisas guardadas +activityLogComponent[com.databasepreservation.common.api.v1.ExportsResource]=Exportação +activityLogComponent[com.databasepreservation.common.api.v1.LobsResource]=LOBs activityLogComponent[com.databasepreservation.common.server.controller.UserLoginController]=Sessão activityLogFilterName={0} activityLogFilterName[tableId]=Tabela