[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