Compare commits

..

1 Commits

Author SHA1 Message Date
Luca Frosini 8da630591d Migrating to smartgears 4 2022-11-16 12:36:03 +01:00
8 changed files with 102 additions and 210 deletions

2
.gitignore vendored
View File

@ -2,5 +2,3 @@ target
.classpath
.project
.settings
/.DS_Store
/bin/

View File

@ -2,16 +2,14 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
# Changelog for StorageHub Application Persistence
## [v3.3.0]
- Added GENERATING_APPLICATION_NAME and GENERATING_APPLICATION_METADATA_VERSION to be used in Metadata
## [v4.0.0-SNAPSHOT]
- Library migrated to Smartgears 4
## [v3.2.0]
- Added dependency to be able to compile with JDK 11
## [v3.1.0]
- Enhanced range of storagehub-client-library to 2.0.0,3.0.0-SNAPSHOT [#22777]

17
pom.xml
View File

@ -10,7 +10,7 @@
<groupId>org.gcube.data-publishing</groupId>
<artifactId>storagehub-application-persistence</artifactId>
<version>3.3.0</version>
<version>4.0.0-SNAPSHOT</version>
<name>StorageHub Application Persistence</name>
<description>
This library allows any application to persist in its workspace home any
@ -37,7 +37,7 @@
<dependency>
<groupId>org.gcube.distribution</groupId>
<artifactId>gcube-bom</artifactId>
<version>2.4.0</version>
<version>3.0.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
@ -54,8 +54,7 @@
</dependency>
<dependency>
<groupId>org.gcube.common</groupId>
<artifactId>authorization-utils</artifactId>
<version>[2.2.0, 3.0.0-SNAPSHOT)</version>
<artifactId>common-security</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
@ -75,5 +74,15 @@
<artifactId>logback-classic</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.gcube.common</groupId>
<artifactId>keycloak-client</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.gcube.common.security</groupId>
<artifactId>gcube-secrets</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -1,44 +1,9 @@
package org.gcube.storagehub;
import java.util.HashMap;
import java.util.Map;
import org.gcube.common.storagehub.model.Metadata;
/**
* @author Luca Frosini (ISTI - CNR)
*/
public abstract class MetadataMatcher {
public interface MetadataMatcher {
public static final String GENERATING_METADATA_NAME = "Generating Metadata Name";
public static final String GENERATING_METADATA_VERSION = "Generating Metadata Version";
protected final String metadataName;
protected final String metadataVersion;
protected final String id;
protected MetadataMatcher(String metadataName, String metadataVersion, String id) {
this.metadataName = metadataName;
this.metadataVersion = metadataVersion;
this.id = id;
}
public abstract boolean check(Metadata metadata);
protected Map<String,Object> getBaseMetadataMap() {
Map<String,Object> map = new HashMap<>();
map.put(MetadataMatcher.GENERATING_METADATA_NAME, metadataName);
map.put(MetadataMatcher.GENERATING_METADATA_VERSION, metadataVersion);
return map;
}
protected abstract Map<String,Object> getSpecificMetadataMap();
public Metadata getMetadata() {
Map<String, Object> map = getBaseMetadataMap();
map.putAll(getSpecificMetadataMap());
Metadata metadata = new Metadata(map);
return metadata;
}
public boolean check(Metadata metadata);
}

View File

@ -5,10 +5,10 @@ import java.io.StringWriter;
import java.net.URL;
import java.util.List;
import org.gcube.common.authorization.utils.manager.SecretManager;
import org.gcube.common.authorization.utils.manager.SecretManagerProvider;
import org.gcube.common.scope.impl.ScopeBean;
import org.gcube.common.scope.impl.ScopeBean.Type;
import org.gcube.common.security.ContextBean;
import org.gcube.common.security.ContextBean.Type;
import org.gcube.common.security.providers.SecretManagerProvider;
import org.gcube.common.security.secrets.Secret;
import org.gcube.common.storagehub.client.dsl.ContainerType;
import org.gcube.common.storagehub.client.dsl.FileContainer;
import org.gcube.common.storagehub.client.dsl.FolderContainer;
@ -37,7 +37,7 @@ public class StorageHubManagement {
storageHubClient = new StorageHubClient();
}
public void setMetadataMatcher(MetadataMatcher checkMetadata) {
public void setCheckMetadata(MetadataMatcher checkMetadata) {
this.metadataMatcher = checkMetadata;
}
@ -53,8 +53,14 @@ public class StorageHubManagement {
ListResolverTyped listResolverTyped = folder.list();
List<ItemContainer<? extends Item>> containers = listResolverTyped.includeHidden().getContainers();
for(ItemContainer<? extends Item> itemContainer : containers) {
Item item = itemContainer.get();
String name = item.getName();
ContainerType containerType = itemContainer.getType();
logItem(itemContainer, level);
StringWriter indent = new StringWriter(level + 1);
for(int i = 0; i < level + 1; i++) {
indent.append('-');
}
logger.debug("{} {} {} (ID:{}) {}", indent.toString(), containerType, name, itemContainer.getId(), item.isHidden() ? " (hidden)" : "");
switch(containerType) {
case FOLDER:
FolderContainer folderContainer = (FolderContainer) itemContainer;
@ -102,8 +108,8 @@ public class StorageHubManagement {
protected FolderContainer getContextFolder() throws Exception {
FolderContainer destinationFolder = getWorkspaceRoot();
String currentContext = SecretManagerProvider.instance.get().getContext();
ScopeBean scopeBean = new ScopeBean(currentContext);
switch(scopeBean.type()) {
ContextBean contextBean = new ContextBean(currentContext);
switch(contextBean.type()) {
case INFRASTRUCTURE:
case VO:
String folderName = currentContext.replaceFirst("/", "").replace("/", "_");
@ -123,11 +129,11 @@ public class StorageHubManagement {
public FolderContainer getApplicationFolder() throws Exception {
FolderContainer destinationFolder = getContextFolder();
SecretManager secretManager = SecretManagerProvider.instance.get();
String currentContext = secretManager.getContext();
ScopeBean scopeBean = new ScopeBean(currentContext);
if(scopeBean.is(Type.VRE)) {
String username = secretManager.getUser().getUsername();
Secret secret = SecretManagerProvider.instance.get();
String currentContext = secret.getContext();
ContextBean contextBean = new ContextBean(currentContext);
if(contextBean.is(Type.VRE)) {
String username = secret.getOwner().getId();
destinationFolder = getOrCreateFolder(destinationFolder, username, "Folder Created for user/application", true);
}
return destinationFolder;
@ -155,34 +161,20 @@ public class StorageHubManagement {
return false;
}
protected void logItem(ItemContainer<? extends Item> itemContainer) {
logItem(itemContainer, 0);
}
protected void logItem(ItemContainer<? extends Item> itemContainer, int level) {
StringWriter indent = new StringWriter(level + 1);
for(int i = 0; i < level+1; i++) {
indent.append('-');
}
indent.append(" ");
Item item = itemContainer.get();
logger.debug("{}{} {} (ID:{}){}", indent.toString(), itemContainer.getType(), item.getName(), itemContainer.getId(), item.isHidden() ? " (hidden)" : "");
}
protected void tree(FolderContainer folderContainer) throws Exception {
logItem(folderContainer,0);
recursiveList(folderContainer, 1);
logger.debug("{} (ID:{})", folderContainer.get().getName(), folderContainer.getId());
recursiveList(folderContainer, 0);
}
public URL persistFile(InputStream inputStream, String fileName, String mimeType)
public URL persistFile(InputStream inputStream, String fileName, String mimeType, Metadata metadata)
throws Exception {
this.mimeType = mimeType;
FolderContainer destinationFolder = getDestinationFolder(mimeType);
persitedFile = destinationFolder.uploadFile(inputStream, fileName,
"This file has been created to ensure persistence");
if(metadataMatcher != null) {
persitedFile.setMetadata(metadataMatcher.getMetadata());
if(metadata != null) {
persitedFile.setMetadata(metadata);
}
URL finalURL = persitedFile.getPublicLink();
@ -197,27 +189,20 @@ public class StorageHubManagement {
for(ItemContainer<? extends Item> itemContainer : itemContainers) {
if(itemContainer.getType()==ContainerType.FILE) {
if(isPersistedFile((FileContainer) itemContainer, filename)) {
logger.debug("The file with mimetype {} and name {} was found in the expected folder (i.e. id:{}, path:{}) and the check on metadata succeded. The file is the one expected.",
mimeType, filename, destinationFolder.getId(), destinationFolder.get().getPath());
this.persitedFile = (FileContainer) itemContainer;
return this.persitedFile;
}else {
logger.warn("The file with mimetype {} and name {} was found in the expected folder (i.e. id:{}, path:{}) but the check on metadata failed. The file is not the one expected.",
mimeType, filename, destinationFolder.getId(), destinationFolder.get().getPath());
}
}
}
logger.warn("Unable to find file with mimetype {} and name {} in the expected folder (i.e. id:{}, path:{})",
mimeType, filename, destinationFolder.getId(), destinationFolder.get().getPath());
return null;
return this.persitedFile;
}
public void removePersistedFile(String filename, String mimeType) throws Exception {
persitedFile = getPersistedFile(filename, mimeType);
if(persitedFile !=null) {
logger.info("Persited file with mimetype {} and name {} was found. Goign to remove it.", mimeType, filename);
persitedFile.delete();
getPersistedFile(filename, mimeType);
if(this.persitedFile !=null) {
this.persitedFile.delete();
}
}
}

View File

@ -7,105 +7,67 @@ import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.gcube.common.authorization.utils.manager.SecretManager;
import org.gcube.common.authorization.utils.manager.SecretManagerProvider;
import org.gcube.common.authorization.utils.secret.JWTSecret;
import org.gcube.common.authorization.utils.secret.Secret;
import org.gcube.common.authorization.utils.secret.SecretUtility;
import org.gcube.common.keycloak.KeycloakClientFactory;
import org.gcube.common.keycloak.model.TokenResponse;
import org.gcube.common.security.providers.SecretManagerProvider;
import org.gcube.common.security.secrets.AccessTokenSecret;
import org.gcube.common.security.secrets.Secret;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Luca Frosini (ISTI - CNR)
*/
public class ContextTest {
private static final Logger logger = LoggerFactory.getLogger(ContextTest.class);
protected static Properties properties;
protected static final String PROPERTIES_FILENAME = "token.properties";
protected static final String CONFIG_INI_FILENAME = "config.ini";
public static final String GCUBE;
public static final String DEVNEXT;
public static final String NEXTNEXT;
public static final String DEVSEC;
public static final String DEVVRE;
public static final String ROOT;
protected static final Properties properties;
protected static final String CLIENT_ID_PROPERTY_KEY = "clientId";
public static final String ROOT;
public static final String VO;
public static final String VRE;
static {
GCUBE = "/gcube";
DEVNEXT = GCUBE + "/devNext";
NEXTNEXT = DEVNEXT + "/NextNext";
DEVSEC = GCUBE + "/devsec";
DEVVRE = DEVSEC + "/devVRE";
ROOT = GCUBE;
properties = new Properties();
InputStream input = ContextTest.class.getClassLoader().getResourceAsStream(CONFIG_INI_FILENAME);
InputStream input = ContextTest.class.getClassLoader().getResourceAsStream(PROPERTIES_FILENAME);
try {
// load the properties file
properties.load(input);
} catch (IOException e) {
} catch(IOException e) {
throw new RuntimeException(e);
}
// DEFAULT_TEST_SCOPE_NAME = "/pred4s/preprod/preVRE";
// DEFAULT_TEST_SCOPE_NAME = "/gcube/devsec/devVRE";
ROOT = "/gcube";
VO = ROOT + "/devsec";
VRE = VO + "/devVRE";
// VO = ROOT + "/devNext";
// VRE = VO + "/NextNext";
}
public static void set(Secret secret) throws Exception {
SecretManagerProvider.instance.reset();
SecretManager secretManager = new SecretManager();
secretManager.addSecret(secret);
SecretManagerProvider.instance.set(secretManager);
SecretManagerProvider.instance.get().set();
public static void setContextBySecret(Secret secret) throws Exception {
SecretManagerProvider.instance.set(secret);
}
public static void setContextByName(String fullContextName) throws Exception {
Secret secret = getSecretByContextName(fullContextName);
set(secret);
setContextBySecret(secret);
}
private static TokenResponse getJWTAccessToken(String context) throws Exception {
String clientId = properties.getProperty(CLIENT_ID_PROPERTY_KEY);
int index = context.indexOf('/', 1);
String root = context.substring(0, index == -1 ? context.length() : index);
String clientSecret = properties.getProperty(root);
TokenResponse tr = KeycloakClientFactory.newInstance().queryUMAToken(context, clientId, clientSecret, context, null);
return tr;
private static Secret getSecretByContextName(String fullContextName) throws Exception {
String clientID = "";
String clientSecret = ContextTest.properties.getProperty(fullContextName);
TokenResponse tokenResponse = KeycloakClientFactory.newInstance().queryUMAToken(fullContextName, clientID, clientSecret, fullContextName, null);
return new AccessTokenSecret(tokenResponse.getAccessToken());
}
public static Secret getSecretByContextName(String context) throws Exception {
TokenResponse tr = getJWTAccessToken(context);
Secret secret = new JWTSecret(tr.getAccessToken());
return secret;
}
public static void setContext(String token) throws Exception {
Secret secret = getSecret(token);
set(secret);
}
private static Secret getSecret(String token) throws Exception {
Secret secret = SecretUtility.getSecretByTokenString(token);
return secret;
}
@BeforeClass
public static void beforeClass() throws Exception {
setContextByName(GCUBE);
setContextByName(VRE);
}
@AfterClass

View File

@ -1,6 +1,5 @@
package org.gcube.storagehub;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -14,7 +13,6 @@ import org.gcube.common.storagehub.client.dsl.OpenResolver;
import org.gcube.common.storagehub.model.Metadata;
import org.gcube.common.storagehub.model.items.Item;
import org.gcube.common.storagehub.model.service.Version;
import org.junit.Ignore;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -35,67 +33,44 @@ public class StorageHubManagementTest extends ContextTest {
StorageHubManagement storageHubManagement = new StorageHubManagement();
@SuppressWarnings("unused")
OpenResolver openResolver = storageHubManagement.storageHubClient.open("");
// openResolver.asItem().delete();
/*
openResolver = storageHubManagement.storageHubClient.open("656cd713-bd79-4659-abd6-9f1baaedb5bc");
openResolver.asItem().delete();
openResolver = storageHubManagement.storageHubClient.open("");
openResolver.asItem().delete();
openResolver = storageHubManagement.storageHubClient.open("");
openResolver.asItem().delete();
openResolver = storageHubManagement.storageHubClient.open("");
openResolver = storageHubManagement.storageHubClient.open("bd44d81e-0e2f-4527-b634-2e26e8908f36");
openResolver.asItem().delete();
*/
}
// @Ignore
@Test
public void listFolders() throws Exception {
List<String> contexts = new ArrayList<>();
// contexts.add(GCUBE);
// contexts.add(DEVSEC);
contexts.add(DEVVRE);
// contexts.add(DEVNEXT);
// contexts.add(NEXTNEXT);
for(String context : contexts) {
ContextTest.setContextByName(context);
StorageHubManagement storageHubManagement = new StorageHubManagement();
// FolderContainer root = storageHubManagement.getWorkspaceRoot();
// storageHubManagement.tree(root);
FolderContainer contextFolder = storageHubManagement.getContextFolder();
// storageHubManagement.tree(contextFolder);
ListResolverTyped listResolverTyped = contextFolder.list();
List<ItemContainer<? extends Item>> containers = listResolverTyped.includeHidden().getContainers();
for(ItemContainer<? extends Item> itemContainer : containers) {
Item item = itemContainer.get();
String name = item.getName();
ContainerType containerType = itemContainer.getType();
if(containerType==ContainerType.FOLDER) {
if(name.compareTo(".catalogue")==0 || name.compareTo("service-account-gcat")==0 || name.compareTo("service-account-grsf-publisher")==0) {
logger.info("Catalogue folder found");
storageHubManagement.tree((FolderContainer) itemContainer);
// if(name.compareTo("service-account-grsf-publisher")==0) {
// itemContainer.delete();
// }
}else {
storageHubManagement.logItem(itemContainer);
// storageHubManagement.tree((FolderContainer) itemContainer);
}
}
StorageHubManagement storageHubManagement = new StorageHubManagement();
@SuppressWarnings("unused")
FolderContainer root = storageHubManagement.getWorkspaceRoot();
FolderContainer contextFolder = storageHubManagement.getContextFolder();
ListResolverTyped listResolverTyped = contextFolder.list();
List<ItemContainer<? extends Item>> containers = listResolverTyped.includeHidden().getContainers();
for(ItemContainer<? extends Item> itemContainer : containers) {
Item item = itemContainer.get();
String name = item.getName();
ContainerType containerType = itemContainer.getType();
if(containerType==ContainerType.FOLDER && name.compareTo(".catalogue")==0) {
itemContainer.delete();
}
}
// FolderContainer dstFolder = storageHubManagement.getDestinationFolder("application/pdf");
// storageHubManagement.tree(root);
// storageHubManagement.tree(contextFolder);
// storageHubManagement.tree(dstFolder);
}
@Test
public void getFileInfo() throws Exception {
StorageHubManagement storageHubManagement = new StorageHubManagement();
String id = "";
String id = "3daf465b-b84e-4d1c-9786-a388a267382c";
OpenResolver openResolver = storageHubManagement.storageHubClient.open(id);
FileContainer fileContainer = (FileContainer) openResolver.asFile();
storageHubManagement.logItem(fileContainer);
logger.debug("StorageHub ID {} - File Name {}", id, fileContainer.get().getName());
/*
ListResolver listResolver = fileContainer.getAnchestors();
@ -118,16 +93,18 @@ public class StorageHubManagementTest extends ContextTest {
@Test
public void getFileInfoViaDirectoryListing() throws Exception {
StorageHubManagement storageHubManagement = new StorageHubManagement();
String id = "";
String id = "22bd9034-1da0-45ac-868f-91d1e5438344";
OpenResolver openResolver = storageHubManagement.storageHubClient.open(id);
FolderContainer folderContainer = (FolderContainer) openResolver.asFolder();
String filename = "";
String filename = "56a55300-9272-4c12-9ac8-ff61411a5976";
ListResolver listResolver = folderContainer.findByName(filename);
List<ItemContainer<? extends Item>> itemContainers = listResolver.withMetadata().getContainers();
for(ItemContainer<? extends Item> itemContainer : itemContainers) {
FileContainer fileContainer = (FileContainer) itemContainer;
storageHubManagement.logItem(fileContainer);
logger.debug("StorageHub ID {} - File Name {}", id, fileContainer.get().getName());
/*
ListResolver listResolver = fileContainer.getAnchestors();
@ -146,7 +123,6 @@ public class StorageHubManagementTest extends ContextTest {
logger.debug("Version {} {}", version.getId(), version.getName());
}
}
}
}

View File

@ -1,3 +1,2 @@
/*.gcubekey
/*.properties
/config.ini