source: branches/work_304/lists/ARRoleList.cpp @ 460

Revision 460, 8.8 KB checked in by jls17, 6 years ago (diff)
  • fixed: modified date of role wasn't loaded correctly
Line 
1//Copyright (C) 2011 John Luthgers | jls17
2//
3//This file is part of ARInside.
4//
5//    ARInside is free software: you can redistribute it and/or modify
6//    it under the terms of the GNU General Public License as published by
7//    the Free Software Foundation, version 2 of the License.
8//
9//    ARInside is distributed in the hope that it will be useful,
10//    but WITHOUT ANY WARRANTY; without even the implied warranty of
11//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12//    GNU General Public License for more details.
13//
14//    You should have received a copy of the GNU General Public License
15//    along with ARInside.  If not, see <http://www.gnu.org/licenses/>.
16
17#include "stdafx.h"
18#include "ARRoleList.h"
19#include "../ARInside.h"
20#include "../AppConfig.h"
21#include "../core/ARStatusList.h"
22
23void GetGroupStringAsVector(const char* groupStr, vector<int>& addToGroupList)
24{
25        const char* curPos = groupStr;
26        if (curPos != NULL)
27        {
28                do
29                {
30                        int groupId = atoi(curPos);
31                        addToGroupList.push_back(groupId);
32                        curPos = strchr(curPos,';');
33                        if (curPos != NULL) ++curPos;
34                } while ( curPos != NULL && curPos[0] != 0);
35        }
36        std::sort(addToGroupList.begin(), addToGroupList.end());
37        addToGroupList.erase(unique(addToGroupList.begin(), addToGroupList.end()), addToGroupList.end());
38}
39
40CARRoleList::CARRoleList(void)
41{
42        ARZeroMemory(&owners);
43        ARZeroMemory(&changedUsers);
44}
45
46CARRoleList::~CARRoleList(void)
47{
48        if (owners.nameList != NULL)
49                delete[] owners.nameList;
50
51        if (changedUsers.nameList != NULL)
52                delete[] changedUsers.nameList;
53}
54
55bool CARRoleList::LoadFromServer()
56{
57        bool result = false;
58        try
59        {
60                CARInside* arIn = CARInside::GetInstance();
61                AppConfig &appConfig = arIn->appConfig;
62
63                ARQualifierStruct       qualifier;
64                ARStatusList status; ARZeroMemory(&status);
65
66                ARNameType schemaName;
67                strncpy(schemaName, appConfig.roleForm.c_str(), AR_MAX_NAME_SIZE);
68
69                char *qualString;
70                qualString = new char[appConfig.roleQuery.size() + 1];
71                strcpy(qualString, appConfig.roleQuery.c_str());
72
73                AREntryListFieldList fields;
74                AREntryListFieldValueList values;
75
76                fields.numItems = 10;
77                fields.fieldsList = new AREntryListFieldStruct[fields.numItems];
78                memset(fields.fieldsList,0,sizeof(AREntryListFieldStruct)*fields.numItems);
79
80                int pos = 0;
81                fields.fieldsList[pos++].fieldId = AR_RESERV_ROLE_MAPPING_APPLICATION; //ApplicationName
82                fields.fieldsList[pos++].fieldId = AR_RESERV_ROLE_MAPPING_ROLE_NAME;   //RoleName
83                fields.fieldsList[pos++].fieldId = AR_RESERV_ROLE_MAPPING_ROLE_ID;     //RoleID
84                fields.fieldsList[pos++].fieldId = AR_RESERV_APP_STATE_TEST;           //GroupName Test
85                fields.fieldsList[pos++].fieldId = AR_RESERV_APP_STATE_PRODUCTION;     //GroupName Production
86                fields.fieldsList[pos++].fieldId = AR_CORE_SUBMITTER;                  //CreatedBy
87                fields.fieldsList[pos++].fieldId = AR_CORE_CREATE_DATE;                //Created
88                fields.fieldsList[pos++].fieldId = AR_CORE_LAST_MODIFIED_BY;           //ModifiedBy
89                fields.fieldsList[pos++].fieldId = AR_CORE_MODIFIED_DATE;              //Modified
90                fields.numItems = pos;
91
92                for (unsigned int k=0; k<fields.numItems; ++k) { fields.fieldsList[k].columnWidth=1; fields.fieldsList[k].separator[0]='|'; }
93
94                if(ARLoadARQualifierStruct(&arIn->arControl, 
95                        schemaName,
96                        NULL,
97                        qualString,
98                        &qualifier,
99                        &status) == AR_RETURN_OK)
100                {
101                        if (ARGetListEntryWithFields(
102                                &arIn->arControl,
103                                schemaName,
104                                &qualifier,
105                                &fields,
106                                NULL,0,0,0,
107                                &values,
108                                0,&status) == AR_RETURN_OK)
109                        {
110                                Reserve(values.numItems);
111
112                                for (unsigned int row=0; row<values.numItems; ++row)
113                                {
114                                        if (values.entryList[row].entryValues->numItems != fields.numItems)
115                                                continue;
116
117                                        AREntryIdList& entryId = values.entryList[row].entryId;
118                                        ARFieldValueList& value = *values.entryList[row].entryValues;
119
120                                        sortedList.push_back(static_cast<int>(requestId.size()));
121                                        requestId.push_back((entryId.numItems == 1 ? entryId.entryIdList[0] : ""));
122
123                                        for (unsigned int curFieldPos = 0; curFieldPos != value.numItems; ++curFieldPos)
124                                        {
125                                                switch (value.fieldValueList[curFieldPos].fieldId)
126                                                {
127                                                case AR_RESERV_ROLE_MAPPING_APPLICATION:
128                                                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_CHAR)
129                                                                applicationName.push_back(value.fieldValueList[curFieldPos].value.u.charVal);
130                                                        break;
131                                                case AR_RESERV_ROLE_MAPPING_ROLE_NAME:
132                                                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_CHAR)
133                                                                names.push_back(value.fieldValueList[curFieldPos].value.u.charVal);
134                                                        break;
135                                                case AR_RESERV_ROLE_MAPPING_ROLE_ID:
136                                                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_INTEGER)
137                                                                roleId.push_back(value.fieldValueList[curFieldPos].value.u.intVal);
138                                                        break;
139                                                case AR_RESERV_APP_STATE_TEST:
140                                                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_CHAR)
141                                                        {
142                                                                vector<int> gids;
143                                                                GetGroupStringAsVector(value.fieldValueList[curFieldPos].value.u.charVal, gids);
144                                                                groupsTest.push_back(gids);
145                                                        }
146                                                        break;
147                                                case AR_RESERV_APP_STATE_PRODUCTION:
148                                                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_CHAR)
149                                                        {
150                                                                vector<int> gids;
151                                                                GetGroupStringAsVector(value.fieldValueList[curFieldPos].value.u.charVal, gids);
152                                                                groupsProd.push_back(gids);
153                                                        }
154                                                        break;
155                                                case AR_CORE_SUBMITTER:
156                                                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_CHAR)
157                                                        {
158                                                                int index = owners.numItems++;
159                                                                strncpy(owners.nameList[index], value.fieldValueList[curFieldPos].value.u.charVal, AR_MAX_ACCESS_NAME_SIZE);
160                                                                owners.nameList[index][AR_MAX_ACCESS_NAME_SIZE] = 0;
161                                                        }
162                                                        break;
163                                                case AR_CORE_CREATE_DATE:
164                                                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_TIME)
165                                                                createDate.push_back(value.fieldValueList[curFieldPos].value.u.dateVal);
166                                                        break;
167                                                case AR_CORE_LAST_MODIFIED_BY:
168                                                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_CHAR)
169                                                        {
170                                                                int index = changedUsers.numItems++;
171                                                                strncpy(changedUsers.nameList[index], value.fieldValueList[curFieldPos].value.u.charVal, AR_MAX_ACCESS_NAME_SIZE);
172                                                                changedUsers.nameList[index][AR_MAX_ACCESS_NAME_SIZE] = 0;
173                                                        }
174                                                        break;
175                                                case AR_CORE_MODIFIED_DATE:
176                                                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_TIME)
177                                                                modifiedDate.push_back(value.fieldValueList[curFieldPos].value.u.dateVal);
178                                                        break;
179                                                }
180                                        }
181
182                                        if (names.size() < requestId.size()) names.resize(requestId.size());
183                                        if (applicationName.size() < requestId.size()) applicationName.resize(requestId.size());
184                                        if (roleId.size() < requestId.size()) roleId.resize(requestId.size());
185                                        if (groupsTest.size() < requestId.size()) groupsTest.resize(requestId.size());
186                                        if (groupsProd.size() < requestId.size()) groupsProd.resize(requestId.size());
187                                        if (createDate.size() < requestId.size()) createDate.resize(requestId.size());
188                                        if (modifiedDate.size() < requestId.size()) modifiedDate.resize(requestId.size());
189                                        while (owners.numItems < requestId.size()) { ARZeroMemory(owners.nameList[owners.numItems++]); }
190                                        while (changedUsers.numItems < requestId.size()) { ARZeroMemory(changedUsers.nameList[changedUsers.numItems++]); }
191
192                                        LOG << "Role '" << names.back() <<"' [OK]" << endl;     
193                                }
194                                FreeAREntryListFieldValueList(&values,false);
195                                Sort();
196                                result = true;
197                        }
198                        else // ARGetListEntryWithFields failed
199                        {
200                                cerr << BuildMessageAndFreeStatus(status);
201                        }
202                }
203                else // ARLoadARQualifierStruct failed
204                {
205                        cerr << BuildMessageAndFreeStatus(status);
206                }
207
208                delete[] fields.fieldsList;
209                delete[] qualString;
210        }
211        catch(exception& e)
212        {               
213                throw(AppException(e.what(), "Error loading roles.", "CARRoleList"));
214        }
215        return result;
216}
217
218void CARRoleList::Reserve(unsigned int count)
219{
220        requestId.reserve(count);
221        applicationName.reserve(count);
222        names.reserve(count);
223        roleId.reserve(count);
224        groupsTest.reserve(count);
225        groupsProd.reserve(count);
226        createDate.reserve(count);
227        modifiedDate.reserve(count);
228
229        owners.numItems = 0;
230        owners.nameList = new ARAccessNameType[count];
231
232        changedUsers.numItems = 0;
233        changedUsers.nameList = new ARAccessNameType[count];
234}
235
236int CARRoleList::Find(int iRoleId, const string& appName)
237{
238        unsigned int count = GetCount();
239        for (unsigned int i = 0; i < count; ++i)
240        {
241                if (roleId[sortedList[i]] == iRoleId && applicationName[sortedList[i]] == appName)
242                {
243                        return i;
244                }
245        }
246        return -1;
247}
248
249void CARRoleList::Sort()
250{
251        if (GetCount() > 0)
252        {
253                GenerateSortableList sortableContent(names);
254                std::sort(sortedList.begin(),sortedList.end(),SortByName(sortableContent));
255        }
256}
257
Note: See TracBrowser for help on using the repository browser.