All Downloads are FREE. Search and download functionalities are using the official Maven repository.

by.stub.database.thread.ConfigurationScanner Maven / Gradle / Ivy

package by.stub.database.thread;

import by.stub.cli.ANSITerminal;
import by.stub.database.DataStore;
import by.stub.utils.StringUtils;
import by.stub.yaml.YamlParser;
import by.stub.yaml.stubs.StubHttpLifecycle;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.List;

/**
 * @author Alexander Zagniotov
 * @since 11/6/12, 8:01 AM
 */
public final class ConfigurationScanner implements Runnable {

   private long lastModified;
   private final YamlParser yamlParser;
   private final DataStore dataStore;
   private static volatile boolean startFlag = true;

   public ConfigurationScanner(final YamlParser yamlParser, final DataStore dataStore) {
      this.yamlParser = yamlParser;
      this.dataStore = dataStore;
   }

   @Override
   public void run() {

      try {
         final String loadedConfigYamlPath = yamlParser.getLoadedConfigYamlPath();
         final File loadedConfig = new File(loadedConfigYamlPath);
         this.lastModified = loadedConfig.lastModified();

         while (startFlag) {

            Thread.sleep(3000);

            final long currentFileModified = loadedConfig.lastModified();
            if (this.lastModified >= currentFileModified) {
               continue;
            }

            try {
               this.lastModified = currentFileModified;
               final InputStream is = new FileInputStream(loadedConfigYamlPath);
               final Reader yamlReader = new InputStreamReader(is, StringUtils.utf8Charset());
               final List stubHttpLifecycles = yamlParser.parseAndLoad(yamlReader);

               dataStore.resetStubHttpLifecycles(stubHttpLifecycles);
               ANSITerminal.ok(String.format("%sSuccessfully performed live reload of YAML configuration from: %s%s",
                     "\n",
                     loadedConfigYamlPath,
                     "\n"));
            } catch (final Exception ex) {
               ANSITerminal.warn("Could not reload YAML configuration: " + ex.toString());
               ANSITerminal.error(String.format("%sFailed to perform live reload of YAML configuration from: %s%s",
                     "\n",
                     loadedConfigYamlPath,
                     "\n"));
            }
         }

      } catch (final Exception ex) {
         ANSITerminal.error("Could not perform live YAML scan: " + ex.toString());
      }
   }

   public void stopScanner(final boolean toStop) {
      synchronized (ConfigurationScanner.class) {
         startFlag = toStop;
      }
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy