Merge 1806 code of vid-common
[vid.git] / vid-app-common / src / main / java / org / onap / vid / services / RoleGenaratorServiceImpl.java
1 package org.onap.vid.services;
2
3 import jline.internal.Log;
4 import org.onap.vid.aai.AaiClientInterface;
5 import org.onap.vid.aai.AaiResponse;
6 import org.onap.vid.aai.ServiceSubscription;
7 import org.onap.vid.aai.Services;
8 import org.onap.vid.model.ModelConstants;
9 import org.onap.vid.model.Subscriber;
10 import org.onap.vid.model.SubscriberList;
11 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.stereotype.Service;
13
14 import java.util.HashMap;
15
16 @Service
17 public class RoleGenaratorServiceImpl implements RoleGeneratorService {
18
19     public static final String ROLE_ID_COLUMN = "ROLE_ID";
20     @Autowired
21     AaiClientInterface client;
22
23     public static final String DB_NAME =  "vid_portal";
24     public static final String TBL_NAME = "fn_role";
25     public static final String TEMP_DELIMITER ="***";
26     public static final String OLD_DELIMITER = "_";
27
28     @Override
29     public String generateRoleScript(Boolean firstRun) {
30         String query =  "USE " + DB_NAME + ";\r\n" +
31                 "SET SQL_SAFE_UPDATES = 0;\r\n";
32         try {
33             AaiResponse<SubscriberList> subscribers = client.getAllSubscribers();
34             if (firstRun) {
35                 query += replaceRolesToTempDelimiter("subscriber",buildSubscribersValuesForMappingsTable(subscribers.getT()));
36             }
37             query += addAvailableRolesCombination(firstRun, subscribers);
38
39         }
40         catch (Exception e) {
41             Log.error("There was an error in updating roles "+e.getMessage());
42         }
43         return query;
44     }
45
46     private String addAvailableRolesCombination(Boolean firstRun, AaiResponse<SubscriberList> subscribers) {
47         String query, availableRoles="";
48         HashMap<String,String> servicesNames = new HashMap<String,String>();
49         for (Subscriber subscriber: subscribers.getT().customer) {
50             AaiResponse<Services> subscriberResponse = client.getSubscriberData(subscriber.globalCustomerId);
51             for(ServiceSubscription service: subscriberResponse.getT().serviceSubscriptions.serviceSubscription) {
52                 servicesNames.put(service.serviceType,"");
53                 String roleName = "'" + subscriber.subscriberName + ModelConstants.ROLE_DELIMITER + service.serviceType + "'";
54                 availableRoles += "("+roleName+"),";
55
56
57             }
58         }
59         availableRoles = availableRoles.substring(0,availableRoles.length()-1);
60         query = createTemporaryTableAvailableRoles(availableRoles);
61         if (firstRun){
62             query += replaceRolesToTempDelimiter("service",buildServicesValuesForMappingsTable(servicesNames));
63             query += replaceToNewDelimiter();
64             query += deleteWrongRecords();
65
66         }
67         query += insertAvailableRolesToFnRole();
68         query += dropTemporaryTable("available_roles");
69         return query;
70     }
71
72     private String buildSubscribersValuesForMappingsTable(SubscriberList subscribers){
73         String query="";
74         for (Subscriber subscriber : subscribers.customer) {
75             String subscriberName = subscriber.subscriberName.contains(OLD_DELIMITER) ? subscriber.subscriberName.replace(OLD_DELIMITER, TEMP_DELIMITER) : subscriber.subscriberName;
76             query = query + "('" + subscriber.globalCustomerId + "','" + subscriberName + "') ,";
77         }
78         if(query.length() > 0)
79             query = query.substring(0, query.length()-1) + ";\r\n";
80         return query;
81     }
82
83     private String buildServicesValuesForMappingsTable(HashMap<String,String> servicesNames){
84         final String[] query = {""};
85         servicesNames.forEach((k,v)->{
86             if (k.contains(OLD_DELIMITER)) {
87                 query[0] += "('" + k + "' ,'" + k.replace(OLD_DELIMITER, TEMP_DELIMITER) +"'),";
88             }
89         });
90         if(query[0].length() > 0)
91             query[0] = query[0].substring(0, query[0].length()-1) + ";\r\n";
92         return query[0];
93     }
94
95     private String replaceRolesToTempDelimiter(String entityName, String valuesForMappingsTable ) {
96
97         AaiResponse<Services> services = client.getServices();
98         String query = "";
99         if (valuesForMappingsTable.length() > 0) {
100             query = "CREATE TEMPORARY TABLE IF NOT EXISTS " + entityName + "Mappings(mapKey VARCHAR(255),mapValue VARCHAR(255));\r\n" +
101                     "INSERT INTO " + entityName + "Mappings VALUES ";
102             query += valuesForMappingsTable;
103             query += "UPDATE " + TBL_NAME + "\r\n" +
104                     "INNER JOIN " + entityName + "Mappings ON role_name LIKE concat('%',mapKey, '%')\r\n" +
105                     "SET ROLE_NAME = REPLACE(ROLE_NAME, mapKey, mapValue) ;  \r\n" +
106                     dropTemporaryTable(entityName + "Mappings");
107         }
108         return query;
109     }
110
111     private String replaceToNewDelimiter(){
112         String query =  "UPDATE " + TBL_NAME + "\r\n" +
113                 "SET ROLE_NAME = REPLACE(ROLE_NAME, '" + OLD_DELIMITER + "', '" + ModelConstants.ROLE_DELIMITER + "');\r\n" ;
114         query += "UPDATE fn_role\r\n" +
115                 "SET ROLE_NAME = REPLACE(ROLE_NAME, '" + TEMP_DELIMITER + "', '" + OLD_DELIMITER + "');\r\n" ;
116         return query;
117     }
118
119     private String insertAvailableRolesToFnRole(){
120         String query="INSERT INTO fn_role (ROLE_NAME, ACTIVE_YN, PRIORITY)\r\n" +
121                 "SELECT RNAME, 'Y', 5\r\n" +
122                 "FROM available_roles\r\n" +
123                 "WHERE NOT EXISTS (SELECT ROLE_NAME\r\n" +
124                 "FROM fn_role \r\n" +
125                 "where RNAME = ROLE_NAME);\r\n";
126         return query;
127     }
128
129
130
131     private String createTemporaryTableAvailableRoles(String availableRoles) {
132         String query = "CREATE TEMPORARY TABLE IF NOT EXISTS available_roles(rname VARCHAR(255));\r\n";
133         query += "INSERT INTO available_roles VALUES "+availableRoles+";\r\n";
134                 return query;
135     }
136
137     private String deleteWrongRecords(){
138         String query ="CREATE TEMPORARY TABLE IF NOT EXISTS wrong_roles(roleID INT);\r\n" +
139                 "INSERT INTO wrong_roles (roleID)\r\n" +
140                 "SELECT ROLE_ID FROM fn_role LEFT JOIN available_roles ON role_name LIKE concat(rname, '%')\r\n" +
141                 "WHERE available_roles.rname IS NULL AND ROLE_ID NOT IN (1,16);\r\n";
142         query += deleteCascade();
143         query += dropTemporaryTable("wrong_roles");
144         return query;
145     }
146
147     private String deleteCascade() {
148         String query = deleteFromTableByRoles("fn_role_composite", "PARENT_ROLE_ID");
149         query = query.substring(0, query.length()-1);
150         query += " OR wrong_roles.ROLEID = fn_role_composite.CHILD_ROLE_ID;\r\n";
151         query += deleteFromTableByRoles("fn_role_function", ROLE_ID_COLUMN)+ "\r\n";
152         query += deleteFromTableByRoles("fn_user_role", ROLE_ID_COLUMN)+ "\r\n";
153         query += deleteFromTableByRoles(TBL_NAME, ROLE_ID_COLUMN)+ "\r\n";
154         return query;
155     }
156
157     private String deleteFromTableByRoles(String table, String column) {
158         String query = "DELETE FROM " + table + "\r\n";
159         query += "using  " + table + " inner join wrong_roles\r\n" +
160                 "where wrong_roles.ROLEID = " + table + "." + column + ";";
161         return query;
162     }
163
164     private String dropTemporaryTable(String table) {
165         return "DROP TEMPORARY TABLE IF EXISTS " + table + ";\r\n";
166     }
167 }