Пишем движок для конфигов на LiketEngine

от
Java    config

Это моя первая, поэтому не ругайте сильно.
Не люблю тянуть время, так что начнем.
Движок будем называть CommandShell.
Для начала определимся с командами, которые будем использовать на движке, эти:
1. echo
2. run
3. exec
4. stop
5. exit
Пока 5 команд хватит.
Создадим библиотеку команд, т.е. класс в котором будет хранится список команд.
Создаем класс например CommandShellLibrary и наследуем его от liket.engine.Library.
  1. package shell.engine;
  2.  
  3. import liket.engine.*;
  4. import liket.engine.work.*;
  5.  
  6. public class CommandShellLibrary extends Library
  7. {
  8.     public CommandShellLibrary(WorkListener workListener)
  9.     {
  10.         super(workListener);
  11.         int id = 0;
  12.         commands = new String[5];
  13.  
  14.         commands[id++] = "echo";
  15.         commands[id++] = "run";
  16.         commands[id++] = "exec";
  17.         commands[id++] = "stop";
  18.         commands[id++] = "exit";
  19.  
  20.     }
  21. }
теперь разберемся с некоторыми вещами.
1. WorkListener этот интерфейс реализует класс в котором будут выполнятся команды и уведомлятся об ошибках. Класс должен реализовать методы action(Work sender, int ID, String[] arguments) и error(Work sender, String msg).
2. commands это массив строк в котором будет хранится список команд. У нас 5 команды и массив будет размером 5.
3. дальше присваиваем массиву названия команд.
Теперь беремся за движок.
Создаем класс CommandShell, этот класс будет основной точкой запуска файлов.
Наследуем его от класса liket.engine.Engine и реализуем абстрактные методы.
Класс Engine реализует методы интерфейса WorkListener, это было сделано для удобства, т.к. запускать файлы отсюда легче.
  1. package shell.engine;
  2.  
  3. import liket.engine.*;
  4. import liket.engine.work.*;
  5.  
  6. public class CommandShell extends Engine
  7. {
  8.     @Override
  9.     public void action(Work sender, int ID, String[] arguments)
  10.     {
  11.     }
  12.  
  13.     @Override
  14.     public void error(Work sender, String msg)
  15.     {
  16.     }
  17. }
в метод action будут передоваться
1. ссылка на объект в котором происходит парсинг файла (объект класса Work).
2. Порядковый номер команды, например номер команды run - 1.
3. Аргументы команды
в метод error будут передоваться
1. ссылка на объект класса Work
2. сообщение исключения
если не реализовать данный метод в текущем классе тогда при ошибке будет вызван метод супер класса который приостановит выполнение файла и выводит сообщение в консоль.
Теперь добавим в самое начало класса следующие строки
  1. public CommandShellLibrary lib;
  2. public CommandShell()
  3. {
  4.     init();
  5.     lib = new CommandShellLibrary(this);
  6. }
init() - инициализирует объекты движка
Так как CommandShell наследует от Engine а он реализует интерфейс WorkListener, мы в полне можем передовать данный класс в качестве WorkListener.
При запуске файла с CommandShell в action будут передоваться номер и аргументы команды, но ничего не происходит т.к. action пуст, напишем в него что нибудь
  1. @Override
  2. public void action(Work sender, int ID, String[] arguments)
  3. {
  4.     switch(ID)
  5.     {
  6.         //echo
  7.         case 0:
  8.         {
  9.             System.out.println(arguments[0]);
  10.             break;
  11.         }
  12.         //run
  13.         case 1:
  14.         {
  15.             sender.execute(Text.splitOutQuote(arguments[0], ';', '\"'));
  16.             break;
  17.         }
  18.         //exec
  19.         case 2:
  20.         {
  21.             String data = Application.loadSource(arguments[0]);
  22.             if (data == null)
  23.                 System.out.println("failed to load " + arguments[0]);
  24.             else
  25.                 exec(data);
  26.             break;
  27.         }
  28.         //stop
  29.         case 3:
  30.         {
  31.             sender.stop();
  32.             break;
  33.         }
  34.         exit
  35.         case 4:
  36.         {
  37.             System.exit(0);
  38.             break;
  39.         }
  40.     }
  41. }
напишем класс с main(String[] args)
  1. package shell.engine;
  2.  
  3. public class Application
  4. {
  5.     public static void main(String[] args)
  6.     {
  7.         CommandShell shell = new CommandShell();
  8.         shell.exec(loadSource("D:/simple.cfg"));
  9.     }
  10.     public static String loadSource(String source)
  11.     {
  12.         try
  13.         {
  14.             byte[] b;
  15.             try (FileInputStream fis = new FileInputStream(source))
  16.             {
  17.                 b = new byte[fis.available()];
  18.                 fis.read(b);
  19.                 fis.close();
  20.             }
  21.              return new String(b);
  22.         } catch (IOException ex)
  23.         {
  24.         }
  25.         return null;
  26.     }
  27. }
LiketEngine.zip
  • +5
  • views 4407