package org.hadatac.console.controllers.annotator; import java.io.File; import java.io.IOException; import java.io.StringReader; import java.net.URLDecoder; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Properties; import play.Play; import play.mvc.*; import play.mvc.Http.*; import play.mvc.Result; import org.apache.commons.io.FileUtils; import org.hadatac.console.controllers.AuthApplication; import org.hadatac.console.controllers.dataacquisitionsearch.LoadCCSV; import org.hadatac.console.models.CSVAnnotationHandler; import org.hadatac.console.views.html.annotator.*; import org.hadatac.data.api.DataFactory; import org.hadatac.data.loader.ccsv.Parser; import org.hadatac.data.loader.util.Arguments; import org.hadatac.data.loader.util.FileFactory; import org.hadatac.data.model.ParsingResult; import org.hadatac.utils.Feedback; import org.hadatac.utils.NameSpaces; import com.fasterxml.jackson.databind.ObjectMapper; import be.objectify.deadbolt.java.actions.Group; import be.objectify.deadbolt.java.actions.Restrict; public class Downloads extends Controller { /* * Download operations */ public static final String OPER_UPLOAD = "Upload CCSV"; public static final String OPER_CCSV = "Download CCSV"; public static final String OPER_PREAMBLE = "Download Preamble"; public static final String OPER_FINISH = "Finish"; /* * Preamble fragments */ public static final String FRAG_START_PREAMBLE = "== START-PREAMBLE ==\n"; public static final String FRAG_END_PREAMBLE = "== END-PREAMBLE ==\n"; public static final String FRAG_KB_PART1 = "<kb> a hadatac:KnowledgeBase; hadatac:hasHost \""; public static final String FRAG_KB_PART2 = "\"^^xsd:anyURI . \n\n"; public static final String FRAG_DATASET = " a vstoi:Dataset; prov:wasGeneratedBy <"; public static final String FRAG_HAS_MEASUREMENT_TYPE = " hadatac:hasMeasurementType "; public static final String FRAG_MT = "<mt"; public static final String FRAG_MEASUREMENT_TYPE_PART1 = "> a hadatac:MeasurementType; "; public static final String FRAG_MEASUREMENT_TYPE_PART2 = " hadatac:atColumn "; public static final String FRAG_MEASUREMENT_TYPE_PART3 = "; hasneto:hasEntity "; public static final String FRAG_MEASUREMENT_TYPE_PART4 = "; hasneto:hasAttribute "; public static final String FRAG_MEASUREMENT_TYPE_PART5 = "; hasneto:hasUnit "; public static final String FRAG_IN_DATE_TIME = "time:inDateTime"; public static final String FRAG_IN_DATE_TIME_SUFFIX = " <ts0>; "; public static final String FRAG_IN_DATE_TIME_STATEMENT = "<ts0> hadatac:atColumn "; @Restrict(@Group(AuthApplication.DATA_OWNER_ROLE)) public static Result postGenerate(String handler_json) { String oper = ""; RequestBody body = request().body(); if (body == null) { return ok(completeAnnotation.render("Error processing form: form appears to be empty.")); } String textBody = body.asText(); Properties p = new Properties(); try { p.load(new StringReader(textBody)); } catch (Exception e) { e.printStackTrace(); return ok(completeAnnotation.render("Error processing form: form appears to be empty.")); } System.out.println("Selection: " + p.getProperty("submitButton")); if (p.getProperty("submitButton") != null) oper = p.getProperty("submitButton"); if (oper.equals(OPER_FINISH)) { return ok(completeAnnotation.render("Annotation operation finished.")); } String preamble = FRAG_START_PREAMBLE; preamble += NameSpaces.getInstance().printTurtleNameSpaceList(); preamble += "\n"; /* * Insert KB */ preamble += FRAG_KB_PART1; preamble += Play.application().configuration().getString("hadatac.console.kb"); preamble += FRAG_KB_PART2; try { handler_json = URLDecoder.decode(handler_json, "UTF-8"); } catch (Exception e) { e.printStackTrace(); } System.out.println(handler_json); ObjectMapper mapper = new ObjectMapper(); CSVAnnotationHandler handler = null; try { handler = mapper.readValue(handler_json, CSVAnnotationHandler.class); /* * Insert Data Set */ preamble += "<" + DataFactory.getNextURI(DataFactory.DATASET_ABBREV) + ">"; preamble += FRAG_DATASET; preamble += handler.getDataAcquisitionUri() + ">; "; int i = 0; int timeStampIndex = -1; ArrayList<Integer> mt = new ArrayList<Integer>(); for (String str : handler.getFields()) { System.out.println(str); System.out.println("get " + i + "-entity: [" + p.getProperty(i + "-entity") + "]"); System.out.println("get " + i + "-characteristic: [" + p.getProperty(i + "-characteristic") + "]"); System.out.println("get " + i + "-unit: [" + p.getProperty(i + "-unit") + "]"); if ((p.getProperty(i + "-entity") != null) && (!p.getProperty(i + "-entity").equals("")) && (p.getProperty(i + "-characteristic") != null) && (!p.getProperty(i + "-characteristic").equals("")) && (p.getProperty(i + "-unit") != null) && (!p.getProperty(i + "-unit").equals(""))) { if (p.getProperty(i + "-unit").equals(FRAG_IN_DATE_TIME)) { timeStampIndex = i; } else { mt.add(i); } } i++; } preamble += FRAG_HAS_MEASUREMENT_TYPE; int aux = 0; for (Integer mt_count : mt) { preamble += FRAG_MT + aux + "> "; if(aux != (mt.size() - 1)){ preamble += ", "; } aux++; } preamble += ".\n\n"; System.out.println(preamble); /* * Insert measurement types */ aux = 0; for (Integer mt_count : mt) { preamble += FRAG_MT + aux; preamble += FRAG_MEASUREMENT_TYPE_PART1; if (timeStampIndex != -1) { preamble += FRAG_IN_DATE_TIME; preamble += FRAG_IN_DATE_TIME_SUFFIX; } preamble += FRAG_MEASUREMENT_TYPE_PART2; preamble += mt_count; preamble += FRAG_MEASUREMENT_TYPE_PART3; preamble += "<" + p.getProperty(mt_count + "-entity") + ">"; preamble += FRAG_MEASUREMENT_TYPE_PART4; preamble += "<" + p.getProperty(mt_count + "-characteristic") + ">"; preamble += FRAG_MEASUREMENT_TYPE_PART5; preamble += "<" + p.getProperty(mt_count + "-unit") + ">"; preamble += " .\n"; aux++; } if (timeStampIndex != -1) { preamble += "\n"; preamble += FRAG_IN_DATE_TIME_STATEMENT + " " + timeStampIndex + " . \n"; } if (textBody == null) { badRequest("Expecting text/plain request body"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return ok(completeAnnotation.render("Error processing form. Please restart form.")); } preamble += FRAG_END_PREAMBLE; if (oper.equals(OPER_PREAMBLE)) { return ok(preamble).as("text/turtle"); } if (oper.equals(OPER_CCSV)) { File newFile = new File(handler.getDatasetName()); try { preamble += FileUtils.readFileToString(newFile, "UTF-8"); } catch (IOException e) { e.printStackTrace(); return ok(completeAnnotation.render("Error reading cached CSV file. Please restart form.")); } return ok(preamble).as("text/turtle"); } if (oper.equals(OPER_UPLOAD)) { File newFile = new File(handler.getDatasetName()); try { preamble += FileUtils.readFileToString(newFile, "UTF-8"); } catch (IOException e) { e.printStackTrace(); return ok(completeAnnotation.render("Error reading cached CSV file. Please restart form.")); } try { FileUtils.writeStringToFile(new File(LoadCCSV.UPLOAD_NAME), preamble); } catch (IOException e) { e.printStackTrace(); return ok(completeAnnotation.render("Error aving CCSV file locally. Please restart form.")); } ParsingResult result = LoadCCSV.playLoadCCSV(); return ok(completeAnnotation.render(result.getMessage())); } return ok(completeAnnotation.render("Error processing form: unspecified download operation.")); } }