text: package com.sandwich.koan.runner;
  
  import java.io.File;
  import java.io.IOException;
  import java.util.Map;
  
  import com.sandwich.koan.ApplicationSettings;
  import com.sandwich.koan.cmdline.CommandLineArgument;
  import com.sandwich.koan.cmdline.CommandLineArgumentBuilder;
  import com.sandwich.koan.cmdline.CommandLineArgumentRunner;
  import com.sandwich.koan.constant.ArgumentType;
  import com.sandwich.koan.util.ApplicationUtils;
  import com.sandwich.util.io.FileMonitor;
  import com.sandwich.util.io.FileMonitorFactory;
  import com.sandwich.util.io.KoanFileCompileAndRunListener;
  import com.sandwich.util.io.directories.DirectoryManager;
  
  public class AppLauncher {
  
      public static void main(final String... args) throws Throwable {
          Map<ArgumentType, CommandLineArgument> argsMap = new CommandLineArgumentBuilder(
                  args);
          if (argsMap.containsKey(ArgumentType.RUN_KOANS)) {
              if (ApplicationSettings.isInteractive()) {
                  new Thread(new Runnable() {
                      public void run() {
                          do {
                              try {
                                  char c = (char) System.in.read();
                                  char exitChar = ApplicationSettings.getExitChar();
                                  if (Character.toUpperCase(c) == Character.toUpperCase(exitChar)) {
                                      exit(0);
                                  }
                              } catch (IOException e) {
                                  throw new RuntimeException(e);
                              }
                          } while (true);
                      }
  
                  }).start();
                  FileMonitor monitor = FileMonitorFactory.getInstance(new File(
                          DirectoryManager.getProdMainDir()), new File(
                          DirectoryManager.getDataFile()));
                  if (ApplicationUtils.isFirstTimeAppHasBeenRun()) {
                      monitor.writeChanges();
                  }
                  monitor.addFileSavedListener(new KoanFileCompileAndRunListener(argsMap));
              }
          }
          new CommandLineArgumentRunner(argsMap).run();
          if (ApplicationSettings.isDebug()) {
              StringBuilder argsBuilder = new StringBuilder();
              int argNumber = 0;
              for (String arg : args) {
                  argsBuilder.append("Argument number "
                          + String.valueOf(++argNumber) + ": '" + arg + "'");
              }
              ApplicationUtils.getPresenter().displayMessage(
                      argsBuilder.toString());
          }
      }
  
      static void exit(int status) {
          FileMonitorFactory.closeAll();
          System.exit(status);
      }
  
  }
  