Package org.jboss.fresh.shell.commands

Source Code of org.jboss.fresh.shell.commands.FileFilterExe$StringFilter

package org.jboss.fresh.shell.commands;

import org.jboss.fresh.vfs.FileInfo;
import org.jboss.fresh.io.BufferObjectReader;
import org.jboss.fresh.io.BufferObjectWriter;
import org.jboss.fresh.io.BufferWriter;
import org.jboss.fresh.shell.AbstractExecutable;
import org.jboss.fresh.util.AbstractFilter;
import org.jboss.fresh.util.Filter;
import org.jboss.fresh.util.FilterParser;

import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

// EX FIXED

public class FileFilterExe extends AbstractExecutable {
  private static transient org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(FileFilterExe.class);
  private static transient org.apache.log4j.Logger SF_log = org.apache.log4j.Logger.getLogger(FileFilterExe.class.getName() + ".StringFilter");
  private static transient org.apache.log4j.Logger IF_log = org.apache.log4j.Logger.getLogger(FileFilterExe.class.getName() + ".IntFilter");

  /**
   Recieves FileInfo objects from the standard in Buffer, filters them and sends to the standard out Buffer only the ones that remain.

   */

  public void process(String exepath, String[] params) throws Exception {
    log.debug("entered");

    if (helpRequested()) {
      PrintWriter out = new PrintWriter(new BufferWriter(getStdOut()));
      out.print("Usage: filefilter [--help] [-ex] type=dir\n");
      out.print("    The FileInfo objects are acquired from the pipeline, filtered and the ones remaining are sent forward.\n");
      out.print("    --help : this help\n");
      out.close();
      log.debug("done");
      return;
    }

    BufferObjectReader oin = new BufferObjectReader(getStdIn());
    BufferObjectWriter oout = new BufferObjectWriter(getStdOut());

    // if no params, just let through everything
    // if type param, do some filtering.
    if (params.length == 0) {
      log.info("No parameters specified. Just piping through.");
      while (!oin.isFinished()) {
        oout.writeObject(oin.readObject());
      }
      oout.close();
      log.debug("done");
      return;
    }


    HashMap typemap = new HashMap();
    typemap.put("type", "string");

    // filterparser mora pripraviti pogoje - Filter objekte. Filter objekt zna za vrednost dolo�enega tipa pogledati ali izpolnjuje set pogojev.
    // Seveda je normalno pogoj vezan na neko polje v neki podatkovni strukturi. Treba je samo ta field vedno posredovati temu filtru.
    // Treba je torej vedeti kateri field je vezan na kateri filter.
    // smiselno je enumerirati list filtrov. Vsak filter vpra�ati na kateri field se nana�a in ta field posredovati v preverjanje.

    FilterParser p = null;
    Filter[] filters = null;

    try {
      p = new MyFilterParser(typemap, params);
      filters = p.getFilters();
    } catch (Exception e) {
      if (canThrowEx()) {
        throw e;
      } else {
        PrintWriter err = new PrintWriter(new BufferWriter(getStdOut()));
        err.println("" + e);
      }
    }

    // now we do ...
    while (!oin.isFinished()) {
      FileInfo finf = (FileInfo) oin.readObject();

      boolean ok = false;

      for (int i = 0; i < filters.length; i++) {
        String fld = filters[i].getFieldName();
        log.debug("Field name: " + fld);
        if (fld.equals("type")) {
          ok = filters[i].check(cnv(finf.getFileType()));
          log.debug(finf.getFileName() + "  ok? : " + ok);
          if (!ok) break;
        }
      }

      if (ok) oout.writeObject(finf);
    }

    oout.close();

    log.debug("done");
  }


  private String cnv(int val) {
    switch (val) {
      case 1:
        return "FILE";
      case 2:
        return "DIR";
      case 3:
        return "LINK";
      default:
        return "";
    }
  }

  class MyFilterParser implements FilterParser {

    LinkedList list;

    MyFilterParser(HashMap typemap, String[] conds) throws Exception {
      LinkedList l = new LinkedList();


      // walk through conds
      for (int i = (canThrowEx() ? 1 : 0); i < conds.length; i++) {
        String cnd = conds[i];

        // condition has a format of fieldname operator value
        int p = cnd.indexOf("=");
        if (p == -1) {
          if (canThrowEx()) {
            throw new Exception("Exception while parsing. No operator found in condition: " + cnd);
          } else {
            PrintWriter err = new PrintWriter(new BufferWriter(getStdOut()));
            err.println("Exception while parsing. No operator found in condition: " + cnd);
            return;
          }
        }
        String fld = cnd.substring(0, p);

        // lookup type for this field
        String fldtype = (String) typemap.get(fld);
        if (fldtype == null) {
          if (canThrowEx()) {
            throw new Exception("Exception while parsing. No such field: " + fld);
          } else {
            PrintWriter err = new PrintWriter(new BufferWriter(getStdOut()));
            err.println("Exception while parsing. No such field: " + fld);
            return;
          }
        }

        if (fldtype.equals("int")) {
          try {
            l.add(new IntFilter(fld, Filter.EQ, cnd.substring(p + 1, cnd.length())));
          } catch (Exception e) {
            if (canThrowEx()) {
              throw e;
            } else {
              PrintWriter err = new PrintWriter(new BufferWriter(getStdOut()));
              err.println("" + e);
              return;
            }
          }
        } else if (fldtype.equals("string")) {
          try {
            l.add(new StringFilter(fld, Filter.EQ, cnd.substring(p + 1, cnd.length()).intern()));
          } catch (Exception e) {
            if (canThrowEx()) {
              throw e;
            } else {
              PrintWriter err = new PrintWriter(new BufferWriter(getStdOut()));
              err.println("" + e);
              return;
            }
          }
        }
      }

      list = l;
    }

    public List getFilterList() throws Exception {
      return list;
    }

    public Filter[] getFilters() throws Exception {

      // use typemap to know which
      Filter[] flts = new Filter[list.size()];
      Iterator it = list.iterator();
      for (int i = 0; it.hasNext(); i++) {
        flts[i] = (Filter) it.next();
      }

      return flts;
    }
  }


  class IntFilter extends AbstractFilter {

    int val;
    String op;
    String fldname;

    IntFilter(String field, String op, String s) throws Exception {
      fldname = field;
      this.val = Integer.parseInt(s);
      if (op != Filter.EQ) {
        throw new Exception("Unsupported comparison operator : " + op);
      }

      this.op = op;
    }

    public boolean check(int i) {
      IF_log.debug("checking " + i);
      if (op == Filter.EQ) return val == i;
      return false;
    }

    public String getFieldName() {
      IF_log.debug("field name: " + fldname);
      return fldname;
    }
  }

  class StringFilter extends AbstractFilter {

    String val;
    String op;
    String fldname;

    StringFilter(String field, String op, String s) throws Exception {
      fldname = field;
      this.val = s;
      if (op != Filter.EQ) {
        throw new Exception("Unsupported comparison operator : " + op);
      }

      this.op = op;
    }

    public boolean check(String i) {
      SF_log.debug("checking " + i);
      if (op == Filter.EQ) return val == i;
      return false;
    }

    public String getFieldName() {
      SF_log.debug("field name: " + fldname);
      return fldname;
    }
  }

}
TOP

Related Classes of org.jboss.fresh.shell.commands.FileFilterExe$StringFilter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.