#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 using System; using System.Collections.Generic; using System.Text; using OSGeo.MapGuide.MaestroAPI.Resource; using System.Xml; using System.IO; 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.Precondition(ResourceIdentifier.IsFolderResource(sourceFolder), "ResourceIdentifier.IsFolderResource(sourceFolder)"); Check.Precondition(ResourceIdentifier.IsFolderResource(targetFolder), "ResourceIdentifier.IsFolderResource(targetFolder)"); this.SourceFolder = sourceFolder; this.TargetFolder = targetFolder; } /// /// The source folder to look for in resource ids /// public string SourceFolder { get; private set; } /// /// The target folder to replace with /// public string TargetFolder { get; private set; } } /// /// A helper class to re-base referenced resource ids in a resource document /// public class ResourceRebaser { private IResource _res; /// /// Initializes a new instance of the class. /// /// The res. public ResourceRebaser(IResource 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 = ResourceTypeRegistry.SerializeAsString(_res); var doc = new XmlDocument(); doc.LoadXml(xml); var elements = doc.GetElementsByTagName("ResourceId"); 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 = ResourceTypeRegistry.Deserialize(_res.ResourceType, ms); modifiedRes.CurrentConnection = _res.CurrentConnection; modifiedRes.ResourceID = _res.ResourceID; return modifiedRes; } } } }