#region Disclaimer / License // Copyright (C) 2014, Jackie Ng // http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie@gmail.com // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA // #endregion Disclaimer / License using OSGeo.MapGuide.MaestroAPI.Resource.Comparison; using OSGeo.MapGuide.MaestroAPI.Services; using OSGeo.MapGuide.ObjectModels; using System.IO; using System.Xml; namespace Maestro.Editors.Diff { /// /// Represents an XML comparison between a source and target /// public class XmlComparisonSet { internal XmlComparisonSet(TextFileDiffList source, TextFileDiffList target) { this.Source = source; this.Target = target; } /// /// Gets the difference list for the source /// public TextFileDiffList Source { get; } /// /// Gets the difference list for the target /// public TextFileDiffList Target { get; } } /// /// A helper utility that performs the necessary preparation of two resoures for XML comparison /// public static class XmlCompareUtil { /// /// Prepares the source and target resource content for XML comparison /// /// The resource service /// The source resource ID /// The target resource ID public static XmlComparisonSet PrepareForComparison(IResourceService resSvc, string sourceId, string targetId) { //Route both source and target XML content through //XmlDocument objects to ensure issues like whitespacing do //not throw us off var sourceFile = Path.GetTempFileName(); var targetFile = Path.GetTempFileName(); IResource source = resSvc.GetResource(sourceId); IResource target = resSvc.GetResource(targetId); var sourceDoc = new XmlDocument(); var targetDoc = new XmlDocument(); using (var sourceStream = ObjectFactory.Serialize(source)) using (var targetStream = ObjectFactory.Serialize(target)) { sourceDoc.Load(sourceStream); targetDoc.Load(targetStream); sourceDoc.Normalize(); targetDoc.Normalize(); using (var fs = File.OpenWrite(sourceFile)) using (var ft = File.OpenWrite(targetFile)) { sourceDoc.Save(fs); targetDoc.Save(ft); } return new XmlComparisonSet( new TextFileDiffList(sourceFile, true), new TextFileDiffList(targetFile, true)); } } } }