package org.hadatac.console.controllers.triplestore;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.hadatac.console.controllers.AuthApplication;
import org.hadatac.console.views.html.triplestore.*;
import org.hadatac.data.model.ParsingResult;
import org.hadatac.console.controllers.triplestore.routes;
import org.hadatac.console.models.LabKeyLoginForm;
import org.hadatac.console.models.SysUser;
import org.hadatac.metadata.loader.LabkeyDataHandler;
import org.hadatac.metadata.loader.MetadataContext;
import org.hadatac.metadata.loader.SpreadsheetProcessing;
import org.hadatac.metadata.loader.TripleProcessing;
import org.hadatac.utils.ConfigProp;
import org.hadatac.utils.Feedback;
import org.hadatac.utils.NameSpaces;
import org.hadatac.utils.State;
import org.labkey.remoteapi.CommandException;
import be.objectify.deadbolt.java.actions.Group;
import be.objectify.deadbolt.java.actions.Restrict;
import play.Play;
import play.data.Form;
import play.mvc.BodyParser;
import play.mvc.Controller;
import play.mvc.Http.MultipartFormData;
import play.mvc.Http.MultipartFormData.FilePart;
import play.mvc.Result;
public class LoadKB extends Controller {
private static final String UPLOAD_NAME = "tmp/uploads/hasneto-spreadsheet.xls";
private static final String UPLOAD_TURTLE_NAME = "tmp/uploads/turtle.ttl";
@Restrict(@Group(AuthApplication.DATA_MANAGER_ROLE))
public static Result loadKB(String oper) {
return ok(loadKB.render(oper, ""));
}
@Restrict(@Group(AuthApplication.DATA_MANAGER_ROLE))
public static Result postLoadKB(String oper) {
return ok(loadKB.render(oper, ""));
}
public static String playLoadKB(String oper) {
NameSpaces.getInstance();
MetadataContext metadata = new
MetadataContext("user",
"password",
Play.application().configuration().getString("hadatac.solr.triplestore"),
false);
String message = "";
if(oper.equals("turtle")){
message = TripleProcessing.processTTL(Feedback.WEB, oper, metadata, UPLOAD_TURTLE_NAME);
}
else{
message = SpreadsheetProcessing.generateTTL(Feedback.WEB, oper, metadata, UPLOAD_NAME);
}
return message;
}
@Restrict(@Group(AuthApplication.DATA_MANAGER_ROLE))
public static Result playLoadLabkeyDataAcquisition(String oper, String content,
String folder, String study_uri) {
System.out.println(String.format("Batch loading data acquisition from \"/%s\"...", folder));
String user_name = session().get("LabKeyUserName");
String password = session().get("LabKeyPassword");
if (user_name == null || password == null) {
redirect(routes.LoadKB.loadLabkeyKB("init", content));
}
String path = String.format("/%s", folder);
String site = ConfigProp.getPropertyValue("labkey.config", "site");
try {
final SysUser user = AuthApplication.getLocalUser(Controller.session());
String ownerUri = UserManagement.getUriByEmail(user.getEmail());
if (null == ownerUri) {
return badRequest("Cannot find corresponding URI for the current logged in user!");
}
ParsingResult result = TripleProcessing.importDataAcquisition(
site, user_name, password, path, study_uri);
if (result.getStatus() != 0) {
return ok(labkeyLoadingResult.render(folder, oper, content, result.getMessage()));
}
} catch (CommandException e) {
if (e.getMessage().equals("Unauthorized")) {
return ok(syncLabkey.render("login_failed",
routes.LoadKB.playLoadLabkeyFolders("init", content).url(), ""));
}
}
return redirect(org.hadatac.console.controllers.dataacquisitionmanagement.
routes.DataAcquisitionManagement.index(State.ACTIVE));
}
@Restrict(@Group(AuthApplication.DATA_MANAGER_ROLE))
public static Result playLoadLabkeyKB(String oper, String content, String folder,
List<String> list_names) {
System.out.println(String.format("Batch loading metadata from \"/%s\"...", folder));
List<String> final_names = new LinkedList<String>();
String user_name = session().get("LabKeyUserName");
String password = session().get("LabKeyPassword");
if (user_name == null || password == null) {
redirect(routes.LoadKB.loadLabkeyKB("init", content));
}
if(oper.equals("init")){
final_names.addAll(list_names);
}
else if(oper.contains("load")){
if(oper.equals("load_instance_data")){
// get request value from submitted form
Map<String, String[]> name_map = request().body().asFormUrlEncoded();
final_names.addAll(name_map.keySet());
oper = "load";
}
else{
final_names.addAll(list_names);
System.out.println(final_names.size());
}
}
String path = String.format("/%s", folder);
String site = ConfigProp.getPropertyValue("labkey.config", "site");
NameSpaces.getInstance();
MetadataContext metadata = new
MetadataContext("user",
"password",
Play.application().configuration().getString("hadatac.solr.triplestore"),
false);
String message = "";
try {
message = TripleProcessing.generateTTL(Feedback.WEB, oper, metadata,
site, user_name, password, path, final_names);
} catch(CommandException e) {
if(e.getMessage().equals("Unauthorized")){
return ok(syncLabkey.render("login_failed",
routes.LoadKB.playLoadLabkeyFolders("init", content).url(), ""));
}
}
return ok(syncLabkey.render(oper,
routes.LoadKB.playLoadLabkeyFolders("init", content).url(),
message));
}
@Restrict(@Group(AuthApplication.DATA_MANAGER_ROLE))
public static Result playLoadLabkeyListContent(
String oper, String content, String folder, String list_name) {
System.out.println(String.format("Loading data from list \"%s\"...", list_name));
String user_name = session().get("LabKeyUserName");
String password = session().get("LabKeyPassword");
if (user_name == null || password == null) {
redirect(routes.LoadKB.loadLabkeyKB("init", content));
}
String site = ConfigProp.getPropertyValue("labkey.config", "site");
String path = String.format("/%s", folder);
NameSpaces.getInstance();
MetadataContext metadata = new
MetadataContext("user",
"password",
Play.application().configuration().getString("hadatac.solr.triplestore"),
false);
String message = "";
try {
List<String> loading_list = new LinkedList<String>();
loading_list.add(list_name);
message = TripleProcessing.generateTTL(
Feedback.WEB, oper, metadata, site, user_name, password, path, loading_list);
} catch(CommandException e) {
if(e.getMessage().equals("Unauthorized")){
return ok(syncLabkey.render("login_failed",
routes.LoadKB.playLoadLabkeyFolders("init", content).url(), ""));
}
}
return ok(labkeyLoadingResult.render(folder, oper, content, message));
}
@Restrict(@Group(AuthApplication.DATA_MANAGER_ROLE))
public static Result playLoadLabkeyFolders(String oper, String content) {
System.out.println("Looking up LabKey folders...");
String user_name = session().get("LabKeyUserName");
String password = session().get("LabKeyPassword");
if (user_name == null || password == null) {
Form<LabKeyLoginForm> form = Form.form(LabKeyLoginForm.class).bindFromRequest();
user_name = form.get().getUserName();
password = form.get().getPassword();
}
String site = ConfigProp.getPropertyValue("labkey.config", "site");
String path = "/";
List<String> folders = null;
try {
folders = TripleProcessing.getLabKeyFolders(site, user_name, password, path);
if (folders != null) {
folders.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
}
} catch(CommandException e) {
if(e.getMessage().equals("Unauthorized")){
return ok(syncLabkey.render("login_failed",
routes.LoadKB.playLoadLabkeyFolders("init", content).url(), ""));
}
}
session().put("LabKeyUserName", user_name);
session().put("LabKeyPassword", password);
return ok(getLabkeyFolders.render(folders, content));
}
@Restrict(@Group(AuthApplication.DATA_MANAGER_ROLE))
public static Result playLoadLabkeyLists(String folder, String content) {
System.out.println(String.format("Accessing LabKey lists of %s", folder));
String user_name = session().get("LabKeyUserName");
String password = session().get("LabKeyPassword");
if (user_name == null || password == null) {
redirect(routes.LoadKB.loadLabkeyKB("init", "knowledge"));
}
String site = ConfigProp.getPropertyValue("labkey.config", "site");
String path = String.format("/%s", folder);
List<String> retMetadataLists = null;
List<String> retDataLists = null;
try {
if(content.equals("ontology")){
retMetadataLists = TripleProcessing.getLabKeyMetadataLists(site, user_name, password, path);
retMetadataLists.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
}
else if(content.equals("knowledge")){
retDataLists = TripleProcessing.getLabKeyInstanceDataLists(site, user_name, password, path);
retDataLists.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
}
} catch(CommandException e) {
if(e.getMessage().equals("Unauthorized")){
return ok(syncLabkey.render("login_failed",
routes.LoadKB.playLoadLabkeyFolders("init", content).url(), ""));
}
}
return ok(getLabkeyLists.render(folder, content, retMetadataLists, retDataLists));
}
@Restrict(@Group(AuthApplication.DATA_MANAGER_ROLE))
public static Result loadLabkeyKB(String oper, String content) {
if (session().get("LabKeyUserName") == null && session().get("LabKeyPassword") == null) {
return ok(syncLabkey.render(oper,
routes.LoadKB.playLoadLabkeyFolders("init", content).url(), ""));
}
return playLoadLabkeyFolders(oper, content);
}
@Restrict(@Group(AuthApplication.DATA_MANAGER_ROLE))
public static Result postLoadLabkeyKB(String oper, String content) {
return loadLabkeyKB(oper, content);
}
@Restrict(@Group(AuthApplication.DATA_MANAGER_ROLE))
public static Result logInLabkey(String nextCall) {
return ok(syncLabkey.render("init", routes.LoadKB.postLogInLabkey(nextCall).url(), ""));
}
@Restrict(@Group(AuthApplication.DATA_MANAGER_ROLE))
public static Result postLogInLabkey(String nextCall) {
Form<LabKeyLoginForm> form = Form.form(LabKeyLoginForm.class).bindFromRequest();
String site = ConfigProp.getPropertyValue("labkey.config", "site");
String path = "/";
String user_name = form.get().getUserName();
String password = form.get().getPassword();
LabkeyDataHandler loader = new LabkeyDataHandler(
site, user_name, password, path);
try {
loader.checkAuthentication();
session().put("LabKeyUserName", user_name);
session().put("LabKeyPassword", password);
} catch(CommandException e) {
if(e.getMessage().equals("Unauthorized")){
return ok(syncLabkey.render("login_failed",
nextCall, ""));
}
}
return redirect(nextCall);
}
@Restrict(@Group(AuthApplication.DATA_MANAGER_ROLE))
@BodyParser.Of(value = BodyParser.MultipartFormData.class, maxLength = 500 * 1024 * 1024)
public static Result uploadFile(String oper) {
System.out.println("uploadFile CALLED!");
MultipartFormData body = request().body().asMultipartFormData();
FilePart uploadedfile = body.getFile("pic");
if (uploadedfile != null) {
File file = uploadedfile.getFile();
File newFile = new File(UPLOAD_NAME);
InputStream isFile;
try {
isFile = new FileInputStream(file);
byte[] byteFile;
try {
byteFile = IOUtils.toByteArray(isFile);
try {
FileUtils.writeByteArrayToFile(newFile, byteFile);
} catch (Exception e) {
e.printStackTrace();
}
try {
isFile.close();
} catch (Exception e) {
return ok (loadKB.render("fail", "Could not save uploaded file."));
}
} catch (Exception e) {
return ok (loadKB.render("fail", "Could not process uploaded file."));
}
} catch (FileNotFoundException e1) {
return ok (loadKB.render("fail", "Could not find uploaded file"));
}
return ok(loadKB.render(oper, "File uploaded successfully."));
} else {
return ok (loadKB.render("fail", "Error uploading file. Please try again."));
}
}
@Restrict(@Group(AuthApplication.DATA_MANAGER_ROLE))
@BodyParser.Of(value = BodyParser.MultipartFormData.class, maxLength = 500 * 1024 * 1024)
public static Result uploadTurtleFile(String oper) {
System.out.println("uploadTurtleFile CALLED!");
MultipartFormData body = request().body().asMultipartFormData();
FilePart uploadedfile = body.getFile("pic");
if (uploadedfile != null) {
File file = uploadedfile.getFile();
File newFile = new File(UPLOAD_TURTLE_NAME);
InputStream isFile;
try {
isFile = new FileInputStream(file);
byte[] byteFile;
try {
byteFile = IOUtils.toByteArray(isFile);
try {
FileUtils.writeByteArrayToFile(newFile, byteFile);
} catch (Exception e) {
e.printStackTrace();
}
try {
isFile.close();
} catch (Exception e) {
return ok (loadKB.render("fail", "Could not save uploaded file."));
}
} catch (Exception e) {
return ok (loadKB.render("fail", "Could not process uploaded file."));
}
} catch (FileNotFoundException e1) {
return ok (loadKB.render("fail", "Could not find uploaded file"));
}
return ok(loadKB.render("turtle", "File uploaded successfully."));
} else {
return ok (loadKB.render("fail", "Error uploading file. Please try again."));
}
}
}