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 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 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