Пишем движок для конфигов на LiketEngine
от Aladdin
Это моя первая, поэтому не ругайте сильно.
Не люблю тянуть время, так что начнем.
Движок будем называть CommandShell.
Для начала определимся с командами, которые будем использовать на движке, эти:
1. echo
2. run
3. exec
4. stop
5. exit
Пока 5 команд хватит.
Создадим библиотеку команд, т.е. класс в котором будет хранится список команд.
Создаем класс например CommandShellLibrary и наследуем его от liket.engine.Library.
теперь разберемся с некоторыми вещами.
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, это было сделано для удобства, т.к. запускать файлы отсюда легче.
в метод action будут передоваться
1. ссылка на объект в котором происходит парсинг файла (объект класса Work).
2. Порядковый номер команды, например номер команды run - 1.
3. Аргументы команды
в метод error будут передоваться
1. ссылка на объект класса Work
2. сообщение исключения
если не реализовать данный метод в текущем классе тогда при ошибке будет вызван метод супер класса который приостановит выполнение файла и выводит сообщение в консоль.
Теперь добавим в самое начало класса следующие строки
init() - инициализирует объекты движка
Так как CommandShell наследует от Engine а он реализует интерфейс WorkListener, мы в полне можем передовать данный класс в качестве WorkListener.
При запуске файла с CommandShell в action будут передоваться номер и аргументы команды, но ничего не происходит т.к. action пуст, напишем в него что нибудь
напишем класс с main(String[] args)
LiketEngine.zip
Не люблю тянуть время, так что начнем.
Движок будем называть CommandShell.
Для начала определимся с командами, которые будем использовать на движке, эти:
1. echo
2. run
3. exec
4. stop
5. exit
Пока 5 команд хватит.
Создадим библиотеку команд, т.е. класс в котором будет хранится список команд.
Создаем класс например CommandShellLibrary и наследуем его от liket.engine.Library.
- package shell.engine;
- import liket.engine.*;
- import liket.engine.work.*;
- public class CommandShellLibrary extends Library
- {
- public CommandShellLibrary(WorkListener workListener)
- {
- super(workListener);
- int id = 0;
- commands = new String[5];
- commands[id++] = "echo";
- commands[id++] = "run";
- commands[id++] = "exec";
- commands[id++] = "stop";
- commands[id++] = "exit";
- }
- }
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, это было сделано для удобства, т.к. запускать файлы отсюда легче.
- package shell.engine;
- import liket.engine.*;
- import liket.engine.work.*;
- public class CommandShell extends Engine
- {
- @Override
- public void action(Work sender, int ID, String[] arguments)
- {
- }
- @Override
- public void error(Work sender, String msg)
- {
- }
- }
1. ссылка на объект в котором происходит парсинг файла (объект класса Work).
2. Порядковый номер команды, например номер команды run - 1.
3. Аргументы команды
в метод error будут передоваться
1. ссылка на объект класса Work
2. сообщение исключения
если не реализовать данный метод в текущем классе тогда при ошибке будет вызван метод супер класса который приостановит выполнение файла и выводит сообщение в консоль.
Теперь добавим в самое начало класса следующие строки
- public CommandShellLibrary lib;
- public CommandShell()
- {
- init();
- lib = new CommandShellLibrary(this);
- }
Так как CommandShell наследует от Engine а он реализует интерфейс WorkListener, мы в полне можем передовать данный класс в качестве WorkListener.
При запуске файла с CommandShell в action будут передоваться номер и аргументы команды, но ничего не происходит т.к. action пуст, напишем в него что нибудь
- @Override
- public void action(Work sender, int ID, String[] arguments)
- {
- switch(ID)
- {
- //echo
- case 0:
- {
- System.out.println(arguments[0]);
- break;
- }
- //run
- case 1:
- {
- sender.execute(Text.splitOutQuote(arguments[0], ';', '\"'));
- break;
- }
- //exec
- case 2:
- {
- String data = Application.loadSource(arguments[0]);
- if (data == null)
- System.out.println("failed to load " + arguments[0]);
- else
- exec(data);
- break;
- }
- //stop
- case 3:
- {
- sender.stop();
- break;
- }
- exit
- case 4:
- {
- System.exit(0);
- break;
- }
- }
- }
- package shell.engine;
- public class Application
- {
- public static void main(String[] args)
- {
- CommandShell shell = new CommandShell();
- shell.exec(loadSource("D:/simple.cfg"));
- }
- public static String loadSource(String source)
- {
- try
- {
- byte[] b;
- try (FileInputStream fis = new FileInputStream(source))
- {
- b = new byte[fis.available()];
- fis.read(b);
- fis.close();
- }
- return new String(b);
- } catch (IOException ex)
- {
- }
- return null;
- }
- }