package org.gcube.application.geoportal.service.rest; import lombok.extern.slf4j.Slf4j; import org.gcube.application.cms.implementations.ImplementationProvider; import org.gcube.application.cms.serialization.Serialization; import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor; import org.gcube.application.geoportal.common.rest.InterfaceConstants; import org.gcube.application.geoportal.service.engine.mongo.UCDManagerI; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @Path(InterfaceConstants.Methods.UCD) @Slf4j public class UseCaseDescriptors { private UCDManagerI getManager(){ try{ return ImplementationProvider.get().getProvidedObjectByClass(UCDManagerI.class); }catch(Throwable t){ log.error("Unable to get UCD Engine",t); throw new WebApplicationException("Unable to access UC Engine", Response.Status.INTERNAL_SERVER_ERROR); } } @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public UseCaseDescriptor createNew(UseCaseDescriptor toCreate) { return new GuardedMethod() { @Override protected UseCaseDescriptor run() throws Exception, WebApplicationException { log.info("Creating new UseCaseDescriptor ({})",toCreate); if(toCreate.getMongoId()!=null) throw new WebApplicationException("Cannot register Use Case Descriptor with mongo ID", Response.Status.BAD_REQUEST); if(toCreate.getId()==null) throw new WebApplicationException("Missing mandatory field ID", Response.Status.BAD_REQUEST); UseCaseDescriptor toReturn = getManager().put(toCreate); if(toReturn == null){ log.warn("NB Cached backend implementation is slow beware of that"); } log.info("Created new UseCaseDescriptor (ID {})",toReturn.getId()); return toReturn; } }.execute().getResult(); } @PUT @Path("{"+InterfaceConstants.Parameters.UCID +"}") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public UseCaseDescriptor update(@PathParam(InterfaceConstants.Parameters.UCID) String profileId, UseCaseDescriptor d) { return new GuardedMethod() { @Override protected UseCaseDescriptor run() throws Exception, WebApplicationException { log.warn("Updating UseCaseDescriptor ({})",profileId); d.setId(profileId); return getManager().put(d); } }.execute().getResult(); } @DELETE @Produces(MediaType.APPLICATION_JSON) @Path("{"+InterfaceConstants.Parameters.UCID +"}") public Boolean delete(@PathParam(InterfaceConstants.Parameters.UCID) String id, @DefaultValue("false") @QueryParam(InterfaceConstants.Parameters.FORCE) Boolean force) { return new GuardedMethod() { @Override protected Boolean run() throws Exception, WebApplicationException { log.warn("Deleting UseCaseDescriptor (ID {}). Force is {}",id,force); getManager().deleteById(id,force); return true; } }.execute().getResult(); } // BY ID @GET @Produces(MediaType.APPLICATION_JSON) @Path("{"+InterfaceConstants.Parameters.UCID +"}") public UseCaseDescriptor getById(@PathParam(InterfaceConstants.Parameters.UCID) String id) { return new GuardedMethod() { @Override protected UseCaseDescriptor run() throws Exception, WebApplicationException { UseCaseDescriptor toReturn = getManager().getById(id); if(toReturn == null ) throw new WebApplicationException("No UCD Matching ID "+id, Response.Status.NOT_FOUND); else return toReturn; } }.execute().getResult(); } @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @Path("/"+InterfaceConstants.Methods.QUERY_PATH) public Iterable query(String queryString){ return new GuardedMethod>() { @Override protected Iterable run() throws Exception, WebApplicationException { return getManager().query(Serialization.parseQuery(queryString)); } }.execute().getResult(); } }