package org.qi4j.index.solr; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer; import org.apache.solr.core.CoreContainer; import org.apache.solr.core.SolrConfig; import org.apache.solr.core.SolrCore; import org.qi4j.api.injection.scope.Service; import org.qi4j.api.injection.scope.Uses; import org.qi4j.api.mixin.Mixins; import org.qi4j.api.service.Activatable; import org.qi4j.api.service.ServiceComposite; import org.qi4j.library.fileconfig.FileConfiguration; import org.qi4j.spi.service.ServiceDescriptor; import java.io.File; import java.lang.reflect.Field; @Mixins(EmbeddedSolrService.EmbeddedSolrServiceMixin.class) public interface EmbeddedSolrService extends Activatable, ServiceComposite { public SolrServer getSolrServer(); public SolrCore getSolrCore(); abstract class EmbeddedSolrServiceMixin implements Activatable,EmbeddedSolrService { @Service FileConfiguration fileConfig; public CoreContainer coreContainer; public EmbeddedSolrServer server; @Uses ServiceDescriptor descriptor; private SolrCore core; public void activate() throws Exception { ClassLoader oldCl = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader( getClass().getClassLoader() ); try { File directory = new File( fileConfig.dataDirectory(), descriptor.identity() ); directory.mkdir(); System.setProperty( "solr.solr.home", directory.getAbsolutePath() ); CoreContainer.Initializer initializer = new CoreContainer.Initializer(); coreContainer = initializer.initialize(); server = new EmbeddedSolrServer( coreContainer, "" ); core = coreContainer.getCore( "" ); } finally { Thread.currentThread().setContextClassLoader( oldCl ); } } public void passivate() throws Exception { core.closeSearcher(); coreContainer.shutdown(); // Clear instance fields for GC purposes Field instanceField = SolrCore.class.getDeclaredField( "instance" ); instanceField.setAccessible( true ); instanceField.set( null, null ); SolrConfig.config = null; } public SolrServer getSolrServer() { return server; } public SolrCore getSolrCore() { return core; } } }