コード例 #1
0
        /// <summary>
        /// Регестрирует все изменения над событиями в хранилище метаданных
        /// Данный plugin должен быть подписан на все post события производимые над всеми метаклассами событий
        /// В хранилище метаданных отслеживаться будет только события (в случаи наличия рекрсии только базовое зобытие рекрсии).
        /// Например: 1. Если мы изменяем ресурсы события то в хранилище метаданных изменится версия связанного с данным ресурсом события.
        ///	2. Если мы создаем exception то обновиться метаданные только базовго события, а новые метаданные для exception созданы не будут.
        /// </summary>
        /// <param name="context">The context.</param>
        public void Execute(BusinessContext context)
        {
            bool needTracking = false;

            //Отмлеживаем только во время отсутствия прцесса синхронизации
            if (!CalendarEventSyncProvider.SyncSessionInProcess(Provider.ReplicaId))
            {
                //Регистрируем только вызовы BusinessObjectRequestHandler, все вызовы  перехватываемые  обработчиком
                //отслеживать не нужно.
                bool origRequestInvoked = context.Request.Parameters.GetValue <bool>(Mediachase.Ibn.Events.CustomMethods.EventHelper.FORCE_BASE_PARAM, false);
                if (origRequestInvoked)
                {
                    //перечисление методов
                    switch (context.GetMethod())
                    {
                    case RequestMethod.Create:
                    case RequestMethod.Delete:
                    case RequestMethod.Update:
                    case CalendarResourcesUpdateMethod.METHOD_NAME:
                    case ChangeTrackingMethod.METHOD_NAME:
                        needTracking = true;
                        break;
                    }
                }
            }

            if (needTracking)
            {
                PrimaryKeyId?eventId = null;
                //Пытаемся получить event pk из запроса или ответа
                if (context.GetTargetMetaClassName() == CalendarEventEntity.ClassName)
                {
                    eventId = context.Request.Target.PrimaryKeyId;
                    if (eventId == null)
                    {
                        eventId = ((CreateResponse)context.Response).PrimaryKeyId;
                    }
                }
                else if (context.GetTargetMetaClassName() == CalendarEventRecurrenceEntity.ClassName)
                {
                    eventId = (PrimaryKeyId?)context.Request.Target[CalendarEventRecurrenceEntity.FieldEventId];
                }
                else if (context.GetTargetMetaClassName() == CalendarEventResourceEntity.ClassName)
                {
                    eventId = (PrimaryKeyId?)context.Request.Target[CalendarEventResourceEntity.FieldEventId];
                }

                VirtualEventId vEventId = (VirtualEventId)eventId.Value;
                eventId = vEventId.RealEventId;
                //для события (виртуального или exception) необходимо произвести обновление только метаданных
                //родительского события
                if (vEventId.IsRecurrence)
                {
                    ChangeVersionMetadataItem(eventId);
                }
                else
                {
                    //только для методов касающихся события выполняются операции создания и удаления метаданных
                    if (context.GetTargetMetaClassName() == CalendarEventEntity.ClassName &&
                        context.Request.Method == RequestMethod.Create)
                    {
                        CreateMetadataItem(eventId.Value);
                    }
                    else if (context.GetTargetMetaClassName() == CalendarEventEntity.ClassName &&
                             context.Request.Method == RequestMethod.Delete)
                    {
                        MarkAsTombstoneMetadataItem(eventId);
                    }
                    else
                    {
                        ChangeVersionMetadataItem(eventId);
                    }
                }
            }
        }