public void testCustomRuleBaseConfiguration() throws Exception {
    final File dir = RuleBaseAssemblerTest.getTempDirectory();

    Random rnd = new Random(System.currentTimeMillis());

    final Package p1 = new Package("p1");
    final File p1f = new File(dir, rnd.nextLong() + ".pkg");
    RuleBaseAssemblerTest.writePackage(p1, p1f);

    String path = p1f.getPath();

    Properties props = new Properties();
    props.setProperty("file", path);

    // Check a default value for the RuleBase's RuleBaseConfiguration
    RuleAgent agent = RuleAgent.newRuleAgent(props);
    RuleBaseConfiguration conf = ((InternalRuleBase) agent.getRuleBase()).getConfiguration();
    assertEquals(false, conf.isSequential());

    // Pass in a RuleBaseConfiguration and make sure the RuleBase was created with it
    conf = new RuleBaseConfiguration();
    conf.setSequential(true);
    agent = RuleAgent.newRuleAgent(props, conf);
    conf = ((InternalRuleBase) agent.getRuleBase()).getConfiguration();
    assertEquals(true, conf.isSequential());
  }
  public void testPollingFilesRuleBaseRemoveNewInstanceTrue() throws Exception {
    File dir = RuleBaseAssemblerTest.getTempDirectory();

    Package p1 = new Package("p1");
    File p1f = new File(dir, "p43_.pkg");
    RuleBaseAssemblerTest.writePackage(p1, p1f);

    Package p2 = new Package("p2");
    File p2f = new File(dir, "p44_.pkg");
    RuleBaseAssemblerTest.writePackage(p2, p2f);

    String path = dir.getPath() + "/" + "p43_.pkg " + dir.getPath() + "/p44_.pkg";

    Properties props = new Properties();
    props.setProperty("file", path);

    props.setProperty("newInstance", "true");
    RuleAgent ag = RuleAgent.newRuleAgent(props);

    assertTrue(ag.isNewInstance());

    RuleBase rb = ag.getRuleBase();
    assertEquals(2, rb.getPackages().length);

    boolean success = p2f.delete();
    assertTrue(success);

    ag.refreshRuleBase();

    RuleBase rb_ = ag.getRuleBase();

    assertNotSame(rb, rb_);

    assertEquals(1, rb_.getPackages().length);
    Thread.sleep(1000);
    // only change one
    RuleBaseAssemblerTest.writePackage(p1, p1f);
    Thread.sleep(1000);
    ag.refreshRuleBase();

    RuleBase rb__ = ag.getRuleBase();

    assertNotSame(rb, rb__);

    // check we will have 2
    assertEquals(1, rb__.getPackages().length);

    ag.refreshRuleBase();
    ag.refreshRuleBase();

    RuleBase rb___ = ag.getRuleBase();
    assertEquals(1, rb___.getPackages().length);
  }
  public void testFiles() throws Exception {
    File dir = RuleBaseAssemblerTest.getTempDirectory();

    Package p1 = new Package("p1");
    File p1f = new File(dir, "p1.pkg");
    RuleBaseAssemblerTest.writePackage(p1, p1f);

    Package p2 = new Package("p2");
    File p2f = new File(dir, "p2.pkg");
    RuleBaseAssemblerTest.writePackage(p2, p2f);

    String path = dir.getPath() + "/" + "p1.pkg " + dir.getPath() + "/" + "p2.pkg";

    Properties props = new Properties();
    props.setProperty("file", path);
    RuleAgent ag = RuleAgent.newRuleAgent(props);
    RuleBase rb = ag.getRuleBase();
    assertNotNull(rb);
    assertEquals(2, rb.getPackages().length);

    assertFalse(ag.isPolling());

    props.setProperty("poll", "1");
    ag = RuleAgent.newRuleAgent(props);
    assertTrue(ag.isPolling());

    ag.stopPolling();
    assertFalse(ag.isPolling());
  }
  public void testDirectory() throws Exception {
    File dir = RuleBaseAssemblerTest.getTempDirectory();

    Package p1 = new Package("p1");
    File p1f = new File(dir, "p43_.pkg");

    File junk = new File(dir, "xxx.poo");
    FileOutputStream ojunk = new FileOutputStream(junk);
    ojunk.write("ignore me".getBytes());
    ojunk.flush();
    ojunk.close();

    RuleBaseAssemblerTest.writePackage(p1, p1f);

    Properties props = new Properties();
    props.setProperty(RuleAgent.DIRECTORY, dir.getPath());
    props.setProperty(RuleAgent.CONFIG_NAME, "goo");

    RuleAgent ag = RuleAgent.newRuleAgent(props);

    ag.refreshRuleBase();

    RuleBase rb = ag.getRuleBase();
    assertNotNull(rb);
    //        assertEquals(1, rb.getPackages().length);
  }
  public void testPollingFilesRuleBaseUpdate() throws Exception {
    // RuleBaseAssemblerTest.clearTempDirectory();
    final File dir = RuleBaseAssemblerTest.getTempDirectory();

    Random rnd = new Random(System.currentTimeMillis());

    final Package p1 = new Package("p1");
    final File p1f = new File(dir, rnd.nextLong() + ".pkg");
    RuleBaseAssemblerTest.writePackage(p1, p1f);

    String path = p1f.getPath();

    Properties props = new Properties();
    props.setProperty("file", path);

    RuleAgent ag = RuleAgent.newRuleAgent(props);

    RuleBase rb = ag.getRuleBase();
    assertEquals(1, rb.getPackages().length);
    assertEquals(0, rb.getPackages()[0].getGlobals().size());

    p1.addGlobal("goo", String.class);

    Thread.sleep(1000);

    RuleBaseAssemblerTest.writePackage(p1, p1f);

    RuleBase rb_ = ag.getRuleBase();
    assertSame(rb, rb_);
    assertEquals(1, rb.getPackages().length);
    assertEquals(0, rb.getPackages()[0].getGlobals().size());

    Thread.sleep(1000);

    ag.refreshRuleBase();

    RuleBase rb2 = ag.getRuleBase();
    assertSame(rb, rb2);

    assertEquals(1, rb2.getPackages().length);
    assertEquals(1, rb2.getPackages()[0].getGlobals().size());

    // now check subsequent changes
    p1.addGlobal("goo2", String.class);
    //        System.err.println("-->WRITING CHANGE");
    Thread.sleep(1000);
    RuleBaseAssemblerTest.writePackage(p1, p1f);
    //        System.err.println("-->WROTE CHANGE");
    Thread.sleep(1000);
    ag.refreshRuleBase();

    RuleBase rb2_ = ag.getRuleBase();
    assertSame(rb2_, rb2);
    assertEquals(1, rb2_.getPackages().length);
    assertEquals(2, rb2_.getPackages()[0].getGlobals().size());

    ag.refreshRuleBase();

    RuleBase rb3 = ag.getRuleBase();
    assertSame(rb3, rb2);

    assertEquals(1, rb3.getPackages().length);
    assertEquals(2, rb3.getPackages()[0].getGlobals().size());

    ag.refreshRuleBase();
    ag.refreshRuleBase();

    assertEquals(1, rb3.getPackages().length);
    assertEquals(2, rb3.getPackages()[0].getGlobals().size());
  }