From 188d11ff709f0a744bbcedf49e030925b633aee6 Mon Sep 17 00:00:00 2001 From: lucio Date: Wed, 22 Jan 2020 12:32:49 +0100 Subject: [PATCH] Application Listener add to correctly shutdown the jackrabbit repository --- .settings/org.eclipse.wst.common.component | 2 +- .../data/access/storagehub/StorageHub.java | 1 + .../gcube/data/access/storagehub/Utils.java | 40 +++++++---- .../handlers/Item2NodeConverter.java | 6 +- .../handlers/Node2ItemConverter.java | 4 +- .../handlers/VREQueryRetriever.java | 67 ++++++++++++++----- .../storagehub/services/GroupManager.java | 60 ++++++++++------- .../storagehub/services/ItemsManager.java | 28 ++++++++ .../storagehub/services/UserManager.java | 31 +++++++-- 9 files changed, 174 insertions(+), 65 deletions(-) diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index 1314f66..666f8ff 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -7,7 +7,7 @@ uses - + uses diff --git a/src/main/java/org/gcube/data/access/storagehub/StorageHub.java b/src/main/java/org/gcube/data/access/storagehub/StorageHub.java index da500a3..53ba0be 100644 --- a/src/main/java/org/gcube/data/access/storagehub/StorageHub.java +++ b/src/main/java/org/gcube/data/access/storagehub/StorageHub.java @@ -32,6 +32,7 @@ public class StorageHub extends Application { classes.add(UserManager.class); classes.add(GroupManager.class); classes.add(SerializableErrorEntityTextWriter.class); + classes.add(MyApplicationListener.class); return classes; } diff --git a/src/main/java/org/gcube/data/access/storagehub/Utils.java b/src/main/java/org/gcube/data/access/storagehub/Utils.java index b4d3b28..ed7448a 100644 --- a/src/main/java/org/gcube/data/access/storagehub/Utils.java +++ b/src/main/java/org/gcube/data/access/storagehub/Utils.java @@ -26,6 +26,7 @@ import javax.jcr.query.Query; import javax.jcr.version.Version; import org.apache.commons.io.FilenameUtils; +import org.apache.jackrabbit.util.ISO9075; import org.apache.jackrabbit.util.Text; import org.gcube.common.authorization.library.provider.AuthorizationProvider; import org.gcube.common.scope.api.ScopeProvider; @@ -109,15 +110,30 @@ public class Utils { } + public static List serachByNameOnFolder(Session ses, Node parent, List excludes, Range range, boolean showHidden, Class nodeTypeToInclude, String nameParam) throws RepositoryException, BackendGenericError{ + String xpath = String.format("/jcr:root%s//element(*,nthl:workspaceItem)[jcr:like(@jcr:title, '%s')]",ISO9075.encodePath(parent.getPath()), nameParam); + + //String query = String.format("SELECT * FROM [nthl:workspaceLeafItem] AS node WHERE ISDESCENDANTNODE('%s') ORDER BY node.[jcr:lastModified] DESC ",vreFolder.getPath()); + logger.trace("query for search is {}",xpath); + + Query jcrQuery = ses.getWorkspace().getQueryManager().createQuery(xpath, Query.XPATH); + + NodeIterator it = jcrQuery.execute().getNodes(); + return getItemListFromNodeIterator(it, excludes, range, showHidden, nodeTypeToInclude); + } + public static List getItemList(Node parent, List excludes, Range range, boolean showHidden, Class nodeTypeToInclude) throws RepositoryException, BackendGenericError{ - - logger.debug("getting children of node {}", parent.getIdentifier()); - - List returnList = new ArrayList(); + logger.trace("getting children of node {}", parent.getIdentifier()); long start = System.currentTimeMillis(); NodeIterator iterator = parent.getNodes(); logger.trace("time to get iterator {}",(System.currentTimeMillis()-start)); + return getItemListFromNodeIterator(iterator, excludes, range, showHidden, nodeTypeToInclude); + } + + private static List getItemListFromNodeIterator(NodeIterator iterator, List excludes, Range range, boolean showHidden, Class nodeTypeToInclude) throws RepositoryException, BackendGenericError{ + List returnList = new ArrayList(); + logger.trace("nodeType is {}",nodeTypeToInclude); int count =0; logger.trace("selected range is {}", range); @@ -125,12 +141,12 @@ public class Utils { while (iterator.hasNext()){ Node current = iterator.nextNode(); - logger.debug("current node "+current.getName()); + logger.trace("current node "+current.getName()); if (isToExclude(current, showHidden)) continue; - logger.debug("current node not excluded "+current.getName()); + logger.trace("current node not excluded "+current.getName()); if (range==null || (count>=range.getStart() && returnList.size() tempQueue = new LinkedList(); - logger.debug("adding directory {}",currentNode.getPath()); + logger.trace("adding directory {}",currentNode.getPath()); for (Item item : Utils.getItemList(currentNode,Excludes.GET_ONLY_CONTENT, null, false, null)){ if (excludes.contains(item.getId())) continue; if (item instanceof FolderItem) tempQueue.addAll(getAllNodesForZip((FolderItem) item, session, accountingHandler, excludes)); else if (item instanceof AbstractFileItem){ - logger.debug("adding file {}",item.getPath()); + logger.trace("adding file {}",item.getPath()); AbstractFileItem fileItem = (AbstractFileItem) item; accountingHandler.createReadObj(fileItem.getTitle(), session, session.getNodeByIdentifier(item.getId()), false); queue.addLast(item); @@ -190,9 +206,9 @@ public class Utils { Item item = queue.pop(); if (item instanceof FolderItem) { actualPath = Paths.getPath(item.getPath()); - logger.debug("actualPath is {}",actualPath.toPath()); + logger.trace("actualPath is {}",actualPath.toPath()); String name = Paths.remove(actualPath, originalPath).toPath().replaceFirst("/", ""); - logger.debug("writing dir {}",name); + logger.trace("writing dir {}",name); if (name.isEmpty()) continue; try { zos.putNextEntry(new ZipEntry(name)); @@ -208,7 +224,7 @@ public class Utils { } try(BufferedInputStream is = new BufferedInputStream(streamToWrite)){ String name = (Paths.remove(actualPath, originalPath).toPath()+item.getName()).replaceFirst("/", ""); - logger.debug("writing file {}",name); + logger.trace("writing file {}",name); zos.putNextEntry(new ZipEntry(name)); copyStream(is, zos); }catch (Exception e) { @@ -285,7 +301,7 @@ public class Utils { String nameTocheck = ext.isEmpty()? String.format("%s(*)",filename): String.format("%s(*).%s",filename, ext); - logger.debug("filename is {}, extension is {} , and name to check is {}", filename, ext, nameTocheck); + logger.trace("filename is {}, extension is {} , and name to check is {}", filename, ext, nameTocheck); NodeIterator ni = destination.getNodes(nameTocheck); int maxval = 0; diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/Item2NodeConverter.java b/src/main/java/org/gcube/data/access/storagehub/handlers/Item2NodeConverter.java index 1b72bd0..68e4e09 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/Item2NodeConverter.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/Item2NodeConverter.java @@ -56,7 +56,7 @@ public class Item2NodeConverter { field.setAccessible(true); try{ //Class returnType = field.getType(); - logger.debug("creating node - added field {}",field.getName()); + logger.trace("creating node - added field {}",field.getName()); Values values = getObjectValue(field.getType(), field.get(item)); if (values.isMulti()) newNode.setProperty(attribute.value(), values.getValues()); else newNode.setProperty(attribute.value(), values.getValue()); @@ -67,7 +67,7 @@ public class Item2NodeConverter { NodeAttribute nodeAttribute = field.getAnnotation(NodeAttribute.class); if (nodeAttribute.isReadOnly()) continue; String nodeName = nodeAttribute.value(); - logger.debug("retrieving field node "+field.getName()); + logger.trace("retrieving field node "+field.getName()); field.setAccessible(true); try{ Object obj = field.get(item); @@ -129,7 +129,7 @@ public class Item2NodeConverter { } } else if (field.isAnnotationPresent(ListNodes.class)){ - logger.debug("found field {} of type annotated as ListNodes in class {} on node {}", field.getName(), object.getClass().getName(), newNode.getName()); + logger.trace("found field {} of type annotated as ListNodes in class {} on node {}", field.getName(), object.getClass().getName(), newNode.getName()); field.setAccessible(true); List toSetList = (List) field.get(object); diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/Node2ItemConverter.java b/src/main/java/org/gcube/data/access/storagehub/handlers/Node2ItemConverter.java index f139d93..bddef6b 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/Node2ItemConverter.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/Node2ItemConverter.java @@ -127,7 +127,7 @@ public class Node2ItemConverter { try{ Class returnType = field.getType(); field.set(item, getPropertyValue(returnType, node.getProperty(attribute.value()))); - logger.debug("retrieve item - added field {}",field.getName()); + logger.trace("retrieve item - added field {}",field.getName()); }catch(PathNotFoundException e){ logger.trace("the current node dosn't contain {} property",attribute.value()); } catch (Exception e ) { @@ -320,7 +320,7 @@ public class Node2ItemConverter { public boolean checkNodeType(Node node, Class classToCompare) throws BackendGenericError{ try { - logger.info("class from nodetype is {} and class to compare is {}",ClassHandler.instance().get(node.getPrimaryNodeType().getName()), classToCompare); + logger.trace("class from nodetype is {} and class to compare is {}",ClassHandler.instance().get(node.getPrimaryNodeType().getName()), classToCompare); return classToCompare.isAssignableFrom(ClassHandler.instance().get(node.getPrimaryNodeType().getName())); diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/VREQueryRetriever.java b/src/main/java/org/gcube/data/access/storagehub/handlers/VREQueryRetriever.java index 955f486..fa4b726 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/VREQueryRetriever.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/VREQueryRetriever.java @@ -1,9 +1,13 @@ package org.gcube.data.access.storagehub.handlers; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; +import java.util.Calendar; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.concurrent.Callable; import javax.jcr.Credentials; @@ -17,10 +21,11 @@ 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.items.Item; -import org.gcube.data.access.storagehub.Constants; +import org.gcube.common.storagehub.model.types.NodeProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,7 +34,7 @@ public class VREQueryRetriever implements Callable> { private static final Logger logger = LoggerFactory.getLogger(VREQueryRetriever.class); private static final int CACHE_DIMENSION = 50; - + private Repository repository; private Credentials credentials; private Item vreFolder; @@ -37,7 +42,7 @@ public class VREQueryRetriever implements Callable> { long lastTimestamp =0; private Node2ItemConverter node2Item = new Node2ItemConverter(); - + public VREQueryRetriever(Repository repository, Credentials credentials, Item vreFolder) { super(); @@ -53,20 +58,50 @@ public class VREQueryRetriever implements Callable> { try { long start = System.currentTimeMillis(); ses = repository.login(credentials); - String query = String.format("SELECT * FROM [nthl:workspaceLeafItem] AS node WHERE ISDESCENDANTNODE('%s') ORDER BY node.[jcr:lastModified] DESC ",vreFolder.getPath()); - logger.trace("query for recents is {}",query); - Query jcrQuery = ses.getWorkspace().getQueryManager().createQuery(query, Constants.QUERY_LANGUAGE); + + 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(); NodeIterator it = jcrQuery.execute().getNodes(); - logger.trace("query for recents took {}",System.currentTimeMillis()-start); + logger.debug("query for recents took {}",System.currentTimeMillis()-start); while (it.hasNext()) { Node node = it.nextNode(); - Item item =node2Item.getItem(node, Excludes.EXCLUDE_ACCOUNTING); + + //long lastModifiedTimeItem = node.getProperty(NodeProperty.LAST_MODIFIED.toString()).getLong(); + + //logger.debug("RECENTS - node {} has timestamp {} ", node.getProperty(NodeProperty.TITLE.toString()).getString(), lastModifiedTimeItem); + /* + if(cachedList.size()<=CACHE_DIMENSION || lastModifiedTimeItem>cachedList.get(CACHE_DIMENSION-1).getLastModificationTime().getTimeInMillis()) { + logger.debug("cachedList contains {}",cachedList.size()); + if(cachedList.size()>=CACHE_DIMENSION) cachedList.remove(CACHE_DIMENSION-1); + Item item =node2Item.getItem(node, Excludes.EXCLUDE_ACCOUNTING); + int insertposition =0; + for(Item cachedItem: cachedList) { + if (cachedItem.getLastModificationTime().before(item.getLastModificationTime())) + break; + insertposition++; + } + cachedList.add(insertposition, item); + logger.debug("RECENTS - adding item {} with node {} in position {}",item.getTitle(), node.getName(), insertposition); + }*/ + Item item = node2Item.getItem(node, Excludes.EXCLUDE_ACCOUNTING); + logger.debug("RECENTS - adding item {} with timestamp {}",item.getTitle(), item.getLastModificationTime().getTimeInMillis()); cachedList.add(item); - logger.trace("adding item {} with node {}",item.getTitle(), node.getName()); + } - logger.trace("creating objects took {}",System.currentTimeMillis()-start); + logger.debug("creating objects took {}",System.currentTimeMillis()-start); if (cachedList.size()<=10) return cachedList; else return cachedList.subList(0, 10); } catch (Exception e) { @@ -79,7 +114,7 @@ public class VREQueryRetriever implements Callable> { } } else { try { - + long timestampToUse = lastTimestamp; lastTimestamp = System.currentTimeMillis(); @@ -89,16 +124,16 @@ public class VREQueryRetriever implements Callable> { 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.trace("getting the journal took {}",System.currentTimeMillis()-start); - + int events = 0; - + while (journalChanged.hasNext()) { events++; Event event = journalChanged.nextEvent(); switch(event.getType()) { - + case Event.NODE_ADDED: if (ses.nodeExists(event.getPath())) { Node nodeAdded = ses.getNode(event.getPath()); @@ -109,7 +144,7 @@ public class VREQueryRetriever implements Callable> { } } break; - + case Event.PROPERTY_CHANGED: if (ses.propertyExists(event.getPath())) { Property property = ses.getProperty(event.getPath()); diff --git a/src/main/java/org/gcube/data/access/storagehub/services/GroupManager.java b/src/main/java/org/gcube/data/access/storagehub/services/GroupManager.java index c73995a..25e4279 100644 --- a/src/main/java/org/gcube/data/access/storagehub/services/GroupManager.java +++ b/src/main/java/org/gcube/data/access/storagehub/services/GroupManager.java @@ -108,9 +108,9 @@ public class GroupManager { log.info("group {} found",group.getPrincipal().getName()); groups.add(group.getPrincipal().getName()); } - }catch(Exception e) { - log.error("jcr error getting groups", e); - GXOutboundErrorResponse.throwException(new BackendGenericError(e)); + }catch(RepositoryException re ){ + log.error("jcr error creating item", re); + GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re)); } finally { if (session!=null) session.logout(); @@ -174,9 +174,9 @@ public class GroupManager { if (authorizable.isGroup()) authorizable.remove(); session.save(); - }catch(Exception e) { - log.error("jcr error getting users", e); - GXOutboundErrorResponse.throwException(new BackendGenericError(e)); + }catch(RepositoryException re ){ + log.error("jcr error creating item", re); + GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re)); } finally { if (session!=null) session.logout(); @@ -270,9 +270,9 @@ public class GroupManager { log.error(she.getErrorMessage(), she); GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus())); }catch(RepositoryException re ){ - log.error("removing admin to VREFolder", re); - GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error removing admin to VREFolder", re)); - } finally { + log.error("jcr error creating item", re); + GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re)); + }finally { if (session!=null) session.logout(); } @@ -307,10 +307,13 @@ public class GroupManager { } - }catch(Exception e) { - log.error("jcr error getting admins of group {}", groupId, e); - GXOutboundErrorResponse.throwException(new BackendGenericError(e)); - } finally { + }catch(StorageHubException she ){ + log.error(she.getErrorMessage(), she); + GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus())); + }catch(RepositoryException re ){ + log.error("jcr error creating item", re); + GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re)); + }finally { if (session!=null) session.logout(); } @@ -354,10 +357,13 @@ public class GroupManager { session.getWorkspace().clone(session.getWorkspace().getName(), folder.getPath(),userPath , false); session.save(); - }catch(Exception e) { - log.error("jcr error adding user {} to group {}", userId, groupId, e); - GXOutboundErrorResponse.throwException(new BackendGenericError(e)); - } finally { + }catch(StorageHubException she ){ + log.error(she.getErrorMessage(), she); + GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus())); + }catch(RepositoryException re ){ + log.error("jcr error creating item", re); + GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re)); + }finally { if (session!=null) session.logout(); } @@ -405,9 +411,12 @@ public class GroupManager { success = group.removeMember(user); session.save(); - }catch(Exception e) { - log.error("jcr error adding user {} to group {}", userId, groupId, e); - GXOutboundErrorResponse.throwException(new BackendGenericError(e)); + }catch(StorageHubException she ){ + log.error(she.getErrorMessage(), she); + GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus())); + }catch(RepositoryException re ){ + log.error("jcr error creating item", re); + GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re)); } finally { if (session!=null) session.logout(); @@ -445,10 +454,13 @@ public class GroupManager { } - }catch(Exception e) { - log.error("jcr error getting users of group {}", groupId, e); - GXOutboundErrorResponse.throwException(new BackendGenericError(e)); - } finally { + }catch(StorageHubException she ){ + log.error(she.getErrorMessage(), she); + GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus())); + }catch(RepositoryException re ){ + log.error("jcr error creating item", re); + GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re)); + }finally { if (session!=null) session.logout(); } diff --git a/src/main/java/org/gcube/data/access/storagehub/services/ItemsManager.java b/src/main/java/org/gcube/data/access/storagehub/services/ItemsManager.java index 7444d7b..9d8470b 100644 --- a/src/main/java/org/gcube/data/access/storagehub/services/ItemsManager.java +++ b/src/main/java/org/gcube/data/access/storagehub/services/ItemsManager.java @@ -250,6 +250,34 @@ public class ItemsManager { return new ItemList(toReturn); } + @GET + @Path("{id}/search") + @Produces(MediaType.APPLICATION_JSON) + public ItemList searchItems(@QueryParam("showHidden") Boolean showHidden, @QueryParam("exclude") List excludes, @QueryParam("onlyType") String nodeType,@QueryParam("name") String name ){ + InnerMethodName.instance.set("listById"); + Session ses = null; + List toReturn = null; + try{ + ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context)); + authChecker.checkReadAuthorizationControl(ses, id); + toReturn = Utils.serachByNameOnFolder(ses, ses.getNodeByIdentifier(id), excludes, null, showHidden==null?false:showHidden, nodeType!=null ? ClassHandler.instance().get(nodeType) : null, name); + }catch (ItemNotFoundException e) { + log.error("id {} not found",id,e); + GXOutboundErrorResponse.throwException(new IdNotFoundException(id, e), Status.NOT_FOUND); + }catch(RepositoryException re){ + log.error("jcr error getting children", 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); + } + @GET @Path("{id}/children/paged") @Produces(MediaType.APPLICATION_JSON) diff --git a/src/main/java/org/gcube/data/access/storagehub/services/UserManager.java b/src/main/java/org/gcube/data/access/storagehub/services/UserManager.java index 3756b22..c250505 100644 --- a/src/main/java/org/gcube/data/access/storagehub/services/UserManager.java +++ b/src/main/java/org/gcube/data/access/storagehub/services/UserManager.java @@ -8,6 +8,8 @@ import java.util.List; import javax.inject.Inject; import javax.jcr.Node; import javax.jcr.NodeIterator; +import javax.jcr.PathNotFoundException; +import javax.jcr.RepositoryException; import javax.jcr.query.QueryResult; import javax.servlet.ServletContext; import javax.ws.rs.Consumes; @@ -20,6 +22,7 @@ import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; import org.apache.jackrabbit.api.JackrabbitSession; import org.apache.jackrabbit.api.security.user.Authorizable; @@ -31,6 +34,7 @@ import org.gcube.common.authorization.control.annotations.AuthorizationControl; import org.gcube.common.authorization.library.provider.AuthorizationProvider; import org.gcube.common.gxrest.response.outbound.GXOutboundErrorResponse; import org.gcube.common.storagehub.model.exceptions.BackendGenericError; +import org.gcube.common.storagehub.model.exceptions.StorageHubException; import org.gcube.common.storagehub.model.exceptions.UserNotAuthorizedException; import org.gcube.common.storagehub.model.types.NodeProperty; import org.gcube.data.access.storagehub.Constants; @@ -122,9 +126,12 @@ public class UserManager { Utils.createFolderInternally(session, workspaceFolder, Constants.VRE_FOLDER_PARENT_NAME, "special folder container of "+user, false, user, null); session.save(); - }catch(Exception e) { - log.error("jcr error creating user {}", user, e); - GXOutboundErrorResponse.throwException(new BackendGenericError(e)); + }catch(StorageHubException she ){ + log.error(she.getErrorMessage(), she); + GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus())); + }catch(RepositoryException re ){ + log.error("jcr error creating item", re); + GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re)); } finally { if (session!=null) session.logout(); @@ -169,14 +176,24 @@ public class UserManager { } Authorizable authorizable = usrManager.getAuthorizable(new PrincipalImpl(user)); - if (!authorizable.isGroup()) { + if (authorizable!=null && !authorizable.isGroup()) { log.info("removing user {}", user); authorizable.remove(); + } else log.warn("the user {} was already deleted", user); + + org.gcube.common.storagehub.model.Path homePath = Utils.getHome(user); + try { + session.getNode(homePath.toPath()).remove(); + } catch (PathNotFoundException e) { + log.warn("{} home dir was already deleted", user); } session.save(); - }catch(Exception e) { - log.error("jcr error getting users", e); - GXOutboundErrorResponse.throwException(new BackendGenericError(e)); + }catch(StorageHubException she ){ + log.error(she.getErrorMessage(), she); + GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus())); + }catch(RepositoryException re ){ + log.error("jcr error creating item", re); + GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re)); } finally { if (session!=null) session.logout();