From 3a7aa8b8e3d9c4a46c46416bbe3cafaa5279b714 Mon Sep 17 00:00:00 2001 From: lucio Date: Mon, 19 Dec 2022 17:47:39 +0100 Subject: [PATCH] test on container added --- ToRemoveOnImport | 3 + docker/container.ini | 11 +- docker/logback.xml | 57 +----- docker/storage-settings.properties | 2 +- .../storagehub/handlers/ClassHandler.java | 9 +- .../storagehub/handlers/GroupHandler.java | 9 +- .../handlers/items/Item2NodeConverter.java | 5 +- .../services/admin/ScriptManager.java | 88 +++++---- src/main/resources/init/NodeType.cnd | 176 ++++++++++-------- .../data/access/fs/external/CreateUsers.java | 168 ++++++++++++++++- src/test/resources/test1.jpg | Bin 0 -> 66160 bytes 11 files changed, 337 insertions(+), 191 deletions(-) create mode 100644 ToRemoveOnImport create mode 100644 src/test/resources/test1.jpg diff --git a/ToRemoveOnImport b/ToRemoveOnImport new file mode 100644 index 0000000..cf0787f --- /dev/null +++ b/ToRemoveOnImport @@ -0,0 +1,3 @@ +nodeType to remove on new import from a backup: +externalUrl + diff --git a/docker/container.ini b/docker/container.ini index 4ba6140..2ca5103 100644 --- a/docker/container.ini +++ b/docker/container.ini @@ -1,5 +1,5 @@ [node] -mode = online +mode = offline hostname = dlib29.isti.cnr.it protocol= http port = 8080 @@ -13,16 +13,11 @@ SmartGearsDistributionBundle = UnBundled [site] country = it -location = rome - -[proxy] -protocol = https -hostname = workspace-repository.dev.d4science.org -port = 443 +location = pisa [authorization] factory = org.gcube.smartgears.security.defaults.DefaultAuthorizationProviderFactory factory.endpoint = https://accounts.dev.d4science.org/auth/realms/d4science/protocol/openid-connect/token credentials.class = org.gcube.smartgears.security.SimpleCredentials credentials.clientID = node-whn-test-uno-d-d4s.d4science.org -credentials.secret = 979bd3bc-5cc4-11ec-bf63-0242ac130002 +credentials.secret = 979bd3bc-5cc4-11ec-bf63-0242ac130002 \ No newline at end of file diff --git a/docker/logback.xml b/docker/logback.xml index a58fa86..31e52f4 100644 --- a/docker/logback.xml +++ b/docker/logback.xml @@ -1,62 +1,11 @@ - - /smartgears-distribution/ghn.log - true + - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{0}: %msg%n - + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - /smartgears-distribution/ghn.%d{yyyy-MM-dd}.log - 30 - - - /smartgears-distribution/accounting.log - true - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{0}: %msg%n - - - - /smartgears-distribution/accounting.%d{yyyy-MM-dd}.log - - 30 - - - - - /smartgears-distribution/access.log - true - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{0}: %msg%n - - - - /smartgears-distribution/access.%d{yyyy-MM-dd}.log - - 30 - - - - - - - - - - - - - - - @@ -67,6 +16,6 @@ - + \ No newline at end of file diff --git a/docker/storage-settings.properties b/docker/storage-settings.properties index 4b989f2..492bc88 100644 --- a/docker/storage-settings.properties +++ b/docker/storage-settings.properties @@ -3,7 +3,7 @@ default.key=SHUBTEST default.secret=wJalrXUtnFEMI/K7MDENG/bPxRfiCY default.url=https://localhost:9000/ default.createBucket=true -volatile.bucketName=storagehub-dev +volatile.bucketName=storagehub-volatile-dev volatile.key=SHUBTEST volatile.secret=wJalrXUtnFEMI/K7MDENG/bPxRfiCY volatile.url=https://localhost:9000/ diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/ClassHandler.java b/src/main/java/org/gcube/data/access/storagehub/handlers/ClassHandler.java index ed5cb4b..6591f10 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/ClassHandler.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/ClassHandler.java @@ -41,10 +41,11 @@ public class ClassHandler { Set> classesAnnotated = reflection.getTypesAnnotatedWith(RootNode.class); for (Class clazz: classesAnnotated ){ if (RootItem.class.isAssignableFrom(clazz) && clazz.isAnnotationPresent(RootNode.class)) { - String value = clazz.getAnnotation(RootNode.class).value(); - log.debug("loading class {} with value {} ", clazz, value ); - classMap.put(value, (Class) clazz); - typeMap.put((Class) clazz, value); + String[] values = clazz.getAnnotation(RootNode.class).value(); + log.debug("loading class {} with values {} ", clazz, values ); + for (String value: values) + classMap.put(value, (Class) clazz); + typeMap.put((Class) clazz, values[0]); } } } diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/GroupHandler.java b/src/main/java/org/gcube/data/access/storagehub/handlers/GroupHandler.java index 824f93d..8a31236 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/GroupHandler.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/GroupHandler.java @@ -41,15 +41,20 @@ public class GroupHandler { String folderName = group.getPrincipal().getName(); Node folder = getFolderNodeRelatedToGroup(session, folderName); + + boolean found = false; NodeIterator ni = folder.getSharedSet(); while (ni.hasNext()) { Node node = ni.nextNode(); - if (node.getPath().startsWith(pathUtil.getWorkspacePath(user.getPrincipal().getName()).toPath())) { + if (node.getPath().startsWith(pathUtil.getVREsPath(userId, session).toPath())) { node.removeShare(); + found = true; break; } } - + if (!found) + log.warn("sharing not removed for user {} ",userId); + return group.removeMember(user); } diff --git a/src/main/java/org/gcube/data/access/storagehub/handlers/items/Item2NodeConverter.java b/src/main/java/org/gcube/data/access/storagehub/handlers/items/Item2NodeConverter.java index 798f91d..8118162 100644 --- a/src/main/java/org/gcube/data/access/storagehub/handlers/items/Item2NodeConverter.java +++ b/src/main/java/org/gcube/data/access/storagehub/handlers/items/Item2NodeConverter.java @@ -202,8 +202,9 @@ public class Item2NodeConverter { public void replaceContent(Node node, F item, ItemAction action){ try { - - node.setPrimaryType(item.getClass().getAnnotation(RootNode.class).value()); + + String primaryType = item.getClass().getAnnotation(RootNode.class).value()[0]; + node.setPrimaryType(primaryType); Node contentNode = node.getNode(NodeConstants.CONTENT_NAME); contentNode.setPrimaryType(item.getContent().getClass().getAnnotation(AttributeRootNode.class).value()); diff --git a/src/main/java/org/gcube/data/access/storagehub/services/admin/ScriptManager.java b/src/main/java/org/gcube/data/access/storagehub/services/admin/ScriptManager.java index d70a7f7..2258175 100644 --- a/src/main/java/org/gcube/data/access/storagehub/services/admin/ScriptManager.java +++ b/src/main/java/org/gcube/data/access/storagehub/services/admin/ScriptManager.java @@ -12,8 +12,10 @@ import java.util.UUID; import javax.inject.Inject; import javax.jcr.Node; +import javax.jcr.Session; import javax.servlet.ServletContext; import javax.ws.rs.Consumes; +import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; @@ -79,7 +81,8 @@ public class ScriptManager { @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.APPLICATION_JSON) public ScriptStatus run( @FormDataParam("name") String name, - @FormDataParam("asynch") Boolean asynch, + @FormDataParam("asynch") @DefaultValue("false") Boolean asynch, + @FormDataParam("writeResult") @DefaultValue("false") Boolean writeResult , @FormDataParam("destinationFolderId") String destinationFolderId, @FormDataParam("file") InputStream stream, @FormDataParam("file") FormDataContentDisposition fileDetail) { @@ -87,7 +90,7 @@ public class ScriptManager { InnerMethodName.instance.set("executeScript"); ScriptClassLoader scriptClassLoader = new ScriptClassLoader(Thread.currentThread().getContextClassLoader()); Class scriptClass = uploadClass(stream, scriptClassLoader, fileDetail.getFileName().replace(".class", "")); - return run(scriptClass, name, destinationFolderId, asynch!=null? asynch : false); + return internalRun(scriptClass, name, destinationFolderId, asynch, writeResult); }catch(Throwable e) { log.error("error executing script {}", name,e); throw new WebApplicationException("error loading class",e); @@ -110,7 +113,7 @@ public class ScriptManager { return status; } - + private Class uploadClass(InputStream stream, ScriptClassLoader classLoader, String name) throws Throwable { try(ByteArrayOutputStream buffer = new ByteArrayOutputStream()){ int nRead; @@ -125,28 +128,39 @@ public class ScriptManager { } - private ScriptStatus run(Class clazz, String name, String destinationFolderId, boolean asynch) throws Throwable { + private ScriptStatus internalRun(Class clazz, String name, String destinationFolderId, boolean asynch, boolean writeResult) throws Throwable { String login = SecretManagerProvider.instance.get().getOwner().getId(); log.info("script {} called by {}", clazz.getSimpleName(), login); - JackrabbitSession ses = null; - try { - ses = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context)); - String parentId = destinationFolderId!=null ? destinationFolderId : ses.getNode(pathUtil.getWorkspacePath(login).toPath()).getIdentifier(); - Node parentNode = ses.getNodeByIdentifier(parentId); - + + String resultPath= null; + Node parentNode = null; + + if (writeResult) { + JackrabbitSession ses = null; + try { + ses = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context)); + String parentId = destinationFolderId!=null ? destinationFolderId : ses.getNode(pathUtil.getWorkspacePath(login).toPath()).getIdentifier(); + parentNode = ses.getNodeByIdentifier(parentId); + resultPath = Paths.append(Paths.getPath(parentNode.getPath()), name).toPath(); + }finally { + if (ses!=null) + ses.logout(); + } + } + if (AbstractScript.class.isAssignableFrom(clazz)) { AbstractScript scriptInstance = (AbstractScript) clazz.newInstance(); ApplicationContext appContext = ContextProvider.get(); String serverHost = appContext.container().configuration().hostname(); - - String resultPath = Paths.append(Paths.getPath(parentNode.getPath()), name).toPath(); + + String runningId = UUID.randomUUID().toString(); ScriptStatus status = new ScriptStatus(runningId, resultPath, serverHost); - - RealRun realRun = new RealRun(ses, scriptInstance, login, parentNode, name, true, status); + + RealRun realRun = new RealRun(scriptInstance, login, parentNode, name, writeResult, status); if (asynch) { scriptStatusMap.put(runningId, status); new Thread(AuthorizedTasks.bind(realRun)).start(); @@ -161,8 +175,6 @@ public class ScriptManager { }catch (Throwable e) { - if (ses !=null && ses.isLive()) - ses.logout(); throw e; } @@ -172,7 +184,6 @@ public class ScriptManager { class RealRun implements Runnable{ - private JackrabbitSession ses; AbstractScript instance; String login; Node parentNode; @@ -180,9 +191,8 @@ public class ScriptManager { boolean writeResult = true; ScriptStatus status; - public RealRun(JackrabbitSession ses, AbstractScript instance, String login, Node parentNode, String name, boolean writeResult, ScriptStatus status) { + public RealRun(AbstractScript instance, String login, Node parentNode, String name, boolean writeResult, ScriptStatus status) { super(); - this.ses = ses; this.instance = instance; this.login = login; this.parentNode = parentNode; @@ -194,10 +204,12 @@ public class ScriptManager { @Override public void run() { - try{ - String result =""; + String result =""; + try { + JackrabbitSession executeSession = null; try { - result = instance.run(ses, null, scriptUtil); + executeSession = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context)); + result = instance.run(executeSession, null, scriptUtil); status.setSuccess(); }catch(Throwable t) { StringWriter sw = new StringWriter(); @@ -206,23 +218,30 @@ public class ScriptManager { status.setFailed(sw.toString()); result+= "\n"+sw.toString(); log.warn("error executing script {}",instance.getClass().getSimpleName(), t); + }finally { + if (executeSession !=null && executeSession.isLive()) + executeSession.logout(); } - try( InputStream stream = new ByteArrayInputStream(result.getBytes())){ - ItemsParameterBuilder builder = FileCreationParameters.builder().name(name).description("result of script execution "+name) - .stream(stream).on(parentNode.getIdentifier()).with(ses).author(login); - itemHandler.create(builder.build()); - } catch (Throwable e) { - log.error("error saving script result {} in the Workspace",name, e); + if (this.writeResult) { + Session writeSession = null; + try( InputStream stream = new ByteArrayInputStream(result.getBytes())){ + writeSession = repository.getRepository().login(CredentialHandler.getAdminCredentials(context)); + ItemsParameterBuilder builder = FileCreationParameters.builder().name(name).description("result of script execution "+name) + .stream(stream).on(parentNode.getIdentifier()).with(writeSession).author(login); + itemHandler.create(builder.build()); + } catch (Throwable e) { + log.error("error saving script result {} in the Workspace",name, e); + } finally { + if (writeSession!=null) + writeSession.logout(); + } } - - } finally { - if (ses!=null) - ses.logout(); + }catch (Exception e) { + log.error("unexpected error executing script {}",instance.getClass().getSimpleName(),e); } } - } class ScriptClassLoader extends ClassLoader{ @@ -237,3 +256,6 @@ public class ScriptManager { } } + + + diff --git a/src/main/resources/init/NodeType.cnd b/src/main/resources/init/NodeType.cnd index 3d8e4b9..0cc5245 100644 --- a/src/main/resources/init/NodeType.cnd +++ b/src/main/resources/init/NodeType.cnd @@ -75,7 +75,7 @@ [nthl:readersSet] > nt:base + * (nthl:accountingEntryRead) -[nthl:workspaceItem] > mix:referenceable, mix:title, mix:lastModified, nt:hierarchyNode, mix:lockable +[nthl:workspaceItem] > mix:referenceable, mix:title, mix:lastModified, nt:hierarchyNode, mix:lockable, mix:shareable - hl:portalLogin (String) - hl:lastAction (String) mandatory - hl:oldRemotePath (String) @@ -164,20 +164,6 @@ [nthl:rootItemSentRequest] > nt:folder + * (nthl:itemSentRequest) = nthl:itemSentRequest - -[nthl:folderBulkCreator] > nt:base - - hl:folderId (String) mandatory - - hl:status (Long) - = '0' - mandatory autocreated - - hl:failures (Long) - = '0' - mandatory autocreated - - hl:requests (Long) mandatory - -[nthl:rootFolderBulkCreator] > nt:folder - + * (nthl:folderBulkCreator) - = nthl:folderBulkCreator [nthl:workspaceLeafItemContent] > nt:base @@ -187,7 +173,7 @@ = nt:unstructured autocreated -[nthl:file] > nt:resource +[nthl:file] > nt:resource , mix:versionable - hl:size (long) - hl:remotePath (String) - hl:storageId (String) @@ -218,6 +204,84 @@ - hl:title (string) - hl:producer (string) + + +[nthl:externalFile] > nthl:workspaceLeafItem + +[nthl:externalImage] > nthl:workspaceLeafItem + +[nthl:externalPdf] > nthl:workspaceLeafItem + +[nthl:externalLink] > nthl:workspaceLeafItem + - hl:value (String) mandatory + +// DUPLICATED, MUST BE CLEANED +[nthl:ExternalLink] > nthl:workspaceLeafItem + - hl:value (String) mandatory + +[nthl:gCubeItem] > nthl:workspaceItem + - hl:scopes (String) mandatory multiple + - hl:creator (String) mandatory + - hl:itemType (String) mandatory + - hl:properties (String) + - hl:isShared (Boolean) + - hl:sharedRootId (String) + + hl:property (nt:unstructured) + = nt:unstructured + autocreated + +[nthl:trashItem] > nthl:workspaceItem + - hl:name (String) + - hl:deletedBy (String) + - hl:originalParentId (String) + - hl:deletedFrom (String) + - hl:deletedTime (Date) + - hl:mimeType (String) + - hl:length (String) + - hl:isFolder (Boolean) + + + * (nthl:workspaceItem) + + +// TO REMOVE +[nthl:externalUrl] > nthl:workspaceLeafItem + +[nthl:query] > nthl:workspaceLeafItem + +[nthl:aquamapsItem] > nthl:workspaceLeafItem + +[nthl:timeSeriesItem] > nthl:workspaceLeafItem + +[nthl:report] > nthl:workspaceLeafItem + +[nthl:reportTemplate] > nthl:workspaceLeafItem + +[nthl:workflowReport] > nthl:workspaceLeafItem + +[nthl:workflowTemplate] > nthl:workspaceLeafItem + +[nthl:gCubeMetadata] > nthl:workspaceLeafItem + +[nthl:gCubeDocument] > nthl:workspaceLeafItem + +[nthl:gCubeDocumentLink] > nthl:workspaceLeafItem + +[nthl:gCubeImageDocumentLink] > nthl:workspaceLeafItem + +[nthl:gCubePDFDocumentLink] > nthl:workspaceLeafItem + +[nthl:gCubeImageDocument] > nthl:workspaceLeafItem + +[nthl:gCubePDFDocument] > nthl:workspaceLeafItem + +[nthl:gCubeURLDocument] > nthl:workspaceLeafItem + +[nthl:gCubeAnnotation] > nthl:workspaceLeafItem + +[nthl:externalResourceLink] > nthl:workspaceLeafItem + +[nthl:tabularDataLink] > nthl:workspaceLeafItem + [nthl:documentAlternativeLink] > nt:base - hl:parentUri (String) mandatory - hl:uri (String) mandatory @@ -316,70 +380,18 @@ [nthl:smartFolderContent] > nt:base - hl:query (String) mandatory - hl:folderId (String) - -[nthl:externalFile] > nthl:workspaceLeafItem - -[nthl:externalImage] > nthl:workspaceLeafItem - -[nthl:externalPdf] > nthl:workspaceLeafItem + +[nthl:folderBulkCreator] > nt:base + - hl:folderId (String) mandatory + - hl:status (Long) + = '0' + mandatory autocreated + - hl:failures (Long) + = '0' + mandatory autocreated + - hl:requests (Long) mandatory -[nthl:externalUrl] > nthl:workspaceLeafItem - -[nthl:query] > nthl:workspaceLeafItem - -[nthl:aquamapsItem] > nthl:workspaceLeafItem - -[nthl:timeSeriesItem] > nthl:workspaceLeafItem - -[nthl:report] > nthl:workspaceLeafItem - -[nthl:reportTemplate] > nthl:workspaceLeafItem - -[nthl:workflowReport] > nthl:workspaceLeafItem - -[nthl:workflowTemplate] > nthl:workspaceLeafItem - -[nthl:gCubeMetadata] > nthl:workspaceLeafItem - -[nthl:gCubeDocument] > nthl:workspaceLeafItem - -[nthl:gCubeDocumentLink] > nthl:workspaceLeafItem - -[nthl:gCubeImageDocumentLink] > nthl:workspaceLeafItem - -[nthl:gCubePDFDocumentLink] > nthl:workspaceLeafItem - -[nthl:gCubeImageDocument] > nthl:workspaceLeafItem - -[nthl:gCubePDFDocument] > nthl:workspaceLeafItem - -[nthl:gCubeURLDocument] > nthl:workspaceLeafItem - -[nthl:gCubeAnnotation] > nthl:workspaceLeafItem - -[nthl:externalResourceLink] > nthl:workspaceLeafItem - -[nthl:tabularDataLink] > nthl:workspaceLeafItem - -[nthl:gCubeItem] > nthl:workspaceItem - - hl:scopes (String) mandatory multiple - - hl:creator (String) mandatory - - hl:itemType (String) mandatory - - hl:properties (String) - - hl:isShared (Boolean) - - hl:sharedRootId (String) - + hl:property (nt:unstructured) - = nt:unstructured - autocreated - -[nthl:trashItem] > nthl:workspaceItem - - hl:name (String) - - hl:deletedBy (String) - - hl:originalParentId (String) - - hl:deletedFrom (String) - - hl:deletedTime (Date) - - hl:mimeType (String) - - hl:length (String) - - hl:isFolder (Boolean) - - + * (nthl:workspaceItem) \ No newline at end of file +[nthl:rootFolderBulkCreator] > nt:folder + + * (nthl:folderBulkCreator) + = nthl:folderBulkCreator + \ No newline at end of file diff --git a/src/test/java/org/gcube/data/access/fs/external/CreateUsers.java b/src/test/java/org/gcube/data/access/fs/external/CreateUsers.java index eea1716..ded638c 100644 --- a/src/test/java/org/gcube/data/access/fs/external/CreateUsers.java +++ b/src/test/java/org/gcube/data/access/fs/external/CreateUsers.java @@ -1,11 +1,24 @@ package org.gcube.data.access.fs.external; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.net.URI; import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.stream.Collectors; import org.gcube.common.security.providers.SecretManagerProvider; import org.gcube.common.security.secrets.CredentialSecret; +import org.gcube.common.storagehub.client.dsl.FolderContainer; import org.gcube.common.storagehub.client.dsl.StorageHubClient; +import org.gcube.common.storagehub.model.acls.AccessType; +import org.gcube.common.storagehub.model.exceptions.StorageHubException; +import org.gcube.common.storagehub.model.items.SharedFolder; +import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -17,8 +30,13 @@ public class CreateUsers { private static Logger log = LoggerFactory.getLogger(CreateUsers.class); + private String user ="lucio.lelii"; + private String user2 ="pippo.test"; + private String vreWA ="vre-write-all"; + private String vreRO ="vre-read-only"; + private String vreWO ="vre-write-owner"; - + @BeforeClass public static void before() throws Exception{ String address = "localhost"; int port = 8081; @@ -26,17 +44,157 @@ public class CreateUsers { client = new StorageHubClient(storagehubUri); } + + + + @Before public void setSecret() { CredentialSecret secret = new CredentialSecret("sg4-test-client", "a156a7db-3b32-4cd5-b27b-2488e0e01698", "/gcube"); SecretManagerProvider.instance.set(secret); } + @Test + public void createAccountforManging() throws Exception{ + client.createUserAccount("service-account-sg4-test-client"); + client.getVreFolderManager(vreWA).addUser("service-account-sg4-test-client"); + client.getVreFolderManager(vreRO).addUser("service-account-sg4-test-client"); + client.getVreFolderManager(vreWO).addUser("service-account-sg4-test-client"); + } + + @Test + public void getUserRootId() throws Exception{ + client.impersonate(user); + System.out.println(client.getWSRoot().getId()); + } + + @Test + public void getBearerToken() { + System.out.println(SecretManagerProvider.instance.get().getHTTPAuthorizationHeaders()); + } + @Test public void createUser() throws Exception{ - - //client.createUserAccount("lucio.lelii"); - client.impersonate("lucio.lelii"); - client.getWSRoot(); + client.createUserAccount(user); + } + + @Test + public void removeUserFromGroup() throws Exception{ + client.getVreFolderManager(vreWA).removeAdmin(user); + client.getVreFolderManager(vreWA).removeUser(user); } + + @Test + public void addUserToVREs() throws Exception{ + client.getVreFolderManager(vreWA).createVRE(AccessType.WRITE_ALL, user); + client.getVreFolderManager(vreWA).setAdmin(user); + client.getVreFolderManager(vreRO).createVRE(AccessType.READ_ONLY, user); + client.getVreFolderManager(vreRO).setAdmin(user); + client.getVreFolderManager(vreWO).createVRE(AccessType.WRITE_OWNER, user); + client.getVreFolderManager(vreWO).setAdmin(user); + } + + @Test + public void createUser2() throws Exception{ + client.impersonate(user); + client.createUserAccount(user2); + client.getVreFolderManager(vreWA).addUser(user2); + client.getVreFolderManager(vreRO).addUser(user2); + client.getVreFolderManager(vreWO).addUser(user2); + } + + @Test + public void printVREFoldersAdmin() throws StorageHubException{ + List vreFolders = client.getVREFolders().getContainers().stream().map(c -> ((FolderContainer) c)).collect(Collectors.toList()); + for (FolderContainer fc : vreFolders) { + System.out.println(fc.get().getTitle()); + System.out.println(fc.getAcls()); + System.out.println(client.getVreFolderManager(fc.get().getTitle()).getAdmins()); + } + } + + @Test + public void getVREs() throws Exception{ + client.impersonate(user); + client.getVREFolders().getItems().stream().map(i -> ((SharedFolder) i)).forEach(s -> System.out.println(s.getDisplayName())); + } + + @Test + public void getWsRoot() throws Exception{ + client.impersonate(user); + client.getWSRoot().list().getItems().forEach(i -> System.out.println(i.getId()+" "+i.getTitle())); + } + + @Test + public void download() throws Exception{ + client.impersonate(user); + try ( InputStream is = client.open("5b5236d2-ec88-49f2-a2c5-04ecf8284191").asFile().download().getStream()){ + String text = new BufferedReader( + new InputStreamReader(is, StandardCharsets.UTF_8)) + .lines() + .collect(Collectors.joining("\n")); + System.out.println(text); + } + } + + @Test + public void uploadFile() { + client.impersonate(user); + try (InputStream is = CreateUsers.class.getResourceAsStream("/test1.jpg")){ + client.getWSRoot().uploadFile(is, "test1.jpg", "a test"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private FolderContainer retrieveVREbyName(String name) throws StorageHubException { + List vreFolders = client.getVREFolders().getContainers().stream().map(c -> ((FolderContainer) c)).collect(Collectors.toList()); + return vreFolders.stream().filter(c -> ((SharedFolder)c.get()).getDisplayName().equals(name)).findFirst().get(); + } + + @Test + public void uploadFileToVREWriteAll() throws StorageHubException{ + client.impersonate(user2); + try (InputStream is = CreateUsers.class.getResourceAsStream("/test1.jpg")){ + retrieveVREbyName(vreWA).uploadFile(is, "test1.jpg", "a test"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Test(expected = StorageHubException.class) + public void uploadFileToVREReadOnly() throws StorageHubException{ + client.impersonate(user2); + try (InputStream is = CreateUsers.class.getResourceAsStream("/test1.jpg")){ + retrieveVREbyName(vreRO).uploadFile(is, "test1.jpg", "a test"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Test + public void uploadFileToVREReadOnlyAdmin() throws StorageHubException{ + client.impersonate(user); + try (InputStream is = CreateUsers.class.getResourceAsStream("/test1.jpg")){ + retrieveVREbyName(vreRO).uploadFile(is, "test1.jpg", "a test"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Test + public void uploadFileToVREWriteOwner() throws StorageHubException{ + client.impersonate(user2); + try (InputStream is = CreateUsers.class.getResourceAsStream("/test1.jpg")){ + retrieveVREbyName(vreWO).uploadFile(is, "test1.jpg", "a test"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Test + public void removeUser() throws Exception{ + client.deleteUserAccount(user); + } + } diff --git a/src/test/resources/test1.jpg b/src/test/resources/test1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..492e63a0355bb276db3486971cbca4eed9d06431 GIT binary patch literal 66160 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 OF@|TNqI*m3^JF=ZV&ninrT&NYcItlbXBij1 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 literal 0 HcmV?d00001