//Copyright 2010 Microsoft Corporation // //Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. //You may obtain a copy of the License at // //http://www.apache.org/licenses/LICENSE-2.0 // //Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an //"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and limitations under the License. namespace System.Data.Services.Common { using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Xml; internal enum EpmSerializationKind { Attributes, Elements, All } internal abstract class EpmContentSerializerBase { protected EpmContentSerializerBase(EpmTargetTree tree, bool isSyndication, object element, XmlWriter target) { this.Root = isSyndication ? tree.SyndicationRoot : tree.NonSyndicationRoot; this.Element = element; this.Target = target; this.Success = false; } protected EpmTargetPathSegment Root { get; private set; } protected object Element { get; private set; } protected XmlWriter Target { get; private set; } protected bool Success { get; private set; } internal void Serialize() { foreach (EpmTargetPathSegment targetSegment in this.Root.SubSegments) { this.Serialize(targetSegment, EpmSerializationKind.All); } this.Success = true; } protected virtual void Serialize(EpmTargetPathSegment targetSegment, EpmSerializationKind kind) { IEnumerable segmentsToSerialize; switch (kind) { case EpmSerializationKind.Attributes: segmentsToSerialize = targetSegment.SubSegments.Where(s => s.IsAttribute == true); break; case EpmSerializationKind.Elements: segmentsToSerialize = targetSegment.SubSegments.Where(s => s.IsAttribute == false); break; default: Debug.Assert(kind == EpmSerializationKind.All, "Must serialize everything"); segmentsToSerialize = targetSegment.SubSegments; break; } foreach (EpmTargetPathSegment segment in segmentsToSerialize) { this.Serialize(segment, kind); } } } }