Сводка
Я хочу извлечь из группы классов все вызовы метода с именем "send" и литеральным значением его единственного параметра. Это можно сделать до / после компиляциивремя, с помощью инструментов gradle и / или командной строки.
Вот пример кода такого класса состояний:
public enum Events {
EventA,
EventB,
EventC,
//...
};
public class StateX extends BaseState {
//...
@Override
public void executeState() {
//...
if (isValid()) {
...
send(EventA); // <-- extract "StateX,EventA" to csv file
return;
}
// ...
switch (hardwareType) {
case HardwareA:
send(EventB); // <-- extract "StateX,EventB" to csv file
//...
}
private void search(...) {
//...
send(EventC); // <-- extract "StateX,EventC" to csv file
//...
//...
/*
send(EventD); // <-- DO NOT extract anything!
*/
}
}
Результатом должен быть, например, CSV-файл, подобный этому:
...
StateW, ...
StateX,EventA
StateX,EventB
StateX,EventC
StateY,...
...
Как мне этого добиться?
Справочная информация
Мне нужно реализовать (несколько) конечных автоматов, состоящих из состояний, событий и их переходов (переход определяет начальное состояние,событие и конечное состояние).Эта конфигурация всегда статична.
Каждый конечный автомат будет развиваться до тех пор, пока он, наконец, не будет готов и работает.Эволюция также обусловлена недостатками, например, в используемом программном обеспечении сторонних производителей.
Я хочу убедиться, что я настроил каждый конечный автомат последовательно, прежде чем тестировать его (отнимает много времени) на телефоне Android с большим количеством (разных версий).из) Android, аппаратное обеспечение и стороннее программное обеспечение, связанные методы.И некоторые из переходов выполняются редко.
Преимущество использования конечного автомата состоит в том, что некоторые состояния могут быть повторно использованы с небольшими изменениями для других версий Android / аппаратного обеспечения и стороннего программного обеспечения.
У меня уже есть код для проверки конфигурации:
- бесхозных состояний
- переходов, заканчивающихся тупиком
- неиспользуемых состояний и событий (предупреждение)
Но в каждом коде состояния классов метод называется "отправка (событие)" , чтобы инициировать переход в другое состояние.Событие всегда является постоянным значением (enum value).Я хочу, чтобы вычеркнуть эти 1 ... n вызовов со значением события этого метода , например, в текстовый файл CSV .
С таким файлом CSV Iможет проверить, что конфигурация конечного автомата состоит, например, из перехода состояния X с событием A в состояние Y, когда код состояния X где-то вызывает метод «send (eventA)».И наоборот.
В настоящее время я легко могу создать текстовый файл, содержащий конфигурацию конечного автомата, например, с помощью «модульного теста».Или я могу выполнить вышеупомянутые проверки согласованности с помощью модульного теста.
Я пока не получил хорошей идеи, как это сделать.Пока у меня есть 3 подхода:
- использовать интерпретатор языка Java - но какой?- генерировать некоторые выходные данные всех закодированных «send (event *)» для каждого состояния.А затем используйте эти выходные данные для сравнения с определением состояния, например, в «модульном тесте».
- Вместо использования интерпретатора языка Java используйте AOP - если бы я мог включить ведение журнала, где joinpoints («send (event *)) ") вызываются в каком состоянии - со значением параметра.
- собственный разборчивый парсер java-кода, чего я хотел бы избежать.Или есть простой инструмент командной строки, который я могу правильно переформатировать в Java-класс для более надежного анализа?
Другие идеи?