diff --git a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/ConsistencyChecks.java b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/ConsistencyChecks.java index 439c348a835fdb13e2ec718adb7afa80b8dadf91..b76770dc3ddc98ace64d9e5b3c09496238bf1295 100644 --- a/TASMAN-core/src/main/java/it/inaf/ia2/tsm/ConsistencyChecks.java +++ b/TASMAN-core/src/main/java/it/inaf/ia2/tsm/ConsistencyChecks.java @@ -30,10 +30,8 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; import javax.sql.DataSource; import org.slf4j.Logger; @@ -50,6 +48,32 @@ public class ConsistencyChecks implements Serializable { private static final long serialVersionUID = 4412404312756740093L; private final static Logger LOG = LoggerFactory.getLogger(ConsistencyChecks.class); + public static class UnexistingColumn implements Serializable { + + private static final long serialVersionUID = -4898369878807200093L; + + private final String completeTableName; + private final String columnName; + + private UnexistingColumn(String completeTableName, String columnName) { + this.completeTableName = completeTableName; + this.columnName = columnName; + } + + public String getCompleteTableName() { + return completeTableName; + } + + public String getColumnName() { + return columnName; + } + + @Override + public String toString() { + return String.format("%s.%s", completeTableName, columnName); + } + } + public static class UnexistingKey implements Serializable { private static final long serialVersionUID = 7891439129072900628L; @@ -112,14 +136,14 @@ public class ConsistencyChecks implements Serializable { private final List<InconsistentValue> inconsistencies; private final Set<String> unexisingSchemas; private final Set<String> unexisingTables; - private final Map<String, String> unexisingColumns; + private final List<UnexistingColumn> unexistingColumns; private final List<UnexistingKey> unexistingKeys; public ConsistencyChecks() { inconsistencies = new ArrayList<>(); unexisingSchemas = new HashSet<>(); unexisingTables = new HashSet<>(); - unexisingColumns = new HashMap<>(); + unexistingColumns = new ArrayList<>(); unexistingKeys = new ArrayList<>(); } @@ -147,12 +171,12 @@ public class ConsistencyChecks implements Serializable { unexisingTables.add(schemaName + "." + tableSimpleName); } - public Map<String, String> getUnexisingColumns() { - return unexisingColumns; + public List<UnexistingColumn> getUnexisingColumns() { + return unexistingColumns; } public void addUnexistingColumn(String completeTableName, String columnName) { - unexisingColumns.put(completeTableName, columnName); + unexistingColumns.add(new UnexistingColumn(completeTableName, columnName)); } public void addUnexistingKey(String keyId, String fromTable, String[] fromColumns, String targetTable, String[] targetColumns) { @@ -183,7 +207,39 @@ public class ConsistencyChecks implements Serializable { } public boolean isInconsistent() { - return !inconsistencies.isEmpty() || !unexisingSchemas.isEmpty() || !unexisingTables.isEmpty() || !unexisingColumns.isEmpty(); + return !inconsistencies.isEmpty() || !unexisingSchemas.isEmpty() || !unexisingTables.isEmpty() || !unexistingColumns.isEmpty(); + } + + private void keysToRemoveFromUnexistingColumns(Connection conn, String tapSchemaNameEscaped, Set<String> keysToRemoveIds) throws SQLException { + for (UnexistingColumn unexistingColumn : unexistingColumns) { + + StringBuilder sb = new StringBuilder(); + sb.append("SELECT k.key_id AS key_id\n"); + sb.append("FROM "); + sb.append(tapSchemaNameEscaped); + sb.append(".`keys` k\n"); + sb.append("JOIN "); + sb.append(tapSchemaNameEscaped); + sb.append(".key_columns c ON k.key_id = c.key_id\n"); + sb.append("WHERE (k.from_table = ? AND c.from_column = ?) OR (k.target_table = ? AND c.target_column = ?)"); + + String query = sb.toString(); + + try (PreparedStatement ps = conn.prepareStatement(query)) { + ps.setString(1, unexistingColumn.getCompleteTableName()); + ps.setString(2, unexistingColumn.getColumnName()); + ps.setString(3, unexistingColumn.getCompleteTableName()); + ps.setString(4, unexistingColumn.getColumnName()); + + LOG.debug("Executing query {}", query); + + try (ResultSet rs = ps.executeQuery()) { + while (rs.next()) { + keysToRemoveIds.add(rs.getString("key_id")); + } + } + } + } } public void amendTapSchema(DBWrapper dbWrapper, TapSchema tapSchema) throws SQLException { @@ -205,27 +261,7 @@ public class ConsistencyChecks implements Serializable { keysToRemoveIds.addAll(getKeysToRemove(conn, tapSchemaNameEscaped, dbType, table)); } - for (Map.Entry<String, String> entry : unexisingColumns.entrySet()) { - query = "select k.key_id AS key_id\n" - + "FROM `keys` k\n" - + "JOIN key_columns c ON k.key_id = c.key_id\n" - + "WHERE (k.from_table = ? AND c.from_column = ?) OR (k.target_table = ? AND c.target_column = ?)"; - - try (PreparedStatement ps = conn.prepareStatement(query)) { - ps.setString(1, entry.getKey()); - ps.setString(2, entry.getValue()); - ps.setString(3, entry.getKey()); - ps.setString(4, entry.getValue()); - - LOG.debug("Executing query {}", query); - - try (ResultSet rs = ps.executeQuery()) { - while (rs.next()) { - keysToRemoveIds.add(rs.getString("key_id")); - } - } - } - } + keysToRemoveFromUnexistingColumns(conn, tapSchemaNameEscaped, keysToRemoveIds); for (UnexistingKey unexistingKey : unexistingKeys) { keysToRemoveIds.add(unexistingKey.getKeyId()); @@ -256,12 +292,12 @@ public class ConsistencyChecks implements Serializable { } // Removing all columns - for (Map.Entry<String, String> entry : unexisingColumns.entrySet()) { + for (UnexistingColumn unexistingColumn : unexistingColumns) { query = String.format("DELETE FROM %s.%s WHERE table_name = ? AND column_name = ?", tapSchemaNameEscaped, TSMUtil.escapeName("columns", dbType)); try (PreparedStatement ps = conn.prepareStatement(query)) { - ps.setString(1, entry.getKey()); - ps.setString(2, entry.getValue()); - LOG.debug("Executing query {} [{}, {}]", query, entry.getKey(), entry.getValue()); + ps.setString(1, unexistingColumn.getCompleteTableName()); + ps.setString(2, unexistingColumn.getColumnName()); + LOG.debug("Executing query {} [{}, {}]", query, unexistingColumn.getCompleteTableName(), unexistingColumn.getColumnName()); ps.executeUpdate(); } } diff --git a/TASMAN-webapp/src/main/webapp/resources/js/async-loader.js b/TASMAN-webapp/src/main/webapp/resources/js/async-loader.js index d3eda5743b6e3f609d90d642fae15f119d8a995b..25697d83c75f1396cb958eb1ad664d970f15c597 100644 --- a/TASMAN-webapp/src/main/webapp/resources/js/async-loader.js +++ b/TASMAN-webapp/src/main/webapp/resources/js/async-loader.js @@ -39,6 +39,11 @@ } } }, + reloadClicked: function (event) { + if (event.status === 'success') { + periodicCheck(); + } + }, tapSchemaCreationConfirmed: function (event) { if (event.status === 'success') { periodicCheck(); diff --git a/TASMAN-webapp/src/main/webapp/resources/js/common.js b/TASMAN-webapp/src/main/webapp/resources/js/common.js index 1ca96ade8fa890cdb6a844e6c077e22791b8b8eb..bedc21ee150122659183aaaa3f05dfeb4d00d837 100644 --- a/TASMAN-webapp/src/main/webapp/resources/js/common.js +++ b/TASMAN-webapp/src/main/webapp/resources/js/common.js @@ -88,6 +88,8 @@ }); // Setup loading animation + // Restore scroll position after JSF AJAX update + var windowScroll, columnsScroll; jsf.ajax.addOnEvent(function (data) { if ($(data.source).is('input[type="text"]') || $(data.source).is('[data-jsf-modal]')) { @@ -99,6 +101,12 @@ break; case "complete": hideWaiting(); + windowScroll = window.scrollY; + columnsScroll = $('.columns-selector').scrollTop(); + break; + case "success": + window.scrollY = windowScroll; + $('.columns-selector').scrollTop(columnsScroll); break; } }); diff --git a/TASMAN-webapp/src/main/webapp/resources/js/edit-tapschema.js b/TASMAN-webapp/src/main/webapp/resources/js/edit-tapschema.js index d90a385d09584a347ed692e1333b72021dc9f5fc..34cdd9c3a1e586c8baf8b0512c4db1ae0398def9 100644 --- a/TASMAN-webapp/src/main/webapp/resources/js/edit-tapschema.js +++ b/TASMAN-webapp/src/main/webapp/resources/js/edit-tapschema.js @@ -1,7 +1,5 @@ (function ($, TSM) { - var COLUMNS_COMPONENT_ID = 'main:columns-list'; - TSM.displayUpdateOperations = TSM.eventHandlerFactory(function (srcElement, jsupdate) { $('#updateOperationsModal').modal('show'); }); @@ -24,33 +22,6 @@ return false; }; - TSM.columnChanged = function (event) { - if (event.status === 'success') { - var $li = $(event.source).closest('li'); - $li.closest('ul').find('li').removeClass('active'); - $li.addClass('active'); - } - }; - - TSM.columnRemoved = TSM.eventHandlerFactory(function (srcElement, jsupdate) { - jsupdate = JSON.parse(jsupdate); - var $ul = $(srcElement).closest('ul'); - $(srcElement).closest('a').find('span').addClass('strikeout'); - $(srcElement).prop('disabled', true); - - if (jsupdate.selectedColumn !== undefined) { - $ul.find('li').removeClass('active'); - $ul.find('li:nth-child(' + (jsupdate.selectedColumn + 1) + ')').addClass('active'); - } - }, COLUMNS_COMPONENT_ID); - - TSM.columnRemovalUndo = TSM.eventHandlerFactory(function (srcElement, jsupdate) { - var $a = $('#main\\:columns-list\\:' + jsupdate + '\\:column-selector'); - $a.find('input').prop('disabled', false); - $a.find('.strikeout').removeClass('strikeout'); - $a.removeClass('strikeout'); - }, COLUMNS_COMPONENT_ID); - TSM.ucdTextKeyDown = function (event) { if (event.keyCode === 13) { $('#ucd_search_form\\:search_UCD_btn').click(); diff --git a/TASMAN-webapp/src/main/webapp/tapSchemaEditing.xhtml b/TASMAN-webapp/src/main/webapp/tapSchemaEditing.xhtml index d36e1dfd9d103aab558439ad44a2b83420ef3278..249dd99b73292dfcec26eb269e235d276f1455c9 100644 --- a/TASMAN-webapp/src/main/webapp/tapSchemaEditing.xhtml +++ b/TASMAN-webapp/src/main/webapp/tapSchemaEditing.xhtml @@ -40,7 +40,7 @@ <h:commandLink class="btn btn-info" action="#{tapSchemaEditing.reload()}" onclick="showWaiting()"> <span class="glyphicon glyphicon-refresh"></span> Reload all - <f:ajax execute="@form" render="@form" onevent="TSM.asyncLoader.startChecking" /> + <f:ajax execute="@form" render="@form" onevent="TSM.asyncLoader.reloadClicked" /> </h:commandLink> </div> <div class="col-sm-6 vpadding text-right"> @@ -49,12 +49,6 @@ Back </h:commandLink> <h:outputText value=" " /> - <ui:remove> - <h:commandLink class="btn btn-danger" action="#{tapSchemaEditing.logout()}"> - <span class="glyphicon glyphicon-log-out"></span> - Close session - </h:commandLink> - </ui:remove> </div> <div class="clearfix"></div> <br/> @@ -223,7 +217,7 @@ <li role="presentation" class="#{tapSchemaEditing.selectedColumn.name eq column.name ? 'active': ''}"> <h:commandLink role="tab" action="#{tapSchemaEditing.setSelectedColumn(column)}" id="column-selector"> <h:commandButton class="btn btn-link remove-btn" disabled="#{tapSchemaEditing.toRemove(column) or column.parent.parent.name eq tapSchemaEditing.tapSchema.name}" value="×" onclick="TSM.stopPropagation(event)" id="column-remover"> - <f:ajax execute="@form" render=":main:column_wrapper :main:columns_header" listener="#{tapSchemaEditing.removeColumn(column.name)}" onevent="TSM.columnRemoved" /> + <f:ajax execute="@form" render=":main:tables_wrapper" listener="#{tapSchemaEditing.removeColumn(column.name)}" /> </h:commandButton> <h:panelGroup rendered="#{column.primaryKey}"> @@ -237,7 +231,7 @@ </h:panelGroup> <span class="#{tapSchemaEditing.toRemove(column) ? 'strikeout':''}">#{column.name}</span> - <f:ajax execute="@form" render=":main:column_wrapper :main:columns_header" onevent="TSM.columnChanged" /> + <f:ajax execute="@form" render=":main:tables_wrapper" /> </h:commandLink> </li> </ui:repeat> @@ -251,7 +245,7 @@ This column will be removed on TAP Schema Update. <h:commandLink class="btn btn-primary pull-right" action="#{tapSchemaEditing.undoRemoveColumn()}"> Undo - <f:ajax execute="@form" render=":main:column_wrapper :main:columns_header" onevent="TSM.columnRemovalUndo" /> + <f:ajax execute="@form" render=":main:tables_wrapper" /> </h:commandLink> </div> </h:panelGroup>