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;
}
}
}