package org.oobd.base.db;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.oobd.base.*;
import org.oobd.base.support.Onion;
import org.json.JSONException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.*;
/**
*
* @author steffen
*/
public class AVLLookup extends OobdDB implements OOBDConstants {
static HashMap<String, byte[]> dbStore=null;
public AVLLookup() {
super("AVLLookup");
dbStore = new HashMap<String, byte[]>();
Logger.getLogger(AVLLookup.class.getName()).log(Level.CONFIG, "AVLLookup object created: " + id);
}
@Override
public void registerCore(Core thisCore) {
super.registerCore(thisCore);
}
@Override
public String getPluginName() {
return "d:AVLLookup";
}
public void run() {
while (keepRunning == true) {
ArrayList<String> lookupResult = null;
Message msg = getMsg(true);
Onion on = msg.getContent();
String command = on.getOnionString("command");
if ("lookup".equalsIgnoreCase(command)) {
String dbFilename = on.getOnionBase64String("dbfilename");
String key = on.getOnionBase64String("key");
Logger.getLogger(AVLLookup.class.getName()).log(Level.INFO,
"AVLLookup lookup in " + dbFilename + " for: >" + key + "<");
try {
byte[] myDBBByteArray=dbStore.get(dbFilename);
ByteArrayInputStream myByteInputStream=null;
if (myDBBByteArray==null){
dbStore.put(dbFilename, org.apache.commons.io.IOUtils.toByteArray(Core.UISystem.generateResourceStream(FT_DATABASE, dbFilename)));
}
myByteInputStream = new ByteArrayInputStream(
dbStore.get(dbFilename));
lookupResult = OODBDictionary.doLookUp(myByteInputStream, key);
} catch (Exception ex) {
Logger.getLogger(AVLLookup.class.getName()).log(Level.INFO, "Can't open db:"+dbFilename);
}
try {
Onion result = new Onion();
if (lookupResult == null) {
result.setValue("len", -1);
} else if (lookupResult.size() < 2) {//just the header returned, but no data found
result.setValue("len", 0);
} else { //data found, lets start the translation
result.setValue("len", lookupResult.size() - 1);
String[] header = lookupResult.get(0).split("\t");
//writing the header
result.setValue("header/size", header.length - 1);
for (int i = 1; i < header.length; i++) {
result.setValue("header/" + header[i], i);
}
for (int lines = 1; lines < lookupResult.size(); lines++) {
String[] line = lookupResult.get(lines).split("\t");
for (int column = 0; column < line.length; column++) {
result.setValue("data/" + Integer.toString(lines) + "/" + Integer.toString(column + 1), line[column]);
}
}
}
Logger.getLogger(AVLLookup.class.getName()).log(Level.INFO,
"AVLLookup lookupt: " + result);
Onion answer = new Onion("" + "{'type':'" + CM_RES_LOOKUP
+ "'," + "'owner':" + "{'name':'" + getPluginName()
+ "'}," + "'replyID':"
+ on.getInt("msgID") + "}");
answer.put("result", result);
replyMsg(msg, answer);
} catch (JSONException ex) {
Logger.getLogger(AVLLookup.class.getName()).log(Level.SEVERE,
null, ex);
}
}
}
}
}