using System;
using System.Collections.Generic;
using System.Text;
using OSGeo.MapGuide.ObjectModels.Common;
using OSGeo.MapGuide.ObjectModels.MapDefinition;
using OSGeo.MapGuide.ObjectModels.WebLayout;
using OSGeo.MapGuide.MaestroAPI.Exceptions;
using OSGeo.MapGuide.ObjectModels;
namespace OSGeo.MapGuide.MaestroAPI.Resource.Validation
{
///
/// Base class of all web layout validators. Provides common validation
/// logic for web layouts
///
public abstract class BaseWebLayoutValidator : 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);
}
///
/// Performs base validation logic
///
///
///
///
///
protected static ValidationIssue[] ValidateBase(ResourceValidationContext context, IResource resource, bool recurse)
{
Check.NotNull(context, "context");
if (context.IsAlreadyValidated(resource.ResourceID))
return null;
if (resource.ResourceType != OSGeo.MapGuide.MaestroAPI.ResourceTypes.WebLayout)
return null;
List issues = new List();
IWebLayout layout = resource as IWebLayout;
if (layout.Map == null || layout.Map.ResourceId == null)
{
issues.Add(new ValidationIssue(layout, ValidationStatus.Error, string.Format(Properties.Resources.WL_MissingMapError)));
}
else
{
//Check for duplicate command names
var cmdSet = layout.CommandSet;
Dictionary cmds = new Dictionary();
foreach (ICommand cmd in cmdSet.Commands)
{
if (cmds.ContainsKey(cmd.Name))
issues.Add(new ValidationIssue(layout, ValidationStatus.Error, string.Format(Properties.Resources.WL_DuplicateCommandName, cmd.Name)));
else
cmds[cmd.Name] = cmd;
}
//Check for duplicate property references in search commands
foreach (ICommand cmd in cmdSet.Commands)
{
if (cmd is ISearchCommand)
{
ISearchCommand search = (ISearchCommand)cmd;
Dictionary resColProps = new Dictionary();
foreach (IResultColumn resCol in search.ResultColumns.Column)
{
if (resColProps.ContainsKey(resCol.Property))
issues.Add(new ValidationIssue(layout, ValidationStatus.Error, string.Format(Properties.Resources.WL_DuplicateSearchResultColumn, search.Name, resCol.Property)));
else
resColProps.Add(resCol.Property, resCol.Property);
}
}
}
//Check for command references to non-existent commands
foreach (IUIItem item in layout.ContextMenu.Items)
{
if (item.Function == UIItemFunctionType.Command)
{
ICommandItem cmdRef = (ICommandItem)item;
if (!cmds.ContainsKey(cmdRef.Command))
issues.Add(new ValidationIssue(layout, ValidationStatus.Error, string.Format(Properties.Resources.WL_NonExistentMenuCommandReference, cmdRef.Command)));
}
}
foreach (IUIItem item in layout.TaskPane.TaskBar.Items)
{
if (item.Function == UIItemFunctionType.Command)
{
ICommandItem cmdRef = (ICommandItem)item;
if (!cmds.ContainsKey(cmdRef.Command))
issues.Add(new ValidationIssue(layout, ValidationStatus.Error, string.Format(Properties.Resources.WL_NonExistentTaskPaneCommandReference, cmdRef.Command)));
}
}
foreach (IUIItem item in layout.ToolBar.Items)
{
if (item.Function == UIItemFunctionType.Command)
{
ICommandItem cmdRef = (ICommandItem)item;
if (!cmds.ContainsKey(cmdRef.Command))
issues.Add(new ValidationIssue(layout, ValidationStatus.Error, string.Format(Properties.Resources.WL_NonExistentToolbarCommandReference, cmdRef.Command)));
}
}
if (recurse)
{
try
{
IMapDefinition mdef = (IMapDefinition)context.GetResource(layout.Map.ResourceId);
issues.AddRange(ResourceValidatorSet.Validate(context, mdef, true));
if (layout.Map.InitialView != null)
{
var mapEnv = ObjectFactory.CreateEnvelope(mdef.Extents.MinX, mdef.Extents.MaxX, mdef.Extents.MinY, mdef.Extents.MaxY);
if (!mapEnv.Contains(layout.Map.InitialView.CenterX, layout.Map.InitialView.CenterY))
issues.Add(new ValidationIssue(mdef, ValidationStatus.Warning, string.Format(Properties.Resources.WL_StartViewOutsideExtentsWarning)));
}
}
catch (Exception ex)
{
string msg = NestedExceptionMessageProcessor.GetFullMessage(ex);
issues.Add(new ValidationIssue(layout, ValidationStatus.Error, string.Format(Properties.Resources.WL_MapValidationError, layout.Map.ResourceId, msg)));
}
}
}
context.MarkValidated(resource.ResourceID);
return issues.ToArray();
}
}
}