From f96ca0de942555436b18fc1675f7cc586b6cd557 Mon Sep 17 00:00:00 2001 From: Luca Frosini Date: Wed, 12 Feb 2020 10:57:39 +0100 Subject: [PATCH] Added test to save and restore profiles --- pom.xml | 3 +- .../gcat/client/SaveAndRestoreProfiles.java | 217 ++++++++++++++++++ 2 files changed, 218 insertions(+), 2 deletions(-) create mode 100644 src/test/java/org/gcube/gcat/client/SaveAndRestoreProfiles.java diff --git a/pom.xml b/pom.xml index 7ef596d..d84b7a3 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ org.gcube.data-publishing gcat-client - 1.2.1 + 1.2.2-SNAPSHOT gCube Catalogue (gCat) Client gCube Catalogue (gCat) Client is a library designed to interact with gCat Service exposed REST API @@ -74,7 +74,6 @@ ch.qos.logback logback-classic - 1.2.3 test diff --git a/src/test/java/org/gcube/gcat/client/SaveAndRestoreProfiles.java b/src/test/java/org/gcube/gcat/client/SaveAndRestoreProfiles.java new file mode 100644 index 0000000..9b4cf53 --- /dev/null +++ b/src/test/java/org/gcube/gcat/client/SaveAndRestoreProfiles.java @@ -0,0 +1,217 @@ +package org.gcube.gcat.client; + +import static org.gcube.common.authorization.client.Constants.authorizationService; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.authorization.library.provider.UserInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class SaveAndRestoreProfiles { + + private static Logger logger = LoggerFactory.getLogger(SaveAndRestoreProfiles.class); + + public static final String DIRECTORY_PATH = "."; + public static final String USERNAME = "luca.frosini"; + public static final String SAVED_TOKEN_FILE = "generated-token.properties"; + public static final String PROFILE_LIST_FILE = "profiles.json"; + public static final String PROFILE_FILE_EXTENSION = ".xml"; + + public static final String GCAT_URL_STRING = "https://gcat.d4science.org/gcat"; + + public List getContexts(){ + List contexts = new ArrayList<>(); + //contexts.add("/d4science.research-infrastructures.eu/D4Research/AGINFRAplus"); + //contexts.add("/d4science.research-infrastructures.eu/D4Research/AGINFRAplus4BioCos"); + //contexts.add("/d4science.research-infrastructures.eu/D4Research/AGINFRAplusDev"); + //contexts.add("/d4science.research-infrastructures.eu/FARM/AGINFRAplusShowcase"); + //contexts.add("/d4science.research-infrastructures.eu/D4Research/AgroClimaticModeling_trial"); + //contexts.add("/d4science.research-infrastructures.eu/D4Research/AgroClimaticModelling"); + //contexts.add("/d4science.research-infrastructures.eu/D4Research/DEMETER"); + //contexts.add("/d4science.research-infrastructures.eu/D4Research/DEMETER_trial"); + //contexts.add("/d4science.research-infrastructures.eu/FARM/EMPHASIS"); + //contexts.add("/d4science.research-infrastructures.eu/D4Research/FMJ_Lab"); + //contexts.add("/d4science.research-infrastructures.eu/D4Research/FoodSecurity"); + //contexts.add("/d4science.research-infrastructures.eu/D4Research/FoodborneOutbreak"); + //contexts.add("/d4science.research-infrastructures.eu/D4Research/NitrogenScrumLab"); + //contexts.add("/d4science.research-infrastructures.eu/D4Research/ORIONKnowledgeHub"); + //contexts.add("/d4science.research-infrastructures.eu/D4Research/RAKIP_portal"); + //contexts.add("/d4science.research-infrastructures.eu/D4Research/RAKIP_trial"); + return contexts; + } + + // @Test + public void restoreProfiles() throws Exception { + List contexts = getContexts(); + + String username = USERNAME; + for(String context : contexts) { + UserInfo userInfo = new UserInfo(username, new ArrayList<>()); + String userToken = authorizationService().generateUserToken(userInfo, context); + logger.info("Token for {} for context {} is {}", username, context, userToken); + SecurityTokenProvider.instance.set(userToken); + + logger.debug("---------------------------------------------------------------------"); + logger.debug("Elaborating Context {}", context); + try { + restoreProfiles(context, false); + }catch (Exception e) { + logger.error("An error occurred while elaborating profiles from context {}", context, e); + } + logger.debug("---------------------------------------------------------------------"); + logger.debug("\n\n\n\n"); + } + + } + + private void restoreProfiles(String context, boolean restore) throws Exception { + File contextDirectory = new File(DIRECTORY_PATH, context.replaceAll("/", "_")); + if(!contextDirectory.exists()) { + throw new Exception(contextDirectory.getAbsolutePath() + " directory does not exists"); + } + + ObjectMapper mapper = new ObjectMapper(); + JavaType arrayType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, String.class); + + File profileListFile = new File(contextDirectory, PROFILE_LIST_FILE); + if(!profileListFile.exists()) { + throw new Exception(profileListFile.getAbsolutePath() + " file does not exists"); + } + String profilesString = readFile(profileListFile); + + List profiles = mapper.readValue(profilesString, arrayType); + logger.debug("Got Profiles in context {} are {}\n", context, profiles); + + Profile profile = new Profile(new URL(GCAT_URL_STRING)); + + for(String name : profiles) { + File profileFile = new File(contextDirectory, name+PROFILE_FILE_EXTENSION); + String xmlProfile = readFile(profileFile); + logger.debug("Restoring Profile {} for context {}\n", name, context); + + try { + if(restore) { + profile.create(name, xmlProfile); + } + }catch (Exception e) { + logger.error("Unable to restore Profile {} for context {}", name, context); + } + } + + + } + + private String readFile(File profileListFile) throws Exception { + StringBuffer stringBuffer = new StringBuffer(); + try(BufferedReader br = new BufferedReader(new FileReader(profileListFile))) { + for(String line; (line = br.readLine()) != null; ) { + stringBuffer.append(line); + } + } catch (Exception e) { + throw e; + } + return stringBuffer.toString(); + } + + //@Test + public void removeProfiles() throws Exception { + + List contexts = getContexts(); + + File directory = new File(DIRECTORY_PATH); + if(!directory.exists()) { + directory.mkdirs(); + } + File tokenFiles = new File(directory, SAVED_TOKEN_FILE); + + String username = USERNAME; + for(String context : contexts) { + + UserInfo userInfo = new UserInfo(username, new ArrayList<>()); + String userToken = authorizationService().generateUserToken(userInfo, context); + logger.info("Token for {} for context {} is {}", username, context, userToken); + SecurityTokenProvider.instance.set(userToken); + writeOnFile(tokenFiles, context+"="+userToken); + + + logger.debug("---------------------------------------------------------------------"); + logger.debug("Elaborating Context {}", context); + try { + getAndSaveProfiles(context, false); + }catch (Exception e) { + logger.error("An error occurred while elaborating profiles from context {}", context); + } + logger.debug("---------------------------------------------------------------------"); + logger.debug("\n\n\n\n"); + + } + + } + + protected void writeOnFile(File file, String content) throws Exception { + try(FileWriter fw = new FileWriter(file, true); + BufferedWriter bw = new BufferedWriter(fw); + PrintWriter out = new PrintWriter(bw)) { + out.println(content); + out.flush(); + } catch(IOException e) { + throw e; + } + } + + private void getAndSaveProfiles(String context, boolean delete) throws Exception { + File contextDirectory = new File(DIRECTORY_PATH, context.replaceAll("/", "_")); + if(!contextDirectory.exists()) { + contextDirectory.mkdirs(); + } + + ObjectMapper mapper = new ObjectMapper(); + JavaType arrayType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, String.class); + + Profile profile = new Profile(new URL(GCAT_URL_STRING)); + String profilesString = profile.list(); + File profileListFile = new File(contextDirectory, PROFILE_LIST_FILE); + if(profileListFile.exists()) { + profileListFile.delete(); + } + writeOnFile(profileListFile, profilesString); + + List profiles = mapper.readValue(profilesString, arrayType); + logger.debug("Got Profiles in context {} are {}\n", context, profiles); + + + for(String name : profiles) { + try { + String profileAsxml = profile.read(name); + File profileFile = new File(contextDirectory, name+PROFILE_FILE_EXTENSION); + if(profileFile.exists()) { + profileFile.delete(); + } + logger.debug("Saving Profile {} for context {}\n", name, context); + writeOnFile(profileFile, profileAsxml); + + }catch (Exception e) { + logger.error("Error while saving profile {}", name); + } + + if(delete) { + profile.delete(name); + } + } + } + +}