Можно ли поддерживать метаданные Drools для типов фактов при компиляции DRL в Java во время сборки? - PullRequest
0 голосов
/ 28 февраля 2019

При использовании опции generateModel=YES для компиляции DRL в Java на этапе компиляции maven метаданные в объявлениях типов не поддерживаются.Я воспроизвел это в простом примере, изложенном ниже.Есть ли какая-то дополнительная конфигурация, необходимая для поддержания и воспроизведения метаданных в определениях классов Java?

Настройка для примера приведена ниже:

У меня есть простой проект Drools & mavenс одним файлом DRL и классом Java с методом main (), который просто загружает контейнер пути к классу и печатает его содержимое.

При сборке и запуске без плагина drools-model-compiler или без указанияСвойство generateModel метаданные правильно считываются из типов фактов DRL.Выходные данные дают следующее содержимое контейнера:

Base: all
  Session: all.stateful
  Package: ollij93
    Rule: AimplB
    FactType: ollij93.FactA
        MetaData: myMetaData = VALUEA
    FactType: ollij93.FactB
        MetaData: myMetaData = VALUEB

Однако при построении с указанием -DgenerateModel=YES, указанным в сборке, выходные данные показывают, что getMetaData () возвращает нуль:

Base: all
  Session: all.stateful
  Package: ollij93
    Rule: AimplB
    FactType: ollij93.FactA
        No MetaData
    FactType: ollij93.FactB
        No MetaData

Источник для приведенных выше примеров приведен ниже:

rules.drl:

package ollij93;

declare FactA
  @myMetaData(VALUEA)
end

declare FactB
  @myMetaData(VALUEB)
  a : FactA @key
end

rule AimplB
  when $a : FactA()
  then
    kcontext.insertLogical(new FactB($a));
end

Run.java:

package ollij93;

import java.util.Map;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.definition.KiePackage;
import org.kie.api.definition.rule.Rule;
import org.kie.api.definition.type.FactType;
import org.kie.api.runtime.KieContainer;

public class Run {

    public static void main(String[] args) {
        KieServices kServices = KieServices.Factory.get();

        KieContainer kContainer = kServices.getKieClasspathContainer();

        for (String baseName : kContainer.getKieBaseNames()) {
            System.out.println("Base: " + baseName);
            KieBase kbase = kContainer.getKieBase(baseName);
            for (String sessionName : kContainer.getKieSessionNamesInKieBase(baseName)) {
                System.out.println("  Session: " + sessionName);
            }
            for (KiePackage p : kbase.getKiePackages()) {
                System.out.println("  Package: " + p.getName());

                for (Rule r : p.getRules()) {
                    System.out.println("    Rule: " + r.getName());
                }

                for (FactType f : p.getFactTypes()) {
                    System.out.println("    FactType: " + f.getName());
                    Map<String, Object> mData = f.getMetaData();
                    if (mData == null) {
                        System.out.println("        No MetaData");
                    } else {
                        for (String key : mData.keySet()) {
                            System.out.println("        MetaData: " + key + " = " + mData.get(key));
                        }
                    }
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...