Mercurial > repos > IBDev-IBBoard.WarFoundry.API
changeset 41:422ddd5fedd1
Re #48 - Require schemas to validate
* Restructure schema caching so that it warns instead of exceptioning - allows a missing schema to not kill an unrelated file load
* Fix exception handling for GameSystems while working out where exceptions were being caught
Current situation: Missing Race/System schema stops file loading but missing cat/core schema doesn't
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sat, 21 Mar 2009 20:52:26 +0000 |
parents | 3664eee50390 |
children | d0d44434b557 |
files | api/Factories/Xml/WarFoundryXmlFactory.cs api/WarFoundryLoader.cs |
diffstat | 2 files changed, 35 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/api/Factories/Xml/WarFoundryXmlFactory.cs Sat Mar 21 17:04:33 2009 +0000 +++ b/api/Factories/Xml/WarFoundryXmlFactory.cs Sat Mar 21 20:52:26 2009 +0000 @@ -308,36 +308,44 @@ { if (settings == null) { - try - { - settings = new XmlReaderSettings(); - settings.ValidationType = ValidationType.Schema; - settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings; - settings.ValidationEventHandler+= new ValidationEventHandler(ValidationEventMethod); - XmlSchemaSet cache = new XmlSchemaSet(); - cache.Add("http://ibboard.co.uk/warfoundry/core", IBBoard.Constants.ExecutablePath + "/dtds/warfoundry-core.xsd"); - cache.Add("http://ibboard.co.uk/warfoundry/cats", IBBoard.Constants.ExecutablePath + "/dtds/warfoundry-cats.xsd"); - cache.Add("http://ibboard.co.uk/warfoundry/race", IBBoard.Constants.ExecutablePath + "/dtds/race.xsd"); - cache.Add("http://ibboard.co.uk/warfoundry/system", IBBoard.Constants.ExecutablePath + "/dtds/system.xsd"); - settings.Schemas.Add(cache); - } - catch (DirectoryNotFoundException ex) - { - throw new InvalidDataException("Problem validating schema for WarFoundry data: " + ex.Message, ex); - } - catch (XmlSchemaException ex) - { - throw new InvalidDataException("Problem validating schema for WarFoundry data: " + ex.Message, ex); - } - catch (XmlException ex) - { - throw new InvalidDataException("Problem reading data for schema: " + ex.Message, ex); - } + settings = new XmlReaderSettings(); + settings.ValidationType = ValidationType.Schema; + settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings; + settings.ProhibitDtd = true; + settings.ValidationEventHandler+= new ValidationEventHandler(ValidationEventMethod); + XmlSchemaSet cache = new XmlSchemaSet(); + string path = IBBoard.Constants.ExecutablePath + "/dtds/"; + string nsBase = "http://ibboard.co.uk/warfoundry/"; + AddSchemaToCache(cache, nsBase + "core", path + "warfoundry-core.xsd"); + AddSchemaToCache(cache, nsBase + "cats", path + "warfoundry-cats.xsd"); + AddSchemaToCache(cache, nsBase + "race", path + "race.xsd"); + AddSchemaToCache(cache, nsBase + "system", path + "system.xsd"); + settings.Schemas.Add(cache); } return settings; } + private void AddSchemaToCache(XmlSchemaSet cache, string xmlNamespace, string schemaLocation) + { + try + { + cache.Add(xmlNamespace, schemaLocation); + } + catch (IOException ex) + { + LogNotifier.Warn(GetType(), "Problem reading schema: " + ex.Message, ex); + } + catch (XmlSchemaException ex) + { + LogNotifier.Warn(GetType(), "Problem validating schema for WarFoundry data: " + ex.Message, ex); + } + catch (XmlException ex) + { + LogNotifier.Warn(GetType(), "Problem reading data for schema: " + ex.Message, ex); + } + } + private void ValidationEventMethod(object sender, ValidationEventArgs e) { throw new InvalidDataException("Problem validating against schema for WarFoundry data: " + e.Exception.Message, e.Exception);
--- a/api/WarFoundryLoader.cs Sat Mar 21 17:04:33 2009 +0000 +++ b/api/WarFoundryLoader.cs Sat Mar 21 20:52:26 2009 +0000 @@ -285,7 +285,7 @@ if (!loaded) { - failure = new FileLoadFailure(file, "FileLoadFailed", "Failed to load {0} as Race using {1}"); + failure = new FileLoadFailure(file, "FileLoadFailed", "Failed to load {0} as GameSystem using {1}"); } } catch (Exception ex) @@ -296,7 +296,7 @@ if (failure!=null) { fails.Add(failure); - LogNotifier.Warn(GetType(), failure.Message); + LogNotifier.Warn(GetType(), failure.Message, failure.Exception); } }