2021-09-20 16:47:35 +02:00
package org.gcube.application.geoportal.service.engine.mongo ;
2021-12-01 11:13:34 +01:00
import com.fasterxml.jackson.core.JsonProcessingException ;
2022-02-16 14:54:48 +01:00
import com.jayway.jsonpath.JsonPath ;
2021-12-01 11:13:34 +01:00
import com.mongodb.client.MongoDatabase ;
2022-01-17 18:19:40 +01:00
import com.vdurmont.semver4j.Semver ;
2022-01-17 13:30:21 +01:00
import lombok.Getter ;
2021-12-01 11:13:34 +01:00
import lombok.extern.slf4j.Slf4j ;
2022-01-17 18:19:40 +01:00
import org.apache.commons.io.IOUtils ;
2021-12-01 11:13:34 +01:00
import org.bson.Document ;
import org.bson.types.ObjectId ;
2021-12-07 16:12:43 +01:00
import org.gcube.application.cms.plugins.LifecycleManager ;
2022-02-14 17:06:32 +01:00
import org.gcube.application.cms.plugins.faults.EventException ;
2021-12-07 16:42:39 +01:00
import org.gcube.application.cms.plugins.faults.StepException ;
2022-01-12 18:42:22 +01:00
import org.gcube.application.cms.plugins.model.PluginDescriptor ;
2022-02-14 17:06:32 +01:00
import org.gcube.application.cms.plugins.reports.EventExecutionReport ;
2022-02-14 12:23:13 +01:00
import org.gcube.application.cms.plugins.reports.StepExecutionReport ;
2022-02-14 17:06:32 +01:00
import org.gcube.application.cms.plugins.requests.EventExecutionRequest ;
2021-12-07 16:42:39 +01:00
import org.gcube.application.cms.plugins.requests.StepExecutionRequest ;
2022-01-17 18:19:40 +01:00
import org.gcube.application.geoportal.common.faults.StorageException ;
2021-12-07 16:42:39 +01:00
import org.gcube.application.geoportal.common.model.document.* ;
2022-02-14 12:23:13 +01:00
import org.gcube.application.geoportal.common.model.document.access.Access ;
import org.gcube.application.geoportal.common.model.document.access.AccessPolicy ;
2022-02-14 17:06:32 +01:00
import org.gcube.application.geoportal.common.model.document.accounting.AccountingInfo ;
2022-02-14 12:23:13 +01:00
import org.gcube.application.geoportal.common.model.document.accounting.PublicationInfo ;
import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFile ;
import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFileSet ;
2022-02-14 17:06:32 +01:00
import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation ;
2021-12-01 11:13:34 +01:00
import org.gcube.application.geoportal.common.model.legacy.Concessione ;
2022-01-17 18:19:40 +01:00
import org.gcube.application.geoportal.common.model.profile.Field ;
2022-01-12 18:42:22 +01:00
import org.gcube.application.geoportal.common.model.profile.HandlerDeclaration ;
2021-12-07 13:05:08 +01:00
import org.gcube.application.geoportal.common.model.profile.Profile ;
2022-02-04 17:45:47 +01:00
import org.gcube.application.geoportal.common.model.rest.Configuration ;
2021-12-01 11:13:34 +01:00
import org.gcube.application.geoportal.common.model.rest.QueryRequest ;
2022-01-27 15:02:53 +01:00
import org.gcube.application.geoportal.common.model.rest.RegisterFileSetRequest ;
import org.gcube.application.geoportal.common.model.rest.TempFile ;
2022-02-01 15:24:39 +01:00
import org.gcube.application.geoportal.common.model.JSONPathWrapper ;
2022-01-17 18:19:40 +01:00
import org.gcube.application.geoportal.common.utils.StorageUtils ;
2021-12-07 13:05:08 +01:00
import org.gcube.application.geoportal.service.engine.ImplementationProvider ;
2022-01-17 18:19:40 +01:00
import org.gcube.application.geoportal.service.engine.WorkspaceManager ;
2022-02-04 17:45:47 +01:00
import org.gcube.application.geoportal.common.model.rest.ConfigurationException ;
2021-12-01 11:13:34 +01:00
import org.gcube.application.geoportal.service.model.internal.faults.DeletionException ;
2022-02-01 15:24:39 +01:00
import org.gcube.application.cms.serialization.Serialization ;
2021-12-07 16:12:43 +01:00
import org.gcube.application.geoportal.service.utils.UserUtils ;
2022-01-17 18:19:40 +01:00
import org.gcube.common.storagehub.client.dsl.FolderContainer ;
import org.gcube.common.storagehub.model.exceptions.StorageHubException ;
2021-09-20 16:47:35 +02:00
2021-12-07 11:16:26 +01:00
import javax.ws.rs.WebApplicationException ;
import javax.ws.rs.core.Response ;
2021-12-01 11:13:34 +01:00
import java.io.IOException ;
2022-01-17 18:19:40 +01:00
import java.io.InputStream ;
import java.net.URL ;
2021-12-07 11:16:26 +01:00
import java.security.InvalidParameterException ;
2022-01-17 18:19:40 +01:00
import java.util.ArrayList ;
2022-01-12 18:42:22 +01:00
import java.util.List ;
2021-12-07 13:05:08 +01:00
import java.util.Map ;
2022-02-14 12:23:13 +01:00
import java.util.UUID ;
2021-12-01 11:13:34 +01:00
import java.util.concurrent.LinkedBlockingQueue ;
import java.util.function.Consumer ;
2022-02-01 15:24:39 +01:00
import static org.gcube.application.cms.serialization.Serialization.* ;
2021-12-01 11:13:34 +01:00
@Slf4j
public class ProfiledMongoManager extends MongoManager implements MongoManagerI < ProfiledDocument > {
2022-01-18 12:01:33 +01:00
@Getter
2021-12-07 13:05:08 +01:00
Profile profile ;
2021-12-07 16:12:43 +01:00
MongoDatabase db = null ;
2022-01-17 13:30:21 +01:00
2021-12-07 16:12:43 +01:00
2021-12-07 11:16:26 +01:00
public ProfiledMongoManager ( String profileId ) throws ConfigurationException {
2022-01-14 12:31:11 +01:00
// Check Profile ID
2021-12-07 16:12:43 +01:00
log . info ( " Loading profile ID {} " , profileId ) ;
2021-12-07 11:16:26 +01:00
if ( profileId = = null ) throw new InvalidParameterException ( " Profile ID cannot be null " ) ;
2021-12-07 13:05:08 +01:00
Map < String , Profile > profiles = ImplementationProvider . get ( ) . getProfiles ( ) . getObject ( ) ;
2021-12-07 16:12:43 +01:00
if ( ! profiles . containsKey ( profileId ) ) {
log . debug ( " Asked profile {} not found. Available ones are {} " , profileId , profiles . keySet ( ) ) ;
throw new WebApplicationException ( " Profile " + profileId + " not registered " , Response . Status . NOT_FOUND ) ;
}
profile = profiles . get ( profileId ) ;
log . debug ( " Loaded Profile {} " , profile ) ;
2022-01-14 12:31:11 +01:00
// Connect to DB
String toUseDB = super . client . getConnection ( ) . getDatabase ( ) ;
log . info ( " Connecting to DB {} " , toUseDB ) ;
// TODO MAP OF DATABASES?
db = client . getTheClient ( ) . getDatabase ( toUseDB ) ;
2021-12-01 11:13:34 +01:00
}
2022-01-17 13:30:21 +01:00
@Getter ( lazy = true )
2022-02-14 17:06:32 +01:00
private final LifecycleManager manager = getLCManager ( ) ;
2021-12-07 16:12:43 +01:00
2022-01-17 13:30:21 +01:00
private LifecycleManager getLCManager ( ) {
try {
LifecycleManager toReturn = null ;
//Getting Lifecycle Manager declaration from Profile
List < HandlerDeclaration > handlerDeclarations = profile . getHandlersMap ( ) . get ( PluginDescriptor . BaseTypes . LIFECYCLE_MANAGER ) ;
if ( handlerDeclarations = = null | | handlerDeclarations . isEmpty ( ) ) throw new ConfigurationException ( " No Lifecycle Handler defined for profile ID " + profile . getId ( ) ) ;
if ( handlerDeclarations . size ( ) > 1 ) throw new ConfigurationException ( " Too many Lifecycle Handlers defined ( " + handlerDeclarations + " ) in profile ID " + profile . getId ( ) ) ;
HandlerDeclaration lcHandlerDeclaration = handlerDeclarations . get ( 0 ) ;
// Loading Lifecycle Manager
log . debug ( " Looking for handler {} " , lcHandlerDeclaration ) ;
toReturn = ( LifecycleManager ) ImplementationProvider . get ( ) . getPluginManager ( ) . getObject ( ) . get ( lcHandlerDeclaration . getId ( ) ) ;
if ( toReturn = = null ) throw new ConfigurationException ( " Unable to find Lifecycle Manager Plugin. ID " + lcHandlerDeclaration . getId ( ) ) ;
return toReturn ;
} catch ( Throwable t ) {
log . warn ( " Unable to load LC Manager " , t ) ;
return null ;
}
}
2021-12-07 16:12:43 +01:00
2021-12-01 11:13:34 +01:00
private String getCollectionName ( ) {
2021-12-07 16:42:39 +01:00
// TODO Profile can directly specify, use ID only as default
2022-01-14 12:31:11 +01:00
2021-12-07 16:12:43 +01:00
return profile . getId ( ) ;
2021-12-01 11:13:34 +01:00
}
@Override
2021-12-07 16:12:43 +01:00
public MongoDatabase getDatabase ( ) {
return db ;
2021-12-01 11:13:34 +01:00
}
@Override
2022-02-14 17:06:32 +01:00
public ProfiledDocument registerNew ( Document toRegisterDoc ) throws IOException , StepException , EventException {
2021-12-07 16:42:39 +01:00
log . info ( " Registering new document in {} " , profile . getId ( ) ) ;
log . debug ( " Going to register {} " , toRegisterDoc . toJson ( ) ) ;
2021-12-07 11:16:26 +01:00
ProfiledDocument toRegister = new ProfiledDocument ( ) ;
toRegister . setTheDocument ( toRegisterDoc ) ;
2021-12-07 16:42:39 +01:00
PublicationInfo pubInfo = new PublicationInfo ( ) ;
pubInfo . setCreationInfo ( UserUtils . getCurrent ( ) . asInfo ( ) ) ;
// TODO Set Access From Profile
Access access = new Access ( ) ;
access . setLicense ( " " ) ;
access . setPolicy ( AccessPolicy . OPEN ) ;
pubInfo . setAccess ( access ) ;
toRegister . setInfo ( pubInfo ) ;
2021-12-01 11:13:34 +01:00
2021-12-07 16:42:39 +01:00
toRegister . setProfileID ( profile . getId ( ) ) ;
toRegister . setProfileVersion ( profile . getVersion ( ) ) ;
2022-01-17 18:19:40 +01:00
toRegister . setVersion ( new Semver ( " 1.0.0 " ) ) ;
2021-12-01 11:13:34 +01:00
2022-02-14 17:06:32 +01:00
LifecycleInformation draftInfo = new LifecycleInformation ( ) ;
2022-02-15 19:02:44 +01:00
draftInfo . setPhase ( LifecycleInformation . DRAFT_PHASE ) ;
2022-02-14 17:06:32 +01:00
toRegister . setLifecycleInformation ( draftInfo ) ;
2021-12-15 19:10:19 +01:00
// Apply Lifecycle
2022-02-14 17:06:32 +01:00
toRegister = triggerEvent ( toRegister , EventExecutionRequest . Events . ON_INIT_DOCUMENT , null ) . getResult ( ) ;
2021-12-01 11:13:34 +01:00
2021-12-07 16:42:39 +01:00
log . debug ( " Going to register {} " , toRegister ) ;
2021-12-01 11:13:34 +01:00
2021-12-15 19:10:19 +01:00
// Insert object
2022-01-27 15:02:53 +01:00
ObjectId id = insert ( asDocumentWithId ( toRegister ) , getCollectionName ( ) ) ;
2021-12-07 16:12:43 +01:00
2021-12-07 16:42:39 +01:00
log . info ( " Obtained id {} " , id ) ;
2021-12-07 16:12:43 +01:00
return getByID ( id . toHexString ( ) ) ;
2021-12-01 11:13:34 +01:00
}
@Override
2022-02-14 17:06:32 +01:00
public ProfiledDocument update ( String id , Document toSet ) throws IOException , EventException {
2021-12-01 11:13:34 +01:00
log . trace ( " Replacing {} " , toSet ) ;
2022-01-17 18:19:40 +01:00
ProfiledDocument toUpdate = getByID ( id ) ;
toUpdate . setTheDocument ( toSet ) ;
toUpdate = onUpdate ( toUpdate ) ;
2022-01-27 15:02:53 +01:00
ProfiledDocument toReturn = convert ( replace ( asDocumentWithId ( toUpdate ) , new ObjectId ( id ) , getCollectionName ( ) ) , ProfiledDocument . class ) ;
log . debug ( " Updated ProfiledDocument is {} " , toReturn ) ;
return toReturn ;
2022-01-17 18:19:40 +01:00
}
2022-02-14 17:06:32 +01:00
private ProfiledDocument onUpdate ( ProfiledDocument toUpdate ) throws EventException {
2022-01-17 18:19:40 +01:00
UserUtils . AuthenticatedUser u = UserUtils . getCurrent ( ) ;
toUpdate . getInfo ( ) . setLastEditInfo ( u . asInfo ( ) ) ;
toUpdate . setVersion ( toUpdate . getVersion ( ) . withIncPatch ( ) ) ;
2022-02-14 17:06:32 +01:00
return triggerEvent ( toUpdate , EventExecutionRequest . Events . ON_INIT_DOCUMENT , null ) . getResult ( ) ;
2021-12-01 11:13:34 +01:00
}
@Override
public void delete ( String id , boolean force ) throws DeletionException {
log . debug ( " Deleting by ID {}, force {} " , id , force ) ;
try {
ProfiledDocument doc = getByID ( id ) ;
2021-12-07 16:12:43 +01:00
// TODO INVOKE LIFECYCLE
2021-12-01 11:13:34 +01:00
//if(!force&&isPublished(id)) throw new Exception("Cannot delete published documents. Unpublish it or use force = true");
try {
// TODO CHECK PHASE AND STATUS
// DEINDEX
// DEMATERIALIZE
// DELETE CONTENT
// DELETE ENTRY
throw new DeletionException ( " IMPLEMENT THIS " ) ;
// delete(asId(id), getCollectionName());
} catch ( DeletionException e ) {
//storing updated - partially deleted
// concessione=onUpdate(concessione);
2022-01-27 15:02:53 +01:00
// replace(asDocumentWithId(concessione), collectionName);
2021-12-01 11:13:34 +01:00
throw e ;
}
} catch ( Throwable t ) {
throw new DeletionException ( " Unable to delete " + id , t ) ;
}
}
@Override
2022-02-14 17:06:32 +01:00
public ProfiledDocument getByID ( String id ) throws WebApplicationException {
2022-01-17 18:19:40 +01:00
Document doc = super . getById ( asId ( id ) , getCollectionName ( ) ) ;
if ( doc = = null ) throw new WebApplicationException ( " No document with ID " + id ) ;
return convert ( doc , ProfiledDocument . class ) ;
2021-12-01 11:13:34 +01:00
}
@Override
2021-12-07 11:16:26 +01:00
public Iterable < Document > query ( QueryRequest queryRequest ) {
log . info ( " Querying {} " , queryRequest ) ;
LinkedBlockingQueue queue = new LinkedBlockingQueue < Concessione > ( ) ;
query ( queryRequest , getCollectionName ( ) ) . forEach (
( Consumer < ? super Document > ) ( Document d ) - > { try {
queue . put ( d ) ;
} catch ( Throwable t ) { log . warn ( " Unable to translate " + d ) ; } } ) ;
log . info ( " Returned {} elements " , queue . size ( ) ) ;
return queue ;
}
@Override
public Iterable < ProfiledDocument > filter ( QueryRequest queryRequest ) {
2021-12-01 11:13:34 +01:00
log . info ( " Searching concessione for filter {} " , queryRequest ) ;
LinkedBlockingQueue queue = new LinkedBlockingQueue < Concessione > ( ) ;
query ( queryRequest , getCollectionName ( ) ) . forEach (
( Consumer < ? super Document > ) ( Document d ) - > { try {
queue . put ( d ) ;
} catch ( Throwable t ) { log . warn ( " Unable to translate " + d ) ; } } ) ;
log . info ( " Returned {} elements " , queue . size ( ) ) ;
return queue ;
}
@Override
2022-01-17 18:19:40 +01:00
public ProfiledDocument performStep ( String id , String step , Document options ) throws StepException , JsonProcessingException {
2022-02-14 17:06:32 +01:00
ProfiledDocument document = getByID ( id ) ;
try {
StepExecutionReport report = step ( document , step , options ) ;
document = report . getResult ( ) ;
} catch ( Throwable t ) {
log . error ( " [Profile {} ] ERROR Invoking Step {} on document {} " , profile . getId ( ) , step , id , t ) ;
LifecycleInformation info = new LifecycleInformation ( ) ;
info . setPhase ( document . getLifecycleInformation ( ) . getPhase ( ) ) ;
info . setLastOperationStatus ( LifecycleInformation . Status . ERROR ) ;
info . addErrorMessage ( t . getMessage ( ) ) ;
info . setLastInvokedStep ( step ) ;
document . setLifecycleInformation ( info ) ;
} finally {
return convert ( replace ( asDocumentWithId ( document ) , new ObjectId ( id ) , getCollectionName ( ) ) , ProfiledDocument . class ) ;
}
2021-12-01 11:13:34 +01:00
}
2022-01-17 18:19:40 +01:00
/ * *
* NB Put at path :
*
2022-01-27 15:02:53 +01:00
* Path Examples
* artifact
* images
* images [ 1 ]
2022-02-15 19:02:44 +01:00
* layers [ ? ( @ . name = ' myName ' ) ] . fileset
2022-01-27 15:02:53 +01:00
*
2022-01-17 18:19:40 +01:00
*
*
* /
2021-12-01 11:13:34 +01:00
@Override
2022-02-14 17:06:32 +01:00
public ProfiledDocument registerFileSet ( String id , RegisterFileSetRequest request ) throws ConfigurationException , StorageHubException , StorageException , StepException , JsonProcessingException , DeletionException , EventException {
2022-02-16 14:54:48 +01:00
log . info ( " Registering Fileset for {} [profile ID {}], Request is {} " , id , profile . getId ( ) , request ) ;
2022-01-27 15:02:53 +01:00
2022-02-16 14:54:48 +01:00
List < TempFile > files = request . getStreams ( ) ;
2022-01-27 15:02:53 +01:00
Document attributes = request . getAttributes ( ) ;
2022-01-17 18:19:40 +01:00
ProfiledDocument doc = getByID ( id ) ;
WorkspaceManager ws = new WorkspaceManager ( ) ;
StorageUtils storage = ImplementationProvider . get ( ) . getStorageProvider ( ) . getObject ( ) ;
2022-02-16 14:54:48 +01:00
log . debug ( " Checking field {} definition in {} " , request . getFieldDefinitionPath ( ) , profile . getId ( ) ) ;
Field fieldDefinition = getFieldDefinition ( profile , request . getFieldDefinitionPath ( ) ) ;
2022-02-15 19:02:44 +01:00
2022-01-17 18:19:40 +01:00
JSONPathWrapper docWrapper = new JSONPathWrapper ( doc . getTheDocument ( ) . toJson ( ) ) ;
2022-02-01 15:24:39 +01:00
2022-02-16 14:54:48 +01:00
List < String > matchingPaths = docWrapper . getMatchingPaths ( request . getParentPath ( ) ) ;
if ( matchingPaths . size ( ) > 1 ) throw new WebApplicationException ( " Multiple Destination matching parent path " + request . getParentPath ( ) , Response . Status . BAD_REQUEST ) ;
if ( matchingPaths . isEmpty ( ) ) throw new WebApplicationException ( " PArent path not found at " + request . getParentPath ( ) , Response . Status . BAD_REQUEST ) ;
2022-02-15 19:02:44 +01:00
2022-02-16 14:54:48 +01:00
String parentMatchingPath = matchingPaths . get ( 0 ) ;
Document parent = Serialization . asDocument ( docWrapper . getByPath ( parentMatchingPath ) . get ( 0 ) ) ;
2022-01-17 18:19:40 +01:00
2022-02-16 14:54:48 +01:00
// PREPARE REGISTERED FS
2022-01-17 18:19:40 +01:00
2022-02-16 14:54:48 +01:00
// MANAGE CLASH
2022-01-27 15:02:53 +01:00
switch ( request . getClashOption ( ) ) {
case REPLACE_EXISTING : {
2022-02-16 14:54:48 +01:00
if ( fieldDefinition . isCollection ( ) )
throw new WebApplicationException ( " Cannot replace repeatable field " + request . getFieldDefinitionPath ( ) + " . " , Response . Status . BAD_REQUEST ) ;
// DELETE EXISTING AND PUT
RegisteredFileSet toDelete = Serialization . convert ( parent . get ( request . getFieldName ( ) ) , RegisteredFileSet . class ) ;
if ( ! ( toDelete = = null ) & & ! ( toDelete . isEmpty ( ) ) )
deleteFileSetRoutine ( toDelete , false , ws ) ;
RegisteredFileSet fs = prepareRegisteredFileSet ( doc . getInfo ( ) , doc . get_id ( ) , profile . getId ( ) , request . getAttributes ( ) , files , storage , ws ) ;
log . debug ( " Registered Fileset for [ID {} profile {}] is {} " , fs , doc . get_id ( ) , doc . getProfileID ( ) ) ;
docWrapper . putElement ( parentMatchingPath , request . getFieldName ( ) , fs ) ;
break ; }
case MERGE_EXISTING : {
if ( fieldDefinition . isCollection ( ) )
throw new WebApplicationException ( " Cannot merge repeatable field " + request . getFieldDefinitionPath ( ) + " . " , Response . Status . BAD_REQUEST ) ;
RegisteredFileSet original = Serialization . convert ( parent . get ( request . getFieldName ( ) ) , RegisteredFileSet . class ) ;
// MERGE ATTRIBUTES AND PUT
Document toUseAttributes = request . getAttributes ( ) ;
if ( original ! = null ) toUseAttributes . putAll ( original ) ;
RegisteredFileSet fs = prepareRegisteredFileSet ( doc . getInfo ( ) , doc . get_id ( ) , profile . getId ( ) , toUseAttributes , files , storage , ws ) ;
log . debug ( " Registered Fileset for [ID {} profile {}] is {} " , fs , doc . get_id ( ) , doc . getProfileID ( ) ) ;
docWrapper . putElement ( parentMatchingPath , request . getFieldName ( ) , fs ) ;
break ; }
case APPEND : {
2022-01-27 15:02:53 +01:00
if ( ! fieldDefinition . isCollection ( ) )
2022-02-16 14:54:48 +01:00
throw new WebApplicationException ( " Cannot add to single field " + request . getFieldDefinitionPath ( ) + " . " , Response . Status . BAD_REQUEST ) ;
RegisteredFileSet fs = prepareRegisteredFileSet ( doc . getInfo ( ) , doc . get_id ( ) , profile . getId ( ) , request . getAttributes ( ) , files , storage , ws ) ;
log . debug ( " Registered Fileset for [ID {} profile {}] is {} " , fs , doc . get_id ( ) , doc . getProfileID ( ) ) ;
2022-01-27 15:02:53 +01:00
2022-02-16 14:54:48 +01:00
docWrapper . addElementToArray ( String . format ( " %1ds['%2$s'] " , parentMatchingPath , request . getFieldName ( ) ) , fs ) ;
break ; }
default : { throw new WebApplicationException ( " Unexpected clash policy " + request . getClashOption ( ) , Response . Status . BAD_REQUEST ) ; }
}
2022-01-27 15:02:53 +01:00
2022-01-17 18:19:40 +01:00
log . debug ( " Setting result on profiled document " ) ;
2022-02-15 19:02:44 +01:00
doc . setTheDocument ( Document . parse ( docWrapper . getValueCTX ( ) . jsonString ( ) ) ) ;
2022-01-17 18:19:40 +01:00
doc = onUpdate ( doc ) ;
2022-01-27 15:02:53 +01:00
return convert ( replace ( asDocumentWithId ( doc ) , new ObjectId ( id ) , getCollectionName ( ) ) , ProfiledDocument . class ) ;
2021-12-01 11:13:34 +01:00
}
2021-12-15 19:10:19 +01:00
2022-01-18 12:01:33 +01:00
@Override
2022-02-16 14:54:48 +01:00
public ProfiledDocument deleteFileSet ( String id , String path , Boolean force ) throws ConfigurationException , StorageHubException , JsonProcessingException , DeletionException , EventException {
log . info ( " Deleting Fileset for {} [profile ID {}], at {} [force {} ] " , id , profile . getId ( ) , path , force ) ;
2022-02-01 15:24:39 +01:00
ProfiledDocument doc = getByID ( id ) ;
2022-02-16 14:54:48 +01:00
JSONPathWrapper wrapper = new JSONPathWrapper ( doc . getTheDocument ( ) . toJson ( ) ) ;
List < String > matchingPaths = wrapper . getMatchingPaths ( path ) ;
if ( matchingPaths . isEmpty ( ) ) throw new WebApplicationException ( " No Registered FileSet found at " + path , Response . Status . BAD_REQUEST ) ;
if ( matchingPaths . size ( ) > 1 ) throw new WebApplicationException ( " Multiple Fileset ( " + matchingPaths . size ( ) + " ) matching " + path , Response . Status . BAD_REQUEST ) ;
RegisteredFileSet fs = Serialization . convert ( wrapper . getByPath ( path ) , RegisteredFileSet . class ) ;
log . debug ( " Going to delete {} " , fs ) ;
deleteFileSetRoutine ( fs , force , new WorkspaceManager ( ) ) ;
log . debug ( " Removing FS from document [ID : ] by path {} " , id , path ) ;
wrapper . setElement ( path , null ) ;
2022-02-01 15:24:39 +01:00
doc = onUpdate ( doc ) ;
return convert ( replace ( asDocumentWithId ( doc ) , new ObjectId ( id ) , getCollectionName ( ) ) , ProfiledDocument . class ) ;
2022-01-18 12:01:33 +01:00
}
2022-01-17 18:19:40 +01:00
2022-02-04 17:45:47 +01:00
@Override
public Configuration getConfiguration ( ) throws ConfigurationException {
log . debug ( " Asking configuration for {} in {} " , profile . getId ( ) , UserUtils . getCurrent ( ) . getContext ( ) ) ;
2022-02-14 17:06:32 +01:00
Configuration toReturn = getManager ( ) . getCurrentConfiguration ( ) ;
2022-02-04 17:45:47 +01:00
log . debug ( " Returning current configuration {} " , toReturn ) ;
return toReturn ;
}
2022-01-17 18:19:40 +01:00
2022-02-14 12:23:13 +01:00
private StepExecutionReport step ( ProfiledDocument theDocument , String step , Document callParameters ) throws StepException {
2022-02-16 17:12:54 +01:00
log . info ( " [Profile {}] Invoking Step {} on {} " , profile . getId ( ) , step , getManager ( ) . getDescriptor ( ) ) ;
2021-12-15 19:10:19 +01:00
StepExecutionRequest request = new StepExecutionRequest ( ) ;
2022-01-17 18:19:40 +01:00
request . setCallParameters ( callParameters ) ;
2021-12-15 19:10:19 +01:00
request . setDocument ( theDocument ) ;
request . setProfile ( profile ) ;
2022-01-17 18:19:40 +01:00
request . setStep ( step ) ;
2022-02-14 17:06:32 +01:00
AccountingInfo user = UserUtils . getCurrent ( ) . asInfo ( ) ;
request . setUser ( user . getUser ( ) ) ;
request . setContext ( user . getContext ( ) ) ;
2022-02-16 17:12:54 +01:00
log . debug ( " Requesting Step Execution {} " , request ) ;
2022-02-14 17:06:32 +01:00
StepExecutionReport report = getManager ( ) . performStep ( request ) ;
log . debug ( " Report is {} " , report ) ;
if ( report . getResult ( ) = = null ) throw new StepException ( " Report result is null " ) ;
2022-01-17 13:30:21 +01:00
return report ;
2021-12-15 19:10:19 +01:00
}
2022-01-17 18:19:40 +01:00
2022-02-14 17:06:32 +01:00
private EventExecutionReport triggerEvent ( ProfiledDocument theDocument , String event , Document parameters ) throws EventException {
2022-02-16 17:12:54 +01:00
log . info ( " [Profile {}] triggering event {} on {} " , profile . getId ( ) , event , getManager ( ) . getDescriptor ( ) ) ;
2022-02-14 17:06:32 +01:00
EventExecutionRequest request = new EventExecutionRequest ( ) ;
request . setEvent ( event ) ;
request . setProfile ( profile ) ;
request . setCallParameters ( parameters ) ;
request . setDocument ( theDocument ) ;
2022-02-16 17:12:54 +01:00
log . debug ( " Triggering {} " , request ) ;
2022-02-14 17:06:32 +01:00
return getManager ( ) . onEvent ( request ) ;
}
2022-01-17 18:19:40 +01:00
2022-02-16 14:54:48 +01:00
private static final RegisteredFileSet prepareRegisteredFileSet ( PublicationInfo defaultPublicationInfo , String docID , String profileID ,
2022-01-17 18:19:40 +01:00
Document attributes , List < TempFile > files , StorageUtils storage , WorkspaceManager ws ) throws StorageHubException , StorageException {
log . debug ( " Preparing Registered FileSet.. " ) ;
2022-02-01 15:24:39 +01:00
RegisteredFileSet toReturn = new RegisteredFileSet ( ) ;
if ( attributes ! = null ) toReturn . putAll ( attributes ) ;
2022-02-16 14:54:48 +01:00
String uuid = UUID . randomUUID ( ) . toString ( ) ;
toReturn . putIfAbsent ( RegisteredFileSet . UUID , uuid ) ;
toReturn . putIfAbsent ( RegisteredFileSet . CREATION_INFO , UserUtils . getCurrent ( ) . asInfo ( ) ) ;
toReturn . putIfAbsent ( RegisteredFileSet . ACCESS , defaultPublicationInfo . getAccess ( ) ) ;
// FOLDER
String folderID = toReturn . getFolderId ( ) ;
log . trace ( " Folder ID is {} " , folderID ) ;
FolderContainer sectionFolder = null ;
if ( folderID = = null | | folderID . isEmpty ( ) ) {
FolderContainer base = ws . createFolder ( new WorkspaceManager . FolderOptions (
docID , " Base Folder for profiled document. Profile " + profileID , null ) ) ;
sectionFolder = ws . createFolder ( new WorkspaceManager . FolderOptions (
docID + " _ " + uuid , " Registered Fileset uuid " + uuid , base ) ) ;
toReturn . put ( RegisteredFileSet . FOLDER_ID , sectionFolder . getId ( ) ) ;
} else {
sectionFolder = ws . getFolderById ( folderID ) ;
}
2022-01-17 18:19:40 +01:00
ArrayList < RegisteredFile > registeredFiles = new ArrayList < > ( ) ;
2022-02-16 14:54:48 +01:00
if ( toReturn . containsKey ( RegisteredFileSet . PAYLOADS ) )
registeredFiles . addAll ( toReturn . getPayloads ( ) ) ;
2022-01-17 18:19:40 +01:00
for ( TempFile f : files ) {
InputStream is = null ;
try {
log . debug ( " Opening temp file {} " , f ) ;
String fileUrl = storage . getURL ( f . getId ( ) ) ;
log . debug ( " Got URL {} from ID {} " , fileUrl , f . getId ( ) ) ;
is = new URL ( fileUrl ) . openStream ( ) ;
RegisteredFile registered = ws . registerFile ( new WorkspaceManager . FileOptions ( f . getFilename ( ) , is ,
" Imported via gcube CMS service " , sectionFolder ) ) ;
log . debug ( " Registered " + registered ) ;
registeredFiles . add ( registered ) ;
} catch ( StorageHubException | IOException e ) {
throw new StorageException ( " Unable to store " + f , e ) ;
} finally {
if ( is ! = null )
IOUtils . closeQuietly ( is ) ;
}
}
2022-02-01 15:24:39 +01:00
toReturn . put ( RegisteredFileSet . PAYLOADS , registeredFiles ) ;
2022-02-16 14:54:48 +01:00
// TODO MERGE
//toReturn.remove(RegisteredFileSet.MATERIALIZATIONS);
2022-02-01 15:24:39 +01:00
return toReturn ;
2022-01-17 18:19:40 +01:00
}
2022-01-31 13:09:54 +01:00
2022-02-16 14:54:48 +01:00
private static void deleteFileSetRoutine ( RegisteredFileSet fs , Boolean force , WorkspaceManager ws ) throws DeletionException , StorageHubException {
log . debug ( " Deleting Registered FS {} " ) ;
if ( fs . getMaterializations ( ) ! = null & & ! fs . getMaterializations ( ) . isEmpty ( ) ) {
if ( ! force ) throw new DeletionException ( " Fileset (uuid " + fs . getUUID ( ) + " ) already materialized. Use force = true " ) ;
2022-01-31 13:09:54 +01:00
else throw new RuntimeException ( " Implement this " ) ;
// TODO manager force deletion
// NB handlers for materialization types
}
2022-02-16 14:54:48 +01:00
log . trace ( " FileSet ID {} : deleting ws folder {} " , fs . getUUID ( ) , fs . getFolderId ( ) ) ;
if ( fs . getPayloads ( ) ! = null )
ws . deleteItem ( fs . getFolderId ( ) ) ;
}
private static Field getFieldDefinition ( Profile profile , String fieldPath ) throws WebApplicationException {
JSONPathWrapper schemaWrapper = new JSONPathWrapper ( profile . getSchema ( ) . toJson ( ) ) ;
List < Field > fieldDefinitions = schemaWrapper . getByPath ( fieldPath , Field . class ) ;
if ( fieldDefinitions = = null | | fieldDefinitions . isEmpty ( ) )
throw new WebApplicationException ( " No Field found in schema " + profile . getId ( ) + " at " + fieldPath , Response . Status . BAD_REQUEST ) ;
if ( fieldDefinitions . size ( ) > 1 )
throw new WebApplicationException ( " Multiple field definitions ( " + fieldDefinitions . size ( ) + " ) found in " + profile . getId ( ) + " for " + fieldPath , Response . Status . BAD_REQUEST ) ;
Field fieldDefinition = Serialization . convert ( fieldDefinitions . get ( 0 ) , Field . class ) ;
if ( fieldDefinition = = null )
throw new WebApplicationException ( " Found field is null [ " + profile . getId ( ) + " for " + fieldPath + " ] " , Response . Status . BAD_REQUEST ) ;
log . trace ( " Field definition is {} " , fieldDefinition ) ;
return fieldDefinition ;
2022-01-31 13:09:54 +01:00
}
2021-09-20 16:47:35 +02:00
}