0 Replies Latest reply on May 17, 2008 3:58 AM by amit_tomar

    DROOLS: Parsing input files

    amit_tomar

      Hi All ,
      I am new to this drools technology and want to do a prototype for checking its feasibility for our use.
      Most of the places I believe it will work fine.. but I have a use case of parsing input files recd in different formats.

      Scenario:
      I have 2 input files
      1.
      ##############################
      Test config Start
      100 bytes available 250 bytes total
      1000 bytes is my life goal
      ##############################
      2:
      ##############################
      Test config Start
      200 bytes available 300 bytes used 500 bytes total
      2000 bytes is my life goal
      ##############################

      I have to extract the numbers from here and populate an output objects.. containing whatever value is possible.. so for the first instance I will be able to populate 3 values.. but for the second one I will be able to extract 4 values
      I wrote a file to work on the first case but I am unable to get it working.
      Can somebody help me to complete this prototype.. (I am very new to this so please pardon my ignorance.. I just looked at help file and am trying to build this :) )

      Thanks for looking..
      - Amit

      ###########################################################
      ParsingExample.java
      ###########################################################
      package org.drools.examples;

      import java.io.InputStreamReader;

      import org.drools.FactHandle;
      import org.drools.RuleBase;
      import org.drools.RuleBaseFactory;
      import org.drools.StatefulSession;
      import org.drools.audit.WorkingMemoryFileLogger;
      import org.drools.compiler.PackageBuilder;
      import java.util.*;

      public class ParsingExample {

      /**
      * @param args
      */
      public static void main(final String[] args) throws Exception {

      final PackageBuilder builder = new PackageBuilder();
      builder.addPackageFromDrl( new InputStreamReader( ParsingExample.class.getResourceAsStream( "Parsing.drl" ) ) );

      final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
      ruleBase.addPackage( builder.getPackage() );

      final StatefulSession session = ruleBase.newStatefulSession();

      final WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger( session );
      logger.setFileName( "log/OutputObj" );

      String config = "";
      config += "Test config Start\n";
      config += " 100 bytes available 250 bytes total\n";
      config += " 1000 bytes is my life goal";
      String[] configA = config.split("\n");
      List configL = new ArrayList();
      for (int i=0; i < configA.length; i++) {
      configL.add(new Row(configA));
      }
      final Lines l1 = new Lines( configL );
      final InputConfig a = new InputConfig( l1 );

      final OutputObj t1 = new OutputObj();

      session.insert( a );

      session.insert( t1 );


      config = "";
      config += "Test config Start\n";
      config += " 200 bytes available 300 bytes used 500 bytes total\n";
      config += " 2000 bytes is my life goal";
      configA = config.split("\n");
      configL = new ArrayList();
      for (int i=0; i < configA.length; i++) {
      configL.add(new Row(configA
      ));
      }
      final Lines l2 = new Lines( configL );
      final InputConfig b = new InputConfig( l2 );

      final OutputObj t2 = new OutputObj();

      session.insert( b );

      session.insert( t2 );


      session.fireAllRules();

      session.dispose();

      logger.writeToDisk();
      }


      public static class Row {
      private String val;

      public Row() {

      }

      public Row(final String val) {
      this.val = val;
      }

      public String getVal() {
      return this.val;
      }

      public String toString() {
      return "[Row " + " : " + this.val + "]";
      }

      }

      public static class Lines {
      private List rows;

      public Lines() {

      }

      public Lines(final List rows) {
      this.rows = rows;
      }

      public List getRows() {
      return this.rows;
      }

      public String toString() {
      return "[Lines " + " : " + this.rows.toString() + "]";
      }

      }

      public static class InputConfig {
      private Lines config;

      public InputConfig() {

      }

      public InputConfig(final Lines config) {
      this.config = config;
      }

      public Lines getConfig() {
      return this.config;
      }

      public String toString() {
      return "[InputConfig " + " : " + this.config.toString() + "]";
      }

      }

      public static class OutputObj {
      private String bu = "";
      private String ba = "";
      private String bt = "";
      private String blg = "";

      public OutputObj() {
      }

      public String getBu() {
      return this.bu;
      }

      public void setBu(final String bu) {
      this.bu = bu;
      }

      public String getBa() {
      return this.ba;
      }

      public void setBa(final String ba) {
      this.ba = ba;
      }

      public String getBt() {
      return this.bt;
      }

      public void setBt(final String bt) {
      this.bt = bt;
      }

      public String getBlg() {
      return this.blg;
      }

      public void setBlg(final String blg) {
      this.blg = blg;
      }

      public String toString() {
      return "[OutputObj " + " used: " + this.bu +" avail: " + this.ba + " total: " + this.bt + " Goal: " + this.blg + "]";
      }

      }

      }

      ###########################################################
      Parsing.drl
      ###########################################################


      package org.drools.examples

      import org.drools.examples.ParsingExample.InputConfig;
      import org.drools.examples.ParsingExample.OutputObj;
      import org.drools.examples.ParsingExample.Lines;
      import org.drools.examples.ParsingExample.Row;

      rule "get Bytes v10"
      salience 10
      when
      $o : OutputObj()
      $i : InputConfig()
      InputConfig( $conf : config)
      $row : rows( val matches "^\\s*\\d+\s+bytes available\s+\d+\s+bytes total\s*$") from $i.config
      then
      eval($o.bu = /$row/^\s*(\d+)\s+bytes available\s+\d+\s+bytes total\s*$/)
      eval($o.bt = /$row/^\s*\d+\s+bytes available\s+(\d+)\s+bytes total\s*$/)
      System.out.println("BU:" + $o.bu);
      System.out.println("BT:" + $o.bt);
      end