2016-06-16 9 views
0

Как вы можете видеть, все правила могут быть перечислены в проспекте проекта, мне интересно, что в инструменте Drools для этого есть такой API Rest, но я просмотрел документ онлайн-документа , такого API нет. любое предложение по этому поводу? заранее спасибо. https://docs.jboss.org/drools/release/latest/drools-docs/html/ch20.html#d0e22619Есть ли какой-либо REST API для извлечения всех правил из репозитория в Drools

С наилучшими пожеланиями Yuhua

+0

Я ищу аналогичную функциональность. Просто хотел проверить, удалось ли вам получить информацию об этом. – DBS

ответ

1

Насколько я знаю, нет REST API, чтобы сделать это (по крайней мере публично). Один из вариантов заключается в том, чтобы использовать git для получения этой информации из инструментария.

Хранение верстака основано на git. Каждый репозиторий в рабочем месте фактически является репозиторием git. Рабочее место позволяет вам clone those repositories и делать с ними все, что вам нужно, так же как и с любым другим git-репо.

Внутри каждого репозитория git вы найдете нулевые или более проекты maven. Действительно, каждый из проектов, которые вы видите в верстаке, является настоящим проектом maven. Различные ресурсы в ваших проектах (правила drl, управляемые правила, таблица решений и т. Д.) Будут доступны в каталоге resources соответствующего проекта.

Надеется, что это помогает,

0

Как уже упоминался Esteban Aliverti, нет готового к использованию API для достижения этой цели. Однако мы можем написать пользовательское расширение для KIE Server для извлечения всех установленных правил.

Подробное разъяснение here.

У меня есть аналогичный прецедент в моем приложении и выполнил следующую реализацию для получения правил.

CusomtDroolsKieServerApplicationComponentsService

public class CusomtDroolsKieServerApplicationComponentsService implements KieServerApplicationComponentsService { 

private static final String OWNER_EXTENSION = "Drools"; 

public Collection<Object> getAppComponents(String extension, SupportedTransports type, Object... services) { 
    // skip calls from other than owning extension 
    if (!OWNER_EXTENSION.equals(extension)) { 
     return Collections.emptyList(); 
    } 

    RulesExecutionService rulesExecutionService = null; 
    KieServerRegistry context = null; 

    for (Object object : services) { 
     if (RulesExecutionService.class.isAssignableFrom(object.getClass())) { 
      rulesExecutionService = (RulesExecutionService) object; 
      continue; 
     } else if (KieServerRegistry.class.isAssignableFrom(object.getClass())) { 
      context = (KieServerRegistry) object; 
      continue; 
     } 
    } 

    List<Object> components = new ArrayList<Object>(1); 
    if (SupportedTransports.REST.equals(type)) { 
     components.add(new RuleRESTService(rulesExecutionService, context)); 
    } 

    return components; 
} 

RuleRestService

@Path("server/containers/instances/{id}/ksession") 
public class RuleRESTService { 

private RulesExecutionService rulesExecutionService; 
private KieServerRegistry registry; 

public RuleRESTService() { 

} 

public RuleRESTService(RulesExecutionService rulesExecutionService, KieServerRegistry registry) { 
    this.rulesExecutionService = rulesExecutionService; 
    this.registry = registry; 
} 

public RulesExecutionService getRulesExecutionService() { 
    return rulesExecutionService; 
} 

public void setRulesExecutionService(RulesExecutionService rulesExecutionService) { 
    this.rulesExecutionService = rulesExecutionService; 
} 

public KieServerRegistry getRegistry() { 
    return registry; 
} 

public void setRegistry(KieServerRegistry registry) { 
    this.registry = registry; 
} 

@POST 
@Path("/{ksessionId}") 
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) 
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) 
public Response fetchAllRules(@Context HttpHeaders headers, @PathParam("id") String id, 
     @PathParam("ksessionId") String ksessionId, String cmdPayload) { 

    Variant v = getVariant(headers); 
    try { 
     System.out.println("CREATING KieContainerInstance "); 
     KieContainerInstance kci = registry.getContainer(id); 

     String contentType = getContentType(headers); 

     MarshallingFormat format = MarshallingFormat.fromType(contentType); 
     if (format == null) { 
      format = MarshallingFormat.valueOf(contentType); 
     } 

     Marshaller marshaller = kci.getMarshaller(format); 
     RuleAccessor accessor = new RuleAccessor(); 

     List<RuleData> rules = accessor.fetchAllRules(kci.getKieContainer()); 

     String result = marshaller.marshall(rules); 

     return createResponse(result, v, Response.Status.OK); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
     String response = "Execution failed with error : " + ex.getMessage(); 
     System.out.println("Returning Failure response with content '{}' :" + response); 
     return createResponse(response, v, Response.Status.INTERNAL_SERVER_ERROR); 
    } 

} 

RuleAccessor

 public class RuleAccessor { 

     public List<RuleData> fetchAllRules(KieContainer kContainer) { 

    kContainer.getKieBaseNames().stream() 
      .forEach(kieBase -> rules.addAll(fetchRules(kContainer1.getKieBase(kieBase)))); 

    return rules; 

} 

    public List<RuleData> fetchRules(KieBase kieBase) { 
    List<RuleData> ruleData = new ArrayList<>(); 
    for (KiePackage kp : kieBase.getKiePackages()) { 
     RuleData data = new RuleData(); 
     for (Rule r1 : kp.getRules()) { 
      RuleImpl r = (RuleImpl) r1; 
      data.agendaGroup(r.getAgendaGroup()).packageId(r.getPackageName()).ruleName(r.getName()) 
        .enabled(Boolean.getBoolean((((EnabledBoolean) r.getEnabled()).toString()))) 
        .effectiveDate(String.valueOf(r.getDateEffective())) 
        .dateExpires(String.valueOf(r.getDateExpires())).dialect(r.getDialect()) 
        .salience(r.getSalienceValue()).metaData(r.getMetaData()); 
      try { 
       Resource resource = r.getResource(); 
       Reader reader = resource.getReader(); 
       BufferedReader bufferedReader = new BufferedReader(reader); 
       String line = null; 
       StringBuilder builder = new StringBuilder(); 
       while ((line = bufferedReader.readLine()) != null) { 
        builder.append(line); 
       } 
       data.ruleContent(builder.toString()); 
       ruleData.add(data); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return ruleData; 

} 

    public static class RuleData { 

    private String packageId; 

    private String ruleName; 

    private String type; 

    private String agendaGroup; 

    private String ruleContent; 

    private boolean isEnabled; 
    private String effectiveDate; 
    private String dateExpires; 
    private String dialect; 
    private int salience; 
    private Map<String, Object> metaData; 

    public boolean isEnabled() { 
     return isEnabled; 
    } 

    public RuleData enabled(boolean isEnabled) { 
     this.isEnabled = isEnabled; 
     return this; 
    } 

    public String effectiveDate() { 
     return effectiveDate; 
    } 

    public RuleData effectiveDate(String effectiveDate) { 
     this.effectiveDate = effectiveDate; 
     return this; 
    } 

    public String getDateExpires() { 
     return dateExpires; 
    } 

    public RuleData dateExpires(String dateExpires) { 
     this.dateExpires = dateExpires; 
     return this; 
    } 

    public String getDialect() { 
     return dialect; 
    } 

    public RuleData dialect(String dialect) { 
     this.dialect = dialect; 
     return this; 
    } 

    public int getSalience() { 
     return salience; 
    } 

    public RuleData salience(int salience) { 
     this.salience = salience; 
     return this; 
    } 

    public Map<String, Object> getMetaData() { 
     return metaData; 
    } 

    public RuleData metaData(Map<String, Object> metaData) { 
     this.metaData = metaData; 
     return this; 
    } 

    public String getRuleContent() { 
     return ruleContent; 
    } 

    public RuleData ruleContent(String ruleContent) { 
     this.ruleContent = ruleContent; 
     return this; 
    } 

    public String getPackageId() { 
     return packageId; 
    } 

    public RuleData packageId(String packageId) { 
     this.packageId = packageId; 
     return this; 
    } 

    public String getRuleName() { 
     return ruleName; 
    } 

    public RuleData ruleName(String ruleName) { 
     this.ruleName = ruleName; 
     return this; 
    } 

    public String getType() { 
     return type; 
    } 

    public RuleData type(String type) { 
     this.type = type; 
     return this; 
    } 

    public String getAgendaGroup() { 
     return agendaGroup; 
    } 

    public RuleData agendaGroup(String agendaGroup) { 
     this.agendaGroup = agendaGroup; 
     return this; 
    } 

} 

}

Вы можете сделать запрос REST на Kie Server из вашего приложения, чтобы получить доступ ко всем правилам, доступным для данного контейнера.

http://localhost:8080/kie-server/services/rest/server/containers/instances/<container-id>/ksession/<session-id> 

 Смежные вопросы

  • Нет связанных вопросов^_^