Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/UserGroupAdapter.cs @ 939

Last change on this file since 939 was 939, checked in by svonolfe, 15 years ago

Fixed referential integrity between user and user group (#372)

File size: 10.5 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Linq;
25using System.Text;
26
27using HeuristicLab.Hive.Server.Core.InternalInterfaces.DataAccess;
28using HeuristicLab.Hive.Contracts.BusinessObjects;
29using System.Runtime.CompilerServices;
30using System.Data;
31
32namespace HeuristicLab.Hive.Server.ADODataAccess {
33  class UserGroupAdapter: DataAdapterBase, IUserGroupAdapter {
34    private dsHiveServerTableAdapters.UserGroupTableAdapter adapter =
35        new dsHiveServerTableAdapters.UserGroupTableAdapter();
36
37    private dsHiveServer.UserGroupDataTable data =
38      new dsHiveServer.UserGroupDataTable();
39
40    private dsHiveServerTableAdapters.PermissionOwner_UserGroupTableAdapter permOwnerUserGroupAdapter =
41      new dsHiveServerTableAdapters.PermissionOwner_UserGroupTableAdapter();
42
43    private dsHiveServer.PermissionOwner_UserGroupDataTable permOwnerUserGroupData =
44      new dsHiveServer.PermissionOwner_UserGroupDataTable();
45
46    private IPermissionOwnerAdapter permOwnerAdapter =
47      ServiceLocator.GetPermissionOwnerAdapter();
48
49    private IUserAdapter userAdapter =
50      ServiceLocator.GetUserAdapter();
51
52    public UserGroupAdapter() {
53      adapter.Fill(data);
54      permOwnerUserGroupAdapter.Fill(permOwnerUserGroupData);
55    }
56
57    protected override void Update() {
58      this.adapter.Update(this.data);
59      this.permOwnerUserGroupAdapter.Update(permOwnerUserGroupData);
60    }
61
62    private UserGroup Convert(dsHiveServer.UserGroupRow row,
63      UserGroup userGroup) {
64      if (row != null && userGroup != null) {
65        /*Parent - Permission Owner*/
66        userGroup.PermissionOwnerId = row.PermissionOwnerId;
67        permOwnerAdapter.GetPermissionOwnerById(userGroup);
68
69        //first check for created references
70        IEnumerable<dsHiveServer.PermissionOwner_UserGroupRow> userGroupRows =
71          from permOwner in
72            permOwnerUserGroupData.AsEnumerable<dsHiveServer.PermissionOwner_UserGroupRow>()
73          where permOwner.UserGroupId == userGroup.PermissionOwnerId
74          select permOwner;
75
76        foreach (dsHiveServer.PermissionOwner_UserGroupRow permOwnerUserGroupRow in
77          userGroupRows) {
78          PermissionOwner permOwner = null;
79         
80          IEnumerable<PermissionOwner> permOwners =
81            from p in
82              userGroup.Members
83            where p.PermissionOwnerId == permOwnerUserGroupRow.PermissionOwnerId
84            select p;
85          if (permOwners.Count<PermissionOwner>() == 1)
86            permOwner = permOwners.First<PermissionOwner>();
87
88          if (permOwner == null) {
89            PermissionOwner permissionOwner =
90              userAdapter.GetUserById(permOwnerUserGroupRow.PermissionOwnerId);
91
92            if (permissionOwner == null) {
93              //is a user group
94              permissionOwner =
95                GetUserGroupById(permOwnerUserGroupRow.PermissionOwnerId);
96            }
97
98            userGroup.Members.Add(permissionOwner);
99          }
100        }
101
102        //secondly check for deleted references
103        ICollection<PermissionOwner> deleted =
104          new List<PermissionOwner>();
105
106        foreach (PermissionOwner permOwner in userGroup.Members) {
107          dsHiveServer.PermissionOwner_UserGroupRow permOwnerUserGroupRow =
108            permOwnerUserGroupData.FindByPermissionOwnerIdUserGroupId(
109              permOwner.PermissionOwnerId,
110              userGroup.PermissionOwnerId);
111
112          if (permOwnerUserGroupRow == null) {
113            deleted.Add(permOwner);
114          }
115        }
116
117        foreach (PermissionOwner permOwner in deleted) {
118          userGroup.Members.Remove(permOwner);
119        }
120
121        return userGroup;
122      } else
123        return null;
124    }
125
126    private dsHiveServer.UserGroupRow Convert(UserGroup userGroup,
127      dsHiveServer.UserGroupRow row) {
128      if (userGroup != null && row != null) {
129        row.PermissionOwnerId = userGroup.PermissionOwnerId;
130     
131        //update references
132        foreach (PermissionOwner permOwner in userGroup.Members) {         
133          //first update the member to make sure it exists in the DB
134          if (permOwner is User) {
135            userAdapter.UpdateUser(permOwner as User);
136          } else if (permOwner is UserGroup) {
137            UpdateUserGroup(permOwner as UserGroup);
138          }
139
140          //secondly check for created references
141          dsHiveServer.PermissionOwner_UserGroupRow permOwnerUserGroupRow =
142            permOwnerUserGroupData.FindByPermissionOwnerIdUserGroupId(
143              permOwner.PermissionOwnerId,
144              userGroup.PermissionOwnerId);
145
146          if (permOwnerUserGroupRow == null) {
147            permOwnerUserGroupRow =
148              permOwnerUserGroupData.NewPermissionOwner_UserGroupRow();
149
150            permOwnerUserGroupRow.PermissionOwnerId =
151              permOwner.PermissionOwnerId;
152            permOwnerUserGroupRow.UserGroupId =
153              userGroup.PermissionOwnerId;
154
155            permOwnerUserGroupData.AddPermissionOwner_UserGroupRow(
156              permOwnerUserGroupRow);
157          }
158        }
159
160        //thirdly check for deleted references
161        IEnumerable<dsHiveServer.PermissionOwner_UserGroupRow> userGroupRows =
162          from permOwner in
163            permOwnerUserGroupData.AsEnumerable<dsHiveServer.PermissionOwner_UserGroupRow>()
164          where permOwner.UserGroupId == userGroup.PermissionOwnerId 
165          select permOwner;
166
167        ICollection<dsHiveServer.PermissionOwner_UserGroupRow> deleted =
168          new List<dsHiveServer.PermissionOwner_UserGroupRow>();
169
170        foreach (dsHiveServer.PermissionOwner_UserGroupRow permOwnerUserGroupRow in
171          userGroupRows) {
172          PermissionOwner permOwner = null;
173
174          IEnumerable<PermissionOwner> permOwners =
175            from p in
176              userGroup.Members
177            where p.PermissionOwnerId == permOwnerUserGroupRow.PermissionOwnerId
178            select p;
179
180          if (permOwners.Count<PermissionOwner>() == 1)
181            permOwner = permOwners.First<PermissionOwner>();
182
183          if (permOwner == null) {
184            deleted.Add(permOwnerUserGroupRow);
185          }
186        }
187
188        foreach (dsHiveServer.PermissionOwner_UserGroupRow permOwnerUserGroupRow in
189          deleted) {
190          permOwnerUserGroupData.RemovePermissionOwner_UserGroupRow(
191            permOwnerUserGroupRow);
192        }
193
194      }
195
196      return row;
197    }
198
199    #region IUserGroupAdapter Members
200    [MethodImpl(MethodImplOptions.Synchronized)]
201    public void UpdateUserGroup(UserGroup group) {
202      if (group != null) {
203        permOwnerAdapter.UpdatePermissionOwner(group);
204
205        dsHiveServer.UserGroupRow row =
206          data.FindByPermissionOwnerId(group.PermissionOwnerId);
207
208        if (row == null) {
209          row = data.NewUserGroupRow();
210          row.PermissionOwnerId = group.PermissionOwnerId;
211          data.AddUserGroupRow(row);
212        }
213
214        Convert(group, row);
215      }
216    }
217
218    public UserGroup GetUserGroupById(long userGroupId) {
219      UserGroup userGroup = new UserGroup();
220
221      dsHiveServer.UserGroupRow row =
222        data.FindByPermissionOwnerId(userGroupId);
223
224      if (row != null) {
225        Convert(row, userGroup);
226
227        return userGroup;
228      } else {
229        return null;
230      }
231    }
232
233    public ICollection<UserGroup> GetAllUserGroups() {
234      ICollection<UserGroup> allUserGroups =
235        new List<UserGroup>();
236
237      foreach (dsHiveServer.UserGroupRow row in data) {
238        UserGroup userGroup = new UserGroup();
239
240        Convert(row, userGroup);
241        allUserGroups.Add(userGroup);
242      }
243
244      return allUserGroups;
245    }
246
247    public ICollection<UserGroup> MemberOf(PermissionOwner permOwner) {
248      ICollection<UserGroup> userGroups =
249        new List<UserGroup>();
250     
251      if (permOwner != null) {
252        IEnumerable<dsHiveServer.PermissionOwner_UserGroupRow> userGroupRows =
253         from userGroup in
254           permOwnerUserGroupData.AsEnumerable<dsHiveServer.PermissionOwner_UserGroupRow>()
255         where userGroup.PermissionOwnerId == permOwner.PermissionOwnerId
256         select userGroup;
257
258        foreach (dsHiveServer.PermissionOwner_UserGroupRow userGroupRow in
259          userGroupRows) {
260          UserGroup userGroup =
261            GetUserGroupById(userGroupRow.UserGroupId);
262          userGroups.Add(userGroup);
263        }
264      }
265
266      return userGroups;
267    }
268
269    [MethodImpl(MethodImplOptions.Synchronized)]
270    public bool DeleteUserGroup(UserGroup group) {
271      if (group != null) {
272        dsHiveServer.UserGroupRow row =
273          data.FindByPermissionOwnerId(group.PermissionOwnerId);
274
275        if (row != null) {
276          ICollection<dsHiveServer.PermissionOwner_UserGroupRow> deleted =
277            new List<dsHiveServer.PermissionOwner_UserGroupRow>();
278         
279          foreach (dsHiveServer.PermissionOwner_UserGroupRow permOwnerUserGroupRow in
280            permOwnerUserGroupData) {
281            if (permOwnerUserGroupRow.UserGroupId == group.PermissionOwnerId ||
282              permOwnerUserGroupRow.PermissionOwnerId == group.PermissionOwnerId) {
283              deleted.Add(permOwnerUserGroupRow);
284            }
285          }
286
287          foreach (dsHiveServer.PermissionOwner_UserGroupRow permOwnerUserGroupRow in
288            deleted) {
289            permOwnerUserGroupData.RemovePermissionOwner_UserGroupRow(
290              permOwnerUserGroupRow);
291          }
292         
293          data.RemoveUserGroupRow(row);
294          return permOwnerAdapter.DeletePermissionOwner(group);
295        }
296      }
297
298      return false;
299    }
300
301    #endregion
302  }
303}
Note: See TracBrowser for help on using the repository browser.