From e11bb536a73b69e0c408af4bcf6305e38e9d6a79 Mon Sep 17 00:00:00 2001 From: lucio Date: Fri, 26 Nov 2021 17:49:35 +0100 Subject: [PATCH] a part of s3StorageIntegration --- .classpath | 1 - pom.xml | 33 +++-- .../gcube/data/access/storagehub/Utils.java | 17 ++- .../storagehub/handlers/CompressHandler.java | 16 +- .../storagehub/handlers/TrashHandler.java | 19 ++- .../handlers/items/ItemHandler.java | 23 ++- .../handlers/plugins/FolderPluginHandler.java | 86 ----------- .../handlers/plugins/OperationMediator.java | 20 +-- .../plugins/StorageBackendHandler.java | 47 ++++++ .../storagehub/services/ItemsManager.java | 66 ++++++--- .../storagehub/services/MessageManager.java | 33 +++-- .../storagehub/services/WorkspaceManager.java | 8 +- .../impl/GCubeFolderManagerConnector.java | 22 --- ...end.java => GCubeMongoStorageBackend.java} | 42 +++--- .../impl/GCubeMongoStorageBackendFactory.java | 23 +++ .../backend/impl/GcubeFolderManager.java | 48 ------ .../storage/backend/impl/S3Backend.java | 139 ++++++++++++++++++ src/main/webapp/WEB-INF/README | 2 +- .../org/gcube/data/access/fs/Expressions.java | 23 +-- 19 files changed, 378 insertions(+), 290 deletions(-) delete mode 100644 src/main/java/org/gcube/data/access/storagehub/handlers/plugins/FolderPluginHandler.java create mode 100644 src/main/java/org/gcube/data/access/storagehub/handlers/plugins/StorageBackendHandler.java delete mode 100644 src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeFolderManagerConnector.java rename src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/{GCubeStorageBackend.java => GCubeMongoStorageBackend.java} (76%) create mode 100644 src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeMongoStorageBackendFactory.java delete mode 100644 src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GcubeFolderManager.java create mode 100644 src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/S3Backend.java diff --git a/.classpath b/.classpath index 0a99827..1a26978 100644 --- a/.classpath +++ b/.classpath @@ -27,7 +27,6 @@ - diff --git a/pom.xml b/pom.xml index a993bed..e5a963e 100644 --- a/pom.xml +++ b/pom.xml @@ -296,19 +296,7 @@ runtime - - - org.gcube.contentmanagement - storage-manager-core - [3.0.0-SNAPSHOT,4.0.0-SNAPSHOT) - - - - org.gcube.contentmanagement - storage-manager-wrapper - [3.0.0-SNAPSHOT,4.0.0-SNAPSHOT) - - + org.reflections reflections @@ -418,6 +406,25 @@ jersey-test-framework-provider-grizzly2 test + + + + org.gcube.contentmanagement + storage-manager-core + [3.0.0-SNAPSHOT,4.0.0-SNAPSHOT) + + + + org.gcube.contentmanagement + storage-manager-wrapper + [3.0.0-SNAPSHOT,4.0.0-SNAPSHOT) + + + + com.amazonaws + aws-java-sdk + 1.11.163 + 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 5050680..75cfe55 100644 --- a/src/main/java/org/gcube/data/access/storagehub/Utils.java +++ b/src/main/java/org/gcube/data/access/storagehub/Utils.java @@ -30,12 +30,14 @@ import org.gcube.common.storagehub.model.exceptions.IdNotFoundException; 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.ExternalLink; import org.gcube.common.storagehub.model.items.FolderItem; import org.gcube.common.storagehub.model.items.GCubeItem; import org.gcube.common.storagehub.model.items.Item; import org.gcube.common.storagehub.model.items.RootItem; import org.gcube.common.storagehub.model.items.SharedFolder; +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.accounting.AccountingHandler; @@ -188,7 +190,7 @@ public class Utils { } - + public static void copyStream(InputStream in, OutputStream out) throws IOException { byte[] buffer = new byte[2048]; @@ -211,7 +213,7 @@ public class Utils { return false; } - + public static String checkExistanceAndGetUniqueName(Session ses, Node destination, String name) throws BackendGenericError{ try { destination.getNode(name); @@ -249,7 +251,7 @@ public class Utils { public static Node createFolderInternally(FolderCreationParameters params, AccountingHandler accountingHandler) throws StorageHubException { logger.debug("creating folder {} in {}", params.getName(), params.getParentId()); - + Node destinationNode; try { destinationNode = params.getSession().getNodeByIdentifier(params.getParentId()); @@ -346,5 +348,12 @@ public class Utils { node.setProperty(NodeProperty.LAST_ACTION.toString(), action.name()); } - + public static void setContentFromMetaInfo(AbstractFileItem item, MetaInfo contentInfo) { + item.getContent().setManagedBy(contentInfo.getManagedBy()); + item.getContent().setSize(contentInfo.getSize()); + item.getContent().setRemotePath(contentInfo.getRemotePath()); + item.getContent().setSize(contentInfo.getSize()); + item.getContent().setStorageId(contentInfo.getStorageId()); + } + } diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/CompressHandler.java b/src/main/java/org/gcube/data/access/storagehub/handlers/CompressHandler.java index ed22043..c5c52c6 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/CompressHandler.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/CompressHandler.java @@ -19,10 +19,11 @@ import org.gcube.common.storagehub.model.exceptions.BackendGenericError; import org.gcube.common.storagehub.model.items.AbstractFileItem; import org.gcube.common.storagehub.model.items.FolderItem; import org.gcube.common.storagehub.model.items.Item; -import org.gcube.common.storagehub.model.plugins.FolderManager; +import org.gcube.common.storagehub.model.storages.StorageBackend; +import org.gcube.common.storagehub.model.storages.StorageBackendFactory; import org.gcube.data.access.storagehub.Utils; import org.gcube.data.access.storagehub.accounting.AccountingHandler; -import org.gcube.data.access.storagehub.handlers.plugins.FolderPluginHandler; +import org.gcube.data.access.storagehub.handlers.plugins.StorageBackendHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,7 +32,8 @@ public class CompressHandler { private Logger logger = LoggerFactory.getLogger(CompressHandler.class); @Inject - FolderPluginHandler pluginHandler; + StorageBackendHandler storageBackendHandler; + public Deque getAllNodesForZip(FolderItem directory, Session session, String login, AccountingHandler accountingHandler, List excludes) throws RepositoryException, BackendGenericError{ Deque queue = new LinkedList(); @@ -74,8 +76,12 @@ public class CompressHandler { } else if (item instanceof AbstractFileItem){ try { AbstractFileItem fileItem = (AbstractFileItem)item; - FolderManager manager = pluginHandler.getFolderManager(fileItem); - InputStream streamToWrite = manager.getStorageBackend().download(fileItem.getContent()); + + StorageBackendFactory sbf = storageBackendHandler.get(fileItem.getContent().getManagedBy()); + + StorageBackend sb = sbf.create(null); + + InputStream streamToWrite = sb.download(fileItem.getContent()); if (streamToWrite == null){ logger.warn("discarding item {} ",item.getName()); continue; 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 1e33357..12ce727 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 @@ -30,7 +30,8 @@ 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.items.nodes.Content; -import org.gcube.common.storagehub.model.plugins.FolderManager; +import org.gcube.common.storagehub.model.storages.StorageBackend; +import org.gcube.common.storagehub.model.storages.StorageBackendFactory; import org.gcube.common.storagehub.model.types.ItemAction; import org.gcube.data.access.storagehub.AuthorizationChecker; import org.gcube.data.access.storagehub.PathUtil; @@ -38,7 +39,7 @@ 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.gcube.data.access.storagehub.handlers.plugins.FolderPluginHandler; +import org.gcube.data.access.storagehub.handlers.plugins.StorageBackendHandler; import org.gcube.data.access.storagehub.types.ContentPair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -68,10 +69,9 @@ public class TrashHandler { @Inject PathUtil pathUtil; - @Inject FolderPluginHandler managerHandler; @Inject - FolderPluginHandler folderHandler; + StorageBackendHandler storageBackendHandler; public void removeNodes(Session ses, List itemsToDelete) throws RepositoryException, StorageHubException{ log.debug("defnitively removing nodes with ids {}",itemsToDelete); @@ -109,8 +109,13 @@ public class TrashHandler { } try { - FolderManager manager = folderHandler.getFolderManager(item); - contentSet.add(new ContentPair(item.getContent(), manager.getStorageBackend())); + + + StorageBackendFactory sbf = storageBackendHandler.get(item.getContent().getManagedBy()); + + StorageBackend sb = sbf.create(null); + + contentSet.add(new ContentPair(item.getContent(), sb)); List versions = versionHandler.getContentVersionHistory((Node)item.getRelatedNode()); @@ -118,7 +123,7 @@ public class TrashHandler { try { Content content = node2Item.getContentFromVersion(version); if (content!= null && content.getStorageId()!=null) - contentSet.add(new ContentPair(content, manager.getStorageBackend())); + contentSet.add(new ContentPair(content, sb)); else log.warn("invalid version {}",version.getName()); }catch (Throwable t) { log.warn("error retrieving version content for {}",version.getName(),t); diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/items/ItemHandler.java b/src/main/java/org/gcube/data/access/storagehub/handlers/items/ItemHandler.java index 2633f81..c091136 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/items/ItemHandler.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/items/ItemHandler.java @@ -38,9 +38,9 @@ import org.gcube.common.storagehub.model.exceptions.ItemLockedException; import org.gcube.common.storagehub.model.exceptions.StorageHubException; import org.gcube.common.storagehub.model.items.AbstractFileItem; import org.gcube.common.storagehub.model.items.FolderItem; -import org.gcube.common.storagehub.model.plugins.FolderManager; import org.gcube.common.storagehub.model.storages.MetaInfo; import org.gcube.common.storagehub.model.storages.StorageBackend; +import org.gcube.common.storagehub.model.storages.StorageBackendFactory; import org.gcube.common.storagehub.model.types.ItemAction; import org.gcube.data.access.storagehub.AuthorizationChecker; import org.gcube.data.access.storagehub.MultipleOutputStream; @@ -55,7 +55,7 @@ import org.gcube.data.access.storagehub.handlers.items.builders.FileCreationPara 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.URLCreationParameters; -import org.gcube.data.access.storagehub.handlers.plugins.FolderPluginHandler; +import org.gcube.data.access.storagehub.handlers.plugins.StorageBackendHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -76,7 +76,7 @@ public class ItemHandler { VersionHandler versionHandler; @Inject - FolderPluginHandler pluginHandler; + StorageBackendHandler storageBackendHandler; private static ExecutorService executor = Executors.newFixedThreadPool(100); @@ -252,24 +252,23 @@ public class ItemHandler { Node newNode; FolderItem destinationItem = node2Item.getItem(destinationNode, Excludes.ALL); - FolderManager folderManager = pluginHandler.getFolderManager(destinationItem); - StorageBackend storageBackend = folderManager.getStorageBackend(); - String relativePath = destinationNode.getPath(); - if (destinationItem.isExternalManaged()) - relativePath = relativePath.replace(folderManager.getRootFolder().getPath(), ""); + StorageBackendFactory sbf = storageBackendHandler.get(destinationItem.getBackend().getStorageName()); + + //TODO: add metadata taken from content node + StorageBackend sb = sbf.create(destinationItem.getBackend().getParameters()); + + String relativePath = destinationNode.getPath(); String newNodePath = Paths.append(Paths.getPath(destinationNode.getPath()), name).toPath(); if (ses.nodeExists(newNodePath)) { - if (!folderManager.manageVersion()) - throw new InvalidCallParameters("storage for plugin "+folderManager.getClass().getName()+" doesn't support versioning"); newNode = ses.getNode(newNodePath); authChecker.checkWriteAuthorizationControl(ses, login, newNode.getIdentifier(), false); - AbstractFileItem item = fillItemWithContent(stream, storageBackend, name, description, relativePath,login); + AbstractFileItem item = fillItemWithContent(stream, sb, name, description, relativePath,login); if (withLock) { try { @@ -290,7 +289,7 @@ public class ItemHandler { } else { authChecker.checkWriteAuthorizationControl(ses, login, destinationNode.getIdentifier(), true); - AbstractFileItem item = fillItemWithContent(stream, storageBackend, name, description, relativePath, login); + AbstractFileItem item = fillItemWithContent(stream, sb, name, description, relativePath, login); if (withLock) { try { log.debug("trying to acquire lock"); diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/plugins/FolderPluginHandler.java b/src/main/java/org/gcube/data/access/storagehub/handlers/plugins/FolderPluginHandler.java deleted file mode 100644 index e739600..0000000 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/plugins/FolderPluginHandler.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.gcube.data.access.storagehub.handlers.plugins; - -import java.util.Collections; -import java.util.Map; - -import javax.enterprise.inject.Instance; -import javax.inject.Inject; -import javax.inject.Singleton; -import javax.jcr.Node; -import javax.jcr.RepositoryException; -import javax.jcr.Session; - -import org.gcube.common.storagehub.model.Excludes; -import org.gcube.common.storagehub.model.exceptions.BackendGenericError; -import org.gcube.common.storagehub.model.exceptions.PluginInitializationException; -import org.gcube.common.storagehub.model.exceptions.PluginNotFoundException; -import org.gcube.common.storagehub.model.items.ExternalFolder; -import org.gcube.common.storagehub.model.items.Item; -import org.gcube.common.storagehub.model.plugins.FolderManager; -import org.gcube.common.storagehub.model.plugins.FolderManagerConnector; -import org.gcube.common.storagehub.model.storages.StorageBackend; -import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter; -import org.gcube.data.access.storagehub.storage.backend.impl.GcubeFolderManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@Singleton -public class FolderPluginHandler { - - private static Logger log = LoggerFactory.getLogger(FolderPluginHandler.class); - - @Inject - Node2ItemConverter node2Item; - - private GcubeFolderManager defaultManager = new GcubeFolderManager(); - - public FolderManager getDefault() { - return defaultManager; - } - - @Inject - Instance connectors; - - private Map connectorsMap; - - private Map storagesMap; - - FolderPluginHandler(){ - if (connectors !=null) - for (FolderManagerConnector connector : connectors) { - if (connectorsMap.containsKey(connector.getName())) - throw new RuntimeException("multiple connectors with the same name found"); - connectorsMap.put(connector.getName(), connector); - - } - else { - log.info("connectors are null"); - connectorsMap = Collections.emptyMap(); - } - } - - public FolderManagerConnector getConnector(String name) throws PluginNotFoundException { - if (!connectorsMap.containsKey(name)) throw new PluginNotFoundException("plugin "+name+" not found"); - return connectorsMap.get(name); - } - - public FolderManager getFolderManager(Item item) throws PluginInitializationException, PluginNotFoundException, RepositoryException, BackendGenericError{ - if (!item.isExternalManaged()) - return defaultManager; - Session session = ((Node)item.getRelatedNode()).getSession(); - Item parent = null; - do { - String parentId = item.getParentId(); - Node node = session.getNodeByIdentifier(parentId); - parent = node2Item.getItem(node, Excludes.ALL); - - if (parent !=null && parent instanceof ExternalFolder) { - ExternalFolder extParent = (ExternalFolder) parent; - String plugin = extParent.getManagedBy(); - Map parameters = extParent.getConnectionParameters().getMap(); - return getConnector(plugin).connect(extParent, parameters); - } - } while (parent!=null); - throw new BackendGenericError("selected external managed item doesn't have a parent external folder"); - } -} diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/plugins/OperationMediator.java b/src/main/java/org/gcube/data/access/storagehub/handlers/plugins/OperationMediator.java index 211a91f..f8cd912 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/plugins/OperationMediator.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/plugins/OperationMediator.java @@ -1,28 +1,10 @@ package org.gcube.data.access.storagehub.handlers.plugins; -import javax.inject.Inject; import javax.inject.Singleton; @Singleton public class OperationMediator { - @Inject - FolderPluginHandler folderHandler; - /* - boolean onMove(Item source, Item destination, Session session) throws PluginInitializationException, PluginNotFoundException, BackendGenericError, RepositoryException{ - FolderManager sourceFolderManager = folderHandler.getFolderManager(source); - FolderManager destinationFolderManager = folderHandler.getFolderManager(destination); - - if (source instanceof FolderItem) { - destinationFolderManager.onCreatedFolder((FolderItem) source); - - - session.move(source.getPath(), destination.getPath()); - sourceFolderManager.onDeletingFolder((FolderItem) source); - } else if (source instanceof AbstractFileItem){ - - } - } - */ + } diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/plugins/StorageBackendHandler.java b/src/main/java/org/gcube/data/access/storagehub/handlers/plugins/StorageBackendHandler.java new file mode 100644 index 0000000..81482ec --- /dev/null +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/plugins/StorageBackendHandler.java @@ -0,0 +1,47 @@ +package org.gcube.data.access.storagehub.handlers.plugins; + +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.PostConstruct; +import javax.enterprise.inject.Instance; +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.gcube.common.storagehub.model.exceptions.PluginNotFoundException; +import org.gcube.common.storagehub.model.storages.StorageBackendFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Singleton +public class StorageBackendHandler { + + private static Logger log = LoggerFactory.getLogger(StorageBackendHandler.class); + + @Inject + Instance factories; + + Map storagebackendMap= new HashMap(); + + @PostConstruct + void init(){ + if (factories !=null) + for (StorageBackendFactory connector : factories) { + if (storagebackendMap.containsKey(connector.getName())) { + log.error("multiple storage backend with the same name"); + throw new RuntimeException("multiple storage backend with the same name"); + } + storagebackendMap.put(connector.getName(), connector); + + } + else + throw new RuntimeException("storage backend implementation not found"); + } + + public StorageBackendFactory get(String storageName) throws PluginNotFoundException { + if (!storagebackendMap.containsKey(storageName)) + throw new PluginNotFoundException(String.format("implementation for storage %s not found", storageName)); + return storagebackendMap.get(storageName); + } + +} 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 aad2502..fef528a 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 @@ -66,10 +66,12 @@ import org.gcube.common.storagehub.model.items.Item; import org.gcube.common.storagehub.model.items.SharedFolder; import org.gcube.common.storagehub.model.items.VreFolder; import org.gcube.common.storagehub.model.items.nodes.Content; -import org.gcube.common.storagehub.model.plugins.FolderManager; import org.gcube.common.storagehub.model.service.ItemList; import org.gcube.common.storagehub.model.service.ItemWrapper; import org.gcube.common.storagehub.model.service.VersionList; +import org.gcube.common.storagehub.model.storages.MetaInfo; +import org.gcube.common.storagehub.model.storages.StorageBackend; +import org.gcube.common.storagehub.model.storages.StorageBackendFactory; import org.gcube.common.storagehub.model.types.ItemAction; import org.gcube.common.storagehub.model.types.NodeProperty; import org.gcube.data.access.storagehub.AuthorizationChecker; @@ -88,7 +90,8 @@ 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.data.access.storagehub.handlers.plugins.FolderPluginHandler; +import org.gcube.data.access.storagehub.handlers.plugins.OperationMediator; +import org.gcube.data.access.storagehub.handlers.plugins.StorageBackendHandler; import org.gcube.smartgears.annotations.ManagedBy; import org.gcube.smartgears.utils.InnerMethodName; import org.slf4j.Logger; @@ -127,13 +130,16 @@ public class ItemsManager extends Impersonable{ @Inject Node2ItemConverter node2Item; @Inject Item2NodeConverter item2Node; - - @Inject - FolderPluginHandler folderPluginHandler; @Inject CompressHandler compressHandler; + @Inject + OperationMediator opMediator; + + @Inject + StorageBackendHandler storageBackendHandler; + @GET @Path("{id}") @@ -703,11 +709,15 @@ public class ItemsManager extends Impersonable{ log.debug("retrieved version id {}, name {}", version.getIdentifier(), version.getName()); if (version.getName().equals(versionName)) { Content content = node2Item.getContentFromVersion(version); - - FolderManager folderManager = folderPluginHandler.getFolderManager((AbstractFileItem) currentItem); - final InputStream streamToWrite = folderManager.getStorageBackend().download(content); - log.debug("retrieved storage id is {} with storageBackend {} (stream is null? {})",content.getStorageId(), folderManager.getStorageBackend().getClass().getSimpleName(), streamToWrite==null ); + StorageBackendFactory sbf = storageBackendHandler.get(content.getManagedBy()); + + //TODO: add metadata taken from content node + StorageBackend sb = sbf.create(null); + + final InputStream streamToWrite = sb.download(content); + + log.debug("retrieved storage id is {} with storageBackend {} (stream is null? {})",content.getStorageId(), sb.getName(), streamToWrite==null ); String oldfilename = FilenameUtils.getBaseName(currentItem.getTitle()); String ext = FilenameUtils.getExtension(currentItem.getTitle()); @@ -849,11 +859,15 @@ public class ItemsManager extends Impersonable{ return response; } - private Response downloadFileInternal(Session ses, AbstractFileItem fileItem, String login, boolean withAccounting) throws RepositoryException, PluginInitializationException, PluginNotFoundException, BackendGenericError { + private Response downloadFileInternal(Session ses, AbstractFileItem fileItem, String login, boolean withAccounting) throws RepositoryException, PluginInitializationException, PluginNotFoundException, StorageHubException { - FolderManager folderManager = folderPluginHandler.getFolderManager(fileItem); + Content content = fileItem.getContent(); - final InputStream streamToWrite = folderManager.getStorageBackend().download(fileItem.getContent()); + StorageBackendFactory sbf = storageBackendHandler.get(content.getManagedBy()); + + StorageBackend sb = sbf.create(null); + + final InputStream streamToWrite = sb.download(content); if (withAccounting) accountingHandler.createReadObj(fileItem.getTitle(), ses, (Node) fileItem.getRelatedNode(), login, true); @@ -923,10 +937,11 @@ public class ItemsManager extends Impersonable{ if (movingSharedItemOutside) item2Node.updateOwnerOnSubTree(nodeToMove, currentUser); - //folderHandler.onMove(source, destination); + //add onMove (if it changes the remotePath) and in case of different backend accountingHandler.createFolderAddObj(uniqueName, item.getClass().getSimpleName(), mimeTypeForAccounting, ses, currentUser, destination, false); accountingHandler.createFolderRemoveObj(item.getTitle(), item.getClass().getSimpleName(), mimeTypeForAccounting, ses, currentUser, originalParent, false); + ses.save(); }finally { ses.getWorkspace().getLockManager().unlock(nodeToMove.getPath()); @@ -976,23 +991,27 @@ public class ItemsManager extends Impersonable{ }catch (LockException e) { throw new ItemLockedException(e); } + try { String uniqueName = Utils.checkExistanceAndGetUniqueName(ses, destination, newFileName); String newPath= String.format("%s/%s", destination.getPath(), uniqueName); ses.getWorkspace().copy(nodeToCopy.getPath(), newPath); Node newNode = ses.getNode(newPath); newFileIdentifier = newNode.getIdentifier(); - - //TODO: folderHandler.onCopy(source, destination); - if (item instanceof AbstractFileItem) { - FolderManager manager = folderPluginHandler.getFolderManager(item); - ((AbstractFileItem) item).getContent().setRemotePath(newPath); - String newStorageID = manager.getStorageBackend().onCopy((AbstractFileItem) item); - ((AbstractFileItem) item).getContent().setStorageId(newStorageID); - item2Node.replaceContent(newNode, (AbstractFileItem) item, ItemAction.CLONED); - } - + Content contentToCopy = ((AbstractFileItem) item).getContent(); + + //TODO : understand if it is needed + //opMediator.copy(((AbstractFileItem) item).getContent(),destinationItem, uniqueName); + + StorageBackendFactory sbf = storageBackendHandler.get(contentToCopy.getManagedBy()); + + //TODO: add metadata taken from content node + StorageBackend sb = sbf.create(null); + MetaInfo contentInfo = sb.onCopy(contentToCopy, destination.getPath(), uniqueName); + Utils.setContentFromMetaInfo((AbstractFileItem) item, contentInfo); + item2Node.replaceContent(newNode, (AbstractFileItem) item, ItemAction.CLONED); + Utils.setPropertyOnChangeNode(newNode, currentUser, ItemAction.CLONED); newNode.setProperty(NodeProperty.PORTAL_LOGIN.toString(), currentUser); newNode.setProperty(NodeProperty.IS_PUBLIC.toString(), false); @@ -1061,6 +1080,7 @@ public class ItemsManager extends Impersonable{ nodeToMove.setProperty(NodeProperty.TITLE.toString(), uniqueName); Utils.setPropertyOnChangeNode(nodeToMove, currentUser, ItemAction.RENAMED); ses.move(nodeToMove.getPath(), newPath); + accountingHandler.createRename(item.getTitle(), uniqueName, ses.getNode(newPath), currentUser, ses, false); ses.save(); }finally { diff --git a/src/main/java/org/gcube/data/access/storagehub/services/MessageManager.java b/src/main/java/org/gcube/data/access/storagehub/services/MessageManager.java index 4699edc..c84d232 100644 --- a/src/main/java/org/gcube/data/access/storagehub/services/MessageManager.java +++ b/src/main/java/org/gcube/data/access/storagehub/services/MessageManager.java @@ -40,9 +40,13 @@ 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.Item; +import org.gcube.common.storagehub.model.items.nodes.Content; import org.gcube.common.storagehub.model.items.nodes.Owner; import org.gcube.common.storagehub.model.messages.Message; import org.gcube.common.storagehub.model.service.ItemList; +import org.gcube.common.storagehub.model.storages.MetaInfo; +import org.gcube.common.storagehub.model.storages.StorageBackend; +import org.gcube.common.storagehub.model.storages.StorageBackendFactory; import org.gcube.common.storagehub.model.types.ItemAction; import org.gcube.common.storagehub.model.types.MessageList; import org.gcube.common.storagehub.model.types.NodeProperty; @@ -56,7 +60,7 @@ import org.gcube.data.access.storagehub.handlers.TrashHandler; import org.gcube.data.access.storagehub.handlers.items.Item2NodeConverter; import org.gcube.data.access.storagehub.handlers.items.Item2NodeConverter.Values; import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter; -import org.gcube.data.access.storagehub.handlers.plugins.FolderPluginHandler; +import org.gcube.data.access.storagehub.handlers.plugins.StorageBackendHandler; import org.gcube.data.access.storagehub.types.MessageSharable; import org.gcube.smartgears.annotations.ManagedBy; import org.gcube.smartgears.utils.InnerMethodName; @@ -87,7 +91,10 @@ public class MessageManager extends Impersonable{ @Inject Item2NodeConverter item2Node; @Inject TrashHandler trashHandler; - + + @Inject + StorageBackendHandler storageBackendHandler; + @GET @Path("{id}") @Produces(MediaType.APPLICATION_JSON) @@ -327,7 +334,7 @@ public class MessageManager extends Impersonable{ - private Node saveAttachments(Session ses, Node messageNode , List attachments) throws RepositoryException, BackendGenericError{ + private Node saveAttachments(Session ses, Node messageNode , List attachments) throws RepositoryException, StorageHubException{ Node attachmentNode = messageNode.getNode(Constants.ATTACHMENTNODE_NAME); for (String itemId: attachments) { @@ -392,10 +399,8 @@ public class MessageManager extends Impersonable{ return personalNode== null ? messageNode : personalNode; } - //TODO: move in a common place - @Inject FolderPluginHandler folderPluginHandler; - - private Node copyNode(Session session, Node destination, Item itemToCopy) throws RepositoryException, BackendGenericError{ + + private Node copyNode(Session session, Node destination, Item itemToCopy) throws RepositoryException, StorageHubException{ //it needs to be locked ?? Node nodeToCopy = ((Node)itemToCopy.getRelatedNode()); String uniqueName = Utils.checkExistanceAndGetUniqueName(session, destination,itemToCopy.getName() ); @@ -405,9 +410,17 @@ public class MessageManager extends Impersonable{ if (itemToCopy instanceof AbstractFileItem) { AbstractFileItem newNodeItem = node2Item.getItem(newNode, Excludes.EXCLUDE_ACCOUNTING); - newNodeItem.getContent().setRemotePath(newPath); - String newStorageID = folderPluginHandler.getDefault().getStorageBackend().onCopy(newNodeItem); - newNodeItem.getContent().setStorageId(newStorageID); + + Content contentToCopy = newNodeItem.getContent(); + + StorageBackendFactory sbf = storageBackendHandler.get(contentToCopy.getManagedBy()); + + //TODO: add metadata taken from content node + StorageBackend sb = sbf.create(null); + + MetaInfo contentInfo = sb.onCopy(contentToCopy, destination.getPath(), uniqueName); + + Utils.setContentFromMetaInfo(newNodeItem, contentInfo); item2Node.replaceContent(newNode, newNodeItem, ItemAction.CLONED); } 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 f5cf456..a5b2273 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 @@ -46,7 +46,6 @@ import org.gcube.data.access.storagehub.handlers.TrashHandler; import org.gcube.data.access.storagehub.handlers.items.Item2NodeConverter; import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter; import org.gcube.data.access.storagehub.handlers.items.builders.FolderCreationParameters; -import org.gcube.data.access.storagehub.handlers.plugins.FolderPluginHandler; import org.gcube.data.access.storagehub.handlers.vres.VRE; import org.gcube.data.access.storagehub.handlers.vres.VREManager; import org.gcube.data.access.storagehub.query.sql2.evaluators.Evaluators; @@ -89,9 +88,6 @@ public class WorkspaceManager extends Impersonable{ @Inject Node2ItemConverter node2Item; @Inject Item2NodeConverter item2Node; - - @Inject - FolderPluginHandler folderHandler; @Path("/") @@ -357,7 +353,7 @@ public class WorkspaceManager extends Impersonable{ @GET public String getTotalItemsCount(){ InnerMethodName.instance.set("getTotalItemsCount"); - return folderHandler.getDefault().getStorageBackend().getTotalItemsCount(); + return "1203"; } @@ -365,7 +361,7 @@ public class WorkspaceManager extends Impersonable{ @GET public String getTotalVolume(){ InnerMethodName.instance.set("getTotalSize"); - return folderHandler.getDefault().getStorageBackend().getTotalSizeStored(); + return "120300000"; } diff --git a/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeFolderManagerConnector.java b/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeFolderManagerConnector.java deleted file mode 100644 index 419ce90..0000000 --- a/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeFolderManagerConnector.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.gcube.data.access.storagehub.storage.backend.impl; - -import java.util.Map; - -import javax.inject.Singleton; - -import org.gcube.common.storagehub.model.exceptions.PluginInitializationException; -import org.gcube.common.storagehub.model.items.FolderItem; -import org.gcube.common.storagehub.model.plugins.FolderManager; -import org.gcube.common.storagehub.model.plugins.FolderManagerConnector; - -@Singleton -public class GCubeFolderManagerConnector implements FolderManagerConnector { - - @Override - public FolderManager connect(FolderItem item, Map parameters) throws PluginInitializationException { - return new GcubeFolderManager(); - } - - - -} diff --git a/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeStorageBackend.java b/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeMongoStorageBackend.java similarity index 76% rename from src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeStorageBackend.java rename to src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeMongoStorageBackend.java index 647d8c3..65008f3 100644 --- a/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeStorageBackend.java +++ b/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeMongoStorageBackend.java @@ -1,11 +1,11 @@ package org.gcube.data.access.storagehub.storage.backend.impl; import java.io.InputStream; +import java.nio.file.Paths; import java.util.UUID; import org.gcube.common.authorization.library.provider.AuthorizationProvider; import org.gcube.common.storagehub.model.Constants; -import org.gcube.common.storagehub.model.items.AbstractFileItem; import org.gcube.common.storagehub.model.items.nodes.Content; import org.gcube.common.storagehub.model.storages.MetaInfo; import org.gcube.common.storagehub.model.storages.StorageBackend; @@ -16,38 +16,42 @@ import org.gcube.contentmanager.storageclient.wrapper.StorageClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class GCubeStorageBackend implements StorageBackend { +public class GCubeMongoStorageBackend implements StorageBackend { - private static final Logger log = LoggerFactory.getLogger(GCubeStorageBackend.class); + private static final Logger log = LoggerFactory.getLogger(GCubeMongoStorageBackend.class); private final static String SERVICE_NAME = "home-library"; private final static String SERVICE_CLASS = "org.gcube.portlets.user"; - - - protected GCubeStorageBackend() {} - @Override public InputStream download(Content content) { return getStorageClient(AuthorizationProvider.instance.get().getClient().getId()).getClient().get().RFileAsInputStream(content.getStorageId()); } + @Override public String getName() { return Constants.mongoStorageConstant; } + protected StorageClient getStorageClient(String login){ + return new StorageClient(SERVICE_CLASS, SERVICE_NAME, login, AccessType.SHARED, MemoryType.PERSISTENT); + } + + @Override - public String onCopy(AbstractFileItem item) { - log.info("copying storage Id {} to newPath {}", item.getContent().getStorageId(), item.getPath()); - String newStorageID = getStorageClient(AuthorizationProvider.instance.get().getClient().getId()).getClient().copyFile(true).from(item.getContent().getStorageId()).to(item.getPath()); + public MetaInfo onCopy(Content content, String newParentPath, String newName) { + log.info("copying storage Id {} to newPath {}", content.getStorageId(), newParentPath); + String newRemotePath = Paths.get(newParentPath, newName).toString(); + String newStorageID = getStorageClient(AuthorizationProvider.instance.get().getClient().getId()).getClient().copyFile(true).from(content.getStorageId()).to(newRemotePath); log.info("The id returned by storage is {}", newStorageID); - return newStorageID; + return new MetaInfo(content.getSize(),newStorageID, newRemotePath, getName()); } @Override - public String onMove(AbstractFileItem item) { - return item.getContent().getStorageId(); + public MetaInfo onMove(Content content, String newParentPath) { + //new contentPath can be set as remotePath to the storage backend ? + return new MetaInfo(content.getSize(),content.getStorageId(), content.getRemotePath(), getName()); } @Override @@ -58,11 +62,7 @@ public class GCubeStorageBackend implements StorageBackend { String remotePath= String.format("%s/%s-%s",relPath,uid,name); String storageId =storageClient.put(true).LFile(stream).RFile(remotePath); long size = storageClient.getSize().RFileById(storageId); - MetaInfo info = new MetaInfo(); - info.setSize(size); - info.setStorageId(storageId); - info.setRemotePath(remotePath); - info.setManagedBy(Constants.mongoStorageConstant); + MetaInfo info = new MetaInfo(size, storageId, remotePath, getName()); return info; } @@ -72,11 +72,7 @@ public class GCubeStorageBackend implements StorageBackend { IClient storageClient = getStorageClient(AuthorizationProvider.instance.get().getClient().getId()).getClient(); storageClient.remove().RFileById(content.getStorageId()); } - - private static StorageClient getStorageClient(String login){ - return new StorageClient(SERVICE_CLASS, SERVICE_NAME, login, AccessType.SHARED, MemoryType.PERSISTENT); - } @Override public String getTotalSizeStored() { @@ -91,4 +87,4 @@ public class GCubeStorageBackend implements StorageBackend { } -} +} \ No newline at end of file diff --git a/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeMongoStorageBackendFactory.java b/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeMongoStorageBackendFactory.java new file mode 100644 index 0000000..1eba52c --- /dev/null +++ b/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GCubeMongoStorageBackendFactory.java @@ -0,0 +1,23 @@ +package org.gcube.data.access.storagehub.storage.backend.impl; + +import org.gcube.common.storagehub.model.Constants; +import org.gcube.common.storagehub.model.Metadata; +import org.gcube.common.storagehub.model.exceptions.InvalidCallParameters; +import org.gcube.common.storagehub.model.storages.StorageBackend; +import org.gcube.common.storagehub.model.storages.StorageBackendFactory; + +public class GCubeMongoStorageBackendFactory implements StorageBackendFactory { + + @Override + public String getName() { + return Constants.mongoStorageConstant; + } + + @Override + public StorageBackend create(Metadata parameter) throws InvalidCallParameters { + return new GCubeMongoStorageBackend(); + } + + + +} diff --git a/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GcubeFolderManager.java b/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GcubeFolderManager.java deleted file mode 100644 index bfe4bec..0000000 --- a/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GcubeFolderManager.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.gcube.data.access.storagehub.storage.backend.impl; - -import javax.inject.Singleton; - -import org.gcube.common.storagehub.model.items.FolderItem; -import org.gcube.common.storagehub.model.plugins.FolderManager; -import org.gcube.common.storagehub.model.storages.StorageBackend; - -@Singleton -public class GcubeFolderManager implements FolderManager { - - @Override - public StorageBackend getStorageBackend() { - return new GCubeStorageBackend(); - } - - @Override - public boolean manageVersion() { - return true; - } - - @Override - public void onCreatedFolder(FolderItem folder) { - } - - @Override - public void onDeletingFolder(FolderItem folder) { - - } - - @Override - public void onMovedFolder(FolderItem movedFolder) { - // TODO Auto-generated method stub - - } - - @Override - public void onCopiedFolder(FolderItem copiedFolder) { - // TODO Auto-generated method stub - - } - - @Override - public FolderItem getRootFolder() { - return null; - } - -} diff --git a/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/S3Backend.java b/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/S3Backend.java new file mode 100644 index 0000000..9f94b0d --- /dev/null +++ b/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/S3Backend.java @@ -0,0 +1,139 @@ +package org.gcube.data.access.storagehub.storage.backend.impl; + +import java.io.InputStream; +import java.util.Map; +import java.util.function.Function; + +import org.gcube.common.authorization.library.provider.AuthorizationProvider; +import org.gcube.common.storagehub.model.items.nodes.Content; +import org.gcube.common.storagehub.model.storages.MetaInfo; +import org.gcube.common.storagehub.model.storages.StorageBackend; + +import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.regions.Regions; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import com.amazonaws.services.s3.model.CopyObjectRequest; +import com.amazonaws.services.s3.model.ObjectMetadata; +import com.amazonaws.services.s3.model.PutObjectResult; +import com.amazonaws.services.s3.model.S3Object; +import com.amazonaws.services.s3.model.S3ObjectInputStream; + +public class S3Backend implements StorageBackend{ + + Map parameters; + Function keyGenerator; + AWSCredentials credentials = new BasicAWSCredentials("user", "password"); + final static Regions clientRegion = Regions.DEFAULT_REGION; + String bucketName; + + + public S3Backend(Map parameters, Function keyGenerator) { + super(); + this.parameters = parameters; + this.keyGenerator = keyGenerator; + this.bucketName = (String)parameters.get("bucketName"); + } + + @Override + public String getName() { + return "s3"; + } + + @Override + public MetaInfo onCopy(Content content, String newParentPath, String newName) { + + + String sourceKey = content.getStorageId(); + String destinationKey = keyGenerator.apply(null); + + try { + AmazonS3 s3Client = AmazonS3ClientBuilder.standard() + .withCredentials(new AWSStaticCredentialsProvider(credentials)) + .withRegion(clientRegion) + .build(); + + // Copy the object into a new object in the same bucket. + CopyObjectRequest copyObjRequest = new CopyObjectRequest(bucketName, sourceKey, bucketName, destinationKey); + s3Client.copyObject(copyObjRequest); + } catch (Exception e) { + throw new RuntimeException("error copying file on s3"); + } + return new MetaInfo(content.getSize(), destinationKey, null, getName()); + } + + @Override + public MetaInfo onMove(Content content, String newParentPath) { + //new contentPath can be set as remotePath to the storage backend ? + return new MetaInfo(content.getSize(),content.getStorageId(), content.getRemotePath(), getName()); + } + + @Override + public void onDelete(Content content) { + // TODO Auto-generated method stub + + } + + @Override + public MetaInfo upload(InputStream stream, String relativePath, String name) { + try { + AmazonS3 s3Client = AmazonS3ClientBuilder.standard() + .withCredentials(new AWSStaticCredentialsProvider(credentials)) + .withRegion(clientRegion) + .build(); + + String storageId = keyGenerator.apply(null); + + ObjectMetadata metadata = new ObjectMetadata(); + metadata.addUserMetadata("user", AuthorizationProvider.instance.get().getClient().getId()); + + PutObjectResult result = s3Client.putObject( + bucketName, + keyGenerator.apply(null), + stream, + metadata + ); + + long size = result.getMetadata().getContentLength(); + + + s3Client.getObjectMetadata(bucketName, ); + + + return new MetaInfo(content.getSize(),storageId, null, getName()); + } catch (Exception e) { + throw new RuntimeException("error copying file on s3"); + } + + } + + @Override + public InputStream download(Content item) { + try { + AmazonS3 s3Client = AmazonS3ClientBuilder.standard() + .withCredentials(new AWSStaticCredentialsProvider(credentials)) + .withRegion(clientRegion) + .build(); + S3Object s3object = s3Client.getObject(bucketName, item.getStorageId()); + S3ObjectInputStream inputStream = s3object.getObjectContent(); + return inputStream; + } catch (Exception e) { + throw new RuntimeException("error copying file on s3"); + } + } + + @Override + public String getTotalSizeStored() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getTotalItemsCount() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/src/main/webapp/WEB-INF/README b/src/main/webapp/WEB-INF/README index 15122bb..3c1c173 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.3.1 (20210910-085653) +1.5.0-SNAPSHOT (2021-11-26) Please see the file named "changelog.xml" in this directory for the release notes. 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 a773c1a..fda02cd 100644 --- a/src/test/java/org/gcube/data/access/fs/Expressions.java +++ b/src/test/java/org/gcube/data/access/fs/Expressions.java @@ -1,9 +1,17 @@ package org.gcube.data.access.fs; +import static org.gcube.common.storagehub.model.Constants.enchriptedPrefix; + +import java.io.File; +import java.security.Key; +import java.util.Base64; import java.util.Calendar; import javax.inject.Inject; +import org.gcube.common.encryption.StringEncrypter; +import org.gcube.common.encryption.SymmetricKey; +import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.storagehub.model.expressions.Expression; import org.gcube.common.storagehub.model.expressions.GenericSearchableItem; import org.gcube.common.storagehub.model.expressions.date.Before; @@ -38,17 +46,12 @@ public class Expressions { */ @Test - public void test() { - String entirePath = "sp2/comic/"; - /*String[] parentPathSplit = entirePath.split("/"); - System.out.println(parentPathSplit.length); - for (String v: parentPathSplit) - System.out.println(v); - */ + public void test() throws Exception { + Key key = SymmetricKey.loadKeyFromFile(new File("/home/lucio/d4science.research-infrastructures.eu.gcubekey"), "AES"); + String idEnc = "E_clNONXlCQlk3aGNMK210eThXbmxXMUFiZXV3NGxqTElFRTlDM21sOFBHbGR5bE9Gc3hVTE9aRTF6T1VlZTF5bw=="; + String id = StringEncrypter.getEncrypter().decrypt(new String(Base64.getUrlDecoder().decode(idEnc.replace(enchriptedPrefix, ""))),key); - String name = entirePath.replaceAll("([^/]*/)*(.*)", "$2"); - String parentPath = entirePath.replaceAll("(([^/]*/)*)(.*)", "$1"); - System.out.println(entirePath+" --"+name+"-- "+parentPath); + System.out.println(id); }