Compare commits

...

6 Commits
main ... dev

5 changed files with 271 additions and 150 deletions

View File

@ -10,20 +10,23 @@ public class App {
public static void main(String[] args) {
try {
String csvFilePath = "src/main/resources/updated_VREDecommisioned-240326.csv";
String csvFilePath2 = "src/main/resources/VRE Decommisioned_GatewayAndDescriptions.csv";
String xmlFilePath = "src/main/resources/doc.xml";
// Initialize managers
CsvManager csvManager = new CsvManager(csvFilePath);
XmlManager xmlManager = new XmlManager(xmlFilePath);
// Parse CSV and XML files
HashMap<String, Gateway> xmlMap = xmlManager.parse();
HashMap<String, Gateway> csvMap = csvManager.parseCsvToMap(csvFilePath);
HashMap<String, GatewayNameAndDescriptionReader> csvMapNameAndDescription = csvManager.parseGatewayInfoCsv(csvFilePath2);
HashMap<String, Gateway> csvMap = csvManager.parseCsvToMap(csvFilePath,csvMapNameAndDescription);
putAll(xmlMap,csvMap);
//Merging csvMap into the xmlMap
//Merging csvMap into the xmlMap
//Note that: in case of duplicate elements, the csvMap elements will overwrite the xmlMap
//this is ok for us because the csv elements are mode recent than xml element
//check this behaviour in the final xml doc
@ -48,16 +51,20 @@ public class App {
Gateway csvGateway = csvMap.get(csvKey);
// Normalize the CSV gateway name
String csvGatewayNameNormalized = csvGateway.getName().toLowerCase();
XmlManager xmlManager = new XmlManager();
String csvgatewayName = xmlManager.extractGatewayName(csvGatewayNameNormalized);
String csvGatewayNameNormalized = csvGateway.getName().toLowerCase().trim();
//String csvGatewayNameNormalized = csvGateway.getName();
//XmlManager xmlManager = new XmlManager();
//String csvgatewayName = xmlManager.extractGatewayName(csvGatewayNameNormalized);
// Check for duplicates by gateway name (case insensitive)
boolean foundDuplicate = false;
for (String xmlKey : xmlMap.keySet()) {
Gateway xmlGateway = xmlMap.get(xmlKey);
String xmlGatewayNameNormalized = xmlGateway.getName().toLowerCase();
String xmlGatewayNameNormalized = xmlGateway.getName().toLowerCase().trim();
//String xmlGatewayNameNormalized = xmlGateway.getName();
if (xmlGatewayNameNormalized.equalsIgnoreCase(csvgatewayName)) {
if (xmlGatewayNameNormalized.equals(csvGatewayNameNormalized)) {
// Merge VOs and VREs
for (Vos csvVos : csvGateway.getVosList()) {
Vos xmlVos = xmlGateway.getVosByName(csvVos.getName());

View File

@ -1,6 +1,9 @@
package org.gcube.vremanagement;
import java.io.FileReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -9,69 +12,101 @@ import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
public class CsvManager {
private String csvFilePath;
private HashMap<String, Gateway> gatewayMap;
private String csvFilePath;
private HashMap<String, Gateway> gatewayMap;
public CsvManager(String csvFilePath) {
this.csvFilePath = csvFilePath;
this.gatewayMap = new HashMap<>();
}
public CsvManager(String csvFilePath) {
this.csvFilePath = csvFilePath;
this.gatewayMap = new HashMap<>();
}
public HashMap<String, Gateway> parseCsvToMap(String csvFilePath, Map<String, GatewayNameAndDescriptionReader> gatewayNameAndDescriptionReaderMap) {
HashMap<String, Gateway> csvMap = new HashMap<>();
SimpleDateFormat inputFormat = new SimpleDateFormat("MMM dd yyyy hh:mm a");
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd");
public HashMap<String, Gateway> parseCsvToMap(String csvFilePath) {
HashMap<String, Gateway> csvMap = new HashMap<>();
try {
FileReader filereader = new FileReader(csvFilePath);
CSVReader csvReader = new CSVReaderBuilder(filereader).withSkipLines(1).build();
try {
FileReader filereader = new FileReader(csvFilePath);
CSVReader csvReader = new CSVReaderBuilder(filereader).withSkipLines(1).build();
List<String[]> allData = csvReader.readAll();
List<String[]> allData = csvReader.readAll();
for (String[] row : allData) {
XmlManager xmlManager = new XmlManager();
String gatewayName = row[5];
String csvgatewayName = xmlManager.extractGatewayName(gatewayName)+ " Gateway";
String description = row[10];
String voName = row[4];
String vreName = row[3];
String manager = row[9];
String startDate = row[7];
String endDate = row[8];
for (String[] row : allData) {
String url = row[5].trim();
GatewayNameAndDescriptionReader gatewayNameAndDescription = gatewayNameAndDescriptionReaderMap.get(url);
if (gatewayNameAndDescription != null) {
String gatewayName = gatewayNameAndDescription.getName();
String description = gatewayNameAndDescription.getDescription();
String voName = row[4].trim();
String vreName = row[3].trim();
String manager = row[9].trim();
// Parse and format the dates
String startDateStr = row[7].trim();
String endDateStr = row[8].trim();
String formattedStartDate = formatDateString(startDateStr, inputFormat, outputFormat);
String formattedEndDate = formatDateString(endDateStr, inputFormat, outputFormat);
Gateway gateway = csvMap.getOrDefault(gatewayName.toLowerCase(), new Gateway(gatewayName, description));
Vos vos = gateway.getVosByName(voName);
if (vos == null) {
vos = new Vos(voName, voName, voName);
gateway.addVos(vos);
}
Gateway gateway = csvMap.getOrDefault(csvgatewayName.toLowerCase(), new Gateway(csvgatewayName, description));
Vos vos = gateway.getVosByName(voName);
if (vos == null) {
vos = new Vos(voName, voName, voName);
gateway.addVos(vos);
}
Vres vres = vos.getVresByName(vreName);
if (vres == null) {
vres = new Vres(vreName, vreName, description, manager, formattedStartDate, formattedEndDate);
vos.addVres(vres);
}
csvMap.put(gatewayName.toLowerCase(), gateway);
}
}
Vres vres = vos.getVresByName(vreName);
if (vres == null) {
vres = new Vres(vreName, vreName, description, manager, startDate, endDate);
vos.addVres(vres);
}
csvReader.close();
} catch (Exception e) {
e.printStackTrace();
}
csvMap.put(csvgatewayName.toLowerCase(), gateway);
}
return csvMap;
}
private String formatDateString(String dateStr, SimpleDateFormat inputFormat, SimpleDateFormat outputFormat) {
try {
Date date = inputFormat.parse(dateStr);
return outputFormat.format(date);
} catch (ParseException e) {
System.err.println("Error parsing date: " + dateStr);
return ""; // or return a default date
}
}
csvReader.close();
} catch (Exception e) {
e.printStackTrace();
}
private String extractGatewayName(String gateways) {
if (gateways.startsWith("https://")) {
return gateways.substring(8, gateways.indexOf("."));
} else if (gateways.startsWith("http://")) {
return gateways.substring(7, gateways.indexOf("."));
} else {
return gateways; // fallback
}
}
return csvMap;
}
public HashMap<String, GatewayNameAndDescriptionReader> parseGatewayInfoCsv(String csvFilePath) {
HashMap<String, GatewayNameAndDescriptionReader> gatewayNameAndDescription = new HashMap<>();
try (CSVReader csvReader = new CSVReaderBuilder(new FileReader(csvFilePath)).withSkipLines(1).build()) {
List<String[]> allData = csvReader.readAll();
private String extractGatewayName(String gateways) {
if (gateways.startsWith("https://")) {
return gateways.substring(8, gateways.indexOf("."));
} else if (gateways.startsWith("http://")) {
return gateways.substring(7, gateways.indexOf("."));
} else {
return gateways; // fallback
}
}
for (String[] row : allData) {
String name = row[0]; // assuming name is in the first column
String description = row[1]; // assuming description is in the second column
String url = row[2]; // assuming URL is in the third column
gatewayNameAndDescription.put(url.toLowerCase(), new GatewayNameAndDescriptionReader(name, description, url));
}
} catch (Exception e) {
e.printStackTrace();
}
return gatewayNameAndDescription;
}
}

View File

@ -0,0 +1,39 @@
package org.gcube.vremanagement;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import com.opencsv.exceptions.CsvException;
public class GatewayNameAndDescriptionReader {
private String name;
private String description;
private String url;
public GatewayNameAndDescriptionReader(String name, String description, String url) {
this.name = name;
this.description = description;
this.url= url;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public String getUrl() {
return url;
}
}

View File

@ -39,102 +39,108 @@ public class XmlManager implements VreRemPubInterface {
// TODO Auto-generated constructor stub
}
@Override
public HashMap<String, Gateway> parse() {
try {
File xmlFile = new File(filePath);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(xmlFile);
doc.getDocumentElement().normalize();
NodeList gatewayNodes = doc.getElementsByTagName("gateways");
HashMap<String, Gateway> gatewaysMap = new HashMap<>();
NodeList gatewayList = gatewayNodes.item(0).getChildNodes();
try {
File xmlFile = new File(filePath);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(xmlFile);
doc.getDocumentElement().normalize();
for (int i = 0; i < gatewayList.getLength(); i++) {
Node gatewayNode = gatewayList.item(i);
if (gatewayNode.getNodeType() == Node.ELEMENT_NODE) {
Element gatewayElement = (Element) gatewayNode;
String gatewayName = gatewayElement.getElementsByTagName("name").item(0).getTextContent().trim();
String gatewayDescription = gatewayElement.getElementsByTagName("description").item(0)
.getTextContent().trim();
NodeList gatewayNodes = doc.getElementsByTagName("gateways");
Gateway gateway = new Gateway(gatewayName, gatewayDescription);
NodeList gatewayList = gatewayNodes.item(0).getChildNodes();
// Find the <vos> element within the gateway entry
NodeList vosList = gatewayElement.getElementsByTagName("vos");
for (int j = 0; j < vosList.getLength(); j++) {
Node vosNode = vosList.item(j);
if (vosNode.getNodeType() == Node.ELEMENT_NODE) {
Element vosElement = (Element) vosNode;
for (int i = 0; i < gatewayList.getLength(); i++) {
Node gatewayNode = gatewayList.item(i);
if (gatewayNode.getNodeType() == Node.ELEMENT_NODE) {
Element gatewayElement = (Element) gatewayNode;
String gatewayName = gatewayElement.getElementsByTagName("name").item(0).getTextContent().trim();
String gatewayDescription = gatewayElement.getElementsByTagName("description").item(0)
.getTextContent().trim();
Gateway gateway = new Gateway(gatewayName, gatewayDescription);
String voKey = vosElement.getElementsByTagName("key").item(0).getTextContent().trim();
String voName = vosElement.getElementsByTagName("name").item(0).getTextContent().trim();
String voScope = vosElement.getElementsByTagName("scope").item(0).getTextContent().trim();
// Find the <vos> element within the gateway entry
NodeList vosList = gatewayElement.getElementsByTagName("vos").item(0).getChildNodes();
//getting vo
Vos vos = new Vos(voKey,voScope, voName);
for (int j = 0; j < vosList.getLength(); j++) {
Node vosNode = vosList.item(j);
if (vosNode.getNodeType() == Node.ELEMENT_NODE) {
Element vosElement = (Element) vosNode;
// Find the <vres> element within the VO entry
NodeList vresList = vosElement.getElementsByTagName("vres");
for (int l = 0; l < vresList.getLength(); l++) {
Node vresNode = vresList.item(l);
if (vresNode.getNodeType() == Node.ELEMENT_NODE) {
Element vresElement = (Element) vresNode;
// Iterate through <entry> elements representing VREs within <vres>
NodeList vreEntryList = vresElement.getElementsByTagName("entry");
for (int m = 0; m < vreEntryList.getLength(); m++) {
Node vreEntryNode = vreEntryList.item(m);
if (vreEntryNode.getNodeType() == Node.ELEMENT_NODE) {
Element vreEntryElement = (Element) vreEntryNode;
String vreKey = vreEntryElement.getElementsByTagName("key").item(0)
.getTextContent().trim();
String vreName = vreEntryElement.getElementsByTagName("name")
.item(0).getTextContent().trim();
String vreDescription = vreEntryElement
.getElementsByTagName("description").item(0)
.getTextContent().trim();
String vreManager = vreEntryElement.getElementsByTagName("managers")
.item(0).getTextContent().trim();
String vreStartDate = vreEntryElement
.getElementsByTagName("startdate").item(0).getTextContent().trim();
String vreEndDate = vreEntryElement.getElementsByTagName("enddate")
.item(0).getTextContent().trim();
String voKey = vosElement.getElementsByTagName("key").item(0).getTextContent().trim();
String voName = vosElement.getElementsByTagName("name").item(0).getTextContent().trim();
String voScope = vosElement.getElementsByTagName("scope").item(0).getTextContent().trim();
// Create a new Vres object and add it to the Vos's vreList
Vres vres = new Vres(vreKey, vreName, vreDescription, vreManager,
vreStartDate, vreEndDate);
vos.addVres(vres);
// Creating a Vos object
Vos vos = new Vos(voKey, voScope, voName);
// Find the <vres> element within the VO entry
NodeList vresList = vosElement.getElementsByTagName("vres");
}
}
}
}
for (int l = 0; l < vresList.getLength(); l++) {
Node vresNode = vresList.item(l);
// Add the Vos object to the gateway's vosList
gateway.addVos(vos);
//}
//}
}
}
if (vresNode.getNodeType() == Node.ELEMENT_NODE) {
Element vresElement = (Element) vresNode;
// Store the gateway object in the gateways map
NodeList vreEntryList = vresElement.getElementsByTagName("entry");
gatewaysMap.put(gatewayName, gateway);
//computeIfAbsent(gatewayName, k -> new ArrayList<>()).add(gateway);
}
}
return gatewaysMap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
for (int m = 0; m < vreEntryList.getLength(); m++) {
Node vreEntryNode = vreEntryList.item(m);
if (vreEntryNode.getNodeType() == Node.ELEMENT_NODE) {
Element vreEntryElement = (Element) vreEntryNode;
String vreKey = vreEntryElement.getElementsByTagName("key").item(0)
.getTextContent().trim();
String vreName = vreEntryElement.getElementsByTagName("name")
.item(0).getTextContent().trim();
String vreDescription = vreEntryElement
.getElementsByTagName("description").item(0)
.getTextContent().trim();
String vreManager = vreEntryElement.getElementsByTagName("managers")
.item(0).getTextContent().trim();
String vreStartDate = vreEntryElement
.getElementsByTagName("startdate").item(0).getTextContent().trim();
String vreEndDate = vreEntryElement.getElementsByTagName("enddate")
.item(0).getTextContent().trim();
// Create a new Vres object and add it to the Vos's vreList
Vres vres = new Vres(vreKey, vreName, vreDescription, vreManager,
vreStartDate, vreEndDate);
vos.addVres(vres);
}
}
}
}
// Add the Vos object to the gateway's vosList
gateway.addVos(vos);
}
}
// Store the gateway object in the gateways map
gatewaysMap.put(gatewayName, gateway);
}
}
return gatewaysMap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void getGatewaysInfo() {
System.out.println("Name of the Gateway:");
gatewaysMap.keySet().stream().filter(gatewayName -> gatewayName.endsWith("Gateway"))
@ -257,6 +263,9 @@ public class XmlManager implements VreRemPubInterface {
return null;
}
public void writeXml(HashMap<String, Gateway> map, String outputXmlFilePath) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
@ -349,15 +358,16 @@ public class XmlManager implements VreRemPubInterface {
scopeValueElement.appendChild(document.createTextNode(String.valueOf(gatewayKey)));
valueElement.appendChild(scopeValueElement);
// Create <name> element within <value>
//Create <name> element within <value>
Element nameValueElement = document.createElement("name");
String gatewayName = extractGatewayName(gateway.getName());
String gatewayName = gateway.getName();
nameValueElement.appendChild(document.createTextNode(gatewayName));
valueElement.appendChild(nameValueElement);
// Create <description> element within <value>
Element descriptionElement = document.createElement("description");
descriptionElement.appendChild(document.createTextNode("No description for gateway"));
descriptionElement.appendChild(document.createTextNode(gateway.getDescription()));
valueElement.appendChild(descriptionElement);
Element vosElement = document.createElement("vos");
@ -420,10 +430,32 @@ public class XmlManager implements VreRemPubInterface {
vresDescriptionElement.appendChild(document.createTextNode(vres.getDescription()));
vresValueElement.appendChild(vresDescriptionElement);
// Assuming managers are separated by newlines or another clear delimiter (adjust the regex if needed)
Element vresManagerElement = document.createElement("managers");
vresManagerElement.appendChild(document.createTextNode(vres.getManager()));
// Split the manager string on newline or other delimiters (like commas, semicolons, etc.)
// Adjust the delimiter based on the format you get (e.g. comma, newline, etc.)
String[] managers = vres.getManager().split("\n");
// Loop through each manager and create a <manager> tag for it
for (String manager : managers) {
manager = manager.trim(); // Trim any excess whitespace
if (!manager.isEmpty()) {
Element managerElement = document.createElement("manager");
managerElement.appendChild(document.createTextNode(manager));
vresManagerElement.appendChild(managerElement);
}
}
vresValueElement.appendChild(vresManagerElement);
/*Element vresManagerElement = document.createElement("managers");
vresManagerElement.appendChild(document.createTextNode(vres.getManager()));
vresValueElement.appendChild(vresManagerElement);*/
Element vresStartDateElement = document.createElement("startdate");
vresStartDateElement.appendChild(document.createTextNode(vres.getStartDate()));
vresValueElement.appendChild(vresStartDateElement);
@ -439,20 +471,16 @@ public class XmlManager implements VreRemPubInterface {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File(outputXmlFilePath));
transformer.transform(source, result);
}
// Other methods...
public String extractGatewayName(String gateways) {
if (gateways.startsWith("https://")) {
return gateways.substring(8, gateways.indexOf("."));
} else if (gateways.startsWith("http://")) {
return gateways.substring(7, gateways.indexOf("."));
} else {
return gateways; // fallback
}
}
}

View File

@ -0,0 +1,12 @@
GatewayName,Description,URL
AGINFRAPlus Detached Gateway,"AGINFRA+ aims to exploit core e-infrastructures such as D4Science, EGI.eu, OpenAIRE and EUDAT, towards the evolution of the AGINFRA data infrastructure, so as to provide a sustainable channel addressing adjacent but not fully connected user communities around Agriculture and Food.",https://aginfra.d4science.org
Blue-Cloud Detached Gateway,"Blue-Cloud, a thematic EOSC cloud to better understand and manage the ocean
sustainability, through a set of five compelling pilot Blue-Cloud demonstrators. It develops and deploys, the Pilot Blue Cloud as a cyber platform bringing together and providing access to: 1) multidisciplinary data from observations and models, 2) analytical tools, 3) computing facilities essential for key blue science use cases.",https://blue-cloud.d4science.org
D4Science.org Detached Gateway,"D4Science is a Data Infrastructure connecting +18000 scientists in 50 countries, integrating +50 heterogeneous data providers, executing +50,000 models & algorithms/month; providing access to over a billion quality records in repositories worldwide, with 99,7% service availability.",https://services.d4science.org
iMarine Detached Gateway,"This gateway is an access point to a number of Virtual Research Environments deployed and operated in the context of the past iMarine EU FP7 project to support the Ecosystem Approach to fisheries management and conservation of marine living resources. It empowers practitioners and policy makers from multiple scientific fields such as fisheries, biodiversity and ocean observation by ensuring that otherwise dispersed and heterogeneous data is available to all stakeholder communities through a shared virtual environment that brings together multidisciplinary data sources, supports cross-cutting scientific analysis, and assists communication.",https://i-marine.d4science.org/
EOSC-Secretariat Detached Gateway,"The EU-funded EOSCsecretariat.eu project will set up a consortium to provide support for the European Open Science Cloud (EOSC), addressing all the specific needs of this digital platform. ",http://eosc-secretariat.d4science.org
ARIADNEPlus Detached Gateway,"The ARIADNEPlus Gateway helps the project to develop a data infrastructure embedded in a cloud that offer the availability of Virtual Research Environments where data-based archaeological research may be carried out. The project will furthermore develop a Linked Data approach to data discovery, making available to users innovative services, such as visualization, annotation, text mining and geo-temporal data management. Innovative pilots will be developed to test and demonstrate the innovation potential of the ARIADNEplus approach.",https://ariadne.d4science.org
PARTHENOS Detached Gateway,"PARTHENOS is a H2020 EU Project (Pooling Activities, Resources and Tools for Heritage E-research Networking, Optimization and Synergies).
",https://parthenos.d4science.org
OpenAIRE-Tools Detached Gateway,"OpenAIRE-Tools is a portal dedicated to OpenAIRE developers, the ones that have access to the development services both at CNR and at ICM.",https://tools.openaire.eu/
BlueBridge Gateway ,"This BlueBRIDGE gateway has served more than 2.500 users. These users will be supported thanks to the iMarine initiative, which was launched in 2015 to establish and operate an e-infrastructure supporting the principles of the ecosystem approach to fisheries management and conservation of marine living resources, and it ultimately aims at supporting F.A.O's Blue Growth Initiative.",https://bluebridge.d4science.org
1 GatewayName Description URL
2 AGINFRAPlus Detached Gateway AGINFRA+ aims to exploit core e-infrastructures such as D4Science, EGI.eu, OpenAIRE and EUDAT, towards the evolution of the AGINFRA data infrastructure, so as to provide a sustainable channel addressing adjacent but not fully connected user communities around Agriculture and Food. https://aginfra.d4science.org
3 Blue-Cloud Detached Gateway Blue-Cloud, a thematic EOSC cloud to better understand and manage the ocean sustainability, through a set of five compelling pilot Blue-Cloud demonstrators. It develops and deploys, the Pilot Blue Cloud as a cyber platform bringing together and providing access to: 1) multidisciplinary data from observations and models, 2) analytical tools, 3) computing facilities essential for key blue science use cases. https://blue-cloud.d4science.org
4 D4Science.org Detached Gateway D4Science is a Data Infrastructure connecting +18000 scientists in 50 countries, integrating +50 heterogeneous data providers, executing +50,000 models & algorithms/month; providing access to over a billion quality records in repositories worldwide, with 99,7% service availability. https://services.d4science.org
5 iMarine Detached Gateway This gateway is an access point to a number of Virtual Research Environments deployed and operated in the context of the past iMarine EU FP7 project to support the Ecosystem Approach to fisheries management and conservation of marine living resources. It empowers practitioners and policy makers from multiple scientific fields such as fisheries, biodiversity and ocean observation by ensuring that otherwise dispersed and heterogeneous data is available to all stakeholder communities through a shared virtual environment that brings together multidisciplinary data sources, supports cross-cutting scientific analysis, and assists communication. https://i-marine.d4science.org/
6 EOSC-Secretariat Detached Gateway The EU-funded EOSCsecretariat.eu project will set up a consortium to provide support for the European Open Science Cloud (EOSC), addressing all the specific needs of this digital platform. http://eosc-secretariat.d4science.org
7 ARIADNEPlus Detached Gateway The ARIADNEPlus Gateway helps the project to develop a data infrastructure embedded in a cloud that offer the availability of Virtual Research Environments where data-based archaeological research may be carried out. The project will furthermore develop a Linked Data approach to data discovery, making available to users innovative services, such as visualization, annotation, text mining and geo-temporal data management. Innovative pilots will be developed to test and demonstrate the innovation potential of the ARIADNEplus approach. https://ariadne.d4science.org
8 PARTHENOS Detached Gateway PARTHENOS is a H2020 EU Project (Pooling Activities, Resources and Tools for Heritage E-research Networking, Optimization and Synergies). https://parthenos.d4science.org
9 OpenAIRE-Tools Detached Gateway OpenAIRE-Tools is a portal dedicated to OpenAIRE developers, the ones that have access to the development services both at CNR and at ICM. https://tools.openaire.eu/
10 BlueBridge Gateway This BlueBRIDGE gateway has served more than 2.500 users. These users will be supported thanks to the iMarine initiative, which was launched in 2015 to establish and operate an e-infrastructure supporting the principles of the ecosystem approach to fisheries management and conservation of marine living resources, and it ultimately aims at supporting F.A.O's Blue Growth Initiative. https://bluebridge.d4science.org