diff --git a/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/constant/ActionMgtSQLConstants.java b/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/constant/ActionMgtSQLConstants.java index 1abd8cbbd89e..af510c559057 100644 --- a/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/constant/ActionMgtSQLConstants.java +++ b/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/constant/ActionMgtSQLConstants.java @@ -42,6 +42,7 @@ public static class Column { public static final String ACTION_PROPERTIES_UUID = "ACTION_UUID"; public static final String ACTION_PROPERTIES_PROPERTY_NAME = "PROPERTY_NAME"; public static final String ACTION_PROPERTIES_PROPERTY_VALUE = "PROPERTY_VALUE"; + public static final String ACTION_PROPERTIES_PRIMITIVE_VALUE = "PRIMITIVE_VALUE"; public static final String TENANT_ID = "TENANT_ID"; private Column() { @@ -58,11 +59,11 @@ public static class Query { "DESCRIPTION, STATUS, TENANT_ID, VERSION) VALUES (:UUID;, :TYPE;, :NAME;, :DESCRIPTION;, :STATUS;, " + ":TENANT_ID;, :VERSION;)"; public static final String ADD_ACTION_PROPERTIES = "INSERT INTO IDN_ACTION_PROPERTIES (ACTION_UUID, " + - "PROPERTY_NAME, PROPERTY_VALUE, TENANT_ID) VALUES (:ACTION_UUID;, :PROPERTY_NAME;, :PROPERTY_VALUE;, " + - ":TENANT_ID;)"; + "PROPERTY_NAME, PRIMITIVE_VALUE, TENANT_ID) VALUES (:ACTION_UUID;, :PROPERTY_NAME;, " + + ":PRIMITIVE_VALUE;, :TENANT_ID;)"; public static final String GET_ACTION_BASIC_INFO_BY_ID = "SELECT TYPE, NAME, DESCRIPTION, STATUS FROM " + "IDN_ACTION WHERE TYPE = :TYPE; AND UUID = :UUID; AND TENANT_ID = :TENANT_ID;"; - public static final String GET_ACTION_PROPERTIES_INFO_BY_ID = "SELECT PROPERTY_NAME, PROPERTY_VALUE FROM " + + public static final String GET_ACTION_PROPERTIES_INFO_BY_ID = "SELECT PROPERTY_NAME, PRIMITIVE_VALUE FROM " + "IDN_ACTION_PROPERTIES WHERE ACTION_UUID = :ACTION_UUID; AND TENANT_ID = :TENANT_ID;"; public static final String GET_ACTIONS_BASIC_INFO_BY_ACTION_TYPE = "SELECT UUID, TYPE, NAME, DESCRIPTION," + " STATUS FROM IDN_ACTION WHERE TYPE = :TYPE; AND TENANT_ID = :TENANT_ID;"; @@ -77,9 +78,20 @@ public static class Query { public static final String GET_ACTIONS_COUNT_PER_ACTION_TYPE = "SELECT TYPE, COUNT(UUID) AS COUNT" + " FROM IDN_ACTION WHERE TENANT_ID = :TENANT_ID; GROUP BY TYPE"; public static final String UPDATE_ACTION_PROPERTY = "UPDATE IDN_ACTION_PROPERTIES SET " + - "PROPERTY_VALUE = :PROPERTY_VALUE; WHERE ACTION_UUID = :ACTION_UUID; AND " + + "PRIMITIVE_VALUE = :PRIMITIVE_VALUE; WHERE ACTION_UUID = :ACTION_UUID; AND " + "TENANT_ID = :TENANT_ID; AND PROPERTY_NAME = :PROPERTY_NAME;"; + //TODO: Adding following queries to support existing schema. Should be removed once the PROPERTY_VALUE column + // name to PRIMITIVE_TYPE schema change is deployed. + public static final String ADD_ACTION_PROPERTIES_WITH_PROPERTY_VALUE_COLUMN = "INSERT INTO " + + "IDN_ACTION_PROPERTIES (ACTION_UUID, PROPERTY_NAME, PROPERTY_VALUE, TENANT_ID) VALUES " + + "(:ACTION_UUID;, :PROPERTY_NAME;, :PROPERTY_VALUE;, :TENANT_ID;)"; + public static final String GET_ACTION_PROPERTIES_INFO_BY_ID_WITH_PROPERTY_VALUE_COLUMN = "SELECT " + + "PROPERTY_NAME, PROPERTY_VALUE FROM IDN_ACTION_PROPERTIES WHERE ACTION_UUID = :ACTION_UUID; AND " + + "TENANT_ID = :TENANT_ID;"; + public static final String UPDATE_ACTION_PROPERTY_WITH_PROPERTY_VALUE_COLUMN = "UPDATE IDN_ACTION_PROPERTIES " + + "SET PROPERTY_VALUE = :PROPERTY_VALUE; WHERE ACTION_UUID = :ACTION_UUID; AND " + + "TENANT_ID = :TENANT_ID; AND PROPERTY_NAME = :PROPERTY_NAME;"; private Query() { } diff --git a/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/dao/impl/ActionManagementDAOImpl.java b/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/dao/impl/ActionManagementDAOImpl.java index 6bdbbbe61720..c26b19a03f6d 100644 --- a/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/dao/impl/ActionManagementDAOImpl.java +++ b/components/action-mgt/org.wso2.carbon.identity.action.management/src/main/java/org/wso2/carbon/identity/action/management/internal/dao/impl/ActionManagementDAOImpl.java @@ -184,7 +184,6 @@ public Map getActionsCountPerType(Integer tenantId) throws Acti resultSet.getInt(ActionMgtSQLConstants.Column.ACTION_COUNT)); return null; }, statement -> statement.setInt(ActionMgtSQLConstants.Column.TENANT_ID, tenantId))); - return actionTypesCountMap; } catch (TransactionException e) { throw new ActionMgtServerException("Error while retrieving Actions count per Action Type from the system.", @@ -581,21 +580,30 @@ private void addActionPropertiesToDB(String actionId, Map action throws TransactionException { NamedJdbcTemplate jdbcTemplate = new NamedJdbcTemplate(IdentityDatabaseUtil.getDataSource()); - jdbcTemplate.withTransaction(template -> { - template.executeBatchInsert(ActionMgtSQLConstants.Query.ADD_ACTION_PROPERTIES, - statement -> { - for (Map.Entry property : actionProperties.entrySet()) { - statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_UUID, actionId); - statement.setInt(ActionMgtSQLConstants.Column.TENANT_ID, tenantId); - statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_NAME, - property.getKey()); - statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_VALUE, - property.getValue()); - statement.addBatch(); - } - }, null); - return null; - }); + try { + boolean primitiveValueColumnExists = isPrimitiveValueColumnExists(); + String query = primitiveValueColumnExists ? ActionMgtSQLConstants.Query.ADD_ACTION_PROPERTIES + : ActionMgtSQLConstants.Query.ADD_ACTION_PROPERTIES_WITH_PROPERTY_VALUE_COLUMN; + jdbcTemplate.withTransaction(template -> { + template.executeBatchInsert(query, + statement -> { + for (Map.Entry property : actionProperties.entrySet()) { + statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_UUID, actionId); + statement.setInt(ActionMgtSQLConstants.Column.TENANT_ID, tenantId); + statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_NAME, + property.getKey()); + statement.setString(primitiveValueColumnExists ? + ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PRIMITIVE_VALUE : + ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_VALUE, + property.getValue()); + statement.addBatch(); + } + }, null); + return null; + }); + } catch (SQLException e) { + throw new TransactionException("Error while adding Action Properties in the system.", e); + } } /** @@ -610,13 +618,19 @@ private Map getActionPropertiesFromDB(String actionId, Integer t NamedJdbcTemplate jdbcTemplate = new NamedJdbcTemplate(IdentityDatabaseUtil.getDataSource()); Map actionEndpointProperties = new HashMap<>(); + try { + boolean primitiveValueColumnExists = isPrimitiveValueColumnExists(); + String query = primitiveValueColumnExists ? ActionMgtSQLConstants.Query.GET_ACTION_PROPERTIES_INFO_BY_ID + : ActionMgtSQLConstants.Query.GET_ACTION_PROPERTIES_INFO_BY_ID_WITH_PROPERTY_VALUE_COLUMN; jdbcTemplate.withTransaction(template -> - template.executeQuery(ActionMgtSQLConstants.Query.GET_ACTION_PROPERTIES_INFO_BY_ID, + template.executeQuery(query, (resultSet, rowNumber) -> { actionEndpointProperties.put( resultSet.getString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_NAME), - resultSet.getString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_VALUE)); + resultSet.getString(primitiveValueColumnExists ? + ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PRIMITIVE_VALUE : + ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_VALUE)); return null; }, statement -> { @@ -625,7 +639,7 @@ private Map getActionPropertiesFromDB(String actionId, Integer t })); return actionEndpointProperties; - } catch (TransactionException e) { + } catch (TransactionException | SQLException e) { throw new ActionMgtServerException("Error while retrieving Action Properties from the system.", e); } } @@ -642,19 +656,28 @@ private void updateActionPropertiesInDB(String actionId, Map upd Integer tenantId) throws TransactionException { NamedJdbcTemplate jdbcTemplate = new NamedJdbcTemplate(IdentityDatabaseUtil.getDataSource()); - jdbcTemplate.withTransaction(template -> - template.executeBatchInsert(ActionMgtSQLConstants.Query.UPDATE_ACTION_PROPERTY, - statement -> { - for (Map.Entry property : updatingProperties.entrySet()) { - statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_VALUE, - property.getValue()); - statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_NAME, - property.getKey()); - statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_UUID, actionId); - statement.setInt(ActionMgtSQLConstants.Column.TENANT_ID, tenantId); - statement.addBatch(); - } - }, null)); + try { + boolean primitiveValueColumnExists = isPrimitiveValueColumnExists(); + String query = primitiveValueColumnExists ? ActionMgtSQLConstants.Query.UPDATE_ACTION_PROPERTY + : ActionMgtSQLConstants.Query.UPDATE_ACTION_PROPERTY_WITH_PROPERTY_VALUE_COLUMN; + jdbcTemplate.withTransaction(template -> + template.executeBatchInsert(query, + statement -> { + for (Map.Entry property : updatingProperties.entrySet()) { + statement.setString(primitiveValueColumnExists ? + ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PRIMITIVE_VALUE : + ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_VALUE, + property.getValue()); + statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_PROPERTY_NAME, + property.getKey()); + statement.setString(ActionMgtSQLConstants.Column.ACTION_PROPERTIES_UUID, actionId); + statement.setInt(ActionMgtSQLConstants.Column.TENANT_ID, tenantId); + statement.addBatch(); + } + }, null)); + } catch (SQLException e) { + throw new TransactionException("Error while updating Action Properties in the system.", e); + } } /** @@ -714,4 +737,21 @@ private ActionDTO changeActionStatus(String actionType, String actionId, String throw new ActionMgtServerException("Error while updating Action Status to " + status, e); } } + + /** + * Check whether the PRITMITIVE_VALUE column exists in IDN_ACTION_PROPERTIES table. + * TODO: Remove this temporary method once the column name is changed. + * + * @return True if the column exists, False otherwise. + * @throws SQLException If an error occurs while checking the table existence. + */ + private boolean isPrimitiveValueColumnExists() throws SQLException { + + try (Connection connection = IdentityDatabaseUtil.getDBConnection(false); + ResultSet resultSet = connection.getMetaData().getColumns(null, null, + "IDN_ACTION_PROPERTIES", "PRIMITIVE_VALUE")) { + return resultSet.next(); + } + } + }