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 0000000..492e63a Binary files /dev/null and b/src/test/resources/test1.jpg differ