#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;
}
}
}
}