2018-06-20 16:59:41 +02:00
package org.gcube.data.access.storagehub.handlers ;
import java.util.HashMap ;
2021-03-31 14:49:47 +02:00
import java.util.List ;
2018-06-20 16:59:41 +02:00
import java.util.Map ;
import java.util.concurrent.ExecutorService ;
import java.util.concurrent.Executors ;
import javax.inject.Inject ;
import javax.inject.Singleton ;
2021-03-31 14:49:47 +02:00
import javax.jcr.Node ;
import javax.jcr.NodeIterator ;
import javax.jcr.RepositoryException ;
import javax.jcr.Session ;
2018-06-20 16:59:41 +02:00
import javax.jcr.SimpleCredentials ;
2021-03-31 14:49:47 +02:00
import javax.jcr.query.Query ;
2018-06-20 16:59:41 +02:00
import javax.servlet.ServletContext ;
2021-03-31 14:49:47 +02:00
import org.gcube.common.scope.api.ScopeProvider ;
import org.gcube.common.scope.impl.ScopeBean ;
import org.gcube.common.scope.impl.ScopeBean.Type ;
import org.gcube.common.storagehub.model.Paths ;
import org.gcube.common.storagehub.model.exceptions.BackendGenericError ;
2018-06-20 16:59:41 +02:00
import org.gcube.common.storagehub.model.items.Item ;
import org.gcube.data.access.storagehub.Constants ;
2021-03-31 14:49:47 +02:00
import org.gcube.data.access.storagehub.PathUtil ;
import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter ;
2018-06-20 16:59:41 +02:00
import org.gcube.data.access.storagehub.services.RepositoryInitializer ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
@Singleton
public class VREManager {
private static final Logger logger = LoggerFactory . getLogger ( VREManager . class ) ;
private Map < String , VRE > vreMap = new HashMap < > ( ) ;
@Inject
RepositoryInitializer repository ;
2021-03-31 14:49:47 +02:00
@Inject
Node2ItemConverter node2Item ;
@Inject
PathUtil pathUtil ;
2018-06-20 16:59:41 +02:00
ExecutorService executor = Executors . newFixedThreadPool ( 5 ) ;
SimpleCredentials credentials ;
@Inject
public VREManager ( ServletContext context ) {
credentials = new SimpleCredentials ( context . getInitParameter ( Constants . ADMIN_PARAM_NAME ) , context . getInitParameter ( Constants . ADMIN_PARAM_PWD ) . toCharArray ( ) ) ;
}
public synchronized VRE getVRE ( String completeName ) {
logger . trace ( " requesting VRE {} " , completeName ) ;
if ( vreMap . containsKey ( completeName ) )
return vreMap . get ( completeName ) ;
else
return null ;
}
public synchronized VRE putVRE ( Item vreFolder ) {
logger . trace ( " inserting VRE {} " , vreFolder . getTitle ( ) ) ;
if ( vreMap . containsKey ( vreFolder . getTitle ( ) ) ) throw new RuntimeException ( " something went wrong (vre already present in the map) " ) ;
else {
VRE toReturn = new VRE ( vreFolder , repository . getRepository ( ) , credentials , executor ) ;
vreMap . put ( vreFolder . getTitle ( ) , toReturn ) ;
return toReturn ;
}
}
2021-03-31 14:49:47 +02:00
public synchronized VRE getVreFolderItem ( Session ses , String userId , List < String > excludes ) throws RepositoryException , BackendGenericError {
org . gcube . common . storagehub . model . Path vrePath = Paths . append ( pathUtil . getWorkspacePath ( userId ) , Constants . OLD_VRE_FOLDER_PARENT_NAME ) ;
ScopeBean bean = new ScopeBean ( ScopeProvider . instance . get ( ) ) ;
if ( ! bean . is ( Type . VRE ) ) throw new BackendGenericError ( " the current scope is not a VRE " ) ;
String entireScopeName = bean . toString ( ) . replaceAll ( " ^/(.*)/?$ " , " $1 " ) . replaceAll ( " / " , " - " ) ;
VRE vre = this . getVRE ( entireScopeName ) ;
if ( vre ! = null ) return vre ;
else {
String query = String . format ( " SELECT * FROM [nthl:workspaceItem] As node WHERE node.[jcr:title] like '%s' AND ISDESCENDANTNODE('%s') " , entireScopeName , vrePath . toPath ( ) ) ;
Query jcrQuery = ses . getWorkspace ( ) . getQueryManager ( ) . createQuery ( query , Constants . QUERY_LANGUAGE ) ;
NodeIterator it = jcrQuery . execute ( ) . getNodes ( ) ;
if ( ! it . hasNext ( ) ) throw new BackendGenericError ( " vre folder not found for context " + entireScopeName ) ;
Node folder = it . nextNode ( ) ;
Item vreFolder = node2Item . getItem ( folder , excludes ) ;
return this . putVRE ( vreFolder ) ;
}
}
public synchronized VRE getVreFolderItemByGroupNameAndUser ( Session ses , String goupName , String userId , List < String > excludes ) throws RepositoryException , BackendGenericError {
org . gcube . common . storagehub . model . Path vrePath = Paths . append ( pathUtil . getWorkspacePath ( userId ) , Constants . OLD_VRE_FOLDER_PARENT_NAME ) ;
VRE vre = this . getVRE ( goupName ) ;
if ( vre ! = null ) return vre ;
else {
String query = String . format ( " SELECT * FROM [nthl:workspaceItem] As node WHERE node.[jcr:title] like '%s' AND ISDESCENDANTNODE('%s') " , goupName , vrePath . toPath ( ) ) ;
Query jcrQuery = ses . getWorkspace ( ) . getQueryManager ( ) . createQuery ( query , Constants . QUERY_LANGUAGE ) ;
NodeIterator it = jcrQuery . execute ( ) . getNodes ( ) ;
if ( ! it . hasNext ( ) ) throw new BackendGenericError ( " vre folder not found for context " + goupName ) ;
Node folder = it . nextNode ( ) ;
Item vreFolder = node2Item . getItem ( folder , excludes ) ;
return this . putVRE ( vreFolder ) ;
}
}
2018-06-20 16:59:41 +02:00
}