#region Disclaimer / License // Copyright (C) 2011, 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.ObjectModels; using System.IO; using System.Xml; namespace OSGeo.MapGuide.MaestroAPI.CrossConnection { /// /// Resource re-basing options /// public class RebaseOptions { /// /// Initializes a new instance of the class. /// /// The source folder. /// The target folder. public RebaseOptions(string sourceFolder, string targetFolder) { Check.ThatPreconditionIsMet(ResourceIdentifier.IsFolderResource(sourceFolder), $"{nameof(ResourceIdentifier)}.{nameof(ResourceIdentifier.IsFolderResource)}({nameof(sourceFolder)})"); Check.ThatPreconditionIsMet(ResourceIdentifier.IsFolderResource(targetFolder), $"{nameof(ResourceIdentifier)}.{nameof(ResourceIdentifier.IsFolderResource)}({nameof(targetFolder)})"); this.SourceFolder = sourceFolder; this.TargetFolder = targetFolder; } /// /// The source folder to look for in resource ids /// public string SourceFolder { get; } /// /// The target folder to replace with /// public string TargetFolder { get; } } /// /// A helper class to re-base referenced resource ids in a resource document /// /// /// How to use the ResourceRebaser /// /// IServerConnection conn; /// ... /// IResource layerDef = conn.ResourceService.GetResource("Library://Test/Sample.LayerDefinition"); /// var rebaser = new ResourceRebaser(layerDef); /// //Change all resource id references within to point to the new parent location /// rebaser.Rebase("Library://Test/", "Library://Rebased/"); /// /// public class ResourceRebaser { private readonly IResource _res; /// /// Initializes a new instance of the class. /// /// The res. public ResourceRebaser(IResource res) { Check.ArgumentNotNull(res, nameof(res)); _res = res; } /// /// Re-bases any resource id references in the resource document /// /// /// /// A re-based copy of the original resource public IResource Rebase(string sourceRoot, string targetRoot) { if (sourceRoot == targetRoot) return _res; var xml = ObjectFactory.SerializeAsString(_res); var doc = new XmlDocument(); doc.LoadXml(xml); var elements = doc.GetElementsByTagName("ResourceId"); //NOXLATE foreach (XmlNode el in elements) { el.InnerText = el.InnerText.Replace(sourceRoot, targetRoot); } using (var ms = new MemoryStream()) { doc.Save(ms); ms.Position = 0L; var modifiedRes = ObjectFactory.Deserialize(_res.ResourceType, ms); modifiedRes.ResourceID = _res.ResourceID; return modifiedRes; } } } }