diff --git a/pom.xml b/pom.xml
index 686a7b5..d518a16 100644
--- a/pom.xml
+++ b/pom.xml
@@ -98,6 +98,11 @@
org.gcube.information-system
resource-registry-publisher
+
+ org.gcube.information-system
+ resource-registry-query-template-client
+ [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT)
+
org.gcube.resources
common-gcore-resources
diff --git a/src/main/java/org/gcube/gcat/GCatInitializator.java b/src/main/java/org/gcube/gcat/GCatInitializator.java
index df99e89..b9f68c4 100644
--- a/src/main/java/org/gcube/gcat/GCatInitializator.java
+++ b/src/main/java/org/gcube/gcat/GCatInitializator.java
@@ -3,6 +3,8 @@ package org.gcube.gcat;
import java.io.IOException;
import org.gcube.common.authorization.utils.manager.SecretManagerProvider;
+import org.gcube.gcat.configuration.isproxies.FacetBasedISConfigurationProxy;
+import org.gcube.gcat.configuration.isproxies.FacetBasedISConfigurationProxyFactory;
import org.gcube.gcat.rest.RequestFilter;
import org.gcube.smartgears.ApplicationManager;
import org.slf4j.Logger;
@@ -42,7 +44,13 @@ public class GCatInitializator implements ApplicationManager {
+ "-------------------------------------------------------",
context);
-
+ FacetBasedISConfigurationProxy facetBasedISConfigurationProxy = FacetBasedISConfigurationProxyFactory.getInstance(context);
+ try {
+ facetBasedISConfigurationProxy.createCallsForToVirtualService();
+ }catch (Exception e) {
+ logger.warn("Gcat is not configured through the Facet Based IS in context {}. Please create/addToContext the expected resources ASAP. The Gcore IS will be used.", context, e);
+ }
+
logger.trace(
"\n-------------------------------------------------------\n"
+ "GCat Started Successfully on context {}\n"
@@ -74,6 +82,15 @@ public class GCatInitializator implements ApplicationManager {
+ "-------------------------------------------------------",
context);
+ /*
+ FacetBasedISConfigurationProxy facetBasedISConfigurationProxy = FacetBasedISConfigurationProxyFactory.getInstance(context);
+ try {
+ facetBasedISConfigurationProxy.deleteCallsForToVirtualService();
+ }catch (Exception e) {
+ logger.warn("Gcat is not configured through the Facet Based IS in context {}. Please create/addToContext the expected resources ASAP. The Gcore IS will be used.", context, e);
+ }
+ */
+
logger.trace(
"\n-------------------------------------------------------\n"
+ "GCat Stopped Successfully on context {}\n"
diff --git a/src/main/java/org/gcube/gcat/configuration/isproxies/FacetBasedISConfigurationProxy.java b/src/main/java/org/gcube/gcat/configuration/isproxies/FacetBasedISConfigurationProxy.java
index 0659d25..18615be 100644
--- a/src/main/java/org/gcube/gcat/configuration/isproxies/FacetBasedISConfigurationProxy.java
+++ b/src/main/java/org/gcube/gcat/configuration/isproxies/FacetBasedISConfigurationProxy.java
@@ -1,6 +1,7 @@
package org.gcube.gcat.configuration.isproxies;
import java.io.File;
+import java.io.FileReader;
import java.net.URL;
import java.util.Collection;
import java.util.HashMap;
@@ -15,25 +16,43 @@ import javax.ws.rs.InternalServerErrorException;
import org.gcube.com.fasterxml.jackson.core.JsonProcessingException;
import org.gcube.com.fasterxml.jackson.databind.JsonNode;
import org.gcube.com.fasterxml.jackson.databind.ObjectMapper;
+import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode;
import org.gcube.gcat.api.configuration.CatalogueConfiguration;
import org.gcube.gcat.configuration.service.FacetBasedISServiceCatalogueConfiguration;
import org.gcube.gcat.configuration.service.ServiceCKANDB;
import org.gcube.gcat.configuration.service.ServiceCatalogueConfiguration;
+import org.gcube.informationsystem.model.impl.properties.HeaderImpl;
+import org.gcube.informationsystem.model.impl.properties.PropagationConstraintImpl;
import org.gcube.informationsystem.model.impl.relations.ConsistsOfImpl;
import org.gcube.informationsystem.model.reference.entities.Entity;
import org.gcube.informationsystem.model.reference.properties.Encrypted;
import org.gcube.informationsystem.model.reference.properties.Header;
+import org.gcube.informationsystem.model.reference.properties.PropagationConstraint;
+import org.gcube.informationsystem.model.reference.properties.PropagationConstraint.AddConstraint;
+import org.gcube.informationsystem.model.reference.properties.PropagationConstraint.RemoveConstraint;
import org.gcube.informationsystem.model.reference.relations.ConsistsOf;
+import org.gcube.informationsystem.queries.templates.reference.entities.QueryTemplate;
+import org.gcube.informationsystem.resourceregistry.api.exceptions.NotFoundException;
+import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException;
+import org.gcube.informationsystem.resourceregistry.api.exceptions.types.SchemaViolationException;
import org.gcube.informationsystem.resourceregistry.client.ResourceRegistryClient;
import org.gcube.informationsystem.resourceregistry.client.ResourceRegistryClientFactory;
import org.gcube.informationsystem.resourceregistry.publisher.ResourceRegistryPublisher;
import org.gcube.informationsystem.resourceregistry.publisher.ResourceRegistryPublisherFactory;
+import org.gcube.informationsystem.resourceregistry.queries.templates.ResourceRegistryQueryTemplateClient;
+import org.gcube.informationsystem.resourceregistry.queries.templates.ResourceRegistryQueryTemplateClientFactory;
import org.gcube.informationsystem.utils.ElementMapper;
import org.gcube.resourcemanagement.model.impl.entities.facets.SimpleFacetImpl;
+import org.gcube.resourcemanagement.model.impl.entities.resources.EServiceImpl;
+import org.gcube.resourcemanagement.model.impl.relations.isrelatedto.CallsForImpl;
import org.gcube.resourcemanagement.model.reference.entities.facets.AccessPointFacet;
import org.gcube.resourcemanagement.model.reference.entities.facets.SimpleFacet;
import org.gcube.resourcemanagement.model.reference.entities.resources.Configuration;
+import org.gcube.resourcemanagement.model.reference.entities.resources.EService;
import org.gcube.resourcemanagement.model.reference.entities.resources.VirtualService;
+import org.gcube.resourcemanagement.model.reference.relations.isrelatedto.CallsFor;
+import org.gcube.smartgears.ContextProvider;
+import org.gcube.smartgears.context.application.ApplicationContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -44,17 +63,26 @@ public class FacetBasedISConfigurationProxy extends ISConfigurationProxy VirtualService(catalogue-virtual-service)
*/
protected VirtualService virtualService;
-
+
protected SimpleFacet configurationSimpleFacet;
@@ -136,13 +164,99 @@ public class FacetBasedISConfigurationProxy extends ISConfigurationProxy> getCallsForToVirtualService() throws Exception {
+ ResourceRegistryQueryTemplateClient rrqtc = ResourceRegistryQueryTemplateClientFactory.create();
+
+ if(!queryTemplateFound) {
+ queryTemplateName = installQueryTemplate(rrqtc);
+ }
+
+ ApplicationContext applicationContext = ContextProvider.get();
+ String gcatEServiceID = applicationContext.id();
+
+ ObjectNode objectNode = objectMapper.createObjectNode();
+ objectNode.put(GCAT_ESERVICE_UUID_VARNAME, gcatEServiceID);
+
+ List> callsForList = rrqtc.run(queryTemplateName, objectNode);
+ return callsForList;
+ }
+
+ public void deleteCallsForToVirtualService(List> callsForList) throws SchemaViolationException, NotFoundException, ResourceRegistryException {
+ for(CallsFor cf : callsForList) {
+ resourceRegistryPublisher.delete(cf);
+ }
+ }
+
+ public void deleteCallsForToVirtualService() throws Exception {
+ List> callsForList = getCallsForToVirtualService();
+ deleteCallsForToVirtualService(callsForList);
+ }
+
+ public CallsFor createCallsForToVirtualService() throws Exception {
+ List> callsForList = getCallsForToVirtualService();
+
+ CallsFor callsFor = null;
+
+ int size = callsForList.size();
+
+ if(size>1) {
+ deleteCallsForToVirtualService(callsForList);
+ size = 0;
+ }
+
+ if(size==0) {
+ PropagationConstraint propagationConstraint = new PropagationConstraintImpl();
+ propagationConstraint.setAddConstraint(AddConstraint.unpropagate);
+ propagationConstraint.setRemoveConstraint(RemoveConstraint.keep);
+ EService gcatEService = new EServiceImpl();
+ ApplicationContext applicationContext = ContextProvider.get();
+ String gcatEServiceID = applicationContext.id();
+ UUID gcatEServiceUUID = UUID.fromString(gcatEServiceID);
+ gcatEService.setHeader(new HeaderImpl(gcatEServiceUUID));
+ VirtualService virtualService = queryVirtualService();
+ callsFor = new CallsForImpl(gcatEService, virtualService, propagationConstraint);
+ callsFor = resourceRegistryPublisher.create(callsFor);
+ }else if(size==1){
+ callsFor = callsForList.get(0);
+ }
+
+ return callsFor;
+ }
+
+ public File getFile(String directoryName, String filename) throws Exception {
+ URL directoryURL = FacetBasedISConfigurationProxy.class.getClassLoader().getResource(directoryName);
+ File directory = new File(directoryURL.toURI());
+ return new File(directory, filename);
+ }
+
+ public File getJsonQueryTemplateFromFile(String filename) throws Exception {
+ return getFile(QUERY_TEMPLATE_DIRECTORY_NAME, filename);
+ }
+
public File getJsonQueryFromFile(String filename) throws Exception {
- URL queryDirectoryURL = FacetBasedISConfigurationProxy.class.getClassLoader().getResource(QUERY_DIRECTORY_NAME);
- File queryDirectory = new File(queryDirectoryURL.toURI());
- return new File(queryDirectory, filename);
+ return getFile(QUERY_DIRECTORY_NAME, filename);
}
- protected List query(String query) throws Exception {
+ protected List queryListOfEntities(String query) throws Exception {
logger.trace("Going to request the following query:\n{}", query);
String result = resourceRegistryClient.jsonQuery(query);
logger.trace("The query:\n{}\nproduced the following result:\n{}", query, result);
@@ -178,7 +292,7 @@ public class FacetBasedISConfigurationProxy extends ISConfigurationProxy entities = query(jsonQueryAsString);
+ List entities = queryListOfEntities(jsonQueryAsString);
return getUniqueEntity(entities, jsonQueryAsString);
}
@@ -229,18 +343,20 @@ public class FacetBasedISConfigurationProxy extends ISConfigurationProxy supportedOrganizations = new HashSet<>();
boolean forceUpdate = false;
if(supportedOrganizationsObj!=null && supportedOrganizationsObj instanceof Collection) {
- supportedOrganizations = new HashSet((Collection) supportedOrganizationsObj);
+ @SuppressWarnings("unchecked")
+ Set supportedOrganizations = new HashSet((Collection) supportedOrganizationsObj);
+ catalogueConfiguration.setSupportedOrganizations(supportedOrganizations);
}else {
+ Set supportedOrganizations = new HashSet<>();
supportedOrganizations.add(catalogueConfiguration.getDefaultOrganization());
configurationSimpleFacet.setAdditionalProperty(CatalogueConfiguration.SUPPORTED_ORGANIZATIONS_KEY, supportedOrganizations);
forceUpdate = true;
+ catalogueConfiguration.setSupportedOrganizations(supportedOrganizations);
}
- catalogueConfiguration.setSupportedOrganizations(supportedOrganizations);
Map additionalProperties = new HashMap<>(configurationSimpleFacet.getAdditionalProperties());
diff --git a/src/main/resources/query-template/01-get-calls-for-query-template.json b/src/main/resources/query-template/01-get-calls-for-query-template.json
new file mode 100644
index 0000000..e1bd589
--- /dev/null
+++ b/src/main/resources/query-template/01-get-calls-for-query-template.json
@@ -0,0 +1,32 @@
+{
+ "@class": "CallsFor",
+ "source": {
+ "@class": "EService",
+ "header" : {
+ "uuid" : "$uuid"
+ },
+ "consistsOf": [
+ {
+ "@class": "IsIdentifiedBy",
+ "target": {
+ "@class": "SoftwareFacet",
+ "group": "org.gcube.data-catalogue",
+ "name": "gcat"
+ }
+ }
+ ]
+ },
+ "target":{
+ "@class": "VirtualService",
+ "consistsOf": [
+ {
+ "@class": "IsIdentifiedBy",
+ "target": {
+ "@class": "SoftwareFacet",
+ "group": "org.gcube.data-catalogue",
+ "name": "catalogue-virtual-service"
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file