2021-04-07 12:38:18 +02:00
package org.gcube.data.access.storagehub.handlers.vres ;
2018-06-20 16:59:41 +02:00
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-04-07 12:38:18 +02:00
import org.apache.jackrabbit.api.JackrabbitSession ;
import org.apache.jackrabbit.api.security.user.Group ;
import org.apache.jackrabbit.api.security.user.User ;
import org.apache.jackrabbit.api.security.user.UserManager ;
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.exceptions.BackendGenericError ;
2021-04-07 12:38:18 +02:00
import org.gcube.common.storagehub.model.exceptions.InvalidCallParameters ;
import org.gcube.common.storagehub.model.exceptions.StorageHubException ;
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 ;
}
2021-04-07 12:38:18 +02:00
private synchronized VRE putVRE ( Item vreFolder ) {
2018-06-20 16:59:41 +02:00
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-04-07 12:38:18 +02:00
public synchronized VRE getVreFolderItem ( JackrabbitSession ses , String userId , List < String > excludes ) throws RepositoryException , StorageHubException {
2021-03-31 14:49:47 +02:00
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 ( " / " , " - " ) ;
2021-04-07 12:38:18 +02:00
return getVreFolderItemByGroupName ( ses , entireScopeName , userId , excludes ) ;
2021-03-31 14:49:47 +02:00
}
2021-04-07 12:38:18 +02:00
public synchronized VRE getVreFolderItemByGroupName ( JackrabbitSession ses , String groupName , String userId , List < String > excludes ) throws RepositoryException , StorageHubException {
UserManager um = ses . getUserManager ( ) ;
Group groupAuth = um . getAuthorizable ( groupName , Group . class ) ;
User userAuth = um . getAuthorizable ( userId , User . class ) ;
if ( groupAuth = = null | | userAuth = = null | | ! groupAuth . isMember ( userAuth ) )
throw new InvalidCallParameters ( " error getting VRE with user " + userId + " for group " + groupName ) ;
org . gcube . common . storagehub . model . Path vrePath = pathUtil . getVREsPath ( userId , ses ) ;
VRE vre = this . getVRE ( groupName ) ;
2021-03-31 14:49:47 +02:00
if ( vre ! = null ) return vre ;
else {
2021-04-07 12:38:18 +02:00
String query = String . format ( " SELECT * FROM [nthl:workspaceItem] As node WHERE node.[jcr:title] like '%s' AND ISDESCENDANTNODE('%s') " , groupName , vrePath . toPath ( ) ) ;
2021-03-31 14:49:47 +02:00
Query jcrQuery = ses . getWorkspace ( ) . getQueryManager ( ) . createQuery ( query , Constants . QUERY_LANGUAGE ) ;
NodeIterator it = jcrQuery . execute ( ) . getNodes ( ) ;
2021-04-07 12:38:18 +02:00
if ( ! it . hasNext ( ) ) throw new BackendGenericError ( " vre folder not found for context " + groupName ) ;
2021-03-31 14:49:47 +02:00
Node folder = it . nextNode ( ) ;
Item vreFolder = node2Item . getItem ( folder , excludes ) ;
return this . putVRE ( vreFolder ) ;
}
}
2018-06-20 16:59:41 +02:00
}