diff --git a/docker/config/application.tmpl b/docker/config/application.tmpl index 0856eacbe4e8bbb2f9137d8df71c30c64f7bc342..5f9ea27f9885a3c518cb6fed0b418276012470ea 100644 --- a/docker/config/application.tmpl +++ b/docker/config/application.tmpl @@ -89,3 +89,4 @@ endpoints: services: exareme: miningExaremeUrl: {{ default .Env.EXAREME_URL "http://localhost:9090" }}/mining/query + algorithmsUrl: {{ default .Env.EXAREME_URL "http://localhost:9090" }}/mining/algorithms.json \ No newline at end of file diff --git a/pom.xml b/pom.xml index 324ed29fd331b76639d29f5bf5275dd1b464a7eb..3eaee9e5450619fc03fc151aab8268cf662dc9f0 100644 --- a/pom.xml +++ b/pom.xml @@ -293,6 +293,11 @@ <version>${scala.release.version}</version> <scope>compile</scope> </dependency> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt</artifactId> + <version>0.9.1</version> + </dependency> </dependencies> <build> diff --git a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java index caa8ea97be33dbb6773754c6ce37c6f2a609094e..fba15a4f834083e101ecbcb5b28fe77f2e199c8b 100644 --- a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java +++ b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java @@ -25,18 +25,14 @@ import scala.concurrent.ExecutionContext; import scala.concurrent.Future; import java.io.IOException; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import java.util.UUID; - +import java.util.*; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; /** * Created by habfast on 21/04/16. */ @RestController -@RequestMapping(value = "/experiments", produces = {APPLICATION_JSON_VALUE}) +@RequestMapping(value = "/experiments", produces = { APPLICATION_JSON_VALUE }) @Api(value = "/experiments", description = "the experiments API") public class ExperimentApi extends WokenClientController { @@ -44,11 +40,8 @@ public class ExperimentApi extends WokenClientController { private static final Gson gson = new Gson(); - private static final Gson gsonOnlyExposed = new GsonBuilder() - .serializeNulls() - .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") - .excludeFieldsWithoutExposeAnnotation() - .create(); + private static final Gson gsonOnlyExposed = new GsonBuilder().serializeNulls() + .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").excludeFieldsWithoutExposeAnnotation().create(); @Value("#{'${services.exareme.miningExaremeUrl:http://localhost:9090/mining/query}'}") public String miningExaremeQueryUrl; @@ -67,33 +60,30 @@ public class ExperimentApi extends WokenClientController { public ResponseEntity<String> runExperiment(@RequestBody ExperimentQuery expQuery) { LOGGER.info("Run an experiment"); - Experiment experiment = new Experiment(); - experiment.setUuid(UUID.randomUUID()); - User user = userInfo.getUser(); + Experiment experiment = saveExperiment(expQuery); + sendExperiment(experiment); - experiment.setAlgorithms(gson.toJson(expQuery.getAlgorithms())); - experiment.setValidations(gson.toJson(expQuery.getValidations())); - experiment.setName(expQuery.getName()); - experiment.setCreatedBy(user); - experiment.setModel(modelRepository.findOne(expQuery.getModel())); - experimentRepository.save(experiment); + return new ResponseEntity<>(gsonOnlyExposed.toJson(experiment.jsonify()), HttpStatus.OK); + } - LOGGER.info("Experiment saved"); + @ApiOperation(value = "Create an experiment on Exareme", response = Experiment.class) + @RequestMapping(value = "/exareme", method = RequestMethod.POST) + public ResponseEntity<String> runExaremeExperiment(@RequestBody ExperimentQuery expQuery) { + LOGGER.info("sendExaremeExperiment"); - if (!experiment.isExaremeAlgorithm()._1) { - sendExperiment(experiment); - } else { - String algoCode = expQuery.getAlgorithms().get(0).getCode(); - List<AlgorithmParam> params = expQuery.getAlgorithms().get(0).getParameters(); - sendExaremeExperiment(experiment, algoCode, params); - } + Experiment experiment = saveExperiment(expQuery); + + String algoCode = expQuery.getAlgorithms().get(0).getCode(); + List<AlgorithmParam> params = expQuery.getAlgorithms().get(0).getParameters(); + sendExaremeExperiment(experiment, algoCode, params); return new ResponseEntity<>(gsonOnlyExposed.toJson(experiment.jsonify()), HttpStatus.OK); } @ApiOperation(value = "get an experiment", response = Experiment.class) @RequestMapping(value = "/{uuid}", method = RequestMethod.GET) - public ResponseEntity<String> getExperiment(@ApiParam(value = "uuid", required = true) @PathVariable("uuid") String uuid) { + public ResponseEntity<String> getExperiment( + @ApiParam(value = "uuid", required = true) @PathVariable("uuid") String uuid) { LOGGER.info("Get an experiment"); Experiment experiment; @@ -117,7 +107,8 @@ public class ExperimentApi extends WokenClientController { @ApiOperation(value = "Mark an experiment as viewed", response = Experiment.class) @RequestMapping(value = "/{uuid}/markAsViewed", method = RequestMethod.GET) - public ResponseEntity<String> markExperimentAsViewed(@ApiParam(value = "uuid", required = true) @PathVariable("uuid") String uuid) { + public ResponseEntity<String> markExperimentAsViewed( + @ApiParam(value = "uuid", required = true) @PathVariable("uuid") String uuid) { LOGGER.info("Mark an experiment as viewed"); Experiment experiment; @@ -144,7 +135,8 @@ public class ExperimentApi extends WokenClientController { @ApiOperation(value = "Mark an experiment as shared", response = Experiment.class) @RequestMapping(value = "/{uuid}/markAsShared", method = RequestMethod.GET) - public ResponseEntity<String> markExperimentAsShared(@ApiParam(value = "uuid", required = true) @PathVariable("uuid") String uuid) { + public ResponseEntity<String> markExperimentAsShared( + @ApiParam(value = "uuid", required = true) @PathVariable("uuid") String uuid) { LOGGER.info("Mark an experiment as shared"); return doMarkExperimentAsShared(uuid, true); @@ -152,72 +144,62 @@ public class ExperimentApi extends WokenClientController { @ApiOperation(value = "Mark an experiment as unshared", response = Experiment.class) @RequestMapping(value = "/{uuid}/markAsUnshared", method = RequestMethod.GET) - public ResponseEntity<String> markExperimentAsUnshared(@ApiParam(value = "uuid", required = true) @PathVariable("uuid") String uuid) { + public ResponseEntity<String> markExperimentAsUnshared( + @ApiParam(value = "uuid", required = true) @PathVariable("uuid") String uuid) { LOGGER.info("Mark an experiment as unshared"); return doMarkExperimentAsShared(uuid, false); } @ApiOperation(value = "list experiments", response = Experiment.class, responseContainer = "List") - @RequestMapping(method = RequestMethod.GET, params = {"maxResultCount"}) + @RequestMapping(method = RequestMethod.GET, params = { "maxResultCount" }) public ResponseEntity<String> listExperiments( - @ApiParam(value = "maxResultCount") @RequestParam int maxResultCount - ) { + @ApiParam(value = "maxResultCount") @RequestParam int maxResultCount) { LOGGER.info("List experiments"); return doListExperiments(false, null); } @ApiOperation(value = "list experiments", response = Experiment.class, responseContainer = "List") - @RequestMapping(method = RequestMethod.GET, params = {"slug", "maxResultCount"}) - public ResponseEntity<String> listExperiments( - @ApiParam(value = "slug") @RequestParam("slug") String modelSlug, - @ApiParam(value = "maxResultCount") @RequestParam("maxResultCount") int maxResultCount - ) { + @RequestMapping(method = RequestMethod.GET, params = { "slug", "maxResultCount" }) + public ResponseEntity<String> listExperiments(@ApiParam(value = "slug") @RequestParam("slug") String modelSlug, + @ApiParam(value = "maxResultCount") @RequestParam("maxResultCount") int maxResultCount) { LOGGER.info("List experiments"); if (maxResultCount <= 0 && (modelSlug == null || "".equals(modelSlug))) { - return new ResponseEntity<>("You must provide at least a slug or a limit of result", HttpStatus.BAD_REQUEST); + return new ResponseEntity<>("You must provide at least a slug or a limit of result", + HttpStatus.BAD_REQUEST); } return doListExperiments(false, modelSlug); } @ApiOperation(value = "list my experiments", response = Experiment.class, responseContainer = "List") - @RequestMapping(method = RequestMethod.GET, params = {"mine"}) - public ResponseEntity<String> listMyExperiments( - @ApiParam(value = "mine") @RequestParam("mine") boolean mine - ) { + @RequestMapping(method = RequestMethod.GET, params = { "mine" }) + public ResponseEntity<String> listMyExperiments(@ApiParam(value = "mine") @RequestParam("mine") boolean mine) { LOGGER.info("List my experiments"); return doListExperiments(true, null); } - - private ResponseEntity<String> doListExperiments( - boolean mine, - String modelSlug - ) { + private ResponseEntity<String> doListExperiments(boolean mine, String modelSlug) { User user = userInfo.getUser(); Iterable<Experiment> myExperiments = experimentRepository.findByCreatedBy(user); List<Experiment> expList = Lists.newLinkedList(myExperiments); - if(!mine) - { + if (!mine) { Iterable<Experiment> sharedExperiments = experimentRepository.findByShared(true); List<Experiment> sharedExpList = Lists.newLinkedList(sharedExperiments); expList.addAll(sharedExpList); } if (modelSlug != null && !"".equals(modelSlug)) { - for(Iterator<Experiment> it = expList.iterator(); it.hasNext();) - { + for (Iterator<Experiment> it = expList.iterator(); it.hasNext();) { Experiment e = it.next(); e.setResult(null); e.setAlgorithms(null); e.setValidations(null); - if(!e.getModel().getSlug().equals(modelSlug)) - { + if (!e.getModel().getSlug().equals(modelSlug)) { it.remove(); } } @@ -255,10 +237,11 @@ public class ExperimentApi extends WokenClientController { User user = userInfo.getUser(); // this runs in the background. For future optimization: use a thread pool - final ch.chuv.lren.woken.messages.query.ExperimentQuery experimentQuery = experiment.prepareQuery(user.getUsername()); + final ch.chuv.lren.woken.messages.query.ExperimentQuery experimentQuery = experiment + .prepareQuery(user.getUsername()); final ExecutionContext ec = getExecutor(); - Future<Object> response = sendWokenQuery(experimentQuery, 24*3600); + Future<Object> response = sendWokenQuery(experimentQuery, 24 * 3600); response.onSuccess(new OnSuccess<Object>() { public void onSuccess(Object result) { QueryResult queryResult = (QueryResult) result; @@ -282,11 +265,18 @@ public class ExperimentApi extends WokenClientController { }, ec); } - private void sendExaremeExperiment(Experiment experiment, String algoCode, List <AlgorithmParam> params) { - // >> Temporary: we should integrate exareme in a proper way in the future + private void sendExaremeExperiment(Experiment experiment, String algoCode, List<AlgorithmParam> params) { // this runs in the background. For future optimization: use a thread pool new Thread(() -> { - String query = experiment.computeExaremeQuery(params); + List<HashMap<String, String>> queryList = new ArrayList<HashMap<String, String>>(); + + if (params != null) { + for (AlgorithmParam p : params) { + queryList.add(makeObject(p.getName(), p.getValue())); + } + } + + String query = gson.toJson(queryList); String url = miningExaremeQueryUrl + "/" + algoCode; // Results are stored in the experiment object @@ -305,14 +295,40 @@ public class ExperimentApi extends WokenClientController { } finishExperiment(experiment); }).start(); - // << Temporary } - private void finishExperiment(Experiment experiment) - { + private void finishExperiment(Experiment experiment) { experiment.setFinished(new Date()); experimentRepository.save(experiment); LOGGER.info("Experiment updated (finished)"); } + + private HashMap<String, String> makeObject(String name, String value) { + HashMap<String, String> o = new HashMap<String, String>(); + o.put("name", name); + o.put("value", value); + + return o; + } + + private Experiment saveExperiment(ExperimentQuery expQuery) { + LOGGER.info("sendExaremeExperiment"); + + Experiment experiment = new Experiment(); + experiment.setUuid(UUID.randomUUID()); + User user = userInfo.getUser(); + + experiment.setAlgorithms(gson.toJson(expQuery.getAlgorithms())); + experiment.setValidations(gson.toJson(expQuery.getValidations())); + experiment.setName(expQuery.getName()); + experiment.setCreatedBy(user); + experiment.setModel(modelRepository.findOne(expQuery.getModel())); + experimentRepository.save(experiment); + + LOGGER.info("Experiment saved"); + + return experiment; + } + } diff --git a/src/main/java/eu/hbp/mip/controllers/JWTApi.java b/src/main/java/eu/hbp/mip/controllers/JWTApi.java new file mode 100644 index 0000000000000000000000000000000000000000..4073a58e288d546172dd2165598662c93af8ff4b --- /dev/null +++ b/src/main/java/eu/hbp/mip/controllers/JWTApi.java @@ -0,0 +1,59 @@ +package eu.hbp.mip.controllers; + +import static org.springframework.http.MediaType.TEXT_PLAIN_VALUE; +import java.security.Key; +import java.util.Date; +import javax.crypto.spec.SecretKeySpec; +import javax.xml.bind.DatatypeConverter; +import eu.hbp.mip.model.UserInfo; +import org.slf4j.Logger; +import eu.hbp.mip.model.User; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import io.jsonwebtoken.*; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; + +@RestController +@RequestMapping(value = "/jwt", produces = { TEXT_PLAIN_VALUE }) +@Api(value = "/jwt", description = "the jwt API") +public class JWTApi { + + private static final Logger LOGGER = LoggerFactory.getLogger(JWTApi.class); + + @Autowired + private UserInfo userInfo; + + @ApiOperation(value = "Create a JSON Web Token", response = String.class) + @RequestMapping(method = RequestMethod.POST) + public ResponseEntity<String> createJWT() { + + LOGGER.info("Create a JSON Web Token"); + + // SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; + // String apiKey = "6v2oxpJMzU14U-dqVireln5AUKTtx5fBPSEgaBZiI983d98cfa6"; + // byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(apiKey); + // Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); + + long nowMillis = System.currentTimeMillis(); + Date now = new Date(nowMillis); + + User user = userInfo.getUser(); + + // Set the JWT Claims + JwtBuilder builder = Jwts.builder().setIssuedAt(now).setIssuer("mip.humanbrainproject.eu") + .setSubject(user.getEmail()).signWith(SignatureAlgorithm.HS512, + "hbpSecret"); + + String token = builder.compact(); + LOGGER.info(token); + // long expMillis = nowMillis + 86400 * 24; + // Date exp = new Date(expMillis); + // builder.setExpiration(exp); + + return ResponseEntity.status(HttpStatus.CREATED).body(token); + } +} \ No newline at end of file diff --git a/src/main/java/eu/hbp/mip/controllers/MethodsApi.java b/src/main/java/eu/hbp/mip/controllers/MethodsApi.java index b275f889d2f955a8b52cdf25dde3696789a0274c..21d3b9f2f852828df49dd81c4ec85fcecbe8e80c 100644 --- a/src/main/java/eu/hbp/mip/controllers/MethodsApi.java +++ b/src/main/java/eu/hbp/mip/controllers/MethodsApi.java @@ -12,14 +12,14 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; +import eu.hbp.mip.utils.HTTPUtil; +import org.springframework.beans.factory.annotation.Value; +import java.io.IOException; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @RestController -@RequestMapping(value = "/methods", produces = {APPLICATION_JSON_VALUE}) +@RequestMapping(value = "/methods", produces = { APPLICATION_JSON_VALUE }) @Api(value = "/methods", description = "the methods API") public class MethodsApi extends WokenClientController { @@ -27,7 +27,8 @@ public class MethodsApi extends WokenClientController { private static final Gson gson = new Gson(); - private static final String EXAREME_ALGO_JSON_FILE="data/exareme_algorithms.json"; + @Value("#{'${services.exareme.algorithmsUrl:http://localhost:9090/mining/algorithms.json}'}") + private String exaremeAlgorithmsUrl; @ApiOperation(value = "List available methods and validations", response = String.class) @Cacheable(value = "methods", unless = "#result.getStatusCode().value()!=200") @@ -37,19 +38,28 @@ public class MethodsApi extends WokenClientController { return requestWoken(MethodsQuery$.MODULE$, 10, r -> { MethodsResponse result = (MethodsResponse) r; - - // >> Temporary : should return result.methods() in the future JsonObject catalog = new JsonParser().parse(result.methods().compactPrint()).getAsJsonObject(); - InputStream is = MethodsApi.class.getClassLoader().getResourceAsStream(EXAREME_ALGO_JSON_FILE); - InputStreamReader isr = new InputStreamReader(is); - BufferedReader br = new BufferedReader(isr); - JsonElement element = new JsonParser().parse(br); - JsonArray exaremeAlgo = element.getAsJsonArray(); - catalog.get("algorithms").getAsJsonArray().addAll(exaremeAlgo); - // << Temporary return ResponseEntity.ok(gson.toJson(catalog)); }); } + @ApiOperation(value = "List Exareme algorithms and validations", response = String.class) + @Cacheable(value = "exareme", unless = "#result.getStatusCode().value()!=200") + @RequestMapping(value = "/exareme", method = RequestMethod.GET) + public ResponseEntity<Object> getExaremeAlgorithms() { + LOGGER.info("List Exareme algorithms and validations"); + + try { + StringBuilder response = new StringBuilder(); + HTTPUtil.sendGet(exaremeAlgorithmsUrl, response); + JsonElement element = new JsonParser().parse(response.toString()); + + return ResponseEntity.ok(gson.toJson(element)); + } catch (IOException e) { + return ResponseEntity.status(500).body(e.getMessage()); + } + + } + } diff --git a/src/main/java/eu/hbp/mip/controllers/MiningApi.java b/src/main/java/eu/hbp/mip/controllers/MiningApi.java index bf89261eb14fab25a0adf5bf7dd3e07ff43235e6..24356234ea7467c873b902830f37fa46b78a5c17 100644 --- a/src/main/java/eu/hbp/mip/controllers/MiningApi.java +++ b/src/main/java/eu/hbp/mip/controllers/MiningApi.java @@ -38,9 +38,6 @@ public class MiningApi extends WokenClientController { @Autowired private UserInfo userInfo; - @Value("#{'${services.query.miningExaremeUrl:http://localhost:9090/mining/query}'}") - public String queryUrl; - @ApiOperation(value = "Run an algorithm", response = String.class) @Cacheable(value = "mining", condition = "#query != null and (#query.getAlgorithm().getCode() == 'histograms' or #query.getAlgorithm().getCode() == 'histograms')", diff --git a/src/main/java/eu/hbp/mip/model/AlgorithmParam.java b/src/main/java/eu/hbp/mip/model/AlgorithmParam.java index e4e5eac8ddcb77ea6e5c4af7837af547c2ba6efd..62c48ba13b4cffcf647d4da97a0509735f18cac4 100644 --- a/src/main/java/eu/hbp/mip/model/AlgorithmParam.java +++ b/src/main/java/eu/hbp/mip/model/AlgorithmParam.java @@ -11,6 +11,15 @@ public class AlgorithmParam { public String getCode() { return code; + + } + + public void setName(String name) { + this.code = name; + } + + public String getName() { + return this.code; } public void setCode(String code) { diff --git a/src/main/java/eu/hbp/mip/model/ExaremeQueryElement.java b/src/main/java/eu/hbp/mip/model/ExaremeQueryElement.java deleted file mode 100644 index 0b7005c19dd985d4ae639768053df2c61f836ac7..0000000000000000000000000000000000000000 --- a/src/main/java/eu/hbp/mip/model/ExaremeQueryElement.java +++ /dev/null @@ -1,43 +0,0 @@ -package eu.hbp.mip.model; - -import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.annotations.ApiModel; - -/** - * Created by mirco on 20.06.16. - */ - -@ApiModel -@JsonInclude(JsonInclude.Include.NON_NULL) -public class ExaremeQueryElement { - - private String name; - - private String desc; - - private String value; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDesc() { - return desc; - } - - public void setDesc(String desc) { - this.desc = desc; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } -} diff --git a/src/main/java/eu/hbp/mip/model/Experiment.java b/src/main/java/eu/hbp/mip/model/Experiment.java index 8f4dd0a347a7e595742de1a0b9702163d4a0819b..e2def32c37b446fde76ca609792569036b8b22e6 100644 --- a/src/main/java/eu/hbp/mip/model/Experiment.java +++ b/src/main/java/eu/hbp/mip/model/Experiment.java @@ -19,7 +19,6 @@ import scala.collection.JavaConversions; import javax.persistence.*; import java.lang.reflect.Type; import java.util.*; -import scala.Tuple2; /** * Created by habfast on 21/04/16. @@ -28,12 +27,6 @@ import scala.Tuple2; @Table(name = "`experiment`") public class Experiment { - public static final String WP_K_MEANS = "K_MEANS"; - public static final String WP_LINEAR_REGRESSION = "WP_LINEAR_REGRESSION"; - public static final String WP_VARIABLES_HISTOGRAM = "WP_VARIABLES_HISTOGRAM"; - public static final String WP_REGRESSION_TREE = "PIPELINE_ISOUP_REGRESSION_TREE_SERIALIZER"; - public static final String WP_MODEL_TREE = "PIPELINE_ISOUP_MODEL_TREE_SERIALIZER"; - private static final Logger LOGGER = LoggerFactory.getLogger(Experiment.class); private static final Gson gson = new Gson(); @@ -137,159 +130,9 @@ public class Experiment { validationsSeq, Option.empty()); } - private String chainsParams(List<String> params, String operator) { - StringBuilder sb = new StringBuilder(); - int i = 0; - for (String s : params) - { - i++; - sb.append(s); - if (i < params.size()) { - sb.append(operator); - } - } - return sb.toString(); - } - - public String computeExaremeQuery(List<AlgorithmParam> params) { - List<ExaremeQueryElement> queryElements = new LinkedList<>(); - - // parameters - String design = ""; // TODO: don't assign to a global - String nobuckets = ""; - - if (params != null) { - for (AlgorithmParam p : params) - { - ExaremeQueryElement paramEl = new ExaremeQueryElement(); - paramEl.setName(p.getCode()); - paramEl.setDesc(""); - paramEl.setValue(p.getValue()); - queryElements.add(paramEl); - - if (p.getCode().equals("design")) { - design = p.getValue(); - } - - if (p.getCode().equals("nobuckets")) { - nobuckets = p.getValue(); - } - } - } - - List<String> variables = new ArrayList<>(); - List<String> covariables = new ArrayList<>(); - List<String> groupings = new ArrayList<>(); - - for (Variable var : model.getQuery().getVariables()) { variables.add(var.getCode()); } - for (Variable var : model.getQuery().getCovariables()) { covariables.add(var.getCode()); } - for (Variable var : model.getQuery().getGrouping()) { groupings.add(var.getCode()); } - - // Set algorithm specific queries - String algoName = this.isExaremeAlgorithm()._2; - if (algoName.equals(WP_K_MEANS)) { - // columns - List<String> columns = variables; - columns.addAll(covariables); - columns.addAll(groupings); - - ExaremeQueryElement columnsEl = new ExaremeQueryElement(); - columnsEl.setName("columns"); - columnsEl.setDesc(""); - columnsEl.setValue(chainsParams(columns, ",")); - queryElements.add(columnsEl); - } else if (algoName.equals(WP_LINEAR_REGRESSION)) { - List<String> nominals = covariables.isEmpty() ? groupings : covariables; - nominals.addAll(groupings); - - String operator = design.equals("factorial") ? "*" : "+"; - - ExaremeQueryElement xEl = new ExaremeQueryElement(); - xEl.setName("x"); - xEl.setDesc(""); - xEl.setValue(chainsParams(nominals, operator)); - queryElements.add(xEl); - - ExaremeQueryElement yEl = new ExaremeQueryElement(); - yEl.setName("y"); - yEl.setDesc(""); - yEl.setValue(chainsParams(variables, ",")); - queryElements.add(yEl); - } else if (algoName.equals(WP_VARIABLES_HISTOGRAM)) { - List<String> column1 = variables; - ExaremeQueryElement columnsEl = new ExaremeQueryElement(); - columnsEl.setName("column1"); - columnsEl.setDesc(""); - columnsEl.setValue(chainsParams(column1, ",")); - queryElements.add(columnsEl); - - List<String> column2 = covariables.isEmpty() ? groupings : covariables; - ExaremeQueryElement columnsEl2 = new ExaremeQueryElement(); - columnsEl2.setName("column2"); - columnsEl2.setDesc(""); - columnsEl2.setValue(chainsParams(column2, ",")); - queryElements.add(columnsEl2); - - if (!nobuckets.isEmpty()) { - ExaremeQueryElement columnsEl3 = new ExaremeQueryElement(); - columnsEl3.setName("nobuckets"); - columnsEl3.setDesc(""); - columnsEl3.setValue(nobuckets); - queryElements.add(columnsEl3); - } - } else if (algoName.equals(WP_REGRESSION_TREE) || algoName.equals(WP_MODEL_TREE)) { - List<String> target = variables; - List<String> descriptive = covariables.isEmpty() ? groupings : covariables; - descriptive.addAll(groupings); - - ExaremeQueryElement xEl = new ExaremeQueryElement(); - xEl.setName("target_attributes"); - xEl.setDesc(""); - xEl.setValue(chainsParams(target, ",")); - queryElements.add(xEl); - - ExaremeQueryElement yEl = new ExaremeQueryElement(); - yEl.setName("descriptive_attributes"); - yEl.setDesc(""); - yEl.setValue(chainsParams(descriptive, ",")); - queryElements.add(yEl); - } - - // datasets - StringBuilder datasets = new StringBuilder(); - List<Variable> trainingDatasets = model.getQuery().getTrainingDatasets(); - int j = 0; - for (Variable var : trainingDatasets) - { - j++; - datasets.append(var.getCode()); - if (j < trainingDatasets.size() ) { - datasets.append(","); - } - } - - ExaremeQueryElement datasetsEl = new ExaremeQueryElement(); - datasetsEl.setName("dataset"); - datasetsEl.setDesc(""); - // datasetsEl.setValue("adni,ppmi,edsd,fbf,clm"); - datasetsEl.setValue(datasets.toString()); - queryElements.add(datasetsEl); - - // filter - String filter = model.getQuery().getFilters(); - ExaremeQueryElement filterEl = new ExaremeQueryElement(); - filterEl.setName("filter"); - filterEl.setDesc(""); - filterEl.setValue(filter); - queryElements.add(filterEl); - - return gson.toJson(queryElements); - } - public JsonObject jsonify() { JsonObject exp = gson.toJsonTree(this).getAsJsonObject(); JsonParser parser = new JsonParser(); - Tuple2<Boolean, String> isExaremeAlgorithm = this.isExaremeAlgorithm(); if (this.algorithms != null) { @@ -308,45 +151,9 @@ public class Experiment { if (this.result != null && !this.hasServerError) { exp.remove("result"); - if (!isExaremeAlgorithm._1) { - JsonElement jsonResult = parser.parse(this.result); - exp.add("result", jsonResult); - } else { - JsonArray jsonArrayResult = new JsonArray(); - JsonObject jsonObjectResult = new JsonObject(); - - JsonObject algoObject = parser.parse(this.algorithms).getAsJsonArray().get(0).getAsJsonObject(); - jsonObjectResult.add("algorithm", algoObject.get("name")); - jsonObjectResult.add("code", algoObject.get("code")); - - exp.remove("result"); - JsonObject tryJson; - try { - tryJson = parser.parse(this.result).getAsJsonArray().get(0).getAsJsonObject(); - } catch(JsonParseException e) { - tryJson = new JsonObject(); - tryJson.add("result", new JsonPrimitive(this.result)); - } - - JsonObject jsonData = tryJson; - jsonObjectResult.add("data", jsonData); - - // add mime-type - String algo = isExaremeAlgorithm._2; - if (jsonData.get("Error") != null) { - jsonObjectResult.add("type", new JsonPrimitive("text/plain+error")); - } else if (algo.equals( WP_K_MEANS) || algo.equals( WP_VARIABLES_HISTOGRAM)) { - jsonObjectResult.add("type", new JsonPrimitive("application/vnd.highcharts+json")); - } else if (algo.equals(WP_LINEAR_REGRESSION)) { - jsonObjectResult.add("type", new JsonPrimitive("application/vnd.dataresource+json")); - } else if (algo.equals(WP_REGRESSION_TREE) || algo.equals(WP_MODEL_TREE)) { - jsonObjectResult.add("type", new JsonPrimitive("application/vnd.visjs+javascript")); - } - - jsonArrayResult.add(jsonObjectResult); - - exp.add("result", jsonArrayResult); - } + JsonElement jsonResult = parser.parse(this.result); + exp.add("result", jsonResult); + } return exp; @@ -455,30 +262,4 @@ public class Experiment { public void setShared(boolean shared) { this.shared = shared; } - - public Tuple2<Boolean, String> isExaremeAlgorithm() { - Boolean isExareme = false; - String algorithm = ""; - - String algorithms = this.algorithms; - - if (algorithms.contains(WP_K_MEANS)) { - isExareme = true; - algorithm = WP_K_MEANS; - } else if (algorithms.contains(WP_LINEAR_REGRESSION)) { - isExareme = true; - algorithm = WP_LINEAR_REGRESSION; - } else if (algorithms.contains(WP_VARIABLES_HISTOGRAM)) { - isExareme = true; - algorithm = WP_VARIABLES_HISTOGRAM; - } else if (algorithms.contains(WP_REGRESSION_TREE)) { - isExareme = true; - algorithm = WP_REGRESSION_TREE; - } else if (algorithms.contains(WP_MODEL_TREE)) { - isExareme = true; - algorithm = WP_MODEL_TREE; - } - - return new Tuple2<Boolean, String>(isExareme, algorithm); - } } diff --git a/src/main/java/eu/hbp/mip/model/UserInfo.java b/src/main/java/eu/hbp/mip/model/UserInfo.java index f4671b634d152244ed79976ffe2a170b9130492e..293ce9534cf78c0f27b5f742ca924540072e2fea 100644 --- a/src/main/java/eu/hbp/mip/model/UserInfo.java +++ b/src/main/java/eu/hbp/mip/model/UserInfo.java @@ -52,6 +52,7 @@ public class UserInfo { user = new User(); user.setUsername("anonymous"); user.setFullname("anonymous"); + user.setEmail("anonymous@anonymous.com"); user.setPicture("images/users/default_user.png"); } else { user = new User(getUserInfos()); diff --git a/src/main/java/eu/hbp/mip/model/Variable.java b/src/main/java/eu/hbp/mip/model/Variable.java index 0947cdd7db753d27741a2e0b32fb4239c166cbac..1fcce2e48e89dc8e94a935bfc803ada086cd53f5 100644 --- a/src/main/java/eu/hbp/mip/model/Variable.java +++ b/src/main/java/eu/hbp/mip/model/Variable.java @@ -12,6 +12,7 @@ import io.swagger.annotations.ApiModel; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; +import java.util.List; @Entity @Table(name = "`variable`") @@ -42,6 +43,17 @@ public class Variable { this.code = code; } - + public static String stringFromVariables(List<Variable> variables, String operator) { + StringBuilder sb = new StringBuilder(); + int i = 0; + for (Variable s : variables) { + i++; + sb.append(s.getCode()); + if (i < variables.size()) { + sb.append(operator); + } + } + return sb.toString(); + } } diff --git a/src/main/resources/data/exareme_algorithms.json b/src/main/resources/data/exareme_algorithms.json deleted file mode 100644 index 3ea4bdf19b7f2a779ecd70ab3385ef9b96c8533d..0000000000000000000000000000000000000000 --- a/src/main/resources/data/exareme_algorithms.json +++ /dev/null @@ -1,137 +0,0 @@ -[ - { - "code": "WP_VARIABLES_HISTOGRAM", - "constraints": { - "variable": { - "binominal": true, - "integer": true, - "polynominal": true, - "real": true - } - }, - "description": "Histograms", - "environment": "Exareme", - "label": " Histogram", - "parameters": [ - { - "code": "nobuckets", - "constraints": { - "max": null, - "min": 1 - }, - "default_value": 4, - "description": "The number of clusters. Typical values range from 2 to 10.", - "label": "nobuckets", - "type": "int" - } - ], - "type": [ - "statistics" - ] - }, - { - "code": "PIPELINE_ISOUP_REGRESSION_TREE_SERIALIZER", - "constraints": { - "variable": { - "binominal": true, - "integer": true, - "polynominal": true, - "real": true - } - }, - "description": "Regression Tree Serializer", - "environment": "Exareme", - "label": " Regression Tree", - "parameters": [], - "type": [ - "statistics" - ] - }, - { - "code": "PIPELINE_ISOUP_MODEL_TREE_SERIALIZER", - "constraints": { - "variable": { - "binominal": true, - "integer": true, - "polynominal": true, - "real": true - } - }, - "description": "Model Tree Serializer", - "environment": "Exareme", - "label": "Model Tree", - "parameters": [], - "type": [ - "statistics" - ] - }, - { - "code": "WP_LINEAR_REGRESSION", - "constraints": { - "variable": { - "binominal": false, - "integer": true, - "polynominal": false, - "real": true - } - }, - "description": "Linear Regression using Exareme services", - "environment": "Exareme", - "label": "Linear regression", - "parameters": [ - { - "code": "design", - "default_value": "factorial", - "description": "The type of multi-factors design. Choose 'factorial' to enable interactions analysis or 'additive' for a model without no interaction at all.", - "label": "design", - "type": "enumeration", - "values": [ - "factorial", - "additive" - ] - } - ], - "type": [ - "statistics" - ] - }, - { - "code": "K_MEANS", - "constraints": { - "covariables": { - "max_count": null, - "min_count": "1" - }, - "groupings": { - "max_count": 0, - "min_count": 0 - }, - "mixed": false, - "variable": { - "binominal": true, - "integer": true, - "polynominal": true, - "real": true - } - }, - "description": "k-Means using Exareme services", - "environment": "Exareme", - "label": "K_MEANS", - "parameters": [ - { - "code": "k", - "constraints": { - "max": null, - "min": 1 - }, - "default_value": 5, - "description": "The number of clusters. Typical values range from 2 to 10.", - "label": "k", - "type": "int" - } - ], - "type": [ - "statistics" - ] - } -]