Refactor MockSolrLoggerServiceImpl to initialize FakeDatabaseReader before every method

This commit is contained in:
Tim Donohue
2018-12-15 03:33:03 +00:00
parent e0175bd198
commit 74aa295787

View File

@@ -8,21 +8,34 @@
package org.dspace.statistics;
import java.io.File;
import java.sql.SQLException;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.maxmind.geoip2.DatabaseReader;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dspace.content.DSpaceObject;
import org.dspace.eperson.EPerson;
import org.dspace.services.ConfigurationService;
import org.dspace.solr.MockSolrServer;
import org.dspace.usage.UsageWorkflowEvent;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* Mock service that uses an embedded SOLR server for the statistics core.
*/
@Service
public class MockSolrLoggerServiceImpl
extends SolrLoggerServiceImpl
implements InitializingBean, DisposableBean {
private static final Logger log = LogManager.getLogger();
private MockSolrServer mockSolrServer;
@Autowired(required = true)
@@ -33,15 +46,44 @@ public class MockSolrLoggerServiceImpl
@Override
public void afterPropertiesSet() throws Exception {
// Initialize our service with a Mock Solr statistics core
mockSolrServer = new MockSolrServer("statistics");
solr = mockSolrServer.getSolrServer();
}
new FakeDatabaseReader(); // Activate fake
new FakeDatabaseReader.Builder(); // Activate fake
String locationDbPath = configurationService.getProperty("usage-statistics.dbfile");
File locationDb = new File(locationDbPath);
locationDb.createNewFile();
locationService = new DatabaseReader.Builder(locationDb).build();
@Override
public void postView(DSpaceObject dspaceObject, HttpServletRequest request,
EPerson currentUser) {
// Load our FakeDatabaseReader before each view event is logged
loadFakeDatabaseReader();
// Call overridden method
super.postView(dspaceObject, request, currentUser);
}
@Override
public void postView(DSpaceObject dspaceObject,
String ip, String userAgent, String xforwardedfor, EPerson currentUser) {
// Load our FakeDatabaseReader before each view event is logged
loadFakeDatabaseReader();
// Call overridden method
super.postView(dspaceObject, ip, userAgent, xforwardedfor, currentUser);
}
@Override
public void postSearch(DSpaceObject resultObject, HttpServletRequest request, EPerson currentUser,
List<String> queries, int rpp, String sortBy, String order, int page, DSpaceObject scope) {
// Load our FakeDatabaseReader before each search event is logged
loadFakeDatabaseReader();
// Call overridden method
super.postSearch(resultObject, request, currentUser, queries, rpp, sortBy, order, page, scope);
}
@Override
public void postWorkflow(UsageWorkflowEvent usageWorkflowEvent) throws SQLException {
// Load our FakeDatabaseReader before each workflow event is logged
loadFakeDatabaseReader();
// Call overridden method
super.postWorkflow(usageWorkflowEvent);
}
@Override
@@ -49,4 +91,22 @@ public class MockSolrLoggerServiceImpl
mockSolrServer.destroy();
}
/**
* Load / activate our FakeDatabaseReader which uses JMockit to replace specific
* methods of the DatabaseReader. This MUST be called for each method that uses
* DatabaseReader as JMockit fake classes are only in effect for tests in which
* they are defined: http://jmockit.github.io/tutorial/Faking.html
*/
private void loadFakeDatabaseReader() {
try {
new FakeDatabaseReader(); // Activate fake
new FakeDatabaseReader.Builder(); // Activate fake
String locationDbPath = configurationService.getProperty("usage-statistics.dbfile");
File locationDb = new File(locationDbPath);
locationDb.createNewFile();
locationService = new DatabaseReader.Builder(locationDb).build();
} catch (Exception e) {
log.error("Unable to load FakeDatabaseReader", e);
}
}
}