moved classes in differen packages
This commit is contained in:
parent
6e69de91d0
commit
4c13f4098e
|
@ -27,7 +27,6 @@
|
|||
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
|
||||
<attributes>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
|
||||
|
|
|
@ -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
|
||||
|
|
18
pom.xml
18
pom.xml
|
@ -12,7 +12,7 @@
|
|||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.gcube.data.access</groupId>
|
||||
<artifactId>storagehub</artifactId>
|
||||
<version>1.1.0</version>
|
||||
<version>1.1.1-SNAPSHOT</version>
|
||||
<name>storagehub</name>
|
||||
|
||||
<scm>
|
||||
|
@ -26,7 +26,7 @@
|
|||
|
||||
<properties>
|
||||
<webappDirectory>${project.basedir}/src/main/webapp/WEB-INF</webappDirectory>
|
||||
<jackrabbit.version>2.16.0</jackrabbit.version>
|
||||
<jackrabbit.version>2.19.3</jackrabbit.version>
|
||||
<tomcat.version>7.0.40</tomcat.version>
|
||||
<jetty.version>6.1.26</jetty.version>
|
||||
<tika.version>1.21</tika.version>
|
||||
|
@ -70,12 +70,12 @@
|
|||
<groupId>org.gcube.core</groupId>
|
||||
<artifactId>common-smartgears</artifactId>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>org.gcube.core</groupId>
|
||||
<artifactId>common-smartgears-app</artifactId>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>org.gcube.common</groupId>
|
||||
<artifactId>authorization-control-library</artifactId>
|
||||
|
@ -316,10 +316,16 @@
|
|||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
<version>1.0.13</version>
|
||||
<version>1.2.3</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.vlkan.rfos</groupId>
|
||||
<artifactId>rotating-fos</artifactId>
|
||||
<version>0.9.2</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
|
@ -454,7 +460,7 @@
|
|||
<resources>
|
||||
<resource>
|
||||
<directory>${distroDirectory}</directory>
|
||||
<filtering>true</filtering>
|
||||
<filtering>true</filtering>
|
||||
</resource>
|
||||
</resources>
|
||||
</configuration>
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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<Item> 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());
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
@ -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;
|
|
@ -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<ArchiveStructureCreationParameter>{
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
|
@ -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<FileCreationParameters>{
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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<FolderCreationParameters>{
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
|
@ -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<GCubeItemCreationParameters>{
|
||||
|
||||
private GCubeItemCreationBuilder() {
|
||||
super(new GCubeItemCreationParameters());
|
||||
}
|
||||
|
||||
public GCubeItemCreationBuilder item(GCubeItem item) {
|
||||
parameters.item = item;
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public ManagedType getMangedType() {
|
||||
return ManagedType.GCUBEITEM;
|
||||
}
|
||||
}
|
|
@ -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 extends CreateParameters> {
|
||||
|
||||
T parameters;
|
||||
|
||||
protected ItemsParameterBuilder(T parameters) {
|
||||
super();
|
||||
this.parameters = parameters;
|
||||
}
|
||||
|
||||
public ItemsParameterBuilder<T> on(String parentId) {
|
||||
parameters.parentId = parentId;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ItemsParameterBuilder<T> author(String author) {
|
||||
parameters.user = author;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ItemsParameterBuilder<T> 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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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<URLCreationParameters>{
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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<String> getGroups(){
|
||||
|
||||
InnerMethodName.instance.set("getGroups");
|
||||
|
||||
|
||||
JackrabbitSession session = null;
|
||||
List<String> groups= new ArrayList<>();
|
||||
try {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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<FolderCreationParameters> 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<URLCreationParameters> 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<GCubeItemCreationParameters> 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<FileCreationParameters> 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<Node> fileNodes = new HashSet<>();
|
||||
|
||||
|
||||
HashMap<String, Node> 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<ArchiveStructureCreationParameter> 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<ContentHandler> mimeTypeDector = new Callable<ContentHandler>() {
|
||||
|
||||
@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<MetaInfo> uploader = new Callable<MetaInfo>() {
|
||||
|
||||
@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<ContentHandler> detectorF = executor.submit(AuthorizedTasks.bind(mimeTypeDector));
|
||||
Future<MetaInfo> 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 ){
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<application mode='online'>
|
||||
<name>StorageHub</name>
|
||||
<group>DataAccess</group>
|
||||
<version>1.1.0-SNAPSHOT</version>
|
||||
<version>1.1.1-SNAPSHOT</version>
|
||||
<description>Storage Hub webapp</description>
|
||||
<local-persistence location='target' />
|
||||
</application>
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue