annotate api/Factories/Xml/WarFoundryXmlLimitParser.cs @ 266:a3c1bf57fd3f

Re #279: Create composite limit * Ignore XPath and go for all child nodes, since we want to warn in future if an unsupported limit is ignored * Make the "any" option in the limit choice group a singular instead of 0+ to ensure we get a choice when we use the group
author IBBoard <dev@ibboard.co.uk>
date Sat, 05 Jun 2010 18:57:46 +0000
parents 6fe0cb1bf74f
children d8e4eeb761c7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
265
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
1 // This file (WarFoundryXmlLimitParser.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2010 IBBoard
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
2 //
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
3 // The file and the library/program it is in are licensed and distributed, without warranty, under the GNU Affero GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license.
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
4 using System.Collections.Generic;
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
5 using System.Xml;
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
6 using IBBoard.Limits;
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
7 using IBBoard.Xml;
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
8
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
9 namespace IBBoard.WarFoundry.API.Factories.Xml
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
10 {
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
11 public class WarFoundryXmlLimitParser
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
12 {
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
13 public ILimit GetMinLimit(XmlElement elem)
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
14 {
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
15 XmlElement limitElem = WarFoundryXmlFactoryUtils.SelectSingleElement(elem, "race:minLimit/*[1]");
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
16 return GetLimitFromElement(limitElem);
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
17 }
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
18
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
19 public ILimit GetMaxLimit(XmlElement equipSlot)
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
20 {
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
21 XmlElement limitElem = WarFoundryXmlFactoryUtils.SelectSingleElement(equipSlot, "race:maxLimit/*[1]");
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
22 return GetLimitFromElement(limitElem);
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
23 }
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
24
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
25 public ILimit GetLimitFromElement(XmlElement limitElem)
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
26 {
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
27 ILimit limit = null;
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
28
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
29 if (limitElem != null)
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
30 {
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
31 switch (limitElem.LocalName)
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
32 {
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
33 case "percentageLimit":
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
34 double limitPercent = XmlTools.GetDoubleValueFromAttribute(limitElem, "limit");
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
35 bool roundUp = limitElem.GetAttribute("round").Equals("up");
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
36 limit = new SimpleRoundedPercentageLimit(limitPercent, roundUp);
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
37 break;
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
38 case "sizeConstrainedLimit":
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
39 limit = new NumericSizeConstrainedLimit(XmlTools.GetIntValueFromAttribute(limitElem, "limit"));
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
40 break;
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
41 case "absoluteLimit":
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
42 limit = new AbsoluteNumericLimit(XmlTools.GetIntValueFromAttribute(limitElem, "limit"));
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
43 break;
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
44 case "unitSizeLimit":
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
45 limit = new SimpleRoundedPercentageLimit(100);
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
46 break;
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
47 case "compositeMaxLimit":
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
48 ICollection<ILimit> maxSubLimits = GetSubLimits(limitElem);
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
49 limit = new CompositeMaximumLimit(maxSubLimits);
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
50 break;
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
51 case "compositeMinLimit":
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
52 ICollection<ILimit> minSubLimits = GetSubLimits(limitElem);
266
a3c1bf57fd3f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents: 265
diff changeset
53 limit = new CompositeMinimumLimit(minSubLimits);
265
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
54 break;
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
55 default:
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
56 //TODO: Warn of missing handler for when we've extended the limit list
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
57 break;
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
58 }
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
59 }
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
60
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
61 return limit;
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
62 }
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
63
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
64 private ICollection<ILimit> GetSubLimits(XmlElement limitElem)
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
65 {
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
66 System.Console.WriteLine("Getting sub limits");
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
67 XmlNodeList subLimitNodes = GetSubLimitElements(limitElem);
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
68 ICollection<ILimit> limits = new List<ILimit>();
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
69
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
70 foreach (XmlNode node in subLimitNodes)
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
71 {
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
72 System.Console.WriteLine("Getting limit for "+node.LocalName);
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
73 if (node is XmlElement)
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
74 {
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
75 ILimit limit = GetLimitFromElement((XmlElement)node);
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
76 System.Console.WriteLine("Limit was "+(limit == null ? "null" : limit.GetType().Name));
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
77 if (limit != null)
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
78 {
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
79 limits.Add(limit);
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
80 }
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
81 }
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
82 }
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
83
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
84 return limits;
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
85 }
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
86
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
87 private XmlNodeList GetSubLimitElements(XmlElement limitElem)
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
88 {
266
a3c1bf57fd3f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents: 265
diff changeset
89 return limitElem.ChildNodes;
265
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
90 }
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
91 }
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
92 }
6fe0cb1bf74f Re #279: Create composite limit
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
93