Exemple #1
0
        /// <summary>
        /// Deserializes an object
        /// </summary>
        /// <param name="stream">The source stream</param>
        /// <param name="instance">The instance to receive the deserialized properties</param>
        /// <param name="flags">One or more <see cref="SerializedFlags"/> options</param>
        /// <param name="compression">Compression method to use</param>
        public static bool Deserialize <T>(Stream stream, T instance, SerializerFlags flags, CompressionImplementation compression)
        {
            //  Check args
            Debug.Assert(stream != null, "Input stream is null");
            if (stream == null)
            {
                throw new ArgumentNullException("stream");
            }

            return(Deserialize <T>(
                       GetReader(stream, flags, compression),
                       instance,
                       flags
                       ));
        }
Exemple #2
0
        static IPrimitiveReader GetReader(Stream stream, SerializerFlags flags, CompressionImplementation compression)
        {
            //  Decompress source stream if necessary
            if ((flags & SerializerFlags.Compress) != 0)
            {
                byte[] bytes = stream.ToArray();

                bytes = Compressor.GetInstance().Decompress(bytes, compression);
                MemoryStream ms = new MemoryStream(bytes);

                stream = ms;
            }

            return(SerializerFactory.GetReader(stream));
        }
Exemple #3
0
        public SyncAttempt <TObject> Deserialize(XElement node, SerializerFlags flags)
        {
            if (IsEmpty(node))
            {
                // new behavior when a node is 'empty' that is a marker for a delete or rename
                // so we process that action here, no more action file/folders
                return(ProcessAction(node, flags));
            }

            if (!IsValid(node))
            {
                throw new FormatException($"XML Not valid for type {ItemType}");
            }


            if (flags.HasFlag(SerializerFlags.Force) || IsCurrent(node) > ChangeType.NoChange)
            {
                logger.Debug <TObject>("Base: Deserializing");
                var result = DeserializeCore(node);

                if (result.Success)
                {
                    if (!flags.HasFlag(SerializerFlags.DoNotSave))
                    {
                        // save
                        SaveItem(result.Item);
                    }

                    if (flags.HasFlag(SerializerFlags.OnePass))
                    {
                        logger.Debug <TObject>("Base: Second Pass");
                        var secondAttempt = DeserializeSecondPass(result.Item, node, flags);
                        if (secondAttempt.Success)
                        {
                            if (!flags.HasFlag(SerializerFlags.DoNotSave))
                            {
                                // save (again)
                                SaveItem(secondAttempt.Item);
                            }
                        }
                    }
                }

                return(result);
            }

            return(SyncAttempt <TObject> .Succeed(node.Name.LocalName, default(TObject), ChangeType.NoChange));
        }
Exemple #4
0
        protected SyncAttempt <TObject> ProcessAction(XElement node, SerializerFlags flags)
        {
            if (!IsEmpty(node))
            {
                throw new ArgumentException("Cannot process actions on a non-empty node");
            }

            var actionType = node.Attribute("Change").ValueOrDefault <SyncActionType>(SyncActionType.None);

            var(key, alias) = FindKeyAndAlias(node);

            switch (actionType)
            {
            case SyncActionType.Delete:
                return(ProcessDelete(key, alias, flags));

            case SyncActionType.Rename:
                return(ProcessRename(key, alias, flags));

            default:
                return(SyncAttempt <TObject> .Succeed(alias, ChangeType.NoChange));
            }
        }
Exemple #5
0
 protected virtual SyncAttempt <TObject> CanDeserialize(XElement node, SerializerFlags flags)
 => CanDeserialize(node, new SyncSerializerOptions(flags));
Exemple #6
0
        protected virtual SyncAttempt <TObject> ProcessDelete(Guid key, string alias, SerializerFlags flags)
        {
            logger.Debug(serializerType, "Processing Delete {0} {1}", key, alias);

            var item = this.FindItem(key);

            if (item == null && !string.IsNullOrWhiteSpace(alias))
            {
                // we need to build in some awareness of alias matching in the folder
                // because if someone deletes something in one place and creates it
                // somewhere else the alias will exist, so we don't want to delete
                // it from over there - this needs to be done at save time
                // (bascially if a create happens) - turn any delete files into renames

                // A Tree Based serializer will return null if you ask it to find
                // an item soley by alias, so this means we are only deleting by key
                // on tree's (e.g media, content)
                item = this.FindItem(alias);
            }

            if (item != null)
            {
                logger.Debug(serializerType, "Deleting Item : {0}", ItemAlias(item));
                DeleteItem(item);
                return(SyncAttempt <TObject> .Succeed(alias, ChangeType.Delete));
            }

            logger.Debug(serializerType, "Delete Item not found");
            return(SyncAttempt <TObject> .Succeed(alias, ChangeType.NoChange));
        }
Exemple #7
0
 public virtual SyncAttempt <TObject> DeserializeSecondPass(TObject item, XElement node, SerializerFlags flags)
 => DeserializeSecondPass(item, node, new SyncSerializerOptions(flags));
 public SyncSerializerOptions(SerializerFlags flags)
 {
     this.Flags = flags;
 }
Exemple #9
0
        public override SyncAttempt <IContent> DeserializeSecondPass(IContent item, XElement node, SerializerFlags flags)
        {
            var attempt = DeserializeProperties(item, node);

            if (!attempt.Success)
            {
                return(SyncAttempt <IContent> .Fail(item.Name, ChangeType.ImportFail, attempt.Exception));
            }

            // sort order
            var sortOrder = node.Element("Info").Element("SortOrder").ValueOrDefault(-1);

            HandleSortOrder(item, sortOrder);


            var trashed = node.Element("Info").Element("Trashed").ValueOrDefault(false);

            HandleTrashedState(item, trashed);

            // published status
            // this does the last save and publish
            var saveAttempt = DoSaveOrPublish(item, node);

            if (saveAttempt.Success)
            {
                // we say no change back, this stops the core second pass function from saving
                // this item (which we have just done with DoSaveOrPublish)
                return(SyncAttempt <IContent> .Succeed(item.Name, item, ChangeType.NoChange, attempt.Status));
            }

            return(SyncAttempt <IContent> .Fail(item.Name, item, ChangeType.ImportFail, $"{saveAttempt.Result} {attempt.Status}"));
        }
Exemple #10
0
        public override SyncAttempt <ITemplate> DeserializeSecondPass(ITemplate item, XElement node, SerializerFlags flags)
        {
            var master = node.Element("Parent").ValueOrDefault(string.Empty);

            if (master != string.Empty && item.MasterTemplateAlias != master)
            {
                logger.Debug <TemplateSerializer>("Looking for master {0}", master);
                var masterItem = fileService.GetTemplate(master);
                if (masterItem != null)
                {
                    logger.Debug <TemplateSerializer>("Setting Master {0}", masterItem.Alias);
                    item.SetMasterTemplate(masterItem);

                    if (!flags.HasFlag(SerializerFlags.DoNotSave))
                    {
                        SaveItem(item);
                    }
                }
            }

            return(SyncAttempt <ITemplate> .Succeed(item.Name, item, ChangeType.Import));
        }
 public void Read <T>(T instance, SerializerFlags flags) where T : ICustomSerializable
 {
     Serializer.Deserialize(stream, instance, flags);
 }
Exemple #12
0
 /// <summary>
 /// Deserializes an object
 /// </summary>
 /// <param name="stream">The source stream</param>
 /// <param name="instance">The instance to receive the deserialized properties</param>
 /// <param name="flags">One or more <see cref="SerializedFlags"/> options</param>
 public static bool Deserialize <T>(Stream stream, T instance, SerializerFlags flags)
 {
     return(Deserialize <T>(stream, instance, flags, Compressor.DefaultCompressionImplementation));
 }
Exemple #13
0
        /// <summary>
        /// Deserializes an object from a stream into a pre-created empty object
        /// </summary>
        /// <typeparam name="T">The type of the object to deserialize</typeparam>
        /// <param name="reader">Source stream</param>
        /// <param name="instance">An empty instance of the type to deserialize</param>
        /// <param name="flags"></param>
        /// <returns>Returns true if the object was deserialized</returns>
        public static bool Deserialize <T>(IPrimitiveReader reader, T instance, SerializerFlags flags)
        {
            object oi = instance;

            return(Deserialize <T>(reader, ref oi, flags));
        }
 /// <summary>
 ///  CanDeserialize based on the flags, used to check the model is good, for this import
 /// </summary>
 /// <remarks>
 ///  used primarliy for checking parentage, but also can be used for checking things like create only.
 /// </remarks>
 protected virtual SyncAttempt <TObject> CanDeserialize(XElement node, SerializerFlags flags)
 => SyncAttempt <TObject> .Succeed("No Check", ChangeType.NoChange);
 public virtual SyncAttempt <TObject> DeserializeSecondPass(TObject item, XElement node, SerializerFlags flags)
 {
     return(SyncAttempt <TObject> .Succeed(nameof(item), item, typeof(TObject), ChangeType.NoChange));
 }
        public override SyncAttempt <IMedia> DeserializeSecondPass(IMedia item, XElement node, SerializerFlags flags)
        {
            var propertyAttempt = DeserializeProperties(item, node);

            if (!propertyAttempt.Success)
            {
                return(SyncAttempt <IMedia> .Fail(item.Name, ChangeType.Fail, "Failed to save properties", propertyAttempt.Exception));
            }

            var info = node.Element("Info");

            var sortOrder = info.Element("SortOrder").ValueOrDefault(-1);

            HandleSortOrder(item, sortOrder);

            var trashed = info.Element("Trashed").ValueOrDefault(false);

            HandleTrashedState(item, trashed);

            var attempt = mediaService.Save(item);

            if (!attempt.Success)
            {
                return(SyncAttempt <IMedia> .Fail(item.Name, ChangeType.Fail, ""));
            }

            // we return no-change so we don't trigger the second save
            return(SyncAttempt <IMedia> .Succeed(item.Name, item, ChangeType.NoChange, propertyAttempt.Status));
        }
        public override SyncAttempt <IContentType> DeserializeSecondPass(IContentType item, XElement node, SerializerFlags flags)
        {
            logger.Debug <ContentTypeSerializer>("Deserialize Second Pass {0}", item.Alias);

            DeserializeCompositions(item, node);
            DeserializeStructure(item, node);

            if (!flags.HasFlag(SerializerFlags.DoNotSave) && item.IsDirty())
            {
                contentTypeService.Save(item);
            }

            CleanFolder(item, node);

            return(SyncAttempt <IContentType> .Succeed(item.Name, item, ChangeType.Import));
        }
 public T Read <T>(SerializerFlags flags) where T : ICustomSerializable, new()
 {
     return(Serializer.Deserialize <T>(stream, flags));
 }
        public override SyncAttempt <IDictionaryItem> Import(string filePath, HandlerSettings config, SerializerFlags flags)
        {
            if (IsOneWay(config))
            {
                // only sync dictionary items if they are new
                // so if it already exists we don't do the sync

                //
                // <Handler Alias="dictionaryHandler" Enabled="true">
                //    <Add Key="OneWay" Value="true" />
                // </Handler>
                //
                var item = GetExistingItem(filePath);
                if (item != null)
                {
                    return(SyncAttempt <IDictionaryItem> .Succeed(item.ItemKey, ChangeType.NoChange));
                }
            }

            return(base.Import(filePath, config, flags));
        }
Exemple #20
0
        /// <summary>
        ///  second pass we set the default language again (because you can't just set it)
        /// </summary>
        public override SyncAttempt <ILanguage> DeserializeSecondPass(ILanguage item, XElement node, SerializerFlags flags)
        {
            logger.Debug <LanguageSerializer>("Language Second Pass {IsoCode}", item.IsoCode);
            item.IsDefault = node.Element("IsDefault").ValueOrDefault(false);

            var fallbackId = GetFallbackLanguageId(item, node);

            if (fallbackId > 0)
            {
                item.FallbackLanguageId = fallbackId;
            }

            if (!flags.HasFlag(SerializerFlags.DoNotSave) && item.IsDirty())
            {
                localizationService.Save(item);
            }

            return(SyncAttempt <ILanguage> .Succeed(item.CultureName, item, ChangeType.Import));
        }
 protected override SyncAttempt <Form> ProcessRename(Guid key, string alias, SerializerFlags flags)
 => SyncAttempt <Form> .Succeed(alias, ChangeType.NoChange);
Exemple #22
0
        public override SyncAttempt <IContent> DeserializeSecondPass(IContent item, XElement node, SerializerFlags flags)
        {
            DeserializeProperties(item, node);

            // sort order
            var sortOrder = node.Element("Info").Element("SortOrder").ValueOrDefault(-1);

            if (sortOrder != -1)
            {
                item.SortOrder = sortOrder;
            }

            // published status
            // this does the last save and publish
            if (DoSaveOrPublish(item, node))
            {
                return(SyncAttempt <IContent> .Succeed(item.Name, ChangeType.Import));
            }

            return(SyncAttempt <IContent> .Fail(item.Name, ChangeType.ImportFail, ""));

            // second pass, is when we do the publish and stuff.
        }
 public SyncSerializerOptions(SerializerFlags flags, Dictionary <string, string> settings)
     : this(settings)
 {
     this.Flags = flags;
 }
        public override SyncAttempt <IMediaType> DeserializeSecondPass(IMediaType item, XElement node, SerializerFlags flags)
        {
            DeserializeCompositions(item, node);
            DeserializeStructure(item, node);

            if (!flags.HasFlag(SerializerFlags.DoNotSave) && item.IsDirty())
            {
                mediaTypeService.Save(item);
            }

            return(SyncAttempt <IMediaType> .Succeed(item.Name, item, ChangeType.Import));
        }
Exemple #25
0
 protected SyncAttempt <TObject> ProcessAction(XElement node, SerializerFlags flags)
 => ProcessAction(node, new SyncSerializerOptions(flags));
        public override SyncAttempt <IMediaType> DeserializeSecondPass(IMediaType item, XElement node, SerializerFlags flags)
        {
            var contentType = CreateContentType(node);

            return(base.DeserializeSecondPass(item, contentType, flags));
        }
Exemple #27
0
 protected virtual SyncAttempt <TObject> ProcessRename(Guid key, string alias, SerializerFlags flags)
 {
     logger.Debug(serializerType, "Process Rename (no action)");
     return(SyncAttempt <TObject> .Succeed(alias, ChangeType.NoChange));
 }
Exemple #28
0
        virtual public SyncAttempt <TObject> Import(string filePath, HandlerSettings config, SerializerFlags flags)
        {
            try
            {
                syncFileService.EnsureFileExists(filePath);

                using (var stream = syncFileService.OpenRead(filePath))
                {
                    var node    = XElement.Load(stream);
                    var attempt = serializer.Deserialize(node, flags);
                    return(attempt);
                }
            }
            catch (FileNotFoundException notFoundException)
            {
                return(SyncAttempt <TObject> .Fail(Path.GetFileName(filePath), ChangeType.Fail, $"File not found {notFoundException.Message}"));
            }
            catch (Exception ex)
            {
                return(SyncAttempt <TObject> .Fail(Path.GetFileName(filePath), ChangeType.Fail, $"Import Fail: {ex.Message}"));
            }
        }
Exemple #29
0
 public SyncAttempt <TObject> Deserialize(XElement node, SerializerFlags flags)
 => Deserialize(node, new SyncSerializerOptions(flags));
        public override IEnumerable <uSyncAction> Import(string filePath, HandlerSettings config, SerializerFlags flags)
        {
            if (IsOneWay(config))
            {
                // only sync dictionary items if they are new
                // so if it already exists we don't do the sync

                //
                // <Handler Alias="dictionaryHandler" Enabled="true">
                //    <Add Key="OneWay" Value="true" />
                // </Handler>
                //
                var item = GetExistingItem(filePath);
                if (item != null)
                {
                    return(uSyncAction.SetAction(true, item.ItemKey, change: ChangeType.NoChange).AsEnumerableOfOne());
                }
            }

            return(base.Import(filePath, config, flags));
        }