using System;
using System.Collections.Generic;
using System.Text;
using OSGeo.MapGuide.ObjectModels.SymbolDefinition;
namespace OSGeo.MapGuide.MaestroAPI.Resource.Validation
{
///
/// The base class of Symbol Definition validators
///
public abstract class BaseSymbolDefinitionValidator : IResourceValidator
{
///
/// Gets the resource type and version this validator supports
///
///
public abstract ResourceTypeDescriptor SupportedResourceAndVersion { get; }
///
/// Validats the specified resources for common issues associated with this
/// resource type
///
///
///
///
///
public virtual ValidationIssue[] Validate(ResourceValidationContext context, IResource resource, bool recurse)
{
if (!resource.GetResourceTypeDescriptor().Equals(this.SupportedResourceAndVersion))
return null;
return ValidateBase(context, resource, recurse);
}
///
/// Validats the specified resources for common issues associated with this
/// resource type
///
///
///
///
///
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();
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();
}
///
/// Validates the simple symbol definition.
///
/// The ssym.
/// The context.
///
protected static IEnumerable 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
}
}
}