From b4a6cb55391c089d0b0907d3de660e916b5a474f Mon Sep 17 00:00:00 2001 From: Alfredo Oliviero Date: Thu, 16 May 2024 17:59:39 +0200 Subject: [PATCH] service is working --- pom.xml | 75 ++++- .../social_networking/SocialService.java | 25 -- .../SocialServiceApplicationManager.java | 78 ++---- .../mappers/ForbiddenExceptionMapper.java | 56 ++++ .../mappers/IDMExceptionMapper.java | 55 ++++ .../social_networking/rest/Comments.java | 66 ----- .../social_networking/rest/TestRest.java | 37 ++- .../rest/collections/Attachments.java | 34 +-- .../rest/collections/Entities.java | 3 +- .../rest/collections/Vres.java | 262 ++++++++++-------- .../rest/examples/AuthenticatedService.java | 67 +++++ .../examples/ExcludeAuthorizationService.java | 31 +++ .../rest/examples/HelloService.java | 82 ++++++ .../ContainerConfigurationSerializer.java | 45 +++ .../ContainerContextSerializer.java | 42 +++ .../serializers/IdmObjectSerializator.java | 54 ++++ .../examples/serializers/OwnerSerializer.java | 47 ++++ .../ServiceEndpointAccessPointSerializer.java | 64 +++++ .../SimpleCredentialsSerializer.java | 36 +++ 19 files changed, 869 insertions(+), 290 deletions(-) delete mode 100644 src/main/java/org/gcube/social_networking/SocialService.java create mode 100644 src/main/java/org/gcube/social_networking/mappers/ForbiddenExceptionMapper.java create mode 100644 src/main/java/org/gcube/social_networking/mappers/IDMExceptionMapper.java delete mode 100644 src/main/java/org/gcube/social_networking/rest/Comments.java create mode 100644 src/main/java/org/gcube/social_networking/rest/examples/AuthenticatedService.java create mode 100644 src/main/java/org/gcube/social_networking/rest/examples/ExcludeAuthorizationService.java create mode 100644 src/main/java/org/gcube/social_networking/rest/examples/HelloService.java create mode 100644 src/main/java/org/gcube/social_networking/rest/examples/serializers/ContainerConfigurationSerializer.java create mode 100644 src/main/java/org/gcube/social_networking/rest/examples/serializers/ContainerContextSerializer.java create mode 100644 src/main/java/org/gcube/social_networking/rest/examples/serializers/IdmObjectSerializator.java create mode 100644 src/main/java/org/gcube/social_networking/rest/examples/serializers/OwnerSerializer.java create mode 100644 src/main/java/org/gcube/social_networking/rest/examples/serializers/ServiceEndpointAccessPointSerializer.java create mode 100644 src/main/java/org/gcube/social_networking/rest/examples/serializers/SimpleCredentialsSerializer.java diff --git a/pom.xml b/pom.xml index b2fc665..7b98ebd 100644 --- a/pom.xml +++ b/pom.xml @@ -9,20 +9,29 @@ org.gcube.social_networking social-service - 1.0.0-SNAPSHOT + 0.0.1-SNAPSHOT war Social Service This is the social service + 11 + UTF-8 - 11 - 11 + ${java.version} + ${java.version} + + + + 1.14.0 ${project.basedir}${file.separator}src${file.separator}main${file.separator}webapp${file.separator}WEB-INF 2.14.0 4.13.0 + + + @@ -112,7 +121,15 @@ 2.6 + + + org.gcube.common + authorization-control-library + @@ -133,7 +150,16 @@ ${enunciate.version} provided - + + + + + + @@ -150,10 +176,6 @@ - - - - jakarta.mail @@ -166,7 +188,7 @@ ehcache 2.10.0 - + org.gcube.dvos usermanagement-core @@ -186,13 +208,18 @@ jakarta.servlet-api 4.0.4 - + org.gcube.idm idm-common-library 0.0.2-SNAPSHOT + + org.glassfish.jersey.inject + jersey-cdi2-se + + @@ -249,6 +276,34 @@ + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj-plugin.version} + + ${java.version} + ${java.version} + ${java.version} + + + org.gcube.common + authorization-control-library + + + + + + + compile + + + + + diff --git a/src/main/java/org/gcube/social_networking/SocialService.java b/src/main/java/org/gcube/social_networking/SocialService.java deleted file mode 100644 index f367fc2..0000000 --- a/src/main/java/org/gcube/social_networking/SocialService.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.gcube.social_networking; - -import jakarta.ws.rs.Path; -import jakarta.ws.rs.core.Application; -import org.gcube.social_networking.rest.HelloWorld; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.HashSet; -import java.util.Set; - -@Path("social-service") -public class SocialService extends Application { - private static Logger logger = LoggerFactory.getLogger(SocialService.class); - - @Override - public Set> getClasses() { - logger.info("/social-service/ here"); - final Set> classes = new HashSet>(); - // register resources and features - classes.add(HelloWorld.class); - return classes; - } - -} diff --git a/src/main/java/org/gcube/social_networking/SocialServiceApplicationManager.java b/src/main/java/org/gcube/social_networking/SocialServiceApplicationManager.java index 6e8c457..606e809 100644 --- a/src/main/java/org/gcube/social_networking/SocialServiceApplicationManager.java +++ b/src/main/java/org/gcube/social_networking/SocialServiceApplicationManager.java @@ -1,67 +1,49 @@ package org.gcube.social_networking; import org.gcube.common.security.providers.SecretManagerProvider; +import org.gcube.common.security.secrets.Secret; import org.gcube.smartgears.ApplicationManager; +import org.gcube.smartgears.ContextProvider; +import org.gcube.smartgears.configuration.Mode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - /** - * @author Luca Frosini (ISTI - CNR) + * @author Ahmed Ibrahim */ public class SocialServiceApplicationManager implements ApplicationManager { + Logger logger = LoggerFactory.getLogger(SocialServiceApplicationManager.class); /** - * Logger - */ - private static Logger logger = LoggerFactory.getLogger(SocialServiceApplicationManager.class); - - public static boolean initialised; - - /** * {@inheritDoc} */ @Override - public synchronized void onInit() { - - logger.info("Starting social service"); - try{ - String context = SecretManagerProvider.get().getContext(); - logger.info( - "\n-------------------------------------------------------\n" - + "Social Service is Starting on context {}\n" - + "-------------------------------------------------------", - context); - }catch (Throwable e) { - logger.error("unexpected error initiliazing storagehub",e); + public void onInit() { + if (ContextProvider.get().container().configuration().mode() == Mode.offline) { + logger.debug("init called in offline mode"); + } else { + Secret secret = SecretManagerProvider.get(); + if (secret != null) { + logger.debug("init called in context {}", secret.getContext()); + } else { + logger.debug("init called in null context"); + } } - - - - -// ApplicationContext applicationContext = ContextProvider.get(); -// String helloWorldEServiceID = applicationContext.id(); - } - - /** - * {@inheritDoc} + + /** + * {@inheritDoc} */ @Override - public synchronized void onShutdown(){ - - String context = SecretManagerProvider.get().getContext(); - - logger.trace( - "\n-------------------------------------------------------\n" - + "Hello World Service is Stopping on context {}\n" - + "-------------------------------------------------------", - context); - - - logger.trace( - "\n-------------------------------------------------------\n" - + "Hello World Service Stopped Successfully on context {}\n" - + "-------------------------------------------------------", - context); + public void onShutdown() { + if (ContextProvider.get().container().configuration().mode() == Mode.offline) { + logger.debug("shutDown called in offline mode"); + } else { + Secret secret = SecretManagerProvider.get(); + if (secret != null) { + logger.debug("shutDown called in context {}", secret.getContext()); + } else { + logger.debug("shutDown called in null context"); + } + } } -} +} \ No newline at end of file diff --git a/src/main/java/org/gcube/social_networking/mappers/ForbiddenExceptionMapper.java b/src/main/java/org/gcube/social_networking/mappers/ForbiddenExceptionMapper.java new file mode 100644 index 0000000..963172f --- /dev/null +++ b/src/main/java/org/gcube/social_networking/mappers/ForbiddenExceptionMapper.java @@ -0,0 +1,56 @@ +package org.gcube.social_networking.mappers; + +import org.gcube.social_networking.utils.ResponseBean; + +import jakarta.ws.rs.ForbiddenException; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; +import jakarta.ws.rs.ext.ExceptionMapper; +import jakarta.ws.rs.ext.Provider; + +/** + * @author Alfredo Oliviero (ISTI - CNR) + */ +@Provider +public class ForbiddenExceptionMapper implements ExceptionMapper { + + @Override + public Response toResponse(ForbiddenException exception) { + + Status status = Status.INTERNAL_SERVER_ERROR; + String exceptionMessage = exception.getMessage(); + + ResponseBean responseBean = null; + + try { + if (exception.getCause() != null) { + exceptionMessage = exception.getCause().getMessage(); + } + } catch (Exception e) { + exceptionMessage = exception.getMessage(); + } + + MediaType mediaType = MediaType.TEXT_PLAIN_TYPE; + + if (WebApplicationException.class.isAssignableFrom(exception.getClass())) { + Response gotResponse = ((WebApplicationException) exception).getResponse(); + Object entity = gotResponse.getEntity(); + if (entity != null && ResponseBean.class.isAssignableFrom(entity.getClass())) { + responseBean = (ResponseBean) entity; + } + status = Status.fromStatusCode(gotResponse.getStatusInfo().getStatusCode()); + } + + if (responseBean == null) { + responseBean = new ResponseBean(); + } + responseBean.setSuccess(false); + responseBean.setMessage(exceptionMessage); + // responseBean.set + + return Response.status(status).entity(responseBean).type(mediaType).build(); + } + +} diff --git a/src/main/java/org/gcube/social_networking/mappers/IDMExceptionMapper.java b/src/main/java/org/gcube/social_networking/mappers/IDMExceptionMapper.java new file mode 100644 index 0000000..7832e7b --- /dev/null +++ b/src/main/java/org/gcube/social_networking/mappers/IDMExceptionMapper.java @@ -0,0 +1,55 @@ +package org.gcube.social_networking.mappers; + +import org.gcube.social_networking.utils.ResponseBean; + +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; +import jakarta.ws.rs.ext.ExceptionMapper; +import jakarta.ws.rs.ext.Provider; + +/** + * @author Luca Frosini (ISTI - CNR) + */ +@Provider +public class IDMExceptionMapper implements ExceptionMapper { + + @Override + public Response toResponse(Exception exception) { + + Status status = Status.INTERNAL_SERVER_ERROR; + String exceptionMessage = exception.getMessage(); + + ResponseBean responseBean = null; + + try { + if (exception.getCause() != null) { + exceptionMessage = exception.getCause().getMessage(); + } + } catch (Exception e) { + exceptionMessage = exception.getMessage(); + } + + MediaType mediaType = MediaType.TEXT_PLAIN_TYPE; + + if (WebApplicationException.class.isAssignableFrom(exception.getClass())) { + Response gotResponse = ((WebApplicationException) exception).getResponse(); + Object entity = gotResponse.getEntity(); + if (entity != null && ResponseBean.class.isAssignableFrom(entity.getClass())) { + responseBean = (ResponseBean) entity; + } + status = Status.fromStatusCode(gotResponse.getStatusInfo().getStatusCode()); + } + + if (responseBean == null) { + responseBean = new ResponseBean(); + } + responseBean.setSuccess(false); + responseBean.setMessage(exceptionMessage); + // responseBean.set + + return Response.status(status).entity(responseBean).type(mediaType).build(); + } + +} diff --git a/src/main/java/org/gcube/social_networking/rest/Comments.java b/src/main/java/org/gcube/social_networking/rest/Comments.java deleted file mode 100644 index 213056b..0000000 --- a/src/main/java/org/gcube/social_networking/rest/Comments.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.gcube.social_networking.rest; - -import com.webcohesion.enunciate.metadata.rs.RequestHeader; -import com.webcohesion.enunciate.metadata.rs.RequestHeaders; -import com.webcohesion.enunciate.metadata.rs.ResourceGroup; -import com.webcohesion.enunciate.metadata.rs.ResourceLabel; -import org.gcube.social_networking.socialnetworking.model.shared.Comment; - -import jakarta.ws.rs.*; -import java.util.List; - -@Path("comments") -@ResourceGroup("Comments APIs") -@ResourceLabel("Comments APIs") -@RequestHeaders({ - @RequestHeader( name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources") -}) -public class Comments { - @POST - @Path("/") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - @Consumes({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public void addComment(Comment comment) { - - } - - @GET - @Path("/{id}") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public void readComment(@PathParam("id") String id) { - - } - - @PUT - @Path("/{id}") - @Consumes({"application/json;charset=UTF-8", "application/vnd.api+json"}) - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public void editComment(@PathParam("id") String id, Comment comment) { - - } - - @DELETE - @Path("/{id}") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public void deleteComment(@PathParam("id") String id) { - - } - - //the following two methods had vreid why? - @POST - @Path("/{id}/hashtags") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - @Consumes({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public void saveHashTagsComment(@PathParam("id") String commentId, List hashtags) { - - } - - @DELETE - @Path("/{id}/hashtags") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - @Consumes({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public void deleteHashTagsComment(@PathParam("id") String commentId, List hashtags) { - - } - -} diff --git a/src/main/java/org/gcube/social_networking/rest/TestRest.java b/src/main/java/org/gcube/social_networking/rest/TestRest.java index f4a98ac..83b75ec 100644 --- a/src/main/java/org/gcube/social_networking/rest/TestRest.java +++ b/src/main/java/org/gcube/social_networking/rest/TestRest.java @@ -4,24 +4,51 @@ import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; +import java.util.HashMap; +import java.util.Map; + +import org.gcube.com.fasterxml.jackson.core.JsonProcessingException; +import org.gcube.com.fasterxml.jackson.databind.ObjectMapper; +import org.gcube.common.security.Owner; +import org.gcube.common.security.providers.SecretManagerProvider; +import org.gcube.common.security.secrets.Secret; +import org.gcube.smartgears.ContextProvider; +import org.gcube.smartgears.context.container.ContainerContext; +import org.gcube.smartgears.utils.InnerMethodName; +import org.gcube.social_networking.rest.examples.serializers.IdmObjectSerializator; + import com.webcohesion.enunciate.metadata.rs.RequestHeader; import com.webcohesion.enunciate.metadata.rs.RequestHeaders; import com.webcohesion.enunciate.metadata.rs.ResourceGroup; import com.webcohesion.enunciate.metadata.rs.ResourceLabel; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; + @Path("/test") @ResourceGroup("Comments APIs") @ResourceLabel("Comments APIs") -@RequestHeaders ({ - @RequestHeader( name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources") +@RequestHeaders({ + @RequestHeader(name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources") }) public class TestRest { @GET @Path("/test") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public String test(){ - return "{\"result\":\"funziona!!!\"}"; + @Produces({ MediaType.APPLICATION_JSON }) + public Response test() { + + HashMap resp = new HashMap(); + + resp.put("result", "funziona"); + + try { + String jsonData = new ObjectMapper().writeValueAsString(resp); + return Response.ok(jsonData).build(); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return Response.serverError().build(); + } } } \ No newline at end of file diff --git a/src/main/java/org/gcube/social_networking/rest/collections/Attachments.java b/src/main/java/org/gcube/social_networking/rest/collections/Attachments.java index 328657f..9104be0 100644 --- a/src/main/java/org/gcube/social_networking/rest/collections/Attachments.java +++ b/src/main/java/org/gcube/social_networking/rest/collections/Attachments.java @@ -19,15 +19,15 @@ import jakarta.ws.rs.core.Response; @ResourceGroup("Attachments APIs") @ResourceLabel("Attachments APIs") @RequestHeaders({ - @RequestHeader( name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources") + @RequestHeader(name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources") }) public class Attachments extends Collection { private static final Logger logger = LoggerFactory.getLogger(Attachments.class); - private Response ErrorHandler(Exception e, String action, String id){ + private Response ErrorHandler(Exception e, String action, String id) { ResponseBean responseBean = new ResponseBean<>(); Response.Status status; - logger.info("Unable to "+action+" attachment {}.", id); + logger.info("Unable to " + action + " attachment {}.", id); logger.info(e.getMessage()); responseBean.setMessage(e.getMessage()); responseBean.setSuccess(false); @@ -36,15 +36,15 @@ public class Attachments extends Collection { } @POST - @Path("/") + @Path("") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response createAttachment(Attachment attachment) { - try{ + try { logger.info("Creating attachment with id {}.", attachment.getId()); return super.create(attachment); - }catch(Exception e){ - return ErrorHandler(e, "create",attachment.getId()); + } catch (Exception e) { + return ErrorHandler(e, "create", attachment.getId()); } } @@ -52,11 +52,11 @@ public class Attachments extends Collection { @Path("/{id}") @Produces(MediaType.APPLICATION_JSON) public Response readAttachment(@NotNull @PathParam("id") String id) { - try{ + try { logger.info("Reading attachment with id {}.", id); return super.read(id, ResourceNames.Attachment); - }catch(Exception e){ - return ErrorHandler(e, "fetch",id); + } catch (Exception e) { + return ErrorHandler(e, "fetch", id); } } @@ -64,11 +64,11 @@ public class Attachments extends Collection { @Path("/{id}") @Produces(MediaType.APPLICATION_JSON) public Response deleteAttachment(@NotNull @PathParam("id") String id) { - try{ + try { logger.info("Deleting attachment with id {}.", id); - return super.delete(id,ResourceNames.Attachment); - }catch(Exception e){ - return ErrorHandler(e, "delete",id); + return super.delete(id, ResourceNames.Attachment); + } catch (Exception e) { + return ErrorHandler(e, "delete", id); } } @@ -77,11 +77,11 @@ public class Attachments extends Collection { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response updateAttachment(@NotNull @PathParam("id") String id, @NotNull Attachment attachment) { - try{ + try { logger.info("Updating attachment with id {}", id); return super.update(id, attachment); - }catch(Exception e){ - return ErrorHandler(e, "update",id); + } catch (Exception e) { + return ErrorHandler(e, "update", id); } } } diff --git a/src/main/java/org/gcube/social_networking/rest/collections/Entities.java b/src/main/java/org/gcube/social_networking/rest/collections/Entities.java index d7d35a5..9d07ec2 100644 --- a/src/main/java/org/gcube/social_networking/rest/collections/Entities.java +++ b/src/main/java/org/gcube/social_networking/rest/collections/Entities.java @@ -37,8 +37,9 @@ public class Entities extends Collection { return Response.status(status).entity(responseBean).build(); } + // TODO: unificare con getRecentPosts @GET - @Path("users/{id}/posts") + @Path("users/{id}/allposts") @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) public Response getAllPostsByUser(@NotNull @PathParam("id") String id, @QueryParam("liked") boolean liked, diff --git a/src/main/java/org/gcube/social_networking/rest/collections/Vres.java b/src/main/java/org/gcube/social_networking/rest/collections/Vres.java index 415eb61..cc2e991 100644 --- a/src/main/java/org/gcube/social_networking/rest/collections/Vres.java +++ b/src/main/java/org/gcube/social_networking/rest/collections/Vres.java @@ -17,20 +17,20 @@ import jakarta.ws.rs.core.GenericType; import jakarta.ws.rs.core.Response; import java.util.*; - @Path("vres") @ResourceGroup("Vres APIs") @ResourceLabel("Vres APIs") @RequestHeaders({ - @RequestHeader( name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources") + @RequestHeader(name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources") }) public class Vres extends Collection { private static final Logger logger = LoggerFactory.getLogger(Vres.class); - private Response ErrorHandler(Exception e, String action, String id){ + + private Response ErrorHandler(Exception e, String action, String id) { ResponseBean responseBean = new ResponseBean<>(); Response.Status status; - logger.info("Unable to "+action+" vre {}.", id); + logger.info("Unable to " + action + " vre {}.", id); logger.info(e.getMessage()); responseBean.setMessage(e.getMessage()); responseBean.setSuccess(false); @@ -38,193 +38,219 @@ public class Vres extends Collection { return Response.status(status).entity(responseBean).build(); } - @GET - @Path("/{id}/posts") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public Response getAllPostsByVre(@NotNull @PathParam("id") String id){ - try{ - logger.info("Getting all posts of VRE: " + id); - return super.readChildOf(id, ResourceNames.VRE, ResourceNames.POST); - }catch(Exception e){ - return ErrorHandler(e, "fetch posts of",id); - } - } + // @GET + // @Path("/{id}/posts") + // @Produces({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + // public Response getAllPostsByVre(@NotNull @PathParam("id") String id) { + // try { + // logger.info("Getting all posts of VRE: " + id); + // return super.readChildOf(id, ResourceNames.VRE, ResourceNames.POST); + // } catch (Exception e) { + // return ErrorHandler(e, "fetch posts of", id); + // } + // } @GET @Path("/") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public Response getAllVreIds(){ - try{ + @Produces({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + public Response getAllVreIds() { + try { logger.info("Getting all VRE IDs"); List ids = new ArrayList<>(); - List vres = super.readAll(ResourceNames.VRE).readEntity(new GenericType>>(){}).getResult(); - for(Vre vre: vres){ + List vres = super.readAll(ResourceNames.VRE).readEntity(new GenericType>>() { + }).getResult(); + for (Vre vre : vres) { ids.add(vre.getId()); } Response.Status status = Response.Status.OK; - ResponseBean > responseBean = new ResponseBean<>(); + ResponseBean> responseBean = new ResponseBean<>(); responseBean.setMessage("vre ids fetched Successfully"); responseBean.setSuccess(true); responseBean.setResult(ids); return Response.status(status).entity(responseBean).build(); - }catch(Exception e){ - return ErrorHandler(e, "fetch ids of",""); + } catch (Exception e) { + return ErrorHandler(e, "fetch ids of", ""); } } + // TODO: verificare limit null + @GET @Path("/{id}/posts") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public Response getRecentPostsByVre(@NotNull @PathParam("id") String id, @QueryParam("limit") @DefaultValue("10") int limit){ - try{ - logger.info("Getting most recent {} posts of VRE {} " , limit, id); - return super.readChildOfWithParameter(id, ParameterNames.RECENT_LIMIT, String.valueOf(limit), ResourceNames.VRE, ResourceNames.POST); - }catch(Exception e){ - return ErrorHandler(e, "fetch recent posts of",id); + @Produces({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + public Response getRecentPostsByVre(@NotNull @PathParam("id") String id, + @QueryParam("limit") Integer limit) { + try { + logger.info("Getting most recent {} posts of VRE {} ", limit, id); + if (limit != null) + return super.readChildOfWithParameter(id, ParameterNames.RECENT_LIMIT, String.valueOf(limit), + ResourceNames.VRE, ResourceNames.POST); + else + return super.readChildOf(id, ResourceNames.VRE, ResourceNames.POST); + + } catch (Exception e) { + return ErrorHandler(e, "fetch recent posts of", id); } } @POST @Path("/{id}/posts") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - @Consumes({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public Response savePostToVRETimeline(@NotNull @PathParam("id") String id, @NotNull Post post){ - try{ - logger.info("saving post {} to VRE {} " , post.getKey(), id); + @Produces({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + @Consumes({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + public Response savePostToVRETimeline(@NotNull @PathParam("id") String id, @NotNull Post post) { + try { + logger.info("saving post {} to VRE {} ", post.getKey(), id); return super.createChildOf(id, post, ResourceNames.VRE); - }catch(Exception e){ - return ErrorHandler(e, "save post to",id); + } catch (Exception e) { + return ErrorHandler(e, "save post to", id); } } + // @GET + // @Path("/{id}/hashtags") + // @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) + // public Response getVREHashtagsWithOccurrence(@NotNull @PathParam("id") String + // id){ + // try{ + // logger.info("getting hashtags of VRE {} " , id); + // return super.readChildOf(id, ResourceNames.VRE, ResourceNames.HASHTAG); + // }catch(Exception e){ + // return ErrorHandler(e, "get hashtags of",id); + // } + // } + + // TODO: verificare implementazione con timestamp null @GET @Path("/{id}/hashtags") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public Response getVREHashtagsWithOccurrence(@NotNull @PathParam("id") String id){ - try{ - logger.info("getting hashtags of VRE {} " , id); - return super.readChildOf(id, ResourceNames.VRE, ResourceNames.HASHTAG); - }catch(Exception e){ - return ErrorHandler(e, "get hashtags of",id); - } - } - - - @GET - @Path("/{id}/hashtags") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public Response getVREHashtagsWithOccurrenceFilteredByTime(@NotNull @PathParam("id") String id, @NotNull @QueryParam("time") long timestamp){ - try{ - logger.info("getting hashtags of VRE {} starting {} " , id, timestamp); - return super.readChildOfWithParameter(id, ParameterNames.TIME, String.valueOf(timestamp), ResourceNames.VRE, ResourceNames.HASHTAG); - }catch(Exception e){ - return ErrorHandler(e, "get time_filtered hashtags of",id); + @Produces({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + public Response getVREHashtagsWithOccurrenceFilteredByTime(@NotNull @PathParam("id") String id, + @QueryParam("time") Long timestamp) { + try { + logger.info("getting hashtags of VRE {} starting {} ", id, timestamp); + if (timestamp == null) { + return super.readChildOf(id, ResourceNames.VRE, ResourceNames.HASHTAG); + } + return super.readChildOfWithParameter(id, ParameterNames.TIME, String.valueOf(timestamp), ResourceNames.VRE, + ResourceNames.HASHTAG); + } catch (Exception e) { + return ErrorHandler(e, "get time_filtered hashtags of", id); } } @GET @Path("/{id}/hashtags/{hashtag}/posts") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public Response getVREPostsByHashtag(@NotNull @PathParam("id") String id, @NotNull @PathParam("hashtag") String hashtag){ - try{ - logger.info("getting posts containing hashtags in VRE {}" , id); - return super.readChildOfWithParameter(id, ParameterNames.HASHTAG, hashtag, ResourceNames.VRE, ResourceNames.POST); - }catch(Exception e){ - return ErrorHandler(e, "get posts containing hashtag in",id); + @Produces({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + public Response getVREPostsByHashtag(@NotNull @PathParam("id") String id, + @NotNull @PathParam("hashtag") String hashtag) { + try { + logger.info("getting posts containing hashtags in VRE {}", id); + return super.readChildOfWithParameter(id, ParameterNames.HASHTAG, hashtag, ResourceNames.VRE, + ResourceNames.POST); + } catch (Exception e) { + return ErrorHandler(e, "get posts containing hashtag in", id); } } @GET @Path("/{id}/invites/") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - @Consumes({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public Response getInvitedEmailsByVRE(@NotNull @PathParam("id") String id, @NotNull InviteStatus... status){ - try{ - logger.info("getting invites in VRE {}" , id); - return super.readChildOfWithParameter(id, ParameterNames.STATUS, Arrays.toString(status), ResourceNames.VRE, ResourceNames.INVITE); - }catch(Exception e){ - return ErrorHandler(e, "get invites in",id); + @Produces({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + @Consumes({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + public Response getInvitedEmailsByVRE(@NotNull @PathParam("id") String id, @NotNull InviteStatus... status) { + try { + logger.info("getting invites in VRE {}", id); + return super.readChildOfWithParameter(id, ParameterNames.STATUS, Arrays.toString(status), ResourceNames.VRE, + ResourceNames.INVITE); + } catch (Exception e) { + return ErrorHandler(e, "get invites in", id); } } @GET @Path("/{id}/invites/{email}") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public Response isExistingInvite(@NotNull @PathParam("id") String id, @NotNull @PathParam("email")String email){ - try{ - logger.info("checking if invite {} exists in VRE {}" , email, id); - return super.readChildOfWithParameter(id, ParameterNames.EMAIL, email, ResourceNames.VRE, ResourceNames.INVITE); - }catch(Exception e){ - return ErrorHandler(e, "check invite in",id); + @Produces({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + public Response isExistingInvite(@NotNull @PathParam("id") String id, @NotNull @PathParam("email") String email) { + try { + logger.info("checking if invite {} exists in VRE {}", email, id); + return super.readChildOfWithParameter(id, ParameterNames.EMAIL, email, ResourceNames.VRE, + ResourceNames.INVITE); + } catch (Exception e) { + return ErrorHandler(e, "check invite in", id); } } @PUT @Path("/{id}/invites/{email}") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - @Consumes({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public Response setInviteStatus(@NotNull @PathParam("id") String id, @NotNull @PathParam("email")String email, @NotNull InviteStatus inviteStatus){ - try{ - logger.info("setting invite {} status in VRE {}" , email, id); + @Produces({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + @Consumes({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + public Response setInviteStatus(@NotNull @PathParam("id") String id, @NotNull @PathParam("email") String email, + @NotNull InviteStatus inviteStatus) { + try { + logger.info("setting invite {} status in VRE {}", email, id); Invite invite = new Invite(); invite.setStatus(inviteStatus); return super.updateChildOfWithParameter(id, ParameterNames.EMAIL, email, invite, ResourceNames.VRE); - }catch(Exception e){ - return ErrorHandler(e, "set invite status in",id); + } catch (Exception e) { + return ErrorHandler(e, "set invite status in", id); } } - @POST @Path("/{id}/posts/{postid}/hashtags") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - @Consumes({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public Response saveHashTags(@NotNull @PathParam("id") String id, @NotNull @PathParam("postid") String postid, @NotNull Listhashtags){ - try{ + @Produces({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + @Consumes({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + public Response saveHashTags(@NotNull @PathParam("id") String id, @NotNull @PathParam("postid") String postid, + @NotNull List hashtags) { + try { logger.info("saving post hashtags to VRE {} ", id); - return super.BatchCreateChildOfWithParameter(id, ResourceNames.POST, postid, new ArrayList<>(hashtags), ResourceNames.VRE, ResourceNames.HASHTAG); - }catch(Exception e){ - return ErrorHandler(e, "save post hashtags to",id); + return super.BatchCreateChildOfWithParameter(id, ResourceNames.POST, postid, new ArrayList<>(hashtags), + ResourceNames.VRE, ResourceNames.HASHTAG); + } catch (Exception e) { + return ErrorHandler(e, "save post hashtags to", id); } } @DELETE @Path("/{id}/posts/{postid}/hashtags") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - @Consumes({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public Response deleteHashTags(@NotNull @PathParam("id") String id, @NotNull @PathParam("postid") String postid, @NotNull Listhashtags){ - try{ - logger.info("deleting post hashtags from VRE {} " , id); - return super.BatchDeleteChildOfWithParameter(id, ResourceNames.POST, postid, new ArrayList<>(hashtags), ResourceNames.VRE, ResourceNames.HASHTAG); - }catch(Exception e){ - return ErrorHandler(e, "delete post hashtags from",id); + @Produces({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + @Consumes({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + public Response deleteHashTags(@NotNull @PathParam("id") String id, @NotNull @PathParam("postid") String postid, + @NotNull List hashtags) { + try { + logger.info("deleting post hashtags from VRE {} ", id); + return super.BatchDeleteChildOfWithParameter(id, ResourceNames.POST, postid, new ArrayList<>(hashtags), + ResourceNames.VRE, ResourceNames.HASHTAG); + } catch (Exception e) { + return ErrorHandler(e, "delete post hashtags from", id); } } - @POST @Path("/{id}/comments/{commentid}/hashtags") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - @Consumes({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public Response saveHashTagsComment(@NotNull @PathParam("id") String id, @NotNull @PathParam("commentid") String commentid, @NotNull Listhashtags){ - try{ + @Produces({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + @Consumes({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + public Response saveHashTagsComment(@NotNull @PathParam("id") String id, + @NotNull @PathParam("commentid") String commentid, @NotNull List hashtags) { + try { logger.info("saving comment hashtags to VRE {} ", id); - return super.BatchCreateChildOfWithParameter(id, ResourceNames.COMMENT, commentid, new ArrayList<>(hashtags), ResourceNames.VRE, ResourceNames.HASHTAG); - }catch(Exception e){ - return ErrorHandler(e, "save comment hashtags to",id); + return super.BatchCreateChildOfWithParameter(id, ResourceNames.COMMENT, commentid, + new ArrayList<>(hashtags), ResourceNames.VRE, ResourceNames.HASHTAG); + } catch (Exception e) { + return ErrorHandler(e, "save comment hashtags to", id); } } @DELETE @Path("/{id}/comments/{commentid}/hashtags") - @Produces({"application/json;charset=UTF-8", "application/vnd.api+json"}) - @Consumes({"application/json;charset=UTF-8", "application/vnd.api+json"}) - public Response deleteHashTagsComment(@NotNull @PathParam("id") String id, @NotNull @PathParam("commentid") String commentid, @NotNull Listhashtags){ - try{ - logger.info("deleting comment hashtags from VRE {} " , id); - return super.BatchDeleteChildOfWithParameter(id, ResourceNames.COMMENT, commentid, new ArrayList<>(hashtags), ResourceNames.VRE, ResourceNames.HASHTAG); - }catch(Exception e){ - return ErrorHandler(e, "delete comment hashtags from",id); + @Produces({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + @Consumes({ "application/json;charset=UTF-8", "application/vnd.api+json" }) + public Response deleteHashTagsComment(@NotNull @PathParam("id") String id, + @NotNull @PathParam("commentid") String commentid, @NotNull List hashtags) { + try { + logger.info("deleting comment hashtags from VRE {} ", id); + return super.BatchDeleteChildOfWithParameter(id, ResourceNames.COMMENT, commentid, + new ArrayList<>(hashtags), ResourceNames.VRE, ResourceNames.HASHTAG); + } catch (Exception e) { + return ErrorHandler(e, "delete comment hashtags from", id); } } } diff --git a/src/main/java/org/gcube/social_networking/rest/examples/AuthenticatedService.java b/src/main/java/org/gcube/social_networking/rest/examples/AuthenticatedService.java new file mode 100644 index 0000000..118eb6c --- /dev/null +++ b/src/main/java/org/gcube/social_networking/rest/examples/AuthenticatedService.java @@ -0,0 +1,67 @@ +package org.gcube.social_networking.rest.examples; + +import org.gcube.common.authorization.control.annotations.AuthorizationControl; +import org.gcube.common.security.providers.SecretManagerProvider; +import org.gcube.common.security.secrets.Secret; +import org.gcube.smartgears.utils.InnerMethodName; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +/** + * @author Lucio Lelii (ISTI - CNR) + * @author Alfredo Oliviero (ISTI - CNR) + */ + +@Path("auth") +public class AuthenticatedService { + + private static final String ALLOWED_ROLE = "myRole"; + private static final String ALLOWED_ROLE_ORG = "OrganizationMember"; + private static final String ALLOWED_ROLE_MEMBER = "Member"; + + @AuthorizationControl(allowedRoles = { ALLOWED_ROLE_ORG }) + @GET + @Path("org_member") + @Produces(MediaType.TEXT_PLAIN) + public String authorizedOrg() { + InnerMethodName.set("auth"); + Secret secret = SecretManagerProvider.get(); + String userId = secret.getOwner().getId(); + String context = secret.getContext(); + return String.format( + "User %s in context %s is authorized to execute this method because he has the role %s", userId, + context, ALLOWED_ROLE_ORG); + } + + @AuthorizationControl(allowedRoles = { ALLOWED_ROLE_MEMBER }) + @GET + @Path("member") + @Produces(MediaType.TEXT_PLAIN) + public String authorizedMember() { + InnerMethodName.set("auth"); + Secret secret = SecretManagerProvider.get(); + String userId = secret.getOwner().getId(); + String context = secret.getContext(); + return String.format( + "User %s in context %s is authorized to execute this method because he has the role %s", userId, + context, ALLOWED_ROLE_MEMBER); + } + + @AuthorizationControl(allowedRoles = { ALLOWED_ROLE }) + @GET + @Path("") + @Produces(MediaType.TEXT_PLAIN) + public String authorized() { + InnerMethodName.set("auth"); + Secret secret = SecretManagerProvider.get(); + String userId = secret.getOwner().getId(); + String context = secret.getContext(); + return String.format( + "User %s in context %s is authorized to execute this method because he has the role %s", userId, + context, ALLOWED_ROLE); + } + +} diff --git a/src/main/java/org/gcube/social_networking/rest/examples/ExcludeAuthorizationService.java b/src/main/java/org/gcube/social_networking/rest/examples/ExcludeAuthorizationService.java new file mode 100644 index 0000000..df3c0f1 --- /dev/null +++ b/src/main/java/org/gcube/social_networking/rest/examples/ExcludeAuthorizationService.java @@ -0,0 +1,31 @@ +package org.gcube.social_networking.rest.examples; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Path("guest") +public class ExcludeAuthorizationService { + + private final Logger logger = LoggerFactory.getLogger(ExcludeAuthorizationService.class); + + /** + * this method doesn't need authorization and the SecretManagerProvider is null + * see to implement this behavior add to excludes section in your + * application.yaml + * + * - path: /{path-to-your-method-path} + * + * example for this method + * + * - path: /excluded + * + */ + @GET + public String exludedMethod() { + logger.info("executed whithout any authorization"); + return "executed whithout any authorization"; + } +} diff --git a/src/main/java/org/gcube/social_networking/rest/examples/HelloService.java b/src/main/java/org/gcube/social_networking/rest/examples/HelloService.java new file mode 100644 index 0000000..fc885c5 --- /dev/null +++ b/src/main/java/org/gcube/social_networking/rest/examples/HelloService.java @@ -0,0 +1,82 @@ +package org.gcube.social_networking.rest.examples; + +import java.util.HashMap; +import java.util.Map; + +import org.gcube.com.fasterxml.jackson.core.JsonProcessingException; +import org.gcube.com.fasterxml.jackson.databind.ObjectMapper; +import org.gcube.common.security.Owner; +import org.gcube.common.security.providers.SecretManagerProvider; +import org.gcube.common.security.secrets.Secret; +import org.gcube.smartgears.ContextProvider; +import org.gcube.smartgears.context.container.ContainerContext; +import org.gcube.smartgears.utils.InnerMethodName; +import org.gcube.social_networking.rest.examples.serializers.IdmObjectSerializator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; + +/** + * + * @author Lucio Lelii (ISTI-CNR) + * @author Alfredo Oliviero (ISTI-CNR) + */ + +@Path("") +public class HelloService { + + private final Logger logger = LoggerFactory.getLogger(HelloService.class); + + @GET + @Path("hello") + @Produces(MediaType.TEXT_PLAIN) + public String hello() { + InnerMethodName.set("hello"); + Secret secret = SecretManagerProvider.get(); + String userId = secret.getOwner().getId(); + String context = secret.getContext(); + + String infrastructureName = ContextProvider.get().container().configuration().infrastructure(); + logger.info("caller id is {}", userId); + return String.format("Hello %s in context %s in infastructure %s -roles %s", userId, context, + infrastructureName, secret.getOwner().getRoles()); + } + + @GET + @Path("details") + @Produces({ MediaType.APPLICATION_JSON }) + public Response details() { + InnerMethodName.set("details"); + + Map data = new HashMap<>(); + + Secret secret = SecretManagerProvider.get(); + + String context = secret.getContext(); + data.put("context", context); + + Owner owner = secret.getOwner(); + + data.put("owner", owner); + + // ContainerContext container = ContextProvider.get().container(); + // data.put("container", container); + + ObjectMapper objectMapper = IdmObjectSerializator.getSerializer(); + + try { + String jsonData = objectMapper.writeValueAsString(data); + return Response.ok(jsonData).build(); + + } catch (JsonProcessingException e) { + e.printStackTrace(); + return Response.serverError().build(); + } + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/social_networking/rest/examples/serializers/ContainerConfigurationSerializer.java b/src/main/java/org/gcube/social_networking/rest/examples/serializers/ContainerConfigurationSerializer.java new file mode 100644 index 0000000..91eade2 --- /dev/null +++ b/src/main/java/org/gcube/social_networking/rest/examples/serializers/ContainerConfigurationSerializer.java @@ -0,0 +1,45 @@ +package org.gcube.social_networking.rest.examples.serializers; + +import java.io.IOException; + +import org.gcube.smartgears.configuration.container.ContainerConfiguration; + +import org.gcube.com.fasterxml.jackson.core.JsonGenerator; +import org.gcube.com.fasterxml.jackson.databind.SerializerProvider; +import org.gcube.com.fasterxml.jackson.databind.ser.std.StdSerializer; + +/** + * Jackson serializer for ContainerConfiguration + * + * @author Alfredo Oliviero (ISTI-CNR) + * + */ + +public class ContainerConfigurationSerializer extends StdSerializer { + protected ContainerConfigurationSerializer(Class t) { + super(t); + } + + public ContainerConfigurationSerializer() { + super(ContainerConfiguration.class, true); + } + + @Override + public void serialize(ContainerConfiguration configuration, JsonGenerator jgen, SerializerProvider provider) + throws IOException { + jgen.writeStartObject(); + jgen.writeObjectField("mode", configuration.mode()); + jgen.writeObjectField("app", configuration.apps()); + jgen.writeObjectField("site", configuration.site()); + jgen.writeObjectField("infrastructure", configuration.infrastructure()); + jgen.writeObjectField("hostname", configuration.hostname()); + jgen.writeObjectField("port", configuration.port()); + jgen.writeObjectField("protocol", configuration.protocol()); + jgen.writeObjectField("authorizeChildrenContext", configuration.authorizeChildrenContext()); + jgen.writeObjectField("proxy", configuration.proxy()); + + jgen.writeObjectField("desc", configuration.toString()); + + jgen.writeEndObject(); + } +} diff --git a/src/main/java/org/gcube/social_networking/rest/examples/serializers/ContainerContextSerializer.java b/src/main/java/org/gcube/social_networking/rest/examples/serializers/ContainerContextSerializer.java new file mode 100644 index 0000000..5bea8a9 --- /dev/null +++ b/src/main/java/org/gcube/social_networking/rest/examples/serializers/ContainerContextSerializer.java @@ -0,0 +1,42 @@ +package org.gcube.social_networking.rest.examples.serializers; + +import java.io.IOException; + +import org.gcube.smartgears.context.container.ContainerContext; + +import org.gcube.com.fasterxml.jackson.core.JsonGenerator; +import org.gcube.com.fasterxml.jackson.databind.SerializerProvider; +import org.gcube.com.fasterxml.jackson.databind.ser.std.StdSerializer; + +/** + * Jackson serializer for ContainerContext + * + * @author Alfredo Oliviero (ISTI-CNR) + * + */ + +public class ContainerContextSerializer extends StdSerializer { + protected ContainerContextSerializer(Class t) { + super(t); + } + + public ContainerContextSerializer() { + super(ContainerContext.class, true); + } + + @Override + public void serialize(ContainerContext ccontext, JsonGenerator jgen, SerializerProvider provider) + throws IOException { + jgen.writeStartObject(); + jgen.writeStringField("id", ccontext.id()); + // jgen.writeObjectField("configuration.site", ccontext.configuration().site()); + // jgen.writeObjectField("configuration", ccontext.configuration()); + jgen.writeObjectField("properties", ccontext.properties()); + jgen.writeObjectField("authorizationProvider", ccontext.authorizationProvider()); + + jgen.writeObjectField("configuration", ccontext.configuration()); + jgen.writeObjectField("desc", ccontext.toString()); + + jgen.writeEndObject(); + } +} diff --git a/src/main/java/org/gcube/social_networking/rest/examples/serializers/IdmObjectSerializator.java b/src/main/java/org/gcube/social_networking/rest/examples/serializers/IdmObjectSerializator.java new file mode 100644 index 0000000..1966c27 --- /dev/null +++ b/src/main/java/org/gcube/social_networking/rest/examples/serializers/IdmObjectSerializator.java @@ -0,0 +1,54 @@ +package org.gcube.social_networking.rest.examples.serializers; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.HashMap; + +import org.gcube.com.fasterxml.jackson.core.type.TypeReference; +import org.gcube.com.fasterxml.jackson.databind.ObjectMapper; +import org.gcube.com.fasterxml.jackson.databind.module.SimpleModule; +import org.gcube.smartgears.configuration.container.ContainerConfiguration; +import org.gcube.smartgears.context.container.ContainerContext; +import org.gcube.smartgears.security.SimpleCredentials; + +/** + * Jackson Serialization utils for Smartgear Context classes + * + * @author Alfredo Oliviero (ISTI-CNR) + * + */ + +public class IdmObjectSerializator { + private static ObjectMapper serializer = null; + + protected static TypeReference> typeRefHashmap = new TypeReference>() { + }; + + public static String decodeBase64String(String encodedString) { + return new String(Base64.getUrlDecoder().decode(encodedString), StandardCharsets.UTF_8); + } + + public static HashMap jsonStringToHasmap(String jsonString) + throws IOException { + return getSerializer().readValue(jsonString, typeRefHashmap); + } + + public static ObjectMapper getSerializer() { + if (serializer == null) { + ObjectMapper om = new ObjectMapper(); + SimpleModule module = new SimpleModule(); + // module.addSerializer(Owner.class, new OwnerSerializer()); + + module.addSerializer(ContainerConfiguration.class, new ContainerConfigurationSerializer()); + module.addSerializer(ContainerContext.class, new ContainerContextSerializer()); + module.addSerializer(SimpleCredentials.class, new SimpleCredentialsSerializer()); + + // DecodedJWT serialization + //om.registerModule(new JavaTimeModule()); + serializer = om; + } + return serializer; + } + +} diff --git a/src/main/java/org/gcube/social_networking/rest/examples/serializers/OwnerSerializer.java b/src/main/java/org/gcube/social_networking/rest/examples/serializers/OwnerSerializer.java new file mode 100644 index 0000000..975e581 --- /dev/null +++ b/src/main/java/org/gcube/social_networking/rest/examples/serializers/OwnerSerializer.java @@ -0,0 +1,47 @@ +package org.gcube.social_networking.rest.examples.serializers; + +import java.io.IOException; + +import org.gcube.common.security.Owner; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +/** + * Jackson serializer for Owner + * + * @author Alfredo Oliviero (ISTI-CNR) + * + */ + +public class OwnerSerializer extends StdSerializer { + + protected OwnerSerializer(Class t) { + super(t); + } + + public OwnerSerializer() { + super(Owner.class, true); + } + + @Override + public void serialize(Owner owner, JsonGenerator jgen, SerializerProvider provider) throws IOException { + jgen.writeStartObject(); + jgen.writeStringField("ownerId", owner.getId()); + jgen.writeStringField("clientName", owner.getClientName()); + jgen.writeArrayFieldStart("roles"); + for (String role : owner.getRoles()) { + jgen.writeString(role); + } + jgen.writeEndArray(); + jgen.writeStringField("email", owner.getEmail()); + jgen.writeStringField("firstName", owner.getFirstName()); + jgen.writeStringField("lastName", owner.getLastName()); + jgen.writeBooleanField("externalClient", owner.isExternalClient()); + jgen.writeStringField("contactPerson", owner.getClientName()); + jgen.writeStringField("contactOrganisation", owner.getContactOrganisation()); + + jgen.writeEndObject(); + } +} diff --git a/src/main/java/org/gcube/social_networking/rest/examples/serializers/ServiceEndpointAccessPointSerializer.java b/src/main/java/org/gcube/social_networking/rest/examples/serializers/ServiceEndpointAccessPointSerializer.java new file mode 100644 index 0000000..8aae652 --- /dev/null +++ b/src/main/java/org/gcube/social_networking/rest/examples/serializers/ServiceEndpointAccessPointSerializer.java @@ -0,0 +1,64 @@ +package org.gcube.social_networking.rest.examples.serializers; + +import java.io.IOException; + +import org.gcube.common.encryption.encrypter.StringEncrypter; +import org.gcube.common.resources.gcore.ServiceEndpoint; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +/** + * Jackson serializer for ServiceEndpoint.AccessPoint + * + * @author Alfredo Oliviero (ISTI-CNR) + * + */ + +public class ServiceEndpointAccessPointSerializer extends StdSerializer { + + protected ServiceEndpointAccessPointSerializer(Class t) { + super(t); + } + + public ServiceEndpointAccessPointSerializer() { + super(ServiceEndpoint.AccessPoint.class, true); + } + + @Override + public void serialize(ServiceEndpoint.AccessPoint accessPoint, JsonGenerator jgen, SerializerProvider provider) + throws IOException { + jgen.writeStartObject(); + + String error = null; + String clientSecret = null; + try { + clientSecret = StringEncrypter.getEncrypter().decrypt(accessPoint.password()); + } catch (Exception e) { + error = e.getMessage(); + } + + jgen.writeStringField("address", accessPoint.address()); + jgen.writeStringField("name", accessPoint.name()); + jgen.writeStringField("description", accessPoint.description()); + + try { + jgen.writeStringField("username", accessPoint.username()); + } catch (Exception e) { + jgen.writeStringField("username", null); + } + try { + jgen.writeStringField("tostring", accessPoint.toString()); + } catch (Exception e) { + jgen.writeStringField("tostring", null); + } + if (error != null) { + jgen.writeStringField("key_error", error); + jgen.writeBooleanField("key_decoded", false); + } else { + jgen.writeBooleanField("key_decoded", true); + } + jgen.writeEndObject(); + } +} diff --git a/src/main/java/org/gcube/social_networking/rest/examples/serializers/SimpleCredentialsSerializer.java b/src/main/java/org/gcube/social_networking/rest/examples/serializers/SimpleCredentialsSerializer.java new file mode 100644 index 0000000..fcbeadc --- /dev/null +++ b/src/main/java/org/gcube/social_networking/rest/examples/serializers/SimpleCredentialsSerializer.java @@ -0,0 +1,36 @@ +package org.gcube.social_networking.rest.examples.serializers; + +import java.io.IOException; + +import org.gcube.smartgears.security.SimpleCredentials; + +import org.gcube.com.fasterxml.jackson.core.JsonGenerator; +import org.gcube.com.fasterxml.jackson.databind.SerializerProvider; +import org.gcube.com.fasterxml.jackson.databind.ser.std.StdSerializer; + +/** + * Jackson serializer for SimpleCredentials + * + * @author Alfredo Oliviero (ISTI-CNR) + * + */ + +public class SimpleCredentialsSerializer extends StdSerializer { + + protected SimpleCredentialsSerializer(Class t) { + super(t); + } + + public SimpleCredentialsSerializer() { + super(SimpleCredentials.class, true); + } + + @Override + public void serialize(SimpleCredentials credentials, JsonGenerator jgen, SerializerProvider provider) + throws IOException { + jgen.writeStartObject(); + jgen.writeStringField("clientId", credentials.getClientID()); + jgen.writeStringField("secret", "[*****]"); + jgen.writeEndObject(); + } +}