コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
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);
                    }
                }
            }
        }