package uk.ac.shef.dcs.jate.app;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.core.CoreContainer;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import uk.ac.shef.dcs.jate.JATEException;
import uk.ac.shef.dcs.jate.JATEProperties;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
* Abstracted class to support embedded solr based unit test
* <p>
* for more examples about how to use solr Embedded Solr server,
*
* @see <a href="http://www.programcreek.com/java-api-examples/index.php?api=org.apache.solr.client.solrj.embedded.EmbeddedSolrServer">
* Java Code Examples for org.apache.solr.client.solrj.embedded.EmbeddedSolrServer</a>
* @see <a href="https://wiki.searchtechnologies.com/index.php/Unit_Testing_with_Embedded_Solr">
* Unit Testing with Embedded Solr</a>
*/
public abstract class BaseEmbeddedSolrTest {
private static Logger LOG = Logger.getLogger(BaseEmbeddedSolrTest.class.getName());
static String workingDir = System.getProperty("user.dir");
static Path solrHome = Paths.get(workingDir, "testdata", "solr-testbed");
static Path REF_FREQ_FILE = Paths.get(workingDir, "testdata", "solr-testbed", "GENIA",
"conf", "bnc_unifrqs.normal");
EmbeddedSolrServer server;
protected String solrCoreName;
protected boolean reindex;
protected abstract void setSolrCoreName();
protected abstract void setReindex();
//@Before
public void setup() throws Exception {
setSolrCoreName();
setReindex();
// if(reindex)
// cleanIndexDirectory(solrHome.toString(), solrCoreName);
CoreContainer testBedContainer = new CoreContainer(solrHome.toString());
testBedContainer.load();
server = new EmbeddedSolrServer(testBedContainer, solrCoreName);
}
/**
* create and add new document with necessary fields
* see also @code{uk.ac.shef.dcs.jate.indexing.IndexingHandler}
*
* @param docId, document id value for default solr field 'id'
* @param docTitle, document title for default solr field 'title_s'
* @param text, document content for default solr field 'text' where term will be extracted
* @param jateProperties, JATE properties for various run-time parameters
* @param commit, boolean value to determine whether the new document will be committed
* @throws IOException
* @throws SolrServerException
* @throws JATEException
*/
protected void addNewDoc(String docId, String docTitle, String text, JATEProperties jateProperties, boolean commit)
throws IOException, SolrServerException, JATEException {
SolrInputDocument newDoc = new SolrInputDocument();
newDoc.addField("id", docId);
newDoc.addField("title_s", docTitle);
newDoc.addField("text", text);
newDoc.addField(jateProperties.getSolrFieldNameJATENGramInfo(), text);
newDoc.addField(jateProperties.getSolrFieldNameJATECTerms(), text);
server.add(newDoc);
if (commit) {
server.commit();
}
}
public static void cleanIndexDirectory(String solrHome, String coreName) throws IOException {
// File indexDir = new File(solrHome + File.separator + coreName + File.separator +
// "data" + File.separator + "index" + File.separator);
File indexDir = Paths.get(solrHome, coreName, "data").toFile();
try {
if (indexDir.exists()) {
FileUtils.cleanDirectory(indexDir);
}
} catch (IOException e) {
LOG.error("Failed to clean index directory! Please do it manually!");
throw e;
}
}
@After
public void tearDown() throws IOException {
if (server != null && server.getCoreContainer() != null) {
LOG.info("shutting down core in :" + server.getCoreContainer().getCoreRootDirectory());
try {
server.getCoreContainer().getCore(solrCoreName).close();
server.getCoreContainer().shutdown();
server.close();
unlock();
// cleanIndexDirectory(solrHome.toString(), solrCoreName);
} catch (IOException e) {
e.printStackTrace();
}
} else {
LOG.error("embedded server or core is not created and loaded successfully.");
}
}
protected void unlock() {
File lock = Paths.get(solrHome.toString(), solrCoreName, "data", "index", "write.lock").toFile();
if (lock.exists()) {
System.err.println("solr did not shut down cleanly");
Assert.assertTrue(lock.delete());
}
}
@AfterClass
public static void tearDownClass() throws JATEException {
// try {
// cleanIndexDirectory(solrHome.toString(), solrCoreName);
// } catch (IOException ioe) {
// throw new JATEException("Unable to delete index data. Please clean index directory " +
// "[testdata\\solr-testbed\\testCore\\data] manually!");
// }
}
}