package de.uni_luebeck.inb.krabbenhoeft.eQTL.server;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.rosuda.JRI.REXP;
import org.rosuda.JRI.RMainLoopCallbacks;
import org.rosuda.JRI.Rengine;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.entities.ColumnForDataSetLayer;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.entities.HajoEntity;
public class RSingleton {
private static RSingleton singleton;
private Rengine rEngine;
public synchronized static RSingleton instance() {
if (singleton == null)
singleton = new RSingleton();
return singleton;
}
StringBuilder consoleOutput = new StringBuilder();
private RSingleton() {
if (!Rengine.versionCheck())
throw new RuntimeException("Rengine.versionCheck() failed");
rEngine = new Rengine(new String[] { "--vanilla" }, false, new CB());
if (!rEngine.waitForR())
throw new RuntimeException("Rengine.waitForR() failed");
}
public void clearConsoleOutput() {
consoleOutput.setLength(0);
}
public String getConsoleOutput() {
return consoleOutput.toString();
}
public void assingData(List<ColumnForDataSetLayer> columns, Iterator<HajoEntity> entities) {
Map<String, List<String>> col2list = new HashMap<String, List<String>>();
for (ColumnForDataSetLayer col : columns) {
col2list.put(col.getName(), new ArrayList<String>());
}
List<String> rowNames = new ArrayList<String>();
int count = 1000;
int counter = 0;
while (entities.hasNext() && count-- > 0) {
final HajoEntity entity = entities.next();
for (ColumnForDataSetLayer col : columns) {
final List<String> list = col2list.get(col.getName());
switch (col.getType()) {
case Category:
list.add(entity.getCategory(col.getName()).getCategory());
break;
case Name:
list.add(entity.getName(col.getName()));
break;
case Location:
list.add(Long.toString(entity.getLocation(col.getName())));
break;
case Numerical:
list.add(Double.toString(entity.getNumerical(col.getName())));
break;
}
}
rowNames.add(Integer.toString(counter++));
}
String[] names = new String[columns.size()];
long[] refs = new long[columns.size()];
for (int i = 0; i < columns.size(); i++) {
final String colname = columns.get(i).getName();
final List<String> list = col2list.get(colname);
names[i] = colname;
refs[i] = rEngine.rniPutStringArray(list.toArray(new String[0]));
}
long vec = rEngine.rniPutVector(refs);
long nameRef = rEngine.rniPutStringArray(names);
rEngine.rniSetAttr(vec, "names", nameRef);
long rowNameRef = rEngine.rniPutStringArray(rowNames.toArray(new String[0]));
rEngine.rniSetAttr(vec, "row.names", rowNameRef);
rEngine.rniSetAttr(vec, "class", rEngine.rniPutString("data.frame"));
rEngine.rniAssign("data", vec, 0);
}
public void eval(String evalMe) {
consoleOutput.append("> ");
consoleOutput.append(evalMe);
consoleOutput.append("\n");
final REXP eval = rEngine.eval(evalMe);
if (eval != null)
rEngine.rniPrintValue(eval.xp);
consoleOutput.append("\n");
}
class CB implements RMainLoopCallbacks {
public void rBusy(Rengine arg0, int arg1) {
}
public String rChooseFile(Rengine arg0, int arg1) {
return null;
}
public void rFlushConsole(Rengine arg0) {
}
public void rLoadHistory(Rengine arg0, String arg1) {
}
public String rReadConsole(Rengine arg0, String arg1, int arg2) {
return null;
}
public void rSaveHistory(Rengine arg0, String arg1) {
}
public void rShowMessage(Rengine arg0, String arg1) {
consoleOutput.append(arg1);
}
public void rWriteConsole(Rengine arg0, String arg1, int arg2) {
consoleOutput.append(arg1);
}
}
}