Example #1
0
        protected override ObjectTypeDescriptor <dynamic, dynamic> Mapping <T>(ObjectTypeDescriptor <dynamic, dynamic> o)
        {
            var metadataPropertyKey = Metadata.Key;

            return(o
                   .Properties(osp => osp
                               .UriKeyword()
                               .Keyword(ky =>
            {
                ky
                .Name(NodeNames.Value)
                .Fields(ff =>
                {
                    ff.DmpStandardEnglishAnalyzer();
                    ff.DmpNgramAnalyzer();

                    if (Metadata.Properties.ContainsKey(Strings.Taxonomy))
                    {
                        ff.DmpTaxonomyAnalyzer(metadataPropertyKey);
                        ff.DmpNgramTaxonomyAnalyzer(metadataPropertyKey);
                        ff.ExactTaxonomyAnalyzer(metadataPropertyKey);
                    }

                    return ff;
                });

                if (typeof(T) != typeof(LinkedTypesOptions))
                {
                    ky.CopyTo(cc => cc.Fields(Strings.DidYouMeanTrigram));
                }

                return ky;
            })
                               ));
        }
Example #2
0
        private MethodCallBuilder CreateBuildDataStatement(ObjectTypeDescriptor concreteType)
        {
            MethodCallBuilder returnStatement = MethodCallBuilder
                                                .New()
                                                .SetNew()
                                                .SetMethodName(
                $"{concreteType.RuntimeType.Namespace}.State." +
                CreateDataTypeName(concreteType.Name))
                                                .AddArgument("typename");

            foreach (PropertyDescriptor property in concreteType.Properties)
            {
                if (property.Name.Value.EqualsOrdinal(WellKnownNames.TypeName))
                {
                    continue;
                }

                returnStatement.AddArgument(
                    CodeBlockBuilder
                    .New()
                    .AddCode($"{GetParameterName(property.Name)}: ")
                    .AddCode(BuildUpdateMethodCall(property)));
            }

            return(returnStatement);
        }
Example #3
0
        protected override ObjectTypeDescriptor <dynamic, dynamic> Mapping <T>(ObjectTypeDescriptor <dynamic, dynamic> o)
        {
            var currentOptionType = typeof(T).ToString();

            // Check if rule is applied in linked types.
            // If true, do not apply all nested fields of this property
            if (currentOptionType.Equals(typeof(LinkedTypesOptions).ToString()))
            {
                return(o.Properties(pn => pn
                                    .UriKeyword()
                                    .EdgeKeyword()
                                    .ValueKeyword()
                                    ));
            }
            else
            {
                var nestedProperties = CollectProperties(Metadata.NestedMetadata);
                return(o.Properties(pn => pn
                                    .UriKeyword()
                                    .EdgeKeyword()
                                    .CustomNode(NodeNames.Value, od => od
                                                .Properties(pd => pd
                                                            .AddNestedFields(nestedProperties)
                                                            )
                                                )
                                    ));
            }
        }
        private ICode CreateEntityConstructorCall(
            ObjectTypeDescriptor objectTypeDescriptor,
            bool assignDefault)
        {
            var propertyLookup = objectTypeDescriptor.Properties.ToDictionary(x => x.Name.Value);

            MethodCallBuilder newEntity = MethodCallBuilder
                                          .Inline()
                                          .SetNew()
                                          .SetMethodName(objectTypeDescriptor.EntityTypeDescriptor.RuntimeType.ToString());

            foreach (PropertyDescriptor property in
                     objectTypeDescriptor.EntityTypeDescriptor.Properties.Values)
            {
                if (propertyLookup.TryGetValue(property.Name.Value, out var ownProperty))
                {
                    newEntity.AddArgument(BuildUpdateMethodCall(ownProperty));
                }
                else if (assignDefault)
                {
                    newEntity.AddArgument("default!");
                }
                else
                {
                    newEntity.AddArgument($"{_entity}.{property.Name}");
                }
            }

            return(MethodCallBuilder
                   .New()
                   .SetMethodName(_session, "SetEntity")
                   .AddArgument(_entityId)
                   .AddArgument(newEntity));
        }
Example #5
0
        protected override ObjectTypeDescriptor <dynamic, dynamic> Mapping <T>(ObjectTypeDescriptor <dynamic, dynamic> o)
        {
            return(o
                   .Properties(osp => osp
                               .Keyword(ky =>
            {
                ky
                .Name(NodeNames.Value)
                .Fields(ff => ff
                        .DmpStandardEnglishAnalyzer()
                        .DmpNgramAnalyzer()
                        );

                if (typeof(T) != typeof(LinkedTypesOptions))
                {
                    ky.CopyTo(cc => cc
                              .Fields(
                                  Strings.DidYouMeanTrigram,
                                  Strings.AutoCompleteFilter,
                                  Strings.AutoCompleteTerms
                                  )
                              );
                }

                return ky;
            })
                               ));
        }
        private IfBuilder GenerateComplexDataInterfaceIfClause(
            ObjectTypeDescriptor objectTypeDescriptor,
            string variableName)
        {
            var matchedTypeName = GetParameterName(objectTypeDescriptor.Name);

            // since we want to create the data name we will need to craft the type name
            // by hand by using the GraphQL type name and the state namespace.
            var dataTypeName = new RuntimeTypeInfo(
                CreateDataTypeName(objectTypeDescriptor.Name),
                $"{objectTypeDescriptor.RuntimeType.Namespace}.State");

            var block = CodeBlockBuilder.New();

            MethodCallBuilder constructorCall = MethodCallBuilder
                                                .Inline()
                                                .SetNew()
                                                .SetMethodName(objectTypeDescriptor.RuntimeType.ToString());

            foreach (PropertyDescriptor prop in objectTypeDescriptor.Properties)
            {
                if (prop.Type.IsEntityType())
                {
                    constructorCall.AddArgument(BuildMapMethodCall(matchedTypeName, prop));
                }
                else if (prop.Type.IsNonNullableType())
                {
                    if (prop.Type.NamedType() is ILeafTypeDescriptor
                    {
                        RuntimeType: { IsValueType: true }
                    })
Example #7
0
 protected override ObjectTypeDescriptor <dynamic, dynamic> Mapping <T>(ObjectTypeDescriptor <dynamic, dynamic> o)
 {
     return(o
            .Properties(osp => osp
                        .ValueKeyword()
                        ));
 }
        private static ICode GenerateEntityHandlerIfClause(
            ObjectTypeDescriptor objectTypeDescriptor,
            bool isNonNullable)
        {
            var dataMapperName =
                GetFieldName(
                    CreateEntityMapperName(
                        objectTypeDescriptor.RuntimeType.Name,
                        objectTypeDescriptor.Name));

            MethodCallBuilder constructorCall = MethodCallBuilder
                                                .New()
                                                .SetReturn()
                                                .SetWrapArguments()
                                                .SetMethodName(dataMapperName, nameof(IEntityMapper <object, object> .Map));

            MethodCallBuilder argument = MethodCallBuilder
                                         .Inline()
                                         .SetMethodName(StoreFieldName, nameof(IEntityStore.GetEntity))
                                         .AddGeneric(CreateEntityTypeName(objectTypeDescriptor.Name))
                                         .AddArgument(isNonNullable ? _entityId : $"{_entityId}.Value");

            constructorCall.AddArgument(
                NullCheckBuilder
                .New()
                .SetDetermineStatement(false)
                .SetCondition(argument)
                .SetCode(ExceptionBuilder.Inline(TypeNames.GraphQLClientException)));


            IfBuilder ifCorrectType = IfBuilder
                                      .New()
                                      .AddCode(constructorCall)
                                      .SetCondition(
                MethodCallBuilder
                .Inline()
                .SetMethodName(
                    isNonNullable
                                ? new[]
            {
                _entityId,
                nameof(EntityId.Name),
                nameof(string.Equals)
            }
                                : new[]
            {
                _entityId,
                nameof(Nullable <EntityId> .Value),
                nameof(EntityId.Name),
                nameof(string.Equals)
            })
                .AddArgument(objectTypeDescriptor.Name.AsStringToken())
                .AddArgument(TypeNames.OrdinalStringComparison));

            return(CodeBlockBuilder
                   .New()
                   .AddEmptyLine()
                   .AddCode(ifCorrectType));
        }
Example #9
0
        private IfBuilder GenerateDataInterfaceIfClause(
            ObjectTypeDescriptor objectTypeDescriptor,
            bool isNonNullable,
            string variableName)
        {
            ICode ifCondition = MethodCallBuilder
                                .Inline()
                                .SetMethodName(
                _dataParameterName.MakeNullable(!isNonNullable),
                WellKnownNames.TypeName,
                nameof(string.Equals))
                                .AddArgument(objectTypeDescriptor.Name.AsStringToken())
                                .AddArgument(TypeNames.OrdinalStringComparison);

            if (!isNonNullable)
            {
                ifCondition = NullCheckBuilder
                              .New()
                              .SetCondition(ifCondition)
                              .SetSingleLine()
                              .SetDetermineStatement(false)
                              .SetCode("false");
            }

            MethodCallBuilder constructorCall = MethodCallBuilder
                                                .Inline()
                                                .SetNew()
                                                .SetMethodName(objectTypeDescriptor.RuntimeType.Name);

            foreach (PropertyDescriptor prop in objectTypeDescriptor.Properties)
            {
                var propAccess = $"{_dataParameterName}.{prop.Name}";
                if (prop.Type.IsEntityType() || prop.Type.IsDataType())
                {
                    constructorCall.AddArgument(BuildMapMethodCall(_dataParameterName, prop, true));
                }
                else if (prop.Type.IsNullableType())
                {
                    constructorCall.AddArgument(propAccess);
                }
                else
                {
                    constructorCall
                    .AddArgument(
                        NullCheckBuilder
                        .Inline()
                        .SetCondition(propAccess)
                        .SetCode(ExceptionBuilder.Inline(TypeNames.ArgumentNullException)));
                }
            }

            return(IfBuilder
                   .New()
                   .SetCondition(ifCondition)
                   .AddCode(AssignmentBuilder
                            .New()
                            .SetLefthandSide(variableName)
                            .SetRighthandSide(constructorCall)));
        }
        public void SetUp()
        {
            var objectTypeId = new ObjectTypeId(new Guid(objectTypeIdValue));
            var repository   = new ObjectTypeDescriptorRepository();

            repository.RegisterUsingReflection(typeof(TestingObject));
            typeDescriptor = repository.GetByTypeId(objectTypeId);
        }
        public void SetUp()
        {
            var objectTypeId = new ObjectTypeId(new Guid(objectTypeIdValue));
            var repository = new ObjectTypeDescriptorRepository();

            repository.RegisterUsingReflection(typeof(TestingObject));
            typeDescriptor = repository.GetByTypeId(objectTypeId);
        }
Example #12
0
 protected override ObjectTypeDescriptor <dynamic, dynamic> Mapping <T>(ObjectTypeDescriptor <dynamic, dynamic> o)
 {
     return(o
            .Properties(osp => osp
                        .Date(ky => ky
                              .Name(NodeNames.Value)
                              )
                        ));
 }
Example #13
0
    protected override ObjectTypeDefinition CreateDefinition(
        ITypeDiscoveryContext context)
    {
        var descriptor = ObjectTypeDescriptor.New <T>(context.DescriptorContext);

        _configure !(descriptor);
        _configure = null;

        return(descriptor.CreateDefinition());
    }
        public void It_throws_exception_when_trying_to_register_two_types_with_same_id()
        {
            var objectTypeId = ObjectTypeId.NewUniqueId();
            var repository = new ObjectTypeDescriptorRepository();
            var firstTypeDescriptor = new ObjectTypeDescriptor(typeof(object), objectTypeId, new AttributeDescriptor[] { }, new RelationDescriptor[] { });
            var secondTypeDescriptor = new ObjectTypeDescriptor(typeof(int), objectTypeId, new AttributeDescriptor[] { }, new RelationDescriptor[] { });
            repository.RegisterTypeDescriptor(firstTypeDescriptor);

            Assert.Throws<InvalidOperationException>(() => repository.RegisterTypeDescriptor(secondTypeDescriptor));
        }
        public void It_throws_exception_when_trying_to_register_two_types_with_same_id()
        {
            var objectTypeId         = ObjectTypeId.NewUniqueId();
            var repository           = new ObjectTypeDescriptorRepository();
            var firstTypeDescriptor  = new ObjectTypeDescriptor(typeof(object), objectTypeId, new AttributeDescriptor[] { }, new RelationDescriptor[] { });
            var secondTypeDescriptor = new ObjectTypeDescriptor(typeof(int), objectTypeId, new AttributeDescriptor[] { }, new RelationDescriptor[] { });

            repository.RegisterTypeDescriptor(firstTypeDescriptor);

            Assert.Throws <InvalidOperationException>(() => repository.RegisterTypeDescriptor(secondTypeDescriptor));
        }
Example #16
0
 public static ObjectTypeDescriptor <dynamic, dynamic> NestedNodeProperties(
     this ObjectTypeDescriptor <dynamic, dynamic> o)
 {
     return(o
            .Properties(op => op
                        .UriKeyword()
                        .Keyword(ky => ky.Name(NodeNames.Value)
                                 .Fields(ff => ff.DmpNgramAnalyzer().DmpStandardEnglishAnalyzer())
                                 )
                        ));
 }
Example #17
0
        public ITypeDescriptor Create(Type type)
        {
            SerializerTypeInfo result;

            if (_typeOrDescriptor2Info.TryGetValue(type, out result))
            {
                return(result.Descriptor);
            }
            if (_typeOrDescriptor2InfoNew.TryGetValue(type, out result))
            {
                return(result.Descriptor);
            }
            ITypeDescriptor desc = null;

            if (!type.IsSubclassOf(typeof(Delegate)))
            {
                if (type.IsGenericType)
                {
                    if (type.GetGenericTypeDefinition().InheritsOrImplements(typeof(IList <>)))
                    {
                        desc = new ListTypeDescriptor(this, type);
                    }
                    else if (type.GetGenericTypeDefinition().InheritsOrImplements(typeof(IDictionary <,>)))
                    {
                        desc = new DictionaryTypeDescriptor(this, type);
                    }
                }
                else if (type.IsArray)
                {
                    desc = new ListTypeDescriptor(this, type);
                }
                else if (type.IsEnum)
                {
                    desc = new EnumTypeDescriptor(this, type);
                }
                else
                {
                    desc = new ObjectTypeDescriptor(this, type);
                }
            }
            if (desc == null)
            {
                throw new BTDBException("Don't know how to serialize type " + type.ToSimpleName());
            }
            result = new SerializerTypeInfo
            {
                Id         = 0,
                Descriptor = desc
            };
            _typeOrDescriptor2InfoNew[desc] = result;
            _typeOrDescriptor2InfoNew[type] = result;
            desc.FinishBuildFromType(this);
            return(desc);
        }
        public void It_returns_object_type_by_its_id()
        {
            var objectTypeId   = ObjectTypeId.NewUniqueId();
            var repository     = new ObjectTypeDescriptorRepository();
            var typeDescriptor = new ObjectTypeDescriptor(typeof(object), objectTypeId, new AttributeDescriptor[] {},
                                                          new RelationDescriptor[] {});

            repository.RegisterTypeDescriptor(typeDescriptor);
            var registered = repository.GetByTypeId(objectTypeId);

            Assert.IsNotNull(registered);
        }
        public void It_returns_object_type_by_its_id()
        {
            var objectTypeId = ObjectTypeId.NewUniqueId();
            var repository = new ObjectTypeDescriptorRepository();
            var typeDescriptor = new ObjectTypeDescriptor(typeof (object), objectTypeId, new AttributeDescriptor[] {},
                                                          new RelationDescriptor[] {});

            repository.RegisterTypeDescriptor(typeDescriptor);
            var registered = repository.GetByTypeId(objectTypeId);

            Assert.IsNotNull(registered);
        }
Example #20
0
        private static ICode GenerateEntityHandlerIfClause(
            ObjectTypeDescriptor objectTypeDescriptor,
            bool isNonNullable)
        {
            var dataMapperName =
                GetFieldName(
                    CreateEntityMapperName(
                        objectTypeDescriptor.RuntimeType.Name,
                        objectTypeDescriptor.Name));

            var ifCorrectType = IfBuilder.New();

            if (isNonNullable)
            {
                ifCorrectType.SetCondition(
                    $"{EntityIdParamName}.Name.Equals(\"" +
                    $"{objectTypeDescriptor.Name}\", " +
                    $"{TypeNames.OrdinalStringComparison})");
            }
            else
            {
                ifCorrectType.SetCondition(
                    $"{EntityIdParamName}.Value.Name.Equals(\"" +
                    $"{objectTypeDescriptor.Name}\", " +
                    $"{TypeNames.OrdinalStringComparison})");
            }

            MethodCallBuilder constructorCall = MethodCallBuilder.New()
                                                .SetPrefix($"return {dataMapperName}.")
                                                .SetWrapArguments()
                                                .SetMethodName(nameof(IEntityMapper <object, object> .Map));

            MethodCallBuilder argument = MethodCallBuilder.New()
                                         .SetMethodName($"{StoreFieldName}.{nameof(IEntityStore.GetEntity)}")
                                         .SetDetermineStatement(false)
                                         .AddGeneric(CreateEntityTypeName(objectTypeDescriptor.Name))
                                         .AddArgument(isNonNullable ? EntityIdParamName : $"{EntityIdParamName}.Value");

            constructorCall.AddArgument(
                NullCheckBuilder.New()
                .SetDetermineStatement(false)
                .SetCondition(argument)
                .SetCode(ExceptionBuilder
                         .New(TypeNames.GraphQLClientException)
                         .SetDetermineStatement(false)));

            ifCorrectType.AddCode(constructorCall);

            return(CodeBlockBuilder.New()
                   .AddEmptyLine()
                   .AddCode(ifCorrectType));
        }
 protected override ObjectTypeDescriptor <dynamic, dynamic> Mapping <T>(ObjectTypeDescriptor <dynamic, dynamic> o)
 {
     return(o
            .Properties(osp => osp
                        .UriKeyword()
                        .Keyword(ky =>
     {
         ky
         .Name(NodeNames.Value)
         .Fields(ff => ff
                 .DmpStandardEnglishAnalyzer()
                 );
         return ky;
     })
                        ));
 }
Example #22
0
        private IfBuilder GenerateDataInterfaceIfClause(
            ObjectTypeDescriptor objectTypeDescriptor,
            bool isNonNullable,
            string variableName)
        {
            var ifCorrectType = IfBuilder.New();

            if (isNonNullable)
            {
                ifCorrectType.SetCondition(
                    $"{_dataParameterName}.__typename.Equals(\"" +
                    $"{objectTypeDescriptor.Name}\", " +
                    $"{TypeNames.OrdinalStringComparison})");
            }
            else
            {
                ifCorrectType.SetCondition(
                    $"{_dataParameterName}?.__typename.Equals(\"" +
                    $"{objectTypeDescriptor.Name}\", " +
                    $"{TypeNames.OrdinalStringComparison}) ?? false");
            }


            var constructorCall = MethodCallBuilder.New()
                                  .SetPrefix($"{variableName} = new ")
                                  .SetMethodName(objectTypeDescriptor.RuntimeType.Name);

            foreach (PropertyDescriptor prop in objectTypeDescriptor.Properties)
            {
                var propAccess = $"{_dataParameterName}.{prop.Name}";
                if (prop.Type.IsEntityType())
                {
                    constructorCall.AddArgument(BuildMapMethodCall(_dataParameterName, prop, true));
                }
                else
                {
                    constructorCall.AddArgument(
                        $"{propAccess} ?? throw new {TypeNames.ArgumentNullException}()");
                }
            }

            ifCorrectType.AddCode(constructorCall);
            return(ifCorrectType);
        }
    protected override ObjectTypeDefinition CreateDefinition(
        ITypeDiscoveryContext context)
    {
        try
        {
            if (Definition is null)
            {
                var descriptor = ObjectTypeDescriptor.FromSchemaType(
                    context.DescriptorContext,
                    GetType());
                _configure !.Invoke(descriptor);
                return(descriptor.CreateDefinition());
            }

            return(Definition);
        }
        finally
        {
            _configure = null;
        }
    }
Example #24
0
        private IfBuilder GenerateComplexDataInterfaceIfClause(
            ObjectTypeDescriptor objectTypeDescriptor,
            string variableName)
        {
            var ifCorrectType   = IfBuilder.New();
            var matchedTypeName = GetParameterName(objectTypeDescriptor.Name);

            // since we want to create the data name we will need to craft the type name
            // by hand by using the GraphQL type name and the state namespace.
            // TODO : state namespace should be available here!
            var dataTypeName = new RuntimeTypeInfo(
                CreateDataTypeName(objectTypeDescriptor.Name),
                $"{objectTypeDescriptor.RuntimeType.Namespace}.State");

            ifCorrectType.SetCondition(
                $"{_dataParameterName} is {dataTypeName} {matchedTypeName}");

            var constructorCall = MethodCallBuilder.New()
                                  .SetPrefix($"{variableName} = new ")
                                  .SetMethodName(objectTypeDescriptor.RuntimeType.ToString());

            foreach (PropertyDescriptor prop in objectTypeDescriptor.Properties)
            {
                var propAccess = $"{matchedTypeName}.{prop.Name}";
                if (prop.Type.IsEntityType())
                {
                    constructorCall.AddArgument(
                        BuildMapMethodCall(
                            matchedTypeName,
                            prop));
                }
                else
                {
                    constructorCall.AddArgument(propAccess);
                }
            }

            return(ifCorrectType.AddCode(constructorCall));
        }
        private IfBuilder GenerateComplexDataInterfaceIfClause(
            ObjectTypeDescriptor objectTypeDescriptor,
            string variableName)
        {
            var matchedTypeName = GetParameterName(objectTypeDescriptor.Name);

            // since we want to create the data name we will need to craft the type name
            // by hand by using the GraphQL type name and the state namespace.
            var dataTypeName = new RuntimeTypeInfo(
                CreateDataTypeName(objectTypeDescriptor.Name),
                $"{objectTypeDescriptor.RuntimeType.Namespace}.State");

            MethodCallBuilder constructorCall = MethodCallBuilder
                                                .Inline()
                                                .SetNew()
                                                .SetMethodName(objectTypeDescriptor.RuntimeType.ToString());

            foreach (PropertyDescriptor prop in objectTypeDescriptor.Properties)
            {
                if (prop.Type.IsEntityType())
                {
                    constructorCall.AddArgument(BuildMapMethodCall(matchedTypeName, prop));
                }
                else
                {
                    constructorCall.AddArgument($"{matchedTypeName}.{prop.Name}");
                }
            }

            return(IfBuilder
                   .New()
                   .SetCondition($"{_dataParameterName} is {dataTypeName} {matchedTypeName}")
                   .AddCode(
                       AssignmentBuilder
                       .New()
                       .SetLefthandSide(variableName)
                       .SetRighthandSide(constructorCall)));
        }
Example #26
0
        protected override ObjectTypeDescriptor <dynamic, dynamic> Mapping <T>(ObjectTypeDescriptor <dynamic, dynamic> o)
        {
            return(o
                   .Properties(osp => osp
                               .Keyword(ky =>
            {
                ky
                .Name(NodeNames.Value)
                .Normalizer("lowercase")
                .Fields(ff => ff
                        .DmpStandardEnglishAnalyzer()
                        .DmpNgramAnalyzer()
                        );

                if (typeof(T) != typeof(LinkedTypesOptions))
                {
                    ky.CopyTo(ct => ct.Fields(Strings.DidYouMeanTrigram));
                }

                return ky;
            })
                               ));
        }
        private IfBuilder CreateUpdateEntityStatement(
            ObjectTypeDescriptor concreteType)
        {
            IfBuilder ifStatement = IfBuilder
                                    .New()
                                    .SetCondition(
                MethodCallBuilder
                .Inline()
                .SetMethodName(_entityId, "Name", nameof(string.Equals))
                .AddArgument(concreteType.Name.AsStringToken())
                .AddArgument(TypeNames.OrdinalStringComparison));

            RuntimeTypeInfo entityTypeName = CreateEntityType(
                concreteType.Name,
                concreteType.RuntimeType.NamespaceWithoutGlobal);

            IfBuilder ifBuilder = BuildTryGetEntityIf(entityTypeName)
                                  .AddCode(CreateEntityConstructorCall(concreteType, false))
                                  .AddElse(CreateEntityConstructorCall(concreteType, true));

            return(ifStatement
                   .AddCode(ifBuilder)
                   .AddEmptyLine());
        }
Example #28
0
        public void ProcessMetadataLog(ByteBuffer buffer)
        {
            var reader = new ByteBufferReader(buffer);
            var typeId = reader.ReadVInt32();

            while (typeId != 0)
            {
                var             typeCategory = (TypeCategory)reader.ReadUInt8();
                ITypeDescriptor descriptor;
                switch (typeCategory)
                {
                case TypeCategory.BuildIn:
                    throw new ArgumentOutOfRangeException();

                case TypeCategory.Class:
                    descriptor = new ObjectTypeDescriptor(this, reader, NestedDescriptorReader);
                    break;

                case TypeCategory.List:
                    descriptor = new ListTypeDescriptor(this, reader, NestedDescriptorReader);
                    break;

                case TypeCategory.Dictionary:
                    descriptor = new DictionaryTypeDescriptor(this, reader, NestedDescriptorReader);
                    break;

                case TypeCategory.Enum:
                    descriptor = new EnumTypeDescriptor(this, reader);
                    break;

                case TypeCategory.Nullable:
                    descriptor = new NullableTypeDescriptor(this, reader, NestedDescriptorReader);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
                while (-typeId - 1 >= _id2InfoNew.Count)
                {
                    _id2InfoNew.Add(null);
                }
                if (_id2InfoNew[-typeId - 1] == null)
                {
                    _id2InfoNew[-typeId - 1] = new DeserializerTypeInfo {
                        Id = typeId, Descriptor = descriptor
                    }
                }
                ;
                typeId = reader.ReadVInt32();
            }
            for (var i = 0; i < _id2InfoNew.Count; i++)
            {
                _id2InfoNew[i].Descriptor.MapNestedTypes(d =>
                {
                    var placeHolderDescriptor = d as PlaceHolderDescriptor;
                    return(placeHolderDescriptor != null ? _id2InfoNew[-placeHolderDescriptor.TypeId - 1].Descriptor : d);
                });
            }
            // This additional cycle is needed to fill names of recursive structures
            for (var i = 0; i < _id2InfoNew.Count; i++)
            {
                _id2InfoNew[i].Descriptor.MapNestedTypes(d => d);
            }
            for (var i = 0; i < _id2InfoNew.Count; i++)
            {
                var infoForType = _id2InfoNew[i];
                for (var j = ReservedBuildinTypes; j < _id2Info.Count; j++)
                {
                    if (infoForType.Descriptor.Equals(_id2Info[j].Descriptor))
                    {
                        _remapToOld[infoForType.Descriptor] = _id2Info[j].Descriptor;
                        _id2InfoNew[i] = _id2Info[j];
                        infoForType    = _id2InfoNew[i];
                        break;
                    }
                }
                if (infoForType.Id < 0)
                {
                    infoForType.Id = _id2Info.Count;
                    _id2Info.Add(infoForType);
                    _typeOrDescriptor2Info[infoForType.Descriptor] = infoForType;
                }
            }
            for (var i = 0; i < _id2InfoNew.Count; i++)
            {
                _id2InfoNew[i].Descriptor.MapNestedTypes(d =>
                {
                    ITypeDescriptor res;
                    return(_remapToOld.TryGetValue(d, out res) ? res : d);
                });
            }
            _id2InfoNew.Clear();
            _remapToOld.Clear();
        }

        Func <AbstractBufferedReader, ITypeBinaryDeserializerContext, ITypeDescriptor, object> LoaderFactory(ITypeDescriptor descriptor)
        {
            var loadAsType    = LoadAsType(descriptor);
            var methodBuilder = ILBuilder.Instance.NewMethod <Func <AbstractBufferedReader, ITypeBinaryDeserializerContext, ITypeDescriptor, object> >("DeserializerFor" + descriptor.Name);
            var il            = methodBuilder.Generator;

            descriptor.GenerateLoad(il, ilGen => ilGen.Ldarg(0), ilGen => ilGen.Ldarg(1), ilGen => ilGen.Ldarg(2), loadAsType);
            if (loadAsType.IsValueType)
            {
                il.Box(loadAsType);
            }
            else if (loadAsType != typeof(object))
            {
                il.Castclass(typeof(object));
            }
            il.Ret();
            return(methodBuilder.Create());
        }
Example #29
0
        public ITypeDescriptor Create(Type type)
        {
            if (_typeOrDescriptor2Info.TryGetValue(type, out var result))
            {
                return(result.Descriptor);
            }
            if (_typeOrDescriptor2InfoNew.TryGetValue(type, out result))
            {
                return(result.Descriptor);
            }
            ITypeDescriptor desc            = null;
            Type            typeAlternative = null;

            if (!type.IsSubclassOf(typeof(Delegate)))
            {
                if (type.IsGenericType)
                {
                    typeAlternative = type.SpecializationOf(typeof(IList <>));
                    if (typeAlternative != null)
                    {
                        if (type != typeAlternative)
                        {
                            if (_typeOrDescriptor2Info.TryGetValue(typeAlternative, out result))
                            {
                                _typeOrDescriptor2Info[type] = result;
                                return(result.Descriptor);
                            }

                            if (_typeOrDescriptor2InfoNew.TryGetValue(typeAlternative, out result))
                            {
                                _typeOrDescriptor2InfoNew[type] = result;
                                return(result.Descriptor);
                            }
                        }

                        desc = new ListTypeDescriptor(this, typeAlternative);
                    }
                    else
                    {
                        typeAlternative = type.SpecializationOf(typeof(IDictionary <,>));
                        if (typeAlternative != null)
                        {
                            if (type != typeAlternative)
                            {
                                if (_typeOrDescriptor2Info.TryGetValue(typeAlternative, out result))
                                {
                                    _typeOrDescriptor2Info[type] = result;
                                    return(result.Descriptor);
                                }

                                if (_typeOrDescriptor2InfoNew.TryGetValue(typeAlternative, out result))
                                {
                                    _typeOrDescriptor2InfoNew[type] = result;
                                    return(result.Descriptor);
                                }
                            }

                            desc = new DictionaryTypeDescriptor(this, typeAlternative);
                        }
                        else if (type.GetGenericTypeDefinition().InheritsOrImplements(typeof(IIndirect <>)))
                        {
                            return(null);
                        }
                        else if (type.GetGenericTypeDefinition() == typeof(Nullable <>))
                        {
                            typeAlternative = type.SpecializationOf(typeof(Nullable <>));
                            if (typeAlternative != null)
                            {
                                if (type != typeAlternative)
                                {
                                    if (_typeOrDescriptor2Info.TryGetValue(typeAlternative, out result))
                                    {
                                        _typeOrDescriptor2Info[type] = result;
                                        return(result.Descriptor);
                                    }

                                    if (_typeOrDescriptor2InfoNew.TryGetValue(typeAlternative, out result))
                                    {
                                        _typeOrDescriptor2InfoNew[type] = result;
                                        return(result.Descriptor);
                                    }
                                }

                                desc = new NullableTypeDescriptor(this, typeAlternative);
                            }
                        }
                    }
                }
                else if (type.IsArray)
                {
                    typeAlternative = type.SpecializationOf(typeof(IList <>));
                    Debug.Assert(typeAlternative != null && type != typeAlternative);
                    if (_typeOrDescriptor2Info.TryGetValue(typeAlternative, out result))
                    {
                        _typeOrDescriptor2Info[type] = result;
                        return(result.Descriptor);
                    }

                    if (_typeOrDescriptor2InfoNew.TryGetValue(typeAlternative, out result))
                    {
                        _typeOrDescriptor2InfoNew[type] = result;
                        return(result.Descriptor);
                    }

                    desc = new ListTypeDescriptor(this, typeAlternative);
                }
                else if (type.IsEnum)
                {
                    desc = new EnumTypeDescriptor(this, type);
                }
                else if (type.IsValueType)
                {
                    throw new BTDBException($"Unsupported value type {type.Name}.");
                }
                else
                {
                    desc = new ObjectTypeDescriptor(this, type);
                }
            }

            if (desc == null)
            {
                throw new BTDBException("Don't know how to serialize type " + type.ToSimpleName());
            }
            result = new SerializerTypeInfo
            {
                Id         = 0,
                Descriptor = desc
            };
            _typeOrDescriptor2InfoNew[desc] = result;
            _typeOrDescriptor2InfoNew[type] = result;
            if (typeAlternative != null)
            {
                _typeOrDescriptor2InfoNew[typeAlternative] = result;
            }
            if (!desc.FinishBuildFromType(this))
            {
                _typeOrDescriptor2InfoNew.Remove(desc);
                _typeOrDescriptor2InfoNew.Remove(type);
                if (typeAlternative != null)
                {
                    _typeOrDescriptor2InfoNew.Remove(typeAlternative);
                }
                return(null);
            }

            return(desc);
        }
Example #30
0
        public void ProcessMetadataLog(ByteBuffer buffer)
        {
            var reader = new ByteBufferReader(buffer);
            var typeId = reader.ReadVInt32();

            while (typeId != 0)
            {
                var             typeCategory = (TypeCategory)reader.ReadUInt8();
                ITypeDescriptor descriptor;
                switch (typeCategory)
                {
                case TypeCategory.BuildIn:
                    throw new ArgumentOutOfRangeException();

                case TypeCategory.Class:
                    descriptor = new ObjectTypeDescriptor(this, reader, NestedDescriptorReader);
                    break;

                case TypeCategory.List:
                    descriptor = new ListTypeDescriptor(this, reader, NestedDescriptorReader);
                    break;

                case TypeCategory.Dictionary:
                    descriptor = new DictionaryTypeDescriptor(this, reader, NestedDescriptorReader);
                    break;

                case TypeCategory.Enum:
                    descriptor = new EnumTypeDescriptor(this, reader);
                    break;

                case TypeCategory.Nullable:
                    descriptor = new NullableTypeDescriptor(this, reader, NestedDescriptorReader);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                while (-typeId - 1 >= _id2InfoNew.Count)
                {
                    _id2InfoNew.Add(null);
                }
                if (_id2InfoNew[-typeId - 1] == null)
                {
                    _id2InfoNew[-typeId - 1] = new SerializerTypeInfo {
                        Id = typeId, Descriptor = descriptor
                    }
                }
                ;
                typeId = reader.ReadVInt32();
            }

            for (var i = 0; i < _id2InfoNew.Count; i++)
            {
                _id2InfoNew[i] !.Descriptor.MapNestedTypes(d =>
                {
                    var placeHolderDescriptor = d as PlaceHolderDescriptor;
                    return(placeHolderDescriptor != null
                        ? _id2InfoNew[-placeHolderDescriptor.TypeId - 1] !.Descriptor
                        : d);
                });
            }

            // This additional cycle is needed to fill names of recursive structures
            for (var i = 0; i < _id2InfoNew.Count; i++)
            {
                _id2InfoNew[i] !.Descriptor.MapNestedTypes(d => d);
            }

            for (var i = 0; i < _id2InfoNew.Count; i++)
            {
                var infoForType = _id2InfoNew[i] !;
                for (var j = ReservedBuildinTypes; j < _id2Info.Count; j++)
                {
                    if (infoForType.Descriptor.Equals(_id2Info[j].Descriptor))
                    {
                        _remapToOld[infoForType.Descriptor] = _id2Info[j].Descriptor;
                        _id2InfoNew[i] = _id2Info[j];
                        infoForType    = _id2InfoNew[i];
                        break;
                    }
                }

                if (infoForType.Id < 0)
                {
                    infoForType.Id = _id2Info.Count;
                    _id2Info.Add(infoForType);
                    _typeOrDescriptor2Info[infoForType.Descriptor] = infoForType;
                }
            }

            for (var i = 0; i < _id2InfoNew.Count; i++)
            {
                _id2InfoNew[i] !.Descriptor.MapNestedTypes(d =>
                {
                    ITypeDescriptor res;
                    return(_remapToOld.TryGetValue(d, out res) ? res : d);
                });
            }

            _id2InfoNew.Clear();
            _remapToOld.Clear();
        }
Example #31
0
 public static ObjectTypeDescriptor <dynamic, dynamic> Outbound(this ObjectTypeDescriptor <dynamic, dynamic> otb)
 {
     return(otb.Name(NodeNames.Outbound));
 }
Example #32
0
 protected abstract ObjectTypeDescriptor <dynamic, dynamic> Mapping <T>(ObjectTypeDescriptor <dynamic, dynamic> o) where T : IOptions;
 public static ObjectTypeDescriptor ToDescriptor(
     this ObjectTypeDefinition definition,
     IDescriptorContext context)
 => ObjectTypeDescriptor.From(context, definition);