#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.IO;
using System.Xml;
using OSGeo.MapGuide.MaestroAPI.Exceptions;
namespace OSGeo.MapGuide.MaestroAPI.Resource
{
///
/// Inspects a resource content stream to determine the version of the resource content within
///
/// The stream to be inspected is copied and the inspection is made on the copy
///
public sealed class ResourceContentVersionChecker : IDisposable
{
private XmlReader _reader;
private Stream _stream;
///
/// Constructor
///
/// The resource content stream. Inspection is done on a copy of this stream
public ResourceContentVersionChecker(Stream stream)
{
var ms = new MemoryStream();
Utility.CopyStream(stream, ms);
ms.Position = 0L; //Rewind
_stream = ms;
_reader = new XmlTextReader(_stream);
}
///
/// Alternate constructor
///
///
public ResourceContentVersionChecker(string xmlContent)
{
_stream = new MemoryStream(Encoding.UTF8.GetBytes(xmlContent));
}
private ResourceTypeDescriptor _rtd;
///
/// Gets the resource content version
///
///
public ResourceTypeDescriptor GetVersion()
{
if (_rtd == null)
{
_rtd = GetVersionFromXmlStream(_stream);
}
return _rtd;
}
///
/// Gets the version from XML stream.
///
/// The ms.
///
public static ResourceTypeDescriptor GetVersionFromXmlStream(Stream ms)
{
string version = "1.0.0";
using (var xr = XmlReader.Create(ms))
{
xr.MoveToContent();
if (!xr.HasAttributes)
throw new SerializationException();
try
{
//Parse version number from ResourceType-x.y.z.xsd
string xsd = xr.GetAttribute("xsi:noNamespaceSchemaLocation");
if (xsd == null)
return null;
int start = (xsd.LastIndexOf("-"));
int end = xsd.IndexOf(".xsd") - 1;
version = xsd.Substring(start + 1, xsd.Length - end);
string typeStr = xsd.Substring(0, start);
return new ResourceTypeDescriptor((ResourceTypes)Enum.Parse(typeof(ResourceTypes), typeStr), version);
}
finally
{
xr.Close();
}
}
}
///
/// Disposes this instance
///
public void Dispose()
{
if (_stream != null)
_stream.Dispose();
if (_reader != null)
_reader.Close();
}
}
}