diff --git a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/OpenCGATestExternalResource.java b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/OpenCGATestExternalResource.java index e3b6975177..a8fc351993 100644 --- a/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/OpenCGATestExternalResource.java +++ b/opencga-analysis/src/test/java/org/opencb/opencga/analysis/variant/OpenCGATestExternalResource.java @@ -63,7 +63,7 @@ */ public class OpenCGATestExternalResource extends ExternalResource { - private final CatalogManagerExternalResource catalogManagerExternalResource = new CatalogManagerExternalResource(); + private final CatalogManagerExternalResource catalogManagerExternalResource; private Path opencgaHome; private String storageEngine; private boolean initiated = false; @@ -72,21 +72,27 @@ public class OpenCGATestExternalResource extends ExternalResource { private StorageConfiguration storageConfiguration; private StorageEngineFactory storageEngineFactory; private ToolRunner toolRunner; - + protected Path sourceAnalysisPath; public static HadoopVariantStorageTest.HadoopExternalResource hadoopExternalResource = new HadoopVariantStorageTest.HadoopExternalResource(); public OpenCGATestExternalResource() { - this(false); + this(false, Paths.get("../opencga-app/app/analysis/")); } public OpenCGATestExternalResource(boolean storageHadoop) { + this(storageHadoop, Paths.get("../opencga-app/app/analysis/")); + } + + public OpenCGATestExternalResource(boolean storageHadoop, Path sourceAnalysisPath) { if (storageHadoop) { this.storageEngine = HadoopVariantStorageEngine.STORAGE_ENGINE_ID; } else { this.storageEngine = DummyVariantStorageEngine.STORAGE_ENGINE_ID; } + this.sourceAnalysisPath = sourceAnalysisPath; + catalogManagerExternalResource = new CatalogManagerExternalResource(sourceAnalysisPath); } @Override diff --git a/opencga-app/app/misc/clients/python_client_generator.py b/opencga-app/app/misc/clients/python_client_generator.py index ada636dc5c..d98a8a9e90 100644 --- a/opencga-app/app/misc/clients/python_client_generator.py +++ b/opencga-app/app/misc/clients/python_client_generator.py @@ -161,10 +161,10 @@ def get_method_definition(self, category, endpoint): return '\n'.join(text) def get_file_name(self, category): - return self.to_snake_case(self.categories[self.get_category_name(category)]) + '_client.py' \ - if self.categories[self.get_category_name(category)] != 'GA4GH' \ - else self.categories[self.get_category_name(category)].lower() + '_client.py' - + if self.categories[self.get_category_name(category)] == 'GA4GH' or self.categories[self.get_category_name(category)] == 'CVDB': + return self.categories[self.get_category_name(category)].lower() + '_client.py' + else: + return self.to_snake_case(self.categories[self.get_category_name(category)]) + '_client.py' def _setup_argparse(): desc = 'This script creates automatically all Python RestClients files' diff --git a/opencga-app/app/misc/clients/r_client_generator.py b/opencga-app/app/misc/clients/r_client_generator.py index 2d2a4840a9..f69030c34c 100644 --- a/opencga-app/app/misc/clients/r_client_generator.py +++ b/opencga-app/app/misc/clients/r_client_generator.py @@ -27,7 +27,7 @@ def __init__(self, server_url, output_dir): 'Analysis - Clinical': 'Clinical', 'Operations - Variant Storage': 'Operation', 'Meta': 'Meta', - 'Cvdb': 'Cvdb', + 'CVDB': 'CVDB', 'GA4GH': 'GA4GH', 'Admin': 'Admin' } diff --git a/opencga-app/app/misc/clients/rest_client_generator.py b/opencga-app/app/misc/clients/rest_client_generator.py index 53ed2bdfd8..441a49be1f 100644 --- a/opencga-app/app/misc/clients/rest_client_generator.py +++ b/opencga-app/app/misc/clients/rest_client_generator.py @@ -51,7 +51,7 @@ def __init__(self, rest_api_file, output_dir): 'Analysis - Clinical': 'ClinicalAnalysis', 'Operations - Variant Storage': 'VariantOperation', 'Meta': 'Meta', - 'Cvdb': 'Cvdb', + 'CVDB': 'CVDB', 'GA4GH': 'GA4GH', 'Admin': 'Admin' } @@ -219,6 +219,7 @@ def get_method_name(self, endpoint, category): method_name = '_'.join([items[2], items[0]]) elif len(items) == 4: # e.g. /{apiVersion}/operation/variant/sample/genotype/index + #analysis/clinical/cvdb/variant/{variantIds}/stats if not self.any_arg(items): method_name = '_'.join([items[0], items[1], items[2], items[3]]) # /{apiVersion}/analysis/clinical/{clinicalAnalysis}/interpretation/{interpretationId}/merge @@ -227,6 +228,9 @@ def get_method_name(self, endpoint, category): # /{apiVersion}/admin/users/{user}/groups/update elif self.all_arg([items[1]]) and not self.any_arg([items[0], items[2], items[3]]): method_name = '_'.join([items[0], items[3], items[2]]) + # /{apiVersion}/analysis/clinical/cvdb/variant/{variantIds}/stats + elif self.all_arg([items[2]]) and not self.any_arg([items[0], items[1], items[3]]): + method_name = '_'.join([items[0], items[1], items[3]]) elif len(items) == 5: # e.g. /{apiVersion}/files/{file}/annotationSets/{annotationSet}/annotations/update if self.all_arg([items[0], items[2]]) and not self.any_arg([items[1], items[3], items[4]]): diff --git a/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v4/v4_0_0/catalog/ClinicalCvdbIndexMigration.java b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v4/v4_0_0/catalog/ClinicalCvdbIndexMigration.java new file mode 100644 index 0000000000..9cb73ade19 --- /dev/null +++ b/opencga-app/src/main/java/org/opencb/opencga/app/migrations/v4/v4_0_0/catalog/ClinicalCvdbIndexMigration.java @@ -0,0 +1,47 @@ +package org.opencb.opencga.app.migrations.v4.v4_0_0.catalog; + +import com.mongodb.client.model.Filters; +import com.mongodb.client.model.Updates; +import org.bson.Document; +import org.bson.conversions.Bson; +import org.opencb.opencga.catalog.db.api.ClinicalAnalysisDBAdaptor; +import org.opencb.opencga.catalog.db.mongodb.OrganizationMongoDBAdaptorFactory; +import org.opencb.opencga.catalog.migration.Migration; +import org.opencb.opencga.catalog.migration.MigrationTool; +import org.opencb.opencga.core.models.clinical.ClinicalStatusValue; +import org.opencb.opencga.core.models.clinical.CvdbIndexStatus; + +import java.util.Arrays; + +@Migration(id = "add_cvdb_index_to_clinical_analysis", + description = "Add CVDB index status to Clinical Analysis #TASK-5610", version = "4.0.0", + language = Migration.MigrationLanguage.JAVA, domain = Migration.MigrationDomain.CATALOG, date = 20241118) +public class ClinicalCvdbIndexMigration extends MigrationTool { + + @Override + protected void run() throws Exception { + Bson closedCaseQuery = Filters.and( + Filters.exists(ClinicalAnalysisDBAdaptor.QueryParams.INTERNAL_CVDB_INDEX.key(), false), + Filters.eq("status.type", ClinicalStatusValue.ClinicalStatusType.CLOSED) + ); + Bson openCaseQuery = Filters.and( + Filters.exists(ClinicalAnalysisDBAdaptor.QueryParams.INTERNAL_CVDB_INDEX.key(), false), + Filters.ne("status.type", ClinicalStatusValue.ClinicalStatusType.CLOSED) + ); + CvdbIndexStatus pendingCvdbIndexStatus = new CvdbIndexStatus(CvdbIndexStatus.PENDING); + Document pendingCvdbIndexDoc = convertToDocument(pendingCvdbIndexStatus); + Bson updateClosedCase = Updates.set(ClinicalAnalysisDBAdaptor.QueryParams.INTERNAL_CVDB_INDEX.key(), pendingCvdbIndexDoc); + + CvdbIndexStatus noneCvdbIndexStatus = new CvdbIndexStatus(CvdbIndexStatus.NONE); + Document noneCvdbIndexDoc = convertToDocument(noneCvdbIndexStatus); + Bson updateOpenCase = Updates.set(ClinicalAnalysisDBAdaptor.QueryParams.INTERNAL_CVDB_INDEX.key(), noneCvdbIndexDoc); + + for (String collection : Arrays.asList(OrganizationMongoDBAdaptorFactory.CLINICAL_ANALYSIS_COLLECTION, + OrganizationMongoDBAdaptorFactory.CLINICAL_ANALYSIS_ARCHIVE_COLLECTION, + OrganizationMongoDBAdaptorFactory.DELETED_CLINICAL_ANALYSIS_COLLECTION)) { + getMongoCollection(collection).updateMany(closedCaseQuery, updateClosedCase); + getMongoCollection(collection).updateMany(openCaseQuery, updateOpenCase); + } + } + +} diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ClinicalAnalysisDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ClinicalAnalysisDBAdaptor.java index 3935f24836..018d23fa8f 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ClinicalAnalysisDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/ClinicalAnalysisDBAdaptor.java @@ -62,6 +62,7 @@ enum QueryParams implements QueryParam { INTERNAL_STATUS("internal.status", TEXT_ARRAY, ""), INTERNAL_STATUS_ID("internal.status.id", TEXT, ""), INTERNAL_STATUS_DATE("internal.status.date", TEXT, ""), + INTERNAL_CVDB_INDEX("internal.cvdbIndex", OBJECT, ""), QUALITY_CONTROL("qualityControl", OBJECT, ""), QUALITY_CONTROL_SUMMARY("qualityControl.summary", TEXT, ""), CONSENT("consent", OBJECT, ""), diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ClinicalAnalysisMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ClinicalAnalysisMongoDBAdaptor.java index 405b03bf1b..8963d5774e 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ClinicalAnalysisMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ClinicalAnalysisMongoDBAdaptor.java @@ -49,7 +49,10 @@ import org.opencb.opencga.core.common.JacksonUtils; import org.opencb.opencga.core.common.TimeUtils; import org.opencb.opencga.core.config.Configuration; -import org.opencb.opencga.core.models.clinical.*; +import org.opencb.opencga.core.models.clinical.ClinicalAnalysis; +import org.opencb.opencga.core.models.clinical.ClinicalAnalysisPermissions; +import org.opencb.opencga.core.models.clinical.FlagValueParam; +import org.opencb.opencga.core.models.clinical.Interpretation; import org.opencb.opencga.core.models.common.AnnotationSet; import org.opencb.opencga.core.models.common.Enums; import org.opencb.opencga.core.models.common.FlagAnnotation; @@ -451,7 +454,7 @@ UpdateDocument parseAndValidateUpdateParams(ObjectMap parameters, List create(String studyStr, ClinicalAnalysis if (clinicalStatusValue.getType() == ClinicalStatusValue.ClinicalStatusType.CLOSED) { String msg = "Case '" + clinicalAnalysis.getId() + "' created with status '" + clinicalAnalysis.getStatus().getId() + "', which is of type CLOSED. Automatically locking " - + "ClinicalAnalysis."; + + "ClinicalAnalysis and setting CVDB index status to PENDING."; logger.info(msg); clinicalAnalysis.setLocked(true); + + CvdbIndexStatus cvdbIndexStatus = new CvdbIndexStatus(CvdbIndexStatus.PENDING, "User '" + userId + + "' created case with status '" + clinicalAnalysis.getStatus().getId() + "', which is of type" + + " CLOSED. Automatically setting CVDB index status to " + CvdbIndexStatus.PENDING); + clinicalAnalysis.getInternal().setCvdbIndex(cvdbIndexStatus); + events.add(new Event(Event.Type.INFO, clinicalAnalysis.getId(), msg)); } } @@ -775,7 +781,7 @@ private void load(ClinicalAnalysis clinicalAnalysis, String study, String token) } } - private void validateAndInitReport(String organizationId, Study study, ClinicalReport report, String userId) + private void validateAndInitReport(String organizationId, Study study, ClinicalReport report, String userId) throws CatalogException { if (report == null) { return; @@ -1462,6 +1468,12 @@ private OpenCGAResult update(String organizationId, Study stud throw new CatalogException("ClinicalAnalysis already have the status '" + clinicalAnalysis.getStatus().getId() + "' of type " + ClinicalStatusValue.ClinicalStatusType.CLOSED); } + } else { + // The user wants to remove the CLOSED status + CvdbIndexStatus cvdbIndexStatus = new CvdbIndexStatus(CvdbIndexStatus.PENDING_REMOVE, "User '" + userId + + "' requested to remove the status '" + clinicalAnalysis.getStatus().getId() + "' of type " + + ClinicalStatusValue.ClinicalStatusType.CLOSED + " to set it to '" + updateParams.getStatus().getId() + "'"); + parameters.put(ClinicalAnalysisDBAdaptor.QueryParams.INTERNAL_CVDB_INDEX.key(), cvdbIndexStatus); } } @@ -1747,10 +1759,28 @@ private OpenCGAResult update(String organizationId, Study stud if (clinicalStatusValue.getType() == ClinicalStatusValue.ClinicalStatusType.CLOSED) { String msg = "User '" + userId + "' changed case '" + clinicalAnalysis.getId() + "' to status '" + updateParamsClone.getStatus().getId() + "', which is of type CLOSED. Automatically locking " - + "ClinicalAnalysis"; + + "ClinicalAnalysis and changing CVDB index status to be indexed"; logger.info(msg); parameters.put(ClinicalAnalysisDBAdaptor.QueryParams.LOCKED.key(), true); events.add(new Event(Event.Type.INFO, clinicalAnalysis.getId(), msg)); + + if (StringUtils.isEmpty(clinicalAnalysis.getInternal().getCvdbIndex().getId()) + || clinicalAnalysis.getInternal().getCvdbIndex().getId().equals(CvdbIndexStatus.NONE)) { + CvdbIndexStatus cvdbIndexStatus = new CvdbIndexStatus(CvdbIndexStatus.PENDING, "User '" + userId + + "' changed case to status '" + updateParamsClone.getStatus().getId() + "', which is of type" + + " CLOSED. Automatically changing CVDB index status to " + CvdbIndexStatus.PENDING); + parameters.put(ClinicalAnalysisDBAdaptor.QueryParams.INTERNAL_CVDB_INDEX.key(), cvdbIndexStatus); + } else if (clinicalAnalysis.getInternal().getCvdbIndex().getId().equals(CvdbIndexStatus.PENDING_REMOVE)) { + CvdbIndexStatus cvdbIndexStatus = new CvdbIndexStatus(CvdbIndexStatus.PENDING_OVERWRITE, "User '" + userId + + "' changed case to status '" + updateParamsClone.getStatus().getId() + "', which is of type" + + " CLOSED. CVDB index was already in " + CvdbIndexStatus.PENDING_REMOVE + ", so automatically" + + " changing CVDB index status to " + CvdbIndexStatus.PENDING_OVERWRITE); + parameters.put(ClinicalAnalysisDBAdaptor.QueryParams.INTERNAL_CVDB_INDEX.key(), cvdbIndexStatus); + } else { + logger.warn("CVDB index status is unexpectedly set to '{}'. Although the user is closing the case, OpenCGA" + + " cannot automatically infer which should be the new CVDB index status.", + clinicalAnalysis.getInternal().getCvdbIndex().getId()); + } } } } @@ -1774,7 +1804,7 @@ private OpenCGAResult update(String organizationId, Study stud } public OpenCGAResult updateReport(String studyStr, String clinicalAnalysisId, ClinicalReport report, - QueryOptions options, String token) throws CatalogException { + QueryOptions options, String token) throws CatalogException { JwtPayload tokenPayload = catalogManager.getUserManager().validateToken(token); CatalogFqn studyFqn = CatalogFqn.extractFqnFromStudy(studyStr, tokenPayload); @@ -1861,6 +1891,44 @@ public OpenCGAResult updateReport(String studyStr, String clinic } } + public OpenCGAResult updateCvdbIndex(String studyFqn, ClinicalAnalysis clinical, CvdbIndexStatus index, String token) + throws CatalogException { + JwtPayload tokenPayload = catalogManager.getUserManager().validateToken(token); + CatalogFqn catalogFqn = CatalogFqn.extractFqnFromStudy(studyFqn, tokenPayload); + String organizationId = catalogFqn.getOrganizationId(); + String userId = tokenPayload.getUserId(organizationId); + + ObjectMap auditParams = new ObjectMap() + .append("studyFqn", studyFqn) + .append("clinical", clinical.getId()) + .append("cvdbIndex", index) + .append("token", token); + + String studyId = studyFqn; + String studyUuid = ""; + try { + authorizationManager.checkIsAtLeastOrganizationOwnerOrAdmin(organizationId, userId); + Study study = studyManager.resolveId(catalogFqn, StudyManager.INCLUDE_STUDY_IDS, tokenPayload); + studyId = study.getFqn(); + studyUuid = study.getUuid(); + + ObjectMap valueAsMap = new ObjectMap(getUpdateObjectMapper().writeValueAsString(index)); + ObjectMap params = new ObjectMap(ClinicalAnalysisDBAdaptor.QueryParams.INTERNAL_CVDB_INDEX.key(), valueAsMap); + + OpenCGAResult update = getClinicalAnalysisDBAdaptor(organizationId).update(clinical.getUid(), params, + Collections.emptyList(), Collections.emptyList(), QueryOptions.empty()); + auditManager.audit(organizationId, userId, Enums.Action.UPDATE_INTERNAL, Enums.Resource.CLINICAL_ANALYSIS, clinical.getId(), + clinical.getUuid(), studyId, studyUuid, auditParams, new AuditRecord.Status(AuditRecord.Status.Result.SUCCESS)); + return new OpenCGAResult<>(update.getTime(), update.getEvents(), 1, Collections.emptyList(), 1); + } catch (Exception e) { + auditManager.audit(organizationId, userId, Enums.Action.UPDATE_INTERNAL, Enums.Resource.CLINICAL_ANALYSIS, clinical.getId(), + clinical.getUuid(), studyId, studyUuid, auditParams, new AuditRecord.Status(AuditRecord.Status.Result.ERROR, + new Error().setName(e.getMessage()))); + throw new CatalogException("Could not update CVDB Index status: " + e.getMessage(), e); + } + } + + /** * Sort the family members in the following order: proband, father, mother, others. * diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerExternalResource.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerExternalResource.java index 09c94ee33d..fed6768574 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerExternalResource.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/CatalogManagerExternalResource.java @@ -47,17 +47,25 @@ */ public class CatalogManagerExternalResource extends ExternalResource { - private CatalogManager catalogManager; - private Configuration configuration; - private Path opencgaHome; - private String adminToken; + protected CatalogManager catalogManager; + protected Configuration configuration; + protected Path opencgaHome; + protected String adminToken; public boolean initialized = false; + protected Path sourceAnalysisPath; + public CatalogManagerExternalResource() { + this(Paths.get("../opencga-app/app/analysis/")); + } + + public CatalogManagerExternalResource(Path sourceAnalysisPath) { + this.sourceAnalysisPath = sourceAnalysisPath; Configurator.setLevel("org.mongodb.driver.cluster", Level.WARN); Configurator.setLevel("org.mongodb.driver.connection", Level.WARN); } + @Override public void before() throws Exception { initialized = true; @@ -93,8 +101,9 @@ public Path clearOpenCGAHome(String testName) throws IOException { // Pedigree graph analysis Path analysisPath = Files.createDirectories(opencgaHome.resolve("analysis/pedigree-graph")).toAbsolutePath(); - FileInputStream inputStream = new FileInputStream("../opencga-app/app/analysis/pedigree-graph/ped.R"); - Files.copy(inputStream, analysisPath.resolve("ped.R"), StandardCopyOption.REPLACE_EXISTING); + Files.copy(sourceAnalysisPath.resolve("pedigree-graph/ped.R"), + analysisPath.resolve("ped.R"), StandardCopyOption.REPLACE_EXISTING); + return opencgaHome; } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/ClinicalAnalysisInternal.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/ClinicalAnalysisInternal.java index 425654bcc5..9c6f050674 100644 --- a/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/ClinicalAnalysisInternal.java +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/ClinicalAnalysisInternal.java @@ -22,23 +22,27 @@ public class ClinicalAnalysisInternal extends Internal { + private CvdbIndexStatus cvdbIndex; + public ClinicalAnalysisInternal() { } - public ClinicalAnalysisInternal(String registrationDate, String modificationDate, InternalStatus status) { - super(status, registrationDate, modificationDate); + public ClinicalAnalysisInternal(InternalStatus status, String registrationDate, String lastModified, CvdbIndexStatus cvdbIndex) { + super(status, registrationDate, lastModified); + this.cvdbIndex = cvdbIndex; } public static ClinicalAnalysisInternal init() { - return new ClinicalAnalysisInternal(TimeUtils.getTime(), TimeUtils.getTime(), new InternalStatus()); + return new ClinicalAnalysisInternal(new InternalStatus(), TimeUtils.getTime(), TimeUtils.getTime(), new CvdbIndexStatus()); } @Override public String toString() { final StringBuilder sb = new StringBuilder("ClinicalAnalysisInternal{"); - sb.append("status=").append(status); + sb.append("cvdbIndex=").append(cvdbIndex); + sb.append(", status=").append(status); sb.append(", registrationDate='").append(registrationDate).append('\''); - sb.append(", modificationDate='").append(lastModified).append('\''); + sb.append(", lastModified='").append(lastModified).append('\''); sb.append('}'); return sb.toString(); } @@ -69,4 +73,13 @@ public ClinicalAnalysisInternal setLastModified(String lastModified) { this.lastModified = lastModified; return this; } + + public CvdbIndexStatus getCvdbIndex() { + return cvdbIndex; + } + + public ClinicalAnalysisInternal setCvdbIndex(CvdbIndexStatus cvdbIndex) { + this.cvdbIndex = cvdbIndex; + return this; + } } diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/CvdbIndexStatus.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/CvdbIndexStatus.java new file mode 100644 index 0000000000..27338848ee --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/clinical/CvdbIndexStatus.java @@ -0,0 +1,56 @@ +package org.opencb.opencga.core.models.clinical; + +import org.opencb.opencga.core.models.common.OperationIndexStatus; + +import java.util.Arrays; +import java.util.List; + +public class CvdbIndexStatus extends OperationIndexStatus { + + public static final String ERROR = "ERROR"; + public static final String PENDING_REMOVE = "PENDING_REMOVE"; + public static final String PENDING_OVERWRITE = "PENDING_OVERWRITE"; + + public static final List STATUS_LIST = Arrays.asList(NONE, PENDING, PENDING_REMOVE, PENDING_OVERWRITE, READY, ERROR); + + public CvdbIndexStatus(String status, String message) { + if (isValid(status)) { + init(status, message); + } else { + throw new IllegalArgumentException("Unknown status " + status); + } + } + + public CvdbIndexStatus(String status) { + this(status, ""); + } + + public CvdbIndexStatus() { + this(NONE, ""); + } + + @Override + public String getId() { + return super.getId(); + } + + @Override + public String getName() { + return super.getName(); + } + + public static CvdbIndexStatus init() { + return new CvdbIndexStatus(); + } + + public static boolean isValid(String status) { + return status != null + && (status.equals(NONE) + || status.equals(PENDING) + || status.equals(PENDING_REMOVE) + || status.equals(PENDING_OVERWRITE) + || status.equals(READY) + || status.equals(ERROR)); + } + +} diff --git a/opencga-core/src/main/java/org/opencb/opencga/core/models/common/OperationIndexStatus.java b/opencga-core/src/main/java/org/opencb/opencga/core/models/common/OperationIndexStatus.java new file mode 100644 index 0000000000..ae0c4ec19c --- /dev/null +++ b/opencga-core/src/main/java/org/opencb/opencga/core/models/common/OperationIndexStatus.java @@ -0,0 +1,48 @@ +package org.opencb.opencga.core.models.common; + +import java.util.Arrays; +import java.util.List; + +public class OperationIndexStatus extends IndexStatus { + + public static final String PENDING = "PENDING"; + + public static final List STATUS_LIST = Arrays.asList(READY, PENDING, NONE); + + public OperationIndexStatus(String status, String message) { + if (isValid(status)) { + init(status, message); + } else { + throw new IllegalArgumentException("Unknown status " + status); + } + } + + public OperationIndexStatus(String status) { + this(status, ""); + } + + public OperationIndexStatus() { + this(NONE, ""); + } + + @Override + public String getId() { + return super.getId(); + } + + @Override + public String getName() { + return super.getName(); + } + + public static OperationIndexStatus init() { + return new OperationIndexStatus(); + } + + public static boolean isValid(String status) { + return status != null + && (status.equals(READY) + || status.equals(PENDING) + || status.equals(NONE)); + } +} diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/generator/writers/ParentClientRestApiWriter.java b/opencga-server/src/main/java/org/opencb/opencga/server/generator/writers/ParentClientRestApiWriter.java index 99bcf16254..b34d5191a5 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/generator/writers/ParentClientRestApiWriter.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/generator/writers/ParentClientRestApiWriter.java @@ -223,6 +223,8 @@ protected static String getMethodName(String subpath) { methodName = items[3] + "_" + items[1]; } else if (items[1].contains("}") && (!items[0].contains("}") && !items[2].contains("}") && !items[3].contains("}"))) { methodName = items[0] + "_" + items[3] + "_" + items[2]; + } else if (items[2].contains("}") && (!items[0].contains("}") && !items[1].contains("}") && !items[3].contains("}"))) { + methodName = items[0] + "_" + items[1] + "_" + items[3]; } } else if (items.length == 5) { if (items[0].contains("}") && items[2].contains("}") && (!items[1].contains("}")) && (!items[3].contains("}")) diff --git a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java index 269424eb52..7a68982d64 100644 --- a/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java +++ b/opencga-server/src/main/java/org/opencb/opencga/server/rest/analysis/VariantWebService.java @@ -1407,7 +1407,7 @@ protected Query getVariantQuery() { } // FIXME This method must be deleted once deprecated params are not supported any more - static Query getVariantQuery(QueryOptions queryOptions) { + public static Query getVariantQuery(QueryOptions queryOptions) { Query query = VariantStorageManager.getVariantQuery(queryOptions); queryOptions.forEach((key, value) -> { org.opencb.commons.datastore.core.QueryParam newKey = DEPRECATED_VARIANT_QUERY_PARAM.get(key);