/*- | |
* ============LICENSE_START======================================================= | |
* OSAM | |
* ================================================================================ | |
* Copyright (C) 2018 AT&T | |
* ================================================================================ | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
* ============LICENSE_END========================================================= | |
*/ | |
package org.onap.osam.services; | |
import jline.internal.Log; | |
import org.onap.osam.aai.AaiClientInterface; | |
import org.onap.osam.aai.AaiResponse; | |
import org.onap.osam.aai.ServiceSubscription; | |
import org.onap.osam.aai.Services; | |
import org.onap.osam.model.ModelConstants; | |
import org.onap.osam.model.Subscriber; | |
import org.onap.osam.model.SubscriberList; | |
import org.springframework.beans.factory.annotation.Autowired; | |
import org.springframework.stereotype.Service; | |
import java.util.HashMap; | |
@Service | |
public class RoleGenaratorServiceImpl implements IRoleGeneratorService { | |
public static final String ROLE_ID_COLUMN = "ROLE_ID"; | |
@Autowired | |
AaiClientInterface client; | |
public static final String DB_NAME = "vid_portal"; | |
public static final String TBL_NAME = "fn_role"; | |
public static final String TEMP_DELIMITER ="***"; | |
public static final String OLD_DELIMITER = "_"; | |
@Override | |
public String generateRoleScript(Boolean firstRun) { | |
String query = "USE " + DB_NAME + ";\r\n" + | |
"SET SQL_SAFE_UPDATES = 0;\r\n"; | |
try { | |
AaiResponse<SubscriberList> subscribers = client.getAllSubscribers(); | |
if (firstRun) { | |
query += replaceRolesToTempDelimiter("subscriber",buildSubscribersValuesForMappingsTable(subscribers.getT())); | |
} | |
query += addAvailableRolesCombination(firstRun, subscribers); | |
} | |
catch (Exception e) { | |
Log.error("There was an error in updating roles "+e.getMessage()); | |
} | |
return query; | |
} | |
private String addAvailableRolesCombination(Boolean firstRun, AaiResponse<SubscriberList> subscribers) { | |
String query, availableRoles=""; | |
HashMap<String,String> servicesNames = new HashMap<String,String>(); | |
for (Subscriber subscriber: subscribers.getT().customer) { | |
AaiResponse<Services> subscriberResponse = client.getSubscriberData(subscriber.globalCustomerId); | |
for(ServiceSubscription service: subscriberResponse.getT().serviceSubscriptions.serviceSubscription) { | |
servicesNames.put(service.serviceType,""); | |
String roleName = "'" + subscriber.subscriberName + ModelConstants.ROLE_DELIMITER + service.serviceType + "'"; | |
availableRoles += "("+roleName+"),"; | |
} | |
} | |
availableRoles = availableRoles.substring(0,availableRoles.length()-1); | |
query = createTemporaryTableAvailableRoles(availableRoles); | |
if (firstRun){ | |
query += replaceRolesToTempDelimiter("service",buildServicesValuesForMappingsTable(servicesNames)); | |
query += replaceToNewDelimiter(); | |
query += deleteWrongRecords(); | |
} | |
query += insertAvailableRolesToFnRole(); | |
query += dropTemporaryTable("available_roles"); | |
return query; | |
} | |
private String buildSubscribersValuesForMappingsTable(SubscriberList subscribers){ | |
String query=""; | |
for (Subscriber subscriber : subscribers.customer) { | |
String subscriberName = subscriber.subscriberName.contains(OLD_DELIMITER) ? subscriber.subscriberName.replace(OLD_DELIMITER, TEMP_DELIMITER) : subscriber.subscriberName; | |
query = query + "('" + subscriber.globalCustomerId + "','" + subscriberName + "') ,"; | |
} | |
if(query.length() > 0) | |
query = query.substring(0, query.length()-1) + ";\r\n"; | |
return query; | |
} | |
private String buildServicesValuesForMappingsTable(HashMap<String,String> servicesNames){ | |
final String[] query = {""}; | |
servicesNames.forEach((k,v)->{ | |
if (k.contains(OLD_DELIMITER)) { | |
query[0] += "('" + k + "' ,'" + k.replace(OLD_DELIMITER, TEMP_DELIMITER) +"'),"; | |
} | |
}); | |
if(query[0].length() > 0) | |
query[0] = query[0].substring(0, query[0].length()-1) + ";\r\n"; | |
return query[0]; | |
} | |
private String replaceRolesToTempDelimiter(String entityName, String valuesForMappingsTable ) { | |
AaiResponse<Services> services = client.getServices(); | |
String query = ""; | |
if (valuesForMappingsTable.length() > 0) { | |
query = "CREATE TEMPORARY TABLE IF NOT EXISTS " + entityName + "Mappings(mapKey VARCHAR(255),mapValue VARCHAR(255));\r\n" + | |
"INSERT INTO " + entityName + "Mappings VALUES "; | |
query += valuesForMappingsTable; | |
query += "UPDATE " + TBL_NAME + "\r\n" + | |
"INNER JOIN " + entityName + "Mappings ON role_name LIKE concat('%',mapKey, '%')\r\n" + | |
"SET ROLE_NAME = REPLACE(ROLE_NAME, mapKey, mapValue) ; \r\n" + | |
dropTemporaryTable(entityName + "Mappings"); | |
} | |
return query; | |
} | |
private String replaceToNewDelimiter(){ | |
String query = "UPDATE " + TBL_NAME + "\r\n" + | |
"SET ROLE_NAME = REPLACE(ROLE_NAME, '" + OLD_DELIMITER + "', '" + ModelConstants.ROLE_DELIMITER + "');\r\n" ; | |
query += "UPDATE fn_role\r\n" + | |
"SET ROLE_NAME = REPLACE(ROLE_NAME, '" + TEMP_DELIMITER + "', '" + OLD_DELIMITER + "');\r\n" ; | |
return query; | |
} | |
private String insertAvailableRolesToFnRole(){ | |
String query="INSERT INTO fn_role (ROLE_NAME, ACTIVE_YN, PRIORITY)\r\n" + | |
"SELECT RNAME, 'Y', 5\r\n" + | |
"FROM available_roles\r\n" + | |
"WHERE NOT EXISTS (SELECT ROLE_NAME\r\n" + | |
"FROM fn_role \r\n" + | |
"where RNAME = ROLE_NAME);\r\n"; | |
return query; | |
} | |
private String createTemporaryTableAvailableRoles(String availableRoles) { | |
String query = "CREATE TEMPORARY TABLE IF NOT EXISTS available_roles(rname VARCHAR(255));\r\n"; | |
query += "INSERT INTO available_roles VALUES "+availableRoles+";\r\n"; | |
return query; | |
} | |
private String deleteWrongRecords(){ | |
String query ="CREATE TEMPORARY TABLE IF NOT EXISTS wrong_roles(roleID INT);\r\n" + | |
"INSERT INTO wrong_roles (roleID)\r\n" + | |
"SELECT ROLE_ID FROM fn_role LEFT JOIN available_roles ON role_name LIKE concat(rname, '%')\r\n" + | |
"WHERE available_roles.rname IS NULL AND ROLE_ID NOT IN (1,16);\r\n"; | |
query += deleteCascade(); | |
query += dropTemporaryTable("wrong_roles"); | |
return query; | |
} | |
private String deleteCascade() { | |
String query = deleteFromTableByRoles("fn_role_composite", "PARENT_ROLE_ID"); | |
query = query.substring(0, query.length()-1); | |
query += " OR wrong_roles.ROLEID = fn_role_composite.CHILD_ROLE_ID;\r\n"; | |
query += deleteFromTableByRoles("fn_role_function", ROLE_ID_COLUMN)+ "\r\n"; | |
query += deleteFromTableByRoles("fn_user_role", ROLE_ID_COLUMN)+ "\r\n"; | |
query += deleteFromTableByRoles(TBL_NAME, ROLE_ID_COLUMN)+ "\r\n"; | |
return query; | |
} | |
private String deleteFromTableByRoles(String table, String column) { | |
String query = "DELETE FROM " + table + "\r\n"; | |
query += "using " + table + " inner join wrong_roles\r\n" + | |
"where wrong_roles.ROLEID = " + table + "." + column + ";"; | |
return query; | |
} | |
private String dropTemporaryTable(String table) { | |
return "DROP TEMPORARY TABLE IF EXISTS " + table + ";\r\n"; | |
} | |
} |