/// <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); } } } }