/// <summary> /// Gets the provider. /// </summary> /// <param name="principal">The principal.</param> /// <param name="syncProviderType">Type of the sync provider.</param> /// <returns></returns> public static GenericRemoteSyncProvider <EntityObjectHierarchy> GetProvider(int principalId, eSyncProviderType syncProviderType) { GenericRemoteSyncProvider <EntityObjectHierarchy> retVal; string key = GetUniqueProviderKey(principalId, syncProviderType); lock (_lockObject) { if (!_activeSyncPorviders.TryGetValue(key, out retVal)) { switch (syncProviderType) { case eSyncProviderType.Appointment: retVal = CalendarEventSyncProvider.CreateInstance(principalId); break; } if (retVal != null) { _activeSyncPorviders.Add(key, retVal); } } } return(retVal); }
/// <summary> /// Создает экземпляр провайдера для заданного пользователя /// </summary> /// <param name="principalId">The principal id.</param> /// <returns></returns> public static CalendarEventSyncProvider CreateInstance(int principalId) { CalendarEventSyncProvider retVal = null; lock (_lock) { SyncId replicaId = SyncMetadataStore.FindReplicaIdByPrincipalId(principalId); if (replicaId == null) { //генерируем новый replica id replicaId = new SyncId(Guid.NewGuid()); //Создаем новое хранилище метаданных реплики SyncMetadataStore.CreateStore(replicaId, principalId); } retVal = new CalendarEventSyncProvider(replicaId); retVal.InitializeMetaDataStore(); } return(retVal); }
/// <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); } } } }