Loading TASMAN-core/src/main/java/it/inaf/ia2/tsm/ConsistencyChecks.java +69 −33 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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<>(); } Loading Loading @@ -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) { Loading Loading @@ -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 { Loading @@ -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()); Loading Loading @@ -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(); } } Loading TASMAN-webapp/src/main/webapp/resources/js/async-loader.js +5 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,11 @@ } } }, reloadClicked: function (event) { if (event.status === 'success') { periodicCheck(); } }, tapSchemaCreationConfirmed: function (event) { if (event.status === 'success') { periodicCheck(); Loading TASMAN-webapp/src/main/webapp/resources/js/common.js +8 −0 Original line number Diff line number Diff line Loading @@ -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]')) { Loading @@ -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; } }); Loading TASMAN-webapp/src/main/webapp/resources/js/edit-tapschema.js +0 −29 Original line number Diff line number Diff line (function ($, TSM) { var COLUMNS_COMPONENT_ID = 'main:columns-list'; TSM.displayUpdateOperations = TSM.eventHandlerFactory(function (srcElement, jsupdate) { $('#updateOperationsModal').modal('show'); }); Loading @@ -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(); Loading TASMAN-webapp/src/main/webapp/tapSchemaEditing.xhtml +4 −10 Original line number Diff line number Diff line Loading @@ -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"> Loading @@ -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/> Loading Loading @@ -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}"> Loading @@ -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> Loading @@ -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> Loading Loading
TASMAN-core/src/main/java/it/inaf/ia2/tsm/ConsistencyChecks.java +69 −33 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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<>(); } Loading Loading @@ -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) { Loading Loading @@ -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 { Loading @@ -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()); Loading Loading @@ -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(); } } Loading
TASMAN-webapp/src/main/webapp/resources/js/async-loader.js +5 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,11 @@ } } }, reloadClicked: function (event) { if (event.status === 'success') { periodicCheck(); } }, tapSchemaCreationConfirmed: function (event) { if (event.status === 'success') { periodicCheck(); Loading
TASMAN-webapp/src/main/webapp/resources/js/common.js +8 −0 Original line number Diff line number Diff line Loading @@ -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]')) { Loading @@ -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; } }); Loading
TASMAN-webapp/src/main/webapp/resources/js/edit-tapschema.js +0 −29 Original line number Diff line number Diff line (function ($, TSM) { var COLUMNS_COMPONENT_ID = 'main:columns-list'; TSM.displayUpdateOperations = TSM.eventHandlerFactory(function (srcElement, jsupdate) { $('#updateOperationsModal').modal('show'); }); Loading @@ -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(); Loading
TASMAN-webapp/src/main/webapp/tapSchemaEditing.xhtml +4 −10 Original line number Diff line number Diff line Loading @@ -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"> Loading @@ -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/> Loading Loading @@ -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}"> Loading @@ -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> Loading @@ -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> Loading