[mapguide-commits] r8058 - in trunk/Tools/Maestro: MaestroAPITests OSGeo.MapGuide.MaestroAPI.Http
svn_mapguide at osgeo.org
svn_mapguide at osgeo.org
Thu Apr 17 09:54:28 PDT 2014
Author: jng
Date: 2014-04-17 09:54:27 -0700 (Thu, 17 Apr 2014)
New Revision: 8058
Removed:
trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/XmlSqlResultReader.cs
Modified:
trunk/Tools/Maestro/MaestroAPITests/FeatureReaderTests.cs
trunk/Tools/Maestro/MaestroAPITests/HttpSiteTests.cs
trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs
trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/OSGeo.MapGuide.MaestroAPI.Http.csproj
trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/XmlDataReader.cs
trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/XmlFeatureReader.cs
trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/XmlReaderBase.cs
Log:
This submission includes the following changes:
- #2432: Fix timeouts on subsequent feature queries through the HTTP connection provider. The cause was an un-closed HttpWebResponse. The fix is to pass this down to the XmlFeatureReader or XmlDataReader and have it close/dispose of the HttpWebResponse when the reader is closed/disposed.
- #2434: Remove SQL query support from HTTP connection provider. The existing APIs now throw NotSupportedException
Modified: trunk/Tools/Maestro/MaestroAPITests/FeatureReaderTests.cs
===================================================================
--- trunk/Tools/Maestro/MaestroAPITests/FeatureReaderTests.cs 2014-04-17 14:54:20 UTC (rev 8057)
+++ trunk/Tools/Maestro/MaestroAPITests/FeatureReaderTests.cs 2014-04-17 16:54:27 UTC (rev 8058)
@@ -167,62 +167,5 @@
i++;
}
}
-
- [Test]
- public void TestXmlSqlNullValues()
- {
- //Simulate post-#708 EXECUTESQL and verify reader properly handles null values in response
- var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectSqlSample);
- var reader = new XmlSqlResultReader(new MemoryStream(bytes));
-
- Assert.AreEqual(3, reader.FieldCount);
-
- reader.ReadNext();
-
- Assert.IsFalse(reader.IsNull(0));
- Assert.IsFalse(reader.IsNull(1));
- Assert.IsFalse(reader.IsNull(2));
-
- reader.ReadNext();
-
- Assert.IsFalse(reader.IsNull(0));
- Assert.IsFalse(reader.IsNull(1));
- Assert.IsTrue(reader.IsNull(2));
-
- reader.ReadNext();
-
- Assert.IsFalse(reader.IsNull(0));
- Assert.IsTrue(reader.IsNull(1));
- Assert.IsTrue(reader.IsNull(2));
-
- Assert.IsFalse(reader.ReadNext()); //end of stream
-
- //Test the IEnumerable approach
- reader = new XmlSqlResultReader(new MemoryStream(bytes));
-
- int i = 0;
- while(reader.ReadNext())
- {
- switch (i)
- {
- case 0:
- Assert.IsFalse(reader.IsNull(0));
- Assert.IsFalse(reader.IsNull(1));
- Assert.IsFalse(reader.IsNull(2));
- break;
- case 1:
- Assert.IsFalse(reader.IsNull(0));
- Assert.IsFalse(reader.IsNull(1));
- Assert.IsTrue(reader.IsNull(2));
- break;
- case 2:
- Assert.IsFalse(reader.IsNull(0));
- Assert.IsTrue(reader.IsNull(1));
- Assert.IsTrue(reader.IsNull(2));
- break;
- }
- i++;
- }
- }
}
}
Modified: trunk/Tools/Maestro/MaestroAPITests/HttpSiteTests.cs
===================================================================
--- trunk/Tools/Maestro/MaestroAPITests/HttpSiteTests.cs 2014-04-17 14:54:20 UTC (rev 8057)
+++ trunk/Tools/Maestro/MaestroAPITests/HttpSiteTests.cs 2014-04-17 16:54:27 UTC (rev 8058)
@@ -26,6 +26,7 @@
using OSGeo.MapGuide.ObjectModels;
using OSGeo.MapGuide.MaestroAPI.Resource.Validation;
using System.IO;
+using System.Threading;
namespace MaestroAPITests
{
@@ -45,6 +46,54 @@
}
[Test]
+ public void TestCase2432()
+ {
+ var conn = CreateTestConnection();
+
+ //Problematic method: Cause of original ticket
+ for (int i = 0; i < 10; i++)
+ {
+ using (var rdr1 = conn.FeatureService.QueryFeatureSource("Library://UnitTests/Data/Parcels.FeatureSource", "SHP_Schema:Parcels", "Autogenerated_SDF_ID < 20"))
+ {
+ var count = 0;
+ while (count < 5 && rdr1.ReadNext())
+ {
+ count++;
+ }
+ rdr1.Close();
+ }
+ }
+
+ //Normal sequential method
+ for (int i = 0; i < 10; i++)
+ {
+ using (var rdr1 = conn.FeatureService.QueryFeatureSource("Library://UnitTests/Data/Parcels.FeatureSource", "SHP_Schema:Parcels", "Autogenerated_SDF_ID < 20"))
+ {
+ while (rdr1.ReadNext()) { }
+ rdr1.Close();
+ }
+ }
+
+ //Multi-threaded method
+ var events = new List<ManualResetEvent>();
+ for (int i = 0; i < 10; i++)
+ {
+ var resetEvent = new ManualResetEvent(false);
+ ThreadPool.QueueUserWorkItem((args) =>
+ {
+ using (var rdr1 = conn.FeatureService.QueryFeatureSource("Library://UnitTests/Data/Parcels.FeatureSource", "SHP_Schema:Parcels", "Autogenerated_SDF_ID < 20"))
+ {
+ while (rdr1.ReadNext()) { }
+ rdr1.Close();
+ resetEvent.Set();
+ }
+ });
+ events.Add(resetEvent);
+ }
+ WaitHandle.WaitAll(events.ToArray());
+ }
+
+ [Test]
public void TestMapDefinitionValidation()
{
var conn = CreateTestConnection();
Modified: trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs
===================================================================
--- trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs 2014-04-17 14:54:20 UTC (rev 8057)
+++ trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs 2014-04-17 16:54:27 UTC (rev 8058)
@@ -714,10 +714,7 @@
public IReader ExecuteSqlQuery(string featureSourceID, string sql)
{
- ResourceIdentifier.Validate(featureSourceID, ResourceTypes.FeatureSource);
- string req = m_reqBuilder.ExecuteSqlQuery(featureSourceID, sql);
-
- return new XmlSqlResultReader(this.OpenRead(req));
+ throw new NotSupportedException();
}
public IFeatureReader QueryFeatureSource(string resourceID, string schema, string query)
@@ -763,9 +760,9 @@
LogResponse(resp);
if (aggregate)
- return new XmlDataReader(resp.GetResponseStream());
+ return new XmlDataReader(resp);
else
- return new XmlFeatureReader(resp.GetResponseStream());
+ return new XmlFeatureReader(resp);
}
catch (Exception ex)
{
Modified: trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/OSGeo.MapGuide.MaestroAPI.Http.csproj
===================================================================
--- trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/OSGeo.MapGuide.MaestroAPI.Http.csproj 2014-04-17 14:54:20 UTC (rev 8057)
+++ trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/OSGeo.MapGuide.MaestroAPI.Http.csproj 2014-04-17 16:54:27 UTC (rev 8058)
@@ -91,7 +91,6 @@
<Compile Include="XmlFeatureReader.cs" />
<Compile Include="XmlReaderBase.cs" />
<Compile Include="XmlRecord.cs" />
- <Compile Include="XmlSqlResultReader.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OSGeo.MapGuide.MaestroAPI\OSGeo.MapGuide.MaestroAPI.csproj">
Modified: trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/XmlDataReader.cs
===================================================================
--- trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/XmlDataReader.cs 2014-04-17 14:54:20 UTC (rev 8057)
+++ trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/XmlDataReader.cs 2014-04-17 16:54:27 UTC (rev 8058)
@@ -24,13 +24,16 @@
using System.IO;
using OSGeo.MapGuide.MaestroAPI.Feature;
using OSGeo.MapGuide.MaestroAPI.Schema;
+using System.Net;
namespace OSGeo.MapGuide.MaestroAPI.Http
{
public class XmlDataReader : XmlReaderBase
{
- public XmlDataReader(Stream source) : base(source) { }
+ internal XmlDataReader(Stream stream) : base(stream) { }
+ public XmlDataReader(HttpWebResponse resp) : base(resp) { }
+
public override ReaderType ReaderType
{
get { return ReaderType.Data; }
Modified: trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/XmlFeatureReader.cs
===================================================================
--- trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/XmlFeatureReader.cs 2014-04-17 14:54:20 UTC (rev 8057)
+++ trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/XmlFeatureReader.cs 2014-04-17 16:54:27 UTC (rev 8058)
@@ -26,13 +26,16 @@
using OSGeo.MapGuide.MaestroAPI.Http;
using OSGeo.MapGuide.MaestroAPI.Schema;
using System.Diagnostics;
+using System.Net;
namespace OSGeo.MapGuide.MaestroAPI.Http
{
public class XmlFeatureReader : XmlReaderBase, IFeatureReader
{
- public XmlFeatureReader(Stream source)
- : base(source)
+ internal XmlFeatureReader(Stream stream) : base(stream) { }
+
+ public XmlFeatureReader(HttpWebResponse resp)
+ : base(resp)
{ }
public IFeatureReader GetFeatureObject(string name)
Modified: trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/XmlReaderBase.cs
===================================================================
--- trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/XmlReaderBase.cs 2014-04-17 14:54:20 UTC (rev 8057)
+++ trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/XmlReaderBase.cs 2014-04-17 16:54:27 UTC (rev 8058)
@@ -25,6 +25,7 @@
using System.Xml;
using OSGeo.MapGuide.MaestroAPI.Schema;
using OSGeo.MapGuide.MaestroAPI.Internal;
+using System.Net;
namespace OSGeo.MapGuide.MaestroAPI.Http
{
@@ -34,6 +35,7 @@
{
protected FixedWKTReader _wktReader;
protected XmlTextReader _reader;
+ protected HttpWebResponse _resp; //Must be disposed of by subclass when done
protected XmlProperty[] _properties;
protected Dictionary<string, XmlProperty> _propertyMap;
@@ -60,9 +62,20 @@
protected abstract string ValuesRowPropertyValueElement { get; }
- public XmlReaderBase(Stream source)
+ protected XmlReaderBase(Stream stream)
{
- _reader = new XmlTextReader(source);
+ InitCommon(stream);
+ }
+
+ public XmlReaderBase(HttpWebResponse resp)
+ {
+ _resp = resp;
+ InitCommon(_resp.GetResponseStream());
+ }
+
+ private void InitCommon(Stream stream)
+ {
+ _reader = new XmlTextReader(stream);
_wktReader = new FixedWKTReader();
_reader.WhitespaceHandling = WhitespaceHandling.Significant;
_propertyMap = new Dictionary<string, XmlProperty>();
@@ -140,6 +153,23 @@
}
}
+ public override void Close()
+ {
+ if (_resp != null)
+ _resp.Close();
+ base.Close();
+ }
+
+ public override void Dispose()
+ {
+ if (_resp != null)
+ {
+ ((IDisposable)_resp).Dispose();
+ _resp = null;
+ }
+ base.Dispose();
+ }
+
public override PropertyValueType GetPropertyType(string name)
{
return _propertyMap[name].Type;
Deleted: trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/XmlSqlResultReader.cs
===================================================================
--- trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/XmlSqlResultReader.cs 2014-04-17 14:54:20 UTC (rev 8057)
+++ trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI.Http/XmlSqlResultReader.cs 2014-04-17 16:54:27 UTC (rev 8058)
@@ -1,88 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2010, Jackie Ng
-// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at 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;
-using System.IO;
-using OSGeo.MapGuide.MaestroAPI.Feature;
-
-namespace OSGeo.MapGuide.MaestroAPI.Http
-{
- public class XmlSqlResultReader : XmlReaderBase
- {
- public XmlSqlResultReader(Stream source) : base(source) { }
-
- public override ReaderType ReaderType
- {
- get { return ReaderType.Sql; }
- }
-
- protected override string ResponseRootElement
- {
- get { return "RowSet"; }
- }
-
- protected override string DefinitionRootElement
- {
- get { return "ColumnDefinitions"; }
- }
-
- protected override string DefinitionChildElement
- {
- get { return "Column"; }
- }
-
- protected override string DefinitionChildNameElement
- {
- get { return "Name"; }
- }
-
- protected override string DefinitionChildTypeElement
- {
- get { return "Type"; }
- }
-
- protected override string ValuesRootElement
- {
- get { return "Rows"; }
- }
-
- protected override string ValuesRowElement
- {
- get { return "Row"; }
- }
-
- protected override string ValuesRowPropertyElement
- {
- get { return "Column"; }
- }
-
- protected override string ValuesRowPropertyNameElement
- {
- get { return "Name"; }
- }
-
- protected override string ValuesRowPropertyValueElement
- {
- get { return "Value"; }
- }
- }
-}
More information about the mapguide-commits
mailing list