From 1eba601cb2b30e4f90c82e91c7966a4751dd5687 Mon Sep 17 00:00:00 2001 From: MDeLuise <66636702+MDeLuise@users.noreply.github.com> Date: Tue, 25 Jun 2024 11:32:14 +0200 Subject: [PATCH 1/2] fix(rest-api): handle missing account in `ServiceConfigurations` to prevent NPE Throw `KapuaEntityNotFoundException` when `Account` is not found for given `scopeId` in `ServiceConfigurations` resource. This prevents `NullPointerException` when `scopeId` does not match any account. --- .../v1/resources/ServiceConfigurations.java | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/rest-api/resources/src/main/java/org/eclipse/kapua/app/api/resources/v1/resources/ServiceConfigurations.java b/rest-api/resources/src/main/java/org/eclipse/kapua/app/api/resources/v1/resources/ServiceConfigurations.java index e977de37d62..72794f7a5f3 100644 --- a/rest-api/resources/src/main/java/org/eclipse/kapua/app/api/resources/v1/resources/ServiceConfigurations.java +++ b/rest-api/resources/src/main/java/org/eclipse/kapua/app/api/resources/v1/resources/ServiceConfigurations.java @@ -12,6 +12,22 @@ *******************************************************************************/ package org.eclipse.kapua.app.api.resources.v1.resources; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.eclipse.kapua.KapuaEntityNotFoundException; import org.eclipse.kapua.KapuaException; import org.eclipse.kapua.app.api.core.model.ScopeId; import org.eclipse.kapua.app.api.core.resources.AbstractKapuaResource; @@ -26,21 +42,6 @@ import org.eclipse.kapua.service.config.ServiceConfiguration; import org.eclipse.kapua.service.config.ServiceConfigurationFactory; -import javax.inject.Inject; -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - @Path("{scopeId}/serviceConfigurations") public class ServiceConfigurations extends AbstractKapuaResource { @@ -84,6 +85,9 @@ public Response update( if (KapuaConfigurableService.class.isAssignableFrom(configurableServiceClass)) { KapuaConfigurableService configurableService = (KapuaConfigurableService) locator.getService(configurableServiceClass); Account account = accountService.find(scopeId); + if (account == null) { + throw new KapuaEntityNotFoundException(Account.TYPE, scopeId); + } configurableService.setConfigValues(scopeId, account.getScopeId(), serviceComponentConfiguration.getProperties()); } } @@ -126,6 +130,9 @@ public Response updateComponent( if (KapuaConfigurableService.class.isAssignableFrom(configurableServiceClass)) { KapuaConfigurableService configurableService = (KapuaConfigurableService) locator.getService(configurableServiceClass); Account account = accountService.find(scopeId); + if (account == null) { + throw new KapuaEntityNotFoundException(Account.TYPE, scopeId); + } configurableService.setConfigValues(scopeId, account.getScopeId(), serviceComponentConfiguration.getProperties()); } return Response.noContent().build(); From 09ac94c6224188c024624f5806ba88cdd6dd1d4f Mon Sep 17 00:00:00 2001 From: MDeLuise <66636702+MDeLuise@users.noreply.github.com> Date: Tue, 25 Jun 2024 14:47:05 +0200 Subject: [PATCH 2/2] improve: enhance account not null check --- .../v1/resources/ServiceConfigurations.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/rest-api/resources/src/main/java/org/eclipse/kapua/app/api/resources/v1/resources/ServiceConfigurations.java b/rest-api/resources/src/main/java/org/eclipse/kapua/app/api/resources/v1/resources/ServiceConfigurations.java index 72794f7a5f3..957bb4db818 100644 --- a/rest-api/resources/src/main/java/org/eclipse/kapua/app/api/resources/v1/resources/ServiceConfigurations.java +++ b/rest-api/resources/src/main/java/org/eclipse/kapua/app/api/resources/v1/resources/ServiceConfigurations.java @@ -80,14 +80,14 @@ public Response update( @PathParam("scopeId") ScopeId scopeId, ServiceConfiguration serviceConfiguration ) throws KapuaException, ClassNotFoundException { + Account account = accountService.find(scopeId); + if (account == null) { + throw new KapuaEntityNotFoundException(Account.TYPE, scopeId); + } for (ServiceComponentConfiguration serviceComponentConfiguration : serviceConfiguration.getComponentConfigurations()) { Class configurableServiceClass = (Class) Class.forName(serviceComponentConfiguration.getId()).asSubclass(KapuaService.class); if (KapuaConfigurableService.class.isAssignableFrom(configurableServiceClass)) { KapuaConfigurableService configurableService = (KapuaConfigurableService) locator.getService(configurableServiceClass); - Account account = accountService.find(scopeId); - if (account == null) { - throw new KapuaEntityNotFoundException(Account.TYPE, scopeId); - } configurableService.setConfigValues(scopeId, account.getScopeId(), serviceComponentConfiguration.getProperties()); } } @@ -126,13 +126,13 @@ public Response updateComponent( @PathParam("serviceId") String serviceId, ServiceComponentConfiguration serviceComponentConfiguration ) throws KapuaException, ClassNotFoundException { + Account account = accountService.find(scopeId); + if (account == null) { + throw new KapuaEntityNotFoundException(Account.TYPE, scopeId); + } Class configurableServiceClass = (Class) Class.forName(serviceId).asSubclass(KapuaService.class); if (KapuaConfigurableService.class.isAssignableFrom(configurableServiceClass)) { KapuaConfigurableService configurableService = (KapuaConfigurableService) locator.getService(configurableServiceClass); - Account account = accountService.find(scopeId); - if (account == null) { - throw new KapuaEntityNotFoundException(Account.TYPE, scopeId); - } configurableService.setConfigValues(scopeId, account.getScopeId(), serviceComponentConfiguration.getProperties()); } return Response.noContent().build();