diff --git a/pom.xml b/pom.xml
index 9564e79..68a2162 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,7 +12,7 @@
4.0.0
org.gcube.data.access
storagehub
- 1.3.2
+ 1.4.0-SNAPSHOT
storagehub
@@ -300,13 +300,13 @@
org.gcube.contentmanagement
storage-manager-core
- [2.0.0,3.0.0-SNAPSHOT)
+ [3.0.0-SNAPSHOT,4.0.0-SNAPSHOT)
org.gcube.contentmanagement
storage-manager-wrapper
- [2.0.0,3.0.0-SNAPSHOT)
+ [3.0.0-SNAPSHOT,4.0.0-SNAPSHOT)
diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/GroupHandler.java b/src/main/java/org/gcube/data/access/storagehub/handlers/GroupHandler.java
index 7b15df5..824f93d 100644
--- a/src/main/java/org/gcube/data/access/storagehub/handlers/GroupHandler.java
+++ b/src/main/java/org/gcube/data/access/storagehub/handlers/GroupHandler.java
@@ -2,6 +2,7 @@ package org.gcube.data.access.storagehub.handlers;
import javax.inject.Inject;
import javax.inject.Singleton;
+import javax.jcr.ItemNotFoundException;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.PathNotFoundException;
@@ -11,7 +12,6 @@ import org.apache.jackrabbit.api.JackrabbitSession;
import org.apache.jackrabbit.api.security.user.Group;
import org.apache.jackrabbit.api.security.user.User;
import org.gcube.common.storagehub.model.exceptions.InvalidCallParameters;
-import org.gcube.common.storagehub.model.exceptions.InvalidItemException;
import org.gcube.common.storagehub.model.exceptions.StorageHubException;
import org.gcube.common.storagehub.model.types.NodeProperty;
import org.gcube.data.access.storagehub.Constants;
@@ -24,10 +24,10 @@ import org.slf4j.LoggerFactory;
public class GroupHandler {
private static final Logger log = LoggerFactory.getLogger(GroupManager.class);
-
+
@Inject
PathUtil pathUtil;
-
+
public boolean removeUserFromGroup(String groupId, String userId, JackrabbitSession session) throws StorageHubException, RepositoryException {
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
@@ -39,7 +39,7 @@ public class GroupHandler {
//delete folder on user
String folderName = group.getPrincipal().getName();
- Node folder = getVreFolderNode(session, folderName);
+ Node folder = getFolderNodeRelatedToGroup(session, folderName);
NodeIterator ni = folder.getSharedSet();
while (ni.hasNext()) {
@@ -53,8 +53,8 @@ public class GroupHandler {
return group.removeMember(user);
}
-
- public Node getVreFolderNode(JackrabbitSession session, String name) throws InvalidItemException, RepositoryException {
+
+ public Node getFolderNodeRelatedToGroup(JackrabbitSession session, String name) throws ItemNotFoundException, RepositoryException {
Node sharedRootNode = session.getNode(Constants.SHARED_FOLDER_PATH);
Node vreFolder = null;
@@ -64,16 +64,18 @@ public class GroupHandler {
log.debug("is an old HL VRE");
}
- NodeIterator nodes = sharedRootNode.getNodes();
- while (nodes.hasNext()) {
- Node node = nodes.nextNode();
- if (node.hasProperty(NodeProperty.TITLE.toString()) && node.getProperty(NodeProperty.TITLE.toString()).getString().equals(name)) {
- vreFolder= node;
- break;
+ if (vreFolder==null) {
+ NodeIterator nodes = sharedRootNode.getNodes();
+ while (nodes.hasNext()) {
+ Node node = nodes.nextNode();
+ if (node.hasProperty(NodeProperty.TITLE.toString()) && node.getProperty(NodeProperty.TITLE.toString()).getString().equals(name)) {
+ vreFolder= node;
+ break;
+ }
}
}
- if (vreFolder==null) throw new InvalidItemException("vre folder not found");
+ if (vreFolder==null) throw new ItemNotFoundException("vre folder not found for group "+name);
return vreFolder;
}
diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/items/ItemHandler.java b/src/main/java/org/gcube/data/access/storagehub/handlers/items/ItemHandler.java
index 07474fd..9b1c82d 100644
--- a/src/main/java/org/gcube/data/access/storagehub/handlers/items/ItemHandler.java
+++ b/src/main/java/org/gcube/data/access/storagehub/handlers/items/ItemHandler.java
@@ -11,12 +11,14 @@ import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
+
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.lock.LockException;
+
import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ArchiveInputStream;
import org.apache.commons.compress.archivers.ArchiveStreamFactory;
@@ -40,7 +42,6 @@ import org.gcube.common.storagehub.model.plugins.FolderManager;
import org.gcube.common.storagehub.model.storages.MetaInfo;
import org.gcube.common.storagehub.model.storages.StorageBackend;
import org.gcube.common.storagehub.model.types.ItemAction;
-import org.gcube.common.storagehub.model.types.NodeProperty;
import org.gcube.data.access.storagehub.AuthorizationChecker;
import org.gcube.data.access.storagehub.MultipleOutputStream;
import org.gcube.data.access.storagehub.Utils;
@@ -267,7 +268,7 @@ public class ItemHandler {
authChecker.checkWriteAuthorizationControl(ses, login, newNode.getIdentifier(), false);
AbstractFileItem item = fillItemWithContent(stream, storageBackend, name, description, relativePath,login);
- item.setHidden(destinationNode.getProperty(NodeProperty.HIDDEN.toString()).getBoolean());
+
if (withLock) {
try {
ses.getWorkspace().getLockManager().lock(newNode.getPath(), true, true, 0,login);
diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/items/Node2ItemConverter.java b/src/main/java/org/gcube/data/access/storagehub/handlers/items/Node2ItemConverter.java
index 65491df..141743d 100644
--- a/src/main/java/org/gcube/data/access/storagehub/handlers/items/Node2ItemConverter.java
+++ b/src/main/java/org/gcube/data/access/storagehub/handlers/items/Node2ItemConverter.java
@@ -85,6 +85,9 @@ public class Node2ItemConverter {
}
public Message getMessageItem(Node node) throws RepositoryException{
+ if (!(node.getPrimaryNodeType().getName().equals("nthl:itemSentRequest")
+ || node.getPrimaryNodeType().getName().equals("nthl:itemSentRequestSH")))
+ return null;
Message msg = new Message();
try {
Node attachmentNode = node.getNode(Constants.ATTACHMENTNODE_NAME);
diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/vres/VRE.java b/src/main/java/org/gcube/data/access/storagehub/handlers/vres/VRE.java
index 802d33b..c3abb35 100644
--- a/src/main/java/org/gcube/data/access/storagehub/handlers/vres/VRE.java
+++ b/src/main/java/org/gcube/data/access/storagehub/handlers/vres/VRE.java
@@ -9,6 +9,7 @@ import javax.jcr.SimpleCredentials;
import org.gcube.common.storagehub.model.exceptions.BackendGenericError;
import org.gcube.common.storagehub.model.items.Item;
+import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -21,11 +22,11 @@ public class VRE {
private VREQueryRetriever vreQueryRetriever;
private ExecutorService executor;
- protected VRE(Item item, Repository repository, SimpleCredentials credentials, ExecutorService executor) {
+ protected VRE(Item item, Repository repository, SimpleCredentials credentials, Node2ItemConverter node2Item, ExecutorService executor) {
super();
this.vreFolder = item;
this.executor = executor;
- vreQueryRetriever = new VREQueryRetriever(repository, credentials, vreFolder);
+ vreQueryRetriever = new VREQueryRetriever(repository, credentials, node2Item, vreFolder);
result = executor.submit(vreQueryRetriever);
}
diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/vres/VREManager.java b/src/main/java/org/gcube/data/access/storagehub/handlers/vres/VREManager.java
index 432db4e..cc1cab2 100644
--- a/src/main/java/org/gcube/data/access/storagehub/handlers/vres/VREManager.java
+++ b/src/main/java/org/gcube/data/access/storagehub/handlers/vres/VREManager.java
@@ -9,11 +9,8 @@ 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.apache.jackrabbit.api.JackrabbitSession;
@@ -29,6 +26,7 @@ import org.gcube.common.storagehub.model.exceptions.StorageHubException;
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.GroupHandler;
import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter;
import org.gcube.data.access.storagehub.services.RepositoryInitializer;
import org.slf4j.Logger;
@@ -50,6 +48,9 @@ public class VREManager {
@Inject
PathUtil pathUtil;
+ @Inject
+ GroupHandler groupHandler;
+
ExecutorService executor = Executors.newFixedThreadPool(5);
SimpleCredentials credentials;
@@ -73,7 +74,7 @@ public class VREManager {
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);
+ VRE toReturn = new VRE(vreFolder, repository.getRepository(), credentials, node2Item, executor);
vreMap.put(vreFolder.getTitle(), toReturn);
return toReturn;
}
@@ -97,18 +98,13 @@ public class VREManager {
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);
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')",groupName, vrePath.toPath());
- Query jcrQuery = ses.getWorkspace().getQueryManager().createQuery(query, Constants.QUERY_LANGUAGE);
- NodeIterator it = jcrQuery.execute().getNodes();
+
+ Node vreFolderNode = groupHandler.getFolderNodeRelatedToGroup(ses, groupName);
- if (!it.hasNext()) throw new BackendGenericError("vre folder not found for context "+groupName);
-
- Node folder = it.nextNode();
- Item vreFolder = node2Item.getItem(folder, excludes);
+ Item vreFolder = node2Item.getItem(vreFolderNode, excludes);
return this.putVRE(vreFolder);
}
}
diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/vres/VREQueryRetriever.java b/src/main/java/org/gcube/data/access/storagehub/handlers/vres/VREQueryRetriever.java
index 1a77bf8..a95910a 100644
--- a/src/main/java/org/gcube/data/access/storagehub/handlers/vres/VREQueryRetriever.java
+++ b/src/main/java/org/gcube/data/access/storagehub/handlers/vres/VREQueryRetriever.java
@@ -1,29 +1,30 @@
package org.gcube.data.access.storagehub.handlers.vres;
-import java.text.SimpleDateFormat;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Calendar;
-import java.util.Iterator;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
import java.util.List;
-import java.util.Locale;
+import java.util.Map;
import java.util.concurrent.Callable;
+import java.util.stream.Collectors;
import javax.jcr.Credentials;
import javax.jcr.Node;
+import javax.jcr.NodeIterator;
import javax.jcr.Property;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.observation.Event;
import javax.jcr.observation.EventJournal;
-import javax.jcr.query.Query;
-import org.apache.jackrabbit.util.ISO9075;
import org.gcube.common.storagehub.model.Excludes;
-import org.gcube.common.storagehub.model.NodeConstants;
+import org.gcube.common.storagehub.model.exceptions.BackendGenericError;
+import org.gcube.common.storagehub.model.items.AbstractFileItem;
+import org.gcube.common.storagehub.model.items.FolderItem;
import org.gcube.common.storagehub.model.items.Item;
-import org.gcube.data.access.storagehub.NodeChildrenFilterIterator;
import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -37,92 +38,154 @@ public class VREQueryRetriever implements Callable> {
private Repository repository;
private Credentials credentials;
private Item vreFolder;
- List- cachedList = new ArrayList<>(CACHE_DIMENSION);
+ Map cachedMap = new HashMap<>(CACHE_DIMENSION);
+ long higherTimestamp = Long.MAX_VALUE;
+
long lastTimestamp =0;
- private Node2ItemConverter node2Item = new Node2ItemConverter();
+ long doTime= 0;
+ boolean underRedo = false;
+ Node2ItemConverter node2Item;
- public VREQueryRetriever(Repository repository, Credentials credentials, Item vreFolder) {
+
+ public VREQueryRetriever(Repository repository, Credentials credentials, Node2ItemConverter node2Item, Item vreFolder) {
super();
this.repository = repository;
this.credentials = credentials;
this.vreFolder = vreFolder;
+ this.node2Item = node2Item;
}
public List
- call() {
- logger.trace("executing recents task");
Session ses = null;
- if (lastTimestamp==0) {
- try {
- long start = System.currentTimeMillis();
- ses = repository.login(credentials);
-
- Calendar now = Calendar.getInstance();
- now.add(Calendar.YEAR, -1);
- SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH);
- String formattedDate = formatter.format(now.getTime());
-
-
- String xpath = String.format("/jcr:root%s//element(*,nthl:workspaceLeafItem)[@jcr:lastModified>xs:dateTime('%s')] order by @jcr:lastModified descending",ISO9075.encodePath(vreFolder.getPath()),formattedDate);
-
- //String query = String.format("SELECT * FROM [nthl:workspaceLeafItem] AS node WHERE ISDESCENDANTNODE('%s') ORDER BY node.[jcr:lastModified] DESC ",vreFolder.getPath());
- logger.debug("query for recents is {}",xpath);
-
- Query jcrQuery = ses.getWorkspace().getQueryManager().createQuery(xpath, Query.XPATH);
-
- jcrQuery.setLimit(CACHE_DIMENSION);
- lastTimestamp = System.currentTimeMillis();
- NodeChildrenFilterIterator it = new NodeChildrenFilterIterator(jcrQuery.execute().getNodes());
- logger.debug("query for recents took {}",System.currentTimeMillis()-start);
- while (it.hasNext()) {
- Node node = it.next();
-
- Item item = node2Item.getItem(node, Excludes.EXCLUDE_ACCOUNTING);
- logger.debug("RECENTS - adding item {} with timestamp {}",item.getTitle(), item.getLastModificationTime().getTimeInMillis());
- cachedList.add(item);
-
- }
- logger.debug("creating objects took {}",System.currentTimeMillis()-start);
- if (cachedList.size()<=10) return cachedList;
- else return cachedList.subList(0, 10);
- } catch (Exception e) {
- logger.error("error querying vre {}",vreFolder.getTitle(),e);
- throw new RuntimeException(e);
- }finally{
- if (ses!=null)
- ses.logout();
- logger.trace("recents task finished");
+ try {
+ ses = repository.login(credentials);
+ Calendar now = Calendar.getInstance();
+ now.add(Calendar.HOUR_OF_DAY, -1);
+
+ if (doTime> now.getTimeInMillis() || underRedo) {
+ logger.debug("executing recents task for {} (cahced result)",vreFolder.getTitle());
+ return correctValues(ses, cachedMap);
+ }else {
+ logger.debug("executing recents task for {} (redoing it)",vreFolder.getTitle());
+ List
- toReturn = redo(ses);
+ doTime = System.currentTimeMillis();
+ return toReturn;
}
- } else {
+ }catch (Exception e) {
+ logger.error("error preparing recents for folder {}", vreFolder.getTitle(),e);
+ return Collections.emptyList();
+ }finally{
+ if (ses!=null)
+ ses.logout();
+ logger.debug("recents task finished");
+ }
+ }
+
+ public synchronized List
- redo(Session ses) {
+ underRedo = true;
+ try {
+ Map tempCachedMap = new HashMap<>(CACHE_DIMENSION);
+ if (cachedMap.isEmpty())
+ init(ses, tempCachedMap);
+ else {
+ logger.debug("redoing recents for {}",vreFolder.getTitle());
+ update(ses, tempCachedMap);
+ }
+ cachedMap = tempCachedMap;
+ return correctValues(ses, tempCachedMap);
+ }finally{
+ underRedo = false;
+ }
+ }
+
+
+ private List
- correctValues(Session ses, Map tempCachedMap){
+ logger.debug("preparing returning values for {}",vreFolder.getTitle());
+ long start = System.currentTimeMillis();
+ List> list = new LinkedList<>(tempCachedMap.entrySet());
+ list.sort((c1, c2) -> c1.getValue().compareTo(c2.getValue())*-1);
+ if (list.size()>CACHE_DIMENSION)
+ for (int index = CACHE_DIMENSION-1; index< list.size() ; index++)
+ tempCachedMap.remove(list.get(index).getKey());
+
+ List cachedIds = list.stream().map(m -> m.getKey()).collect(Collectors.toList());
+ if (cachedIds.size()>10)
+ cachedIds = cachedIds.subList(0, 10);
+
+ List
- result = new ArrayList<>(10);
+
+ for (String id: cachedIds) {
try {
+ Item item = node2Item.getItem(id, ses, Excludes.EXCLUDE_ACCOUNTING);
+ if (item!=null)
+ result.add(item);
+ else logger.warn("item with id {} is null",id);
+ } catch (BackendGenericError | RepositoryException e) { }
+ }
- long timestampToUse = lastTimestamp;
- lastTimestamp = System.currentTimeMillis();
+ logger.debug("returning values prepared in {} for {}",System.currentTimeMillis()-start,vreFolder.getTitle());
- long start = System.currentTimeMillis();
- ses = repository.login(credentials);
- final String[] types = { "nthl:workspaceLeafItem", "nthl:workspaceItem"};
+ return result;
+ }
- EventJournal journalChanged = ses.getWorkspace().getObservationManager().getEventJournal(Event.PROPERTY_CHANGED^Event.NODE_REMOVED^Event.NODE_MOVED^Event.NODE_ADDED, vreFolder.getPath(), true, null, types);
- journalChanged.skipTo(timestampToUse);
+ private void insertItemInTheRightPlace(Item item, Map tempCachedMap) {
+ long lastModifiedTime = item.getLastModificationTime().getTime().getTime();
- logger.trace("getting the journal took {}",System.currentTimeMillis()-start);
+ if (!(lastModifiedTime>higherTimestamp && tempCachedMap.size()>CACHE_DIMENSION)) {
+ tempCachedMap.put(item.getId(), lastModifiedTime);
+ if (lastModifiedTime>higherTimestamp) higherTimestamp = lastModifiedTime;
+ }
- int events = 0;
+ }
- while (journalChanged.hasNext()) {
- events++;
- Event event = journalChanged.nextEvent();
+ private void init(Session ses,Map tempCachedMap){
+ try {
+ long start = System.currentTimeMillis();
+ lastTimestamp = System.currentTimeMillis();
+ Node vreFolderNode = ses.getNodeByIdentifier(vreFolder.getId());
+ logger.debug("starting visiting children for {}",vreFolder.getTitle());
+ visitChildren(vreFolderNode, tempCachedMap);
+ logger.debug("initializing recents for {} took {}",vreFolder.getTitle(),System.currentTimeMillis()-start);
+ } catch (Exception e) {
+ logger.error("error querying vre {}",vreFolder.getTitle(),e);
+ throw new RuntimeException(e);
+ }
+ }
+
+
+ private void update(Session ses, Map tempCachedMap) {
+ try {
+ long timestampToUse = lastTimestamp;
+ lastTimestamp = System.currentTimeMillis();
+
+ long start = System.currentTimeMillis();
+ final String[] types = { "nthl:workspaceLeafItem", "nthl:workspaceItem"};
+
+ EventJournal journalChanged = ses.getWorkspace().getObservationManager().getEventJournal(Event.PROPERTY_CHANGED^Event.NODE_REMOVED^Event.NODE_MOVED^Event.NODE_ADDED, vreFolder.getPath(), true, null, types);
+ journalChanged.skipTo(timestampToUse);
+
+ logger.debug("getting the journal took {}",System.currentTimeMillis()-start);
+
+ int events = 0;
+
+ //TODO: manage hidden nodes
+ while (journalChanged.hasNext()) {
+ events++;
+ Event event = journalChanged.nextEvent();
+ try {
switch(event.getType()) {
case Event.NODE_ADDED:
if (ses.nodeExists(event.getPath())) {
Node nodeAdded = ses.getNode(event.getPath());
if (nodeAdded.isNodeType("nthl:workspaceLeafItem")) {
- logger.trace("node added event received with name {}", nodeAdded.getName());
- Item item = node2Item.getItem(nodeAdded, Arrays.asList(NodeConstants.ACCOUNTING_NAME));
- insertItemInTheRightPlace(item);
+ logger.debug("node added event received with name {}", nodeAdded.getName());
+ Item item = node2Item.getItem(nodeAdded, Excludes.ALL);
+ if (tempCachedMap.get(event.getIdentifier())!=null)
+ tempCachedMap.remove(event.getIdentifier());
+ insertItemInTheRightPlace(item,tempCachedMap);
}
}
break;
@@ -131,66 +194,64 @@ public class VREQueryRetriever implements Callable
> {
if (ses.propertyExists(event.getPath())) {
Property property = ses.getProperty(event.getPath());
if (property.getName().equalsIgnoreCase("jcr:lastModified")) {
- logger.trace("event property changed on {} with value {} and parent {}",property.getName(), property.getValue().getString(), property.getParent().getPath());
+ logger.debug("event property changed on {} with value {} and parent {}",property.getName(), property.getValue().getString(), property.getParent().getPath());
String identifier = property.getParent().getIdentifier();
- cachedList.removeIf(i -> i.getId().equals(identifier));
- Item item = node2Item.getItem(property.getParent(), Excludes.EXCLUDE_ACCOUNTING);
- insertItemInTheRightPlace(item);
+ tempCachedMap.remove(identifier);
+ Item item = node2Item.getItem(property.getParent(), Excludes.ALL);
+ insertItemInTheRightPlace(item, tempCachedMap);
}
}
break;
case Event.NODE_REMOVED:
logger.trace("node removed event received with type {}", event.getIdentifier());
- cachedList.removeIf(i -> {
- try {
- return i.getId().equals(event.getIdentifier()) && i.getLastModificationTime().getTime().getTime() i.getId().equals(identifier) && !i.getPath().startsWith(vreFolder.getPath()));
+ String nodePath = ses.getNode(identifier).getPath();
+ if (tempCachedMap.get(event.getIdentifier())!=null &&
+ !nodePath.startsWith(vreFolder.getPath()))
+ tempCachedMap.remove(event.getIdentifier());
+
}
break;
default:
- throw new Exception("error in event handling");
+ break;
}
+ }catch (Exception e) {
+ logger.warn("error handling event {}",event.getType(),e);
}
- if (cachedList.size()>CACHE_DIMENSION)
- cachedList.subList(51, cachedList.size()).clear();
- logger.trace("retrieving event took {} with {} events",System.currentTimeMillis()-start, events);
- if (cachedList.size()<=10) return cachedList;
- else return cachedList.subList(0, 10);
- } catch (Exception e) {
- logger.error("error getting events for vre {}",vreFolder.getTitle(),e);
- throw new RuntimeException(e);
- }finally{
- if (ses!=null)
- ses.logout();
}
+
+ logger.trace("retrieving event took {} with {} events",System.currentTimeMillis()-start, events);
+
+ } catch (Exception e) {
+ logger.error("error getting events for vre {}",vreFolder.getTitle(),e);
+ throw new RuntimeException(e);
}
}
- private void insertItemInTheRightPlace(Item item) {
- Iterator- it = cachedList.iterator();
- int index =0;
- while (it.hasNext()) {
- Item inListItem = it.next();
- if (item.getLastModificationTime().getTime().getTime()>=inListItem.getLastModificationTime().getTime().getTime()) break;
- index++;
+ private void visitChildren(Node node, Map tempCachedMap) throws Exception{
+ NodeIterator nodeIt = node.getNodes();
+ while(nodeIt.hasNext()) {
+ Node child = nodeIt.nextNode();
+ Item item = node2Item.getItem(child, Excludes.ALL);
+ if (item==null || item.isHidden()) continue;
+ if (item instanceof FolderItem)
+ visitChildren(child,tempCachedMap);
+ else if(item instanceof AbstractFileItem)
+ insertItemInTheRightPlace(item,tempCachedMap);
}
- if (index workspaceItems = Utils.getItemList(node, Excludes.GET_ONLY_CONTENT, null, true, null);
trashHandler.removeOnlyNodesContent(session, workspaceItems);
node.removeSharedSet();
@@ -242,7 +240,7 @@ public class GroupManager {
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
- Node vreFolder = groupHandler.getVreFolderNode(session, groupId);
+ Node vreFolder = groupHandler.getFolderNodeRelatedToGroup(session, groupId);
String currentUser = AuthorizationProvider.instance.get().getClient().getId();
if (!isInfraManager() && !(isVREManager() && isValidGroupForContext(groupId) ))
@@ -296,7 +294,7 @@ public class GroupManager {
Objects.nonNull(userId);
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
- Node vreFolder = groupHandler.getVreFolderNode(session, groupId);
+ Node vreFolder = groupHandler.getFolderNodeRelatedToGroup(session, groupId);
String currentUser = AuthorizationProvider.instance.get().getClient().getId();
if (!isInfraManager() && !(isVREManager() && isValidGroupForContext(groupId) ))
@@ -422,7 +420,7 @@ public class GroupManager {
boolean success = group.addMember(user);
session.save();
String folderName = group.getPrincipal().getName();
- Node folder = groupHandler.getVreFolderNode(session, folderName);
+ Node folder = groupHandler.getFolderNodeRelatedToGroup(session, folderName);
String userPath = Paths.append(pathUtil.getVREsPath(user.getPrincipal().getName(), session), folderName).toPath();
log.debug("creating folder in user path {} from {}", userPath, folder.getPath() );
diff --git a/src/main/java/org/gcube/data/access/storagehub/services/ItemSharing.java b/src/main/java/org/gcube/data/access/storagehub/services/ItemSharing.java
index 7dadea4..8050dae 100644
--- a/src/main/java/org/gcube/data/access/storagehub/services/ItemSharing.java
+++ b/src/main/java/org/gcube/data/access/storagehub/services/ItemSharing.java
@@ -35,7 +35,6 @@ import org.gcube.common.storagehub.model.exceptions.InvalidCallParameters;
import org.gcube.common.storagehub.model.exceptions.InvalidItemException;
import org.gcube.common.storagehub.model.exceptions.ItemLockedException;
import org.gcube.common.storagehub.model.exceptions.StorageHubException;
-import org.gcube.common.storagehub.model.items.ExternalFolder;
import org.gcube.common.storagehub.model.items.FolderItem;
import org.gcube.common.storagehub.model.items.Item;
import org.gcube.common.storagehub.model.items.SharedFolder;
diff --git a/src/main/java/org/gcube/data/access/storagehub/services/MessageManager.java b/src/main/java/org/gcube/data/access/storagehub/services/MessageManager.java
index b101740..d407da5 100644
--- a/src/main/java/org/gcube/data/access/storagehub/services/MessageManager.java
+++ b/src/main/java/org/gcube/data/access/storagehub/services/MessageManager.java
@@ -345,7 +345,13 @@ public class MessageManager extends Impersonable{
NodeIterator nodeIt = node.getNodes();
while(nodeIt.hasNext()) {
Node child = nodeIt.nextNode();
+ log.info("message type "+child.getPrimaryNodeType().getName());
Message message = node2Item.getMessageItem(child);
+ if (message == null) {
+ log.info("message discarded");
+ continue;
+ }
+
if (reduceBody != null && reduceBody>0 && message.getBody().length()>reduceBody )
message.setBody(message.getBody().substring(0, reduceBody));
insertOrdered(messages, message);
diff --git a/src/main/java/org/gcube/data/access/storagehub/services/WorkspaceManager.java b/src/main/java/org/gcube/data/access/storagehub/services/WorkspaceManager.java
index 65b65cf..f5cf456 100644
--- a/src/main/java/org/gcube/data/access/storagehub/services/WorkspaceManager.java
+++ b/src/main/java/org/gcube/data/access/storagehub/services/WorkspaceManager.java
@@ -352,59 +352,6 @@ public class WorkspaceManager extends Impersonable{
}
-/*
- @Path("query")
- @GET
- @Produces(MediaType.APPLICATION_JSON)
- public ItemList searchItems(@QueryParam("n") String node, @QueryParam("e") String jsonExpr, @QueryParam("o") List orderField, @QueryParam("l") Integer limit, @QueryParam("f") Integer offset){
- InnerMethodName.instance.set("searchItems");
- Session ses = null;
- List extends Item> toReturn = new ArrayList<>();
-
- try{
-
- ObjectMapper mapper = new ObjectMapper();
- Expression expression = mapper.readValue(jsonExpr, Expression.class);
- String stringExpression = evaluator.evaluate(new And(new ISDescendant(pathUtil.getWorkspacePath(currentUser)), expression));
-
- String orderBy = "";
- if (orderField!=null && orderField.size()>0)
- orderBy= String.format("ORDER BY %s", orderField.stream().collect(Collectors.joining(",")).toString());
-
- String sql2Query = String.format("SELECT * FROM [%s] AS node WHERE %s %s ",node, stringExpression,orderBy);
-
- log.info("query sent is {}",sql2Query);
-
- ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
- Query jcrQuery = ses.getWorkspace().getQueryManager().createQuery(sql2Query, Constants.QUERY_LANGUAGE);
-
- if (limit!=null && limit!=-1 )
- jcrQuery.setLimit(limit);
-
- if (offset!=null && offset!=-1 )
- jcrQuery.setOffset(offset);
-
- QueryResult result = jcrQuery.execute();
-
- NodeIterator it = result.getNodes();
-
- while (it.hasNext())
- toReturn.add(node2Item.getItem(it.nextNode(), null));
- }catch(RepositoryException | IOException re ){
- log.error("error executing the query", re);
- GXOutboundErrorResponse.throwException(new BackendGenericError(re));
- }catch(StorageHubException she ){
- log.error(she.getErrorMessage(), she);
- GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
- }finally{
- if (ses!=null)
- ses.logout();
- }
-
- return new ItemList(toReturn);
- }
- */
-
@Path("count")
@GET
diff --git a/src/main/java/org/gcube/data/access/storagehub/services/admin/ScriptManager.java b/src/main/java/org/gcube/data/access/storagehub/services/admin/ScriptManager.java
index a164b93..1d1fd00 100644
--- a/src/main/java/org/gcube/data/access/storagehub/services/admin/ScriptManager.java
+++ b/src/main/java/org/gcube/data/access/storagehub/services/admin/ScriptManager.java
@@ -74,7 +74,7 @@ public class ScriptManager {
@FormDataParam("file") FormDataContentDisposition fileDetail) {
try {
ScriptClassLoader scriptClassLoader = new ScriptClassLoader(Thread.currentThread().getContextClassLoader());
- Class> scriptClass = uploadClass(stream, scriptClassLoader, name);
+ Class> scriptClass = uploadClass(stream, scriptClassLoader, fileDetail.getFileName().replace(".class", ""));
return run(scriptClass, name, destinationFolderId, asynch!=null? asynch : false);
}catch(Throwable e) {
log.error("error executing script {}", name,e);
@@ -168,7 +168,7 @@ public class ScriptManager {
.stream(stream).on(parentId).with(ses).author(login);
itemHandler.create(builder.build());
} catch (Throwable e) {
- log.error("error saving script result {} in the Workspace",name);
+ log.error("error saving script result {} in the Workspace",name, e);
}
} finally {
diff --git a/src/main/java/org/gcube/data/access/storagehub/services/admin/ScriptUtilImpl.java b/src/main/java/org/gcube/data/access/storagehub/services/admin/ScriptUtilImpl.java
index a44a479..e68b3c6 100644
--- a/src/main/java/org/gcube/data/access/storagehub/services/admin/ScriptUtilImpl.java
+++ b/src/main/java/org/gcube/data/access/storagehub/services/admin/ScriptUtilImpl.java
@@ -10,7 +10,6 @@ import javax.jcr.RepositoryException;
import org.gcube.common.storagehub.model.exceptions.BackendGenericError;
import org.gcube.common.storagehub.model.items.Item;
-import org.gcube.data.access.storagehub.Range;
import org.gcube.data.access.storagehub.Utils;
import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter;
import org.gcube.data.access.storagehub.scripting.ScriptUtil;
@@ -22,7 +21,7 @@ public class ScriptUtilImpl implements ScriptUtil {
@Override
public List
- getChildren(Predicate checker, Node parent, List excludes, boolean showHidden, Class extends Item> nodeTypeToInclude) throws RepositoryException, BackendGenericError {
- return Utils.getItemList(checker, parent, excludes, new Range(0, 100), showHidden, nodeTypeToInclude);
+ return Utils.getItemList(checker, parent, excludes, null, showHidden, nodeTypeToInclude);
}
@Override