package com.plugtree.solrmeter.runMode;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.name.Names;
import com.plugtree.solrmeter.controller.StatisticType;
import com.plugtree.solrmeter.model.*;
import com.plugtree.solrmeter.controller.StatisticsRepository;
import com.plugtree.solrmeter.controller.StatisticDescriptor;
import com.plugtree.solrmeter.view.*;
import com.plugtree.stressTestScope.StressTestRegistry;
import org.apache.log4j.Logger;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class SolrMeterRunModeHeadless extends AbstractSolrMeterRunMode {
private HeadlessConsoleFrame frame;
private final int INITIAL_START_DELAY = 2000;
public static final String RUN_MODE_NAME = "headless";
private void addStatistics() {
QueryExecutor queryExecutor = injector.getInstance(QueryExecutor.class);
UpdateExecutor updateExecutor = injector.getInstance(UpdateExecutor.class);
OptimizeExecutor optimizeExecutor = injector.getInstance(OptimizeExecutor.class);
StatisticsRepository repository = injector.getInstance(StatisticsRepository.class);
HeadlessStatisticsContainer headlessStatisticsContainer = frame.getStatistics();
for(StatisticDescriptor stat:repository.getActiveStatistics()) {
Logger.getLogger("boot").info("Adding Statistic " + stat.getName());
if(stat.isHasView()) {
addStatistic(headlessStatisticsContainer, injector, stat.getHeadlessViewName());
}
if(stat.getTypes().contains(StatisticType.QUERY)) {
addStatistic(queryExecutor, injector, stat.getModelName());
}
if(stat.getTypes().contains(StatisticType.UPDATE)) {
addStatistic(updateExecutor, injector, stat.getModelName());
}
if(stat.getTypes().contains(StatisticType.OPTIMIZE)) {
addStatistic(optimizeExecutor, injector, stat.getModelName());
}
}
}
private void addStatistic(OptimizeExecutor optimizeExecutor,
Injector injector, String modelName) {
Key<OptimizeStatistic> injectorKey = Key.get(OptimizeStatistic.class, Names.named(modelName));
optimizeExecutor.addStatistic(injector.getInstance(injectorKey));
}
private void addStatistic(UpdateExecutor updateExecutor,
Injector injector, String modelName) {
Key<UpdateStatistic> injectorKey = Key.get(UpdateStatistic.class, Names.named(modelName));
updateExecutor.addStatistic(injector.getInstance(injectorKey));
}
private void addStatistic(QueryExecutor queryExecutor, Injector injector,
String modelName) {
Key<QueryStatistic> injectorKey = Key.get(QueryStatistic.class, Names.named(modelName));
queryExecutor.addStatistic(injector.getInstance(injectorKey));
}
private void addStatistic(HeadlessStatisticsContainer headlessStatisticsContainer,
Injector injector, String headlessViewName) {
Key<HeadlessStatisticPanel> injectorKey = Key.get(HeadlessStatisticPanel.class, Names.named(headlessViewName));
headlessStatisticsContainer.addStatistic(injector.getInstance(injectorKey));
}
private void scheduleOperations() {
wait(INITIAL_START_DELAY);
for (HeadlessConsolePanel panel:frame.getConsolePanels()){
panel.scheduleOperations();
}
startMonitoring();
}
private void startMonitoring() {
new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
boolean allDone = true;
for (HeadlessConsolePanel panel : frame.getConsolePanels()) {
if (!panel.operationsComplete()) {
allDone = false;
}
}
if (allDone) {
System.exit(0);
}
}
}, 10, 2, TimeUnit.SECONDS);
}
private void wait(int delay) {
try {
Thread.sleep(delay);
}
catch(InterruptedException e) {
throw new RuntimeException(e);
}
}
public void main(Injector injector) {
super.main(injector);
StressTestRegistry.start();
frame = injector.getInstance(HeadlessConsoleFrame.class);
addStatistics();
scheduleOperations();
}
public void restartApplication() {}
public ConsoleFrame getMainFrame() {
return null;
}
}