2022-02-15 09:59:02 +01:00
package org.gcube.gcat.rest ;
import java.util.Iterator ;
import javax.ws.rs.BadRequestException ;
import javax.ws.rs.Consumes ;
import javax.ws.rs.DELETE ;
2022-02-17 16:32:54 +01:00
import javax.ws.rs.ForbiddenException ;
2022-02-15 09:59:02 +01:00
import javax.ws.rs.GET ;
import javax.ws.rs.InternalServerErrorException ;
import javax.ws.rs.POST ;
import javax.ws.rs.PUT ;
import javax.ws.rs.Path ;
import javax.ws.rs.Produces ;
import javax.ws.rs.core.Response ;
import javax.ws.rs.core.Response.ResponseBuilder ;
import javax.ws.rs.core.Response.Status ;
import javax.xml.ws.WebServiceException ;
import org.gcube.com.fasterxml.jackson.databind.ObjectMapper ;
import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode ;
import org.gcube.common.authorization.utils.manager.SecretManager ;
import org.gcube.gcat.annotation.PATCH ;
import org.gcube.gcat.annotation.PURGE ;
2022-02-21 10:34:52 +01:00
import org.gcube.gcat.api.GCatConstants ;
2022-02-16 22:59:27 +01:00
import org.gcube.gcat.api.roles.Role ;
2022-02-16 22:34:30 +01:00
import org.gcube.gcat.configuration.CatalogueConfigurationFactory ;
2022-02-17 16:32:54 +01:00
import org.gcube.gcat.configuration.ServiceCatalogueConfiguration ;
2022-02-16 22:59:27 +01:00
import org.gcube.gcat.persistence.ckan.CKANUser ;
import org.gcube.gcat.persistence.ckan.CKANUserCache ;
2022-02-15 09:59:02 +01:00
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
/ * *
* @author Luca Frosini ( ISTI - CNR )
* /
@Path ( Configuration . CONFIGURATION )
public class Configuration extends BaseREST implements org . gcube . gcat . api . interfaces . Configuration < Response , Response > {
private static Logger logger = LoggerFactory . getLogger ( Configuration . class ) ;
protected String checkContext ( String context ) throws WebServiceException {
if ( context = = null | | context . compareTo ( " " ) = = 0 ) {
throw new BadRequestException ( " Please provide a valid context as path parameter " ) ;
}
String c = SecretManager . instance . get ( ) . getContext ( ) ;
if ( context . compareTo ( Configuration . CURRENT_CONTEXT_PATH_PARAMETER ) = = 0 ) {
return c ;
}
if ( context . compareTo ( c ) ! = 0 ) {
throw new BadRequestException ( " Context provided as path parameter (i.e. " + context + " ) does not match with token request context (i.e. " + c + " ) " ) ;
}
return c ;
}
2022-02-17 16:32:54 +01:00
protected String checkContext ( String context , ServiceCatalogueConfiguration catalogueConfiguration ) {
2022-02-15 09:59:02 +01:00
String c = checkContext ( context ) ;
if ( c . compareTo ( catalogueConfiguration . getContext ( ) ) ! = 0 ) {
throw new BadRequestException ( " Context provided in the configuration (i.e. " + catalogueConfiguration . getContext ( ) + " ) does not match with token request context (i.e. " + c + " ) " ) ;
}
return c ;
}
2022-02-16 22:59:27 +01:00
2022-02-17 16:32:54 +01:00
protected void checkRole ( Role required ) {
2022-02-16 22:59:27 +01:00
CKANUser ckanUser = CKANUserCache . getCurrrentCKANUser ( ) ;
2022-02-17 16:32:54 +01:00
if ( ckanUser . getRole ( ) . ordinal ( ) < required . ordinal ( ) ) {
throw new ForbiddenException ( " To perform such a request you must have " + required . getPortalRole ( ) + " role " ) ;
2022-02-16 22:59:27 +01:00
}
}
2022-02-17 16:32:54 +01:00
private String createOrUpdate ( ServiceCatalogueConfiguration catalogueConfiguration ) throws WebServiceException {
2022-02-15 09:59:02 +01:00
try {
2022-02-17 16:32:54 +01:00
ServiceCatalogueConfiguration gotCatalogueConfiguration = CatalogueConfigurationFactory . createOrUpdate ( catalogueConfiguration ) ;
String configuration = gotCatalogueConfiguration . toJsonString ( ) ;
2022-02-15 09:59:02 +01:00
logger . debug ( " The new configuration in context {} is {} " , catalogueConfiguration . getContext ( ) , configuration ) ;
return configuration ;
} catch ( WebServiceException e ) {
throw e ;
} catch ( Exception e ) {
throw new InternalServerErrorException ( e ) ;
}
}
@POST
2022-02-21 10:34:52 +01:00
@Consumes ( GCatConstants . APPLICATION_JSON_CHARSET_UTF_8 )
@Produces ( GCatConstants . APPLICATION_JSON_CHARSET_UTF_8 )
2022-02-15 09:59:02 +01:00
@Override
public Response create ( String json ) throws WebServiceException {
try {
2022-02-17 16:32:54 +01:00
ServiceCatalogueConfiguration catalogueConfiguration = ServiceCatalogueConfiguration . getServiceCatalogueConfiguration ( json ) ;
2022-02-15 09:59:02 +01:00
checkContext ( CURRENT_CONTEXT_PATH_PARAMETER , catalogueConfiguration ) ;
2022-02-15 21:18:02 +01:00
String ret = createOrUpdate ( catalogueConfiguration ) ;
2022-02-15 09:59:02 +01:00
ResponseBuilder responseBuilder = Response . status ( Status . CREATED ) ;
if ( ret ! = null ) {
2022-02-21 10:34:52 +01:00
responseBuilder . entity ( ret ) . type ( GCatConstants . APPLICATION_JSON_CHARSET_UTF_8 ) ;
2022-02-15 09:59:02 +01:00
}
return responseBuilder . build ( ) ;
} catch ( WebServiceException e ) {
throw e ;
} catch ( Exception e ) {
throw new InternalServerErrorException ( e ) ;
}
}
2022-02-16 22:34:30 +01:00
2022-02-15 09:59:02 +01:00
@GET
2022-02-21 10:34:52 +01:00
@Produces ( GCatConstants . APPLICATION_JSON_CHARSET_UTF_8 )
2022-02-15 09:59:02 +01:00
public String read ( String context ) throws WebServiceException {
try {
checkContext ( context ) ;
return read ( ) ;
} catch ( WebServiceException e ) {
throw e ;
} catch ( Exception e ) {
throw new InternalServerErrorException ( e ) ;
}
}
@Override
public String read ( ) throws WebServiceException {
try {
2022-02-17 16:32:54 +01:00
ServiceCatalogueConfiguration catalogueConfiguration = CatalogueConfigurationFactory . getInstance ( ) ;
String configuration = catalogueConfiguration . toJsonString ( ) ;
2022-02-15 09:59:02 +01:00
logger . debug ( " Configuration in context {} is {} " , catalogueConfiguration . getContext ( ) , configuration ) ;
return configuration ;
} catch ( WebServiceException e ) {
throw e ;
} catch ( Exception e ) {
throw new InternalServerErrorException ( e ) ;
}
}
2022-02-16 22:34:30 +01:00
@PUT
2022-02-21 10:34:52 +01:00
@Consumes ( GCatConstants . APPLICATION_JSON_CHARSET_UTF_8 )
@Produces ( GCatConstants . APPLICATION_JSON_CHARSET_UTF_8 )
2022-02-16 22:34:30 +01:00
public String createOrUpdate ( String context , String json ) throws WebServiceException {
try {
2022-02-17 16:32:54 +01:00
ServiceCatalogueConfiguration catalogueConfiguration = ServiceCatalogueConfiguration . getServiceCatalogueConfiguration ( json ) ;
2022-02-16 22:34:30 +01:00
checkContext ( context , catalogueConfiguration ) ;
return createOrUpdate ( catalogueConfiguration ) ;
} catch ( WebServiceException e ) {
throw e ;
} catch ( Exception e ) {
throw new InternalServerErrorException ( e ) ;
}
}
2022-02-15 09:59:02 +01:00
@Override
public String update ( String json ) throws WebServiceException {
try {
2022-02-17 16:32:54 +01:00
ServiceCatalogueConfiguration catalogueConfiguration = ServiceCatalogueConfiguration . getServiceCatalogueConfiguration ( json ) ;
2022-02-15 09:59:02 +01:00
checkContext ( CURRENT_CONTEXT_PATH_PARAMETER ) ;
catalogueConfiguration = CatalogueConfigurationFactory . createOrUpdate ( catalogueConfiguration ) ;
2022-02-17 16:32:54 +01:00
String configuration = catalogueConfiguration . toJsonString ( ) ;
2022-02-15 09:59:02 +01:00
logger . debug ( " Configuration in context {} has been updated to {} " , catalogueConfiguration . getContext ( ) , configuration ) ;
return configuration ;
} catch ( WebServiceException e ) {
throw e ;
} catch ( Exception e ) {
throw new InternalServerErrorException ( e ) ;
}
}
@PATCH
2022-02-21 10:34:52 +01:00
@Consumes ( GCatConstants . APPLICATION_JSON_CHARSET_UTF_8 )
@Produces ( GCatConstants . APPLICATION_JSON_CHARSET_UTF_8 )
2022-02-15 09:59:02 +01:00
public String patch ( String context , String json ) throws WebServiceException {
try {
checkContext ( context ) ;
return patch ( json ) ;
} catch ( WebServiceException e ) {
throw e ;
} catch ( Exception e ) {
throw new InternalServerErrorException ( e ) ;
}
}
@Override
public String patch ( String json ) throws WebServiceException {
try {
2022-02-17 16:32:54 +01:00
ServiceCatalogueConfiguration catalogueConfiguration = CatalogueConfigurationFactory . getInstance ( ) ;
2022-02-15 09:59:02 +01:00
ObjectMapper mapper = new ObjectMapper ( ) ;
ObjectNode node = ( ObjectNode ) mapper . readTree ( json ) ;
2022-02-17 16:32:54 +01:00
if ( node . has ( ServiceCatalogueConfiguration . CONTEXT_KEY ) ) {
String context = node . get ( ServiceCatalogueConfiguration . CONTEXT_KEY ) . asText ( ) ;
2022-02-15 09:59:02 +01:00
String c = SecretManager . instance . get ( ) . getContext ( ) ;
if ( c . compareTo ( context ) ! = 0 ) {
throw new BadRequestException ( " Context provided in the configuration (i.e. " + catalogueConfiguration . getContext ( ) + " ) does not match with token request context (i.e. " + c + " ) " ) ;
}
node . remove ( CURRENT_CONTEXT_PATH_PARAMETER ) ;
}
2022-02-16 22:59:27 +01:00
ObjectNode configuration = mapper . valueToTree ( catalogueConfiguration ) ;
2022-02-15 09:59:02 +01:00
Iterator < String > fieldNames = node . fieldNames ( ) ;
while ( fieldNames . hasNext ( ) ) {
String fieldName = fieldNames . next ( ) ;
configuration . set ( fieldName , node . get ( fieldName ) ) ;
}
2022-02-17 16:32:54 +01:00
ServiceCatalogueConfiguration newCatalogueConfiguration = ServiceCatalogueConfiguration . getServiceCatalogueConfiguration ( configuration ) ;
2022-02-15 09:59:02 +01:00
newCatalogueConfiguration = CatalogueConfigurationFactory . createOrUpdate ( newCatalogueConfiguration ) ;
2022-02-17 16:32:54 +01:00
String ret = newCatalogueConfiguration . toJsonString ( ) ;
2022-02-15 09:59:02 +01:00
logger . debug ( " Configuration in context {} has been patched to {} " , catalogueConfiguration . getContext ( ) , ret ) ;
return ret ;
} catch ( WebServiceException e ) {
throw e ;
} catch ( Exception e ) {
throw new InternalServerErrorException ( e ) ;
}
}
@DELETE
public Response delete ( String context , Boolean purge ) throws WebServiceException {
try {
checkContext ( context ) ;
if ( purge ) {
return purge ( ) ;
} else {
return delete ( ) ;
}
} catch ( WebServiceException e ) {
throw e ;
} catch ( Exception e ) {
throw new InternalServerErrorException ( e ) ;
}
}
// Remove the configuration from cache and force reload
@Override
public Response delete ( ) throws WebServiceException {
try {
CatalogueConfigurationFactory . renew ( ) ;
return Response . status ( Status . NO_CONTENT ) . build ( ) ;
} catch ( WebServiceException e ) {
throw e ;
} catch ( Exception e ) {
throw new InternalServerErrorException ( e ) ;
}
}
@PURGE
public Response purge ( String context ) throws WebServiceException {
try {
checkContext ( context ) ;
return purge ( ) ;
} catch ( WebServiceException e ) {
throw e ;
} catch ( Exception e ) {
throw new InternalServerErrorException ( e ) ;
}
}
// Remove the configuration from cache and from IS
@Override
public Response purge ( ) throws WebServiceException {
try {
CatalogueConfigurationFactory . purge ( ) ;
return Response . status ( Status . NO_CONTENT ) . build ( ) ;
} catch ( WebServiceException e ) {
throw e ;
} catch ( Exception e ) {
throw new InternalServerErrorException ( e ) ;
}
}
}