#region Disclaimer / License
// Copyright (C) 2010, 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 System.Xml.Serialization;
using System.IO;
using System.ComponentModel;
using OSGeo.MapGuide.ObjectModels.Common;
using OSGeo.MapGuide.ObjectModels;
namespace OSGeo.MapGuide.MaestroAPI.Resource
{
///
/// Represents an editable MapGuide Resource
///
public interface IResource : IVersionedEntity, ICloneable, INotifyPropertyChanged
{
///
/// Gets or sets the current connection.
///
/// The current connection.
IServerConnection CurrentConnection { get; set; }
///
/// Gets the validating schema.
///
/// The validating schema.
string ValidatingSchema { get; }
///
/// Gets or sets the resource ID.
///
/// The resource ID.
string ResourceID { get; set; }
///
/// Gets the type of the resource.
///
/// The type of the resource.
ResourceTypes ResourceType { get; }
///
/// Serializes this instance to XML and returns the XML content. It is not recommended to call this method directly
/// instead use as that will invoke any pre-serialization
/// hooks that may have been set up for this particular resource.
///
///
string Serialize();
///
/// Indicates whether this resource is strongly typed. If false it means the implementer
/// is a object. This usually means that the matching serializer
/// could not be found because the resource version is unrecognised.
///
bool IsStronglyTyped { get; }
}
///
/// Extension method class
///
public static class ResourceExtensions
{
///
/// Serializes to stream.
///
/// The res.
///
public static Stream SerializeToStream(this IResource res)
{
string str = res.Serialize();
return new MemoryStream(Encoding.UTF8.GetBytes(str));
}
///
/// Gets the resource type descriptor.
///
/// The res.
///
public static ResourceTypeDescriptor GetResourceTypeDescriptor(this IResource res)
{
return new ResourceTypeDescriptor(res.ResourceType, res.ResourceVersion.ToString());
}
///
/// Copies the resource data to the specified resource
///
///
/// Avoid using this method if you are copying a IFeatureSource with MG_USER_CREDENTIALS resource data, as MapGuide will automatically return
/// the decrypted username for MG_USER_CREDENTIALS, rendering the resource data invalid for the target resource. Instead use the
/// method, which will copy the resource and its resource
/// data and keep any MG_USER_CREDENTIALS items intact
///
/// The source.
/// The target.
public static void CopyResourceDataTo(this IResource source, IResource target)
{
Check.NotNull(source, "source");
Check.NotNull(target, "target");
foreach (var res in source.EnumerateResourceData())
{
var data = source.GetResourceData(res.Name);
if (!data.CanSeek)
{
var ms = new MemoryStream();
Utility.CopyStream(data, ms);
data = ms;
}
target.SetResourceData(res.Name, res.Type, data);
}
}
///
/// Copies the resource data to the specified resource
///
///
/// Avoid using this method if you are copying a IFeatureSource with MG_USER_CREDENTIALS resource data, as MapGuide will automatically return
/// the decrypted username for MG_USER_CREDENTIALS, rendering the resource data invalid for the target resource. Instead use the
/// method, which will copy the resource and its resource
/// data and keep any MG_USER_CREDENTIALS items intact
///
/// The source.
/// The target ID.
public static void CopyResourceDataTo(this IResource source, string targetID)
{
Check.NotNull(source, "source");
Check.NotEmpty(targetID, "targetID");
foreach (var res in source.EnumerateResourceData())
{
var data = source.GetResourceData(res.Name);
if (!data.CanSeek)
{
var ms = new MemoryStream();
Utility.CopyStream(data, ms);
data = ms;
}
source.CurrentConnection.ResourceService.SetResourceData(targetID, res.Name, res.Type, data);
}
}
///
/// Convenience method for enumerating resource data of this resource
///
///
///
public static ResourceDataListResourceData[] EnumerateResourceData(this IResource res)
{
if (res.CurrentConnection == null)
throw new ArgumentException(Properties.Resources.ERR_RESOURCE_NOT_ATTACHED);
return res.CurrentConnection.ResourceService.EnumerateResourceData(res.ResourceID).ResourceData.ToArray();
}
///
/// Convenience method for getting an associated resource data stream of this resource
///
///
///
///
public static Stream GetResourceData(this IResource res, string dataName)
{
if (res.CurrentConnection == null)
throw new ArgumentException(Properties.Resources.ERR_RESOURCE_NOT_ATTACHED);
return res.CurrentConnection.ResourceService.GetResourceData(res.ResourceID, dataName);
}
///
/// Convenience method for setting an associated resource data stream of this resource
///
///
///
///
///
public static void SetResourceData(this IResource res, string dataName, ResourceDataType dataType, Stream inputStream)
{
if (res.CurrentConnection == null)
throw new ArgumentException(Properties.Resources.ERR_RESOURCE_NOT_ATTACHED);
res.CurrentConnection.ResourceService.SetResourceData(res.ResourceID, dataName, dataType, inputStream);
}
///
/// Convenience method for deleting an associated resource data stream of this resource
///
///
///
public static void DeleteResourceData(this IResource res, string dataName)
{
if (res.CurrentConnection == null)
throw new ArgumentException(Properties.Resources.ERR_RESOURCE_NOT_ATTACHED);
res.CurrentConnection.ResourceService.DeleteResourceData(res.ResourceID, dataName);
}
}
}