Example #1
0
        public void WriteAsAttribute(Type type, String classIdAttribute, String classNameAttribute, String classNamespaceAttribute, String classMemberAttribute, IWriter writer)
        {
            Type realType = ProxyHelper.GetRealType(type);
            int  typeId   = writer.GetIdOfObject(type);

            if (typeId > 0)
            {
                writer.WriteAttribute(classIdAttribute, typeId.ToString());
                return;
            }
            typeId = writer.AcquireIdForObject(realType);
            writer.WriteAttribute(classIdAttribute, typeId.ToString());

            StringBuilder sb = StringBuilder;

            try
            {
                while (type.IsArray)
                {
                    sb.Append("[]");
                    type = type.GetElementType();
                }
                String      xmlName, xmlNamespace;
                IXmlTypeKey xmlType;
                Type        genericArgumentType = null;
                if (type.IsGenericType && !typeof(Nullable <>).Equals(type.GetGenericTypeDefinition()))
                {
                    xmlType             = XmlTypeRegistry.GetXmlType(type.GetGenericTypeDefinition());
                    genericArgumentType = type.GetGenericArguments()[0];
                }
                else
                {
                    xmlType = XmlTypeRegistry.GetXmlType(type);
                }
                xmlName      = xmlType.Name;
                xmlNamespace = xmlType.Namespace;
                if (sb.Length > 0)
                {
                    sb.Insert(0, xmlName);
                    writer.WriteAttribute(classNameAttribute, sb.ToString());
                    sb.Length = 0;
                }
                else
                {
                    writer.WriteAttribute(classNameAttribute, xmlName);
                }
                writer.WriteAttribute(classNamespaceAttribute, xmlNamespace);
                if (genericArgumentType != null)
                {
                    WriteAsAttribute(genericArgumentType, "gti", "gn", "gns", "gm", writer);
                }
                if (!realType.IsArray && !realType.IsEnum && !realType.IsInterface && !typeof(Type).Equals(realType))
                {
                    ITypeInfo            typeInfo       = TypeInfoProvider.GetTypeInfo(type);
                    ITypeInfoItem[]      members        = typeInfo.Members;
                    List <ITypeInfoItem> membersToWrite = new List <ITypeInfoItem>(members.Length);
                    for (int a = 0, size = members.Length; a < size; a++)
                    {
                        ITypeInfoItem member = members[a];
                        if (member.IsXMLIgnore)
                        {
                            continue;
                        }
                        if (sb.Length > 0)
                        {
                            sb.Append(' ');
                        }
                        sb.Append(member.Name);
                        membersToWrite.Add(member);
                    }
                    if (sb.Length > 0)
                    {
                        writer.WriteAttribute(classMemberAttribute, sb.ToString());
                        sb.Length = 0;
                    }
                    writer.PutMembersOfType(type, ListUtil.ToArray(membersToWrite));
                }
            }
            finally
            {
                sb.Length = 0;
            }
        }
Example #2
0
 protected bool ArePrimitivesEqual(IEntityMetaData metaData, PrimitiveMember primitiveMember, Object objValue, Object cloneValue, MergeHandle handle)
 {
     if (objValue != null && cloneValue != null)
     {
         if (objValue is Array && cloneValue is Array)
         {
             Array objArray   = (Array)objValue;
             Array cloneArray = (Array)cloneValue;
             if (objArray.Length != cloneArray.Length)
             {
                 return(false);
             }
             for (int b = objArray.Length; b-- > 0;)
             {
                 Object objItem   = objArray.GetValue(b);
                 Object cloneItem = cloneArray.GetValue(b);
                 if (!EqualsObjects(objItem, cloneItem))
                 {
                     return(false);
                 }
             }
             return(true);
         }
         else if (objValue is IList && cloneValue is IList)
         {
             IList objList   = (IList)objValue;
             IList cloneList = (IList)cloneValue;
             if (objList.Count != cloneList.Count)
             {
                 return(false);
             }
             for (int b = objList.Count; b-- > 0;)
             {
                 Object objItem   = objList[b];
                 Object cloneItem = cloneList[b];
                 if (!EqualsObjects(objItem, cloneItem))
                 {
                     return(false);
                 }
             }
             return(true);
         }
         else if (TypeInfoProvider.GetTypeInfo(objValue.GetType()).DoesImplement(typeof(ISet <>)) &&
                  TypeInfoProvider.GetTypeInfo(cloneValue.GetType()).DoesImplement(typeof(ISet <>)))
         {
             if (((ICollection)objValue).Count != ((ICollection)cloneValue).Count)
             {
                 return(false);
             }
             MethodInfo setEqualsMethod = cloneValue.GetType().GetMethod("SetEquals");
             return((bool)setEqualsMethod.Invoke(cloneValue, new Object[] { objValue }));
         }
         else if (objValue is ICollection && cloneValue is ICollection)
         {
             IEnumerator objIter   = ((IEnumerable)objValue).GetEnumerator();
             IEnumerator cloneIter = ((IEnumerable)cloneValue).GetEnumerator();
             while (objIter.MoveNext())
             {
                 if (!cloneIter.MoveNext())
                 {
                     return(false);
                 }
                 Object objItem   = objIter.Current;
                 Object cloneItem = cloneIter.Current;
                 if (!EqualsObjects(objItem, cloneItem))
                 {
                     return(false);
                 }
             }
             if (cloneIter.MoveNext())
             {
                 return(false);
             }
             return(true);
         }
         else if (objValue is IEnumerable && cloneValue is IEnumerable)
         {
             IEnumerator objIter   = ((IEnumerable)objValue).GetEnumerator();
             IEnumerator cloneIter = ((IEnumerable)cloneValue).GetEnumerator();
             while (objIter.MoveNext())
             {
                 if (!cloneIter.MoveNext())
                 {
                     return(false);
                 }
                 Object objItem   = objIter.Current;
                 Object cloneItem = cloneIter.Current;
                 if (!EqualsObjects(objItem, cloneItem))
                 {
                     return(false);
                 }
             }
             if (cloneIter.MoveNext())
             {
                 return(false);
             }
             return(true);
         }
     }
     return(EqualsObjects(objValue, cloneValue));
 }
Example #3
0
        public Type ReadFromAttribute(String classIdAttribute, String classNameAttribute, String classNamespaceAttribute, String classMemberAttribute, IReader reader)
        {
            String classIdValue = reader.GetAttributeValue(classIdAttribute);
            int    classId      = 0;

            if (classIdValue != null && classIdValue.Length > 0)
            {
                classId = Int32.Parse(classIdValue);
            }
            Type typeObj = (Type)reader.GetObjectById(classId, false);

            if (typeObj != null)
            {
                return(typeObj);
            }
            String name            = reader.GetAttributeValue(classNameAttribute);
            String namespaceString = reader.GetAttributeValue(classNamespaceAttribute);

            int dimensionCount = 0;

            while (name.EndsWith("[]"))
            {
                dimensionCount++;
                name = name.Substring(0, name.Length - 2);
            }
            typeObj = XmlTypeRegistry.GetType(name, namespaceString);

            String classMemberValue = reader.GetAttributeValue(classMemberAttribute);

            if (classMemberValue != null)
            {
                ITypeInfo       typeInfo    = TypeInfoProvider.GetTypeInfo(typeObj);
                String[]        memberNames = classMemberValue.Split(' ');
                ITypeInfoItem[] members     = new ITypeInfoItem[memberNames.Length];

                for (int a = memberNames.Length; a-- > 0;)
                {
                    String        memberName = memberNames[a];
                    ITypeInfoItem member     = typeInfo.GetMemberByXmlName(memberName);
                    if (member == null)
                    {
                        throw new Exception("No member found with xml name '" + memberName + "' on entity '" + typeObj.FullName + "'");
                    }
                    members[a] = member;
                }
                reader.PutMembersOfType(typeObj, members);
            }
            String gtIdValue           = classIdAttribute.Equals("gti") ? null : reader.GetAttributeValue("gti");
            Type   genericArgumentType = null;

            if (gtIdValue != null && gtIdValue.Length > 0)
            {
                genericArgumentType = ReadFromAttribute("gti", "gn", "gns", "gm", reader);
                typeObj             = typeObj.MakeGenericType(genericArgumentType);
            }
            while (dimensionCount-- > 0)
            {
                typeObj = typeObj.MakeArrayType();
            }
            reader.PutObjectWithId(typeObj, classId);
            return(typeObj);
        }