Skip to content

Commit

Permalink
✨ [REST API] Implemented StorableNotFoundExceptionMapper and releated…
Browse files Browse the repository at this point in the history
… resources

Signed-off-by: Alberto Codutti <[email protected]>
  • Loading branch information
Coduz committed Jan 30, 2025
1 parent 95191ea commit 5e5def2
Show file tree
Hide file tree
Showing 12 changed files with 169 additions and 6 deletions.
4 changes: 4 additions & 0 deletions commons-rest/errors/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@
<groupId>org.eclipse.kapua</groupId>
<artifactId>kapua-endpoint-api</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.kapua</groupId>
<artifactId>kapua-service-storable-api</artifactId>
</dependency>

<!-- re-declare as provided as our web container will provide this -->
<dependency>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*******************************************************************************
* Copyright (c) 2017, 2022 Eurotech and/or its affiliates and others
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Eurotech - initial API and implementation
*******************************************************************************/
package org.eclipse.kapua.commons.rest.errors;

import org.eclipse.kapua.commons.rest.model.errors.StorableNotFoundExceptionInfo;
import org.eclipse.kapua.service.storable.exception.StorableNotFoundException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Inject;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class StorableNotFoundExceptionMapper implements ExceptionMapper<StorableNotFoundException> {

private static final Logger LOG = LoggerFactory.getLogger(StorableNotFoundExceptionMapper.class);

private final boolean showStackTrace;

@Inject
public StorableNotFoundExceptionMapper(ExceptionConfigurationProvider exceptionConfigurationProvider) {
this.showStackTrace = exceptionConfigurationProvider.showStackTrace();
}

@Override
public Response toResponse(StorableNotFoundException kapuaEntityNotFoundException) {
LOG.error(kapuaEntityNotFoundException.getMessage(), kapuaEntityNotFoundException);
return Response
.status(Status.NOT_FOUND)
.entity(new StorableNotFoundExceptionInfo(Status.NOT_FOUND.getStatusCode(), kapuaEntityNotFoundException, showStackTrace))
.build();
}
}
4 changes: 4 additions & 0 deletions commons-rest/model/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@
<groupId>org.eclipse.kapua</groupId>
<artifactId>kapua-scheduler-api</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.kapua</groupId>
<artifactId>kapua-service-storable-api</artifactId>
</dependency>

<!-- Testing dependencies -->
<dependency>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/*******************************************************************************
* Copyright (c) 2024, 2022 Eurotech and/or its affiliates and others
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Eurotech - initial API and implementation
*******************************************************************************/
package org.eclipse.kapua.commons.rest.model.errors;

import org.eclipse.kapua.model.id.KapuaIdAdapter;
import org.eclipse.kapua.service.storable.exception.StorableNotFoundException;
import org.eclipse.kapua.service.storable.model.id.StorableId;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement(name = "storableNotFoundExceptionInfo")
@XmlAccessorType(XmlAccessType.FIELD)
public class StorableNotFoundExceptionInfo extends ExceptionInfo {

@XmlElement(name = "storableType")
private String storableType;

@XmlElement(name = "storableId")
@XmlJavaTypeAdapter(KapuaIdAdapter.class)
private StorableId storableId;

/**
* Constructor.
*
* @since 2.0.0
*/
protected StorableNotFoundExceptionInfo() {
super();
}

/**
* Constructor.
*
* @param httpStatusCode The http status code of the response containing this info
* @param storableNotFoundException The {@link StorableNotFoundException}.
* @since 2.0.0
*/
public StorableNotFoundExceptionInfo(int httpStatusCode, StorableNotFoundException storableNotFoundException, boolean showStackTrace) {
super(httpStatusCode, storableNotFoundException, showStackTrace);

this.storableType = storableNotFoundException.getStorableType();
this.storableId = storableNotFoundException.getStorableId();
}

/**
* Gets the {@link StorableNotFoundException#getStorableType()}
*
* @return The {@link StorableNotFoundException#getStorableType()}.
* @since 2.0.0
*/
public String getEntityType() {
return storableType;
}

/**
* Gets the {@link StorableNotFoundException#getStorableId()}.
*
* @return The {@link StorableNotFoundException#getStorableId()}.
* @since 2.0.0
*/
public StorableId getStorableId() {
return storableId;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,11 @@ public JsonDatastoreMessage(DatastoreMessage datastoreMessage) {
setPayload(datastoreMessage.getPayload());
}

@Override
public String getType() {
return DatastoreMessage.TYPE;
}

@XmlElement(name = "datastoreId")
@XmlJavaTypeAdapter(StorableIdXmlAdapter.class)
public StorableId getDatastoreId() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
import org.eclipse.kapua.KapuaEntityNotFoundException;
import org.eclipse.kapua.model.KapuaEntity;
import org.eclipse.kapua.model.id.KapuaId;
import org.eclipse.kapua.service.storable.exception.StorableNotFoundException;
import org.eclipse.kapua.service.storable.model.Storable;
import org.eclipse.kapua.service.storable.model.id.StorableId;

import javax.ws.rs.NotFoundException;
import javax.ws.rs.WebApplicationException;
Expand Down Expand Up @@ -68,6 +71,27 @@ public <T extends KapuaEntity> T returnNotNullEntity(T entity, String entityType
return entity;
}

/**
* Checks id the given {@link Storable} is {@code null}.
* <p>
* Similar to {@link #returnNotNullEntity(KapuaEntity, String, KapuaId)} but for {@link Storable}s.
*
* @param storable The {@link Storable} to check.
* @param storableType The {@link Storable#getType()}
* @param storableId The {@link StorableId}
* @return The given {@link Storable} if not {@code null}
* @param <T> The type of the {@link Storable}.
* @throws StorableNotFoundException if given {@link Storable} is {@code null}.
* @since 2.0.0
*/
public <T extends Storable> T returnNotNullStorable(T storable, String storableType, StorableId storableId) throws StorableNotFoundException {
if (storable == null) {
throw new StorableNotFoundException(storableType, storableId);
}

return storable;
}

/**
* Builds a 200 HTTP Response.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,6 @@ public ChannelInfo find(@PathParam("scopeId") ScopeId scopeId,
throws KapuaException {
ChannelInfo channelInfo = channelInfoRegistryService.find(scopeId, channelInfoId);

return returnNotNullEntity(channelInfo);
return returnNotNullStorable(channelInfo, ChannelInfo.TYPE, channelInfoId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,6 @@ public ClientInfo find(@PathParam("scopeId") ScopeId scopeId,
throws KapuaException {
ClientInfo clientInfo = clientInfoRegistryService.find(scopeId, clientInfoId);

return returnNotNullEntity(clientInfo);
return returnNotNullStorable(clientInfo, ClientInfo.TYPE, clientInfoId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ public DatastoreMessage find(@PathParam("scopeId") ScopeId scopeId,
throws KapuaException {
DatastoreMessage datastoreMessage = messageStoreService.find(scopeId, datastoreMessageId, StorableFetchStyle.SOURCE_FULL);

return returnNotNullEntity(datastoreMessage);
return returnNotNullStorable(datastoreMessage, DatastoreMessage.TYPE, datastoreMessageId);
}

//TODO: move this logic within the service, or at least in a collaborator shared with DataMessagesJson
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -221,11 +221,11 @@ public JsonMessageListResult queryJson(@PathParam("scopeId") ScopeId scopeId,
public JsonDatastoreMessage findJson(@PathParam("scopeId") ScopeId scopeId,
@PathParam("datastoreMessageId") StorableEntityId datastoreMessageId)
throws KapuaException {
DatastoreMessage datastoreMessage = returnNotNullEntity(messageStoreService.find(scopeId, datastoreMessageId, StorableFetchStyle.SOURCE_FULL));
DatastoreMessage datastoreMessage = returnNotNullStorable(messageStoreService.find(scopeId, datastoreMessageId, StorableFetchStyle.SOURCE_FULL), DatastoreMessage.TYPE, datastoreMessageId);

JsonDatastoreMessage jsonDatastoreMessage = new JsonDatastoreMessage(datastoreMessage);

return returnNotNullEntity(jsonDatastoreMessage);
return returnNotNullStorable(jsonDatastoreMessage, DatastoreMessage.TYPE, datastoreMessageId);
}

private MessageQuery convertQuery(JsonMessageQuery query) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,6 @@ public MetricInfo find(@PathParam("scopeId") ScopeId scopeId,
throws KapuaException {
MetricInfo metricInfo = metricInfoRegistryService.find(scopeId, metricInfoId);

return returnNotNullEntity(metricInfo);
return returnNotNullStorable(metricInfo, MetricInfo.TYPE, metricInfoId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
import org.eclipse.kapua.commons.rest.model.errors.SelfManagedOnlyExceptionInfo;
import org.eclipse.kapua.commons.rest.model.errors.ServiceConfigurationLimitExceededExceptionInfo;
import org.eclipse.kapua.commons.rest.model.errors.ServiceConfigurationParentLimitExceededExceptionInfo;
import org.eclipse.kapua.commons.rest.model.errors.StorableNotFoundExceptionInfo;
import org.eclipse.kapua.commons.rest.model.errors.SubjectUnauthorizedExceptionInfo;
import org.eclipse.kapua.commons.rest.model.errors.ThrowableInfo;
import org.eclipse.kapua.commons.service.event.store.api.EventStoreRecordCreator;
Expand Down Expand Up @@ -367,6 +368,7 @@ public JAXBContext getJAXBContext() throws KapuaException {
IllegalArgumentExceptionInfo.class,
IllegalNullArgumentExceptionInfo.class,
MfaRequiredExceptionInfo.class,
StorableNotFoundExceptionInfo.class,

// Jobs Exception Info
CleanJobDataExceptionInfo.class,
Expand Down

0 comments on commit 5e5def2

Please sign in to comment.