PageRenderTime 41ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/sensitive-species/src/main/java/au/org/ala/sds/validation/PlantPestService.java

http://ala-portal.googlecode.com/
Java | 118 lines | 79 code | 22 blank | 17 comment | 5 complexity | 8b2da36122aea136ff37e2a7c3cfe5a3 MD5 | raw file
  1. /**
  2. *
  3. */
  4. package au.org.ala.sds.validation;
  5. import java.util.ArrayList;
  6. import java.util.Collection;
  7. import java.util.Date;
  8. import java.util.List;
  9. import java.util.Map;
  10. import org.apache.commons.lang.StringUtils;
  11. import org.apache.log4j.Logger;
  12. import org.drools.KnowledgeBase;
  13. import org.drools.runtime.StatelessKnowledgeSession;
  14. import au.org.ala.sds.knowledgebase.KnowledgeBaseFactory;
  15. import au.org.ala.sds.model.Message;
  16. import au.org.ala.sds.model.SdsMessage;
  17. import au.org.ala.sds.model.SensitiveTaxon;
  18. import au.org.ala.sds.model.SensitivityCategoryFactory;
  19. import au.org.ala.sds.model.SensitivityZone;
  20. import au.org.ala.sds.util.DateHelper;
  21. import au.org.ala.sds.util.ValidationUtils;
  22. /**
  23. *
  24. * @author Peter Flemming (peter.flemming@csiro.au)
  25. */
  26. public class PlantPestService implements ValidationService {
  27. protected static final Logger logger = Logger.getLogger(PlantPestService.class);
  28. private KnowledgeBase knowledgeBase;
  29. private ReportFactory reportFactory;
  30. private final SensitiveTaxon taxon;
  31. public PlantPestService(SensitiveTaxon taxon, KnowledgeBase knowledgeBase, ReportFactory reportFactory) {
  32. super();
  33. this.taxon = taxon;
  34. this.knowledgeBase = knowledgeBase;
  35. this.reportFactory = reportFactory;
  36. }
  37. /**
  38. * @param taxon
  39. * @param facts
  40. * @return
  41. */
  42. public ValidationOutcome validate(Map<String, String> biocacheData) {
  43. FactCollection facts = new FactCollection(biocacheData);
  44. ValidationReport report = reportFactory.createValidationReport(taxon);
  45. Date date = null;
  46. // Validate location
  47. if (!ValidationUtils.validateLocation(facts, report)) {
  48. return new ValidationOutcome(report, false);
  49. }
  50. // Validate date
  51. try {
  52. date = DateHelper.validateDate(facts);
  53. } catch (Exception e) {
  54. report.addMessage(new SdsMessage(Message.Type.ERROR, e.getMessage()));
  55. return new ValidationOutcome(report, false);
  56. }
  57. List<SensitivityZone> zones = SensitivityZone.getListFromString(facts.get(FactCollection.ZONES_KEY));
  58. RuleState state = new RuleState();
  59. do {
  60. state.setComplete(true);
  61. StatelessKnowledgeSession session = knowledgeBase.newStatelessKnowledgeSession();
  62. session.setGlobal("validationReport", report);
  63. session.setGlobal("state", state);
  64. session.setGlobal("logger", logger);
  65. session.execute(getFacts(taxon, zones, date));
  66. if (!state.isComplete()) {
  67. if (StringUtils.isNotBlank(state.getDelegateRules())) {
  68. knowledgeBase = KnowledgeBaseFactory.getKnowledgeBase(SensitivityCategoryFactory.getCategory(state.getDelegateRules()));
  69. state.setDelegateRules(null);
  70. } else {
  71. throw new IllegalStateException("Delegate rules not specified.");
  72. }
  73. }
  74. } while (!state.isComplete());
  75. ValidationOutcome outcome = new ValidationOutcome(report);
  76. outcome.setLoadable(state.isLoadable());
  77. outcome.setSensitive(!state.isLoadable());
  78. return outcome;
  79. }
  80. public void setKnowledgeBase(KnowledgeBase knowledgeBase) {
  81. this.knowledgeBase = knowledgeBase;
  82. }
  83. public void setReportFactory(ReportFactory reportFactory) {
  84. this.reportFactory = reportFactory;
  85. }
  86. /**
  87. * @return facts that the rules will reason upon
  88. */
  89. private Collection<Object> getFacts(SensitiveTaxon st, List<SensitivityZone> zones, Date date) {
  90. ArrayList<Object> facts = new ArrayList<Object>();
  91. facts.add(st);
  92. facts.add(zones);
  93. facts.add(date);
  94. return facts;
  95. }
  96. }