From e518ee89f2de10a29ac0d8b94d06c5542fc45ad1 Mon Sep 17 00:00:00 2001 From: pfurio Date: Fri, 22 Mar 2024 14:43:18 +0100 Subject: [PATCH 1/4] catalog: return array of projects in Organization, #TASK-5922 --- .../db/mongodb/ProjectMongoDBAdaptor.java | 14 +++++-- .../iterators/CatalogMongoDBIterator.java | 22 +++++++++++ .../OrganizationCatalogMongoDBIterator.java | 21 +++++++++- .../managers/OrganizationManagerTest.java | 38 +++++++++++++++++++ 4 files changed, 91 insertions(+), 4 deletions(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ProjectMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ProjectMongoDBAdaptor.java index 17bf24e8d39..e40ad419d11 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ProjectMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ProjectMongoDBAdaptor.java @@ -543,8 +543,12 @@ public OpenCGAResult get(Query query, QueryOptions options, String user @Override public OpenCGAResult nativeGet(Query query, QueryOptions options) throws CatalogDBException { + return nativeGet(null, query, options); + } + + public OpenCGAResult nativeGet(ClientSession clientSession, Query query, QueryOptions options) throws CatalogDBException { long startTime = startQuery(); - try (DBIterator dbIterator = nativeIterator(query, options)) { + try (DBIterator dbIterator = nativeIterator(clientSession, query, options)) { return endQuery(startTime, dbIterator); } } @@ -570,11 +574,15 @@ public DBIterator iterator(ClientSession clientSession, Query query, Qu @Override public DBIterator nativeIterator(Query query, QueryOptions options) throws CatalogDBException { + return nativeIterator(null, query, options); + } + + public DBIterator nativeIterator(ClientSession clientSession, Query query, QueryOptions options) throws CatalogDBException { QueryOptions queryOptions = options != null ? new QueryOptions(options) : new QueryOptions(); queryOptions.put(NATIVE_QUERY, true); - MongoDBIterator mongoCursor = getMongoCursor(null, query, queryOptions); - return new ProjectCatalogMongoDBIterator<>(mongoCursor, null, null, dbAdaptorFactory, options, null); + MongoDBIterator mongoCursor = getMongoCursor(clientSession, query, queryOptions); + return new ProjectCatalogMongoDBIterator<>(mongoCursor, clientSession, null, dbAdaptorFactory, options, null); } @Override diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/CatalogMongoDBIterator.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/CatalogMongoDBIterator.java index 50666864c1d..11327f86e39 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/CatalogMongoDBIterator.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/CatalogMongoDBIterator.java @@ -185,4 +185,26 @@ protected QueryOptions createInnerQueryOptionsForVersionedEntity(QueryOptions op return queryOptions; } + protected boolean includeField(QueryOptions options, String field) { + if (options.containsKey(QueryOptions.INCLUDE)) { + List currentIncludeList = options.getAsStringList(QueryOptions.INCLUDE); + for (String include : currentIncludeList) { + if (include.startsWith(field)) { + return true; + } + } + return false; + } else if (options.containsKey(QueryOptions.EXCLUDE)) { + List currentExcludeList = options.getAsStringList(QueryOptions.EXCLUDE); + for (String exclude : currentExcludeList) { + if (exclude.equals(field)) { + return false; + } + } + return true; + } + + return true; + } + } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/OrganizationCatalogMongoDBIterator.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/OrganizationCatalogMongoDBIterator.java index b5aef39398c..0063f764e30 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/OrganizationCatalogMongoDBIterator.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/OrganizationCatalogMongoDBIterator.java @@ -2,12 +2,16 @@ import com.mongodb.client.ClientSession; import org.bson.Document; +import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.mongodb.GenericDocumentComplexConverter; import org.opencb.commons.datastore.mongodb.MongoDBIterator; import org.opencb.opencga.catalog.db.api.OrganizationDBAdaptor; import org.opencb.opencga.catalog.db.mongodb.MigrationMongoDBAdaptor; import org.opencb.opencga.catalog.db.mongodb.OrganizationMongoDBAdaptorFactory; +import org.opencb.opencga.catalog.db.mongodb.ProjectMongoDBAdaptor; +import org.opencb.opencga.catalog.exceptions.CatalogDBException; +import org.opencb.opencga.core.response.OpenCGAResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,9 +24,11 @@ public class OrganizationCatalogMongoDBIterator extends CatalogMongoDBIterato private final String user; private final QueryOptions options; + private final QueryOptions projectOptions; private final Queue organizationListBuffer; - private MigrationMongoDBAdaptor migrationDBAdaptor; + private final MigrationMongoDBAdaptor migrationDBAdaptor; + private final ProjectMongoDBAdaptor projectMongoDBAdaptor; private final Logger logger; @@ -33,9 +39,12 @@ public OrganizationCatalogMongoDBIterator(MongoDBIterator mongoCursor, super(mongoCursor, clientSession, converter, null); this.options = options != null ? new QueryOptions(options) : new QueryOptions(); + this.projectOptions = createInnerQueryOptionsForVersionedEntity(this.options, OrganizationDBAdaptor.QueryParams.PROJECTS.key(), + true); this.user = user; this.migrationDBAdaptor = dbAdaptorFactory.getMigrationDBAdaptor(); + this.projectMongoDBAdaptor = dbAdaptorFactory.getCatalogProjectDBAdaptor(); this.organizationListBuffer = new LinkedList<>(); this.logger = LoggerFactory.getLogger(OrganizationCatalogMongoDBIterator.class); @@ -78,6 +87,16 @@ private void fetchNextBatch() { internal.put("migrationExecutions", migrationRuns); } + if (includeField(options, OrganizationDBAdaptor.QueryParams.PROJECTS.key())) { + OpenCGAResult openCGAResult = null; + try { + openCGAResult = projectMongoDBAdaptor.nativeGet(clientSession, new Query(), projectOptions); + } catch (CatalogDBException e) { + logger.warn("Could not fetch projects for organization."); + } + organizationDocument.put(OrganizationDBAdaptor.QueryParams.PROJECTS.key(), openCGAResult.getResults()); + } + organizationListBuffer.add(organizationDocument); } } diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/OrganizationManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/OrganizationManagerTest.java index cf2779c97de..babb1ddfc07 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/OrganizationManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/OrganizationManagerTest.java @@ -11,6 +11,7 @@ import org.opencb.opencga.core.models.organizations.Organization; import org.opencb.opencga.core.models.organizations.OrganizationConfiguration; import org.opencb.opencga.core.models.organizations.OrganizationUpdateParams; +import org.opencb.opencga.core.models.project.Project; import org.opencb.opencga.core.testclassification.duration.MediumTests; import java.util.Arrays; @@ -76,6 +77,43 @@ public void updateAuthOriginTest() throws CatalogException { assertEquals(authOrigin.getAlgorithm(), organization.getConfiguration().getAuthenticationOrigins().get(0).getAlgorithm()); } + @Test + public void organizationInfoTest() throws CatalogException { + Organization organization = catalogManager.getOrganizationManager().get(organizationId, QueryOptions.empty(), ownerToken).first(); + assertEquals(3, organization.getProjects().size()); + for (Project project : organization.getProjects()) { + assertNotNull(project.getFqn()); + assertNotNull(project.getName()); + assertNotNull(project.getCreationDate()); + } + + QueryOptions options = new QueryOptions(QueryOptions.INCLUDE, "name"); + organization = catalogManager.getOrganizationManager().get(organizationId, options, ownerToken).first(); + assertNull(organization.getProjects()); + + options = new QueryOptions(QueryOptions.EXCLUDE, "projects"); + organization = catalogManager.getOrganizationManager().get(organizationId, options, ownerToken).first(); + assertNull(organization.getProjects()); + + options = new QueryOptions(QueryOptions.INCLUDE, "projects.fqn"); + organization = catalogManager.getOrganizationManager().get(organizationId, options, ownerToken).first(); + assertEquals(3, organization.getProjects().size()); + for (Project project : organization.getProjects()) { + assertNotNull(project.getFqn()); + assertNull(project.getName()); + assertNull(project.getCreationDate()); + } + + options = new QueryOptions(QueryOptions.EXCLUDE, "projects.name"); + organization = catalogManager.getOrganizationManager().get(organizationId, options, ownerToken).first(); + assertEquals(3, organization.getProjects().size()); + for (Project project : organization.getProjects()) { + assertNotNull(project.getFqn()); + assertNull(project.getName()); + assertNotNull(project.getCreationDate()); + } + } + @Test public void migrationExecutionProjectionTest() throws CatalogException { Organization organization = catalogManager.getOrganizationManager().get(organizationId, null, ownerToken).first(); From f50bf22779301da559eb97c05cc748ef822bdd0c Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 25 Mar 2024 12:21:55 +0100 Subject: [PATCH 2/4] catalog: ensure projects are shown to authorised users, #TASK-5922 --- .../catalog/db/api/OrganizationDBAdaptor.java | 6 ++-- .../mongodb/OrganizationMongoDBAdaptor.java | 30 +++++++++++-------- .../db/mongodb/ProjectMongoDBAdaptor.java | 16 ++++++++-- .../OrganizationCatalogMongoDBIterator.java | 12 ++++++-- .../catalog/managers/OrganizationManager.java | 2 +- .../managers/OrganizationManagerTest.java | 24 ++++++++++++++- 6 files changed, 67 insertions(+), 23 deletions(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/OrganizationDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/OrganizationDBAdaptor.java index e1eadaf0a93..5f478d5ab89 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/OrganizationDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/api/OrganizationDBAdaptor.java @@ -92,9 +92,9 @@ public static QueryParams getParam(String key) { // OpenCGAResult insert(Organization organization, QueryOptions options) throws CatalogDBException, CatalogParameterException, CatalogAuthorizationException; -// -// OpenCGAResult get(String userId, QueryOptions options) throws CatalogDBException; -// + + OpenCGAResult get(String userId, QueryOptions options) throws CatalogDBException; + OpenCGAResult get(QueryOptions options) throws CatalogDBException; // // OpenCGAResult incrementCurrentRelease(long projectId) throws CatalogDBException; diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/OrganizationMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/OrganizationMongoDBAdaptor.java index 4185bc06560..ece41671fb0 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/OrganizationMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/OrganizationMongoDBAdaptor.java @@ -97,11 +97,24 @@ Organization insert(ClientSession clientSession, Organization organization) return organization; } + @Override + public OpenCGAResult get(String user, QueryOptions options) throws CatalogDBException { + return get(null, user, options); + } + @Override public OpenCGAResult get(QueryOptions options) throws CatalogDBException { - return get(null, options); + return get(null, null, options); + } + + OpenCGAResult get(ClientSession clientSession, String user, QueryOptions options) throws CatalogDBException { + long startTime = startQuery(); + try (DBIterator dbIterator = iterator(clientSession, user, options)) { + return endQuery(startTime, dbIterator); + } } + @Override public OpenCGAResult update(String organizationId, ObjectMap parameters, QueryOptions queryOptions) throws CatalogDBException, CatalogParameterException, CatalogAuthorizationException { @@ -234,13 +247,6 @@ private UpdateDocument getValidatedUpdateParams(ClientSession clientSession, Obj return document; } - OpenCGAResult get(ClientSession clientSession, QueryOptions options) throws CatalogDBException { - long startTime = startQuery(); - try (DBIterator dbIterator = iterator(clientSession, options)) { - return endQuery(startTime, dbIterator); - } - } - @Override public OpenCGAResult delete(Organization organization) throws CatalogDBException { return null; @@ -248,12 +254,12 @@ public OpenCGAResult delete(Organization organization) throws Cata @Override public DBIterator iterator(QueryOptions options) throws CatalogDBException { - return iterator(null, options); + return iterator(null, null, options); } - public DBIterator iterator(ClientSession clientSession, QueryOptions options) throws CatalogDBException { + public DBIterator iterator(ClientSession clientSession, String user, QueryOptions options) throws CatalogDBException { MongoDBIterator mongoCursor = getMongoCursor(clientSession, options); - return new OrganizationCatalogMongoDBIterator<>(mongoCursor, clientSession, organizationConverter, dbAdaptorFactory, options, null); + return new OrganizationCatalogMongoDBIterator<>(mongoCursor, clientSession, organizationConverter, dbAdaptorFactory, options, user); } private MongoDBIterator getMongoCursor(ClientSession clientSession, QueryOptions options) { @@ -269,7 +275,7 @@ private MongoDBIterator getMongoCursor(ClientSession clientSession, Qu } public List getOwnerAndAdmins(ClientSession clientSession) throws CatalogDBException { - Organization organization = get(clientSession, OrganizationManager.INCLUDE_ORGANIZATION_ADMINS).first(); + Organization organization = get(clientSession, null, OrganizationManager.INCLUDE_ORGANIZATION_ADMINS).first(); List members = new ArrayList<>(organization.getAdmins().size() + 1); if (StringUtils.isNotEmpty(organization.getOwner())) { members.add(organization.getOwner()); diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ProjectMongoDBAdaptor.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ProjectMongoDBAdaptor.java index e40ad419d11..e9be9ac6563 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ProjectMongoDBAdaptor.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/ProjectMongoDBAdaptor.java @@ -556,8 +556,13 @@ public OpenCGAResult nativeGet(ClientSession clientSession, Query quer @Override public OpenCGAResult nativeGet(Query query, QueryOptions options, String user) throws CatalogDBException, CatalogAuthorizationException { + return nativeGet(null, query, options, user); + } + + public OpenCGAResult nativeGet(ClientSession clientSession, Query query, QueryOptions options, String user) + throws CatalogDBException, CatalogAuthorizationException { long startTime = startQuery(); - try (DBIterator dbIterator = nativeIterator(query, options, user)) { + try (DBIterator dbIterator = nativeIterator(clientSession, query, options, user)) { return endQuery(startTime, dbIterator); } } @@ -595,11 +600,16 @@ public DBIterator iterator(Query query, QueryOptions options, String us @Override public DBIterator nativeIterator(Query query, QueryOptions options, String user) throws CatalogDBException, CatalogAuthorizationException { + return nativeIterator(null, query, options, user); + } + + public DBIterator nativeIterator(ClientSession clientSession, Query query, QueryOptions options, String user) + throws CatalogDBException, CatalogAuthorizationException { QueryOptions queryOptions = options != null ? new QueryOptions(options) : new QueryOptions(); queryOptions.put(NATIVE_QUERY, true); - MongoDBIterator mongoCursor = getMongoCursor(null, query, queryOptions, user); - return new ProjectCatalogMongoDBIterator<>(mongoCursor, null, null, dbAdaptorFactory, options, user); + MongoDBIterator mongoCursor = getMongoCursor(clientSession, query, queryOptions, user); + return new ProjectCatalogMongoDBIterator<>(mongoCursor, clientSession, null, dbAdaptorFactory, options, user); } // private MongoDBIterator getMongoCursor(ClientSession clientSession, Query query, QueryOptions options, String user) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/OrganizationCatalogMongoDBIterator.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/OrganizationCatalogMongoDBIterator.java index 0063f764e30..0e9f57ad912 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/OrganizationCatalogMongoDBIterator.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/OrganizationCatalogMongoDBIterator.java @@ -1,6 +1,7 @@ package org.opencb.opencga.catalog.db.mongodb.iterators; import com.mongodb.client.ClientSession; +import org.apache.commons.lang3.StringUtils; import org.bson.Document; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; @@ -10,6 +11,7 @@ import org.opencb.opencga.catalog.db.mongodb.MigrationMongoDBAdaptor; import org.opencb.opencga.catalog.db.mongodb.OrganizationMongoDBAdaptorFactory; import org.opencb.opencga.catalog.db.mongodb.ProjectMongoDBAdaptor; +import org.opencb.opencga.catalog.exceptions.CatalogAuthorizationException; import org.opencb.opencga.catalog.exceptions.CatalogDBException; import org.opencb.opencga.core.response.OpenCGAResult; import org.slf4j.Logger; @@ -90,9 +92,13 @@ private void fetchNextBatch() { if (includeField(options, OrganizationDBAdaptor.QueryParams.PROJECTS.key())) { OpenCGAResult openCGAResult = null; try { - openCGAResult = projectMongoDBAdaptor.nativeGet(clientSession, new Query(), projectOptions); - } catch (CatalogDBException e) { - logger.warn("Could not fetch projects for organization."); + if (StringUtils.isNotEmpty(user)) { + openCGAResult = projectMongoDBAdaptor.nativeGet(clientSession, new Query(), projectOptions, user); + } else { + openCGAResult = projectMongoDBAdaptor.nativeGet(clientSession, new Query(), projectOptions); + } + } catch (CatalogDBException | CatalogAuthorizationException e) { + logger.warn("Could not fetch projects for organization.", e); } organizationDocument.put(OrganizationDBAdaptor.QueryParams.PROJECTS.key(), openCGAResult.getResults()); } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/OrganizationManager.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/OrganizationManager.java index ef37a9509be..1cb1d7cc6a8 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/OrganizationManager.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/managers/OrganizationManager.java @@ -131,7 +131,7 @@ public OpenCGAResult get(String organizationId, QueryOptions optio OpenCGAResult queryResult; try { - queryResult = getOrganizationDBAdaptor(organizationId).get(options); + queryResult = getOrganizationDBAdaptor(organizationId).get(userId, options); } catch (CatalogException e) { auditManager.auditInfo(organizationId, userId, Enums.Resource.ORGANIZATION, organizationId, "", "", "", auditParams, new AuditRecord.Status(AuditRecord.Status.Result.ERROR, e.getError())); diff --git a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/OrganizationManagerTest.java b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/OrganizationManagerTest.java index babb1ddfc07..bc9b375143e 100644 --- a/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/OrganizationManagerTest.java +++ b/opencga-catalog/src/test/java/org/opencb/opencga/catalog/managers/OrganizationManagerTest.java @@ -78,7 +78,7 @@ public void updateAuthOriginTest() throws CatalogException { } @Test - public void organizationInfoTest() throws CatalogException { + public void organizationInfoIncludeProjectsTest() throws CatalogException { Organization organization = catalogManager.getOrganizationManager().get(organizationId, QueryOptions.empty(), ownerToken).first(); assertEquals(3, organization.getProjects().size()); for (Project project : organization.getProjects()) { @@ -114,6 +114,28 @@ public void organizationInfoTest() throws CatalogException { } } + @Test + public void organizationInfoProjectsAuthTest() throws CatalogException { + Organization organization = catalogManager.getOrganizationManager().get(organizationId, QueryOptions.empty(), ownerToken).first(); + assertEquals(3, organization.getProjects().size()); + + organization = catalogManager.getOrganizationManager().get(organizationId, QueryOptions.empty(), orgAdminToken1).first(); + assertEquals(3, organization.getProjects().size()); + + organization = catalogManager.getOrganizationManager().get(organizationId, QueryOptions.empty(), studyAdminToken1).first(); + assertEquals(2, organization.getProjects().size()); + assertArrayEquals(Arrays.asList(projectFqn1, projectFqn2).toArray(), + organization.getProjects().stream().map(Project::getFqn).toArray()); + + organization = catalogManager.getOrganizationManager().get(organizationId, QueryOptions.empty(), normalToken1).first(); + assertEquals(1, organization.getProjects().size()); + assertEquals(projectFqn1, organization.getProjects().get(0).getFqn()); + + organization = catalogManager.getOrganizationManager().get(organizationId, QueryOptions.empty(), noAccessToken1).first(); + assertEquals(1, organization.getProjects().size()); + assertEquals(projectFqn1, organization.getProjects().get(0).getFqn()); + } + @Test public void migrationExecutionProjectionTest() throws CatalogException { Organization organization = catalogManager.getOrganizationManager().get(organizationId, null, ownerToken).first(); From dd6baf9fc041b32e16118a7956a4426033ed381f Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 15 Apr 2024 12:11:02 +0200 Subject: [PATCH 3/4] catalog: propagate exception, #TASK-5922 --- .../OrganizationCatalogMongoDBIterator.java | 10 ++++-- .../exceptions/CatalogRuntimeException.java | 34 +++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 opencga-catalog/src/main/java/org/opencb/opencga/catalog/exceptions/CatalogRuntimeException.java diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/OrganizationCatalogMongoDBIterator.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/OrganizationCatalogMongoDBIterator.java index 505cf26392a..8d277a9295d 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/OrganizationCatalogMongoDBIterator.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/OrganizationCatalogMongoDBIterator.java @@ -15,6 +15,7 @@ import org.opencb.opencga.catalog.db.mongodb.ProjectMongoDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogAuthorizationException; import org.opencb.opencga.catalog.exceptions.CatalogDBException; +import org.opencb.opencga.catalog.exceptions.CatalogRuntimeException; import org.opencb.opencga.core.models.notes.Note; import org.opencb.opencga.core.response.OpenCGAResult; import org.slf4j.Logger; @@ -83,6 +84,7 @@ public E next() { private void fetchNextBatch() { if (mongoCursor.hasNext()) { Document organizationDocument = mongoCursor.next(); + String orgId = organizationDocument.getString(OrganizationDBAdaptor.QueryParams.ID.key()); if (!options.getBoolean(NATIVE_QUERY)) { List migrationFields = Arrays.asList(OrganizationDBAdaptor.QueryParams.INTERNAL.key(), @@ -111,7 +113,7 @@ private void fetchNextBatch() { OpenCGAResult result = noteMongoDBAdaptor.nativeGet(clientSession, query, noteOptions); organizationDocument.put(OrganizationDBAdaptor.QueryParams.NOTES.key(), result.getResults()); } catch (CatalogDBException e) { - logger.warn("Could not obtain the organization notes", e); + throw CatalogRuntimeException.internalException(e, "Could not fetch notes for organization '" + orgId + "'."); } } @@ -124,10 +126,12 @@ private void fetchNextBatch() { } else { openCGAResult = projectMongoDBAdaptor.nativeGet(clientSession, new Query(), projectOptions); } - } catch (CatalogDBException | CatalogAuthorizationException e) { + organizationDocument.put(OrganizationDBAdaptor.QueryParams.PROJECTS.key(), openCGAResult.getResults()); + } catch (CatalogAuthorizationException e) { logger.warn("Could not fetch projects for organization.", e); + } catch (CatalogDBException | RuntimeException e) { + throw CatalogRuntimeException.internalException(e, "Could not fetch projects for organization '" + orgId + "'."); } - organizationDocument.put(OrganizationDBAdaptor.QueryParams.PROJECTS.key(), openCGAResult.getResults()); } } diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/exceptions/CatalogRuntimeException.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/exceptions/CatalogRuntimeException.java new file mode 100644 index 00000000000..81dc17b16af --- /dev/null +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/exceptions/CatalogRuntimeException.java @@ -0,0 +1,34 @@ +package org.opencb.opencga.catalog.exceptions; + +import org.apache.commons.lang3.StringUtils; + +public class CatalogRuntimeException extends IllegalArgumentException { + + public CatalogRuntimeException(String message) { + super(message); + } + + public CatalogRuntimeException(String message, Throwable cause) { + super(message, cause); + } + + public static CatalogRuntimeException internalException(Exception e, String message) { + if (e instanceof CatalogRuntimeException) { + return ((CatalogRuntimeException) e); + } else { + if (StringUtils.isEmpty(message)) { + message = e.getMessage(); + if (StringUtils.isEmpty(message)) { + message = e.toString(); + } + } + return new CatalogRuntimeException("Internal exception: " + message, e); + } + } + + public static CatalogRuntimeException internalException(Exception e) { + return internalException(e, ""); + } + + +} From f5cb4d6185818e6c2f7c8e5edcc7d08cee8e09c5 Mon Sep 17 00:00:00 2001 From: pfurio Date: Mon, 15 Apr 2024 12:13:27 +0200 Subject: [PATCH 4/4] catalog: add orgId to logger, #TASK-5922 --- .../mongodb/iterators/OrganizationCatalogMongoDBIterator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/OrganizationCatalogMongoDBIterator.java b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/OrganizationCatalogMongoDBIterator.java index 8d277a9295d..4dee071b079 100644 --- a/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/OrganizationCatalogMongoDBIterator.java +++ b/opencga-catalog/src/main/java/org/opencb/opencga/catalog/db/mongodb/iterators/OrganizationCatalogMongoDBIterator.java @@ -128,7 +128,7 @@ private void fetchNextBatch() { } organizationDocument.put(OrganizationDBAdaptor.QueryParams.PROJECTS.key(), openCGAResult.getResults()); } catch (CatalogAuthorizationException e) { - logger.warn("Could not fetch projects for organization.", e); + logger.warn("Could not fetch projects for organization '{}'.", orgId, e); } catch (CatalogDBException | RuntimeException e) { throw CatalogRuntimeException.internalException(e, "Could not fetch projects for organization '" + orgId + "'."); }