120 lines
4.4 KiB
Java
120 lines
4.4 KiB
Java
package org.gcube.data.access.storagehub.handlers;
|
|
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.concurrent.ExecutorService;
|
|
import java.util.concurrent.Executors;
|
|
|
|
import javax.inject.Inject;
|
|
import javax.inject.Singleton;
|
|
import javax.jcr.Node;
|
|
import javax.jcr.NodeIterator;
|
|
import javax.jcr.RepositoryException;
|
|
import javax.jcr.Session;
|
|
import javax.jcr.SimpleCredentials;
|
|
import javax.jcr.query.Query;
|
|
import javax.servlet.ServletContext;
|
|
|
|
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;
|
|
import org.gcube.common.storagehub.model.items.Item;
|
|
import org.gcube.data.access.storagehub.Constants;
|
|
import org.gcube.data.access.storagehub.PathUtil;
|
|
import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter;
|
|
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;
|
|
|
|
@Inject
|
|
Node2ItemConverter node2Item;
|
|
|
|
@Inject
|
|
PathUtil pathUtil;
|
|
|
|
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;
|
|
}
|
|
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
|
|
}
|