Skip to content

Commit

Permalink
Changed implementation for ISolrConnection from SolrConnection to Aut…
Browse files Browse the repository at this point in the history
…oSolrConnection

Changed the class to be more extensible
Updated test fixtures
  • Loading branch information
maciej-rubrikkgroup committed Feb 28, 2018
1 parent 9380434 commit 11b8abb
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 59 deletions.
18 changes: 9 additions & 9 deletions StructureMap.SolrNetIntegration.Tests/StructureMapFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
using SolrNet.Impl;
using Microsoft.Extensions.Configuration;
using System.IO;
using System.IO;
using System.Configuration;
using StructureMap.SolrNetIntegration.Config;
using System.Linq;

namespace StructureMap.SolrNetIntegration.Tests
{

Expand All @@ -23,7 +23,7 @@ public StructureMapFixture()
new SolrServer ("entity2","http://localhost:8983/solr/core0", "StructureMap.SolrNetIntegration.Tests.Entity2, StructureMap.SolrNetIntegration.Tests"),
new SolrServer ("entity3","http://localhost:8983/solr/core1", "StructureMap.SolrNetIntegration.Tests.Entity2, StructureMap.SolrNetIntegration.Tests")
};
Container = new Container(c => c.IncludeRegistry(new SolrNetRegistry(servers)));
Container = new Container(c => c.IncludeRegistry(SolrNetRegistry.Create(servers)));
}


Expand All @@ -40,11 +40,11 @@ public void RegistersSolrConnectionWithAppConfigServerUrl()
{

var solrConfig = (SolrConfigurationSection)ConfigurationManager.GetSection("solr");
var container = new Container(c => c.IncludeRegistry(new SolrNetRegistry(solrConfig.SolrServers)));
var container = new Container(c => c.IncludeRegistry(SolrNetRegistry.Create(solrConfig.SolrServers)));

var instanceKey = "entity" + typeof(SolrConnection);

var solrConnection = (SolrConnection)container.GetInstance<ISolrConnection>(instanceKey);
var solrConnection = (AutoSolrConnection)container.GetInstance<ISolrConnection>(instanceKey);

Assert.Equal("http://localhost:8983/solr/collection1", solrConnection.ServerURL);
}
Expand Down Expand Up @@ -77,12 +77,12 @@ public void RegistersSolrConnectionWithCoresJsonServerUrl()
.Build()
.GetSection("solr:servers");

var container = new Container(c => c.IncludeRegistry(new SolrNetRegistry(configuration.Get<List<SolrServer>>())));
var container = new Container(c => c.IncludeRegistry(SolrNetRegistry.Create(configuration.Get<List<SolrServer>>())));


var instanceKey = "entity" + typeof(SolrConnection);

var solrConnection = (SolrConnection)container.GetInstance<ISolrConnection>(instanceKey);
var solrConnection = (AutoSolrConnection)container.GetInstance<ISolrConnection>(instanceKey);

Assert.Equal("http://localhost:8983/solr/collection1", solrConnection.ServerURL);
}
Expand Down Expand Up @@ -120,7 +120,7 @@ public void Should_throw_exception_for_invalid_protocol_on_url()
DocumentType = typeof(Entity2).AssemblyQualifiedName,
}
};
Assert.Throws<InvalidURLException>(() => new Container(c => c.IncludeRegistry(new SolrNetRegistry(solrServers))));
Assert.Throws<InvalidURLException>(() => new Container(c => c.IncludeRegistry(SolrNetRegistry.Create(solrServers))));
}

[Fact]
Expand All @@ -134,7 +134,7 @@ public void Should_throw_exception_for_invalid_url()
}
};

Assert.Throws<InvalidURLException>(() => new Container(c => c.IncludeRegistry(new SolrNetRegistry(solrServers))));
Assert.Throws<InvalidURLException>(() => new Container(c => c.IncludeRegistry(SolrNetRegistry.Create(solrServers))));
}

[Fact]
Expand Down Expand Up @@ -177,7 +177,7 @@ public void DictionaryDocument_and_multi_core()
Url = "http://localhost:8983/solr/entity2",
},
};
var container = new Container(c => c.IncludeRegistry(new SolrNetRegistry(cores)));
var container = new Container(c => c.IncludeRegistry(SolrNetRegistry.Create(cores)));
var solr1 = container.GetInstance<ISolrOperations<Entity>>();
var solr2 = container.GetInstance<ISolrOperations<Entity2>>();
var solrDict = container.GetInstance<ISolrOperations<Dictionary<string, object>>>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public StructureMapIntegrationFixture()
new SolrServer ("entity2","http://localhost:8983/solr/core0", "StructureMap.SolrNetIntegration.Tests.Entity2, StructureMap.SolrNetIntegration.Tests"),
new SolrServer ("entity3","http://localhost:8983/solr/core1", "StructureMap.SolrNetIntegration.Tests.Entity2, StructureMap.SolrNetIntegration.Tests")
};
Container = new Container(c => c.IncludeRegistry(new SolrNetRegistry(servers)));
Container = new Container(c => c.IncludeRegistry(SolrNetRegistry.Create(servers)));
}

[Fact]
Expand All @@ -48,7 +48,7 @@ public void DictionaryDocument()
}
};

Container.Configure(c => c.AddRegistry(new SolrNetRegistry(cores)));
Container.Configure(c => c.AddRegistry(SolrNetRegistry.Create(cores)));

var solr = Container.GetInstance<ISolrOperations<Dictionary<string, object>>>();
var results = solr.Query(SolrQuery.All);
Expand All @@ -72,7 +72,7 @@ public void DictionaryDocument_add()
}
};

Container.Configure(c=>c.AddRegistry(new SolrNetRegistry(cores)));
Container.Configure(c=>c.AddRegistry(SolrNetRegistry.Create(cores)));

var solr = Container.GetInstance<ISolrOperations<Dictionary<string, object>>>();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public StructureMapMultiCoreFixture()
s.Assembly(typeof(SolrConnection).Assembly);
s.WithDefaultConventions();
});
c.AddRegistry(new SolrNetRegistry(servers));
c.AddRegistry(SolrNetRegistry.Create(servers));
});

}
Expand Down
91 changes: 45 additions & 46 deletions StructureMap.SolrNetIntegration/SolrNetRegistry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,19 @@ namespace StructureMap.SolrNetIntegration
{
public class SolrNetRegistry : Registry
{
public SolrNetRegistry(IEnumerable<ISolrServer> solrServers)
// Constructor should not be used to create SolrNetRegistry as it's
private SolrNetRegistry()
{
}

public static SolrNetRegistry Create(IEnumerable<ISolrServer> solrServers)
{
var registry = new SolrNetRegistry();
registry.Initialize(solrServers);
return registry;
}

protected virtual void Initialize(IEnumerable<ISolrServer> solrServers)
{
For<IReadOnlyMappingManager>().Use<MemoizingMappingManager>()
.Ctor<IReadOnlyMappingManager>("mapper").Is(new AttributesMappingManager());
Expand All @@ -33,12 +45,10 @@ public SolrNetRegistry(IEnumerable<ISolrServer> solrServers)
RegisterValidationRules();
RegisterSerializers();
RegisterOperations();


AddCores(solrServers);
RegisterServers(solrServers);
}

private void RegisterValidationRules()
protected virtual void RegisterValidationRules()
{
var validationRules = new[] {
typeof(MappedPropertiesIsInSolrSchemaRule),
Expand All @@ -50,7 +60,7 @@ private void RegisterValidationRules()
For(typeof(IValidationRule)).Use(validationRule);
}

private void RegisterSerializers()
protected virtual void RegisterSerializers()
{
For(typeof(ISolrDocumentSerializer<>)).Use(typeof(SolrDocumentSerializer<>));
For(typeof(ISolrDocumentSerializer<Dictionary<string, object>>)).Use(typeof(SolrDictionarySerializer));
Expand All @@ -59,15 +69,15 @@ private void RegisterSerializers()
For<ISolrFacetQuerySerializer>().Use<DefaultFacetQuerySerializer>();
}

private void RegisterOperations()
public virtual void RegisterOperations()
{
For(typeof(ISolrBasicReadOnlyOperations<>)).Use(typeof(SolrBasicServer<>));
For(typeof(ISolrBasicOperations<>)).Use(typeof(SolrBasicServer<>));
For(typeof(ISolrReadOnlyOperations<>)).Use(typeof(SolrServer<>));
For(typeof(ISolrOperations<>)).Use(typeof(SolrServer<>));
}

private void RegisterParsers()
protected virtual void RegisterParsers()
{
For(typeof(ISolrDocumentResponseParser<>)).Use(typeof(SolrDocumentResponseParser<>));

Expand All @@ -90,69 +100,58 @@ private void RegisterParsers()
/// Registers a new core in the container.
/// This method is meant to be used after the facility initialization
/// </summary>
/// <param name="core"></param>
private void RegisterCore(SolrCore core)
protected virtual void RegisterCore(string id, Type documentType, string coreUrl)
{
var coreConnectionId = core.Id + typeof(SolrConnection);

For<ISolrConnection>().Add<SolrConnection>()
.Named(coreConnectionId)
.Ctor<string>("serverURL").Is(core.Url)
.Setter(c => c.Cache).IsTheDefault();
var coreConnectionId = id + typeof(SolrConnection);

var ISolrQueryExecuter = typeof(ISolrQueryExecuter<>).MakeGenericType(core.DocumentType);
var SolrQueryExecuter = typeof(SolrQueryExecuter<>).MakeGenericType(core.DocumentType);
For<ISolrConnection>().Use(() => new AutoSolrConnection(coreUrl))
.Named(coreConnectionId);

var ISolrQueryExecuter = typeof(ISolrQueryExecuter<>).MakeGenericType(documentType);
var SolrQueryExecuter = typeof(SolrQueryExecuter<>).MakeGenericType(documentType);

For(ISolrQueryExecuter).Add(SolrQueryExecuter).Named(core.Id + SolrQueryExecuter)
For(ISolrQueryExecuter).Add(SolrQueryExecuter).Named(id + SolrQueryExecuter)
.Ctor<ISolrConnection>("connection").IsNamedInstance(coreConnectionId);

var ISolrBasicOperations = typeof(ISolrBasicOperations<>).MakeGenericType(core.DocumentType);
var ISolrBasicReadOnlyOperations = typeof(ISolrBasicReadOnlyOperations<>).MakeGenericType(core.DocumentType);
var SolrBasicServer = typeof(SolrBasicServer<>).MakeGenericType(core.DocumentType);
var ISolrBasicOperations = typeof(ISolrBasicOperations<>).MakeGenericType(documentType);
var ISolrBasicReadOnlyOperations = typeof(ISolrBasicReadOnlyOperations<>).MakeGenericType(documentType);
var SolrBasicServer = typeof(SolrBasicServer<>).MakeGenericType(documentType);

For(ISolrBasicOperations).Add(SolrBasicServer).Named(core.Id + SolrBasicServer)
For(ISolrBasicOperations).Add(SolrBasicServer).Named(id + SolrBasicServer)
.Ctor<ISolrConnection>("connection").IsNamedInstance(coreConnectionId)
.Dependencies.Add("queryExecuter", new ReferencedInstance(core.Id + SolrQueryExecuter));
.Dependencies.Add("queryExecuter", new ReferencedInstance(id + SolrQueryExecuter));


For(ISolrBasicReadOnlyOperations).Add(SolrBasicServer).Named(core.Id + SolrBasicServer)
For(ISolrBasicReadOnlyOperations).Add(SolrBasicServer).Named(id + SolrBasicServer)
.Ctor<ISolrConnection>("connection").IsNamedInstance(coreConnectionId)
.Dependencies.Add("queryExecuter", new ReferencedInstance(core.Id + SolrQueryExecuter));
.Dependencies.Add("queryExecuter", new ReferencedInstance(id + SolrQueryExecuter));


var ISolrOperations = typeof(ISolrOperations<>).MakeGenericType(core.DocumentType);
var SolrServer = typeof(SolrServer<>).MakeGenericType(core.DocumentType);
For(ISolrOperations).Add(SolrServer).Named(core.Id)
.Dependencies.Add("basicServer", new ReferencedInstance(core.Id + SolrBasicServer));
var ISolrOperations = typeof(ISolrOperations<>).MakeGenericType(documentType);
var SolrServer = typeof(SolrServer<>).MakeGenericType(documentType);
For(ISolrOperations).Add(SolrServer).Named(id)
.Dependencies.Add("basicServer", new ReferencedInstance(id + SolrBasicServer));
}

private void AddCores(IEnumerable<ISolrServer> servers)
{
protected virtual void RegisterServers(IEnumerable<ISolrServer> servers)
{
foreach (var server in servers)
{
var solrCore = GetCoreFrom(server);
RegisterCore(solrCore);
RegisterCore(server.Id ?? Guid.NewGuid().ToString(), GetCoreDocumentType(server), GetCoreUrl(server));
}
}

private static SolrCore GetCoreFrom(ISolrServer server)
{
var id = server.Id ?? Guid.NewGuid().ToString();
var documentType = GetCoreDocumentType(server);
var coreUrl = GetCoreUrl(server);
UriValidator.ValidateHTTP(coreUrl);
return new SolrCore(id, documentType, coreUrl);
}

private static string GetCoreUrl(ISolrServer server)
protected virtual string GetCoreUrl(ISolrServer server)
{
var url = server.Url;
if (string.IsNullOrEmpty(url))
throw new StructureMapConfigurationException("Core url missing in SolrNet core configuration"); // ConfigurationErrorsException("Core url missing in SolrNet core configuration");
throw new StructureMapConfigurationException("Core url missing in SolrNet core configuration");

UriValidator.ValidateHTTP(url);
return url;
}

private static Type GetCoreDocumentType(ISolrServer server)
protected virtual Type GetCoreDocumentType(ISolrServer server)
{
var documentType = server.DocumentType;

Expand Down

0 comments on commit 11b8abb

Please sign in to comment.