source: branches/work_312/lists/ARRoleList.cpp @ 637

Revision 637, 8.7 KB checked in by jls17, 5 years ago (diff)
  • extracted some code block into separate method
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& rowValues = *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                                        StoreEntry(rowValues);
124
125                                        if (names.size() < requestId.size()) names.resize(requestId.size());
126                                        if (applicationName.size() < requestId.size()) applicationName.resize(requestId.size());
127                                        if (roleId.size() < requestId.size()) roleId.resize(requestId.size());
128                                        if (groupsTest.size() < requestId.size()) groupsTest.resize(requestId.size());
129                                        if (groupsProd.size() < requestId.size()) groupsProd.resize(requestId.size());
130                                        if (createDate.size() < requestId.size()) createDate.resize(requestId.size());
131                                        if (modifiedDate.size() < requestId.size()) modifiedDate.resize(requestId.size());
132                                        while (owners.numItems < requestId.size()) { ARZeroMemory(owners.nameList[owners.numItems++]); }
133                                        while (changedUsers.numItems < requestId.size()) { ARZeroMemory(changedUsers.nameList[changedUsers.numItems++]); }
134
135                                        LOG << "Role '" << names.back() <<"' [OK]" << endl;     
136                                }
137                                FreeAREntryListFieldValueList(&values,false);
138                                Sort();
139                                result = true;
140                        }
141                        else // ARGetListEntryWithFields failed
142                        {
143                                cerr << BuildMessageAndFreeStatus(status);
144                        }
145                }
146                else // ARLoadARQualifierStruct failed
147                {
148                        cerr << BuildMessageAndFreeStatus(status);
149                }
150
151                delete[] fields.fieldsList;
152                delete[] qualString;
153        }
154        catch(exception& e)
155        {               
156                throw(AppException(e.what(), "Error loading roles.", "CARRoleList"));
157        }
158        return result;
159}
160
161void CARRoleList::Reserve(unsigned int count)
162{
163        requestId.reserve(count);
164        applicationName.reserve(count);
165        names.reserve(count);
166        roleId.reserve(count);
167        groupsTest.reserve(count);
168        groupsProd.reserve(count);
169        createDate.reserve(count);
170        modifiedDate.reserve(count);
171
172        owners.numItems = 0;
173        owners.nameList = new ARAccessNameType[count];
174
175        changedUsers.numItems = 0;
176        changedUsers.nameList = new ARAccessNameType[count];
177}
178
179int CARRoleList::Find(int iRoleId, const string& appName)
180{
181        unsigned int count = GetCount();
182        for (unsigned int i = 0; i < count; ++i)
183        {
184                if (roleId[sortedList[i]] == iRoleId && applicationName[sortedList[i]] == appName)
185                {
186                        return i;
187                }
188        }
189        return -1;
190}
191
192void CARRoleList::Sort()
193{
194        if (GetCount() > 0)
195        {
196                GenerateSortableList sortableContent(names);
197                std::sort(sortedList.begin(),sortedList.end(),SortByName(sortableContent));
198        }
199}
200
201void CARRoleList::StoreEntry(ARFieldValueList& value)
202{
203        for (unsigned int curFieldPos = 0; curFieldPos != value.numItems; ++curFieldPos)
204        {
205                switch (value.fieldValueList[curFieldPos].fieldId)
206                {
207                case AR_RESERV_ROLE_MAPPING_APPLICATION:
208                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_CHAR)
209                                applicationName.push_back(value.fieldValueList[curFieldPos].value.u.charVal);
210                        break;
211                case AR_RESERV_ROLE_MAPPING_ROLE_NAME:
212                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_CHAR)
213                                names.push_back(value.fieldValueList[curFieldPos].value.u.charVal);
214                        break;
215                case AR_RESERV_ROLE_MAPPING_ROLE_ID:
216                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_INTEGER)
217                                roleId.push_back(value.fieldValueList[curFieldPos].value.u.intVal);
218                        break;
219                case AR_RESERV_APP_STATE_TEST:
220                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_CHAR)
221                        {
222                                vector<int> gids;
223                                GetGroupStringAsVector(value.fieldValueList[curFieldPos].value.u.charVal, gids);
224                                groupsTest.push_back(gids);
225                        }
226                        break;
227                case AR_RESERV_APP_STATE_PRODUCTION:
228                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_CHAR)
229                        {
230                                vector<int> gids;
231                                GetGroupStringAsVector(value.fieldValueList[curFieldPos].value.u.charVal, gids);
232                                groupsProd.push_back(gids);
233                        }
234                        break;
235                case AR_CORE_SUBMITTER:
236                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_CHAR)
237                        {
238                                int index = owners.numItems++;
239                                strncpy(owners.nameList[index], value.fieldValueList[curFieldPos].value.u.charVal, AR_MAX_ACCESS_NAME_SIZE);
240                                owners.nameList[index][AR_MAX_ACCESS_NAME_SIZE] = 0;
241                        }
242                        break;
243                case AR_CORE_CREATE_DATE:
244                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_TIME)
245                                createDate.push_back(value.fieldValueList[curFieldPos].value.u.dateVal);
246                        break;
247                case AR_CORE_LAST_MODIFIED_BY:
248                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_CHAR)
249                        {
250                                int index = changedUsers.numItems++;
251                                strncpy(changedUsers.nameList[index], value.fieldValueList[curFieldPos].value.u.charVal, AR_MAX_ACCESS_NAME_SIZE);
252                                changedUsers.nameList[index][AR_MAX_ACCESS_NAME_SIZE] = 0;
253                        }
254                        break;
255                case AR_CORE_MODIFIED_DATE:
256                        if (value.fieldValueList[curFieldPos].value.dataType == AR_DATA_TYPE_TIME)
257                                modifiedDate.push_back(value.fieldValueList[curFieldPos].value.u.dateVal);
258                        break;
259                }
260        }
261}
Note: See TracBrowser for help on using the repository browser.