예제 #1
0
        /// <summary>
        /// Processa a ação de exclusão.
        /// </summary>
        /// <param name="action"></param>
        private void ProcessDeleteAction(PersistenceAction action)
        {
            var observerManager = Colosoft.Query.RecordObserverManager.Instance;

            if (observerManager == null)
            {
                return;
            }
            Colosoft.Reflection.TypeName typeName = null;
            Query.Record    record;
            Query.RecordKey recordKey;
            var             deleteActionResult = action.Parameters.Where(f => f.Name == DeleteActionResultParameterName).Select(f => (IDeleteActionResult)f.Value).FirstOrDefault();
            IEnumerable <Colosoft.Query.RecordKey> recordKeys = null;

            if (deleteActionResult == null)
            {
                typeName   = GetActionRecord(action, out record, out recordKey);
                recordKeys = new Colosoft.Query.RecordKey[] {
                    recordKey
                };
            }
            else
            {
                typeName   = new Reflection.TypeName(action.EntityFullName);
                recordKeys = deleteActionResult.RecordKeys;
            }
            observerManager.NotifyRecordDeleted(typeName, recordKeys);
        }
예제 #2
0
        /// <summary>
        /// Recupera o registrao associado com a ação.
        /// </summary>
        /// <param name="action">Instancia da ação de persistencia realizada.</param>
        /// <param name="record">Registro gerado.</param>
        /// <param name="recordKey">Chave do registro.</param>
        /// <returns>Nome do tipo associado.</returns>
        private Colosoft.Reflection.TypeName GetActionRecord(PersistenceAction action, out Query.Record record, out Query.RecordKey recordKey)
        {
            var typeName     = new Reflection.TypeName(action.EntityFullName);
            var typeMetadata = TypeSchema.GetTypeMetadata(action.EntityFullName);
            var typeFields   = GetRecordFields(action.EntityFullName, typeMetadata);
            var fields       = new List <Query.Record.Field>();
            var recordValues = new List <object>();

            foreach (var actionParameter in action.Parameters)
            {
                var indexOf = 0;
                for (; indexOf < typeFields.Count; indexOf++)
                {
                    if (typeFields[indexOf].Name == actionParameter.Name)
                    {
                        break;
                    }
                }
                if (indexOf < typeFields.Count)
                {
                    fields.Add(new Query.Record.Field(typeFields[indexOf].Name, typeFields[indexOf].Type));
                    recordValues.Add(actionParameter.Value);
                }
            }
            if (typeMetadata.IsVersioned && !fields.Any(f => f.Name == "RowVersion"))
            {
                fields.Add(new Query.Record.Field("RowVersion", typeof(long)));
                recordValues.Add(action.RowVersion);
            }
            var recordDescriptor = new Query.Record.RecordDescriptor("default", fields);

            record    = recordDescriptor.CreateRecord(recordValues.ToArray());
            recordKey = RecordKeyFactory.Create(typeName, record);
            return(typeName);
        }
예제 #3
0
        /// <summary>
        /// Lê os dados serializados.
        /// </summary>
        /// <param name="reader"></param>
        void System.Xml.Serialization.IXmlSerializable.ReadXml(System.Xml.XmlReader reader)
        {
            Name = reader.GetAttribute("name");
            var type = reader.GetAttribute("type");

            if (!string.IsNullOrEmpty(type))
            {
                Type = new Reflection.TypeName(type);
            }
            if (!reader.IsEmptyElement)
            {
                reader.ReadStartElement();
                while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
                {
                    switch (reader.LocalName)
                    {
                    case "DefaultValue":
                        DefaultValue = reader.ReadElementContentAsString();
                        break;

                    default:
                        reader.Skip();
                        break;
                    }
                }
                reader.ReadEndElement();
            }
            else
            {
                reader.Skip();
            }
        }
예제 #4
0
        /// <summary>
        /// Carrega as informações das propriedades de um determinado tipo.
        /// </summary>
        /// <param name="entityTypeName">Tipo da entidade.</param>
        /// <returns></returns>
        public IEnumerable <IEntityPropertyInfo> LoadTypeProperties(Reflection.TypeName entityTypeName)
        {
            var typeFullName        = entityTypeName.FullName;
            var entityTypeNamespace = string.Join(".", entityTypeName.Namespace);

            System.Collections.IList properties = null;
            bool found = false;

            lock (_entityProperties)
                found = _entityProperties.TryGetValue(typeFullName, out properties);
            if (!found)
            {
                foreach (var version in EntityTypeVersions)
                {
                    if (Reflection.TypeName.TypeNameEqualityComparer.Instance.Equals(version.Type, entityTypeName))
                    {
                        properties = (System.Collections.IList)version.Properties;
                        lock (_entityProperties)
                            if (!_entityProperties.ContainsKey(entityTypeName.FullName))
                            {
                                _entityProperties.Add(entityTypeName.FullName, properties);
                            }
                        break;
                    }
                }
            }
            if (properties != null)
            {
                for (var i = 0; i < properties.Count; i++)
                {
                    yield return((IEntityPropertyInfo)properties[i]);
                }
            }
        }
예제 #5
0
        /// <summary>
        /// Recupera os nomes dos campos que representam a chave do registro.
        /// </summary>
        /// <param name="typeName"></param>
        /// <returns></returns>
        public IEnumerable <string> GetKeyFields(Reflection.TypeName typeName)
        {
            typeName.Require("typeName").NotNull();
            var generator = CreateGenerator(typeName) as Generator;

            return(generator.FieldNames);
        }
예제 #6
0
 /// <summary>
 /// Método acionado quando ocorre um erro no registro do EntityEventInfo.
 /// </summary>
 /// <param name="typeName"></param>
 /// <param name="eventInfo"></param>
 /// <param name="error"></param>
 private void OnRegisterEventInfoError(Reflection.TypeName typeName, EntityEventInfo eventInfo, Exception error)
 {
     if (RegisterEventInfoError != null)
     {
         RegisterEventInfoError(this, new RegisterEntityEventInfoErrorArgs(typeName, eventInfo, error));
     }
 }
예제 #7
0
        /// <summary>
        /// Carrega os labels de uma propriedade.
        /// </summary>
        /// <param name="typeName">Tipo</param>
        /// <param name="uiContext">Contexto com o usuário</param>
        /// <returns></returns>
        public IEnumerable <PropertyLabelInfo> GetLabels(Reflection.TypeName typeName, string uiContext)
        {
            var typeNamespace = string.Join(".", typeName.Namespace);

            foreach (var version in EntityTypeVersions)
            {
                if (Reflection.TypeName.TypeNameEqualityComparer.Instance.Equals(version.Type, typeName))
                {
                    for (var j = 0; j < version.Properties.Count; j++)
                    {
                        var property = version.Properties[j];
                        for (var x = 0; x < property.DefaultLabels.Count; x++)
                        {
                            var defaultLabel = property.DefaultLabels[x];
                            if (string.IsNullOrEmpty(defaultLabel.UIContext) || (uiContext != null && defaultLabel.UIContext == uiContext))
                            {
                                yield return(new PropertyLabelInfo {
                                    Label = defaultLabel,
                                    PropertyName = property.Name
                                });
                            }
                        }
                    }
                    yield break;
                }
            }
        }
예제 #8
0
 /// <summary>
 /// Construtor padrão.
 /// </summary>
 /// <param name="info">Informações do evento da entidade.</param>
 /// <param name="entityType">Nome completo do tipo da entidade.</param>
 /// <param name="subscription"></param>
 public EventSubscriptionInfo(EntityEventInfo info, Reflection.TypeName entityType, Domain.IExecuteSubscription <TPayLoad> subscription)
 {
     subscription.Require("subscription").NotNull();
     this.Info         = info;
     this.EntityType   = entityType;
     this.Subscription = subscription;
 }
예제 #9
0
        /// <summary>
        /// Registra o tipo da entidade que será geranciada.
        /// </summary>
        /// <param name="entityType"></param>
        public void Register(Type entityType)
        {
            entityType.Require("entityType").NotNull();
            IEnumerable <EntityEventInfo> infos = null;
            var typeName = new Reflection.TypeName(entityType.AssemblyQualifiedName);

            if (IsRegistered(typeName))
            {
                return;
            }
            try
            {
                infos = GetEventInfo(typeName);
            }
            catch (Exception ex)
            {
                throw new RegisterEntityEventException(ResourceMessageFormatter.Create(() => Properties.Resources.EntityEventManager_GetEntityEventInfosError, typeName.FullName), ex);
            }
            Registered(typeName);
            if (infos != null)
            {
                foreach (var i in infos)
                {
                    Register(typeName, i);
                }
            }
        }
예제 #10
0
 /// <summary>
 /// Registro o registro para ser observado.
 /// </summary>
 /// <param name="typeName"></param>
 /// <param name="recordKey"></param>
 /// <param name="observer"></param>
 public void Register(Reflection.TypeName typeName, Query.RecordKey recordKey, Colosoft.Query.IRecordObserver observer)
 {
     if (IsEnabled && IsValidType(typeName))
     {
         var typeNameEntry = GetTypeNameEntry(typeName);
         typeNameEntry.AddRecordKey(recordKey, observer);
     }
 }
예제 #11
0
 /// <summary>
 /// Remove o observador do sistema.
 /// </summary>
 /// <param name="typeName"></param>
 /// <param name="observer"></param>
 public void Unregister(Reflection.TypeName typeName, Colosoft.Query.IRecordObserver observer)
 {
     if (IsEnabled && IsValidType(typeName))
     {
         var typeNameEntry = GetTypeNameEntry(typeName);
         typeNameEntry.RemoveObserver(observer);
     }
 }
예제 #12
0
 /// <summary>
 /// Recupera o hash code do nome do tipo.
 /// </summary>
 /// <param name="obj"></param>
 /// <returns></returns>
 public int GetHashCode(Reflection.TypeName obj)
 {
     if (object.ReferenceEquals(obj, null))
     {
         return(0);
     }
     return(obj.AssemblyQualifiedName.GetHashCode());
 }
        /// <summary>
        /// Carrega a customização de especialização da entidade, caso haja.
        /// </summary>
        /// <param name="entityTypeName">Tipo da entidade</param>
        /// <returns></returns>
        public override IEntitySpecialization LoadSpecilization(Reflection.TypeName entityTypeName)
        {
            var specializationId = Settings.GetEntitySpecializationId(entityTypeName);

            if (specializationId.HasValue)
            {
                return(Extensions.ExtensionServiceLocator.Current.GetInstance <IEntitySpecialization>(specializationId.Value));
            }
            return(null);
        }
 /// <summary>
 /// Construtor padrão.
 /// </summary>
 /// <param name="catalog"></param>
 /// <param name="typeName"></param>
 /// <param name="exportDefinitions"></param>
 /// <param name="importDefinitions"></param>
 /// <param name="parameterImportDefinitions"></param>
 /// <param name="partCreationPolicy"></param>
 /// <param name="useDispatcher"></param>
 public ProviderComposablePartDefinition(ComposablePartCatalog catalog, Colosoft.Reflection.TypeName typeName, IList <ProviderExportDefinition> exportDefinitions, Lazy <IEnumerable <ImportDefinition> > importDefinitions, ProviderParameterImportDefinitionContainer parameterImportDefinitions, System.ComponentModel.Composition.CreationPolicy partCreationPolicy, bool useDispatcher)
 {
     _exports = exportDefinitions.Cast <ExportDefinition>().ToArray();
     _imports = importDefinitions;
     _parameterImportDefinitions = parameterImportDefinitions;
     _catalog            = catalog;
     _typeName           = typeName;
     _partCreationPolicy = partCreationPolicy;
     _useDispatcher      = useDispatcher;
 }
예제 #15
0
 /// <summary>
 /// Define que a o tipo da entidade de negócio foi registrado.
 /// </summary>
 /// <param name="entityType">Nome do tipo da entidade de negócio.</param>
 protected virtual void Registered(Reflection.TypeName entityType)
 {
     lock (_registeredTypes)
     {
         var index = _registeredTypes.BinarySearch(entityType, Reflection.TypeName.TypeNameFullNameComparer.Instance);
         if (index < 0)
         {
             _registeredTypes.Insert(~index, entityType);
         }
     }
 }
 /// <summary>
 /// Carrega as informações das propriedades de um determinado tipo.
 /// </summary>
 /// <param name="entityTypeName">Tipo da entidade.</param>
 /// <param name="propertyName">Nome da propriedade</param>
 /// <returns></returns>
 public override IEntityPropertyInfo LoadTypeProperty(Reflection.TypeName entityTypeName, string propertyName)
 {
     foreach (var i in LoadTypeProperties(entityTypeName))
     {
         if (i.FullName == propertyName)
         {
             return(i);
         }
     }
     return(null);
 }
예제 #17
0
 /// <summary>
 /// Lê os dados serializados.
 /// </summary>
 /// <param name="reader"></param>
 void System.Xml.Serialization.IXmlSerializable.ReadXml(System.Xml.XmlReader reader)
 {
     if (reader.MoveToAttribute("uid"))
     {
         Uid = Guid.Parse(reader.ReadContentAsString());
     }
     if (reader.MoveToAttribute("name"))
     {
         Name = reader.ReadContentAsString();
     }
     if (reader.MoveToAttribute("type"))
     {
         var type = reader.ReadContentAsString();
         if (!string.IsNullOrEmpty(type))
         {
             Type = new Reflection.TypeName(type);
         }
     }
     reader.MoveToElement();
     if (!reader.IsEmptyElement)
     {
         reader.ReadStartElement();
         while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
         {
             if (reader.LocalName == "Parameters")
             {
                 reader.ReadStartElement();
                 while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
                 {
                     if (reader.LocalName == "ValidationTypeParameter")
                     {
                         var parameter = new ValidationTypeParameter();
                         ((System.Xml.Serialization.IXmlSerializable)parameter).ReadXml(reader);
                         Parameters.Add(parameter);
                     }
                     else
                     {
                         reader.Skip();
                     }
                 }
                 reader.ReadEndElement();
             }
             else if (reader.LocalName == "Description")
             {
                 Description = reader.ReadElementContentAsString();
             }
         }
         reader.ReadEndElement();
     }
     else
     {
         reader.Skip();
     }
 }
예제 #18
0
 /// <summary>
 /// Recupera o identificador da customização associada com o tipo da entidade.
 /// </summary>
 /// <param name="entityTypeName">Tipo da entidade na qual a customização está associada.</param>
 /// <returns></returns>
 public int?GetEntitySpecializationId(Reflection.TypeName entityTypeName)
 {
     foreach (var typeVersion in EntityTypeVersions)
     {
         if (Reflection.TypeName.TypeNameEqualityComparer.Instance.Equals(typeVersion.Type, entityTypeName))
         {
             return(typeVersion.CustomizationId);
         }
     }
     return(null);
 }
예제 #19
0
 /// <summary>
 /// Recupera a instancia das informações da entidade.
 /// </summary>
 /// <param name="entityTypeName"></param>
 /// <returns></returns>
 private static Info GetInfo(Reflection.TypeName entityTypeName)
 {
     lock (_infos)
     {
         Info info = null;
         if (!_infos.TryGetValue(entityTypeName, out info))
         {
             info = new Info();
             _infos.Add(entityTypeName, info);
         }
         return(info);
     }
 }
예제 #20
0
 /// <summary>
 /// Registra o nome do tipo que terá seus dados carregados para o cache na inicialização.
 /// </summary>
 /// <param name="typeName"></param>
 public virtual IDataCacheManager Register(Reflection.TypeName typeName)
 {
     typeName.Require("typeFullName").NotNull();
     lock (_objLock)
     {
         var index = _typeNames.BinarySearch(typeName, Reflection.TypeName.TypeNameFullNameComparer.Instance);
         if (index < 0)
         {
             _typeNames.Insert(~index, typeName);
         }
     }
     return(this);
 }
예제 #21
0
        /// <summary>
        /// Registra o evento para a entidade.
        /// </summary>
        /// <param name="entityType">Nome da entidade.</param>
        /// <param name="info">Informações do evento.</param>
        private void Register(Reflection.TypeName entityType, EntityEventInfo info)
        {
            Domain.SubscriptionToken token = null;
            switch (info.EventType)
            {
            case EntityEventType.Initialized:
                token = RegisterEvent <EntityInitializedEvent, IEntityInitializedEventSubscription, EntityInitializedEventArgs>(entityType, info);
                break;

            case EntityEventType.PropertyChanging:
                token = RegisterEvent <EntityPropertyChangingEvent, IEntityPropertyChangingEventSubscription, EntityPropertyChangingEventArgs>(entityType, info);
                break;

            case EntityEventType.PropertyChanged:
                token = RegisterEvent <EntityPropertyChangedEvent, IEntityPropertyChangedEventSubscription, EntityPropertyChangedEventArgs>(entityType, info);
                break;

            case EntityEventType.Validating:
                token = RegisterEvent <EntityValidatingEvent, IEntityValidatingEventSubscription, EntityValidatingEventArgs>(entityType, info);
                break;

            case EntityEventType.Validated:
                token = RegisterEvent <EntityValidatedEvent, IEntityValidatedEventSubscription, EntityValidatedEventArgs>(entityType, info);
                break;

            case EntityEventType.Saving:
                token = RegisterEvent <EntitySavingEvent, IEntitySavingEventSubscription, EntitySavingEventArgs>(entityType, info);
                break;

            case EntityEventType.Saved:
                token = RegisterEvent <EntitySavedEvent, IEntitySavedEventSubscription, EntitySavedEventArgs>(entityType, info);
                break;

            case EntityEventType.Deleting:
                token = RegisterEvent <EntityDeletingEvent, IEntityDeletingEventSubscription, EntityDeletingEventArgs>(entityType, info);
                break;

            case EntityEventType.Deleted:
                token = RegisterEvent <EntityDeletedEvent, IEntityDeletedEventSubscription, EntityDeletedEventArgs>(entityType, info);
                break;
            }
            if (token != null)
            {
                List <Domain.SubscriptionToken> tokens = _eventSubscribers[info.EventType];
                lock (tokens)
                    tokens.Add(token);
            }
        }
예제 #22
0
        /// <summary>
        /// Recupera as configurações associadas com o tipo da entidade.
        /// </summary>
        /// <param name="entityTypeName">Tipo da entidade que será usado para filtrar as configurações.</param>
        /// <returns></returns>
        public IEnumerable <IPropertySettingsInfo> GetTypeSettings(Reflection.TypeName entityTypeName)
        {
            var typeFullName        = entityTypeName.FullName;
            var entityTypeNamespace = string.Join(".", entityTypeName.Namespace);

            foreach (var version in EntityTypeVersions)
            {
                if (Reflection.TypeName.TypeNameEqualityComparer.Instance.Equals(version.Type, entityTypeName))
                {
                    foreach (EntityTypeVersionProperty property in version.Properties)
                    {
                        yield return(new PropertySettingsInfoWrapper(version, property, uid => _inputRulesGroups.Where(f => f.Uid == uid).Select(f => (int?)f.InputRulesGroupId).FirstOrDefault()));
                    }
                    yield break;
                }
            }
        }
예제 #23
0
                public bool MoveNext()
                {
                    _currentPosition++;
                    if (_currentPosition >= _package._zipFile.Count)
                    {
                        return(false);
                    }
                    var zipEntry = _package._zipFile[_currentPosition];

                    using (var stream = _package._zipFile.GetInputStream(zipEntry))
                    {
                        var outStream = new System.IO.MemoryStream((int)zipEntry.Size);
                        var read      = 0;
                        while ((read = stream.Read(_buffer, 0, _buffer.Length)) > 0)
                        {
                            outStream.Write(_buffer, 0, read);
                        }
                        outStream.Position = 0;
                        try
                        {
                            var reader         = new Colosoft.Serialization.IO.CompactBinaryReader(outStream);
                            var isNullTypeName = reader.ReadByte() == 0;
                            Colosoft.Reflection.TypeName typeName = null;
                            if (!isNullTypeName)
                            {
                                typeName = new Reflection.TypeName();
                                typeName.Deserialize(reader);
                            }
                            var version    = reader.ReadDateTime();
                            var hasRecords = reader.ReadByte() == 1;
                            outStream.Position = 0;
                            _currrentStream    = outStream;
                            _current           = new Tuple <DataEntryVersion, System.IO.Stream>(new DataEntryVersion {
                                TypeName = typeName,
                                Version  = version
                            }, outStream);
                        }
                        catch
                        {
                            outStream.Dispose();
                            throw;
                        }
                    }
                    return(true);
                }
예제 #24
0
        /// <summary>
        /// Cria uma chave para o registro.
        /// </summary>
        /// <param name="typeName">Nome do tipo que representa os dados contidos no registro.</param>
        /// <param name="record">Instancia do registro com os dados.</param>
        /// <returns>Chave que representa o registro.</returns>
        public Query.RecordKey Create(Reflection.TypeName typeName, Query.IRecord record)
        {
            typeName.Require("typeName").NotNull();
            var  generator  = CreateGenerator(typeName);
            var  key        = generator.GetSimpleKey(record);
            long rowVersion = 0;
            var  index      = 0;

            for (; index < record.Descriptor.Count; index++)
            {
                if (StringComparer.InvariantCultureIgnoreCase.Equals(record.Descriptor[index].Name, "RowVersion"))
                {
                    break;
                }
            }
            if (index < record.Descriptor.Count)
            {
                rowVersion = (long)record.GetInt64(index);
            }
            return(new Query.RecordKey(key, rowVersion));
        }
예제 #25
0
        /// <summary>
        /// Executa a ação para inserir um novo registro no cache.
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        private PersistenceActionResult ExecuteInsertAction(PersistenceAction action)
        {
            var typeMetadata = _typeSchema.GetTypeMetadata(action.EntityFullName);

            if (typeMetadata == null)
            {
                return new PersistenceActionResult {
                           Success        = false,
                           FailureMessage = ResourceMessageFormatter.Create(() => Properties.Resources.CachePersistenceExecuter_TypeMetadataNotFound, action.EntityFullName).Format(),
                }
            }
            ;
            IEnumerable <Colosoft.Query.Record.Field> recordFields = null;

            try
            {
                recordFields = GetRecordFields(action.EntityFullName, typeMetadata);
            }
            catch (Exception ex)
            {
                return(new PersistenceActionResult {
                    Success = false,
                    FailureMessage = ex.Message
                });
            }
            var recordDescriptor = new Colosoft.Query.Record.RecordDescriptor(action.EntityFullName, recordFields);
            var recordValues     = new object[recordDescriptor.Count];

            foreach (var actionParameter in action.Parameters)
            {
                var indexOf = 0;
                for (; indexOf < recordDescriptor.Count; indexOf++)
                {
                    if (StringComparer.InvariantCultureIgnoreCase.Equals(recordDescriptor[indexOf].Name, actionParameter.Name))
                    {
                        break;
                    }
                }
                if (indexOf < recordDescriptor.Count)
                {
                    recordValues[indexOf] = actionParameter.Value;
                }
                else
                {
                    return new PersistenceActionResult {
                               Success        = false,
                               FailureMessage = ResourceMessageFormatter.Create(() => Properties.Resources.CachePersistenceExecuter_PropertyMetadataNotFound, actionParameter.Name, action.EntityFullName).Format()
                    }
                };
            }
            var record       = new CacheItemRecord(new Reflection.TypeName(action.EntityFullName), recordValues, recordDescriptor);
            var typeName     = new Reflection.TypeName(action.EntityFullName);
            var keyGenerator = _keyFactory.Value.CreateGenerator(typeName);
            var key          = keyGenerator.GetKey(record);
            var queryInfo    = GetCacheEntryQueryInfo(Cache, Cache.GetTypeInfoMap(), record);
            var insertResult = Cache.Insert(key, record, null, null, new Colosoft.Caching.Policies.PriorityEvictionHint(CacheItemPriority.Normal), null, null, queryInfo, new BitSet(), null, 0, LockAccessType.IGNORE_LOCK, null, null, new OperationContext(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation));

            return(new PersistenceActionResult {
                Success = true
            });
        }
예제 #26
0
        /// <summary>
        /// Executa a ação para atualizar os dados do registro no cache.
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        private PersistenceActionResult ExecuteUpdateAction(PersistenceAction action)
        {
            var typeName     = new Reflection.TypeName(action.EntityFullName);
            var typeMetadata = _typeSchema.GetTypeMetadata(action.EntityFullName);

            if (typeMetadata == null)
            {
                return new PersistenceActionResult {
                           Success        = false,
                           FailureMessage = ResourceMessageFormatter.Create(() => Properties.Resources.CachePersistenceExecuter_TypeMetadataNotFound, action.EntityFullName).Format(),
                }
            }
            ;
            var query = GetActionQuery(action, typeMetadata).CreateQueryInfo();

            Queries.QueryResultSet queryResult = null;
            try
            {
                queryResult = ((CacheDataSource)_sourceContext.DataSource).ExecuteInCache(query);
            }
            catch (Exception ex)
            {
                return(new PersistenceActionResult {
                    Success = false,
                    FailureMessage = ResourceMessageFormatter.Create(() => Properties.Resources.CachePersistenceExecuter_ExecuteQueryInCacheError, Colosoft.Diagnostics.ExceptionFormatter.FormatException(ex, true)).Format()
                });
            }
            Colosoft.Query.Record.RecordDescriptor recordDescriptor = null;
            try
            {
                recordDescriptor = new Colosoft.Query.Record.RecordDescriptor(action.EntityFullName, GetRecordFields(action.EntityFullName, typeMetadata));
            }
            catch (Exception ex)
            {
                return(new PersistenceActionResult {
                    Success = false,
                    FailureMessage = ex.Message
                });
            }
            var keyGenerator = _keyFactory.Value.CreateGenerator(typeName);
            var typeInfoMap  = Cache.GetTypeInfoMap();
            var keysResult   = queryResult.SearchKeysResult.ToArray();

            if (keysResult.Length > 0)
            {
                foreach (var key in keysResult)
                {
                    var record       = CacheDataSource.CreateRecord(Cache, key, ref recordDescriptor, query);
                    var recordValues = new object[recordDescriptor.Count];
                    record.GetValues(recordValues);
                    foreach (var actionParameter in action.Parameters)
                    {
                        var indexOf = 0;
                        for (; indexOf < recordDescriptor.Count; indexOf++)
                        {
                            if (StringComparer.InvariantCultureIgnoreCase.Equals(recordDescriptor[indexOf].Name, actionParameter.Name))
                            {
                                break;
                            }
                        }
                        if (indexOf < recordDescriptor.Count)
                        {
                            recordValues[indexOf] = actionParameter.Value;
                        }
                    }
                    var newRecord = new CacheItemRecord(new Reflection.TypeName(action.EntityFullName), recordValues, recordDescriptor);
                    var newKey    = keyGenerator.GetKey(newRecord);
                    try
                    {
                        var queryInfo = GetCacheEntryQueryInfo(Cache, typeInfoMap, newRecord);
                        Cache.Remove(key, new OperationContext(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation));
                        var insertResult = Cache.Insert(newKey, newRecord, null, null, new Colosoft.Caching.Policies.PriorityEvictionHint(CacheItemPriority.Normal), null, null, queryInfo, new BitSet(), null, 0, LockAccessType.IGNORE_LOCK, null, null, new OperationContext(OperationContextFieldName.OperationType, OperationContextOperationType.CacheOperation));
                    }
                    catch (Exception ex)
                    {
                        return(new PersistenceActionResult {
                            Success = false,
                            FailureMessage = ex.Message
                        });
                    }
                }
            }
            else
            {
            }
            return(new PersistenceActionResult {
                Success = true
            });
        }
예제 #27
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="typeName"></param>
 /// <param name="collection"></param>
 /// <returns></returns>
 protected override Collections.INotifyCollectionChangedObserver CreateQueryResultChangedObserver(Reflection.TypeName typeName, System.Collections.IList collection)
 {
     if (Colosoft.Query.RecordObserverManager.Instance.IsEnabled)
     {
         throw new NotImplementedException();
     }
     return(null);
 }
예제 #28
0
 /// <summary>
 /// Compara as instancias informadas.
 /// </summary>
 /// <param name="x"></param>
 /// <param name="y"></param>
 /// <returns></returns>
 public bool Equals(Reflection.TypeName x, Reflection.TypeName y)
 {
     return(x != null && y != null && x.AssemblyQualifiedName == y.AssemblyQualifiedName);
 }
예제 #29
0
 protected override Collections.INotifyCollectionChangedObserver CreateQueryResultChangedObserver(Reflection.TypeName typeName, System.Collections.IList collection)
 {
     if (Colosoft.Query.RecordObserverManager.Instance.IsEnabled)
     {
         return(new EntityChildQueryResultChangedObserver(_childInfo, _childLoader, _entityTypeManager, _sourceContext, _uiContext, typeName, collection));
     }
     return(null);
 }
예제 #30
0
 /// <summary>
 /// Construtor padrão.
 /// </summary>
 /// <param name="contractName"></param>
 /// <param name="contractType"></param>
 public AssemblyRepositoryCatalogConflict(string contractName, Reflection.TypeName contractType)
 {
     this.ContractName = contractName;
     this.ContractType = contractType;
 }