コード例 #1
0
        internal static void ValidateCreationActivity(this ProcessActivityEventArgs args)
        {
            var data = args.Data;

            EnsureValideData(data);
            if (EnsureNotIgnoredList(args, data))
            {
                return;
            }

            if (args.ActivityKind != ActivityKind.Created)
            {
                return;
            }

            Guid webId;
            Guid listId;
            int  id;

            ParseActivityVales(data, out webId, out listId, out id);

            if (args.ActivityManager.ActivityExists(
                    ObjectKind.ListItem,
                    ActivityKind.Created,
                    webId,
                    listId,
                    id))
            {
                throw new SocialEngineException(AlreadyCreatedExceptionMessage, LogKind.Info);
            }
        }
コード例 #2
0
ファイル: List.cs プロジェクト: ersil/vepmlive-investigations
        private void ValidateCreationActivity(ProcessActivityEventArgs args)
        {
            Dictionary <string, object> data = args.Data;

            new DataValidator(data).Validate(new Dictionary <string, DataType>
            {
                { "Id", DataType.Guid },
                { "Title", DataType.String },
                { "URL", DataType.String },
                { "WebId", DataType.Guid },
                { "UserId", DataType.Int },
                { "ActivityTime", DataType.DateTime }
            });

            if (IsIgnoredList(args, data))
            {
                return;
            }

            if (args.ActivityManager.ActivityExists(ObjectKind.Workspace, ActivityKind.Created,
                                                    (Guid)data["WebId"], (Guid)data["Id"]))
            {
                throw new SocialEngineException(ALREADY_CREATED_EXCEPTION_MESSAGE, LogKind.Info);
            }
        }
コード例 #3
0
        public void ValidateCommentDeletionActivity_WhenCalled_ThrowsSameItemError()
        {
            // Arrange
            const string settingValue = "somevalue";
            const string expected     = "Cannot register more than one deleted activity on the same item.";

            var data   = CreateDataObject();
            var actual = string.Empty;

            ShimCacheStore.CurrentGet = () => new ShimCacheStore()
            {
                GetStringStringFuncOfObjectBoolean = (_, _1, _2, _3) => new ShimCachedValue()
                {
                    ValueGet = () => settingValue
                }
            };
            ShimSqlCommand.AllInstances.ExecuteScalar = _ => 1;

            var args = new ProcessActivityEventArgs(ObjectKind.List, ActivityKind.Deleted, data, spWeb, streamManager, threadManager, activityManager);

            // Act
            try
            {
                privateTypeValidator.InvokeStatic(ValidateCommentDeletionActivityMethod, args);
            }
            catch (SocialEngineException exception)
            {
                actual = exception.Message;
            }

            // Assert
            actual.ShouldBe(expected);
        }
コード例 #4
0
        private void RegisterDeletionActivity(ProcessActivityEventArgs args)
        {
            Dictionary <string, object> data = args.Data;
            ThreadManager threadManager      = args.ThreadManager;

            Thread thread = threadManager.GetThread((Guid)data["WebId"], (Guid)data["ListId"], (int)data["Id"]) ??
                            threadManager.SaveThread(new Thread
            {
                Title  = (string)data["Title"],
                Url    = (string)data["URL"],
                Kind   = args.ObjectKind,
                WebId  = (Guid)data["WebId"],
                ListId = (Guid)data["ListId"],
                ItemId = (int)data["Id"]
            });

            data.Add("#!Thread", thread);

            if (args.ActivityKind != ActivityKind.Deleted)
            {
                return;
            }

            threadManager.DeleteThread(thread);

            Activity activity = args.ActivityManager.RegisterActivity(new Activity
            {
                Kind   = ActivityKind.Deleted,
                UserId = (int)data["UserId"],
                Thread = thread,
                Date   = (DateTime)data["ActivityTime"]
            });

            data.Add("#!Activity", activity);
        }
コード例 #5
0
ファイル: List.cs プロジェクト: ersil/vepmlive-investigations
        private void ValidateDeletionActivity(ProcessActivityEventArgs args)
        {
            Dictionary <string, object> data = args.Data;

            new DataValidator(data).Validate(new Dictionary <string, DataType>
            {
                { "Id", DataType.Guid },
                { "Title", DataType.String },
                { "URL", DataType.String },
                { "WebId", DataType.Guid },
                { "UserId", DataType.Int },
                { "ActivityTime", DataType.DateTime }
            });

            if (IsIgnoredList(args, data))
            {
                return;
            }

            if (args.ActivityManager.ActivityExists(ObjectKind.List, ActivityKind.Deleted, (Guid)data["WebId"],
                                                    (Guid)data["Id"]))
            {
                throw new SocialEngineException(
                          "Cannot register more than one deleted activity on the same list.", LogKind.Info);
            }
        }
コード例 #6
0
        private void ValidateCreationActivity(ProcessActivityEventArgs args)
        {
            Dictionary <string, object> data = args.Data;

            new DataValidator(data).Validate(new Dictionary <string, DataType>
            {
                { "Id", DataType.Guid },
                { "WebId", DataType.Guid },
                { "ListId", DataType.Guid },
                { "ItemId", DataType.Int },
                { "Status", DataType.String },
                { "UserId", DataType.Int },
                { "ActivityTime", DataType.DateTime }
            });

            if (args.ActivityKind == ActivityKind.CommentAdded)
            {
                return;
            }

            if (args.ActivityManager.ActivityExists(ObjectKind.StatusUpdate, ActivityKind.Created,
                                                    (Guid)data["WebId"], (Guid)data["ListId"], (int)data["ItemId"], data["Id"].ToString()))
            {
                throw new SocialEngineException(ALREADY_CREATED_EXCEPTION_MESSAGE, LogKind.Info);
            }
        }
コード例 #7
0
ファイル: List.cs プロジェクト: ersil/vepmlive-investigations
        private void OnValidateActivity(ProcessActivityEventArgs args)
        {
            if (args.ObjectKind != ObjectKind.List)
            {
                return;
            }

            switch (args.ActivityKind)
            {
            case ActivityKind.Created:
                ValidateCreationActivity(args);
                break;

            case ActivityKind.Deleted:
                ValidateDeletionActivity(args);
                break;

            case ActivityKind.BulkOperation:
                ValidateBulkOperationActivity(args);
                break;

            default:
                throw new SocialEngineException("This activity cannot be performed on a list.", LogKind.Info);
            }
        }
コード例 #8
0
        private void OnActivityRegistration(ProcessActivityEventArgs args)
        {
            if (args.ObjectKind != ObjectKind.ListItem)
            {
                return;
            }

            switch (args.ActivityKind)
            {
            case ActivityKind.Created:
                RegisterCreationActivity(args);
                break;

            case ActivityKind.Updated:
                RegisterUpdationActivity(args);
                break;

            case ActivityKind.Deleted:
                RegisterDeletionActivity(args);
                break;

            case ActivityKind.CommentAdded:
                RegisterCommentCreationActivity(args);
                break;

            case ActivityKind.CommentUpdated:
                RegisterCommentUpdationActivity(args);
                break;

            case ActivityKind.CommentRemoved:
                RegisterCommentDeletionActivity(args);
                break;
            }
        }
コード例 #9
0
        public void OnValidateActivityMethod_WhenCalled_CreationValidated()
        {
            // Arrange
            const bool registerExpected = true;
            var        registerActual   = false;

            var processActivityEventArgs = new ProcessActivityEventArgs(ObjectKind.ListItem, ActivityKind.Created, CreateDataObject(), spWeb, streamManager, threadManager, activityManager);

            ShimSqlCommand.AllInstances.ExecuteScalar = sqlCommand =>
            {
                if (sqlCommand.CommandText.StartsWith("SELECT COUNT(dbo.SS_Activities.Id) AS Total FROM dbo.SS_Activities"))
                {
                    registerActual = true;
                }
                return(null);
            };

            privateObj.Invoke(
                OnValidateActivityMethod,
                BindingFlags.Instance | BindingFlags.NonPublic,
                new object[] { processActivityEventArgs });

            // Assert
            registerActual.ShouldBe(registerExpected);
        }
コード例 #10
0
        private void RegisterCommentCreationActivity(ProcessActivityEventArgs args)
        {
            Dictionary <string, object> data = args.Data;

            Thread thread = args.ThreadManager.GetThread((Guid)data["WebId"], (Guid)data["ListId"],
                                                         (int)data["ItemId"]);

            if (thread == null)
            {
                RegisterCreationActivity(args);
                thread = (Thread)data["#!Thread"];
            }

            var act = new Activity
            {
                Kind   = args.ActivityKind,
                UserId = (int)data["UserId"],
                Thread = thread,
                Date   = (DateTime)data["CommentTime"],
                Key    = data["CommentId"].ToString()
            };

            act.SetData(new { comment = data["Comment"] });

            Activity activity = args.ActivityManager.RegisterActivity(act);
        }
コード例 #11
0
 private void LogCancellation(ObjectKind objectKind, ActivityKind activityKind, Dictionary <string, object> data,
                              SPWeb spWeb,
                              ProcessActivityEventArgs args)
 {
     if (!string.IsNullOrEmpty(args.CancellationMessage))
     {
         _logger.Log(objectKind, activityKind, data, spWeb, args.CancellationMessage);
     }
 }
コード例 #12
0
        private void RegisterCommentDeletionActivity(ProcessActivityEventArgs args)
        {
            RegisterDeletionActivity(args);

            args.ActivityManager.DeleteActivity(new Dictionary <string, object>
            {
                { "ActivityKey", args.Data["CommentId"].ToString().ToUpper() }
            });
        }
コード例 #13
0
        private void OnPostActivityRegistration(ProcessActivityEventArgs args)
        {
            if (args.ObjectKind != ObjectKind.ListItem)
            {
                return;
            }

            PerformPostRegistrationSteps(args);
        }
コード例 #14
0
        public void RegisterCommentCreationActivity_WhenThreadNotNull_RegistersActivity()
        {
            // Arrange
            const bool registerExpected = true;

            var registerActual = false;
            var data           = CreateDataObject();

            data.Add(CommentIdString, 1);
            data.Add(CommentString, CommentString);
            data.Add(CommentersColumn, Commenters);
            data.Add(ThreadValue, new Thread()
            {
                Id = guid
            });

            var threadTable = CreateThreadTable();

            ShimSqlCommand.AllInstances.ExecuteNonQuery = sqlCommand =>
            {
                if (sqlCommand.CommandText.StartsWith("INSERT INTO SS_Activities"))
                {
                    registerActual = true;
                }
                return(1);
            };
            ShimSqlCommand.AllInstances.ExecuteReader = sqlCommand =>
            {
                var reader = new ShimSqlDataReader()
                {
                    Close = () => { }
                };
                return(reader);
            };
            ShimDataRowCollection.AllInstances.CountGet     = _ => 1;
            ShimDataRowCollection.AllInstances.ItemGetInt32 = (_, _1) =>
            {
                DataRow result = null;
                ShimsContext.ExecuteWithoutShims(() =>
                {
                    result = threadTable.Rows[0];
                });
                return(result);
            };

            var args = new ProcessActivityEventArgs(ObjectKind.List, ActivityKind.CommentAdded, data, spWeb, streamManager, threadManager, activityManager);

            // Act
            privateObj.Invoke(
                RegisterCommentCreationActivityMethod,
                BindingFlags.Instance | BindingFlags.NonPublic,
                new object[] { args });

            // Assert
            registerActual.ShouldBe(registerExpected);
        }
コード例 #15
0
        // Private Methods (7) 

        private void OnActivityRegistration(ProcessActivityEventArgs args)
        {
            if (args.ObjectKind != ObjectKind.Workspace)
            {
                return;
            }

            RegisterWorkspaceActivity(args.ActivityKind, args.Data, args.ContextWeb,
                                      args.StreamManager, args.ThreadManager, args.ActivityManager);
        }
コード例 #16
0
        internal static void ValidateUpdationActivity(this ProcessActivityEventArgs args)
        {
            if (args == null)
            {
                throw new ArgumentNullException(nameof(args));
            }

            var data = args.Data;

            EnsureValideData(data);
            EnsureNotIgnoredList(args, data);
        }
コード例 #17
0
        // Private Methods (1) 

        private void OnValidateActivity(ProcessActivityEventArgs args)
        {
            var validObjectKinds = new ObjectKind[] {};

            if (validObjectKinds.Contains(args.ObjectKind) ||
                args.ContextWeb.CurrentUser.ID != args.ContextWeb.Site.SystemAccount.ID)
            {
                return;
            }

            args.Cancel = true;
            args.CancellationMessage = "Ignoring activities performed by the System Account";
        }
コード例 #18
0
        private static void UpdateThreadUsers(ProcessActivityEventArgs args, Thread thread)
        {
            if (args.ActivityKind == ActivityKind.CommentAdded ||
                args.ActivityKind == ActivityKind.CommentUpdated ||
                args.ActivityKind == ActivityKind.CommentRemoved)
            {
                ManageCommentUsers(args, thread);
                return;
            }

            Dictionary <string, object> data = args.Data;
            var users = new List <User> {
                new User {
                    Id = (int)data["UserId"], Role = UserRole.Author
                }
            };

            if (data.ContainsKey("AssignedTo"))
            {
                var assignedToUsers = data["AssignedTo"] as string;
                if (!string.IsNullOrEmpty(assignedToUsers))
                {
                    string[] asu = assignedToUsers.Split(',');

                    foreach (string user in asu)
                    {
                        int userId;
                        if (!int.TryParse(user.Trim(), out userId))
                        {
                            continue;
                        }

                        User tu = (from u in users where u.Id == userId select u).FirstOrDefault();

                        if (tu == null)
                        {
                            users.Add(new User {
                                Id = userId, Role = UserRole.Assignee
                            });
                        }
                        else
                        {
                            tu.Role |= UserRole.Assignee;
                        }
                    }
                }
            }

            thread.Users = users.AsParallel().Distinct().ToArray();
            args.ThreadManager.UpdateUsers(thread);
        }
コード例 #19
0
ファイル: List.cs プロジェクト: ersil/vepmlive-investigations
        // Private Methods (9) 

        private static bool IsIgnoredList(ProcessActivityEventArgs args, Dictionary <string, object> data)
        {
            var listTitle = (string)data["Title"];

            if (!Core.Utilities.IsIgnoredList(listTitle, args.ContextWeb))
            {
                return(false);
            }

            args.Cancel = true;
            args.CancellationMessage = listTitle + " is part of ignored Social Stream lists.";

            return(true);
        }
コード例 #20
0
ファイル: List.cs プロジェクト: ersil/vepmlive-investigations
        private void ValidateBulkOperationActivity(ProcessActivityEventArgs args)
        {
            Dictionary <string, object> data = args.Data;

            new DataValidator(data).Validate(new Dictionary <string, DataType>
            {
                { "Id", DataType.Guid },
                { "WebId", DataType.Guid },
                { "SiteId", DataType.Guid },
                { "UserId", DataType.Int },
                { "TotalActivities", DataType.Int },
                { "ActivityTime", DataType.DateTime }
            });
        }
コード例 #21
0
        public void PerformPreRegistrationSteps_WhenCalled_ReturnsTimespan()
        {
            // Arrange
            const bool expected = true;

            var actual    = false;
            var readCount = 0;
            var data      = CreateDataObject();

            ShimCacheStore.CurrentGet = () => new ShimCacheStore()
            {
                GetStringStringFuncOfObjectBoolean = (_, _1, _2, _3) => new ShimCachedValue()
                {
                    ValueGet = () => new TimeSpan(0, 10, 0)
                }
            };
            ShimSqlCommand.AllInstances.ExecuteNonQuery = sqlCommand =>
            {
                if (sqlCommand.CommandText.StartsWith("UPDATE SS_Activities SET MassOperation = 1"))
                {
                    actual = true;
                }
                return(1);
            };
            ShimSqlCommand.AllInstances.ExecuteReader = sqlCommand => new ShimSqlDataReader()
            {
                Close = () => { },
                Read  = () =>
                {
                    readCount++;
                    return(readCount == 1);
                },
                GetGuidInt32     = _ => guid,
                GetBooleanInt32  = _ => false,
                GetDateTimeInt32 = _ => DateTime.Now
            };

            var args = new ProcessActivityEventArgs(ObjectKind.List, ActivityKind.CommentAdded, data, spWeb, streamManager, threadManager, activityManager);

            // Act
            privateObj.Invoke(
                PerformPreRegistrationStepsMethod,
                BindingFlags.Instance | BindingFlags.NonPublic,
                new object[] { args });

            // Assert
            actual.ShouldBe(expected);
        }
コード例 #22
0
        // Private Methods (6) 

        private void OnActivityRegistration(ProcessActivityEventArgs args)
        {
            if (args.ObjectKind != ObjectKind.StatusUpdate)
            {
                return;
            }

            if (args.ActivityKind == ActivityKind.Created)
            {
                RegisterCreationActivity(args);
            }
            else if (args.ActivityKind == ActivityKind.CommentAdded)
            {
                RegisterCommentCreationActivity(args);
            }
        }
コード例 #23
0
        private void OnPreActivityRegistration(ProcessActivityEventArgs args)
        {
            if (args.ObjectKind != ObjectKind.ListItem)
            {
                return;
            }

            switch (args.ActivityKind)
            {
            case ActivityKind.CommentAdded:
            case ActivityKind.CommentUpdated:
            case ActivityKind.CommentRemoved:
                return;
            }

            PerformPreRegistrationSteps(args);
        }
コード例 #24
0
        public void ValidateCommentCreationActivity_WhenCalled_ThrowsNotRegisteredException()
        {
            // Arrange
            const string settingValue = "somevalue";
            const string expected     = "Cannot register creation activity on the same comment more than once";

            var queryCount = 0;
            var data       = CreateDataObject();

            data.Add(CommentIdString, guid);
            data.Add(CommentString, CommentString);

            var actual = string.Empty;

            ShimCacheStore.CurrentGet = () => new ShimCacheStore()
            {
                GetStringStringFuncOfObjectBoolean = (_, _1, _2, _3) => new ShimCachedValue()
                {
                    ValueGet = () => settingValue
                }
            };
            ShimSqlCommand.AllInstances.ExecuteScalar = _ =>
            {
                queryCount++;
                if (queryCount == 1)
                {
                    return(0);
                }
                return(1);
            };

            var args = new ProcessActivityEventArgs(ObjectKind.List, ActivityKind.Created, data, spWeb, streamManager, threadManager, activityManager);

            // Act
            try
            {
                args.ValidateCommentCreationActivity();
            }
            catch (SocialEngineException exception)
            {
                actual = exception.Message;
            }

            // Assert
            actual.ShouldBe(expected);
        }
コード例 #25
0
        public void UpdateThreadUsers_WhenCalled_UpdatesThreadUsers()
        {
            // Arrange
            const bool expectedUpdate = true;

            var actualUpdate = false;
            var thread       = new Thread()
            {
                Id    = guid,
                Users = new User[]
                {
                    new User()
                    {
                        Id   = 1,
                        Role = UserRole.Assignee
                    }
                }
            };
            var data = CreateDataObject();

            data.Add(AssignedToString, Commenters);

            ShimSqlCommand.AllInstances.ExecuteScalar   = _ => UserRole.Assignee;
            ShimSqlCommand.AllInstances.ExecuteNonQuery = _ => 1;
            ShimSqlCommand.AllInstances.ExecuteReader   = _ =>
            {
                actualUpdate = true;
                return(new ShimSqlDataReader()
                {
                    Read = () => false,
                    Close = () => { }
                });
            };

            var args = new ProcessActivityEventArgs(ObjectKind.List, ActivityKind.Updated, data, spWeb, streamManager, threadManager, activityManager);

            // Act
            privateObj.Invoke(
                UpdateThreadUsersMethod,
                BindingFlags.Static | BindingFlags.NonPublic,
                new object[] { args, thread });

            // Assert
            actualUpdate.ShouldBe(expectedUpdate);
        }
コード例 #26
0
        private void OnValidateActivity(ProcessActivityEventArgs args)
        {
            if (args.ObjectKind != ObjectKind.StatusUpdate)
            {
                return;
            }

            switch (args.ActivityKind)
            {
            case ActivityKind.Created:
                ValidateCreationActivity(args);
                break;

            case ActivityKind.CommentAdded:
                ValidateCommentCreationActivity(args);
                break;
            }
        }
コード例 #27
0
        private void ValidateCommentCreationActivity(ProcessActivityEventArgs args)
        {
            ValidateCreationActivity(args);

            Dictionary <string, object> data = args.Data;

            new DataValidator(data).Validate(new Dictionary <string, DataType>
            {
                { "CommentId", DataType.Guid },
                { "Comment", DataType.String },
                { "CommentTime", DataType.DateTime }
            });

            if (args.ActivityManager.ActivityExists(ObjectKind.StatusUpdate, ActivityKind.CommentAdded,
                                                    (Guid)data["WebId"], (Guid)data["ListId"], (int)data["ItemId"], data["CommentId"].ToString()))
            {
                throw new SocialEngineException("Cannot register creation activity on the same comment more than once",
                                                LogKind.Info);
            }
        }
コード例 #28
0
        private void RegisterCommentUpdationActivity(ProcessActivityEventArgs args)
        {
            RegisterUpdationActivity(args);

            Dictionary <string, object> data = args.Data;

            args.ActivityManager.UpdateActivity(new Dictionary <string, object>
            {
                {
                    "Data", new JavaScriptSerializer().Serialize(new
                    {
                        comment    = data["Comment"],
                        commenters = data["Commenters"]
                    })
                }
            }, new Dictionary <string, object>
            {
                { "ActivityKey", data["CommentId"].ToString().ToUpper() }
            });
        }
コード例 #29
0
ファイル: List.cs プロジェクト: ersil/vepmlive-investigations
        private void RegisterBulkOperationActivity(ProcessActivityEventArgs args)
        {
            Dictionary <string, object> data = args.Data;
            ThreadManager   threadManager    = args.ThreadManager;
            ActivityManager activityManager  = args.ActivityManager;
            StreamManager   streamManager    = args.StreamManager;

            var webId = (Guid)data["WebId"];

            var activityDateTime = (DateTime)data["ActivityTime"];

            Thread thread = threadManager.SaveThread(new Thread
            {
                Title  = string.Empty,
                Url    = string.Empty,
                Kind   = ObjectKind.List,
                WebId  = webId,
                ListId = (Guid)data["Id"],
                FirstActivityDateTime = activityDateTime,
                Users = new[] { new User {
                                    Id = (int)data["UserId"], Role = UserRole.Author
                                } }
            });

            var activity = new Activity
            {
                Kind   = args.ActivityKind,
                UserId = (int)data["UserId"],
                Thread = thread,
                Date   = activityDateTime
            };

            activity.SetData(new { totalActivities = data["TotalActivities"] });

            activityManager.RegisterActivity(activity);

            Guid streamId = streamManager.GetGlobalStreamId(webId);

            threadManager.AssociateStreams(thread, new[] { streamId });
            threadManager.UpdateUsers(thread);
        }
コード例 #30
0
        internal static void ValidateCommentCreationActivity(this ProcessActivityEventArgs args)
        {
            if (args == null)
            {
                throw new ArgumentNullException(nameof(args));
            }

            ValidateCreationActivity(args);

            var data = args.Data;

            if (EnsureNotIgnoredList(args, data))
            {
                return;
            }

            new DataValidator(data).Validate(new Dictionary <string, DataType>
            {
                { "CommentId", DataType.Guid },
                { "Comment", DataType.String }
            });

            Guid webId;
            Guid listId;
            int  id;

            ParseActivityVales(data, out webId, out listId, out id);

            if (args.ActivityManager.ActivityExists(
                    ObjectKind.ListItem,
                    args.ActivityKind,
                    webId,
                    listId,
                    id,
                    data["CommentId"].ToString()))
            {
                throw new SocialEngineException(
                          "Cannot register creation activity on the same comment more than once",
                          LogKind.Info);
            }
        }