package detective.core.services; import groovyx.gpars.group.PGroup; import groovyx.gpars.group.DefaultPGroup; import groovyx.gpars.scheduler.DefaultPool; import groovyx.gpars.scheduler.ResizeablePool; import io.github.bonigarcia.wdm.ChromeDriverManager; import io.github.bonigarcia.wdm.InternetExplorerDriverManager; import io.github.bonigarcia.wdm.OperaDriverManager; import java.net.InetAddress; import java.util.Map; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.typesafe.config.Config; import com.typesafe.config.ConfigValue; import detective.common.httpclient.IdleConnectionMonitorThread; import detective.common.trace.TraceRecorder; import detective.common.trace.TraceRetriver; import detective.common.trace.impl.TraceRecorderElasticSearchImpl; import detective.common.trace.impl.TraceRetriverElasticSearchImpl; import detective.core.Parameters; import detective.core.config.DetectiveConfig; import detective.core.dsl.ParametersImpl; public enum DetectiveFactory { INSTANCE; private final Logger logger = LoggerFactory.getLogger(DetectiveFactory.class); private final String machineName; private final TraceRecorder recorder; private final TraceRetriver retriver; private final PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); private final IdleConnectionMonitorThread idleConnectionMonitorThread = new IdleConnectionMonitorThread(cm); private final CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build(); private final PGroup threadGroup; private final Parameters parametersConfig; private DetectiveFactory(){ if (getConfig().getBoolean("ElasticSearchServer.builtin")){ }else{ ElasticSearchClientFactory.setHostName(getConfig().getString("ElasticSearchServer.host")); ElasticSearchClientFactory.setPort(getConfig().getInt("ElasticSearchServer.port")); // ElasticSearchClientFactory.getTransportClient(); } this.machineName = this.getInstanceId(); recorder = new TraceRecorderElasticSearchImpl(); retriver = new TraceRetriverElasticSearchImpl(); int poolsize = getConfig().getInt("parallel.max_poolsize"); //threadGroup = new DefaultPGroup(new ResizeablePool(true, poolsize)); threadGroup = new DefaultPGroup(new DefaultPool(true, poolsize)); cm.setMaxTotal(getConfig().getInt("httpclient.max_connections")); cm.setDefaultMaxPerRoute(getConfig().getInt("httpclient.max_connections_pre_site")); idleConnectionMonitorThread.setName("idle-connection-monitor-thread"); idleConnectionMonitorThread.start(); parametersConfig = new ParametersImpl(); setupParameters(parametersConfig); parametersConfig.setImmutable(true); setupWebDriverBinaries(); } public Parameters getParametersConfig() { return parametersConfig; } private void setupWebDriverBinaries(){ if ("chrome".equals(getConfig().getString("browser.default_driver"))){ ChromeDriverManager.setup(); }else if ("ie".equals(getConfig().getString("browser.default_driver"))){ InternetExplorerDriverManager.setup(); } //OperaDriverManager.setup(); } private void setupParameters(Parameters parameters){ Config config = this.getConfig(); for (Map.Entry<String, ConfigValue> entry : config.entrySet()){ parameters.put(entry.getKey(), entry.getValue().unwrapped()); } } public void shutdown(){ try { threadGroup.shutdown(); } catch (Exception e) { logger.error("Error to shutdown running thread pools", e); } idleConnectionMonitorThread.shutdown(); try { cm.shutdown(); } catch (Exception e) { logger.error("Error to shutdown http client thread pools", e); } } public Config getConfig(){ return DetectiveConfig.getConfig(); } public String getMachineName(){ return machineName; } private String getInstanceId(){ try { String hostName = getHostNameFromSystemEnv(); if (hostName == null || hostName.length() == 0) hostName = InetAddress.getLocalHost().getHostAddress(); if (hostName == null || hostName.length() == 0) hostName = InetAddress.getLocalHost().getHostName(); return hostName; } catch (Exception e) { throw new RuntimeException("Can't read your host name, if you are in mac, please run sudo scutil –-set HostName yourname", e); } } private String getHostNameFromSystemEnv(){ if (System.getProperty("os.name").startsWith("Windows")) { // Windows will always set the 'COMPUTERNAME' variable return System.getenv("COMPUTERNAME"); } else { // If it is not Windows then it is most likely a Unix-like operating system // such as Solaris, AIX, HP-UX, Linux or MacOS. // Most modern shells (such as Bash or derivatives) sets the // HOSTNAME variable so lets try that first. return System.getenv("HOSTNAME"); } } public TraceRecorder getRecorder() { return recorder; } public TraceRetriver getRetriver() { return retriver; } public CloseableHttpClient getHttpClient() { return httpClient; } public PGroup getThreadGroup() { return threadGroup; } }