package services;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.text.ParseException;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import matrix.DataMatrixInstance;
import matrix.general.DataMatrixHandler;
import org.apache.log4j.Logger;
import org.molgenis.data.Data;
import org.molgenis.framework.db.Database;
import org.molgenis.framework.db.DatabaseException;
import org.molgenis.framework.db.QueryRule;
import org.molgenis.framework.db.QueryRule.Operator;
import org.molgenis.framework.server.MolgenisContext;
import org.molgenis.framework.server.MolgenisRequest;
import org.molgenis.framework.server.MolgenisResponse;
import org.molgenis.framework.server.MolgenisService;
import org.molgenis.framework.ui.ApplicationController;
import plugins.matrix.manager.MatrixManager;
/**
* Serves static files such as images, css files and javascript from classpath.
* This is servlet is used when serving from a Jar file in the Mortbay server.
* Using tomcat the static serving is left to the container.
*/
public class downloadmatrixascsv implements MolgenisService
{
private MolgenisContext mc;
public downloadmatrixascsv(MolgenisContext mc)
{
this.mc = mc;
}
private static Logger logger = Logger.getLogger(downloadmatrixascsv.class);
@Override
public void handleRequest(MolgenisRequest request, MolgenisResponse response) throws ParseException,
DatabaseException, IOException
{
// OutputStream out = response.getOutputStream();
OutputStream out = response.getResponse().getOutputStream();
PrintStream p = new PrintStream(new BufferedOutputStream(out), false, "UTF8");
response.getResponse().setStatus(HttpServletResponse.SC_OK);
boolean databaseIsAvailable = false;
Database db = null;
String content = "";
try
{
db = request.getDatabase();
databaseIsAvailable = true;
}
catch (Exception e)
{
content += "Database unavailable.";
content += e.getStackTrace();
}
if (databaseIsAvailable)
{
try
{
// special exception for filtered content: get matrix instance
// from memory and do complete handle
if (request.getString("id").equals("inmemory"))
{
ApplicationController molgenis = (ApplicationController) request.getRequest().getSession()
.getAttribute("application");
content = ((DataMatrixInstance) molgenis.sessionVariables.get(MatrixManager.SESSION_MATRIX_DATA))
.toString();
response.getResponse().setContentLength(content.length());
p.print(content);
p.flush();
p.close();
return;
}
int matrixId = request.getInt("id");
QueryRule q = new QueryRule("id", Operator.EQUALS, matrixId);
Data data = db.find(Data.class, q).get(0);
DataMatrixHandler dmh = new DataMatrixHandler(db);
DataMatrixInstance instance = dmh.createInstance(data, db);
if (request.getString("download").equals("all"))
{
if (request.getString("stream").equals("true"))
{
// content += instance.toString();
instance.toPrintStream(p);
p.close();
return;
}
else if (request.getString("stream").equals("false"))
{
content += instance.toString();
}
else
{
content += displayUsage(db);
}
}
else if (request.getString("download").equals("some"))
{
int colOffset = request.getInt("coff");
int colLimit = request.getInt("clim");
int rowOffset = request.getInt("roff");
int rowLimit = request.getInt("rlim");
if (request.getString("stream").equals("true"))
{
content += instance.getSubMatrixByOffset(rowOffset, rowLimit, colOffset, colLimit).toString();
}
else if (request.getString("stream").equals("false"))
{
content += instance.getSubMatrixByOffset(rowOffset, rowLimit, colOffset, colLimit).toString();
}
else
{
content += displayUsage(db);
}
}
else
{
content += displayUsage(db);
}
logger.info("serving " + request.getRequest().getRequestURI());
}
catch (Exception e)
{
content += displayUsage(db);
content += "\n\n";
content += e.getStackTrace();
}
}
response.getResponse().setContentLength(content.length());
p.print(content);
p.flush();
p.close();
}
public String displayUsage(Database db)
{
String usage = "Usage:"
+ "\n\n"
+ "Full matrix, streamed output:\n"
+ "http://localhost:8080/xgap/downloadmatrixascsv?id=58342&download=all&stream=true"
+ "\n\n"
+ "Full matrix, buffered output:\n"
+ "http://localhost:8080/xgap/downloadmatrixascsv?id=58342&download=all&stream=false"
+ "\n\n"
+ "Only first element of matrix (top left):\n"
+ "http://localhost:8080/xgap/downloadmatrixascsv?id=58342&download=some&coff=0&clim=1&roff=0&rlim=1&stream=true"
+ "\n\n"
+ "6 by 15 submatrix with a row offset of 20 and a column offset of 5:\n"
+ "http://localhost:8080/xgap/downloadmatrixascsv?id=58342&download=some&coff=5&clim=6&roff=20&rlim=15&stream=true"
+ "\n\n" + "Matrices available in this database:\n\n" + matricesFromDb(db) + "\n";
return usage;
}
public String matricesFromDb(Database db)
{
String res = "";
try
{
List<Data> dataList = db.find(Data.class);
for (Data d : dataList)
{
res += d.toString() + "\n";
}
}
catch (Exception e)
{
res += "Trying to get matrix information, but database is unavailable.";
res += e.getStackTrace();
}
return res;
}
}