Esempio n. 1
0
  private static void loadRuleFile() {
    try {

      ClassLoader classLoader = Steward.class.getClassLoader();

      PackageBuilderConfiguration configuration = new PackageBuilderConfiguration(classLoader);
      PackageBuilder builder = new PackageBuilder(configuration);

      Reader rulesFile = new InputStreamReader(Steward.class.getResourceAsStream("../Steward.drl"));

      builder.addPackageFromDrl(rulesFile);

      Reader ruleFlowFile1 =
          new InputStreamReader(Steward.class.getResourceAsStream("../ActionGeneration.rfm"));
      Reader ruleFlowFile2 =
          new InputStreamReader(Steward.class.getResourceAsStream("../ActionSelection.rfm"));

      builder.addRuleFlow(ruleFlowFile1);
      builder.addRuleFlow(ruleFlowFile2);

      if (builder.hasErrors()) {
        System.out.println(builder.getErrors().toString());
        throw new RuntimeException("Unable to compile rule file.");
      }

      RuleBaseConfiguration ruleBaseConfiguration = new RuleBaseConfiguration(classLoader);

      ruleBase = RuleBaseFactory.newRuleBase(ruleBaseConfiguration);
      ruleBase.addPackage(builder.getPackage());

    } catch (Exception e) {
      e.printStackTrace();
      throw new RuntimeException(e);
    }
  }
  @Test
  public void testLogicalInsertionsWithModify() throws Exception {
    final PackageBuilder builder = new PackageBuilder();
    builder.addPackageFromDrl(
        new InputStreamReader(
            getClass().getResourceAsStream("test_LogicalInsertionsWithUpdate.drl")));
    if (builder.hasErrors()) {
      fail(builder.getErrors().toString());
    }
    final Package pkg = builder.getPackage();

    RuleBase ruleBase = getRuleBase();
    ruleBase.addPackage(pkg);
    ruleBase = SerializationHelper.serializeObject(ruleBase);
    StatefulSession workingMemory = ruleBase.newStatefulSession();

    List l;
    final Person p = new Person("person");
    p.setAge(2);
    FactHandle h = workingMemory.insert(p);
    assertEquals(1, IteratorToList.convert(workingMemory.iterateObjects()).size());

    workingMemory.fireAllRules();
    workingMemory = getSerialisedStatefulSession(workingMemory);
    assertEquals(2, IteratorToList.convert(workingMemory.iterateObjects()).size());

    l =
        IteratorToList.convert(
            workingMemory.iterateObjects(new ClassObjectFilter(CheeseEqual.class)));
    assertEquals(1, l.size());
    assertEquals(2, ((CheeseEqual) l.get(0)).getPrice());

    h = getFactHandle(h, workingMemory);
    workingMemory.retract(h);
    workingMemory = getSerialisedStatefulSession(workingMemory);
    assertEquals(0, IteratorToList.convert(workingMemory.iterateObjects()).size());

    TruthMaintenanceSystem tms =
        ((InternalWorkingMemory) workingMemory).getTruthMaintenanceSystem();

    final java.lang.reflect.Field field = tms.getClass().getDeclaredField("assertMap");
    field.setAccessible(true);
    final ObjectHashMap m = (ObjectHashMap) field.get(tms);
    field.setAccessible(false);
    assertEquals("assertMap should be empty", 0, m.size());
  }
  public void testNotWithBindings() throws Exception {
    final PackageBuilder builder = new PackageBuilder();
    builder.addPackageFromDrl(
        new InputStreamReader(getClass().getResourceAsStream("not_with_bindings_rule_test.drl")));
    final Package pkg = builder.getPackage();

    final Rule rule = pkg.getRules()[0];
    assertTrue(rule.isValid());
    assertEquals(0, builder.getErrors().getErrors().length);

    RuleBase ruleBase = getRuleBase();
    ruleBase.addPackage(pkg);
    ruleBase = serializeRuleBase(ruleBase);

    StatefulSession workingMemory = ruleBase.newStatefulSession();

    List list = new ArrayList();
    workingMemory.setGlobal("list", list);

    final Cheese stilton = new Cheese("stilton", 5);
    FactHandle stiltonHandle = workingMemory.insert(stilton);
    final Cheese cheddar = new Cheese("cheddar", 7);
    FactHandle cheddarHandle = workingMemory.insert(cheddar);

    final PersonInterface paul = new Person("paul", "stilton", 12);
    workingMemory.insert(paul);

    ruleBase = serializeRuleBase(ruleBase);
    workingMemory = serializeWorkingMemory(ruleBase, workingMemory);
    list = (List) workingMemory.getGlobal("list");
    stiltonHandle = updateHandle(workingMemory, stiltonHandle);
    cheddarHandle = updateHandle(workingMemory, cheddarHandle);

    workingMemory.fireAllRules();

    assertEquals(0, list.size());

    workingMemory.retract(stiltonHandle);

    workingMemory.fireAllRules();

    assertEquals(1, list.size());
  }
  /**
   * Compiles the given rule strings into a single rulebase
   *
   * @param rules
   * @return
   * @throws Exception
   */
  public static RuleBase compile(List<String> rules) throws Exception {
    Properties properties = new Properties();
    properties.setProperty("drools.dialect.java.compiler", "JANINO");
    properties.setProperty("drools.dialect.default", "java");
    properties.setProperty("drools.dialect.java.compiler.lnglevel", "1.5");

    // properties.setProperty("drools.dump.dir", "/tmp");
    // log.debug("drools.dump.dir value is set to " + dumpDir);

    PackageBuilderConfiguration conf = new PackageBuilderConfiguration(properties);
    PackageBuilder builder = new PackageBuilder(conf);
    RuleBase ruleBase = RuleBaseFactory.newRuleBase();

    for (String rule : rules) {
      StringReader drl = new StringReader(rule);
      builder.addPackageFromDrl(drl);
      PackageBuilderErrors errors = builder.getErrors();
      for (DroolsError error : errors.getErrors()) {
        log.warn(error);
      }
    }
    ruleBase.addPackage(builder.getPackage());
    return ruleBase;
  }
  public void execute() throws MojoExecutionException {
    // find all the rules items and load them into a package
    try {

      // Need to load the build classpath
      @SuppressWarnings("unchecked")
      List<Dependency> dependencies = project.getDependencies();
      List<URL> url = new ArrayList<URL>();
      url.add(outputDirectory.toURI().toURL());
      for (Dependency d : dependencies) {
        String scope = d.getScope();
        if (!Artifact.SCOPE_TEST.equals(scope)) {
          Artifact artifact =
              getArtifact(
                  d.getGroupId(),
                  d.getArtifactId(),
                  d.getVersion(),
                  d.getType(),
                  d.getClassifier());
          url.add(artifact.getFile().toURI().toURL());
        }
      }

      URL[] classpath = url.toArray(new URL[url.size()]);

      URLClassLoader uc =
          new URLClassLoader(classpath, this.getClass().getClassLoader()) {
            @Override
            public Class<?> loadClass(String name) throws ClassNotFoundException {
              getLog().debug("Loading Class for compile [" + name + "]");
              Class<?> c = super.loadClass(name);
              getLog().debug("Loading Class for compile [" + name + "] found [" + c + "]");
              return c;
            }

            @Override
            protected Class<?> findClass(String name) throws ClassNotFoundException {
              getLog().debug("Finding Class for compile [" + name + "]");
              Class<?> c = super.findClass(name);
              getLog().debug("Finding Class for compile [" + name + "] found [" + c + "]");
              return c;
            }
          };
      URLClassLoader uc2 =
          new URLClassLoader(classpath, this.getClass().getClassLoader()) {
            @Override
            public Class<?> loadClass(String name) throws ClassNotFoundException {
              getLog().debug("Loading Class for runtime [" + name + "]");
              Class<?> c = super.loadClass(name);
              getLog().debug("Loading Class for runtime [" + name + "] found [" + c + "]");
              return c;
            }

            @Override
            protected Class<?> findClass(String name) throws ClassNotFoundException {
              getLog().debug("Finding Class for runtime [" + name + "]");
              Class<?> c = super.findClass(name);
              getLog().debug("Finding Class for runtime [" + name + "] found [" + c + "]");
              return c;
            }
          };
      getLog().info("Package Class loader is using classpath " + Arrays.toString(uc.getURLs()));

      listClassloader("  ", uc);

      PackageBuilderConfiguration packageBuilderConfiguration = new PackageBuilderConfiguration(uc);
      PackageBuilder pb = new PackageBuilder(packageBuilderConfiguration);

      DirectoryScanner ds = new DirectoryScanner();
      ds.setIncludes(includes);
      ds.setExcludes(excludes);
      ds.setBasedir(rulesdir);
      ds.setCaseSensitive(true);
      ds.scan();

      String[] files = ds.getIncludedFiles();
      for (String file : files) {
        File f = new File(rulesdir, file);
        Reader reader = new FileReader(f);
        try {
          if (file.endsWith(".drl")) {
            getLog().info("Adding Rules " + f);
            pb.addPackageFromDrl(reader);
          } else if (file.endsWith(".xml")) {
            getLog().info("Adding Package definition " + f);
            pb.addPackageFromXml(reader);
          } else if (file.endsWith(".rf")) {
            getLog().info("Adding Rule Flow " + f);
            pb.addRuleFlow(reader);
          } else {
            getLog().info("Ignored Resource " + f);
          }

        } finally {
          reader.close();
        }
      }

      pb.compileAll();
      PackageBuilderErrors errors = pb.getErrors();
      if (errors.size() > 0) {
        for (KnowledgeBuilderError kberr : errors) {
          getLog().error(kberr.toString());
        }
        throw new MojoExecutionException("Package is not valid");
      }
      org.drools.rule.Package p = pb.getPackage();
      if (!p.isValid()) {
        getLog().error("Package is not valid ");
        throw new MojoExecutionException("Package is not valid");
      }

      File outputFile = getOutputFile();
      getLog().info("Saving compiled package to  " + outputFile.getPath());
      outputFile.getParentFile().mkdirs();
      FileOutputStream fout = new FileOutputStream(outputFile);
      DroolsStreamUtils.streamOut(fout, p);
      fout.close();

      getLog().info("Testing Compiled package " + outputFile.getPath());

      File inputFile = getOutputFile();
      FileInputStream fin = new FileInputStream(inputFile);

      RuleBaseConfiguration config = new RuleBaseConfiguration(uc2);
      RuleBase ruleBase = RuleBaseFactory.newRuleBase(config);
      Object o = DroolsStreamUtils.streamIn(fin, uc);

      ruleBase.addPackage((Package) o);
      KnowledgeBase kb = new KnowledgeBaseImpl(ruleBase);

      @SuppressWarnings("unused")
      StatelessKnowledgeSession session = kb.newStatelessKnowledgeSession();

      getLog().info("Testing passed ");

    } catch (Exception e) {
      getLog().error(e);
      throw new MojoExecutionException(e.getMessage());
    }
  }