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

от
Java   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   6   1
607
Похожие статьи
План для создания программ для андроид
3D для Mobile Basic [часть 2]
3D для Mobile Basic

  © aNNiMON (Melnik Software)
Онлайн: 33 (3/30)
 
Яндекс.Метрика