From 666238fc419fcf3fcc816ae847c1d21d41610d31 Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Wed, 17 Feb 2021 12:31:54 +0100 Subject: [PATCH] merged with branch task_20728 --- CHANGELOG.md | 24 ++++++++ pom.xml | 19 +++++-- .../manage/GRSFNotificationService.java | 32 +++++------ .../manage/GRSFUpdaterServiceClient.java | 13 ++--- .../server/manage/SocialCommunications.java | 24 ++++---- .../server/manage/Utils.java | 55 ++++++++++--------- .../client/SendNotification.java | 19 +++---- 7 files changed, 107 insertions(+), 79 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..539d9b7 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,24 @@ + +# Changelog + +All notable changes to this project will be documented in this file. +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [v1.5.0-SNAPSHOT] - 2021-02-17 + +[#20728] Migrate to catalogue-util-library + + +## [v1.4.2-SNAPSHOT] - 2021-02-17 + +[#19500] Migrate to git/jenkins + + +## [v1.4.1] - 2020-18-06 + +[#19500] Migrate to git/jenkins + + +## [v1.0.0] - 2017-26-01 + +First release diff --git a/pom.xml b/pom.xml index fda0c1c..d1d59d2 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ org.gcube.portlets.widgets grsf-manage-widget - 1.4.2-SNAPSHOT + 1.5.0-SNAPSHOT gCube GRSF Manage widget @@ -111,12 +111,21 @@ usermanagement-core provided + + + + + + + + - org.gcube.data-catalogue - ckan-util-library - [2.0.0, 3.0.0-SNAPSHOT) + org.gcube.datacatalogue + catalogue-util-library + [1.0.0-SNAPSHOT, 2.0.0) compile + org.gcube.core common-scope-maps @@ -179,7 +188,7 @@ compile - + diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/GRSFNotificationService.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/GRSFNotificationService.java index 0d9c572..97b63a4 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/GRSFNotificationService.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/GRSFNotificationService.java @@ -8,12 +8,11 @@ import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.portal.PortalContext; import org.gcube.common.scope.api.ScopeProvider; -import org.gcube.datacatalogue.ckanutillibrary.server.DataCatalogue; -import org.gcube.datacatalogue.ckanutillibrary.server.DataCatalogueFactory; -import org.gcube.datacatalogue.ckanutillibrary.server.utils.CatalogueUtilMethods; import org.gcube.datacatalogue.common.Constants; import org.gcube.datacatalogue.common.enums.Product_Type; import org.gcube.datacatalogue.common.enums.Sources; @@ -27,6 +26,12 @@ import org.gcube.datacatalogue.grsf_manage_widget.shared.SimilarGRSFRecord; import org.gcube.datacatalogue.grsf_manage_widget.shared.SourceRecord; import org.gcube.datacatalogue.grsf_manage_widget.shared.ex.GRSFRecordAlreadyManagedStatusException; import org.gcube.datacatalogue.grsf_manage_widget.shared.ex.NoGRSFRecordException; +import org.gcube.datacatalogue.utillibrary.server.DataCatalogue; +import org.gcube.datacatalogue.utillibrary.server.DataCatalogueFactory; +import org.gcube.datacatalogue.utillibrary.server.utils.CatalogueUtilMethods; +import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanDataset; +import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanPair; +import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanResource; import org.gcube.vomanagement.usermanagement.RoleManager; import org.gcube.vomanagement.usermanagement.impl.LiferayRoleManager; import org.gcube.vomanagement.usermanagement.impl.LiferayUserManager; @@ -37,12 +42,6 @@ import com.google.gwt.user.server.rpc.RemoteServiceServlet; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; -import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.CloseableHttpClient; -import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.HttpClientBuilder; -import eu.trentorise.opendata.jackan.model.CkanDataset; -import eu.trentorise.opendata.jackan.model.CkanPair; -import eu.trentorise.opendata.jackan.model.CkanResource; - /** * Endpoint for sending update records information to GRSF KnowledgeBase. * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) @@ -190,8 +189,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS String scopePerCurrentUrl = Utils.getScopeFromClientUrl(getThreadLocalRequest()); DataCatalogue catalogue = getCatalogue(scopePerCurrentUrl); String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername(); - String apiKey = catalogue.getApiKeyFromUsername(username); - CkanDataset record = catalogue.getDataset(productIdentifier, apiKey); + CkanDataset record = catalogue.getDataset(productIdentifier,username); // it cannot be enabled in this case ... if(record == null) @@ -252,7 +250,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS if(similarGrsfRecordsAsStrings != null && !similarGrsfRecordsAsStrings.isEmpty()){ if(!similarGrsfRecordsAsStrings.get(0).equals(Constants.NO_SIMILAR_GRSF_RECORDS)){ for (String similarGRSFRecord : similarGrsfRecordsAsStrings) { - similarRecords.add(Utils.similarGRSFRecordFromJson(similarGRSFRecord, catalogue, apiKey, httpSession)); + similarRecords.add(Utils.similarGRSFRecordFromJson(similarGRSFRecord, catalogue, username, httpSession)); } } } @@ -267,7 +265,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS if(connectedBeanUrls != null && !connectedBeanUrls.isEmpty()){ if(!connectedBeanUrls.get(0).equals(Constants.NO_CONNECTED_RECORDS)){ for (String connectedBean : connectedBeanUrls) { - ConnectedBean builtBean = Utils.connectedBeanRecordFromUrl(connectedBean, catalogue, apiKey, httpSession); + ConnectedBean builtBean = Utils.connectedBeanRecordFromUrl(connectedBean, catalogue, username, httpSession); if(builtBean != null) connectedBeans.add(builtBean); } @@ -286,7 +284,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS if(exploitedResourcesUrls != null && !exploitedResourcesUrls.isEmpty()){ for (String exploited : exploitedResourcesUrls) { - ConnectedBean builtBean = Utils.connectedBeanRecordFromUrl(exploited, catalogue, apiKey, httpSession); + ConnectedBean builtBean = Utils.connectedBeanRecordFromUrl(exploited, catalogue, username, httpSession); if(builtBean != null) suggestedConnectionsByKnowledgeBase.add(builtBean); } @@ -437,7 +435,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS throw new Exception("This operation can no longer be reverted (link expired)!"); DataCatalogue catalogue = getCatalogue(context); - CkanDataset dataset = catalogue.getDataset(uuid, catalogue.getApiKeyFromUsername(username)); + CkanDataset dataset = catalogue.getDataset(uuid, username); Map extras = dataset.getExtrasAsHashMap(); String recordUrl = extras.get(Constants.ITEM_URL_FIELD); String currentStatus = extras.get(Constants.STATUS_OF_THE_GRSF_RECORD_CUSTOM_KEY); @@ -546,7 +544,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS String scopePerCurrentUrl = Utils.getScopeFromClientUrl(getThreadLocalRequest()); DataCatalogue catalogue = getCatalogue(scopePerCurrentUrl); String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername(); - CkanDataset dataset = catalogue.getDataset(id, catalogue.getApiKeyFromUsername(username)); + CkanDataset dataset = catalogue.getDataset(id,username); if(dataset == null) throw new Exception("A GRSF record with id " + id + " doesn't exist"); @@ -575,7 +573,7 @@ public class GRSFNotificationService extends RemoteServiceServlet implements GRS String scopePerCurrentUrl = Utils.getScopeFromClientUrl(getThreadLocalRequest()); DataCatalogue catalogue = getCatalogue(scopePerCurrentUrl); String username = Utils.getCurrentUser(getThreadLocalRequest()).getUsername(); - CkanDataset dataset = catalogue.getDataset(id, catalogue.getApiKeyFromUsername(username)); + CkanDataset dataset = catalogue.getDataset(id, username); if(dataset == null) throw new Exception("A record with id " + id + " doesn't exist"); diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/GRSFUpdaterServiceClient.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/GRSFUpdaterServiceClient.java index 570621a..73568ae 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/GRSFUpdaterServiceClient.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/GRSFUpdaterServiceClient.java @@ -6,14 +6,19 @@ import static org.gcube.resources.discovery.icclient.ICFactory.queryFor; import java.util.Iterator; import java.util.List; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.util.EntityUtils; import org.gcube.common.resources.gcore.ServiceEndpoint; import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint; import org.gcube.common.scope.api.ScopeProvider; -import org.gcube.datacatalogue.ckanutillibrary.server.DataCatalogue; import org.gcube.datacatalogue.common.Constants; import org.gcube.datacatalogue.grsf_manage_widget.shared.ConnectedBean; import org.gcube.datacatalogue.grsf_manage_widget.shared.ManageProductBean; import org.gcube.datacatalogue.grsf_manage_widget.shared.SimilarGRSFRecord; +import org.gcube.datacatalogue.utillibrary.server.DataCatalogue; import org.gcube.resources.discovery.client.api.DiscoveryClient; import org.gcube.resources.discovery.client.queries.api.SimpleQuery; import org.json.simple.JSONArray; @@ -22,12 +27,6 @@ import org.json.simple.parser.JSONParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import eu.trentorise.opendata.jackan.internal.org.apache.http.HttpResponse; -import eu.trentorise.opendata.jackan.internal.org.apache.http.client.methods.HttpPost; -import eu.trentorise.opendata.jackan.internal.org.apache.http.entity.StringEntity; -import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.CloseableHttpClient; -import eu.trentorise.opendata.jackan.internal.org.apache.http.util.EntityUtils; - /** * Exploits the grsf-services-updater service's methods https://app.swaggerhub.com/apis/ymark/grsf-services-updater/1.1.0 * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/SocialCommunications.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/SocialCommunications.java index bc4f17e..88b0d71 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/SocialCommunications.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/SocialCommunications.java @@ -11,15 +11,25 @@ import java.util.Set; import javax.servlet.http.HttpServletRequest; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.client.LaxRedirectStrategy; +import org.apache.http.util.EntityUtils; +import org.gcube.com.fasterxml.jackson.databind.ObjectMapper; import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.resources.gcore.GCoreEndpoint; import org.gcube.common.scope.api.ScopeProvider; -import org.gcube.datacatalogue.ckanutillibrary.server.DataCatalogue; import org.gcube.datacatalogue.common.Constants; import org.gcube.datacatalogue.grsf_manage_widget.shared.HashTagsOnUpdate; import org.gcube.datacatalogue.grsf_manage_widget.shared.ManageProductBean; import org.gcube.datacatalogue.grsf_manage_widget.shared.RevertableOperationInfo; import org.gcube.datacatalogue.grsf_manage_widget.shared.RevertableOperations; +import org.gcube.datacatalogue.utillibrary.server.DataCatalogue; import org.gcube.resources.discovery.client.api.DiscoveryClient; import org.gcube.resources.discovery.client.queries.api.SimpleQuery; import org.gcube.vomanagement.usermanagement.RoleManager; @@ -31,18 +41,6 @@ import org.json.simple.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.databind.ObjectMapper; - -import eu.trentorise.opendata.jackan.internal.org.apache.http.HttpEntity; -import eu.trentorise.opendata.jackan.internal.org.apache.http.HttpResponse; -import eu.trentorise.opendata.jackan.internal.org.apache.http.client.methods.CloseableHttpResponse; -import eu.trentorise.opendata.jackan.internal.org.apache.http.client.methods.HttpPost; -import eu.trentorise.opendata.jackan.internal.org.apache.http.entity.StringEntity; -import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.CloseableHttpClient; -import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.HttpClientBuilder; -import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.LaxRedirectStrategy; -import eu.trentorise.opendata.jackan.internal.org.apache.http.util.EntityUtils; - /** * For managing the different interactions with social channels (posts and mails) diff --git a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/Utils.java b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/Utils.java index 07e0492..38affc3 100644 --- a/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/Utils.java +++ b/src/main/java/org/gcube/datacatalogue/grsf_manage_widget/server/manage/Utils.java @@ -16,13 +16,12 @@ import javax.servlet.http.HttpSession; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.portal.PortalContext; import org.gcube.common.resources.gcore.utils.XPathHelper; import org.gcube.common.scope.api.ScopeProvider; -import org.gcube.datacatalogue.ckanutillibrary.server.ApplicationProfileScopePerUrlReader; -import org.gcube.datacatalogue.ckanutillibrary.server.DataCatalogue; -import org.gcube.datacatalogue.ckanutillibrary.server.DataCatalogueRunningCluster; import org.gcube.datacatalogue.common.Constants; import org.gcube.datacatalogue.common.enums.Product_Type; import org.gcube.datacatalogue.common.enums.Status; @@ -30,6 +29,11 @@ import org.gcube.datacatalogue.grsf_manage_widget.shared.ConnectedBean; import org.gcube.datacatalogue.grsf_manage_widget.shared.ManageProductBean; import org.gcube.datacatalogue.grsf_manage_widget.shared.RevertableOperationInfo; import org.gcube.datacatalogue.grsf_manage_widget.shared.SimilarGRSFRecord; +import org.gcube.datacatalogue.utillibrary.server.ApplicationProfileScopePerUrlReader; +import org.gcube.datacatalogue.utillibrary.server.DataCatalogue; +import org.gcube.datacatalogue.utillibrary.server.DataCatalogueRunningCluster; +import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanDataset; +import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanPair; import org.gcube.resources.discovery.client.api.DiscoveryClient; import org.gcube.resources.discovery.client.queries.api.Query; import org.gcube.resources.discovery.client.queries.impl.QueryBox; @@ -45,11 +49,6 @@ import org.xml.sax.InputSource; import com.liferay.portal.service.UserLocalServiceUtil; -import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.CloseableHttpClient; -import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.HttpClientBuilder; -import eu.trentorise.opendata.jackan.model.CkanDataset; -import eu.trentorise.opendata.jackan.model.CkanPair; - /** * Utility methods for GRSF Management panel widget. * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) @@ -397,13 +396,15 @@ public class Utils { } /** - * Exploits the fact that in GRSF the url of a record contains the name (which is unique) of the record itself - * @param url - * @param clg - * @return - * @throws Exception + * Exploits the fact that in GRSF the url of a record contains the name (which is unique) of the record itself. + * + * @param url the url + * @param clg the clg + * @param username the username + * @return the dataset from url + * @throws Exception the exception */ - public static CkanDataset getDatasetFromUrl(String url, DataCatalogue clg, String apiKey) throws Exception{ + public static CkanDataset getDatasetFromUrl(String url, DataCatalogue clg, String username) throws Exception{ if(url == null || url.isEmpty()) return null; @@ -417,7 +418,7 @@ public class Utils { if (m.find()) { String uuidFound = m.group(); logger.debug("Found match for uuid " + uuidFound); - return clg.getDataset(uuidFound, apiKey); + return clg.getDataset(uuidFound, username); } throw new Exception("No record exists with such url " + url); @@ -456,7 +457,7 @@ public class Utils { * @return {@link SimilarGRSFRecord} * @throws ParseException */ - public static SimilarGRSFRecord similarGRSFRecordFromJson(String json, DataCatalogue ctl, String apiKey, HttpSession httpSession) throws ParseException{ + public static SimilarGRSFRecord similarGRSFRecordFromJson(String json, DataCatalogue ctl, String username, HttpSession httpSession) throws ParseException{ if(json == null) return null; @@ -465,7 +466,7 @@ public class Utils { JSONObject object = (JSONObject)parser.parse(json); String uuid = getDatasetKnowledgeBaseIdFromUrl((String)object.get(Constants.SIMILAR_RECORDS_BEAN_FIELD_URL)); - CkanDataset dataset = ctl.getDataset(uuid, apiKey); + CkanDataset dataset = ctl.getDataset(uuid,username); boolean isStock = dataset.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY).contains(Product_Type.STOCK.getOrigName()); Map fieldsNamespacesMap = @@ -501,19 +502,19 @@ public class Utils { } /** - * Get Connected bean from record - * @param httpSession - * @param json - * @param sourceIdentifier - * @param sourceDomain - * @param grsfDomain - * @return - * @throws ParseException + * Get Connected bean from record. + * + * @param destUrl the dest url + * @param clg the clg + * @param username the username + * @param httpSession the http session + * @return the connected bean + * @throws ParseException the parse exception */ public static ConnectedBean connectedBeanRecordFromUrl( String destUrl, DataCatalogue clg, - String apiKey, + String username, HttpSession httpSession ) throws ParseException { @@ -521,7 +522,7 @@ public class Utils { return null; String connectedBeanUuid = getDatasetKnowledgeBaseIdFromUrl(destUrl); - CkanDataset destDataset = clg.getDataset(connectedBeanUuid, apiKey); + CkanDataset destDataset = clg.getDataset(connectedBeanUuid,username); boolean isStock = destDataset.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY).contains(Product_Type.STOCK.getOrigName()); Map fieldsNamespacesMap = Utils.getFieldToFieldNameSpaceMapping(httpSession, isStock ? diff --git a/src/test/java/org/gcube/datacatalogue/grsf_manage_widget/client/SendNotification.java b/src/test/java/org/gcube/datacatalogue/grsf_manage_widget/client/SendNotification.java index 1b26d66..3685231 100644 --- a/src/test/java/org/gcube/datacatalogue/grsf_manage_widget/client/SendNotification.java +++ b/src/test/java/org/gcube/datacatalogue/grsf_manage_widget/client/SendNotification.java @@ -6,13 +6,19 @@ import static org.gcube.resources.discovery.icclient.ICFactory.queryFor; import java.util.List; import java.util.Map; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.client.LaxRedirectStrategy; import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.resources.gcore.GCoreEndpoint; import org.gcube.common.scope.api.ScopeProvider; -import org.gcube.datacatalogue.ckanutillibrary.server.DataCatalogue; -import org.gcube.datacatalogue.ckanutillibrary.server.DataCatalogueFactory; import org.gcube.datacatalogue.grsf_manage_widget.server.manage.GRSFNotificationService; import org.gcube.datacatalogue.grsf_manage_widget.server.manage.SocialCommunications; +import org.gcube.datacatalogue.utillibrary.server.DataCatalogue; +import org.gcube.datacatalogue.utillibrary.server.DataCatalogueFactory; import org.gcube.resources.discovery.client.api.DiscoveryClient; import org.gcube.resources.discovery.client.queries.api.SimpleQuery; import org.json.simple.JSONArray; @@ -20,18 +26,11 @@ import org.json.simple.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import eu.trentorise.opendata.jackan.internal.org.apache.http.client.methods.CloseableHttpResponse; -import eu.trentorise.opendata.jackan.internal.org.apache.http.client.methods.HttpPost; -import eu.trentorise.opendata.jackan.internal.org.apache.http.entity.StringEntity; -import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.CloseableHttpClient; -import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.HttpClientBuilder; -import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.LaxRedirectStrategy; - public class SendNotification { private static String context = "/d4science.research-infrastructures.eu/gCubeApps/BiodiversityLab"; - private static String token = "57b42a99-6239-44c4-9a68-591c18363222-843339462"; ///d4science.research-infrastructures.eu/gCubeApps/BiodiversityLab + private static String token = ""; ///d4science.research-infrastructures.eu/gCubeApps/BiodiversityLab //private static String token = "8e74a17c-92f1-405a-b591-3a6090066248-98187548"; //devVRE