Exemplo n.º 1
0
        private Tuple <ITypeMap, ITypeMap> AddTypeMap(XName qualifiedName)
        {
            var typeDefinition = GetRuntimeTypeDefinition(qualifiedName);

            if (typeDefinition == null)
            {
                return(null);
            }

            if (qualifiedName.NamespaceName != typeDefinition.Name.NamespaceName)
            {
                throw XRoadException.UnknownType(qualifiedName.ToString());
            }

            if (!typeDefinition.Type.GetTypeInfo().IsEnum&& !typeDefinition.Type.GetTypeInfo().IsAbstract&& typeDefinition.Type.GetTypeInfo().GetConstructor(Type.EmptyTypes) == null)
            {
                throw XRoadException.NoDefaultConstructorForType(typeDefinition.Name);
            }

            ITypeMap typeMap;

            if (typeDefinition.TypeMapType != null)
            {
                typeMap = (ITypeMap)Activator.CreateInstance(typeDefinition.TypeMapType, this, typeDefinition);
            }
            else if (typeDefinition.Type.GetTypeInfo().IsEnum)
            {
                typeMap = (ITypeMap)Activator.CreateInstance(typeof(EnumTypeMap), typeDefinition);
            }
            else if (typeDefinition.Type.GetTypeInfo().IsAbstract)
            {
                typeMap = (ITypeMap)Activator.CreateInstance(typeof(AbstractTypeMap), typeDefinition);
            }
            else if (typeDefinition.HasStrictContentOrder)
            {
                typeMap = (ITypeMap)Activator.CreateInstance(typeof(SequenceTypeMap <>).MakeGenericType(typeDefinition.Type), this, typeDefinition);
            }
            else
            {
                typeMap = (ITypeMap)Activator.CreateInstance(typeof(AllTypeMap <>).MakeGenericType(typeDefinition.Type), this, typeDefinition);
            }

            var arrayTypeMap = (ITypeMap)Activator.CreateInstance(typeof(ArrayTypeMap <>).MakeGenericType(typeDefinition.Type), this, schemaDefinitionProvider.GetCollectionDefinition(typeDefinition), typeMap);
            var typeMapTuple = Tuple.Create(typeMap, arrayTypeMap);

            if (!(typeMap is ICompositeTypeMap compositeTypeMap))
            {
                return(xmlTypeMaps.GetOrAdd(qualifiedName, typeMapTuple));
            }

            var partialTypeMaps = new Dictionary <Type, ITypeMap>
            {
                { compositeTypeMap.Definition.Type, compositeTypeMap },
                { arrayTypeMap.Definition.Type, arrayTypeMap }
            };

            compositeTypeMap.InitializeProperties(GetRuntimeProperties(typeDefinition, partialTypeMaps), availableFilters);

            return(xmlTypeMaps.GetOrAdd(qualifiedName, typeMapTuple));
        }
Exemplo n.º 2
0
        private ITypeMap AddTypeMap(Type runtimeType, IDictionary <Type, ITypeMap> partialTypeMaps)
        {
            if (runtimeType.IsXRoadSerializable() && Version.HasValue && !runtimeType.GetTypeInfo().ExistsInVersion(Version.Value))
            {
                throw XRoadException.UnknownType(runtimeType.ToString());
            }

            var typeDefinition = schemaDefinitionProvider.GetTypeDefinition(runtimeType);

            ITypeMap typeMap;

            if (typeDefinition.TypeMapType != null)
            {
                typeMap = (ITypeMap)Activator.CreateInstance(typeDefinition.TypeMapType, this, typeDefinition);
                return(runtimeTypeMaps.GetOrAdd(runtimeType, typeMap));
            }

            var collectionDefinition = typeDefinition as CollectionDefinition;

            if (collectionDefinition != null)
            {
                var elementType = typeDefinition.Type.GetElementType();
                if (!ReferenceEquals(elementType.GetTypeInfo().Assembly, contractAssembly))
                {
                    return(null);
                }

                var itemTypeMap = GetTypeMap(elementType, partialTypeMaps);
                collectionDefinition.ItemDefinition = itemTypeMap.Definition;

                var typeMapType = typeof(ArrayTypeMap <>).MakeGenericType(itemTypeMap.Definition.Type);
                typeMap = (ITypeMap)Activator.CreateInstance(typeMapType, this, collectionDefinition, itemTypeMap);
                return(runtimeTypeMaps.GetOrAdd(runtimeType, typeMap));
            }

            if (!ReferenceEquals(typeDefinition.Type.GetTypeInfo().Assembly, contractAssembly))
            {
                return(null);
            }

            if (!typeDefinition.Type.GetTypeInfo().IsEnum&& !typeDefinition.Type.GetTypeInfo().IsAbstract&& typeDefinition.Type.GetTypeInfo().GetConstructor(Type.EmptyTypes) == null)
            {
                throw XRoadException.NoDefaultConstructorForType(typeDefinition.Type.Name);
            }

            if (typeDefinition.Type.GetTypeInfo().IsEnum)
            {
                typeMap = (ITypeMap)Activator.CreateInstance(typeof(EnumTypeMap), typeDefinition);
            }
            else if (typeDefinition.Type.GetTypeInfo().IsAbstract)
            {
                typeMap = (ITypeMap)Activator.CreateInstance(typeof(AbstractTypeMap), typeDefinition);
            }
            else if (typeDefinition.HasStrictContentOrder)
            {
                typeMap = (ITypeMap)Activator.CreateInstance(typeof(SequenceTypeMap <>).MakeGenericType(typeDefinition.Type), this, typeDefinition);
            }
            else
            {
                typeMap = (ITypeMap)Activator.CreateInstance(typeof(AllTypeMap <>).MakeGenericType(typeDefinition.Type), this, typeDefinition);
            }

            var compositeTypeMap = typeMap as ICompositeTypeMap;

            if (compositeTypeMap == null)
            {
                return(runtimeTypeMaps.GetOrAdd(runtimeType, typeMap));
            }

            partialTypeMaps = partialTypeMaps ?? new Dictionary <Type, ITypeMap>();
            partialTypeMaps.Add(typeDefinition.Type, compositeTypeMap);
            compositeTypeMap.InitializeProperties(GetRuntimeProperties(typeDefinition, partialTypeMaps), availableFilters);
            partialTypeMaps.Remove(typeDefinition.Type);

            return(runtimeTypeMaps.GetOrAdd(runtimeType, compositeTypeMap));
        }