0
|
1 using System;
|
|
2 using System.Collections.Generic;
|
|
3 using System.Collections.Specialized;
|
|
4 using System.Configuration;
|
|
5 using System.Web.Profile;
|
|
6
|
|
7 namespace PetShop.BusinessLogic
|
|
8 {
|
|
9 using DataAccess;
|
|
10 using ObjectModel;
|
|
11
|
|
12 public sealed class ProfileProvider : System.Web.Profile.ProfileProvider
|
|
13 {
|
|
14 private static string _applicationName = ".NET Pet Shop 4.0";
|
|
15
|
|
16 /// <summary>
|
|
17 /// The name of the application using the custom profile provider.
|
|
18 /// </summary>
|
|
19 public override string ApplicationName
|
|
20 {
|
|
21 get { return _applicationName; }
|
|
22 set { _applicationName = value; }
|
|
23 }
|
|
24
|
|
25 /// <summary>
|
|
26 /// Initializes the provider.
|
|
27 /// </summary>
|
|
28 /// <param name="name">The friendly name of the provider.</param>
|
|
29 /// <param name="config">A collection of the name/value pairs representing the provider-specific attributes specified in the configuration for this provider.</param>
|
|
30 public override void Initialize(string name, NameValueCollection config)
|
|
31 {
|
|
32 if (config == null)
|
|
33 throw new ArgumentNullException("config");
|
|
34
|
|
35 if (string.IsNullOrEmpty(config["description"]))
|
|
36 {
|
|
37 config.Remove("description");
|
|
38 config.Add("description", "Pet Shop Custom Profile Provider");
|
|
39 }
|
|
40
|
|
41 if (string.IsNullOrEmpty(name))
|
|
42 name = "PetShopProfileProvider";
|
|
43
|
|
44 if (config["applicationName"] != null && !string.IsNullOrEmpty(config["applicationName"].Trim()))
|
|
45 _applicationName = config["applicationName"];
|
|
46
|
|
47 base.Initialize(name, config);
|
|
48 }
|
|
49
|
|
50 private const string ERR_INVALID_PARAMETER = "Invalid Profile parameter:";
|
|
51 private const string PROFILE_SHOPPINGCART = "ShoppingCart";
|
|
52 private const string PROFILE_WISHLIST = "WishList";
|
|
53 private const string PROFILE_ACCOUNT = "AccountInfo";
|
|
54
|
|
55 /// <summary>
|
|
56 /// Returns the collection of settings property values for the specified application instance and settings property group.
|
|
57 /// </summary>
|
|
58 /// <param name="context">A System.Configuration.SettingsContext describing the current application use.</param>
|
|
59 /// <param name="collection">A System.Configuration.SettingsPropertyCollection containing the settings property group whose values are to be retrieved.</param>
|
|
60 /// <returns>A System.Configuration.SettingsPropertyValueCollection containing the values for the specified settings property group.</returns>
|
|
61 public override SettingsPropertyValueCollection GetPropertyValues(
|
|
62 SettingsContext context, SettingsPropertyCollection collection)
|
|
63 {
|
|
64 string username = (string)context["UserName"];
|
|
65 bool isAuthenticated = (bool) context["IsAuthenticated"];
|
|
66
|
|
67 SettingsPropertyValueCollection svc = new SettingsPropertyValueCollection();
|
|
68
|
|
69 foreach (SettingsProperty prop in collection)
|
|
70 {
|
|
71 SettingsPropertyValue pv = new SettingsPropertyValue(prop);
|
|
72
|
|
73 switch (pv.Property.Name)
|
|
74 {
|
|
75 case PROFILE_SHOPPINGCART: pv.PropertyValue = GetCartItems(username, true); break;
|
|
76 case PROFILE_WISHLIST: pv.PropertyValue = GetCartItems(username, false); break;
|
|
77 case PROFILE_ACCOUNT:
|
|
78 if (isAuthenticated)
|
|
79 pv.PropertyValue = GetAccountInfo(username);
|
|
80 break;
|
|
81
|
|
82 default:
|
|
83 throw new ApplicationException(ERR_INVALID_PARAMETER + " name.");
|
|
84 }
|
|
85
|
|
86 svc.Add(pv);
|
|
87 }
|
|
88
|
|
89 return svc;
|
|
90 }
|
|
91
|
|
92 /// <summary>
|
|
93 /// Sets the values of the specified group of property settings.
|
|
94 /// </summary>
|
|
95 /// <param name="context">A System.Configuration.SettingsContext describing the current application usage.</param>
|
|
96 /// <param name="collection">A System.Configuration.SettingsPropertyValueCollection representing the group of property settings to set.</param>
|
|
97 public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection collection)
|
|
98 {
|
|
99 string username = (string)context["UserName"];
|
|
100
|
|
101 CheckUserName(username);
|
|
102
|
|
103 bool isAuthenticated = (bool)context["IsAuthenticated"];
|
|
104 int uniqueID = GetUniqueID(username, isAuthenticated, false, ApplicationName);
|
|
105
|
|
106 foreach (SettingsPropertyValue pv in collection)
|
|
107 {
|
|
108 if (pv.PropertyValue != null)
|
|
109 {
|
|
110 switch (pv.Property.Name)
|
|
111 {
|
|
112 case PROFILE_SHOPPINGCART: SetCartItems(uniqueID, (Cart)pv.PropertyValue, true); break;
|
|
113 case PROFILE_WISHLIST: SetCartItems(uniqueID, (Cart)pv.PropertyValue, false); break;
|
|
114 case PROFILE_ACCOUNT:
|
|
115 if (isAuthenticated)
|
|
116 SetAccountInfo(uniqueID, (Address)pv.PropertyValue);
|
|
117 break;
|
|
118
|
|
119 default:
|
|
120 throw new ApplicationException(ERR_INVALID_PARAMETER + " name.");
|
|
121 }
|
|
122 }
|
|
123 }
|
|
124
|
|
125 UpdateActivityDates(username, false);
|
|
126 }
|
|
127
|
|
128 private int GetUniqueID(string userName, bool isAuthenticated, bool ignoreAuthenticationType, string appName)
|
|
129 {
|
|
130 int? uniqueID = ignoreAuthenticationType ?
|
|
131 Accessor.GetUniqueID (userName, appName) :
|
|
132 Accessor.GetUniqueIDAuth(userName, appName, isAuthenticated);
|
|
133
|
|
134 return uniqueID ?? Accessor.CreateProfile(userName, appName, isAuthenticated);
|
|
135 }
|
|
136
|
|
137 private Address GetAccountInfo(string username)
|
|
138 {
|
|
139 return Accessor.GetAccountInfo(username, _applicationName);
|
|
140 }
|
|
141
|
|
142 private Cart GetCartItems(string username, bool isShoppingCart)
|
|
143 {
|
|
144 Cart cart = new Cart();
|
|
145
|
|
146 foreach (CartItem cartItem in Accessor.GetCartItems(username, _applicationName, isShoppingCart))
|
|
147 cart.Add(cartItem);
|
|
148
|
|
149 return cart;
|
|
150 }
|
|
151
|
|
152 private void SetAccountInfo(int uniqueID, Address address)
|
|
153 {
|
|
154 Accessor.SetAccountInfo(uniqueID, address);
|
|
155 }
|
|
156
|
|
157 private void SetCartItems(int uniqueID, Cart cart, bool isShoppingCart)
|
|
158 {
|
|
159 Accessor.SetCartItems(uniqueID, cart.Items, isShoppingCart);
|
|
160 }
|
|
161
|
|
162 // UpdateActivityDates
|
|
163 // Updates the LastActivityDate and LastUpdatedDate values
|
|
164 // when profile properties are accessed by the
|
|
165 // GetPropertyValues and SetPropertyValues methods.
|
|
166 // Passing true as the activityOnly parameter will update
|
|
167 // only the LastActivityDate.
|
|
168 private void UpdateActivityDates(string username, bool activityOnly)
|
|
169 {
|
|
170 if (activityOnly)
|
|
171 Accessor.UpdateActivityDate(username, _applicationName);
|
|
172 else
|
|
173 Accessor.UpdateActivityAndUdpateDates(username, _applicationName);
|
|
174 }
|
|
175
|
|
176 /// <summary>
|
|
177 /// Deletes profile properties and information for the supplied list of profiles.
|
|
178 /// </summary>
|
|
179 /// <param name="profiles">A System.Web.Profile.ProfileInfoCollection of information about profiles that are to be deleted.</param>
|
|
180 /// <returns>The number of profiles deleted from the data source.</returns>
|
|
181 public override int DeleteProfiles(ProfileInfoCollection profiles)
|
|
182 {
|
|
183 int deleteCount = 0;
|
|
184
|
|
185 foreach (ProfileInfo p in profiles)
|
|
186 if (DeleteProfile(p.UserName))
|
|
187 deleteCount++;
|
|
188
|
|
189 return deleteCount;
|
|
190 }
|
|
191
|
|
192 /// <summary>
|
|
193 /// Deletes profile properties and information for profiles that match the supplied list of user names.
|
|
194 /// </summary>
|
|
195 /// <param name="usernames">A string array of user names for profiles to be deleted.</param>
|
|
196 /// <returns>The number of profiles deleted from the data source.</returns>
|
|
197 public override int DeleteProfiles(string[] usernames)
|
|
198 {
|
|
199 int deleteCount = 0;
|
|
200
|
|
201 foreach (string user in usernames)
|
|
202 if (DeleteProfile(user))
|
|
203 deleteCount++;
|
|
204
|
|
205 return deleteCount;
|
|
206 }
|
|
207
|
|
208 // DeleteProfile
|
|
209 // Deletes profile data from the database for the specified user name.
|
|
210 private bool DeleteProfile(string username)
|
|
211 {
|
|
212 CheckUserName(username);
|
|
213
|
|
214 int? uniqueID = Accessor.GetUniqueID(username, _applicationName);
|
|
215
|
|
216 return uniqueID != null && Accessor.DeleteProfile(uniqueID.Value) > 0;
|
|
217 }
|
|
218
|
|
219 // Verifies user name for sise and comma
|
|
220 private static void CheckUserName(string userName)
|
|
221 {
|
|
222 if (string.IsNullOrEmpty(userName) || userName.Length > 256 || userName.IndexOf(",") > 0)
|
|
223 throw new ApplicationException(ERR_INVALID_PARAMETER + " user name.");
|
|
224 }
|
|
225
|
|
226 /// <summary>
|
|
227 /// Deletes all user-profile data for profiles in which the last activity date occurred before the specified date.
|
|
228 /// </summary>
|
|
229 /// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are deleted.</param>
|
|
230 /// <param name="userInactiveSinceDate">A System.DateTime that identifies which user profiles are considered inactive. If the System.Web.Profile.ProfileInfo.LastActivityDate value of a user profile occurs on or before this date and time, the profile is considered inactive.</param>
|
|
231 /// <returns>The number of profiles deleted from the data source.</returns>
|
|
232 public override int DeleteInactiveProfiles(ProfileAuthenticationOption authenticationOption, DateTime userInactiveSinceDate)
|
|
233 {
|
|
234 IList<string> list;
|
|
235
|
|
236 switch (authenticationOption)
|
|
237 {
|
|
238 case ProfileAuthenticationOption.Anonymous:
|
|
239 list = Accessor.GetInactiveProfiles(userInactiveSinceDate, ApplicationName, true);
|
|
240 break;
|
|
241
|
|
242 case ProfileAuthenticationOption.Authenticated:
|
|
243 list = Accessor.GetInactiveProfiles(userInactiveSinceDate, ApplicationName, false);
|
|
244 break;
|
|
245
|
|
246 default:
|
|
247 list = Accessor.GetInactiveProfiles(userInactiveSinceDate, ApplicationName);
|
|
248 break;
|
|
249 }
|
|
250
|
|
251 string[] userArray = new string[list.Count];
|
|
252
|
|
253 list.CopyTo(userArray, 0);
|
|
254
|
|
255 return DeleteProfiles(userArray);
|
|
256 }
|
|
257
|
|
258 /// <summary>
|
|
259 /// Retrieves profile information for profiles in which the user name matches the specified user names.
|
|
260 /// </summary>
|
|
261 /// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param>
|
|
262 /// <param name="usernameToMatch">The user name to search for.</param>
|
|
263 /// <param name="pageIndex">The index of the page of results to return.</param>
|
|
264 /// <param name="pageSize">The size of the page of results to return.</param>
|
|
265 /// <param name="totalRecords">When this method returns, contains the total number of profiles.</param>
|
|
266 /// <returns>A System.Web.Profile.ProfileInfoCollection containing user-profile information
|
|
267 /// for profiles where the user name matches the supplied usernameToMatch parameter.</returns>
|
|
268 public override ProfileInfoCollection FindProfilesByUserName(
|
|
269 ProfileAuthenticationOption authenticationOption, string usernameToMatch,
|
|
270 int pageIndex, int pageSize, out int totalRecords)
|
|
271 {
|
|
272 CheckParameters(pageIndex, pageSize);
|
|
273
|
|
274 return GetProfileInfo(authenticationOption, usernameToMatch, null, pageIndex, pageSize, out totalRecords);
|
|
275 }
|
|
276
|
|
277 /// <summary>
|
|
278 /// Retrieves profile information for profiles in which the last activity date occurred on or before the specified date and the user name matches the specified user name.
|
|
279 /// </summary>
|
|
280 /// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param>
|
|
281 /// <param name="usernameToMatch">The user name to search for.</param>
|
|
282 /// <param name="userInactiveSinceDate">A System.DateTime that identifies which user profiles are considered inactive. If the System.Web.Profile.ProfileInfo.LastActivityDate value of a user profile occurs on or before this date and time, the profile is considered inactive.</param>
|
|
283 /// <param name="pageIndex">The index of the page of results to return.</param>
|
|
284 /// <param name="pageSize">The size of the page of results to return.</param>
|
|
285 /// <param name="totalRecords">When this method returns, contains the total number of profiles.</param>
|
|
286 /// <returns>A System.Web.Profile.ProfileInfoCollection containing user profile information for inactive profiles where the user name matches the supplied usernameToMatch parameter.</returns>
|
|
287 public override ProfileInfoCollection FindInactiveProfilesByUserName(
|
|
288 ProfileAuthenticationOption authenticationOption, string usernameToMatch, DateTime userInactiveSinceDate,
|
|
289 int pageIndex, int pageSize, out int totalRecords)
|
|
290 {
|
|
291 CheckParameters(pageIndex, pageSize);
|
|
292
|
|
293 return GetProfileInfo(authenticationOption, usernameToMatch, userInactiveSinceDate, pageIndex, pageSize, out totalRecords);
|
|
294 }
|
|
295
|
|
296 /// <summary>
|
|
297 /// Retrieves user profile data for all profiles in the data source.
|
|
298 /// </summary>
|
|
299 /// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param>
|
|
300 /// <param name="pageIndex">The index of the page of results to return.</param>
|
|
301 /// <param name="pageSize">The size of the page of results to return.</param>
|
|
302 /// <param name="totalRecords">When this method returns, contains the total number of profiles.</param>
|
|
303 /// <returns>A System.Web.Profile.ProfileInfoCollection containing user-profile information for all profiles in the data source.</returns>
|
|
304 public override ProfileInfoCollection GetAllProfiles(
|
|
305 ProfileAuthenticationOption authenticationOption, int pageIndex, int pageSize, out int totalRecords)
|
|
306 {
|
|
307 CheckParameters(pageIndex, pageSize);
|
|
308
|
|
309 return GetProfileInfo(authenticationOption, null, null, pageIndex, pageSize, out totalRecords);
|
|
310 }
|
|
311
|
|
312 /// <summary>
|
|
313 /// Retrieves user-profile data from the data source for profiles in which the last activity date occurred on or before the specified date.
|
|
314 /// </summary>
|
|
315 /// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param>
|
|
316 /// <param name="userInactiveSinceDate">A System.DateTime that identifies which user profiles are considered inactive. If the System.Web.Profile.ProfileInfo.LastActivityDate of a user profile occurs on or before this date and time, the profile is considered inactive.</param>
|
|
317 /// <param name="pageIndex">The index of the page of results to return.</param>
|
|
318 /// <param name="pageSize">The size of the page of results to return.</param>
|
|
319 /// <param name="totalRecords">When this method returns, contains the total number of profiles.</param>
|
|
320 /// <returns>A System.Web.Profile.ProfileInfoCollection containing user-profile information about the inactive profiles.</returns>
|
|
321 public override ProfileInfoCollection GetAllInactiveProfiles(
|
|
322 ProfileAuthenticationOption authenticationOption, DateTime userInactiveSinceDate,
|
|
323 int pageIndex, int pageSize, out int totalRecords)
|
|
324 {
|
|
325 CheckParameters(pageIndex, pageSize);
|
|
326
|
|
327 return GetProfileInfo(authenticationOption, null, userInactiveSinceDate, pageIndex, pageSize, out totalRecords);
|
|
328 }
|
|
329
|
|
330 /// <summary>
|
|
331 /// Returns the number of profiles in which the last activity date occurred on or before the specified date.
|
|
332 /// </summary>
|
|
333 /// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param>
|
|
334 /// <param name="userInactiveSinceDate">A System.DateTime that identifies which user profiles are considered inactive. If the System.Web.Profile.ProfileInfo.LastActivityDate of a user profile occurs on or before this date and time, the profile is considered inactive.</param>
|
|
335 /// <returns>The number of profiles in which the last activity date occurred on or before the specified date.</returns>
|
|
336 public override int GetNumberOfInactiveProfiles(
|
|
337 ProfileAuthenticationOption authenticationOption, DateTime userInactiveSinceDate)
|
|
338 {
|
|
339 int inactiveProfiles = 0;
|
|
340
|
|
341 ProfileInfoCollection profiles = GetProfileInfo(authenticationOption, null, userInactiveSinceDate, 0, 0, out inactiveProfiles);
|
|
342
|
|
343 return inactiveProfiles;
|
|
344 }
|
|
345
|
|
346 private static void CheckParameters(int pageIndex, int pageSize)
|
|
347 {
|
|
348 if (pageIndex < 1 || pageSize < 1)
|
|
349 throw new ApplicationException(ERR_INVALID_PARAMETER + " page index.");
|
|
350 }
|
|
351
|
|
352 // GetProfileInfo
|
|
353 // Retrieves a count of profiles and creates a
|
|
354 // ProfileInfoCollection from the profile data in the
|
|
355 // database. Called by GetAllProfiles, GetAllInactiveProfiles,
|
|
356 // FindProfilesByUserName, FindInactiveProfilesByUserName,
|
|
357 // and GetNumberOfInactiveProfiles.
|
|
358 // Specifying a pageIndex of 0 retrieves a count of the results only.
|
|
359 private ProfileInfoCollection GetProfileInfo(
|
|
360 ProfileAuthenticationOption authenticationOption,
|
|
361 string usernameToMatch,
|
|
362 DateTime? userInactiveSinceDate,
|
|
363 int pageIndex,
|
|
364 int pageSize,
|
|
365 out int totalRecords)
|
|
366 {
|
|
367 totalRecords = 0;
|
|
368
|
|
369 ProfileInfoCollection profiles = new ProfileInfoCollection();
|
|
370
|
|
371 // Count profiles only.
|
|
372 if (pageSize == 0)
|
|
373 return profiles;
|
|
374
|
|
375 int counter = 0;
|
|
376 int startIndex = pageSize * (pageIndex - 1);
|
|
377 int endIndex = startIndex + pageSize - 1;
|
|
378
|
|
379 bool? isAnonymous = null;
|
|
380
|
|
381 if (authenticationOption == ProfileAuthenticationOption.Anonymous)
|
|
382 isAnonymous = true;
|
|
383 else if (authenticationOption == ProfileAuthenticationOption.Authenticated)
|
|
384 isAnonymous = false;
|
|
385
|
|
386 foreach (CustomProfile profile in Accessor.GetProfile(
|
|
387 isAnonymous, usernameToMatch, userInactiveSinceDate, _applicationName, out totalRecords))
|
|
388 {
|
|
389 if (counter >= startIndex)
|
|
390 {
|
|
391 ProfileInfo p = new ProfileInfo(
|
|
392 profile.UserName,
|
|
393 profile.IsAnonymous ?? true,
|
|
394 profile.LastActivityDate ?? DateTime.MinValue,
|
|
395 profile.LastUpdatedDate ?? DateTime.MinValue, 0);
|
|
396
|
|
397 profiles.Add(p);
|
|
398 }
|
|
399
|
|
400 if (counter >= endIndex)
|
|
401 break;
|
|
402
|
|
403 counter++;
|
|
404 }
|
|
405
|
|
406 return profiles;
|
|
407 }
|
|
408
|
|
409 #region Accessor
|
|
410
|
|
411 ProfileAccessor Accessor
|
|
412 {
|
|
413 [System.Diagnostics.DebuggerStepThrough]
|
|
414 get { return ProfileAccessor.CreateInstance(); }
|
|
415 }
|
|
416
|
|
417 #endregion
|
|
418 }
|
|
419 }
|