[mapguide-commits] r6065 - in trunk/Tools/Maestro: ExtendedModels/SymbolDefinition-1.1.0 MaestroAPITests OSGeo.MapGuide.ExtendedObjectModels OSGeo.MapGuide.MaestroAPI OSGeo.MapGuide.MaestroAPI/ObjectModels OSGeo.MapGuide.MaestroAPI/Properties OSGeo.MapGuide.MaestroAPI/Resource/Validation

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Sun Aug 14 11:26:59 EDT 2011


Author: jng
Date: 2011-08-14 08:26:59 -0700 (Sun, 14 Aug 2011)
New Revision: 6065

Added:
   trunk/Tools/Maestro/ExtendedModels/SymbolDefinition-1.1.0/SymbolDefinitionValidator.cs
   trunk/Tools/Maestro/MaestroAPITests/HttpSiteTests.cs
   trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/BaseSymbolDefinitionValidator.cs
Modified:
   trunk/Tools/Maestro/ExtendedModels/SymbolDefinition-1.1.0/OSGeo.MapGuide.ObjectModels.SymbolDefinition-1.1.0.csproj
   trunk/Tools/Maestro/MaestroAPITests/CapabilityTests.cs
   trunk/Tools/Maestro/MaestroAPITests/MaestroAPITests.csproj
   trunk/Tools/Maestro/MaestroAPITests/ResourceTests.cs
   trunk/Tools/Maestro/MaestroAPITests/RuntimeMapTests.cs
   trunk/Tools/Maestro/MaestroAPITests/ValidationTests.cs
   trunk/Tools/Maestro/OSGeo.MapGuide.ExtendedObjectModels/ModelSetup.cs
   trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj
   trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/ObjectModels/CommonTypes.cs
   trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Properties/Resources.Designer.cs
   trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Properties/Resources.resx
   trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/BaseMapDefinitionValidator.cs
   trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/ResourceValidationContext.cs
   trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/SymbolDefinitionValidator.cs
   trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/ValidationStatusCode.cs
Log:
#1717: Add symbol definition validation rules. Also add unit tests for some resource validators


Modified: trunk/Tools/Maestro/ExtendedModels/SymbolDefinition-1.1.0/OSGeo.MapGuide.ObjectModels.SymbolDefinition-1.1.0.csproj
===================================================================
--- trunk/Tools/Maestro/ExtendedModels/SymbolDefinition-1.1.0/OSGeo.MapGuide.ObjectModels.SymbolDefinition-1.1.0.csproj	2011-08-14 13:09:25 UTC (rev 6064)
+++ trunk/Tools/Maestro/ExtendedModels/SymbolDefinition-1.1.0/OSGeo.MapGuide.ObjectModels.SymbolDefinition-1.1.0.csproj	2011-08-14 15:26:59 UTC (rev 6065)
@@ -55,6 +55,7 @@
       <Link>SignedAssemblyInfo.cs</Link>
     </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="SymbolDefinitionValidator.cs" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\..\OSGeo.MapGuide.MaestroAPI\OSGeo.MapGuide.MaestroAPI.csproj">

Added: trunk/Tools/Maestro/ExtendedModels/SymbolDefinition-1.1.0/SymbolDefinitionValidator.cs
===================================================================
--- trunk/Tools/Maestro/ExtendedModels/SymbolDefinition-1.1.0/SymbolDefinitionValidator.cs	                        (rev 0)
+++ trunk/Tools/Maestro/ExtendedModels/SymbolDefinition-1.1.0/SymbolDefinitionValidator.cs	2011-08-14 15:26:59 UTC (rev 6065)
@@ -0,0 +1,36 @@
+#region Disclaimer / License
+// Copyright (C) 2011, 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 OSGeo.MapGuide.MaestroAPI.Resource.Validation;
+using OSGeo.MapGuide.MaestroAPI.Resource;
+using OSGeo.MapGuide.MaestroAPI;
+
+namespace OSGeo.MapGuide.ObjectModels.SymbolDefinition_1_1_0
+{
+    public class SymbolDefinitionValidator : BaseSymbolDefinitionValidator
+    {
+        public override ResourceTypeDescriptor SupportedResourceAndVersion
+        {
+            get { return new ResourceTypeDescriptor(ResourceTypes.SymbolDefinition, "1.1.0"); }
+        }
+    }
+}

Modified: trunk/Tools/Maestro/MaestroAPITests/CapabilityTests.cs
===================================================================
--- trunk/Tools/Maestro/MaestroAPITests/CapabilityTests.cs	2011-08-14 13:09:25 UTC (rev 6064)
+++ trunk/Tools/Maestro/MaestroAPITests/CapabilityTests.cs	2011-08-14 15:26:59 UTC (rev 6065)
@@ -865,6 +865,12 @@
                             Assert.AreEqual(version, new Version(1, 1, 0));
                         }
                         break;
+                    case ResourceTypes.WatermarkDefinition:
+                        {
+                            var version = caps.GetMaxSupportedResourceVersion(type);
+                            Assert.AreEqual(version, new Version(2, 3, 0));
+                        }
+                        break;
                     case ResourceTypes.WebLayout:
                         {
                             var version = caps.GetMaxSupportedResourceVersion(type);

Added: trunk/Tools/Maestro/MaestroAPITests/HttpSiteTests.cs
===================================================================
--- trunk/Tools/Maestro/MaestroAPITests/HttpSiteTests.cs	                        (rev 0)
+++ trunk/Tools/Maestro/MaestroAPITests/HttpSiteTests.cs	2011-08-14 15:26:59 UTC (rev 6065)
@@ -0,0 +1,116 @@
+#region Disclaimer / License
+// Copyright (C) 2011, 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.Linq;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI;
+using NUnit.Framework;
+using OSGeo.MapGuide.ObjectModels;
+using OSGeo.MapGuide.MaestroAPI.Resource.Validation;
+using System.IO;
+
+namespace MaestroAPITests
+{
+    [TestFixture(Ignore = false)]
+    public class HttpSiteTests
+    {
+        private IServerConnection CreateTestConnection()
+        {
+            return ConnectionProviderRegistry.CreateConnection("Maestro.Http",
+                "Url", "http://" + Environment.MachineName + "/mapguide/mapagent/mapagent.fcgi",
+                "Username", "Administrator",
+                "Password", "admin");
+        }
+
+        [Test]
+        public void TestMapDefinitionValidation()
+        {
+            var conn = CreateTestConnection();
+            var mdf = ObjectFactory.CreateMapDefinition(conn, "Test");
+            mdf.ResourceID = "Library://UnitTests/Test.MapDefinition";
+
+            var context = new ResourceValidationContext(conn.ResourceService, conn.FeatureService);
+            var issues = ResourceValidatorSet.Validate(context, mdf, false);
+            Assert.True(issues.Any(x => x.StatusCode == ValidationStatusCode.Warning_MapDefinition_MissingCoordinateSystem));
+
+            conn.ResourceService.SetResourceXmlData("Library://UnitTests/Layers/HydrographicPolygons.LayerDefinition", File.OpenRead("TestData/MappingService/UT_HydrographicPolygons.ldf"));
+
+            mdf.AddLayer("foo", "bar", "Library://UnitTests/Layers/HydrographicPolygons.LayerDefinition");
+            context = new ResourceValidationContext(conn.ResourceService, conn.FeatureService);
+            issues = ResourceValidatorSet.Validate(context, mdf, false);
+            Assert.True(issues.Any(x => x.StatusCode == ValidationStatusCode.Error_MapDefinition_LayerWithNonExistentGroup));
+
+            mdf.AddLayer(null, "bar", "Library://UnitTests/Layers/HydrographicPolygons.LayerDefinition");
+            context = new ResourceValidationContext(conn.ResourceService, conn.FeatureService);
+            issues = ResourceValidatorSet.Validate(context, mdf, false);
+            Assert.True(issues.Any(x => x.StatusCode == ValidationStatusCode.Error_MapDefinition_DuplicateLayerName));
+
+            var group = mdf.AddGroup("foo");
+            group.Group = "bar";
+
+            context = new ResourceValidationContext(conn.ResourceService, conn.FeatureService);
+            issues = ResourceValidatorSet.Validate(context, mdf, false);
+            Assert.True(issues.Any(x => x.StatusCode == ValidationStatusCode.Error_MapDefinition_GroupWithNonExistentGroup));
+        }
+
+        [Test]
+        public void TestSymbolDefinitionValidation()
+        {
+            var conn = CreateTestConnection();
+            var ssym = ObjectFactory.CreateSimpleSymbol(conn, "Test", "Test");
+            ssym.ResourceID = "Library://UnitTests/Test.SymbolDefinition";
+
+            var context = new ResourceValidationContext(conn.ResourceService, conn.FeatureService);
+            var issues = ResourceValidatorSet.Validate(context, ssym, true);
+            Assert.True(issues.Any(x => x.StatusCode == ValidationStatusCode.Error_SymbolDefinition_NoGeometryUsageContexts));
+
+            var param = ssym.CreateParameter();
+            param.Identifier = "TEST";
+            ssym.ParameterDefinition.AddParameter(param);
+
+            context = new ResourceValidationContext(conn.ResourceService, conn.FeatureService);
+            issues = ResourceValidatorSet.Validate(context, ssym, true);
+            Assert.True(issues.Any(x => x.StatusCode == ValidationStatusCode.Warning_SymbolDefinition_SymbolParameterNotUsed));
+
+            var imgRef = ssym.CreateImageReference("Library://UnitTest/IDontExist.LayerDefinition", "Foo.png");
+            var img = ssym.CreateImageGraphics();
+            img.Item = imgRef;
+
+            ssym.AddGraphics(img);
+
+            context = new ResourceValidationContext(conn.ResourceService, conn.FeatureService);
+            issues = ResourceValidatorSet.Validate(context, ssym, true);
+            Assert.True(issues.Any(x => x.StatusCode == ValidationStatusCode.Error_SymbolDefinition_ImageGraphicReferenceResourceIdNotFound));
+
+            conn.ResourceService.SetResourceXmlData("Library://UnitTests/Layers/HydrographicPolygons.LayerDefinition", File.OpenRead("TestData/MappingService/UT_HydrographicPolygons.ldf"));
+
+            imgRef = ssym.CreateImageReference("Library://UnitTests/Layers/HydrographicPolygons.LayerDefinition", "Foo.png");
+            img = ssym.CreateImageGraphics();
+            img.Item = imgRef;
+
+            ssym.AddGraphics(img);
+
+            context = new ResourceValidationContext(conn.ResourceService, conn.FeatureService);
+            issues = ResourceValidatorSet.Validate(context, ssym, true);
+            Assert.True(issues.Any(x => x.StatusCode == ValidationStatusCode.Error_SymbolDefinition_ImageGraphicReferenceResourceDataNotFound));
+        }
+    }
+}

Modified: trunk/Tools/Maestro/MaestroAPITests/MaestroAPITests.csproj
===================================================================
--- trunk/Tools/Maestro/MaestroAPITests/MaestroAPITests.csproj	2011-08-14 13:09:25 UTC (rev 6064)
+++ trunk/Tools/Maestro/MaestroAPITests/MaestroAPITests.csproj	2011-08-14 15:26:59 UTC (rev 6065)
@@ -75,6 +75,7 @@
     <Compile Include="ExpressionTests.cs" />
     <Compile Include="FeatureReaderTests.cs" />
     <Compile Include="HttpConnectionTests.cs" />
+    <Compile Include="HttpSiteTests.cs" />
     <Compile Include="ObjectTests.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Properties\Resources.Designer.cs">

Modified: trunk/Tools/Maestro/MaestroAPITests/ResourceTests.cs
===================================================================
--- trunk/Tools/Maestro/MaestroAPITests/ResourceTests.cs	2011-08-14 13:09:25 UTC (rev 6064)
+++ trunk/Tools/Maestro/MaestroAPITests/ResourceTests.cs	2011-08-14 15:26:59 UTC (rev 6065)
@@ -41,6 +41,7 @@
 using OSGeo.MapGuide.ObjectModels.SymbolDefinition;
 using OSGeo.MapGuide.ObjectModels.SymbolLibrary;
 using OSGeo.MapGuide.ObjectModels.WebLayout;
+using System.Diagnostics;
 
 namespace MaestroAPITests
 {
@@ -476,7 +477,7 @@
                         found = true;
                     }
                 }
-                Console.WriteLine("Found command (" + cmdName.ToString() + "): " + found);
+                Trace.TraceInformation("Found command (" + cmdName.ToString() + "): " + found);
                 Assert.IsTrue(found);
             }
         }

Modified: trunk/Tools/Maestro/MaestroAPITests/RuntimeMapTests.cs
===================================================================
--- trunk/Tools/Maestro/MaestroAPITests/RuntimeMapTests.cs	2011-08-14 13:09:25 UTC (rev 6064)
+++ trunk/Tools/Maestro/MaestroAPITests/RuntimeMapTests.cs	2011-08-14 15:26:59 UTC (rev 6065)
@@ -50,6 +50,7 @@
         {
             if (!_registered)
             {
+                ResourceValidatorLoader.LoadStockValidators();
                 ModelSetup.Initialize();
                 _registered = true;
             }

Modified: trunk/Tools/Maestro/MaestroAPITests/ValidationTests.cs
===================================================================
--- trunk/Tools/Maestro/MaestroAPITests/ValidationTests.cs	2011-08-14 13:09:25 UTC (rev 6064)
+++ trunk/Tools/Maestro/MaestroAPITests/ValidationTests.cs	2011-08-14 15:26:59 UTC (rev 6065)
@@ -38,12 +38,6 @@
     [TestFixture]
     public class ValidationTests
     {
-        [TestFixtureSetUp]
-        public void FixtureSetup()
-        {
-            ResourceValidatorLoader.LoadStockValidators();
-        }
-
         [Test]
         public void TestUniqueIssues()
         {

Modified: trunk/Tools/Maestro/OSGeo.MapGuide.ExtendedObjectModels/ModelSetup.cs
===================================================================
--- trunk/Tools/Maestro/OSGeo.MapGuide.ExtendedObjectModels/ModelSetup.cs	2011-08-14 13:09:25 UTC (rev 6064)
+++ trunk/Tools/Maestro/OSGeo.MapGuide.ExtendedObjectModels/ModelSetup.cs	2011-08-14 15:26:59 UTC (rev 6065)
@@ -128,6 +128,7 @@
             ObjectFactory.RegisterWebLayoutFactoryMethod(new Version(1, 1, 0), new WebLayoutCreatorFunc(WL110.WebLayoutEntryPoint.CreateDefault));
 
             //Symbol Definition 1.1.0
+            ResourceValidatorSet.RegisterValidator(new Sym110.SymbolDefinitionValidator());
             ResourceTypeRegistry.RegisterResource(
                 new ResourceTypeDescriptor(ResourceTypes.SymbolDefinition, "1.1.0"),
                 new ResourceSerializationCallback(Sym110.SymbolDefEntryPoint.Serialize),

Modified: trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj
===================================================================
--- trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj	2011-08-14 13:09:25 UTC (rev 6064)
+++ trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj	2011-08-14 15:26:59 UTC (rev 6065)
@@ -225,6 +225,7 @@
     <Compile Include="Resource\Conversion\NsDoc.cs" />
     <Compile Include="Resource\NsDoc.cs" />
     <Compile Include="Resource\Validation\BaseMapDefinitionValidator.cs" />
+    <Compile Include="Resource\Validation\BaseSymbolDefinitionValidator.cs" />
     <Compile Include="Resource\Validation\NsDoc.cs" />
     <Compile Include="Resource\Validation\ValidationStatusCode.cs" />
     <Compile Include="SchemaOverrides\GdalConfigurationDocument.cs" />

Modified: trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/ObjectModels/CommonTypes.cs
===================================================================
--- trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/ObjectModels/CommonTypes.cs	2011-08-14 13:09:25 UTC (rev 6064)
+++ trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/ObjectModels/CommonTypes.cs	2011-08-14 15:26:59 UTC (rev 6065)
@@ -271,10 +271,19 @@
 
     public interface IExpressionPropertySource
     {
+        /// <summary>
+        /// Gets the name
+        /// </summary>
         string Name { get; }
 
+        /// <summary>
+        /// Gets the description
+        /// </summary>
         string Description { get; }
 
+        /// <summary>
+        /// Gets the expression data type
+        /// </summary>
         ExpressionDataType ExpressionType { get; }
     }
 

Modified: trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Properties/Resources.Designer.cs
===================================================================
--- trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Properties/Resources.Designer.cs	2011-08-14 13:09:25 UTC (rev 6064)
+++ trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Properties/Resources.Designer.cs	2011-08-14 15:26:59 UTC (rev 6065)
@@ -1,7 +1,7 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
 //     This code was generated by a tool.
-//     Runtime Version:2.0.50727.4952
+//     Runtime Version:2.0.50727.4959
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
 //     the code is regenerated.
@@ -854,6 +854,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Map Definition has no coordinate system.
+        /// </summary>
+        internal static string MDF_NoCoordinateSystem {
+            get {
+                return ResourceManager.GetString("MDF_NoCoordinateSystem", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to The Map Definition contains tiled layers but has no finite display scales defined.
         /// </summary>
         internal static string MDF_NoFiniteDisplayScalesSpecified {
@@ -962,6 +971,42 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to The simple symbol definition contains an image graphic that references a resource id {0} with a non-existent resource data {1}.
+        /// </summary>
+        internal static string SSDF_ImageGraphicReferenceResourceDataNotFound {
+            get {
+                return ResourceManager.GetString("SSDF_ImageGraphicReferenceResourceDataNotFound", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The simple symbol definition contains an image graphic that references a non-existent resource id.
+        /// </summary>
+        internal static string SSDF_ImageGraphicReferenceResourceIdNotFound {
+            get {
+                return ResourceManager.GetString("SSDF_ImageGraphicReferenceResourceIdNotFound", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The Simple Symbol Definition has no geometry usage contexts specified..
+        /// </summary>
+        internal static string SSDF_NoGeometryUsageContext {
+            get {
+                return ResourceManager.GetString("SSDF_NoGeometryUsageContext", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The simple symbol definition contains a symbol parameter {0} that is not referenced anywhere within the definition.
+        /// </summary>
+        internal static string SSDF_SymbolParameterNotUsed {
+            get {
+                return ResourceManager.GetString("SSDF_SymbolParameterNotUsed", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Could not find template url for template: .
         /// </summary>
         internal static string TemplateUrlNotFound {

Modified: trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Properties/Resources.resx
===================================================================
--- trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Properties/Resources.resx	2011-08-14 13:09:25 UTC (rev 6064)
+++ trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Properties/Resources.resx	2011-08-14 15:26:59 UTC (rev 6065)
@@ -515,4 +515,19 @@
   <data name="UnknownWatermarkDefinitionVersion" xml:space="preserve">
     <value>Unknown Watermark Definition version: </value>
   </data>
+  <data name="SSDF_ImageGraphicReferenceResourceDataNotFound" xml:space="preserve">
+    <value>The simple symbol definition contains an image graphic that references a resource id {0} with a non-existent resource data {1}</value>
+  </data>
+  <data name="SSDF_ImageGraphicReferenceResourceIdNotFound" xml:space="preserve">
+    <value>The simple symbol definition contains an image graphic that references a non-existent resource id</value>
+  </data>
+  <data name="SSDF_NoGeometryUsageContext" xml:space="preserve">
+    <value>The Simple Symbol Definition has no geometry usage contexts specified.</value>
+  </data>
+  <data name="SSDF_SymbolParameterNotUsed" xml:space="preserve">
+    <value>The simple symbol definition contains a symbol parameter {0} that is not referenced anywhere within the definition</value>
+  </data>
+  <data name="MDF_NoCoordinateSystem" xml:space="preserve">
+    <value>Map Definition has no coordinate system</value>
+  </data>
 </root>
\ No newline at end of file

Modified: trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/BaseMapDefinitionValidator.cs
===================================================================
--- trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/BaseMapDefinitionValidator.cs	2011-08-14 13:09:25 UTC (rev 6064)
+++ trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/BaseMapDefinitionValidator.cs	2011-08-14 15:26:59 UTC (rev 6065)
@@ -77,6 +77,11 @@
 
             IMapDefinition mdef = resource as IMapDefinition;
 
+            if (string.IsNullOrEmpty(mdef.CoordinateSystem))
+            {
+                issues.Add(new ValidationIssue(mdef, ValidationStatus.Warning, ValidationStatusCode.Warning_MapDefinition_MissingCoordinateSystem, Properties.Resources.MDF_NoCoordinateSystem));
+            }
+
             foreach (IMapLayerGroup g in mdef.MapLayerGroup)
             {
                 if (g.ShowInLegend && (g.LegendLabel == null || g.LegendLabel.Trim().Length == 0))

Added: trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/BaseSymbolDefinitionValidator.cs
===================================================================
--- trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/BaseSymbolDefinitionValidator.cs	                        (rev 0)
+++ trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/BaseSymbolDefinitionValidator.cs	2011-08-14 15:26:59 UTC (rev 6065)
@@ -0,0 +1,150 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.ObjectModels.SymbolDefinition;
+
+namespace OSGeo.MapGuide.MaestroAPI.Resource.Validation
+{
+    public abstract class BaseSymbolDefinitionValidator : IResourceValidator
+    {
+        /// <summary>
+        /// Gets the resource type and version this validator supports
+        /// </summary>
+        /// <value></value>
+        public abstract ResourceTypeDescriptor SupportedResourceAndVersion { get; }
+
+        /// <summary>
+        /// Validats the specified resources for common issues associated with this
+        /// resource type
+        /// </summary>
+        /// <param name="context"></param>
+        /// <param name="resource"></param>
+        /// <param name="recurse"></param>
+        /// <returns></returns>
+        public virtual ValidationIssue[] Validate(ResourceValidationContext context, IResource resource, bool recurse)
+        {
+            if (!resource.GetResourceTypeDescriptor().Equals(this.SupportedResourceAndVersion))
+                return null;
+
+            return ValidateBase(context, resource, recurse);
+        }
+
+        /// <summary>
+        /// Validats the specified resources for common issues associated with this
+        /// resource type
+        /// </summary>
+        /// <param name="context"></param>
+        /// <param name="resource"></param>
+        /// <param name="recurse"></param>
+        /// <returns></returns>
+        protected static ValidationIssue[] ValidateBase(ResourceValidationContext context, IResource resource, bool recurse)
+        {
+            Check.NotNull(context, "context");
+
+            if (context.IsAlreadyValidated(resource.ResourceID))
+                return null;
+
+            if (resource.ResourceType != ResourceTypes.SymbolDefinition)
+                return null;
+
+            var issues = new List<ValidationIssue>();
+            var symDef = (ISymbolDefinitionBase)resource;
+            if (symDef.Type == SymbolDefinitionType.Simple)
+            {
+                var ssym = (ISimpleSymbolDefinition)symDef;
+                issues.AddRange(ValidateSimpleSymbolDefinition(ssym, context));
+            }
+            else if (symDef.Type == SymbolDefinitionType.Compound)
+            {
+                var csym = (ICompoundSymbolDefinition)symDef;
+                foreach (var sym in csym.SimpleSymbol)
+                {
+                    if (sym.Type == SimpleSymbolReferenceType.Inline)
+                    {
+                        var inline = (ISimpleSymbolInlineReference)sym;
+                        issues.AddRange(ValidateSimpleSymbolDefinition(inline.SimpleSymbolDefinition, context));
+                    }
+                    else if (sym.Type == SimpleSymbolReferenceType.Library)
+                    {
+                        var res = context.GetResource(((ISimpleSymbolLibraryReference)sym).ResourceId);
+                        issues.AddRange(ValidateBase(context, res, false));
+                    }
+                }
+            }
+
+            context.MarkValidated(resource.ResourceID);
+            return issues.ToArray();
+        }
+
+        protected static IEnumerable<ValidationIssue> ValidateSimpleSymbolDefinition(ISimpleSymbolDefinition ssym, ResourceValidationContext context)
+        {
+            //Check that one geometry usage context has been specified
+            if (ssym.AreaUsage == null &&
+                ssym.LineUsage == null &&
+                ssym.PointUsage == null)
+            {
+                yield return new ValidationIssue(ssym, ValidationStatus.Error, ValidationStatusCode.Error_SymbolDefinition_NoGeometryUsageContexts, Properties.Resources.SSDF_NoGeometryUsageContext);
+            }
+
+            //Validate image graphics
+            foreach (var graphic in ssym.Graphics)
+            {
+                if (graphic.Type == GraphicElementType.Image)
+                {
+                    IImageGraphic image = (IImageGraphic)graphic;
+                    if (image.Item != null)
+                    {
+                        if (image.Item.Type == ImageType.Reference)
+                        {
+                            IImageReference imgRef = (IImageReference)image.Item;
+                            if (!context.ResourceExists(imgRef.ResourceId))
+                            {
+                                yield return new ValidationIssue(ssym, ValidationStatus.Error, ValidationStatusCode.Error_SymbolDefinition_ImageGraphicReferenceResourceIdNotFound, Properties.Resources.SSDF_ImageGraphicReferenceResourceIdNotFound);
+                            }
+                            else
+                            {
+                                var res = context.GetResource(imgRef.ResourceId);
+                                var resData = res.EnumerateResourceData();
+                                bool found = false;
+                                foreach (var item in resData)
+                                {
+                                    if (item.Name == imgRef.LibraryItemName)
+                                        found = true;
+                                }
+
+                                if (!found)
+                                {
+                                    yield return new ValidationIssue(ssym,
+                                                                     ValidationStatus.Error,
+                                                                     ValidationStatusCode.Error_SymbolDefinition_ImageGraphicReferenceResourceDataNotFound,
+                                                                     string.Format(Properties.Resources.SSDF_ImageGraphicReferenceResourceDataNotFound,
+                                                                        imgRef.ResourceId,
+                                                                        imgRef.LibraryItemName));
+                                }
+                            }
+                        }
+                        else //inline
+                        {
+                            //TODO: Validate inline image content
+                        }
+                    }
+                }
+            }
+
+            string xml = ResourceTypeRegistry.SerializeAsString(ssym);
+
+            //Check non existent symbol parameters
+            foreach (var paramDef in ssym.ParameterDefinition.Parameter)
+            {
+                string name = "%" + paramDef.Identifier + "%";
+                if (!xml.Contains(name) && string.IsNullOrEmpty(paramDef.DefaultValue))
+                {
+                    yield return new ValidationIssue(ssym, ValidationStatus.Warning, ValidationStatusCode.Warning_SymbolDefinition_SymbolParameterNotUsed,
+                        string.Format(Properties.Resources.SSDF_SymbolParameterNotUsed, paramDef.Identifier));
+                }
+            }
+
+            //TODO: Do the reverse check. Placeholders not pointing to a symbol parameter
+        }
+    }
+}

Modified: trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/ResourceValidationContext.cs
===================================================================
--- trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/ResourceValidationContext.cs	2011-08-14 13:09:25 UTC (rev 6064)
+++ trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/ResourceValidationContext.cs	2011-08-14 15:26:59 UTC (rev 6065)
@@ -120,5 +120,10 @@
 
             Trace.TraceInformation("Validated: " + resourceId);
         }
+
+        public bool ResourceExists(string resourceId)
+        {
+            return _resSvc.ResourceExists(resourceId);
+        }
     }
 }

Modified: trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/SymbolDefinitionValidator.cs
===================================================================
--- trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/SymbolDefinitionValidator.cs	2011-08-14 13:09:25 UTC (rev 6064)
+++ trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/SymbolDefinitionValidator.cs	2011-08-14 15:26:59 UTC (rev 6065)
@@ -22,46 +22,22 @@
 using System.Text;
 using OSGeo.MapGuide.MaestroAPI.Resource;
 using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.ObjectModels.SymbolDefinition;
 
 namespace OSGeo.MapGuide.MaestroAPI.Resource.Validation
 {
     /// <summary>
     /// Resource validator for Symbol Definitions
     /// </summary>
-    public class SymbolDefinitionValidator : IResourceValidator
+    public class SymbolDefinitionValidator : BaseSymbolDefinitionValidator
     {
         /// <summary>
         /// Gets the resource type and version this validator supports
         /// </summary>
         /// <value></value>
-        public ResourceTypeDescriptor SupportedResourceAndVersion
+        public override ResourceTypeDescriptor SupportedResourceAndVersion
         {
-            get { return ResourceTypeDescriptor.SymbolDefinition; }
+            get { return new ResourceTypeDescriptor(ResourceTypes.SymbolDefinition, "1.0.0"); }
         }
-
-        /// <summary>
-        /// Validats the specified resources for common issues associated with this
-        /// resource type
-        /// </summary>
-        /// <param name="context"></param>
-        /// <param name="resource"></param>
-        /// <param name="recurse"></param>
-        /// <returns></returns>
-        public ValidationIssue[] Validate(ResourceValidationContext context, IResource resource, bool recurse)
-        {
-            Check.NotNull(context, "context");
-
-            if (context.IsAlreadyValidated(resource.ResourceID))
-                return null;
-
-            if (resource.ResourceType != ResourceTypes.SymbolDefinition)
-                return null;
-
-            //TODO: What problems could there possibly be?
-
-            context.MarkValidated(resource.ResourceID);
-
-            return new ValidationIssue[0];
-        }
     }
 }

Modified: trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/ValidationStatusCode.cs
===================================================================
--- trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/ValidationStatusCode.cs	2011-08-14 13:09:25 UTC (rev 6064)
+++ trunk/Tools/Maestro/OSGeo.MapGuide.MaestroAPI/Resource/Validation/ValidationStatusCode.cs	2011-08-14 15:26:59 UTC (rev 6065)
@@ -146,7 +146,9 @@
         /// to manually pan outside the extents to see this data.
         /// </summary>
         Warning_MapDefinition_DataOutsideMapBounds,
-        
+
+        Warning_MapDefinition_MissingCoordinateSystem,
+
         /// <summary>
         /// The specified initial view parameters lie outside the referenced Map Definition's extents. Usually means you will see nothing when the Fusion viewer loads.
         /// </summary>
@@ -171,6 +173,12 @@
         /// The web layout's initial view lies outside the referenced map definition's extents. Usually means you will see nothing when the AJAX viewer loads.
         /// </summary>
         Warning_WebLayout_InitialViewOutsideMapExtents = 3601,
+
+        /// <summary>
+        /// The simple symbol definition contains a symbol parameter that is not referenced
+        /// anywhere within the definition
+        /// </summary>
+        Warning_SymbolDefinition_SymbolParameterNotUsed = 3701,
         #endregion
 
         #region errors
@@ -354,6 +362,23 @@
         /// Source DWF file not specified
         /// </summary>
         Error_DrawingSource_NoSourceDwf = 5601,
+
+        /// <summary>
+        /// The simple symbol definition has no geometry usage contexts
+        /// </summary>
+        Error_SymbolDefinition_NoGeometryUsageContexts = 5701,
+
+        /// <summary>
+        /// The simple symbol definition contains an image graphic that references
+        /// a non-existent resource id
+        /// </summary>
+        Error_SymbolDefinition_ImageGraphicReferenceResourceIdNotFound,
+
+        /// <summary>
+        /// The simple symbol definition contains an image graphic that references
+        /// a non-existent resource data item
+        /// </summary>
+        Error_SymbolDefinition_ImageGraphicReferenceResourceDataNotFound,
         #endregion
     }
 }



More information about the mapguide-commits mailing list