diff --git a/README.md b/README.md index 5d9394d..2cbe12f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Causal REST API V1 +# Causal REST API v0.0.7 This RESTful API is designed for causal web. And it implements the [JAX-RS](https://en.wikipedia.org/wiki/Java_API_for_RESTful_Web_Services) specifications using Jersey. @@ -60,17 +60,15 @@ git checkout tags/v0.3.1 mvn clean install ```` -You'll also need to download [ccd-db-0.6.2](https://github.com/bd2kccd/ccd-db) branch: +You'll also need to download released [ccd-db-0.6.2](https://github.com/bd2kccd/ccd-db/releases/tag/v0.6.2): ```` git clone https://github.com/bd2kccd/ccd-db.git cd ccd-db -git checkout v0.6.2 +git checkout tags/v0.6.2 mvn clean install ```` -**Note: we'll use the the 0.6.2 tagged release once it's released, only use the branch for now.** - Then you can go get and install `causal-rest-api`: ```` @@ -84,6 +82,7 @@ mvn clean package There are 4 configuration files to configure located at `causal-rest-api/src/main/resources`: - **application-hsqldb.properties**: HSQLDB database configurations (for testing only). - **application-mysql.properties**: MySQL database configurations +- **application-slurm.properties**: Slurm setting for HPC - **application.properties**: Spring Boot application settings - **causal.properties**: Data file directory path and folder settings @@ -665,29 +664,29 @@ GET /ccd-api/22/algorithms HTTP/1.1 Host: cloud.ccd.pitt.edu Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2Nsb3VkLmNjZC5waXR0LmVkdS8iLCJuYW1lIjoiemh5MTkiLCJleHAiOjE0NzU4NTA2NzY4MDQsImlhdCI6MTQ3NTg0NzA3NjgwNH0.8azVEoNPfETczXb-vn7dfyDd98eRt7iiLBXehGpPGzY ```` -Currently we support "FGS continuous" and "FGS discrete". +Currently we support "FGES continuous" and "FGES discrete". ````javascript [ { "id": 1, - "name": "fgsc", - "description": "FGS continuous" + "name": "FGESc", + "description": "FGES continuous" }, { "id": 2, - "name": "fgsd", - "description": "FGS discrete" + "name": "FGESd", + "description": "FGES discrete" }, { "id": 3, - "name": "gfcic", + "name": "GFCIc", "description": "GFCI continuous" } ] ```` -Currently we support "FGS continuous", "FGS discrete" and "GFCI continuous". They also share a common JSON structure as of their input, for example: +Currently we support "FGES continuous", "FGES discrete" and "GFCI continuous". They also share a common JSON structure as of their input, for example: | Input JSON Fields | Description | | --- | --- | @@ -699,7 +698,7 @@ Currently we support "FGS continuous", "FGS discrete" and "GFCI continuous". The Below are the data validation flags and parameters that you can use for each algorithm. -**FGS continuous** +**FGES continuous** Data validation: @@ -717,7 +716,7 @@ Algorithm parameters: | `penaltyDiscount` | Penalty discount | 4.0 | | `verbose` | Print additional information | true | -**FGS discrete** +**FGES discrete** Data validation: @@ -763,13 +762,13 @@ This is a POST request and the algorithm details and data file id will need to b API Endpoint URI pattern: ```` -POST https://cloud.ccd.pitt.edu/ccd-api/{userId}/jobs/fgsc +POST https://cloud.ccd.pitt.edu/ccd-api/{userId}/jobs/FGESc ```` Generated HTTP request code example: ```` -POST /ccd-api/22/jobs/fgsc HTTP/1.1 +POST /ccd-api/22/jobs/FGESc HTTP/1.1 Host: cloud.ccd.pitt.edu Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2Nsb3VkLmNjZC5waXR0LmVkdS8iLCJuYW1lIjoiemh5MTkiLCJleHAiOjE0NzU4NTA2NzY4MDQsImlhdCI6MTQ3NTg0NzA3NjgwNH0.8azVEoNPfETczXb-vn7dfyDd98eRt7iiLBXehGpPGzY Content-Type: application/json @@ -791,32 +790,33 @@ Content-Type: application/json } ```` -In this example, we are running the "FGS continuous" algorithm on the file with ID 8. And this call will return the job info with a 201 Created response status code. +In this example, we are running the "FGES continuous" algorithm on the file with ID 8. And this call will return the job info with a 201 Created response status code. ```` { "id": 5, - "algorithmName": "fgsc", + "algorithmName": "FGESc", + "status": 0, "addedTime": 1472742564355, - "resultFileName": "fgs_data_small.txt_1472742564353.txt", - "errorResultFileName": "error_fgs_data_small.txt_1472742564353.txt" + "resultFileName": "FGESc_data_small.txt_1472742564353.txt", + "errorResultFileName": "error_FGESc_data_small.txt_1472742564353.txt" } ```` -From this response we can tell that the job ID is 5, and the result file name will be `fgs_data_small.txt_1472742564353.txt` if everything goes well. If something is wrong an error result file with name `error_fgs_data_small.txt_1472742564353.txt` will be created. +From this response we can tell that the job ID is 5, and the result file name will be `FGESc_data_small.txt_1472742564353.txt` if everything goes well. If something is wrong an error result file with name `error_FGEsc_data_small.txt_1472742564353.txt` will be created. -When you need to run "FGS discrete", just send the request to a different endpont URI: +When you need to run "FGES discrete", just send the request to a different endpont URI: API Endpoint URI pattern: ```` -POST https://cloud.ccd.pitt.edu/ccd-api/{userId}/jobs/fgsd +POST https://cloud.ccd.pitt.edu/ccd-api/{userId}/jobs/FGESd ```` Generated HTTP request code example: ```` -POST /ccd-api/22/jobs/fgsd HTTP/1.1 +POST /ccd-api/22/jobs/FGESd HTTP/1.1 Host: cloud.ccd.pitt.edu Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2Nsb3VkLmNjZC5waXR0LmVkdS8iLCJuYW1lIjoiemh5MTkiLCJleHAiOjE0NzU4NTA2NzY4MDQsImlhdCI6MTQ3NTg0NzA3NjgwNH0.8azVEoNPfETczXb-vn7dfyDd98eRt7iiLBXehGpPGzY Content-Type: application/json @@ -863,12 +863,12 @@ Then you'll see the information of all jobs that are currently running: [ { "id": 32, - "algorithmName": "fgsc", + "algorithmName": "FGESc", "addedTime": 1468436085000 }, { "id": 33, - "algorithmName": "fgsd", + "algorithmName": "FGESd", "addedTime": 1468436087000 } ] @@ -937,13 +937,13 @@ The response to this request will look like this: ````javascript [ { - "name": "fgs_sim_data_20vars_100cases.csv_1466171729046.txt", + "name": "FGESc_sim_data_20vars_100cases.csv_1466171729046.txt", "creationTime": 1466171732000, "lastModifiedTime": 1466171732000, "fileSize": 1660 }, { - "name": "fgs_data_small.txt_1466172140585.txt", + "name": "FGESc_data_small.txt_1466172140585.txt", "creationTime": 1466172145000, "lastModifiedTime": 1466172145000, "fileSize": 39559 @@ -962,7 +962,7 @@ GET https://cloud.ccd.pitt.edu/ccd-api/{userId}/results/{result_file_name} Generated HTTP request code example: ```` -GET /ccd-api/22/results/fgs_data_small.txt_1466172140585.txt HTTP/1.1 +GET /ccd-api/22/results/FGESc_data_small.txt_1466172140585.txt HTTP/1.1 Host: cloud.ccd.pitt.edu Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2Nsb3VkLmNjZC5waXR0LmVkdS8iLCJuYW1lIjoiemh5MTkiLCJleHAiOjE0NzU4NTA2NzY4MDQsImlhdCI6MTQ3NTg0NzA3NjgwNH0.8azVEoNPfETczXb-vn7dfyDd98eRt7iiLBXehGpPGzY ```` @@ -976,7 +976,7 @@ The response to this request will look like this: "status": 404, "error": "Not Found", "message": "Resource not found.", - "path": "/22/results/fgs_data_small.txt_146172140585.txt" + "path": "/22/results/FGESc_data_small.txt_146172140585.txt" } ```` @@ -1002,15 +1002,15 @@ Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL { "resultFiles": [ - "gs_sim_data_20vars_100cases.csv_1466171729046.txt", - "fgs_data_small.txt_1467305104859.txt" + "FGESc_sim_data_20vars_100cases.csv_1466171729046.txt", + "FGESc_data_small.txt_1467305104859.txt" ] } ```` When you specify multiple file names, use the `!!` as a delimiter. This request will generate a result comparison file with the following content (shortened version): ```` -fgs_sim_data_20vars_100cases.csv_1466171729046.txt fgs_data_small.txt_1467305104859.txt +FGESc_sim_data_20vars_100cases.csv_1466171729046.txt FGESc_data_small.txt_1467305104859.txt Edges In All Same End Point NR4A2,FOS 0 0 X5,X17 0 0 @@ -1088,7 +1088,7 @@ Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL Then it returns the content of that comparison file (shorted version): ```` -fgs_sim_data_20vars_100cases.csv_1466171729046.txt fgs_data_small.txt_1467305104859.txt +FGESc_sim_data_20vars_100cases.csv_1466171729046.txt FGESc_data_small.txt_1467305104859.txt Edges In All Same End Point NR4A2,FOS 0 0 X5,X17 0 0 diff --git a/pom.xml b/pom.xml index 9b3af33..5514d4a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ edu.pitt.dbmi.ccd causal-rest-api - 0.0.6 + 0.0.7 jar causal-rest-api @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.1.RELEASE + 1.4.2.RELEASE @@ -48,7 +48,7 @@ edu.pitt.dbmi ccd-db - 0.6.2 + 0.6.3 edu.pitt.dbmi @@ -56,10 +56,11 @@ 0.3.1 + org.apache.shiro shiro-core - 1.2.5 + 1.3.2 diff --git a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsContinuousDataValidation.java b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesContinuousDataValidation.java similarity index 91% rename from src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsContinuousDataValidation.java rename to src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesContinuousDataValidation.java index 578ee76..e996be0 100644 --- a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsContinuousDataValidation.java +++ b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesContinuousDataValidation.java @@ -22,12 +22,12 @@ * * @author Zhou Yuan (zhy19@pitt.edu) */ -public class FgsContinuousDataValidation extends BasicDataValidation { +public class FgesContinuousDataValidation extends BasicDataValidation { // Skip check for zero variance variables protected boolean skipNonzeroVariance; - public FgsContinuousDataValidation() { + public FgesContinuousDataValidation() { } public boolean isSkipNonzeroVariance() { diff --git a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsContinuousNewJob.java b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesContinuousNewJob.java similarity index 70% rename from src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsContinuousNewJob.java rename to src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesContinuousNewJob.java index 397f7ba..344b991 100644 --- a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsContinuousNewJob.java +++ b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesContinuousNewJob.java @@ -22,30 +22,30 @@ * * @author Zhou Yuan (zhy19@pitt.edu) */ -public class FgsContinuousNewJob extends NewJob { +public class FgesContinuousNewJob extends NewJob { // Algorithm parameters - private FgsContinuousParameters algorithmParameters; + private FgesContinuousParameters algorithmParameters; // Data validation flag - private FgsContinuousDataValidation dataValidation; + private FgesContinuousDataValidation dataValidation; - public FgsContinuousNewJob() { + public FgesContinuousNewJob() { } - public FgsContinuousParameters getAlgorithmParameters() { + public FgesContinuousParameters getAlgorithmParameters() { return algorithmParameters; } - public void setAlgorithmParameters(FgsContinuousParameters algorithmParameters) { + public void setAlgorithmParameters(FgesContinuousParameters algorithmParameters) { this.algorithmParameters = algorithmParameters; } - public FgsContinuousDataValidation getDataValidation() { + public FgesContinuousDataValidation getDataValidation() { return dataValidation; } - public void setDataValidation(FgsContinuousDataValidation dataValidation) { + public void setDataValidation(FgesContinuousDataValidation dataValidation) { this.dataValidation = dataValidation; } diff --git a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsContinuousParameters.java b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesContinuousParameters.java similarity index 91% rename from src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsContinuousParameters.java rename to src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesContinuousParameters.java index 7263006..1af7763 100644 --- a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsContinuousParameters.java +++ b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesContinuousParameters.java @@ -22,11 +22,11 @@ * * @author Zhou Yuan (zhy19@pitt.edu) */ -public class FgsContinuousParameters extends FgsParameters { +public class FgesContinuousParameters extends FgesParameters { private double penaltyDiscount; - public FgsContinuousParameters() { + public FgesContinuousParameters() { } public double getPenaltyDiscount() { diff --git a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsDiscreteDataValidation.java b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesDiscreteDataValidation.java similarity index 91% rename from src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsDiscreteDataValidation.java rename to src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesDiscreteDataValidation.java index 2c4ad5a..25fb64c 100644 --- a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsDiscreteDataValidation.java +++ b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesDiscreteDataValidation.java @@ -22,12 +22,12 @@ * * @author Zhou Yuan (zhy19@pitt.edu) */ -public class FgsDiscreteDataValidation extends BasicDataValidation { +public class FgesDiscreteDataValidation extends BasicDataValidation { // Skip 'limit number of categories' check private boolean skipCategoryLimit; - public FgsDiscreteDataValidation() { + public FgesDiscreteDataValidation() { } public boolean isSkipCategoryLimit() { diff --git a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsDiscreteNewJob.java b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesDiscreteNewJob.java similarity index 70% rename from src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsDiscreteNewJob.java rename to src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesDiscreteNewJob.java index b5dac89..0244561 100644 --- a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsDiscreteNewJob.java +++ b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesDiscreteNewJob.java @@ -22,30 +22,30 @@ * * @author Zhou Yuan (zhy19@pitt.edu) */ -public class FgsDiscreteNewJob extends NewJob { +public class FgesDiscreteNewJob extends NewJob { // Algorithm parameters - private FgsDiscreteParameters algorithmParameters; + private FgesDiscreteParameters algorithmParameters; // Data validation flag - private FgsDiscreteDataValidation dataValidation; + private FgesDiscreteDataValidation dataValidation; - public FgsDiscreteNewJob() { + public FgesDiscreteNewJob() { } - public FgsDiscreteParameters getAlgorithmParameters() { + public FgesDiscreteParameters getAlgorithmParameters() { return algorithmParameters; } - public void setAlgorithmParameters(FgsDiscreteParameters algorithmParameters) { + public void setAlgorithmParameters(FgesDiscreteParameters algorithmParameters) { this.algorithmParameters = algorithmParameters; } - public FgsDiscreteDataValidation getDataValidation() { + public FgesDiscreteDataValidation getDataValidation() { return dataValidation; } - public void setDataValidation(FgsDiscreteDataValidation dataValidation) { + public void setDataValidation(FgesDiscreteDataValidation dataValidation) { this.dataValidation = dataValidation; } diff --git a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsDiscreteParameters.java b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesDiscreteParameters.java similarity index 93% rename from src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsDiscreteParameters.java rename to src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesDiscreteParameters.java index c180711..e15fdef 100644 --- a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsDiscreteParameters.java +++ b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesDiscreteParameters.java @@ -22,13 +22,13 @@ * * @author Zhou Yuan (zhy19@pitt.edu) */ -public class FgsDiscreteParameters extends FgsParameters { +public class FgesDiscreteParameters extends FgesParameters { private double structurePrior; private double samplePrior; - public FgsDiscreteParameters() { + public FgesDiscreteParameters() { } public double getStructurePrior() { diff --git a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsParameters.java b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesParameters.java similarity index 95% rename from src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsParameters.java rename to src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesParameters.java index b4b5aa2..cb40bb4 100644 --- a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgsParameters.java +++ b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/dto/FgesParameters.java @@ -24,7 +24,7 @@ * * @author Zhou Yuan (zhy19@pitt.edu) */ -public abstract class FgsParameters { +public abstract class FgesParameters { // Search max degree must be at least -1 @Min(-1) @@ -34,7 +34,7 @@ public abstract class FgsParameters { protected boolean verbose; - public FgsParameters() { + public FgesParameters() { } public int getMaxDegree() { diff --git a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/endpoint/JobQueueEndpoint.java b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/endpoint/JobQueueEndpoint.java index c9e4222..3cbe37f 100644 --- a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/endpoint/JobQueueEndpoint.java +++ b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/endpoint/JobQueueEndpoint.java @@ -19,8 +19,8 @@ package edu.pitt.dbmi.ccd.causal.rest.api.endpoint; import edu.pitt.dbmi.ccd.causal.rest.api.Role; -import edu.pitt.dbmi.ccd.causal.rest.api.dto.FgsContinuousNewJob; -import edu.pitt.dbmi.ccd.causal.rest.api.dto.FgsDiscreteNewJob; +import edu.pitt.dbmi.ccd.causal.rest.api.dto.FgesContinuousNewJob; +import edu.pitt.dbmi.ccd.causal.rest.api.dto.FgesDiscreteNewJob; import edu.pitt.dbmi.ccd.causal.rest.api.dto.GfciContinuousNewJob; import edu.pitt.dbmi.ccd.causal.rest.api.dto.JobInfoDTO; import edu.pitt.dbmi.ccd.causal.rest.api.service.JobQueueEndpointService; @@ -69,7 +69,7 @@ public JobQueueEndpoint(JobQueueEndpointService jobQueueEndpointService) { * @throws IOException */ @POST - @Path("/jobs/gfcic") + @Path("/jobs/GFCIc") @Consumes(APPLICATION_JSON) @Produces({APPLICATION_JSON, APPLICATION_XML}) @RolesAllowed(Role.USER) @@ -82,7 +82,7 @@ public Response addGfciContinuousNewJob(@PathParam("uid") Long uid, @Valid GfciC } /** - * Adding a new job and run FGS continuous + * Adding a new job and run FGES continuous * * @param uid * @param newJob @@ -90,12 +90,12 @@ public Response addGfciContinuousNewJob(@PathParam("uid") Long uid, @Valid GfciC * @throws IOException */ @POST - @Path("/jobs/fgsc") + @Path("/jobs/FGESc") @Consumes(APPLICATION_JSON) @Produces({APPLICATION_JSON, APPLICATION_XML}) @RolesAllowed(Role.USER) - public Response addFgsContinuousNewJob(@PathParam("uid") Long uid, @Valid FgsContinuousNewJob newJob) throws IOException { - JobInfoDTO jobInfo = jobQueueEndpointService.addFgsContinuousNewJob(uid, newJob); + public Response addFgsContinuousNewJob(@PathParam("uid") Long uid, @Valid FgesContinuousNewJob newJob) throws IOException { + JobInfoDTO jobInfo = jobQueueEndpointService.addFgesContinuousNewJob(uid, newJob); GenericEntity jobRequestEntity = new GenericEntity(jobInfo) { }; // Return 201 Created status code and the job id in body @@ -103,7 +103,7 @@ public Response addFgsContinuousNewJob(@PathParam("uid") Long uid, @Valid FgsCon } /** - * Adding a new job and run FGS discrete + * Adding a new job and run FGES discrete * * @param uid * @param newJob @@ -111,12 +111,12 @@ public Response addFgsContinuousNewJob(@PathParam("uid") Long uid, @Valid FgsCon * @throws IOException */ @POST - @Path("/jobs/fgsd") + @Path("/jobs/FGESd") @Consumes(APPLICATION_JSON) @Produces({APPLICATION_JSON, APPLICATION_XML}) @RolesAllowed(Role.USER) - public Response addFgsDiscreteNewJob(@PathParam("uid") Long uid, @Valid FgsDiscreteNewJob newJob) throws IOException { - JobInfoDTO jobInfo = jobQueueEndpointService.addFgsDiscreteNewJob(uid, newJob); + public Response addFgsDiscreteNewJob(@PathParam("uid") Long uid, @Valid FgesDiscreteNewJob newJob) throws IOException { + JobInfoDTO jobInfo = jobQueueEndpointService.addFgesDiscreteNewJob(uid, newJob); GenericEntity jobRequestEntity = new GenericEntity(jobInfo) { }; // Return 201 Created status code and the job id in body diff --git a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/prop/CausalRestProperties.java b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/prop/CausalRestProperties.java index f52a894..38eaa6e 100644 --- a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/prop/CausalRestProperties.java +++ b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/prop/CausalRestProperties.java @@ -35,14 +35,14 @@ public class CausalRestProperties { @Value("${ccd.jar.algorithm}") private String algorithmJar; - @Value("${ccd.algorithm.fgs:fgs}") - private String fgs; + @Value("${ccd.algorithm.fges.cont:FGESc}") + private String algoFgesCont; - @Value("${ccd.algorithm.fgs.discrete:fgsc}") - private String fgsDiscrete; + @Value("${ccd.algorithm.fges.disc:FGESd}") + private String algoFgesDisc; - @Value("${ccd.algorithm.gfci:gfci}") - private String gfci; + @Value("${ccd.algorithm.gfci.cont:GFCIc}") + private String algoGfciCont; @Value("${ccd.server.workspace:}") private String workspaceDir; @@ -85,28 +85,28 @@ public void setAlgorithmJar(String algorithmJar) { this.algorithmJar = algorithmJar; } - public String getFgs() { - return fgs; + public String getAlgoFgesCont() { + return algoFgesCont; } - public void setFgs(String fgs) { - this.fgs = fgs; + public void setAlgoFgesCont(String algoFgesCont) { + this.algoFgesCont = algoFgesCont; } - public String getFgsDiscrete() { - return fgsDiscrete; + public String getAlgoFgesDisc() { + return algoFgesDisc; } - public void setFgsDiscrete(String fgsDiscrete) { - this.fgsDiscrete = fgsDiscrete; + public void setAlgoFgesDisc(String algoFgesDisc) { + this.algoFgesDisc = algoFgesDisc; } - public String getGfci() { - return gfci; + public String getAlgoGfciCont() { + return algoGfciCont; } - public void setGfci(String gfci) { - this.gfci = gfci; + public void setAlgoGfciCont(String algoGfciCont) { + this.algoGfciCont = algoGfciCont; } public String getWorkspaceDir() { diff --git a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/service/AlgorithmEndpointService.java b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/service/AlgorithmEndpointService.java index fd3a3ac..55155c1 100644 --- a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/service/AlgorithmEndpointService.java +++ b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/service/AlgorithmEndpointService.java @@ -50,9 +50,9 @@ public List listAlgorithms() throws IOException { List ALGORITHMS = new LinkedList<>(); // Get the actual algorithm short name from the properties file - ALGORITHMS.add(new AlgorithmDTO(1, causalRestProperties.getFgs(), "FGS continuous")); - ALGORITHMS.add(new AlgorithmDTO(2, causalRestProperties.getFgsDiscrete(), "FGS discrete")); - ALGORITHMS.add(new AlgorithmDTO(3, causalRestProperties.getGfci(), "GFCI continuous")); + ALGORITHMS.add(new AlgorithmDTO(1, causalRestProperties.getAlgoFgesCont(), "FGES continuous")); + ALGORITHMS.add(new AlgorithmDTO(2, causalRestProperties.getAlgoFgesDisc(), "FGES discrete")); + ALGORITHMS.add(new AlgorithmDTO(3, causalRestProperties.getAlgoGfciCont(), "GFCI continuous")); return ALGORITHMS; } diff --git a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/service/JobQueueEndpointService.java b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/service/JobQueueEndpointService.java index 5820adb..045e7ba 100644 --- a/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/service/JobQueueEndpointService.java +++ b/src/main/java/edu/pitt/dbmi/ccd/causal/rest/api/service/JobQueueEndpointService.java @@ -18,12 +18,12 @@ */ package edu.pitt.dbmi.ccd.causal.rest.api.service; -import edu.pitt.dbmi.ccd.causal.rest.api.dto.FgsContinuousDataValidation; -import edu.pitt.dbmi.ccd.causal.rest.api.dto.FgsContinuousNewJob; -import edu.pitt.dbmi.ccd.causal.rest.api.dto.FgsContinuousParameters; -import edu.pitt.dbmi.ccd.causal.rest.api.dto.FgsDiscreteDataValidation; -import edu.pitt.dbmi.ccd.causal.rest.api.dto.FgsDiscreteNewJob; -import edu.pitt.dbmi.ccd.causal.rest.api.dto.FgsDiscreteParameters; +import edu.pitt.dbmi.ccd.causal.rest.api.dto.FgesContinuousDataValidation; +import edu.pitt.dbmi.ccd.causal.rest.api.dto.FgesContinuousNewJob; +import edu.pitt.dbmi.ccd.causal.rest.api.dto.FgesContinuousParameters; +import edu.pitt.dbmi.ccd.causal.rest.api.dto.FgesDiscreteDataValidation; +import edu.pitt.dbmi.ccd.causal.rest.api.dto.FgesDiscreteNewJob; +import edu.pitt.dbmi.ccd.causal.rest.api.dto.FgesDiscreteParameters; import edu.pitt.dbmi.ccd.causal.rest.api.dto.GfciContinuousDataValidation; import edu.pitt.dbmi.ccd.causal.rest.api.dto.GfciContinuousNewJob; import edu.pitt.dbmi.ccd.causal.rest.api.dto.GfciContinuousParameters; @@ -97,14 +97,17 @@ public JobQueueEndpointService( } /** - * Add a new job to the job queue and run the GFCI Continuous algorithm + * Add a new job to the job queue and run the GFCI continuous algorithm * * @param uid * @param newJob * @return JobInfoDTO */ public JobInfoDTO addGfciContinuousNewJob(Long uid, GfciContinuousNewJob newJob) { - String algorithm = causalRestProperties.getGfci(); + String algorithmName = "GFCIc"; + + // This is the algo to pass to causal-cmd, case-insensitive + String algorithm = causalRestProperties.getAlgoGfciCont(); // When we can get here vai AuthFilterSerice, it means the user exists // so no need to check if (userAccount == null) and throw UserNotFoundException(uid) @@ -203,7 +206,8 @@ public JobInfoDTO addGfciContinuousNewJob(Long uid, GfciContinuousNewJob newJob) String fileName; DataFile df = dataFileService.findByIdAndUserAccount(datasetFileId, userAccount); - fileName = String.format("%s_%s_%d", algorithm, df.getName(), currentTime); + // The algorithm name can be different from the value of causalRestProperties.getAlgoFgesCont() + fileName = String.format("%s_%s_%d", algorithmName, df.getName(), currentTime); commands.add("--output-prefix"); commands.add(fileName); @@ -216,7 +220,7 @@ public JobInfoDTO addGfciContinuousNewJob(Long uid, GfciContinuousNewJob newJob) // Insert to database table `job_queue_info` JobQueueInfo jobQueueInfo = new JobQueueInfo(); jobQueueInfo.setAddedTime(new Date(System.currentTimeMillis())); - jobQueueInfo.setAlgorName(algorithm); + jobQueueInfo.setAlgorName(algorithmName); jobQueueInfo.setCommands(cmd); jobQueueInfo.setFileName(fileName); jobQueueInfo.setOutputDirectory(map.get("resultDir")); @@ -228,7 +232,7 @@ public JobInfoDTO addGfciContinuousNewJob(Long uid, GfciContinuousNewJob newJob) Long newJobId = jobQueueInfo.getId(); - LOGGER.info(String.format("New GFCI Continuous job submitted. Job ID: %d", newJobId)); + LOGGER.info(String.format("New GFCI continuous job submitted. Job ID: %d", newJobId)); String resultJsonFileName = fileName + ".json"; fileName = fileName + ".txt"; @@ -237,7 +241,7 @@ public JobInfoDTO addGfciContinuousNewJob(Long uid, GfciContinuousNewJob newJob) JobInfoDTO jobInfo = new JobInfoDTO(); jobInfo.setStatus(0); jobInfo.setAddedTime(jobQueueInfo.getAddedTime()); - jobInfo.setAlgorithmName(algorithm); + jobInfo.setAlgorithmName(algorithmName); jobInfo.setResultFileName(fileName); jobInfo.setResultJsonFileName(resultJsonFileName); jobInfo.setErrorResultFileName(errorFileName); @@ -247,14 +251,17 @@ public JobInfoDTO addGfciContinuousNewJob(Long uid, GfciContinuousNewJob newJob) } /** - * Add a new job to the job queue and run the FGS Discrete algorithm + * Add a new job to the job queue and run the FGES discrete algorithm * * @param uid * @param newJob * @return Job ID */ - public JobInfoDTO addFgsDiscreteNewJob(Long uid, FgsDiscreteNewJob newJob) { - String algorithm = causalRestProperties.getFgsDiscrete(); + public JobInfoDTO addFgesDiscreteNewJob(Long uid, FgesDiscreteNewJob newJob) { + String algorithmName = "FGESd"; + + // This is the algo to pass to causal-cmd, case-insensitive + String algorithm = causalRestProperties.getAlgoFgesDisc(); // When we can get here vai AuthFilterSerice, it means the user exists // so no need to check if (userAccount == null) and throw UserNotFoundException(uid) @@ -310,7 +317,7 @@ public JobInfoDTO addFgsDiscreteNewJob(Long uid, FgsDiscreteNewJob newJob) { } // Algorithm parameters - FgsDiscreteParameters algorithmParameters = newJob.getAlgorithmParameters(); + FgesDiscreteParameters algorithmParameters = newJob.getAlgorithmParameters(); commands.add("--delimiter"); commands.add(getFileDelimiter(newJob.getDatasetFileId())); @@ -333,7 +340,7 @@ public JobInfoDTO addFgsDiscreteNewJob(Long uid, FgsDiscreteNewJob newJob) { } // Data validation - FgsDiscreteDataValidation dataValidation = newJob.getDataValidation(); + FgesDiscreteDataValidation dataValidation = newJob.getDataValidation(); if (!dataValidation.isSkipCategoryLimit()) { commands.add("--skip-category-limit"); @@ -353,7 +360,8 @@ public JobInfoDTO addFgsDiscreteNewJob(Long uid, FgsDiscreteNewJob newJob) { String fileName; DataFile df = dataFileService.findByIdAndUserAccount(datasetFileId, userAccount); - fileName = String.format("%s_%s_%d", algorithm, df.getName(), currentTime); + // The algorithm name can be different from the value of causalRestProperties.getAlgoFgesCont() + fileName = String.format("%s_%s_%d", algorithmName, df.getName(), currentTime); commands.add("--output-prefix"); commands.add(fileName); @@ -366,7 +374,7 @@ public JobInfoDTO addFgsDiscreteNewJob(Long uid, FgsDiscreteNewJob newJob) { // Insert to database table `job_queue_info` JobQueueInfo jobQueueInfo = new JobQueueInfo(); jobQueueInfo.setAddedTime(new Date(System.currentTimeMillis())); - jobQueueInfo.setAlgorName(algorithm); + jobQueueInfo.setAlgorName(algorithmName); jobQueueInfo.setCommands(cmd); jobQueueInfo.setFileName(fileName); jobQueueInfo.setOutputDirectory(map.get("resultDir")); @@ -378,7 +386,7 @@ public JobInfoDTO addFgsDiscreteNewJob(Long uid, FgsDiscreteNewJob newJob) { Long newJobId = jobQueueInfo.getId(); - LOGGER.info(String.format("New FGS Discrete job submitted. Job ID: %d", newJobId)); + LOGGER.info(String.format("New FGES discrete job submitted. Job ID: %d", newJobId)); String resultJsonFileName = fileName + ".json"; fileName = fileName + ".txt"; @@ -387,7 +395,7 @@ public JobInfoDTO addFgsDiscreteNewJob(Long uid, FgsDiscreteNewJob newJob) { JobInfoDTO jobInfo = new JobInfoDTO(); jobInfo.setStatus(0); jobInfo.setAddedTime(jobQueueInfo.getAddedTime()); - jobInfo.setAlgorithmName(algorithm); + jobInfo.setAlgorithmName(algorithmName); jobInfo.setResultFileName(fileName); jobInfo.setResultJsonFileName(resultJsonFileName); jobInfo.setErrorResultFileName(errorFileName); @@ -397,14 +405,17 @@ public JobInfoDTO addFgsDiscreteNewJob(Long uid, FgsDiscreteNewJob newJob) { } /** - * Add a new job to the job queue and run the FGS Continuous algorithm + * Add a new job to the job queue and run the FGES Continuous algorithm * * @param uid * @param newJob * @return JobInfoDTO */ - public JobInfoDTO addFgsContinuousNewJob(Long uid, FgsContinuousNewJob newJob) { - String algorithm = causalRestProperties.getFgs(); + public JobInfoDTO addFgesContinuousNewJob(Long uid, FgesContinuousNewJob newJob) { + String algorithmName = "FGESc"; + + // This is the algo to pass to causal-cmd, case-insensitive + String algorithm = causalRestProperties.getAlgoFgesCont(); // When we can get here vai AuthFilterSerice, it means the user exists // so no need to check if (userAccount == null) and throw UserNotFoundException(uid) @@ -460,7 +471,7 @@ public JobInfoDTO addFgsContinuousNewJob(Long uid, FgsContinuousNewJob newJob) { } // Algorithm parameters - FgsContinuousParameters algorithmParameters = newJob.getAlgorithmParameters(); + FgesContinuousParameters algorithmParameters = newJob.getAlgorithmParameters(); commands.add("--delimiter"); commands.add(getFileDelimiter(newJob.getDatasetFileId())); @@ -480,7 +491,7 @@ public JobInfoDTO addFgsContinuousNewJob(Long uid, FgsContinuousNewJob newJob) { } // Data validation - FgsContinuousDataValidation dataValidation = newJob.getDataValidation(); + FgesContinuousDataValidation dataValidation = newJob.getDataValidation(); if (!dataValidation.isSkipNonzeroVariance()) { commands.add("--skip-nonzero-variance"); @@ -500,7 +511,8 @@ public JobInfoDTO addFgsContinuousNewJob(Long uid, FgsContinuousNewJob newJob) { String fileName; DataFile df = dataFileService.findByIdAndUserAccount(datasetFileId, userAccount); - fileName = String.format("%s_%s_%d", algorithm, df.getName(), currentTime); + // The algorithm name can be different from the value of causalRestProperties.getAlgoFgesCont() + fileName = String.format("%s_%s_%d", algorithmName, df.getName(), currentTime); commands.add("--output-prefix"); commands.add(fileName); @@ -513,7 +525,7 @@ public JobInfoDTO addFgsContinuousNewJob(Long uid, FgsContinuousNewJob newJob) { // Insert to database table `job_queue_info` JobQueueInfo jobQueueInfo = new JobQueueInfo(); jobQueueInfo.setAddedTime(new Date(System.currentTimeMillis())); - jobQueueInfo.setAlgorName(algorithm); + jobQueueInfo.setAlgorName(algorithmName); jobQueueInfo.setCommands(cmd); jobQueueInfo.setFileName(fileName); jobQueueInfo.setOutputDirectory(map.get("resultDir")); @@ -525,7 +537,7 @@ public JobInfoDTO addFgsContinuousNewJob(Long uid, FgsContinuousNewJob newJob) { Long newJobId = jobQueueInfo.getId(); - LOGGER.info(String.format("New FGS Continuous job submitted. Job ID: %d", newJobId)); + LOGGER.info(String.format("New FGES Continuous job submitted. Job ID: %d", newJobId)); String resultJsonFileName = fileName + ".json"; fileName = fileName + ".txt"; @@ -534,7 +546,7 @@ public JobInfoDTO addFgsContinuousNewJob(Long uid, FgsContinuousNewJob newJob) { JobInfoDTO jobInfo = new JobInfoDTO(); jobInfo.setStatus(0); jobInfo.setAddedTime(jobQueueInfo.getAddedTime()); - jobInfo.setAlgorithmName(algorithm); + jobInfo.setAlgorithmName(algorithmName); jobInfo.setResultFileName(fileName); jobInfo.setResultJsonFileName(resultJsonFileName); jobInfo.setErrorResultFileName(errorFileName); diff --git a/src/main/resources/application-hsqldb.properties b/src/main/resources/application-hsqldb.properties index d12945d..ef083af 100644 --- a/src/main/resources/application-hsqldb.properties +++ b/src/main/resources/application-hsqldb.properties @@ -21,3 +21,4 @@ spring.datasource.url=jdbc:hsqldb:mem:ccd;ifexists=false;shutdown=true # JPA (JpaBaseConfiguration) spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.HSQLDialect + diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e29ae0f..c130dbf 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -19,9 +19,10 @@ spring.main.banner-mode=off # PROFILES +# Use comma to seperate each profile # scheduler, slurm # hsqldb, mysql -spring.profiles.active=scheduler,hsqldb +spring.profiles.active= # LOGGING logging.file=causal_rest_api.log @@ -36,6 +37,7 @@ server.context-path=/ccd-api/ # JPA (JpaBaseConfiguration, HibernateJpaAutoConfiguration) # Hibernate ddl auto (create,create-drop,update) +# Use create-drop when testing against hsqldb profile spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=false diff --git a/src/main/resources/causal.properties b/src/main/resources/causal.properties index 2132a9e..3cde544 100644 --- a/src/main/resources/causal.properties +++ b/src/main/resources/causal.properties @@ -16,12 +16,12 @@ # MA 02110-1301 USA # JAR LIBRARIES -ccd.jar.algorithm=causal-cmd-6.0.0.jar +ccd.jar.algorithm= -# ALGORITHMS -ccd.algorithm.fgs=fgsc -ccd.algorithm.fgs.discrete=fgsd -ccd.algorithm.gfci=gfcic +# ALGORITHMS used by causal-cmd (case-insensitive) +ccd.algorithm.fges.cont=fgesc +ccd.algorithm.fges.disc=fgesd +ccd.algorithm.gfci.cont=gfcic # DIRECTORIES ccd.server.workspace= diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index f046647..eba1c83 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -35,8 +35,9 @@ server.context-path=/ccd-api/ # JPA (JpaBaseConfiguration, HibernateJpaAutoConfiguration) # Hibernate ddl auto (create,create-drop,update) +# Use create-drop when testing against hsqldb profile spring.jpa.hibernate.ddl-auto=create-drop -spring.jpa.show-sql=true +spring.jpa.show-sql=false # MULTIPART (MultipartProperties) # Enable support of multi-part uploads diff --git a/src/test/resources/causal.properties b/src/test/resources/causal.properties index 9e64d06..376f81c 100644 --- a/src/test/resources/causal.properties +++ b/src/test/resources/causal.properties @@ -16,12 +16,12 @@ # MA 02110-1301 USA # JAR LIBRARIES -ccd.jar.algorithm=causal-cmd-6.0.0.jar +ccd.jar.algorithm= -# ALGORITHMS -ccd.algorithm.fgs=fgsc -ccd.algorithm.fgs.discrete=fgsd -ccd.algorithm.gfci=gfcic +# ALGORITHMS used by causal-cmd (case-insensitive) +ccd.algorithm.fges.cont=fgesc +ccd.algorithm.fges.disc=fgesd +ccd.algorithm.gfci.cont=gfcic # DIRECTORIES ccd.server.workspace=