Esempio n. 1
0
        void ExportCore(object selectedObject, IEnumerable <IClassInfoGraphNode> serializedClassInfoGraphNodes,
                        XElement root, ElementSchema elementSchema)
        {
            var typeInfo   = XafTypesInfo.Instance.FindTypeInfo(selectedObject.GetType());
            var objectInfo = new ObjectInfo(selectedObject.GetType(), typeInfo.KeyMember.GetValue(selectedObject));

            if (!(_exportedObjecs.ContainsKey(objectInfo)))
            {
                _exportedObjecs.Add(objectInfo, null);
                var serializedObjectElement = new XElement(elementSchema.SerializedObject);
                serializedObjectElement.Add(new XAttribute(elementSchema.Type, selectedObject.GetType().Name));
                root.Add(serializedObjectElement);
                foreach (var classInfoGraphNode in serializedClassInfoGraphNodes.Where(
                             node => node.SerializationStrategy != SerializationStrategy.DoNotSerialize))
                {
                    var propertyElement = GetPropertyElement(serializedObjectElement, classInfoGraphNode, elementSchema);
                    switch (classInfoGraphNode.NodeType)
                    {
                    case NodeType.Simple:
                        SetMemberValue(typeInfo, selectedObject, classInfoGraphNode, propertyElement);
                        break;

                    case NodeType.Object:
                        CreateObjectProperty(typeInfo, selectedObject, propertyElement, classInfoGraphNode, root, elementSchema);
                        break;

                    case NodeType.Collection:
                        CreateCollectionProperty(typeInfo, selectedObject, classInfoGraphNode, root, propertyElement, elementSchema);
                        break;
                    }
                }
            }
        }
Esempio n. 2
0
        void HandleError(XElement element, FailReason failReason, ElementSchema elementSchema, IObjectSpace objectSpace = null)
        {
            objectSpace = objectSpace ?? _objectSpace;
            string innerXml = null;
            string elementXml;
            var    firstOrDefault = element.Ancestors(elementSchema.SerializedObject).FirstOrDefault();

            if (firstOrDefault != null && firstOrDefault != element)
            {
                innerXml   = element.ToString();
                elementXml = firstOrDefault.ToString();
            }
            else
            {
                elementXml = element.ToString();
            }

            if (_errorHandling == ErrorHandling.CreateErrorObjects)
            {
                var errorInfoObject = objectSpace.Create <IIOError>();
                errorInfoObject.Reason     = failReason;
                errorInfoObject.ElementXml = elementXml;
                errorInfoObject.InnerXml   = innerXml;
                objectSpace.CommitChanges();
                throw new UserFriendlyException("Import failed check IOError list for details.");
            }

            if (_errorHandling == ErrorHandling.ThrowException)
            {
                throw new UserFriendlyException(new Exception("ImportFailed", new Exception("Reason=" + failReason + "ELEMENTXML=" + elementXml + " INNERXML=" + innerXml)));
            }
        }
Esempio n. 3
0
        public static string GetTypeAttributeValue(this XElement element, bool minifyOutput)
        {
            var elementSchema = ElementSchema.Get(minifyOutput);
            var value         = element.GetAttributeValue(elementSchema.Type);

            return(string.IsNullOrEmpty(value) ? NodeType.Simple.ToString().MakeFirstCharLower() : value);
        }
Esempio n. 4
0
        ITypeInfo GetTypeInfo(XElement element, ElementSchema elementSchema, IObjectSpace objectSpace)
        {
            var typeInfo = ReflectionHelper.FindTypeInfoByName(element.GetAttributeValue(elementSchema.Type));

            if (typeInfo == null)
            {
                HandleError(element, FailReason.TypeNotFound, elementSchema, objectSpace);
            }
            return(typeInfo);
        }
Esempio n. 5
0
 object GetObject(XElement element, ITypeInfo typeInfo, CriteriaOperator criteriaOperator,
                  ElementSchema elementSchema)
 {
     if (!ReferenceEquals(criteriaOperator, null))
     {
         var theObject         = _objectSpace.ModifiedObjects.Cast <object>().FirstOrDefault(o => IsAlreadyCreated(typeInfo, criteriaOperator, o));
         var objectKeyCriteria = GetObjectKeyCriteria(typeInfo, GetKeys(element, elementSchema), elementSchema);
         return(theObject ??
                ((UnitOfWork)_objectSpace.Session()).FindObject(typeInfo.QueryXPClassInfo(), objectKeyCriteria, true) ?? _objectSpace.CreateObject(typeInfo.Type));
     }
     return(null);
 }
Esempio n. 6
0
        static IEnumerable <XElement> GetKeys(XElement element, ElementSchema elementSchema)
        {
            if (element.GetAttributeValue(elementSchema.Strategy) == SerializationStrategy.SerializeAsValue.ToString())
            {
                return(element.Descendants(elementSchema.Key));
            }
            IEnumerable <XElement> elements = element.Descendants(elementSchema.Property);
            var xElements =
                elements.Where(xElement => xElement.GetAttributeValue(elementSchema.IsKey).FirstCharacterToUpper() == true.ToString(CultureInfo.InvariantCulture));

            return(xElements);
        }
Esempio n. 7
0
        object CreateObject(XElement element, ITypeInfo typeInfo, CriteriaOperator objectKeyCriteria,
                            ElementSchema elementSchema)
        {
            var xpBaseObject = GetObject(element, typeInfo, objectKeyCriteria, elementSchema);
            var keyValuePair = new KeyValuePair <ITypeInfo, CriteriaOperator>(typeInfo, objectKeyCriteria);

            if (!_importedObjects.ContainsKey(keyValuePair))
            {
                _importedObjects.Add(keyValuePair, null);
                ImportProperties(typeInfo, xpBaseObject, element, elementSchema);
            }
            return(xpBaseObject);
        }
Esempio n. 8
0
        void CreateCollectionProperty(ITypeInfo typeInfo, object selectedObject, IClassInfoGraphNode classInfoGraphNode,
                                      XElement root, XElement propertyElement, ElementSchema elementSchema)
        {
            var memberInfo = typeInfo.FindMember(classInfoGraphNode.Name);

            if (memberInfo?.GetValue(selectedObject) is IEnumerable theObjects)
            {
                foreach (var theObject in theObjects)
                {
                    CreateRefElelement(classInfoGraphNode, theObject.GetType(), root, theObject, propertyElement, elementSchema);
                }
            }
        }
Esempio n. 9
0
 public static ElementSchema Get(bool minifyOutput)
 {
     _defaultSchema = _defaultSchema ?? new ElementSchema()
     {
         SerializedObjectRef = "SerializedObjectRef", Name = "name", IsKey = "isKey", Property = "Property",
         Strategy            = "strategy", Type = "type", SerializedObjects = "SerializedObjects",
         SerializedObject    = "SerializedObject", Key = "Key"
     };
     _minimalSchema = _minimalSchema ?? new ElementSchema {
         IsMinified          = true,
         SerializedObjectRef = "a", Name = "b", IsKey = "c", Property = "d",
         Strategy            = "e", Type = "f", SerializedObjects = "g",
         SerializedObject    = "h", Key = "j"
     };
     return(minifyOutput ? _minimalSchema : _defaultSchema);
 }
Esempio n. 10
0
        XElement GetPropertyElement(XElement serializedObjectElement, IClassInfoGraphNode classInfoGraphNode,
                                    ElementSchema elementSchema)
        {
            var propertyElement = new XElement(elementSchema.Property);

            serializedObjectElement.Add(propertyElement);
            if ((_minifyOutput && classInfoGraphNode.NodeType != NodeType.Simple) || !_minifyOutput)
            {
                propertyElement.Add(new XAttribute(elementSchema.Type, classInfoGraphNode.NodeType.ToString().FirstCharacterToLower()));
            }
            propertyElement.Add(new XAttribute(elementSchema.Name, classInfoGraphNode.Name));
            if ((_minifyOutput && classInfoGraphNode.Key) || !_minifyOutput)
            {
                propertyElement.Add(new XAttribute(elementSchema.IsKey, classInfoGraphNode.Key));
            }
            return(propertyElement);
        }
Esempio n. 11
0
        void CreateRefElelement(IClassInfoGraphNode classInfoGraphNode, Type objectType, XElement root,
                                object theObject, XElement propertyElement, ElementSchema elementSchema)
        {
            var serializedObjectRefElement = new XElement(elementSchema.SerializedObjectRef);

            propertyElement.Add(serializedObjectRefElement);
            serializedObjectRefElement.Add(new XAttribute(elementSchema.Type, objectType.Name));
            serializedObjectRefElement.Add(new XAttribute(elementSchema.Strategy, classInfoGraphNode.SerializationStrategy));
            if (theObject != null)
            {
                var classInfoGraphNodes = _serializeClassInfoGraphNodesCalculator.GetSerializedClassInfoGraphNodes(theObject, objectType.Name).ToArray();
                CreateRefKeyElements(XafTypesInfo.CastTypeToTypeInfo(objectType), classInfoGraphNodes, theObject, serializedObjectRefElement, elementSchema);
                if (classInfoGraphNode.SerializationStrategy == SerializationStrategy.SerializeAsObject)
                {
                    ExportCore(theObject, classInfoGraphNodes, root, elementSchema);
                }
            }
        }
Esempio n. 12
0
        public static XElement FindObjectFromRefenceElement(this XElement xElement, bool minifyOutput)
        {
            var elementSchema = ElementSchema.Get(minifyOutput);
            var typeValue     = xElement.GetTypeAttributeValue(minifyOutput);
            var infos         = xElement.Descendants(elementSchema.Key).Select(
                element1 => new { Element = element1, Name = element1.GetAttributeValue(elementSchema.Name), element1.Value });
            var select =
                xElement.Document?.Root?.SerializedObjects(minifyOutput).Where(
                    element => element.GetTypeAttributeValue(minifyOutput) == typeValue).Descendants(elementSchema.Property).Where(
                    xElement1 => xElement1.GetAttributeValue(elementSchema.IsKey) == "true").
                Select(element1 =>
                       new { Element = element1.Parent, Name = element1.GetAttributeValue(elementSchema.Name), element1.Value });

            return
                (select?.Where(
                     arg => infos.Any(arg1 => arg.Name == arg1.Name && arg.Value == arg1.Value)).
                 Select(arg2 => arg2.Element).FirstOrDefault());
        }
Esempio n. 13
0
        public XDocument Export(IEnumerable <object> baseCollection,
                                ISerializationConfigurationGroup serializationConfigurationGroup)
        {
            var xDocument = new XDocument();

            _minifyOutput = serializationConfigurationGroup.MinifyOutput;
            var elementInfo = ElementSchema.Get(_minifyOutput);
            var root        = new XElement(elementInfo.SerializedObjects);

            root.Add(new XAttribute(ElementSchema.Minified, _minifyOutput));
            xDocument.Add(root);
            _serializeClassInfoGraphNodesCalculator =
                new SerializeClassInfoGraphNodesCalculator(serializationConfigurationGroup, _objectSpace);
            foreach (var baseObject in baseCollection)
            {
                var serializedClassInfoGraphNodes = _serializeClassInfoGraphNodesCalculator.GetSerializedClassInfoGraphNodes(baseObject);
                ExportCore(baseObject, serializedClassInfoGraphNodes, root, elementInfo);
            }
            return(xDocument);
        }
Esempio n. 14
0
        int ImportObjects(XDocument document, Func <ITypeInfo, IObjectSpace> objectSpaceQuery)
        {
            if (document.Root != null)
            {
                var elementInfo = ElementSchema.Get(document);
                _errorObjectSpace = _errorObjectSpace ?? objectSpaceQuery(null);
                foreach (var element in document.Root.Nodes().OfType <XElement>())
                {
                    var typeInfo = GetTypeInfo(element, elementInfo, _errorObjectSpace);
                    _objectSpace = _objectSpace ?? objectSpaceQuery(typeInfo);

                    var keys = GetKeys(element, elementInfo);
                    var objectKeyCriteria = GetObjectKeyCriteria(typeInfo, keys, elementInfo);
                    if (!ReferenceEquals(objectKeyCriteria, null))
                    {
                        CreateObject(element, typeInfo, objectKeyCriteria, elementInfo);
                    }
                }
                _objectSpace.CommitChanges();
            }
            return(0);
        }
Esempio n. 15
0
        void ImportComplexProperties(XElement element, Action <object, XElement> instance, NodeType nodeType,
                                     ElementSchema elementSchema)
        {
            var objectElements = GetObjectRefElements(element, nodeType, elementSchema);
            var typeInfo       = GetTypeInfo(element, elementSchema, _errorObjectSpace);

            foreach (var objectElement in objectElements)
            {
                var memberTypeInfo = GetTypeInfo(objectElement, elementSchema, _errorObjectSpace);
                if (memberTypeInfo != null)
                {
                    var    refObjectKeyCriteria = GetObjectKeyCriteria(memberTypeInfo, objectElement.Descendants(elementSchema.Key), elementSchema);
                    object xpBaseObject         = null;
                    var    element1             = objectElement;
                    if (objectElement.GetAttributeValue(elementSchema.Strategy) ==
                        SerializationStrategy.SerializeAsObject.ToString())
                    {
                        var findObjectFromRefenceElement = objectElement.FindObjectFromRefenceElement(elementSchema.IsMinified);
                        HandleErrorComplex(objectElement, typeInfo, () => {
                            if (findObjectFromRefenceElement != null)
                            {
                                xpBaseObject = CreateObject(findObjectFromRefenceElement, memberTypeInfo, refObjectKeyCriteria, elementSchema);
                            }
                            instance.Invoke(xpBaseObject, element1);
                        }, elementSchema);
                    }
                    else
                    {
                        HandleErrorComplex(objectElement, typeInfo, () => {
                            xpBaseObject = GetObject(objectElement, memberTypeInfo, refObjectKeyCriteria, elementSchema);
                            instance.Invoke(xpBaseObject, element1);
                        }, elementSchema);
                    }
                }
            }
        }
Esempio n. 16
0
        public static XElement Property(this IEnumerable <XElement> properties, string name, bool minifyOutput)
        {
            var elementSchema = ElementSchema.Get(minifyOutput);

            return(properties.FirstOrDefault(element => element.GetAttributeValue(elementSchema.Name) == name));
        }
Esempio n. 17
0
        public static IEnumerable <XElement> Properties(this XElement element, bool minifyOutput)
        {
            var elementSchema = ElementSchema.Get(minifyOutput);

            return(element.Descendants(elementSchema.Property));
        }
Esempio n. 18
0
        public static IEnumerable <XElement> Properties(this IEnumerable <XElement> elements, NodeType nodeType, bool minifyOutput)
        {
            var elementSchema = ElementSchema.Get(minifyOutput);

            return(elements.Descendants(elementSchema.Property).Where(xElement => xElement.GetTypeAttributeValue(minifyOutput) == nodeType.ToString().MakeFirstCharLower()));
        }
Esempio n. 19
0
        public static IEnumerable <XElement> ObjectKeyProperties(this XElement element, bool minifyOutput)
        {
            var elementSchema = ElementSchema.Get(minifyOutput);

            return(element.Descendants(elementSchema.Property).Where(xElement => xElement.GetAttributeValue(elementSchema.IsKey) == "true"));
        }
Esempio n. 20
0
 IEnumerable <XElement> GetObjectRefElements(XElement element, NodeType nodeType, ElementSchema elementSchema)
 {
     return(element.Properties(nodeType, elementSchema.IsMinified).SelectMany(
                element1 => element1.Descendants(elementSchema.SerializedObjectRef)));
 }
Esempio n. 21
0
 void ImportSimpleProperties(ITypeInfo typeInfo, XElement element, object theObject, ElementSchema elementSchema)
 {
     foreach (XElement simpleElement in element.Properties(NodeType.Simple, elementSchema.IsMinified))
     {
         string propertyName = simpleElement.GetAttributeValue(elementSchema.Name);
         var    memberInfo   = typeInfo.FindMember(propertyName);
         if (memberInfo != null)
         {
             object value = GetValue(simpleElement, memberInfo);
             typeInfo.FindMember(propertyName).SetValue(theObject, value);
         }
         else
         {
             HandleError(simpleElement, FailReason.PropertyNotFound, elementSchema);
         }
     }
 }
Esempio n. 22
0
        void CreateObjectProperty(ITypeInfo typeInfo, object selectedObject, XElement propertyElement,
                                  IClassInfoGraphNode classInfoGraphNode, XElement root, ElementSchema elementSchema)
        {
            var memberInfo = typeInfo.FindMember(classInfoGraphNode.Name);

            if (memberInfo != null)
            {
                var theObject = (XPBaseObject)memberInfo.GetValue(selectedObject);
                CreateRefElelement(classInfoGraphNode, theObject?.GetType() ?? memberInfo.MemberType, root, theObject, propertyElement, elementSchema);
            }
        }
Esempio n. 23
0
        private void HandleErrorComplex(XElement objectElement, ITypeInfo typeInfo, Action action, ElementSchema elementSchema)
        {
            var memberInfo = typeInfo.FindMember(objectElement.Parent.GetAttributeValue(elementSchema.Name));

            if (memberInfo != null)
            {
                action.Invoke();
            }
            else
            {
                HandleError(objectElement, FailReason.PropertyNotFound, elementSchema);
            }
        }
Esempio n. 24
0
        public static IEnumerable <XElement> KeyElements(this IEnumerable <XElement> element, string name, bool minifyOutput)
        {
            var elementSchema = ElementSchema.Get(minifyOutput);

            return(element.Descendants(elementSchema.Key).Where(xElement => xElement.GetAttributeValue(elementSchema.Name) == name));
        }
Esempio n. 25
0
        public static XElement ObjectProperty(this XElement element, string name, bool minifyOutput)
        {
            var elementSchema = ElementSchema.Get(minifyOutput);

            return(element.Descendants(elementSchema.Property).FirstOrDefault(xElement => xElement.GetAttributeValue(elementSchema.Name) == name));
        }
Esempio n. 26
0
        CriteriaOperator GetObjectKeyCriteria(ITypeInfo typeInfo, IEnumerable <XElement> xElements, ElementSchema elementSchema, string prefix = "")
        {
            CriteriaOperator op = CriteriaOperator.Parse("");

            foreach (var xElement in xElements)
            {
                var propertyName = xElement.GetAttributeValue(elementSchema.Name);
                var iMemberInfo  = typeInfo.FindMember(propertyName);

                if (iMemberInfo != null)
                {
                    var memberType = iMemberInfo.MemberTypeInfo;

                    if (typeof(XPBaseObject).IsAssignableFrom(memberType.Type))
                    {
                        op &= GetObjectKeyCriteria(memberType, xElement.Elements().First().Elements(), elementSchema, prefix + propertyName + ".");
                    }
                    else if (iMemberInfo.MemberType == typeof(Type))
                    {
                        var typeName = (string)GetValue(typeof(string), xElement);
                        var type     = XafTypesInfo.Instance.FindTypeInfo(typeName).Type;
                        op &= CriteriaOperator.Parse(prefix + propertyName + "=?", type);
                    }
                    else
                    {
                        op &= CriteriaOperator.Parse(prefix + propertyName + "=?", XpandReflectionHelper.ChangeType(GetValue(iMemberInfo.MemberType, xElement), memberType.Type));
                    }
                }
                else
                {
                    HandleError(xElement, FailReason.PropertyNotFound, elementSchema);
                }
            }
            return(op);
        }
Esempio n. 27
0
        public static IEnumerable <XElement> SerializedObjectRefs(this IEnumerable <XElement> elements, SerializationStrategy serializationStrategy, bool minifyOutput)
        {
            var elementSchema = ElementSchema.Get(minifyOutput);

            return(elements.Where(element => element.GetAttributeValue(elementSchema.Strategy) == serializationStrategy.ToString()));
        }
Esempio n. 28
0
 void CreateRefKeyElements(ITypeInfo typeInfo, IEnumerable <IClassInfoGraphNode> serializedClassInfoGraphNodes,
                           object theObject, XElement serializedObjectRefElement, ElementSchema elementSchema)
 {
     foreach (var infoGraphNode in serializedClassInfoGraphNodes.Where(node => node.Key))
     {
         var serializedObjectRefKeyElement = new XElement(elementSchema.Key);
         serializedObjectRefKeyElement.Add(new XAttribute(elementSchema.Name, infoGraphNode.Name));
         serializedObjectRefKeyElement.Value = typeInfo.FindMember(infoGraphNode.Name).GetValue(theObject) + "";
         serializedObjectRefElement.Add(serializedObjectRefKeyElement);
     }
 }
Esempio n. 29
0
        public static IEnumerable <XElement> SerializedObjectRefs(this XElement element, bool minifyOutput)
        {
            var elementSchema = ElementSchema.Get(minifyOutput);

            return(element.Descendants(elementSchema.SerializedObjectRef));
        }
Esempio n. 30
0
 void ImportProperties(ITypeInfo typeInfo, object theObject, XElement element, ElementSchema elementSchema)
 {
     ImportSimpleProperties(typeInfo, element, theObject, elementSchema);
     ImportComplexProperties(element, (value, xElement) =>
                             typeInfo.FindMember(xElement.Parent.GetAttributeValue(elementSchema.Name)).SetValue(theObject, value),
                             NodeType.Object, elementSchema);
     ImportComplexProperties(element, (baseObject, element1) =>
                             ((IList)typeInfo.FindMember(element1.Parent.GetAttributeValue(elementSchema.Name)).GetValue(theObject)).Add(
                                 baseObject), NodeType.Collection, elementSchema);
 }