/*
* todo:
* - results so abholen, dass gleich die einzenlen dateien verlinkt werden können und aufs handy gepusht werden
* - in eine datei die aktuellen ergebnisse zwischenspeichern serilized, bei jedem start einlesen ( key=SESSIONID, VALUE=XMLRESULTSTRING )
* - polling beim server einbauen
* - im fehlerfall thread stoppen und neuen thread starten oder externe anwendung startet im fehlerfall neu
* - lockfile support, run only one instance: http://stackoverflow.com/questions/177189/how-to-implement-a-single-instance-java-application
* http://download.oracle.com/javase/tutorial/essential/concurrency/simple.html
*/
package buzzerproxy;
import buzzerproxy.bprot.ByteProtServer;
import buzzerproxy.handler.ExceptionHandler;
import buzzerproxy.handler.QuestionInterface;
import buzzerproxy.CacheManager;
import buzzerproxy.db.DatabaseManager;
import buzzerproxy.db.view.DatabaseEntry;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
/**
*
* @author thecerial
*/
public class BuzzerProxy implements ExceptionHandler, QuestionInterface {
private String BuzzerProxyVersion = "1.1.a - 12.8.2011";
private String Version = "www.buzzerstar.com"
+ " / BuzzerProxyJar Version -" + BuzzerProxyVersion
+ " running on localhost on Port " + Constant.SERVER_PORT;
private String xmlContent = ""
+ ""
+ "find"
+ "Madonna"
+ ".mp3+.wav+.flac"
+ "23232323232323232323232323"
+ "1.0.1"
+ "2429545b007ffc86a98df6f3cab76fc4"
+ "" + "";
private XMLParser XMLParser = null;
private CacheManager cacheManager;
private DatabaseManager databaseManager;
private IO io = new IO();
/**
*/
private BuzzerProxy() {
// Server mit Byte Protokol
System.out.println(Version);
new ByteProtServer(Constant.SERVER_PORT, this/* QuestionInterface */, this/* ExceptionHandler */)
.start();
new IO().lockInstance();
// new ServerThread().start();
}
// final class ServerThread extends Thread {
//
// @Override
// public void run() {
//
// String decryptedGzipXMLContent = "";
// String xmlContent = "";
// String googleResultString = "";
// HashMap results = null;
// String clientid = null;
// String clientversion = null;
// String searchservice = null;
// String searchquery = null;
// String page = null;
// String filetyp = null;
// String cryptedResults = null;
//
// BufferedReader inFromServer = null;
// DataOutputStream outToClient = null;
//
// try {
// server = new ServerSocket(ServerPort);
//
// } catch (IOException ex) {
// Logger.getLogger(BuzzerProxy.class.getName()).log(Level.SEVERE,
// null, ex);
// }
//
// // System.out.println(this);
// // this.clone();
//
// // System.exit(9);
//
// while (this.isAlive()) {
//
// try {
//
// client = server.accept();
// String clientIPAdress = client.getInetAddress().toString();
// System.out.println("[" + clientIPAdress + "]"
// + " Client Connected");
//
// // timer = new Timer( timeout, client );
//
// try {
//
// client.setKeepAlive(true);
// // client.setSoTimeout(timeout);
// client.setTrafficClass(0x04);
// client.setTcpNoDelay(true);
//
// } catch (Exception x) {
// Logger.getLogger(BuzzerProxy.class.getName()).log(
// Level.SEVERE, null, x);
// } finally {
// }
//
// inFromServer = new BufferedReader(new InputStreamReader(
// client.getInputStream()));
// outToClient = new DataOutputStream(client.getOutputStream());
// // outToClient.writeUTF("DEBUG: Welcome to " + Version);
//
// try {
// String userInput = null;
// // cryptedResults = inFromServer.readLine();
// while ((userInput = inFromServer.readLine()) != null) {
// cryptedResults += userInput;
// }
// } catch (Exception e) {
// Logger.getLogger(BuzzerProxy.class.getName()).log(
// Level.SEVERE, null, e);
// }
//
// // if ( timer.isTimeout == true ) {
// // System.out.println( "Got Timeout" );
// // }
//
// try {
// } catch (NullPointerException n) {
// Logger.getLogger(BuzzerProxy.class.getName()).log(
// Level.SEVERE, null, n);
// client.close();
// } catch (Exception n) {
// Logger.getLogger(BuzzerProxy.class.getName()).log(
// Level.SEVERE, null, n);
// client.close();
// } finally {
// // System.out.println("Beende mich");
// // System.exit(1);
// // client.close();
// // this.interrupted();
// }
//
// System.out.println("Got from Client: "
// + cryptedResults.toString());
// if (cryptedResults.equalsIgnoreCase("exit")) {
// outToClient
// .writeUTF("BuzzerProxy closing Client Socket Connection because of Termination Request");
// client.close();
// } // if (cryptedResults.equalsIgnoreCase("exit")) {
//
// // //// try { // Decrypt
// // //// decryptedGzipXMLContent =
// // Crypto.performDecrypt(secredCryptoKey.getBytes(),
// // cryptedResults.toString());
// // //// } catch (Exception ex) {
// // ////
// // System.out.println("Es gab probleme beim Decrypten der Nachricht.");
// // ////
// // Logger.getLogger(BuzzerProxy.class.getName()).log(Level.SEVERE,
// // null, ex);
// // //// }
// // ////
// // //// try { // Gunzip
// // //// xmlContent =
// // Gzip.gunzipString(decryptedGzipXMLContent);
// // //// } catch (IOException ioex) {
// // ////
// // Logger.getLogger(BuzzerProxy.class.getName()).log(Level.SEVERE,
// // null, ioex);
// // //// }
//
// try {
// results = XMLParser.parseResults(xmlContent);
// clientid = results.get(XMLParser.CLIENT_ID);
// clientversion = results.get(XMLParser.CLIENT_VERSION);
// searchservice = results.get(XMLParser.SEARCH_SERVICE);
// searchquery = results.get(XMLParser.SEARCH_QUERY);
// page = results.get(XMLParser.RESULT_PAGE);
// filetyp = results.get(XMLParser.FILE_TYP);
// } catch (NullPointerException n) {
// Logger.getLogger(BuzzerProxy.class.getName()).log(
// Level.SEVERE, null, n);
// // client.close();
// }
//
// String output = "##############################################################\n"
// + "Client IP: "
// + clientIPAdress
// + "\n"
// + "Client ID: "
// + clientid
// + "\n"
// + "Client Version: "
// + clientversion
// + "\n"
// + "Client Service: "
// + searchservice
// + "\n"
// + "Client Query: "
// + searchquery
// + "\n"
// + "Client Page: "
// + page
// + "\n"
// + "Client FileTyp: " + filetyp + "\n";
//
// /**
// * Nimm den Request vom Client entgegegn und sende ihm eine
// * 32 Bittige Session ID
// */
// try { // Send Google Request
// if (IO.isSet(searchservice) && IO.isSet(clientid)) {
// if (searchservice.equalsIgnoreCase("find")
// && clientid.equals(SECRET_AUTH_KEY)) {
//
// long sessionID = System.currentTimeMillis();// Crypto.generateSessionID();
// String sessionXML = CommunicationProtocol
// .sessionXML(sessionID);
// outToClient.writeUTF(sessionXML);
// client.close();
//
// } // if ( searchservice.equalsIgnoreCase("find") &&
// // clientid.equals(SECRET_AUTH_KEY)) {
// } // if ( IO.isSet(searchservice) && IO.isSet(clientid)
// // {
// } catch (Exception ex) {
// Logger.getLogger(BuzzerProxy.class.getName()).log(
// Level.SEVERE, null, ex);
// // client.close();
// }
//
// try {
//
// if (IO.isSet(searchquery)
// && IO.isSet(filetyp)
// && (searchservice.equalsIgnoreCase("results") && clientid
// .equals(SECRET_AUTH_KEY))) {
//
// googleResultString = Google.getGoogleContent(
// searchquery, filetyp);
// ArrayList ResultXMLString = GoogleResultParser
// .parseResults(googleResultString, filetyp);
// outToClient.writeUTF("ResultXMLString");
// client.close();
//
// output += "Client Google JSON: "
// + googleResultString + "\n";
// output += "Client Results: " + ResultXMLString
// + "\n";
// output += "##############################################################"
// + "\n";
//
// System.out.println(output);
// Logging.appendFile(output);
//
// }// if (IO.isSet(searchquery) && IO.isSet(filetyp) &&
// // (searchservice.equalsIgnoreCase("results") &&
// // clientid.equals(SECRET_AUTH_KEY)) )
//
// } catch (Exception ex) {
// Logger.getLogger(BuzzerProxy.class.getName()).log(
// Level.SEVERE, null, ex);
// // client.close();
// }
//
// } catch (IOException ex) {
// Logger.getLogger(BuzzerProxy.class.getName()).log(
// Level.SEVERE, null, ex);
// }
//
// // Reset the timer
// // timer.reset();
//
// } // while (true) {
// } // public void run() {
// } // final class ServerThread extends Thread {
//
// public void stop() {
// try {
// server.close();
// client.close();
// } catch (IOException ex) {
// Logger.getLogger(BuzzerProxy.class.getName()).log(Level.SEVERE,
// null, ex);
// System.out.println("Fange IOException ab");
// } catch (NullPointerException nex) {
// Logger.getLogger(BuzzerProxy.class.getName()).log(Level.SEVERE,
// null, nex);
// System.out.println("Fange Nullpointer ab");
// }
// System.out.println("Bin in der Stop Methode angekommen");
// }
/**
* @param args
* the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
new BuzzerProxy();
} // public static void main(String[] args) {
@Override
public void throwException(Throwable throwable) {
throwable.printStackTrace();
}
@Override
public ArrayList request(String xmlRequest)
throws Exception {
if (cacheManager == null)
cacheManager = new CacheManager();
// muss immer neu erstellt werden, da er das Session Management von Hibernate verwaltet
// und nach jedem Query die Hibernate Session geschlossen wird
databaseManager = new DatabaseManager();
HashMap results = null;
String clientid = null;
String clientversion = null;
String searchservice = null;
String searchquery = null;
String page = null;
String filetype = null;
try {
results = XMLParser.parseResults(xmlRequest);
clientid = results.get(Constant.CLIENT_ID);
clientversion = results.get(Constant.CLIENT_VERSION);
searchservice = results.get(Constant.SEARCH_SERVICE);
searchquery = results.get(Constant.SEARCH_QUERY);
page = results.get(Constant.RESULT_PAGE);
filetype = results.get(Constant.FILE_TYP);
} catch (NullPointerException n) {
Logger.getLogger(BuzzerProxy.class.getName()).log(Level.SEVERE,
null, n);
}
if (clientid == null || clientversion == null || searchservice == null
|| searchquery == null || page == null || filetype == null) {
throw new NullPointerException();
}
// hole aus dem Manager die Ergebnisse
ArrayList rt = cacheManager.getResultContainerFor(searchquery, filetype);
DatabaseEntry dblog = new DatabaseEntry();
dblog.setclientversion(clientversion);
dblog.setfiletype(filetype);
dblog.setid("");
dblog.setip("TODO");
dblog.setresultcount( rt.size()+"" );
dblog.setsearch(searchquery);
dblog.settype("TODO");
dblog.setdatetime("");
if ( !databaseManager.query(dblog) )
io.writeLog(dblog);
return rt;
}
@Override
public String getConfigXMLVersion() {
XMLParser xml = new XMLParser();
String xmlConfiguration = getConfigurationXML();
HashMap r = xml.parseResults(xmlConfiguration);
if ( r.containsKey(Constant.XML_VERSION)){
return r.get(Constant.XML_VERSION);
} else {
return Constant.XML_CURRENT_VERSION;
}
}
@Override
public String getConfigurationXML() {
String rContent = null;
try {
rContent = io.readFileAsString(Constant.XML_PATH);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return rContent;
}
}