From deda3348224584ab854db9208e321d5ebae3730b Mon Sep 17 00:00:00 2001 From: Mauricio Scheffer Date: Sun, 3 Jan 2010 00:09:48 +0000 Subject: [PATCH] issue #70 cores configuration by xml git-svn-id: http://solrnet.googlecode.com/svn/trunk@500 66c3f25c-543c-0410-ae2e-6f2ca0bd8c61 --- .../Tests.cs | 40 +++++++++++++++++-- .../SolrCore.cs | 2 +- .../SolrNetFacility.cs | 38 ++++++++++++++++++ 3 files changed, 76 insertions(+), 4 deletions(-) diff --git a/Castle.Facilities.SolrNetIntegration.Tests/Tests.cs b/Castle.Facilities.SolrNetIntegration.Tests/Tests.cs index eb16ccfbb..983e7eed9 100644 --- a/Castle.Facilities.SolrNetIntegration.Tests/Tests.cs +++ b/Castle.Facilities.SolrNetIntegration.Tests/Tests.cs @@ -17,10 +17,12 @@ using System; using System.Reflection; using Castle.Core.Configuration; +using Castle.Core.Resource; using Castle.MicroKernel.Facilities; using Castle.MicroKernel.Registration; using Castle.MicroKernel.SubSystems.Configuration; using Castle.Windsor; +using Castle.Windsor.Configuration.Interpreters; using MbUnit.Framework; using Rhino.Mocks; using SolrNet; @@ -171,15 +173,47 @@ public void AddCore() { var container = new WindsorContainer(); container.AddFacility("solr", solrFacility); + TestCores(container); + } + + [Test] + public void AddCoreFromXML() { + var solrFacility = new SolrNetFacility(); + var container = new WindsorContainer(new XmlInterpreter(new StaticContentResource(@" + + + http://localhost:8983/solr/defaultCore + + + Castle.Facilities.SolrNetIntegration.Tests.Tests+Document, Castle.Facilities.SolrNetIntegration.Tests + http://localhost:8983/solr/core0 + + + Castle.Facilities.SolrNetIntegration.Tests.Tests+Document, Castle.Facilities.SolrNetIntegration.Tests + http://localhost:8983/solr/core1 + + + Castle.Facilities.SolrNetIntegration.Tests.Tests+Core1Entity, Castle.Facilities.SolrNetIntegration.Tests + http://localhost:8983/solr/core1 + + + + +"))); + container.AddFacility("solr", solrFacility); + TestCores(container); + } + + public void TestCores(IWindsorContainer container) { // assert that everything is correctly wired container.Kernel.DependencyResolving += (client, model, dep) => { if (model.TargetType == typeof(ISolrConnection)) { if (client.Name.StartsWith("core0-id")) - Assert.AreEqual(core0url, ((ISolrConnection)dep).ServerURL); + Assert.AreEqual("http://localhost:8983/solr/core0", ((ISolrConnection)dep).ServerURL); if (client.Name.StartsWith("core1-id")) - Assert.AreEqual(core1url, ((ISolrConnection)dep).ServerURL); + Assert.AreEqual("http://localhost:8983/solr/core1", ((ISolrConnection)dep).ServerURL); if (client.Name.StartsWith("core2-id")) - Assert.AreEqual(core1url, ((ISolrConnection)dep).ServerURL); + Assert.AreEqual("http://localhost:8983/solr/core1", ((ISolrConnection)dep).ServerURL); } }; diff --git a/Castle.Facilities.SolrNetIntegration/SolrCore.cs b/Castle.Facilities.SolrNetIntegration/SolrCore.cs index 5904cff5b..d7737ce5b 100644 --- a/Castle.Facilities.SolrNetIntegration/SolrCore.cs +++ b/Castle.Facilities.SolrNetIntegration/SolrCore.cs @@ -17,7 +17,7 @@ using System; namespace Castle.Facilities.SolrNetIntegration { - internal class SolrCore { + public class SolrCore { public string Id { get; private set; } public Type DocumentType { get; private set; } public string Url { get; private set; } diff --git a/Castle.Facilities.SolrNetIntegration/SolrNetFacility.cs b/Castle.Facilities.SolrNetIntegration/SolrNetFacility.cs index 16be84768..4fcbe77a8 100644 --- a/Castle.Facilities.SolrNetIntegration/SolrNetFacility.cs +++ b/Castle.Facilities.SolrNetIntegration/SolrNetFacility.cs @@ -16,6 +16,7 @@ using System; using System.Collections.Generic; +using Castle.Core.Configuration; using Castle.MicroKernel.Facilities; using Castle.MicroKernel.Registration; using SolrNet; @@ -88,6 +89,7 @@ protected override void Init() { Kernel.Register(Component.For().ImplementedBy()); // set up cores + AddCoresFromConfig(); foreach (var core in cores) { var coreConnectionId = core.Id + typeof (SolrConnection); Kernel.Register(Component.For().ImplementedBy() @@ -128,11 +130,47 @@ private static void ValidateUrl(string url) { } } + public void AddCore(Type documentType, string coreUrl) { + AddCore(Guid.NewGuid().ToString(), documentType, coreUrl); + } + public void AddCore(string coreId, Type documentType, string coreUrl) { ValidateUrl(coreUrl); cores.Add(new SolrCore(coreId, documentType, coreUrl)); } + private void AddCoresFromConfig() { + if (FacilityConfig == null) + return; + var coresConfig = FacilityConfig.Children["cores"]; + if (coresConfig == null) + return; + foreach (var coreConfig in coresConfig.Children) { + var id = coreConfig.Attributes["id"] ?? Guid.NewGuid().ToString(); + var documentType = GetCoreDocumentType(coreConfig); + var coreUrl = GetCoreUrl(coreConfig); + AddCore(id, documentType, coreUrl); + } + } + + private string GetCoreUrl(IConfiguration coreConfig) { + var node = coreConfig.Children["url"]; + if (node == null) + throw new FacilityException("Core url missing in SolrNet core configuration"); + return node.Value; + } + + private Type GetCoreDocumentType(IConfiguration coreConfig) { + var node = coreConfig.Children["documentType"]; + if (node == null) + throw new FacilityException("Document type missing in SolrNet core configuration"); + try { + return Type.GetType(node.Value); + } catch (Exception e) { + throw new FacilityException(string.Format("Error getting document type '{0}'", node.Value), e); + } + } + private readonly List cores = new List(); } } \ No newline at end of file