From 4c13f4098ef7fcc47d268733512ff03912e9b20f Mon Sep 17 00:00:00 2001 From: lucio Date: Wed, 8 Apr 2020 21:11:43 +0200 Subject: [PATCH] moved classes in differen packages --- .classpath | 1 - .settings/org.eclipse.jdt.core.prefs | 2 + pom.xml | 18 +- .../storagehub/AuthorizationChecker.java | 30 +- .../storagehub/MultipleOutputStream.java | 1 + .../gcube/data/access/storagehub/Utils.java | 9 +- .../storagehub/handlers/TrashHandler.java | 45 +- .../storagehub/handlers/UnshareHandler.java | 2 + .../handlers/VREQueryRetriever.java | 3 +- .../content/ContentHandlerFactory.java | 1 + .../handlers/content/OfficeAppHandler.java | 1 - .../{ => items}/Item2NodeConverter.java | 3 +- .../{ => items}/Node2ItemConverter.java | 4 +- .../ArchiveStructureCreationParameter.java | 75 ++++ .../items/builders/CreateParameters.java | 38 ++ .../builders/FileCreationParameters.java | 82 ++++ .../builders/FolderCreationParameters.java | 69 +++ .../builders/GCubeItemCreationParameters.java | 49 +++ .../items/builders/ItemsParameterBuilder.java | 39 ++ .../items/builders/URLCreationParameters.java | 69 +++ .../storagehub/services/ACLManager.java | 2 +- .../storagehub/services/GroupManager.java | 6 +- .../storagehub/services/ItemSharing.java | 4 +- .../storagehub/services/ItemsCreator.java | 415 ++---------------- .../storagehub/services/ItemsManager.java | 6 +- .../storagehub/services/WorkspaceManager.java | 14 +- src/main/webapp/WEB-INF/README | 2 +- src/main/webapp/WEB-INF/gcube-app.xml | 2 +- .../org/gcube/data/access/fs/Expressions.java | 1 - .../org/gcube/data/access/fs/TestFields.java | 27 +- .../org/gcube/data/access/fs/TestNode.java | 14 - 31 files changed, 597 insertions(+), 437 deletions(-) rename src/main/java/org/gcube/data/access/storagehub/handlers/{ => items}/Item2NodeConverter.java (98%) rename src/main/java/org/gcube/data/access/storagehub/handlers/{ => items}/Node2ItemConverter.java (99%) create mode 100644 src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/ArchiveStructureCreationParameter.java create mode 100644 src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/CreateParameters.java create mode 100644 src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/FileCreationParameters.java create mode 100644 src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/FolderCreationParameters.java create mode 100644 src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/GCubeItemCreationParameters.java create mode 100644 src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/ItemsParameterBuilder.java create mode 100644 src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/URLCreationParameters.java diff --git a/.classpath b/.classpath index 11def0e..ceec4b7 100644 --- a/.classpath +++ b/.classpath @@ -27,7 +27,6 @@ - diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 91ca62e..8b5c4dc 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -8,7 +8,9 @@ org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=1.8 diff --git a/pom.xml b/pom.xml index 3a8e826..4e406be 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ 4.0.0 org.gcube.data.access storagehub - 1.1.0 + 1.1.1-SNAPSHOT storagehub @@ -26,7 +26,7 @@ ${project.basedir}/src/main/webapp/WEB-INF - 2.16.0 + 2.19.3 7.0.40 6.1.26 1.21 @@ -70,12 +70,12 @@ org.gcube.core common-smartgears - + org.gcube.core common-smartgears-app - + org.gcube.common authorization-control-library @@ -316,10 +316,16 @@ ch.qos.logback logback-classic - 1.0.13 + 1.2.3 test + + com.vlkan.rfos + rotating-fos + 0.9.2 + + junit junit @@ -454,7 +460,7 @@ ${distroDirectory} - true + true diff --git a/src/main/java/org/gcube/data/access/storagehub/AuthorizationChecker.java b/src/main/java/org/gcube/data/access/storagehub/AuthorizationChecker.java index 392ccfd..927e942 100644 --- a/src/main/java/org/gcube/data/access/storagehub/AuthorizationChecker.java +++ b/src/main/java/org/gcube/data/access/storagehub/AuthorizationChecker.java @@ -21,7 +21,7 @@ import org.gcube.common.storagehub.model.exceptions.InvalidCallParameters; import org.gcube.common.storagehub.model.exceptions.UserNotAuthorizedException; import org.gcube.common.storagehub.model.items.Item; import org.gcube.common.storagehub.model.items.SharedFolder; -import org.gcube.data.access.storagehub.handlers.Node2ItemConverter; +import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,8 +42,8 @@ public class AuthorizationChecker { if (item==null) throw new UserNotAuthorizedException("Insufficent Privileges for user "+login+" to read node with id "+id+": it's not a valid StorageHub node"); - - + //check for public items (if is public anyone can read it) + if (item.isShared()) { SharedFolder parentShared = node2Item.getItem(retrieveSharedFolderParent(node, session), Excludes.EXCLUDE_ACCOUNTING); @@ -82,19 +82,15 @@ public class AuthorizationChecker { return retrieveSharedFolderParent(node.getParent(), session); } - - public void checkWriteAuthorizationControl(Session session, String id, boolean isNewItem) throws UserNotAuthorizedException, BackendGenericError, RepositoryException { - //in case of newItem the id is the parent otherwise the old node to replace - Node node = session.getNodeByIdentifier(id); - - Item item = node2Item.getItem(node, Excludes.ALL); - + + public void checkWriteAuthorizationControl(Session session, Item item, Node node, boolean isNewItem) throws UserNotAuthorizedException, BackendGenericError, RepositoryException { + String login = AuthorizationProvider.instance.get().getClient().getId(); - if (item==null) throw new UserNotAuthorizedException("Insufficent Privileges for user "+login+" to write into node with id "+id+": it's not a valid StorageHub node"); + if (item==null) throw new UserNotAuthorizedException("Not valid StorageHub node"); if (Constants.WRITE_PROTECTED_FOLDER.contains(item.getName()) || Constants.WRITE_PROTECTED_FOLDER.contains(item.getTitle())) - throw new UserNotAuthorizedException("Insufficent Privileges for user "+login+" to write into node with id "+id+": it's a protected folder"); + throw new UserNotAuthorizedException("Insufficent Privileges for user "+login+" to write into node with id "+item.getId()+": it's a protected folder"); if (item.isShared()) { Node parentSharedNode = retrieveSharedFolderParent(node, session); @@ -121,7 +117,15 @@ public class AuthorizationChecker { } else if(item.getOwner().equals(login)) return; - throw new UserNotAuthorizedException("Insufficent Privileges for user "+login+" to write into node with id "+id); + throw new UserNotAuthorizedException("Insufficent Privileges for user "+login+" to write into node with id "+item.getId()); + } + + public void checkWriteAuthorizationControl(Session session, String id, boolean isNewItem) throws UserNotAuthorizedException, BackendGenericError, RepositoryException { + //in case of newItem the id is the parent otherwise the old node to replace + Node node = session.getNodeByIdentifier(id); + Item item = node2Item.getItem(node, Excludes.ALL); + checkWriteAuthorizationControl(session, item, node, isNewItem); + } diff --git a/src/main/java/org/gcube/data/access/storagehub/MultipleOutputStream.java b/src/main/java/org/gcube/data/access/storagehub/MultipleOutputStream.java index 9978a83..07936d9 100644 --- a/src/main/java/org/gcube/data/access/storagehub/MultipleOutputStream.java +++ b/src/main/java/org/gcube/data/access/storagehub/MultipleOutputStream.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.PipedInputStream; import java.io.PipedOutputStream; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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 b733999..3e6c1fb 100644 --- a/src/main/java/org/gcube/data/access/storagehub/Utils.java +++ b/src/main/java/org/gcube/data/access/storagehub/Utils.java @@ -47,12 +47,12 @@ import org.gcube.common.storagehub.model.items.SharedFolder; import org.gcube.common.storagehub.model.types.ItemAction; import org.gcube.common.storagehub.model.types.NodeProperty; import org.gcube.data.access.storagehub.accounting.AccountingHandler; -import org.gcube.data.access.storagehub.handlers.Item2NodeConverter; -import org.gcube.data.access.storagehub.handlers.Node2ItemConverter; import org.gcube.data.access.storagehub.handlers.StorageBackendHandler; import org.gcube.data.access.storagehub.handlers.VRE; import org.gcube.data.access.storagehub.handlers.VREManager; import org.gcube.data.access.storagehub.handlers.VersionHandler; +import org.gcube.data.access.storagehub.handlers.items.Item2NodeConverter; +import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -147,7 +147,10 @@ public class Utils { logger.debug("[SEARCH] evaluating node {} ",current.hasProperty(NodeProperty.TITLE.toString())? current.getProperty(NodeProperty.TITLE.toString()):current.getName()); //REMOVE duplicate nodes, in case the indexes are not working - if (duplicateId.contains(current.getIdentifier())) continue; + if (duplicateId.contains(current.getIdentifier())) { + logger.warn("duplicated node found"); + continue; + } //ECLUDES node not authorized, in case the indexes are not working if (authChecker!=null) diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/TrashHandler.java b/src/main/java/org/gcube/data/access/storagehub/handlers/TrashHandler.java index 576f736..28b8fb8 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/TrashHandler.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/TrashHandler.java @@ -4,9 +4,12 @@ import java.util.Calendar; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import javax.inject.Inject; import javax.inject.Singleton; +import javax.jcr.ItemNotFoundException; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; @@ -25,11 +28,12 @@ import org.gcube.common.storagehub.model.items.FolderItem; import org.gcube.common.storagehub.model.items.Item; import org.gcube.common.storagehub.model.items.TrashItem; import org.gcube.common.storagehub.model.types.ItemAction; -import org.gcube.contentmanagement.blobstorage.service.IClient; import org.gcube.data.access.storagehub.AuthorizationChecker; import org.gcube.data.access.storagehub.Constants; import org.gcube.data.access.storagehub.Utils; import org.gcube.data.access.storagehub.accounting.AccountingHandler; +import org.gcube.data.access.storagehub.handlers.items.Item2NodeConverter; +import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,6 +42,8 @@ public class TrashHandler { private static Logger log = LoggerFactory.getLogger(TrashHandler.class); + ExecutorService executor = Executors.newFixedThreadPool(100); + @Inject VersionHandler versionHandler; @@ -49,6 +55,9 @@ public class TrashHandler { @Inject Item2NodeConverter item2Node; + + @Inject + Node2ItemConverter node2Item; @Inject StorageBackendHandler storageHandler; @@ -94,7 +103,7 @@ public class TrashHandler { } }); - new Thread(deleteFromStorageRunnable).start(); + executor.execute(deleteFromStorageRunnable); ses.save(); }catch (LockException e) { @@ -176,9 +185,33 @@ public class TrashHandler { log.debug("restoring node from trash"); final String login = AuthorizationProvider.instance.get().getClient().getId(); //final Node trashFolder = ses.getNode(Paths.append(Utils.getHomePath(),Constants.TRASH_ROOT_FOLDER_NAME).toPath()); - Node originalParent = ses.getNodeByIdentifier(item.getOriginalParentId()); - authChecker.checkWriteAuthorizationControl(ses, originalParent.getIdentifier(), false ); - + boolean originalParentExists = true; + boolean originalParentTrashed = false; + Node originalParent = null; + try { + originalParent = ses.getNodeByIdentifier(item.getOriginalParentId()); + }catch (ItemNotFoundException e) { + originalParentExists = false; + } + + Item originalParentItem = null; + if (originalParentExists) { + originalParentItem = node2Item.getItem(originalParent, Excludes.ALL); + originalParentTrashed = originalParentItem.isTrashed(); + } + + Node destinationNode= null; + if(originalParentExists && !originalParentTrashed) { + authChecker.checkWriteAuthorizationControl(ses, originalParentItem, originalParent, false ); + destinationNode = originalParent; + }else { + String homeWS = Utils.getWorkspacePath(login).toPath(); + Node node = ses.getNode(homeWS); + authChecker.checkWriteAuthorizationControl(ses, node.getIdentifier(), false ); + destinationNode = node; + } + + ses.getWorkspace().getLockManager().lock(originalParent.getPath(), true, true, 0,login); List items = Utils.getItemList(ses.getNodeByIdentifier(item.getId()), Excludes.ALL, null, false, null); if (items.size()!=1) { @@ -186,7 +219,7 @@ public class TrashHandler { throw new BackendGenericError("An error occurred on trash item"); } Item itemToMove = items.get(0); - String newNodePath = Paths.append(Paths.getPath(originalParent.getPath()), itemToMove.getName()).toPath(); + String newNodePath = Paths.append(Paths.getPath(destinationNode.getPath()), itemToMove.getName()).toPath(); ses.move(itemToMove.getPath(), newNodePath); Utils.setPropertyOnChangeNode(ses.getNode(newNodePath), login, ItemAction.MOVED); ses.removeItem(item.getPath()); diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/UnshareHandler.java b/src/main/java/org/gcube/data/access/storagehub/handlers/UnshareHandler.java index 35646c6..852f1ca 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/UnshareHandler.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/UnshareHandler.java @@ -31,6 +31,8 @@ import org.gcube.common.storagehub.model.types.NodeProperty; import org.gcube.data.access.storagehub.AuthorizationChecker; import org.gcube.data.access.storagehub.Utils; import org.gcube.data.access.storagehub.accounting.AccountingHandler; +import org.gcube.data.access.storagehub.handlers.items.Item2NodeConverter; +import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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 fa4b726..499471e 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,7 +1,6 @@ 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; @@ -25,7 +24,7 @@ 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.common.storagehub.model.types.NodeProperty; +import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/content/ContentHandlerFactory.java b/src/main/java/org/gcube/data/access/storagehub/handlers/content/ContentHandlerFactory.java index d66b2ce..d5e046e 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/content/ContentHandlerFactory.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/content/ContentHandlerFactory.java @@ -3,6 +3,7 @@ package org.gcube.data.access.storagehub.handlers.content; import java.util.Arrays; import java.util.HashMap; import java.util.Set; + import javax.inject.Singleton; import org.gcube.common.storagehub.model.annotations.MimeTypeHandler; diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/content/OfficeAppHandler.java b/src/main/java/org/gcube/data/access/storagehub/handlers/content/OfficeAppHandler.java index d77e28f..d696a4f 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/content/OfficeAppHandler.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/content/OfficeAppHandler.java @@ -7,7 +7,6 @@ import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.microsoft.ooxml.OOXMLParser; import org.apache.tika.sax.BodyContentHandler; -import org.gcube.common.storagehub.model.annotations.MimeTypeHandler; import org.gcube.common.storagehub.model.items.GenericFileItem; import org.gcube.common.storagehub.model.items.nodes.Content; import org.gcube.common.storagehub.model.types.ItemAction; diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/Item2NodeConverter.java b/src/main/java/org/gcube/data/access/storagehub/handlers/items/Item2NodeConverter.java similarity index 98% rename from src/main/java/org/gcube/data/access/storagehub/handlers/Item2NodeConverter.java rename to src/main/java/org/gcube/data/access/storagehub/handlers/items/Item2NodeConverter.java index e3a8a9f..3e209d5 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/Item2NodeConverter.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/items/Item2NodeConverter.java @@ -1,4 +1,4 @@ -package org.gcube.data.access.storagehub.handlers; +package org.gcube.data.access.storagehub.handlers.items; import java.lang.reflect.Field; import java.net.URL; @@ -36,6 +36,7 @@ import org.gcube.common.storagehub.model.items.Item; import org.gcube.common.storagehub.model.types.ItemAction; import org.gcube.common.storagehub.model.types.NodeProperty; import org.gcube.data.access.storagehub.Utils; +import org.gcube.data.access.storagehub.handlers.ClassHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/Node2ItemConverter.java b/src/main/java/org/gcube/data/access/storagehub/handlers/items/Node2ItemConverter.java similarity index 99% rename from src/main/java/org/gcube/data/access/storagehub/handlers/Node2ItemConverter.java rename to src/main/java/org/gcube/data/access/storagehub/handlers/items/Node2ItemConverter.java index 0c3e677..7a7885c 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/Node2ItemConverter.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/items/Node2ItemConverter.java @@ -1,4 +1,4 @@ -package org.gcube.data.access.storagehub.handlers; +package org.gcube.data.access.storagehub.handlers.items; import java.lang.reflect.Field; import java.net.URI; @@ -35,7 +35,7 @@ import org.gcube.common.storagehub.model.exceptions.BackendGenericError; import org.gcube.common.storagehub.model.items.Item; import org.gcube.common.storagehub.model.items.SharedFolder; import org.gcube.common.storagehub.model.items.TrashItem; -import org.gcube.data.access.storagehub.Utils; +import org.gcube.data.access.storagehub.handlers.ClassHandler; import org.reflections.Configuration; import org.reflections.Reflections; import org.reflections.util.ConfigurationBuilder; diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/ArchiveStructureCreationParameter.java b/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/ArchiveStructureCreationParameter.java new file mode 100644 index 0000000..5d775f2 --- /dev/null +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/ArchiveStructureCreationParameter.java @@ -0,0 +1,75 @@ +package org.gcube.data.access.storagehub.handlers.items.builders; + +import java.io.InputStream; +import java.util.Objects; + +import org.glassfish.jersey.media.multipart.FormDataContentDisposition; + +public class ArchiveStructureCreationParameter extends CreateParameters { + + String parentFolderName; + FormDataContentDisposition fileDetails; + InputStream stream; + + + protected ArchiveStructureCreationParameter() {} + + public String getParentFolderName() { + return parentFolderName; + } + + public FormDataContentDisposition getFileDetails() { + return fileDetails; + } + + public InputStream getStream() { + return stream; + } + + @Override + protected boolean isValid() { + return Objects.nonNull(parentFolderName) && Objects.nonNull(stream) && Objects.nonNull(fileDetails); + } + + @Override + public String toString() { + return "FileCreationParameters [parentFolder=" + parentFolderName + ", fileDetails=" + fileDetails + + ", parentId=" + parentId + ", user=" + user + "]"; + } + + public static ArchiveCreationBuilder builder() { + return new ArchiveCreationBuilder(); + } + + public static class ArchiveCreationBuilder extends ItemsParameterBuilder{ + + private ArchiveCreationBuilder() { + super(new ArchiveStructureCreationParameter()); + } + + public ArchiveCreationBuilder parentName(String name) { + parameters.parentFolderName = name; + return this; + } + + + public ArchiveCreationBuilder stream(InputStream stream) { + parameters.stream = stream; + return this; + } + + public ArchiveCreationBuilder fileDetails(FormDataContentDisposition fileDetails) { + parameters.fileDetails = fileDetails; + return this; + } + + } + + @Override + public ManagedType getMangedType() { + return ManagedType.ARCHIVE; + } + + + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/CreateParameters.java b/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/CreateParameters.java new file mode 100644 index 0000000..a216616 --- /dev/null +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/CreateParameters.java @@ -0,0 +1,38 @@ +package org.gcube.data.access.storagehub.handlers.items.builders; + +import javax.jcr.Session; + +public abstract class CreateParameters { + + public enum ManagedType { + FILE, + FOLDER, + ARCHIVE, + URL, + GCUBEITEM; + } + + String parentId; + Session session; + String user; + + protected CreateParameters() {} + + public abstract ManagedType getMangedType(); + + public String getParentId() { + return parentId; + } + + public Session getSession() { + return session; + } + + public String getUser() { + return user; + } + + protected abstract boolean isValid(); + + public abstract String toString(); +} diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/FileCreationParameters.java b/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/FileCreationParameters.java new file mode 100644 index 0000000..81d423b --- /dev/null +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/FileCreationParameters.java @@ -0,0 +1,82 @@ +package org.gcube.data.access.storagehub.handlers.items.builders; + +import java.io.InputStream; +import java.util.Objects; + +import org.glassfish.jersey.media.multipart.FormDataContentDisposition; + +public class FileCreationParameters extends CreateParameters { + + String name; + String description; + FormDataContentDisposition fileDetails; + InputStream stream; + + + protected FileCreationParameters() {} + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public FormDataContentDisposition getFileDetails() { + return fileDetails; + } + + public InputStream getStream() { + return stream; + } + + @Override + protected boolean isValid() { + return Objects.nonNull(name) && Objects.nonNull(description) && Objects.nonNull(stream) && Objects.nonNull(fileDetails); + } + + @Override + public String toString() { + return "FileCreationParameters [name=" + name + ", description=" + description + ", fileDetails=" + fileDetails + + ", parentId=" + parentId + ", user=" + user + "]"; + } + + public static FileCreationBuilder builder() { + return new FileCreationBuilder(); + } + + public static class FileCreationBuilder extends ItemsParameterBuilder{ + + private FileCreationBuilder() { + super(new FileCreationParameters()); + } + + public FileCreationBuilder name(String name) { + parameters.name = name; + return this; + } + + public FileCreationBuilder description(String description) { + parameters.description = description; + return this; + } + + public FileCreationBuilder stream(InputStream stream) { + parameters.stream = stream; + return this; + } + + public FileCreationBuilder fileDetails(FormDataContentDisposition fileDetails) { + parameters.fileDetails = fileDetails; + return this; + } + + } + + @Override + public ManagedType getMangedType() { + return ManagedType.FILE; + } + +} diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/FolderCreationParameters.java b/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/FolderCreationParameters.java new file mode 100644 index 0000000..643ecf4 --- /dev/null +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/FolderCreationParameters.java @@ -0,0 +1,69 @@ +package org.gcube.data.access.storagehub.handlers.items.builders; + +import java.util.Objects; + +public class FolderCreationParameters extends CreateParameters { + + String name; + String description; + boolean hidden = false; + + + protected FolderCreationParameters() {} + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public boolean isHidden() { + return hidden; + } + + @Override + protected boolean isValid() { + return Objects.nonNull(name) && Objects.nonNull(description); + } + + @Override + public String toString() { + return "FolderCreationParameters [name=" + name + ", description=" + description + ", hidden=" + hidden + + ", parentId=" + parentId + ", session=" + session + ", user=" + user + "]"; + } + + + public static FolderCreationBuilder builder() { + return new FolderCreationBuilder(); + } + + public static class FolderCreationBuilder extends ItemsParameterBuilder{ + + private FolderCreationBuilder() { + super(new FolderCreationParameters()); + } + + public FolderCreationBuilder name(String name) { + parameters.name = name; + return this; + } + + public FolderCreationBuilder description(String description) { + parameters.description = description; + return this; + } + + public FolderCreationBuilder hidden(boolean hidden) { + parameters.hidden = hidden; + return this; + } + + } + + @Override + public ManagedType getMangedType() { + return ManagedType.FOLDER; + } +} diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/GCubeItemCreationParameters.java b/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/GCubeItemCreationParameters.java new file mode 100644 index 0000000..4b70966 --- /dev/null +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/GCubeItemCreationParameters.java @@ -0,0 +1,49 @@ +package org.gcube.data.access.storagehub.handlers.items.builders; + +import java.util.Objects; + +import org.gcube.common.storagehub.model.items.GCubeItem; + +public class GCubeItemCreationParameters extends CreateParameters{ + + GCubeItem item; + + + protected GCubeItemCreationParameters() {} + + public GCubeItem getItem() { + return item; + } + + @Override + protected boolean isValid() { + return Objects.nonNull(item); + } + + @Override + public String toString() { + return "GCubeItemCreationParameters [item=" + item + ", parentId=" + parentId + ", user=" + user + "]"; + } + + public static GCubeItemCreationBuilder builder() { + return new GCubeItemCreationBuilder(); + } + + public static class GCubeItemCreationBuilder extends ItemsParameterBuilder{ + + private GCubeItemCreationBuilder() { + super(new GCubeItemCreationParameters()); + } + + public GCubeItemCreationBuilder item(GCubeItem item) { + parameters.item = item; + return this; + } + + } + + @Override + public ManagedType getMangedType() { + return ManagedType.GCUBEITEM; + } +} diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/ItemsParameterBuilder.java b/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/ItemsParameterBuilder.java new file mode 100644 index 0000000..31981d2 --- /dev/null +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/ItemsParameterBuilder.java @@ -0,0 +1,39 @@ +package org.gcube.data.access.storagehub.handlers.items.builders; + +import java.util.Objects; + +import javax.jcr.Session; + +import org.gcube.common.storagehub.model.exceptions.InvalidCallParameters; + +public abstract class ItemsParameterBuilder { + + T parameters; + + protected ItemsParameterBuilder(T parameters) { + super(); + this.parameters = parameters; + } + + public ItemsParameterBuilder on(String parentId) { + parameters.parentId = parentId; + return this; + } + + public ItemsParameterBuilder author(String author) { + parameters.user = author; + return this; + } + + public ItemsParameterBuilder with(Session session){ + parameters.session = session; + return this; + } + + public T build() throws InvalidCallParameters { + if (!(parameters.isValid() && Objects.nonNull(parameters.parentId))) + throw new InvalidCallParameters("invalid call"); + return parameters; + } + +} diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/URLCreationParameters.java b/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/URLCreationParameters.java new file mode 100644 index 0000000..9c489ab --- /dev/null +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/items/builders/URLCreationParameters.java @@ -0,0 +1,69 @@ +package org.gcube.data.access.storagehub.handlers.items.builders; + +import java.net.URL; +import java.util.Objects; + +public class URLCreationParameters extends CreateParameters { + + String name; + String description; + URL url; + + + protected URLCreationParameters() {} + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public URL getUrl() { + return url; + } + + @Override + protected boolean isValid() { + return Objects.nonNull(name) && Objects.nonNull(description) && Objects.nonNull(url); + } + + @Override + public String toString() { + return "URLCreationParameters [name=" + name + ", description=" + description + ", url=" + url + ", parentId=" + + parentId + ", user=" + user + "]"; + } + + public static URLCreationBuilder builder() { + return new URLCreationBuilder(); + } + + public static class URLCreationBuilder extends ItemsParameterBuilder{ + + private URLCreationBuilder() { + super(new URLCreationParameters()); + } + + public URLCreationBuilder name(String name) { + parameters.name = name; + return this; + } + + public URLCreationBuilder description(String description) { + parameters.description = description; + return this; + } + + public URLCreationBuilder url(URL url) { + parameters.url = url; + return this; + } + + } + + @Override + public ManagedType getMangedType() { + return ManagedType.URL; + } +} diff --git a/src/main/java/org/gcube/data/access/storagehub/services/ACLManager.java b/src/main/java/org/gcube/data/access/storagehub/services/ACLManager.java index 951e281..c2b43a2 100644 --- a/src/main/java/org/gcube/data/access/storagehub/services/ACLManager.java +++ b/src/main/java/org/gcube/data/access/storagehub/services/ACLManager.java @@ -45,7 +45,7 @@ import org.gcube.data.access.storagehub.AuthorizationChecker; import org.gcube.data.access.storagehub.StorageHubAppllicationManager; import org.gcube.data.access.storagehub.Utils; import org.gcube.data.access.storagehub.handlers.CredentialHandler; -import org.gcube.data.access.storagehub.handlers.Node2ItemConverter; +import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter; import org.gcube.smartgears.annotations.ManagedBy; import org.gcube.smartgears.utils.InnerMethodName; import org.glassfish.jersey.media.multipart.FormDataParam; 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 f19dd0b..cbfaad7 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 @@ -58,10 +58,10 @@ import org.gcube.data.access.storagehub.StorageHubAppllicationManager; import org.gcube.data.access.storagehub.Utils; import org.gcube.data.access.storagehub.exception.MyAuthException; import org.gcube.data.access.storagehub.handlers.CredentialHandler; -import org.gcube.data.access.storagehub.handlers.Node2ItemConverter; import org.gcube.data.access.storagehub.handlers.TrashHandler; import org.gcube.data.access.storagehub.handlers.VRE; import org.gcube.data.access.storagehub.handlers.VREManager; +import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter; import org.gcube.smartgears.annotations.ManagedBy; import org.gcube.smartgears.utils.InnerMethodName; import org.glassfish.jersey.media.multipart.FormDataParam; @@ -72,6 +72,8 @@ import org.slf4j.LoggerFactory; @ManagedBy(StorageHubAppllicationManager.class) public class GroupManager { + + @Context ServletContext context; @Inject @@ -99,7 +101,7 @@ public class GroupManager { public List getGroups(){ InnerMethodName.instance.set("getGroups"); - + JackrabbitSession session = null; List groups= new ArrayList<>(); try { 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 5e26799..10f3f2d 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 @@ -42,9 +42,9 @@ import org.gcube.data.access.storagehub.StorageHubAppllicationManager; import org.gcube.data.access.storagehub.Utils; import org.gcube.data.access.storagehub.accounting.AccountingHandler; import org.gcube.data.access.storagehub.handlers.CredentialHandler; -import org.gcube.data.access.storagehub.handlers.Item2NodeConverter; -import org.gcube.data.access.storagehub.handlers.Node2ItemConverter; import org.gcube.data.access.storagehub.handlers.UnshareHandler; +import org.gcube.data.access.storagehub.handlers.items.Item2NodeConverter; +import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter; import org.gcube.smartgears.utils.InnerMethodName; import org.glassfish.jersey.media.multipart.FormDataParam; import org.slf4j.Logger; diff --git a/src/main/java/org/gcube/data/access/storagehub/services/ItemsCreator.java b/src/main/java/org/gcube/data/access/storagehub/services/ItemsCreator.java index dc3f6ad..6f65b38 100644 --- a/src/main/java/org/gcube/data/access/storagehub/services/ItemsCreator.java +++ b/src/main/java/org/gcube/data/access/storagehub/services/ItemsCreator.java @@ -1,25 +1,12 @@ package org.gcube.data.access.storagehub.services; -import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; -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.jcr.ItemNotFoundException; -import javax.jcr.Node; -import javax.jcr.PathNotFoundException; import javax.jcr.RepositoryException; import javax.jcr.Session; -import javax.jcr.lock.LockException; import javax.servlet.ServletContext; import javax.ws.rs.Consumes; import javax.ws.rs.FormParam; @@ -30,43 +17,23 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import org.apache.commons.compress.archivers.ArchiveEntry; import org.apache.commons.compress.archivers.ArchiveException; -import org.apache.commons.compress.archivers.ArchiveInputStream; -import org.apache.commons.compress.archivers.ArchiveStreamFactory; -import org.apache.tika.config.TikaConfig; -import org.apache.tika.detect.Detector; -import org.apache.tika.io.TikaInputStream; -import org.apache.tika.metadata.Metadata; -import org.gcube.common.authorization.library.AuthorizedTasks; import org.gcube.common.authorization.library.provider.AuthorizationProvider; import org.gcube.common.gxrest.response.outbound.GXOutboundErrorResponse; -import org.gcube.common.storagehub.model.NodeConstants; import org.gcube.common.storagehub.model.exceptions.BackendGenericError; -import org.gcube.common.storagehub.model.exceptions.IdNotFoundException; -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.exceptions.UserNotAuthorizedException; -import org.gcube.common.storagehub.model.items.AbstractFileItem; -import org.gcube.common.storagehub.model.items.FolderItem; import org.gcube.common.storagehub.model.items.GCubeItem; -import org.gcube.common.storagehub.model.storages.MetaInfo; -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.StorageHubAppllicationManager; -import org.gcube.data.access.storagehub.Utils; -import org.gcube.data.access.storagehub.accounting.AccountingHandler; import org.gcube.data.access.storagehub.handlers.CredentialHandler; -import org.gcube.data.access.storagehub.handlers.Item2NodeConverter; -import org.gcube.data.access.storagehub.handlers.Node2ItemConverter; -import org.gcube.data.access.storagehub.handlers.StorageBackendHandler; -import org.gcube.data.access.storagehub.handlers.VersionHandler; -import org.gcube.data.access.storagehub.handlers.content.ContentHandler; -import org.gcube.data.access.storagehub.handlers.content.ContentHandlerFactory; +import org.gcube.data.access.storagehub.handlers.items.Item2NodeConverter; +import org.gcube.data.access.storagehub.handlers.items.ItemHandler; +import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter; +import org.gcube.data.access.storagehub.handlers.items.builders.ArchiveStructureCreationParameter; +import org.gcube.data.access.storagehub.handlers.items.builders.FileCreationParameters; +import org.gcube.data.access.storagehub.handlers.items.builders.FolderCreationParameters; +import org.gcube.data.access.storagehub.handlers.items.builders.GCubeItemCreationParameters; +import org.gcube.data.access.storagehub.handlers.items.builders.ItemsParameterBuilder; +import org.gcube.data.access.storagehub.handlers.items.builders.URLCreationParameters; import org.gcube.smartgears.annotations.ManagedBy; import org.gcube.smartgears.utils.InnerMethodName; import org.glassfish.jersey.media.multipart.FormDataContentDisposition; @@ -81,30 +48,14 @@ public class ItemsCreator { private static final Logger log = LoggerFactory.getLogger(ItemsCreator.class); - private static ExecutorService executor = Executors.newFixedThreadPool(100); - @Context ServletContext context; RepositoryInitializer repository = StorageHubAppllicationManager.repository; - + + @Inject - ContentHandlerFactory contenthandlerFactory; + ItemHandler itemHandler; - @Inject - VersionHandler versionHandler; - - @Inject - AuthorizationChecker authChecker; - - @Inject - AccountingHandler accountingHandler; - - @Inject Node2ItemConverter node2Item; - @Inject Item2NodeConverter item2Node; - - @Inject StorageBackendHandler storageBackend; - - //@Path("/{id}/create/{type:(?!FILE)[^/?$]*}") @POST @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Path("/{id}/create/FOLDER") @@ -115,41 +66,18 @@ public class ItemsCreator { String toReturn = null; try{ final String login = AuthorizationProvider.instance.get().getClient().getId(); - long start = System.currentTimeMillis(); - ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context)); - - log.info("time to connect to repo {}",(System.currentTimeMillis()-start)); - - Node destination; - try { - destination = ses.getNodeByIdentifier(id); - }catch(RepositoryException inf) { - throw new IdNotFoundException(id); - } - - if (!node2Item.checkNodeType(destination, FolderItem.class)) - throw new InvalidItemException("the destination item is not a folder"); - - authChecker.checkWriteAuthorizationControl(ses, destination.getIdentifier(), true); - - Utils.acquireLockWithWait(ses, destination.getPath(), false, login, 10); - Node newNode; - try { - newNode = Utils.createFolderInternally(ses, destination, name, description, hidden, login, accountingHandler); - ses.save(); - } finally { - ses.getWorkspace().getLockManager().unlock(destination.getPath()); - } - - log.info("item with id {} correctly created",newNode.getIdentifier()); - toReturn = newNode.getIdentifier(); + ItemsParameterBuilder builder = FolderCreationParameters.builder().name(name).description(description).hidden(hidden).on(id).with(ses).author(login); + toReturn = itemHandler.create(builder.build()); }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)); + }catch(Throwable e ){ + log.error("unexpected error", e); + GXOutboundErrorResponse.throwException(new BackendGenericError(e)); }finally{ if (ses!=null) ses.logout(); @@ -168,42 +96,21 @@ public class ItemsCreator { String toReturn = null; try{ final String login = AuthorizationProvider.instance.get().getClient().getId(); - long start = System.currentTimeMillis(); ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context)); - - log.info("time to connect to repo {}",(System.currentTimeMillis()-start)); - - Node destination; - try { - destination = ses.getNodeByIdentifier(id); - }catch(RepositoryException inf) { - throw new IdNotFoundException(id); - } - - if (!node2Item.checkNodeType(destination, FolderItem.class)) - throw new InvalidItemException("the destination item is not a folder"); - - authChecker.checkWriteAuthorizationControl(ses, destination.getIdentifier(), true); - - Utils.acquireLockWithWait(ses, destination.getPath(), false, login, 10); - Node newNode; - try { - newNode = Utils.createURLInternally(ses, destination, name, value, description, login, accountingHandler); - ses.save(); - } finally { - ses.getWorkspace().getLockManager().unlock(destination.getPath()); - } - - log.info("item with id {} correctly created",newNode.getIdentifier()); - toReturn = newNode.getIdentifier(); + ItemsParameterBuilder builder = URLCreationParameters.builder().name(name).description(description).url(value).on(id).with(ses).author(login); + + toReturn = itemHandler.create(builder.build()); }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)); + }catch(Throwable e ){ + log.error("unexpected error", e); + GXOutboundErrorResponse.throwException(new BackendGenericError(e)); }finally{ if (ses!=null) ses.logout(); @@ -225,38 +132,18 @@ public class ItemsCreator { try{ final String login = AuthorizationProvider.instance.get().getClient().getId(); ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context)); - - Node destination; - try { - destination = ses.getNodeByIdentifier(id); - }catch(ItemNotFoundException inf) { - throw new IdNotFoundException(id); - } - - if (!node2Item.checkNodeType(destination, FolderItem.class)) - throw new InvalidItemException("the destination item is not a folder"); - - authChecker.checkWriteAuthorizationControl(ses, destination.getIdentifier(), true); - - - Utils.acquireLockWithWait(ses, destination.getPath(), false, login, 10); - - Node newNode; - try { - newNode = Utils.createGcubeItemInternally(ses, destination, item.getName(), item.getDescription(), login, item, accountingHandler); - ses.save(); - } finally { - ses.getWorkspace().getLockManager().unlock(destination.getPath()); - } - - log.info("item with id {} correctly created",newNode.getIdentifier()); - toReturn = newNode.getIdentifier(); + ItemsParameterBuilder builder = GCubeItemCreationParameters.builder().item(item).on(id).with(ses).author(login); + + toReturn = itemHandler.create(builder.build()); }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)); + }catch(Throwable e ){ + log.error("unexpected error", e); + GXOutboundErrorResponse.throwException(new BackendGenericError(e)); }finally{ if (ses!=null) ses.logout(); @@ -277,27 +164,14 @@ public class ItemsCreator { Session ses = null; String toReturn = null; try{ - if (name==null || name.trim().isEmpty() || description ==null) throw new InvalidCallParameters("name or description are null or empty"); final String login = AuthorizationProvider.instance.get().getClient().getId(); ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context)); - - Node destination = ses.getNodeByIdentifier(id); - - log.info("create file called with filename {} in dir {} ", name, destination.getPath() ); - - if (!node2Item.checkNodeType(destination, FolderItem.class)) - throw new InvalidItemException("the destination item is not a folder"); - - - log.info("session: {}",ses.toString()); - - Node newNode = createFileItemInternally(ses, destination, stream, name, description, login, true); - ses.save(); - - versionHandler.checkinContentNode(newNode, ses); - log.info("file with id {} correctly created",newNode.getIdentifier()); - toReturn = newNode.getIdentifier(); + ItemsParameterBuilder builder = FileCreationParameters.builder().name(name).description(description).stream(stream).fileDetails(fileDetail) + .on(id).with(ses).author(login); + + toReturn = itemHandler.create(builder.build()); + }catch(RepositoryException re ){ log.error("jcr error creating file item", re); GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating file item", re)); @@ -317,64 +191,9 @@ public class ItemsCreator { } + - - private Node createFileItemInternally(Session ses, Node destinationNode, InputStream stream, String name, String description, String login, boolean withLock) throws RepositoryException, UserNotAuthorizedException, ItemLockedException, BackendGenericError{ - - - - Node newNode; - try { - newNode = ses.getNode(org.gcube.common.storagehub.model.Paths.append(org.gcube.common.storagehub.model.Paths.getPath(destinationNode.getPath()), name).toPath()); - authChecker.checkWriteAuthorizationControl(ses, newNode.getIdentifier(), false); - AbstractFileItem item = fillItemWithContent(stream, name, description, destinationNode.getPath(), login); - item.setHidden(destinationNode.getProperty(NodeProperty.HIDDEN.toString()).getBoolean()); - if (withLock) { - try { - ses.getWorkspace().getLockManager().lock(newNode.getPath(), true, true, 0,login); - }catch (LockException le) { - throw new ItemLockedException(le); - } - } - try { - versionHandler.checkoutContentNode(newNode, ses); - log.trace("replacing content of class {}",item.getContent().getClass()); - item2Node.replaceContent(newNode,item, ItemAction.UPDATED); - accountingHandler.createFileUpdated(item.getTitle(), ses, newNode, false); - ses.save(); - }finally { - if (withLock) ses.getWorkspace().getLockManager().unlock(newNode.getPath()); - } - }catch(PathNotFoundException pnf) { - authChecker.checkWriteAuthorizationControl(ses, destinationNode.getIdentifier(), true); - AbstractFileItem item = fillItemWithContent(stream, name, description, destinationNode.getPath(), login); - if (withLock) { - try { - log.debug("trying to acquire lock"); - Utils.acquireLockWithWait(ses, destinationNode.getPath(), false, login, 10); - }catch (LockException le) { - throw new ItemLockedException(le); - } - } - try { - newNode = item2Node.getNode(destinationNode, item); - accountingHandler.createEntryCreate(item.getTitle(), ses, newNode, false); - ses.save(); - }finally { - if (withLock) ses.getWorkspace().getLockManager().unlock(destinationNode.getPath()); - } - versionHandler.makeVersionableContent(newNode, ses); - accountingHandler.createFolderAddObj(name, item.getClass().getSimpleName(), item.getContent().getMimeType(), ses, destinationNode, false); - } - - return newNode; - } - - private AbstractFileItem fillItemWithContent(InputStream stream, String name, String description, String path, String login) throws BackendGenericError{ - ContentHandler handler = getContentHandler(stream , name, path, login); - AbstractFileItem item =handler.buildItem(name, description, login); - return item ; - } + @POST @@ -388,84 +207,14 @@ public class ItemsCreator { Session ses = null; String toReturn = null; try{ - if (parentFolderName==null) throw new InvalidCallParameters("new folder name is null"); - final String login = AuthorizationProvider.instance.get().getClient().getId(); ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context)); - Node destination = ses.getNodeByIdentifier(id); - - if (!node2Item.checkNodeType(destination, FolderItem.class)) - throw new InvalidItemException("the destination item is not a folder"); - - authChecker.checkWriteAuthorizationControl(ses, destination.getIdentifier() , true); - - try { - ses.getWorkspace().getLockManager().lock(destination.getPath(), false, true, 0,login); - }catch (LockException le) { - throw new ItemLockedException(le); - } - - Node parentDirectoryNode = Utils.createFolderInternally(ses, destination, parentFolderName, "", false, login, accountingHandler); - try { - if (ses.getWorkspace().getLockManager().isLocked(destination.getPath())) - ses.getWorkspace().getLockManager().unlock(destination.getPath()); - } catch (Throwable t){ - log.warn("error unlocking {}", destination.getPath(), t); - } - - Set fileNodes = new HashSet<>(); - - - HashMap directoryNodeMap = new HashMap<>(); - - try (ArchiveInputStream input = new ArchiveStreamFactory() - .createArchiveInputStream(new BufferedInputStream(stream, 1024*64))){ - ArchiveEntry entry; - while ((entry = input.getNextEntry()) != null) { - if (entry.isDirectory()) { - String entirePath = entry.getName(); - String name = entirePath.replaceAll("(.*/)*(.*)/", "$2"); - String parentPath = entirePath.replaceAll("(.*/)*(.*)/", "$1"); - log.debug("creating directory with entire path {}, name {}, parentPath {} ", entirePath, name, parentPath); - Node createdNode; - if (parentPath.isEmpty()) { - createdNode = Utils.createFolderInternally(ses, parentDirectoryNode, name, "", false, login, accountingHandler); - }else { - Node parentNode = directoryNodeMap.get(parentPath); - createdNode = Utils.createFolderInternally(ses, parentNode, name, "", false, login, accountingHandler); - } - directoryNodeMap.put(entirePath, createdNode); - continue; - } else { - try { - String entirePath = entry.getName(); - String name = entirePath.replaceAll("(.*/)*(.*)", "$2"); - String parentPath = entirePath.replaceAll("(.*/)*(.*)", "$1"); - log.debug("creating file with entire path {}, name {}, parentPath {} ", entirePath, name, parentPath); - Node fileNode = null; - if (parentPath.isEmpty()) - fileNode = createFileItemInternally(ses, parentDirectoryNode, input, name, "", login, false); - else { - Node parentNode = directoryNodeMap.get(parentPath); - fileNode = createFileItemInternally(ses, parentNode, input, name, "", login, false); - } - fileNodes.add(fileNode); - }catch(Exception e) { - log.warn("error getting file {}",entry.getName(),e); - } - } - } - - } - - ses.save(); - for (Node node : fileNodes) - versionHandler.checkinContentNode(node, ses); - toReturn = parentDirectoryNode.getIdentifier(); - - + ItemsParameterBuilder builder = ArchiveStructureCreationParameter.builder().parentName(parentFolderName).stream(stream).fileDetails(fileDetail) + .on(id).with(ses).author(login); + + toReturn = itemHandler.create(builder.build()); }catch(RepositoryException | ArchiveException | IOException re){ log.error("jcr error extracting archive", re); @@ -473,6 +222,9 @@ public class ItemsCreator { }catch(StorageHubException she ){ log.error(she.getErrorMessage(), she); GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus())); + }catch(Throwable e ){ + log.error("unexpected error", e); + GXOutboundErrorResponse.throwException(new BackendGenericError(e)); } finally{ if (ses!=null) ses.logout(); @@ -482,85 +234,6 @@ public class ItemsCreator { } - private ContentHandler getContentHandler(InputStream stream , String name, String path, String login) throws BackendGenericError { - - - final MultipleOutputStream mos; - try{ - mos = new MultipleOutputStream(stream, 2); - }catch (IOException e) { - throw new BackendGenericError(e); - } - - Callable mimeTypeDector = new Callable() { - - @Override - public ContentHandler call() throws Exception { - ContentHandler handler =null; - long start = System.currentTimeMillis(); - log.debug("TIMING: reading the mimetype - start"); - try(InputStream is1 = new BufferedInputStream(mos.get(), 1024*64)){ - org.apache.tika.mime.MediaType mediaType = null; - TikaConfig config = TikaConfig.getDefaultConfig(); - Detector detector = config.getDetector(); - TikaInputStream stream = TikaInputStream.get(is1); - Metadata metadata = new Metadata(); - metadata.add(Metadata.RESOURCE_NAME_KEY, name); - mediaType = detector.detect(stream, metadata); - String mimeType = mediaType.getBaseType().toString(); - - handler = contenthandlerFactory.create(mimeType); - - is1.reset(); - handler.initiliseSpecificContent(is1, name, mimeType); - - log.trace("TIMING: reading the mimetype - finished in {}",System.currentTimeMillis()-start); - } catch (Throwable e) { - log.error("error retrieving mimeType",e); - throw new RuntimeException(e); - } - return handler; - } - - }; - - Callable uploader = new Callable() { - - @Override - public MetaInfo call() throws Exception { - try(InputStream is1 = mos.get()){ - String uid = UUID.randomUUID().toString(); - String remotePath= String.format("%s/%s-%s",path,uid,name); - MetaInfo info = storageBackend.upload(is1, remotePath); - return info; - }catch (Throwable e) { - log.error("error writing content",e ); - throw e; - } - - } - }; - - Future detectorF = executor.submit(AuthorizedTasks.bind(mimeTypeDector)); - Future uploaderF = executor.submit(AuthorizedTasks.bind(uploader)); - - long start = System.currentTimeMillis(); - log.debug("TIMING: writing the stream - start"); - try { - mos.startWriting(); - log.debug("TIMING: writing the stream - finished in {}",System.currentTimeMillis()-start); - - ContentHandler handler = detectorF.get(); - MetaInfo info = uploaderF.get(); - handler.getContent().setData(NodeConstants.CONTENT_NAME); - handler.getContent().setStorageId(info.getStorageId()); - handler.getContent().setSize(info.getSize()); - handler.getContent().setRemotePath(info.getRemotePath()); - return handler; - }catch (Exception e) { - throw new BackendGenericError(e); - } - - } + } 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 2ed4da6..766d1d8 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 @@ -45,7 +45,7 @@ import javax.ws.rs.core.StreamingOutput; import org.apache.commons.io.FilenameUtils; import org.gcube.common.authorization.control.annotations.AuthorizationControl; import org.gcube.common.authorization.library.provider.AuthorizationProvider; -import org.gcube.common.encryption.StringEncrypter; +import org.gcube.common.encryption.encrypter.*; import org.gcube.common.gxrest.response.outbound.GXOutboundErrorResponse; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.scope.impl.ScopeBean; @@ -79,11 +79,11 @@ import org.gcube.data.access.storagehub.accounting.AccountingHandler; import org.gcube.data.access.storagehub.exception.MyAuthException; import org.gcube.data.access.storagehub.handlers.ClassHandler; import org.gcube.data.access.storagehub.handlers.CredentialHandler; -import org.gcube.data.access.storagehub.handlers.Item2NodeConverter; -import org.gcube.data.access.storagehub.handlers.Node2ItemConverter; import org.gcube.data.access.storagehub.handlers.StorageBackendHandler; import org.gcube.data.access.storagehub.handlers.TrashHandler; import org.gcube.data.access.storagehub.handlers.VersionHandler; +import org.gcube.data.access.storagehub.handlers.items.Item2NodeConverter; +import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter; import org.gcube.smartgears.annotations.ManagedBy; import org.gcube.smartgears.utils.InnerMethodName; import org.slf4j.Logger; 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 a9e5d3b..249d63a 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 @@ -32,6 +32,7 @@ import org.gcube.common.storagehub.model.Paths; import org.gcube.common.storagehub.model.exceptions.BackendGenericError; import org.gcube.common.storagehub.model.exceptions.InvalidItemException; import org.gcube.common.storagehub.model.exceptions.StorageHubException; +import org.gcube.common.storagehub.model.exceptions.UserNotAuthorizedException; import org.gcube.common.storagehub.model.expressions.Expression; import org.gcube.common.storagehub.model.expressions.logical.And; import org.gcube.common.storagehub.model.expressions.logical.ISDescendant; @@ -45,12 +46,12 @@ import org.gcube.data.access.storagehub.Range; import org.gcube.data.access.storagehub.StorageHubAppllicationManager; import org.gcube.data.access.storagehub.Utils; import org.gcube.data.access.storagehub.handlers.CredentialHandler; -import org.gcube.data.access.storagehub.handlers.Item2NodeConverter; -import org.gcube.data.access.storagehub.handlers.Node2ItemConverter; import org.gcube.data.access.storagehub.handlers.StorageBackendHandler; import org.gcube.data.access.storagehub.handlers.TrashHandler; import org.gcube.data.access.storagehub.handlers.VRE; import org.gcube.data.access.storagehub.handlers.VREManager; +import org.gcube.data.access.storagehub.handlers.items.Item2NodeConverter; +import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter; import org.gcube.data.access.storagehub.query.sql2.evaluators.Evaluators; import org.gcube.smartgears.annotations.ManagedBy; import org.gcube.smartgears.utils.InnerMethodName; @@ -285,7 +286,7 @@ public class WorkspaceManager { //TODO check if it is possible to change all the ACL on a workspace ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context)); - authChecker.checkWriteAuthorizationControl(ses, identifier, false); + //authChecker.checkWriteAuthorizationControl(ses, identifier, false); final Node nodeToRestore = ses.getNodeByIdentifier(identifier); @@ -293,7 +294,12 @@ public class WorkspaceManager { if (!(itemToRestore instanceof TrashItem)) throw new InvalidItemException("Only trash items can be restored"); - + + String user = AuthorizationProvider.instance.get().getClient().getId(); + org.gcube.common.storagehub.model.Path trashPath = Paths.append(Utils.getWorkspacePath(), Constants.TRASH_ROOT_FOLDER_NAME); + if (!itemToRestore.getPath().startsWith(trashPath.toPath())) + throw new UserNotAuthorizedException("this item is not in the user "+user+" trash"); + toReturn = trashHandler.restoreItem(ses, (TrashItem)itemToRestore); }catch(RepositoryException re ){ diff --git a/src/main/webapp/WEB-INF/README b/src/main/webapp/WEB-INF/README index 9b1f413..f36eff6 100644 --- a/src/main/webapp/WEB-INF/README +++ b/src/main/webapp/WEB-INF/README @@ -25,7 +25,7 @@ The projects leading to this software have received funding from a series of Version -------------------------------------------------- -1.1.0-SNAPSHOT (2020-03-17) +1.1.1-SNAPSHOT (2020-04-08) Please see the file named "changelog.xml" in this directory for the release notes. diff --git a/src/main/webapp/WEB-INF/gcube-app.xml b/src/main/webapp/WEB-INF/gcube-app.xml index 7213f32..25e7a15 100644 --- a/src/main/webapp/WEB-INF/gcube-app.xml +++ b/src/main/webapp/WEB-INF/gcube-app.xml @@ -1,7 +1,7 @@ StorageHub DataAccess - 1.1.0-SNAPSHOT + 1.1.1-SNAPSHOT Storage Hub webapp \ No newline at end of file diff --git a/src/test/java/org/gcube/data/access/fs/Expressions.java b/src/test/java/org/gcube/data/access/fs/Expressions.java index 2c2054a..9218943 100644 --- a/src/test/java/org/gcube/data/access/fs/Expressions.java +++ b/src/test/java/org/gcube/data/access/fs/Expressions.java @@ -11,7 +11,6 @@ import org.gcube.common.storagehub.model.expressions.logical.And; import org.gcube.common.storagehub.model.expressions.text.Contains; import org.gcube.data.access.storagehub.query.sql2.evaluators.Evaluators; import org.junit.Test; -import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/test/java/org/gcube/data/access/fs/TestFields.java b/src/test/java/org/gcube/data/access/fs/TestFields.java index 1591e06..082e485 100644 --- a/src/test/java/org/gcube/data/access/fs/TestFields.java +++ b/src/test/java/org/gcube/data/access/fs/TestFields.java @@ -5,6 +5,7 @@ import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import javax.jcr.Node; @@ -13,18 +14,23 @@ import javax.jcr.nodetype.NodeType; import org.gcube.common.storagehub.model.items.Item; import org.gcube.common.storagehub.model.types.ItemAction; -import org.gcube.data.access.storagehub.handlers.Node2ItemConverter; +import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter; import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.vlkan.rfos.RotatingFileOutputStream; +import com.vlkan.rfos.RotationConfig; +import com.vlkan.rfos.policy.DailyRotationPolicy; +import com.vlkan.rfos.policy.SizeBasedRotationPolicy; + public class TestFields { Logger logger = LoggerFactory.getLogger(TestFields.class); - //@Test + @Test public void iterateOverFields() throws Exception{ Property prop = mock(Property.class); @@ -63,4 +69,21 @@ public class TestFields { } + @Test + public void print() throws Exception{ + RotationConfig config = RotationConfig + .builder() + .file("/tmp/app.log") + .filePattern("/tmp/app-%d{yyyyMMdd-HHmmss.SSS}.log") + .policy(new SizeBasedRotationPolicy(1024 * 1024 * 100 /* 100MiB */)) + .policy(DailyRotationPolicy.getInstance()) + .build(); + + try (RotatingFileOutputStream stream = new RotatingFileOutputStream(config)) { + for (int i =0 ; i<1000 ; i++) + stream.write("Operation: done".getBytes(StandardCharsets.UTF_8)); + } + + } + } diff --git a/src/test/java/org/gcube/data/access/fs/TestNode.java b/src/test/java/org/gcube/data/access/fs/TestNode.java index 8f0c103..482428f 100644 --- a/src/test/java/org/gcube/data/access/fs/TestNode.java +++ b/src/test/java/org/gcube/data/access/fs/TestNode.java @@ -1,19 +1,5 @@ package org.gcube.data.access.fs; -import java.awt.Image; -import java.awt.image.BufferedImage; -import java.awt.image.DataBufferByte; -import java.awt.image.DataBufferInt; -import java.awt.image.ImageObserver; -import java.io.File; -import java.util.Base64; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.imageio.ImageIO; - -import org.junit.Test; - public class TestNode { /*@Test