Извлечь все вызовы метода с его параметром fix из группы классов - с помощью интерпретатора языка Java, AOP? - PullRequest
0 голосов
/ 08 февраля 2019

Сводка

Я хочу извлечь из группы классов все вызовы метода с именем "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-класс для более надежного анализа?

Другие идеи?

...