|
![]() |
Esta es la clase Principal, es la encargada de ejecutar los Plugins, las clases que contienen un filtro especial para cada buscador en particular. Los Plugins extienden la clase GusPlugin que contiene las rutinas necesarias para que cualquier plugin funcione, como conectarse al buscador y devolver la búsqueda. Es una clase abstracta así que se obliga a extenderla. En el caso de que un plugin no funcione, por razones de cambio en el buscador original, entonces se puede cambiar la extensión, por la de un plugin ya hecho y dar la sensación de que la funcionalidad no se perdió. Esta clase contiene un pequeño cargador de clases así que sólo es necesario copiar los nuevos plugins a la carpeta con los demás sin tener que modificar el resto del código, y por supuesto los plugins son Threads que a medida que van terminando se interpretan y devuelven los resultados, mientras los otros siguen buscando. En este caso se limitó la carga de Plugins a 2 [0-1] por la razón de que son demasiados resultados y los usuarios, pueden terminar cancelando la búsqueda... |
import java.io.*;
class GnuPernico extends Thread implements FilenameFilter{
public static PrintStream out=System.out;
public static int maxrunningplugins=1;
public static void main(String[] args){
String q;
if (args.length==0){q="";}else{q=args[0];}
try{
REQManipulation Helper=new REQManipulation(q+"&");
String hole=Helper.REQ("query=");
String Search=Helper.REQ("&");
String[] plgs=GnuPernico.getPlugins();
boolean[] plgsCK=new boolean[plgs.length];
Object Plugins[][]=new Object[plgs.length][2];
//Extrayendo los plugins que se activaron
int maxplugins=-1;
File CL;
GusPlugin PL;
String FN;
if (Helper.Text.equals("")){Helper.setText("hotbot=on&");}
while ( Helper.Text.indexOf("=on&")!=-1 ){
FN = Helper.REQ("=on&");
CL = new File(FN+".class");
if (CL.canRead()){
maxplugins++;
Plugins[maxplugins][0]=(Object) FN;
if (maxplugins<=GnuPernico.maxrunningplugins){
for(int i=0;i<plgs.length;i++){if (plgs[i].equals(CL.toString())){plgsCK[i]=true;}}//end for
}
}//if found
}//end while
if (maxplugins>GnuPernico.maxrunningplugins){maxplugins=GnuPernico.maxrunningplugins;}
//imprimiendo algunas cosas en la página de resultados
Helper.setText(Search);
Helper.urlDecode();
GnuPernico.out.println("<a name=\"inicio\"></a><h3>Your Query : "+Helper.getText()+"</h3>");
GnuPernico.out.println("<div align=\"center\"><img src=\"http://www.compunauta.com/gnupernico/gnupernico.png\" alt=\"[Gnupérnico II - MetaBuscador]\" border=0></div>");
GnuPernico.out.println("<div align=\"center\"> <h5>META BUSCADOR NO COMERCIAL - FASE BETA - DOWNLOAD (SOLO DOS BUSCADORES A LA VEZ)</a></h5></div>");
GnuPernico.out.println("<form action=\"http://www.compunauta.com/cgi-bin/gnupernico\" method=\"get\" enctype=\"application/x-www-form-urlencoded\">");
GnuPernico.out.println("<div align=\"center\"><input type=\"text\" name=\"query\" size=60 maxlength=256 value=\""+Helper.getText()+"\">");
GnuPernico.out.println("<input type=\"submit\" value=\"buscar\"></div><br><br>");
//Buscando una plantilla si existe
File Template=new File("template.html");
if (Template.canRead()){
FileInputStream input=new FileInputStream(Template);
BufferedReader bfr = new BufferedReader(new InputStreamReader(input));String Line;
while ((Line=bfr.readLine())!=null){GnuPernico.out.println(Line);}//end printing
}//if found template
//imprimiendo los check buttons para los plugins
GnuPernico.out.print("<center>| ");
for (int i=0;i<plgs.length;i++){
Helper.setText(plgs[i]);
plgs[i]=Helper.REQ(".class");
if (plgsCK[i]){GnuPernico.out.println("<input type=\"checkbox\" checked name=\""+plgs[i]+"\">"+plgs[i]);}else{GnuPernico.out.println("<input type=\"checkbox\" name=\""+plgs[i]+"\">"+plgs[i]);}
GnuPernico.out.print(" |");
}//end for
GnuPernico.out.println("</center></form><hr>");
if (Search.equals("")){System.exit(0);}
//Generando un Objeto Plugin Pedido
boolean[] Parsed=new boolean[maxplugins+1];
for (int i=0;i<=maxplugins;i++){
//cargando el objeto class
Plugins[i][1]=(Object) Class.forName((String)Plugins[i][0]);
//generando un objeto class (no es necesario guardar el obj class)
Plugins[i][1]=(Object) (((Class)Plugins[i][1]).newInstance());
((GusPlugin)Plugins[i][1]).setSyntax(Search);
GnuPernico.out.println("<!-- <b>Waiting.... "+((GusPlugin)Plugins[i][1]).MyName+" thread have been launched...</b><br> -->");
((GusPlugin)Plugins[i][1]).start();
Parsed[i]=false;
GnuPernico.out.println("<a href=\"#"+((GusPlugin)Plugins[i][1]).getName()+"\"><b>"+((GusPlugin)Plugins[i][1]).MyName+"</b></a>");
}//end for
//Procesando los resultados que van siendo devueltos
int ok=0;
int oldok=-1;
int timewait=0;
String result[][];
int rlen;
boolean rdy;
String my;
while(ok<=maxplugins){
for (int i=0;i<=maxplugins;i++){
sleep(500);//Insólito, sin esto la jvm se cuelga [without this, JVM CRASH in a loop]
rdy=((GusPlugin)Plugins[i][1]).ready();
if ((!Parsed[i])&&(rdy)){
((GusPlugin)Plugins[i][1]).parseBuff();
my=((GusPlugin)Plugins[i][1]).MyName;//is here for debug only
result=((GusPlugin)Plugins[i][1]).getResults();
rlen=((GusPlugin)Plugins[i][1]).resultsLen();
GnuPernico.out.println("<br><a name=\""+((GusPlugin)Plugins[i][1]).getName()+"\" href=\"#inicio\"><b>From "+my+":"+rlen+"</b></a></h2><br>");
for(int k=0;k<rlen;k++){
GnuPernico.out.println("<b>"+((GusPlugin)Plugins[i][1]).dropTags(result[0][k])+"</b><br>"+((GusPlugin)Plugins[i][1]).dropTags(result[1][k]));
GnuPernico.out.println("<br><a href=\""+result[2][k]+"\" target=_blank>"+result[2][k]+"</a><hr>");
}//end printn
Parsed[i]=true;
ok++;
}//end if
}//end parsed
if (oldok!=ok){
if (ok!=maxplugins) {
sleep(500); timewait++;
}//if not max
}//if change
if (timewait>20){GnuPernico.out.println("End WaitState"); System.exit(0);}
}//end while
}catch (Exception e){e.printStackTrace(); System.exit(0);}
GnuPernico.out.println("<!-- Normal Termination -->");
System.exit(0);
}//end main
public static String[] getPlugins(){
GnuPernico g=new GnuPernico();
File list=new File("./");
String[] plgs=list.list((FilenameFilter)g);
for(int i=0;i<plgs.length;i++){
}//end for
return plgs;
}//end getPlugins
public boolean accept(File dir, String txt){
if (txt.equals("GnuPernico.class")){return false;}
if (txt.equals("REQManipulation.class")){return false;}
if (txt.equals("GusPlugin.class")){return false;}
if (txt.indexOf(".class")!=-1) {return true;}
return false;
}//end accept [FileFilter]
}//end class