changeset 379:04f4c2fea356

Re #351: Add extensible requirement handling method * Extract common IRequirementFactory interface * Drop back to just returning IRequirement from factory to simplify generics * Add initial registration of requirement factories
author IBBoard <dev@ibboard.co.uk>
date Sat, 23 Jul 2011 19:53:42 +0000
parents ff7f1b319b4e
children 7036bf04e955
files API/Factories/Requirement/IRequirementFactory.cs API/Factories/Requirement/UnitRequiresAtLeastNUnitsRequirementFactory.cs API/Factories/Xml/WarFoundryXmlRaceFactory.cs API/WarFoundryLoader.cs IBBoard.WarFoundry.API.csproj
diffstat 5 files changed, 43 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/API/Factories/Requirement/IRequirementFactory.cs	Sat Jul 23 19:53:42 2011 +0000
@@ -0,0 +1,16 @@
+// This file (IRequirementFactory.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2011 IBBoard
+// 
+// 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.
+using System;
+using IBBoard.WarFoundry.API.Objects;
+using IBBoard.WarFoundry.API.Objects.Requirement;
+
+namespace IBBoard.WarFoundry.API.Factories.Requirement
+{
+	public interface IRequirementFactory
+	{
+		IRequirement CreateRequirement<SOURCE_FILE_TYPE, ENTRY_TYPE>(UnitType type, string data, IRaceFactory<SOURCE_FILE_TYPE, ENTRY_TYPE> raceFactory);
+		string AppliesToID { get; }
+	}
+}
+
--- a/API/Factories/Requirement/UnitRequiresAtLeastNUnitsRequirementFactory.cs	Sat Jul 16 19:59:04 2011 +0000
+++ b/API/Factories/Requirement/UnitRequiresAtLeastNUnitsRequirementFactory.cs	Sat Jul 23 19:53:42 2011 +0000
@@ -7,14 +7,20 @@
 
 namespace IBBoard.WarFoundry.API.Factories.Requirement
 {
-	public class UnitRequiresAtLeastNUnitsRequirementFactory
+	public class UnitRequiresAtLeastNUnitsRequirementFactory : IRequirementFactory
 	{
 		public UnitRequiresAtLeastNUnitsRequirementFactory()
 		{
 			//Do nothing special
 		}
 
-		public UnitRequiresAtLeastNUnitsRequirement CreateRequirement<SOURCE_FILE_TYPE, ENTRY_TYPE>(UnitType type, string data, IRaceFactory<SOURCE_FILE_TYPE, ENTRY_TYPE> raceFactory)
+		public string AppliesToID {
+			get {
+				return "RequiresAtLeastNUnits";
+			}
+		}
+
+		public IRequirement CreateRequirement<SOURCE_FILE_TYPE, ENTRY_TYPE>(UnitType type, string data, IRaceFactory<SOURCE_FILE_TYPE, ENTRY_TYPE> raceFactory)
 		{
 			UnitRequiresAtLeastNUnitsRequirement req = new UnitRequiresAtLeastNUnitsRequirement(type);
 			Race race = type.Race;
--- a/API/Factories/Xml/WarFoundryXmlRaceFactory.cs	Sat Jul 16 19:59:04 2011 +0000
+++ b/API/Factories/Xml/WarFoundryXmlRaceFactory.cs	Sat Jul 23 19:53:42 2011 +0000
@@ -401,7 +401,7 @@
 
 				if (reqFactory != null) {
 					string data = WarFoundryXmlFactoryUtils.SelectSingleElement(extraData, "race:data").InnerText;
-					UnitRequiresAtLeastNUnitsRequirement req = reqFactory.CreateRequirement(type, data, this);
+					IRequirement req = reqFactory.CreateRequirement(type, data, this);
 					type.AddRequirement(req);
 				}
 			}
--- a/API/WarFoundryLoader.cs	Sat Jul 16 19:59:04 2011 +0000
+++ b/API/WarFoundryLoader.cs	Sat Jul 23 19:53:42 2011 +0000
@@ -1,16 +1,19 @@
 // This file (WarFoundryLoader.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2007, 2008, 2009 IBBoard.
 //
 // 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.
-
 using System;
 using ICSharpCode.SharpZipLib.Zip;
+using System.Collections.Generic;
+using IBBoard.WarFoundry.API.Factories.Requirement;
+using IBBoard.WarFoundry.API.Objects.Requirement;
 
 namespace IBBoard.WarFoundry.API
 {
 	public class WarFoundryLoader
 	{		
 		private static AbstractWarFoundryLoader loader;
-		
+		private static Dictionary<string, IRequirementFactory> requirementFactories = new Dictionary<string, IRequirementFactory>();
+
 		/// <summary>
 		/// Gets the default <see cref="WarFoundryLoader"/> used to load WarFoundry data files.
 		/// </summary>
@@ -29,12 +32,22 @@
 		
 		public static void SetDefault(AbstractWarFoundryLoader newLoader)
 		{
-			loader = newLoader;	
+			loader = newLoader;
 		}
-		
+
 		private WarFoundryLoader()
 		{
 			//Hide constructor
 		}
+
+		public static void RegisterRequirementFactory(IRequirementFactory factory)
+		{
+			requirementFactories[factory.AppliesToID] = factory;
+		}
+
+		public static IRequirementFactory GetRequirementFactory(string requirementID)
+		{
+			return DictionaryUtils.GetValue(requirementFactories, requirementID);
+		}
 	}
 }
--- a/IBBoard.WarFoundry.API.csproj	Sat Jul 16 19:59:04 2011 +0000
+++ b/IBBoard.WarFoundry.API.csproj	Sat Jul 23 19:53:42 2011 +0000
@@ -182,6 +182,7 @@
     <Compile Include="API\Factories\Requirement\InvalidRequirementException.cs" />
     <Compile Include="API\Factories\Xml\CategoryLoader.cs" />
     <Compile Include="API\Factories\IRaceFactory.cs" />
+    <Compile Include="API\Factories\Requirement\IRequirementFactory.cs" />
   </ItemGroup>
   <ItemGroup>
     <Reference Include="System.Xml" />