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