В drools, java, как автоматически вносить изменения в код, когда в таблице решений вносятся изменения? - PullRequest
0 голосов
/ 05 апреля 2019

Как автоматически изменить код с изменениями, внесенными в таблицу решений? Поскольку для всех условий требуются отдельные методы получения и установки, как автоматизировать код?

package com.sample;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.DecisionTableConfiguration;
import org.drools.builder.DecisionTableInputType;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.Resource;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
 * This is a sample class to launch a rule.
 */
public class DroolsTest 
    {

    public static final void main(String[] args) {
        try {
            // load up the knowledge base
            KnowledgeBase kbase = readKnowledgeBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
            // go !
            System.out.println("Please enter the jewellery name: ");
            BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
            String name=reader.readLine();
            Jewellery jewel = new Jewellery();
            jewel.setType(name);
            ksession.insert(jewel);
            ksession.fireAllRules();
            System.out.println("The discount for "+name+" is "+jewel.getDiscount());
            logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private static KnowledgeBase readKnowledgeBase() throws Exception {
        DecisionTableConfiguration dtable=KnowledgeBuilderFactory.newDecisionTableConfiguration();
        dtable.setInputType(DecisionTableInputType.XLS);
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        Resource xlsrs=ResourceFactory.newClassPathResource("hello.xls");
        kbuilder.add(xlsrs,ResourceType.DTABLE,dtable);
        KnowledgeBuilderErrors errors = kbuilder.getErrors();
        if (errors.size() > 0) {
            for (KnowledgeBuilderError error: errors) {
                System.err.println(error);
            }
            throw new IllegalArgumentException("Could not parse knowledge.");
        }
        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
        return kbase;
    }




}

Существует отдельный класс украшений, который имеет только одно условие и действие. Как увеличить эти условия и действия без изменения кода.

package com.sample;

public class Jewellery 
{
    private String type;

    private int discount;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public int getDiscount() {
        return discount;
    }

    public void setDiscount(int discount) {
        this.discount = discount;
    }
}
...