Merge branch 'feature/20225' of gitea@code-repo.d4science.org:gCubeSystem/gcat.git into feature/20225
This commit is contained in:
commit
1971d5f0de
|
@ -3,11 +3,11 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
|||
# Changelog for gCube Catalogue (gCat) Service
|
||||
|
||||
|
||||
## [v2.4.2-SNAPSHOT]
|
||||
## [v2.5.0-SNAPSHOT]
|
||||
|
||||
- Switched from commons-lang3 to commons-lang to avoid duplicates
|
||||
- Set resource-registry-publisher dependency scope to provided
|
||||
|
||||
- Switching to Facet Based IS [#20225]
|
||||
|
||||
## [v2.4.1] [r5.14.0] - 2022-11-04
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
Welcome to gCube Catalogue Service (aka gCat) documentation
|
||||
***********************************************************
|
||||
|
||||
gCat is a RESTful application which exposes operations ...
|
||||
gCat is a RESTful application which exposes operations via REST-API.
|
||||
|
||||
See the available REST-API on `its API docs <../api-docs/index.html>`_.
|
||||
|
||||
|
|
7
pom.xml
7
pom.xml
|
@ -12,7 +12,7 @@
|
|||
<groupId>org.gcube.data-catalogue</groupId>
|
||||
<artifactId>gcat</artifactId>
|
||||
<packaging>war</packaging>
|
||||
<version>2.4.2-SNAPSHOT</version>
|
||||
<version>2.5.0-SNAPSHOT</version>
|
||||
<name>gCube Catalogue (gCat) Service</name>
|
||||
<description>
|
||||
This service allows any client to publish on the gCube Catalogue.
|
||||
|
@ -98,6 +98,11 @@
|
|||
<groupId>org.gcube.information-system</groupId>
|
||||
<artifactId>resource-registry-publisher</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.gcube.information-system</groupId>
|
||||
<artifactId>resource-registry-query-template-client</artifactId>
|
||||
<version>[1.0.0-SNAPSHOT,2.0.0-SNAPSHOT)</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.gcube.resources</groupId>
|
||||
<artifactId>common-gcore-resources</artifactId>
|
||||
|
|
|
@ -0,0 +1,114 @@
|
|||
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.gcube.smartgears.ContextProvider;
|
||||
import org.gcube.smartgears.context.application.ApplicationContext;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* @author Luca Frosini (ISTI - CNR)
|
||||
*/
|
||||
public class GCatInitializator implements ApplicationManager {
|
||||
|
||||
/**
|
||||
* Logger
|
||||
*/
|
||||
private static Logger logger = LoggerFactory.getLogger(GCatInitializator.class);
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* The method discover the plugins available on classpath and their own
|
||||
* supported capabilities and publish a ServiceEndpoint with the
|
||||
* discovered information.
|
||||
* Furthermore create/connect to DB
|
||||
*/
|
||||
@Override
|
||||
public void onInit() {
|
||||
RequestFilter requestFilter = new RequestFilter();
|
||||
try {
|
||||
requestFilter.filter(null);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
String context = SecretManagerProvider.instance.get().getContext();
|
||||
|
||||
logger.trace(
|
||||
"\n-------------------------------------------------------\n"
|
||||
+ "GCat is Starting on context {}\n"
|
||||
+ "-------------------------------------------------------",
|
||||
context);
|
||||
|
||||
ApplicationContext applicationContext = ContextProvider.get();
|
||||
String gcatEServiceID = applicationContext.id();
|
||||
|
||||
try {
|
||||
FacetBasedISConfigurationProxy facetBasedISConfigurationProxy = FacetBasedISConfigurationProxyFactory.getInstance(context);
|
||||
facetBasedISConfigurationProxy.setGcatEServiceID(gcatEServiceID);
|
||||
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"
|
||||
+ "-------------------------------------------------------",
|
||||
context);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* This function is invoked before the service will stop and unpublish the
|
||||
* resource from the IS to maintain the infrastructure integrity.
|
||||
* Furthermore close the connection to DB.
|
||||
*/
|
||||
@Override
|
||||
public void onShutdown(){
|
||||
RequestFilter requestFilter = new RequestFilter();
|
||||
try {
|
||||
requestFilter.filter(null);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
String context = SecretManagerProvider.instance.get().getContext();
|
||||
|
||||
logger.trace(
|
||||
"\n-------------------------------------------------------\n"
|
||||
+ "GCat is Stopping on context {}\n"
|
||||
+ "-------------------------------------------------------",
|
||||
context);
|
||||
|
||||
/*
|
||||
* We don't delete the relation.
|
||||
* Thanks to the propagation constraint,
|
||||
* it will be deleted when the EService will be deleted.
|
||||
*
|
||||
ApplicationContext applicationContext = ContextProvider.get();
|
||||
String gcatEServiceID = applicationContext.id();
|
||||
|
||||
FacetBasedISConfigurationProxy facetBasedISConfigurationProxy = FacetBasedISConfigurationProxyFactory.getInstance(context);
|
||||
facetBasedISConfigurationProxy.setGcatEServiceID(gcatEServiceID);
|
||||
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"
|
||||
+ "-------------------------------------------------------",
|
||||
context);
|
||||
}
|
||||
}
|
|
@ -4,12 +4,14 @@ import javax.ws.rs.ApplicationPath;
|
|||
|
||||
import org.gcube.gcat.rest.Item;
|
||||
import org.gcube.gcat.rest.administration.Configuration;
|
||||
import org.gcube.smartgears.annotations.ManagedBy;
|
||||
import org.glassfish.jersey.server.ResourceConfig;
|
||||
|
||||
/**
|
||||
* @author Luca Frosini (ISTI - CNR)
|
||||
*/
|
||||
@ApplicationPath("/")
|
||||
@ManagedBy(GCatInitializator.class)
|
||||
public class ResourceInitializer extends ResourceConfig {
|
||||
|
||||
public ResourceInitializer() {
|
||||
|
|
|
@ -5,6 +5,8 @@ import java.util.Map;
|
|||
|
||||
import org.gcube.common.authorization.utils.manager.SecretManagerProvider;
|
||||
import org.gcube.gcat.configuration.isproxies.GCoreISConfigurationProxy;
|
||||
import org.gcube.gcat.configuration.isproxies.GCoreISConfigurationProxyFactory;
|
||||
import org.gcube.gcat.configuration.isproxies.FacetBasedISConfigurationProxyFactory;
|
||||
import org.gcube.gcat.configuration.isproxies.FacetBasedISConfigurationProxy;
|
||||
import org.gcube.gcat.configuration.service.ServiceCatalogueConfiguration;
|
||||
import org.gcube.gcat.persistence.ckan.CKANUserCache;
|
||||
|
@ -21,26 +23,32 @@ public class CatalogueConfigurationFactory {
|
|||
}
|
||||
|
||||
private static ServiceCatalogueConfiguration load(String context) {
|
||||
FacetBasedISConfigurationProxy restISConfigurationProxy = new FacetBasedISConfigurationProxy(context);
|
||||
ServiceCatalogueConfiguration serviceCatalogueConfiguration = restISConfigurationProxy.getCatalogueConfiguration();
|
||||
if(serviceCatalogueConfiguration == null) {
|
||||
GCoreISConfigurationProxy gCoreISConfigurationProxy = new GCoreISConfigurationProxy(context);
|
||||
ServiceCatalogueConfiguration serviceCatalogueConfiguration = null;
|
||||
try {
|
||||
FacetBasedISConfigurationProxy facetBasedISConfigurationProxy = FacetBasedISConfigurationProxyFactory.getInstance(context);
|
||||
serviceCatalogueConfiguration = facetBasedISConfigurationProxy.getCatalogueConfiguration();
|
||||
} catch(Exception e){
|
||||
GCoreISConfigurationProxy gCoreISConfigurationProxy = GCoreISConfigurationProxyFactory.getInstance();
|
||||
serviceCatalogueConfiguration = gCoreISConfigurationProxy.getCatalogueConfiguration();
|
||||
}
|
||||
return serviceCatalogueConfiguration;
|
||||
}
|
||||
|
||||
private static void purgeFromIS(String context) {
|
||||
FacetBasedISConfigurationProxy restISConfigurationProxy = new FacetBasedISConfigurationProxy(context);
|
||||
FacetBasedISConfigurationProxy restISConfigurationProxy = FacetBasedISConfigurationProxyFactory.getInstance(context);
|
||||
restISConfigurationProxy.delete();
|
||||
GCoreISConfigurationProxy gCoreISConfigurationProxy = new GCoreISConfigurationProxy(context);
|
||||
|
||||
GCoreISConfigurationProxy gCoreISConfigurationProxy = GCoreISConfigurationProxyFactory.getInstance();
|
||||
gCoreISConfigurationProxy.delete();
|
||||
}
|
||||
|
||||
private static void createOrUpdateOnIS(String context, ServiceCatalogueConfiguration catalogueConfiguration) throws Exception {
|
||||
FacetBasedISConfigurationProxy restISConfigurationProxy = new FacetBasedISConfigurationProxy(context,catalogueConfiguration);
|
||||
FacetBasedISConfigurationProxy restISConfigurationProxy = FacetBasedISConfigurationProxyFactory.getInstance(context);
|
||||
restISConfigurationProxy.setCatalogueConfiguration(catalogueConfiguration);
|
||||
restISConfigurationProxy.createOrUpdateOnIS();
|
||||
GCoreISConfigurationProxy gCoreISConfigurationProxy = new GCoreISConfigurationProxy(context, catalogueConfiguration);
|
||||
|
||||
GCoreISConfigurationProxy gCoreISConfigurationProxy = GCoreISConfigurationProxyFactory.getInstance();
|
||||
gCoreISConfigurationProxy.setCatalogueConfiguration(catalogueConfiguration);
|
||||
gCoreISConfigurationProxy.createOrUpdateOnIS();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,264 +1,454 @@
|
|||
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;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.ws.rs.InternalServerErrorException;
|
||||
|
||||
import org.gcube.com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import org.gcube.gcat.api.GCatConstants;
|
||||
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.base.reference.Direction;
|
||||
import org.gcube.informationsystem.model.reference.entities.Facet;
|
||||
import org.gcube.informationsystem.model.reference.entities.Resource;
|
||||
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.types.TypeMapper;
|
||||
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.facets.SoftwareFacet;
|
||||
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.consistsof.IsIdentifiedBy;
|
||||
import org.gcube.resourcemanagement.model.reference.relations.isrelatedto.CallsFor;
|
||||
import org.gcube.resourcemanagement.model.reference.relations.isrelatedto.IsCustomizedBy;
|
||||
import org.gcube.resourcemanagement.model.reference.relations.isrelatedto.Uses;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* @author Luca Frosini (ISTI - CNR)
|
||||
*/
|
||||
public class FacetBasedISConfigurationProxy extends ISConfigurationProxy<Configuration> {
|
||||
public class FacetBasedISConfigurationProxy extends ISConfigurationProxy<SimpleFacet> {
|
||||
|
||||
private static Logger logger = LoggerFactory.getLogger(FacetBasedISConfigurationProxy.class);
|
||||
|
||||
public static final String QUERY_TEMPLATE_DIRECTORY_NAME = "query-template";
|
||||
public static final String GCAT_ESERVICE_UUID_VARNAME = "$uuid";
|
||||
public static final String GET_CALLS_FOR_QUERY_TEMPLATE_FILENAME = "01-get-calls-for-query-template.json";
|
||||
|
||||
public static final String QUERY_DIRECTORY_NAME = "query";
|
||||
public static final String GET_CATALOGUE_VIRTUAL_SERVICE_FILENAME = "01-get-catalogue-virtual-service.json";
|
||||
public static final String GET_GCAT_CONFIGURATION_FILENAME = "02-get-gcat-configuration.json";
|
||||
public static final String GET_SIMPLE_FACET_OF_GCAT_CONFIGURATION_FILENAME = "03-get-simple-facet-of-gcat-configuration.json";
|
||||
public static final String GET_ACCESS_POINT_FACET_OF_CKAN_SERVICE_FILENAME = "05-get-access-point-facet-of-ckan-service.json";
|
||||
public static final String GET_ACCESS_POINT_FACET_OF_POSTGRES_CKAN_DB_FILENAME = "07-get-access-point-facet-of-postgres-ckan-db.json";
|
||||
public static final String GET_ACCESS_POINT_FACET_OF_SOLR_SERVICE_FILENAME = "09-get-access-point-facet-of-solr-service.json";
|
||||
|
||||
private static String queryTemplateName;
|
||||
|
||||
static {
|
||||
ResourceRegistryQueryTemplateClient rrqtc = ResourceRegistryQueryTemplateClientFactory.create();
|
||||
try {
|
||||
queryTemplateName = installQueryTemplate(rrqtc);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected static QueryTemplate getQueryTemplate() throws Exception {
|
||||
File queryTemplateFile = getJsonQueryTemplateFromFile(GET_CALLS_FOR_QUERY_TEMPLATE_FILENAME);
|
||||
QueryTemplate queryTemplate = ElementMapper.unmarshal(QueryTemplate.class, new FileReader(queryTemplateFile));
|
||||
return queryTemplate;
|
||||
}
|
||||
|
||||
protected static String installQueryTemplate(ResourceRegistryQueryTemplateClient rrqtc) throws Exception {
|
||||
QueryTemplate queryTemplate = getQueryTemplate();
|
||||
/*
|
||||
* Going to create/update the query template.
|
||||
* No need to test if exists and/or if is the last version.
|
||||
*/
|
||||
queryTemplate = rrqtc.update(queryTemplate);
|
||||
|
||||
return queryTemplate.getName();
|
||||
}
|
||||
|
||||
protected static 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);
|
||||
}
|
||||
|
||||
protected static File getJsonQueryTemplateFromFile(String filename) throws Exception {
|
||||
return getFile(QUERY_TEMPLATE_DIRECTORY_NAME, filename);
|
||||
}
|
||||
|
||||
protected static File getJsonQueryFromFile(String filename) throws Exception {
|
||||
return getFile(QUERY_DIRECTORY_NAME, filename);
|
||||
}
|
||||
|
||||
//
|
||||
// Configuration
|
||||
// ----------------------
|
||||
// IsCustomizedBy | |
|
||||
// -----------------> | gcat-configuration |
|
||||
// / | |
|
||||
// / ----------------------
|
||||
// EService VirtualService /
|
||||
// ------------ -----------------------------
|
||||
// | | CallsFor | |
|
||||
// | gcat | ------------> | catalogue-virtual-service |
|
||||
// | | | |
|
||||
// ------------ -----------------------------
|
||||
// \ EService
|
||||
// \ --------------------
|
||||
// \ Uses | |
|
||||
// \ ------------------> | postgres-ckan-db |
|
||||
// \ / | |
|
||||
// \ EService / --------------------
|
||||
// \ -----------------
|
||||
// \ CallsFor | |
|
||||
// -------------> | ckan |
|
||||
// | |
|
||||
// ----------------- EService
|
||||
// \ --------------------
|
||||
// \ Uses | |
|
||||
// ------------------> | solr |
|
||||
// | |
|
||||
// --------------------
|
||||
|
||||
/*
|
||||
* Some resources are not needed to be queried and maintained.
|
||||
* Leaving comment to remember that is not an error
|
||||
* protected Configuration configuration;
|
||||
*
|
||||
* public static final String GET_CKAN_SERVICE_FILENAME = "04-get-ckan-service.json";
|
||||
* protected EService ckanService;
|
||||
*
|
||||
* public static final String GET_POSTGRES_CKAN_DB_FILENAME = "06-get-postgres-ckan-db.json";
|
||||
* protected EService solrService;
|
||||
*
|
||||
* public static final String GET_SOLR_SERVICE_FILENAME = "08-get-solr-service.json";
|
||||
* protected EService ckanDB;
|
||||
*
|
||||
*/
|
||||
|
||||
protected final ObjectMapper objectMapper;
|
||||
protected final ResourceRegistryClient resourceRegistryClient;
|
||||
protected final ResourceRegistryPublisher resourceRegistryPublisher;
|
||||
|
||||
/*
|
||||
* We need to keep this resource because we want to create
|
||||
* an IsRelatedTo relation
|
||||
* i.e. EService(gcat) --CallsFor--> VirtualService(catalogue-virtual-service)
|
||||
*/
|
||||
protected VirtualService virtualService;
|
||||
protected Configuration configuration;
|
||||
|
||||
protected SimpleFacet configurationSimpleFacet;
|
||||
|
||||
protected EService ckanService;
|
||||
protected EService solrService;
|
||||
protected EService ckanDB;
|
||||
|
||||
protected String gcatEServiceID;
|
||||
|
||||
public FacetBasedISConfigurationProxy(String context) {
|
||||
super(context);
|
||||
objectMapper = new ObjectMapper();
|
||||
resourceRegistryClient = ResourceRegistryClientFactory.create();
|
||||
resourceRegistryPublisher = ResourceRegistryPublisherFactory.create();
|
||||
}
|
||||
|
||||
public FacetBasedISConfigurationProxy(String context, ServiceCatalogueConfiguration catalogueConfiguration) {
|
||||
super(context, catalogueConfiguration);
|
||||
public VirtualService getVirtualService() {
|
||||
if(virtualService==null) {
|
||||
virtualService = queryVirtualService();
|
||||
}
|
||||
return virtualService;
|
||||
}
|
||||
|
||||
protected VirtualService queryVirtualService(ResourceRegistryClient resourceRegistryClient) throws ResourceRegistryException, JsonProcessingException {
|
||||
Map<String,String> facetConstraint = new HashMap<>();
|
||||
facetConstraint.put(SoftwareFacet.GROUP_PROPERTY, GCatConstants.CONFIGURATION_CATEGORY);
|
||||
facetConstraint.put(SoftwareFacet.NAME_PROPERTY, GCatConstants.CATALOGUE_SERVICE_VIRTUAL_SERVICE_ID);
|
||||
public void setGcatEServiceID(String gcatEServiceID) {
|
||||
this.gcatEServiceID = gcatEServiceID;
|
||||
}
|
||||
|
||||
public List<CallsFor<EService, VirtualService>> getCallsForToVirtualService() throws Exception {
|
||||
ResourceRegistryQueryTemplateClient rrqtc = ResourceRegistryQueryTemplateClientFactory.create();
|
||||
|
||||
logger.trace("Going to query for {} --{}--> ({} with {})",
|
||||
VirtualService.NAME, IsIdentifiedBy.NAME, SoftwareFacet.NAME, facetConstraint);
|
||||
ObjectNode objectNode = objectMapper.createObjectNode();
|
||||
objectNode.put(GCAT_ESERVICE_UUID_VARNAME, gcatEServiceID);
|
||||
|
||||
List<VirtualService> virtualServices = resourceRegistryClient.getFilteredResources(VirtualService.class, IsIdentifiedBy.class, SoftwareFacet.class, false, facetConstraint);
|
||||
int size = virtualServices.size();
|
||||
if(virtualServices==null || size==0) {
|
||||
String message = String.format("No %s --%s--> (%s with %s) found",
|
||||
VirtualService.NAME, IsIdentifiedBy.NAME, SoftwareFacet.NAME, facetConstraint.toString());
|
||||
List<CallsFor<EService, VirtualService>> callsForList = rrqtc.run(queryTemplateName, objectNode);
|
||||
return callsForList;
|
||||
}
|
||||
|
||||
public List<CallsFor<EService, VirtualService>> deleteCallsForToVirtualService(List<CallsFor<EService, VirtualService>> callsForList) throws SchemaViolationException, NotFoundException, ResourceRegistryException {
|
||||
for(CallsFor<EService, VirtualService> cf : callsForList) {
|
||||
resourceRegistryPublisher.delete(cf);
|
||||
}
|
||||
return callsForList;
|
||||
}
|
||||
|
||||
public List<CallsFor<EService, VirtualService>> deleteCallsForToVirtualService() throws Exception {
|
||||
List<CallsFor<EService, VirtualService>> callsForList = getCallsForToVirtualService();
|
||||
return deleteCallsForToVirtualService(callsForList);
|
||||
}
|
||||
|
||||
public CallsFor<EService, VirtualService> createCallsForToVirtualService() throws Exception {
|
||||
List<CallsFor<EService, VirtualService>> callsForList = getCallsForToVirtualService();
|
||||
|
||||
CallsFor<EService, VirtualService> callsFor = null;
|
||||
|
||||
int size = callsForList.size();
|
||||
|
||||
UUID gcatEServiceUUID = UUID.fromString(gcatEServiceID);
|
||||
|
||||
if(size>1) {
|
||||
logger.warn("There are {} instances of {} relation beetween gcat Eservice with UUID {} and the {} (catalogue-virtual-service). This is very strange because there should be only one. We are going to delete them and recreated a new one.",
|
||||
callsForList.size(), CallsFor.NAME, gcatEServiceID, VirtualService.NAME);
|
||||
logger.trace("{} relation instances that are going to be deleted are {}",
|
||||
CallsFor.NAME, ElementMapper.marshal(callsForList));
|
||||
deleteCallsForToVirtualService(callsForList);
|
||||
size = 0;
|
||||
}
|
||||
|
||||
if(size==0) {
|
||||
PropagationConstraint propagationConstraint = new PropagationConstraintImpl();
|
||||
propagationConstraint.setAddConstraint(AddConstraint.unpropagate);
|
||||
propagationConstraint.setRemoveConstraint(RemoveConstraint.keep);
|
||||
EService gcatEService = new EServiceImpl();
|
||||
gcatEService.setHeader(new HeaderImpl(gcatEServiceUUID));
|
||||
VirtualService virtualService = queryVirtualService();
|
||||
callsFor = new CallsForImpl<EService, VirtualService>(gcatEService, virtualService, propagationConstraint);
|
||||
callsFor = resourceRegistryPublisher.create(callsFor);
|
||||
}else if(size==1){
|
||||
callsFor = callsForList.get(0);
|
||||
}
|
||||
|
||||
return callsFor;
|
||||
}
|
||||
|
||||
protected List<Entity> 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);
|
||||
List<Entity> entities = ElementMapper.unmarshalList(Entity.class, result);
|
||||
return entities;
|
||||
}
|
||||
|
||||
protected JsonNode getQuery(File jsonQueryFile) throws Exception {
|
||||
JsonNode query = objectMapper.readTree(jsonQueryFile);
|
||||
return query;
|
||||
}
|
||||
|
||||
protected <E extends Entity> E getUniqueEntity(List<E> entities, String originalQuery) throws JsonProcessingException {
|
||||
int size = entities.size();
|
||||
if(entities==null || size==0) {
|
||||
String message = String.format("No instance found with query:\n%s", originalQuery);
|
||||
logger.error(message);
|
||||
throw new InternalServerErrorException(message);
|
||||
}
|
||||
|
||||
if(size>1) {
|
||||
String message = String.format(
|
||||
"Too many %s --%s--> (%s with %s) found (i.e. expected 1, found %d)). %s",
|
||||
VirtualService.NAME, IsIdentifiedBy.NAME, SoftwareFacet.NAME,
|
||||
facetConstraint.toString(), size, ElementMapper.marshal(virtualServices));
|
||||
"Too many instances found (i.e. expected 1, found %d) with query:\n%s\nthe obtained result is:\n%s",
|
||||
size, originalQuery, ElementMapper.marshal(entities));
|
||||
logger.error(message);
|
||||
throw new InternalServerErrorException(message);
|
||||
}
|
||||
|
||||
return virtualServices.get(0);
|
||||
return entities.get(0);
|
||||
}
|
||||
|
||||
|
||||
protected Configuration queryConfiguration(ResourceRegistryClient resourceRegistryClient, VirtualService virtualService) throws ResourceRegistryException, JsonProcessingException {
|
||||
List<Configuration> configurations = resourceRegistryClient.getRelatedResourcesFromReferenceResource(
|
||||
Configuration.class, IsCustomizedBy.class, virtualService, Direction.IN, true);
|
||||
int size = configurations.size();
|
||||
if(configurations==null || size==0) {
|
||||
String message = String.format(
|
||||
"No %s <--%s-- (%s uuid:%s) found",
|
||||
Configuration.NAME, IsCustomizedBy.NAME, VirtualService.NAME,
|
||||
virtualService.getHeader().getUUID());
|
||||
logger.error(message);
|
||||
throw new InternalServerErrorException(message);
|
||||
}
|
||||
|
||||
if(size>1) {
|
||||
String message = String.format(
|
||||
"Too many %s <--%s-- (%s uuid:%s) found (i.e. expected 1, found %d)). %s",
|
||||
Configuration.NAME, IsCustomizedBy.NAME, VirtualService.NAME,
|
||||
virtualService.getHeader().getUUID(), size, ElementMapper.marshal(configurations));
|
||||
logger.error(message);
|
||||
throw new InternalServerErrorException(message);
|
||||
}
|
||||
|
||||
return configurations.get(0);
|
||||
protected Entity queryEntity(String filename) throws Exception{
|
||||
File jsonQueryFile = getJsonQueryFromFile(filename);
|
||||
JsonNode query = getQuery(jsonQueryFile);
|
||||
String jsonQueryAsString = objectMapper.writeValueAsString(query);
|
||||
List<Entity> entities = queryListOfEntities(jsonQueryAsString);
|
||||
return getUniqueEntity(entities, jsonQueryAsString);
|
||||
}
|
||||
|
||||
protected <F extends Facet, C extends ConsistsOf<? extends Resource, F>> F getFacetFromResource(Resource resource, Class<C> coClz, Class<F> fClz) throws JsonProcessingException {
|
||||
List<F> facets = resource.getFacets(coClz, fClz);
|
||||
int size = facets.size();
|
||||
if(facets==null || size==0) {
|
||||
String message = String.format(
|
||||
"No %s <--%s-- %s found",
|
||||
TypeMapper.getType(fClz), TypeMapper.getType(coClz), TypeMapper.getType(resource.getClass()));
|
||||
logger.error(message);
|
||||
throw new InternalServerErrorException(message);
|
||||
}
|
||||
|
||||
if(size>1) {
|
||||
String message = String.format(
|
||||
"Too many %s <--%s-- %s found (i.e. expected 1, found %d)). %s",
|
||||
TypeMapper.getType(fClz), TypeMapper.getType(coClz), TypeMapper.getType(resource.getClass()),
|
||||
size, ElementMapper.marshal(facets));
|
||||
logger.error(message);
|
||||
throw new InternalServerErrorException(message);
|
||||
}
|
||||
|
||||
return facets.get(0);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected SimpleFacet getConfigurationSimpleFacet() throws JsonProcessingException {
|
||||
return getFacetFromResource(configuration, ConsistsOf.class, SimpleFacet.class);
|
||||
}
|
||||
|
||||
protected EService queryCkanService(ResourceRegistryClient resourceRegistryClient, VirtualService virtualService) throws ResourceRegistryException, JsonProcessingException {
|
||||
List<EService> eServices = resourceRegistryClient.getRelatedResourcesFromReferenceResource(
|
||||
EService.class, CallsFor.class, virtualService, Direction.IN, true);
|
||||
int size = eServices.size();
|
||||
if(eServices==null || size==0) {
|
||||
String message = String.format(
|
||||
"No %s <--%s-- (%s uuid:%s) found",
|
||||
EService.NAME, Uses.NAME, VirtualService.NAME,
|
||||
virtualService.getHeader().getUUID());
|
||||
logger.error(message);
|
||||
throw new InternalServerErrorException(message);
|
||||
}
|
||||
|
||||
if(size>1) {
|
||||
String message = String.format(
|
||||
"Too many %s <--%s-- (%s uuid:%s) found (i.e. expected 1, found %d)). %s",
|
||||
EService.NAME, CallsFor.NAME, VirtualService.NAME,
|
||||
virtualService.getHeader().getUUID(), size, ElementMapper.marshal(eServices));
|
||||
logger.error(message);
|
||||
throw new InternalServerErrorException(message);
|
||||
}
|
||||
|
||||
return eServices.get(0);
|
||||
}
|
||||
|
||||
protected List<EService> queryEServicesUsedByCkanService(ResourceRegistryClient resourceRegistryClient, EService ckanService) throws ResourceRegistryException, JsonProcessingException {
|
||||
List<EService> eServices = resourceRegistryClient.getRelatedResourcesFromReferenceResource(
|
||||
EService.class, Uses.class, ckanService, Direction.IN, true);
|
||||
int size = eServices.size();
|
||||
if(eServices==null || size==0) {
|
||||
String message = String.format(
|
||||
"No %s <--%s-- (%s uuid:%s) found",
|
||||
EService.NAME, Uses.NAME, EService.NAME,
|
||||
ckanService.getHeader().getUUID());
|
||||
logger.error(message);
|
||||
throw new InternalServerErrorException(message);
|
||||
}
|
||||
|
||||
return eServices;
|
||||
}
|
||||
|
||||
protected void getSolrServiceAndCKanDB(List<EService> eServices) throws JsonProcessingException {
|
||||
for(EService eService : eServices) {
|
||||
SoftwareFacet softwareFacet = getFacetFromResource(eService, IsIdentifiedBy.class, SoftwareFacet.class);
|
||||
String group = softwareFacet.getGroup();
|
||||
String name = softwareFacet.getName();
|
||||
|
||||
|
||||
// TODO
|
||||
|
||||
|
||||
// if(group.compareTo()==0 && name.compareTo()==0) {
|
||||
// // TODO
|
||||
// }
|
||||
//
|
||||
// if(group.compareTo()==0 && name.compareTo()==0) {
|
||||
// // TODO
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
if(solrService==null) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
if(ckanDB==null) {
|
||||
// TODO
|
||||
protected VirtualService queryVirtualService() throws InternalServerErrorException {
|
||||
try {
|
||||
VirtualService virtualService = (VirtualService) queryEntity(GET_CATALOGUE_VIRTUAL_SERVICE_FILENAME);
|
||||
return virtualService;
|
||||
}catch (Exception e) {
|
||||
throw new InternalServerErrorException(e);
|
||||
}
|
||||
}
|
||||
|
||||
protected ServiceCatalogueConfiguration createServiceCatalogueConfiguration() {
|
||||
ServiceCatalogueConfiguration serviceCatalogueConfiguration = new ServiceCatalogueConfiguration(context);
|
||||
protected Configuration queryGcatConfiguration() throws Exception {
|
||||
Configuration configuration = (Configuration) queryEntity(GET_GCAT_CONFIGURATION_FILENAME);
|
||||
return configuration;
|
||||
}
|
||||
|
||||
protected SimpleFacet queryConfigurationSimpleFacet() throws Exception {
|
||||
SimpleFacet configurationSimpleFacet = (SimpleFacet) queryEntity(GET_SIMPLE_FACET_OF_GCAT_CONFIGURATION_FILENAME);
|
||||
return configurationSimpleFacet;
|
||||
}
|
||||
|
||||
protected AccessPointFacet queryCkanServiceAccessPointFacet() throws Exception {
|
||||
AccessPointFacet accessPointFacet = (AccessPointFacet) queryEntity(GET_ACCESS_POINT_FACET_OF_CKAN_SERVICE_FILENAME);
|
||||
return accessPointFacet;
|
||||
}
|
||||
|
||||
protected AccessPointFacet queryPostgresCkanDBAccessPointFacet() throws Exception {
|
||||
AccessPointFacet accessPointFacet = (AccessPointFacet) queryEntity(GET_ACCESS_POINT_FACET_OF_POSTGRES_CKAN_DB_FILENAME);
|
||||
return accessPointFacet;
|
||||
}
|
||||
|
||||
public AccessPointFacet querySolrServiceAccessPointFacet() throws Exception {
|
||||
AccessPointFacet accessPointFacet = (AccessPointFacet) queryEntity(GET_ACCESS_POINT_FACET_OF_SOLR_SERVICE_FILENAME);
|
||||
return accessPointFacet;
|
||||
}
|
||||
|
||||
protected ServiceCatalogueConfiguration setConfigurationInfoFromSimpleFacet(SimpleFacet configurationSimpleFacet, ServiceCatalogueConfiguration catalogueConfiguration) throws Exception {
|
||||
Header header = configurationSimpleFacet.getHeader();
|
||||
if(header!=null && header.getUUID()!=null) {
|
||||
catalogueConfiguration.setID(header.getUUID().toString());
|
||||
}
|
||||
|
||||
serviceCatalogueConfiguration.setID(configuration.getHeader().getUUID().toString());
|
||||
serviceCatalogueConfiguration.setModerationEnabled((boolean) configurationSimpleFacet.getAdditionalProperty(CatalogueConfiguration.MODERATION_ENABLED_KEY));
|
||||
serviceCatalogueConfiguration.setNotificationToUsersEnabled((boolean) configurationSimpleFacet.getAdditionalProperty(CatalogueConfiguration.NOTIFICATION_TO_USER_ENABLED_KEY));
|
||||
serviceCatalogueConfiguration.setSocialPostEnabled((boolean) configurationSimpleFacet.getAdditionalProperty(CatalogueConfiguration.SOCIAL_POST_ENABLED_KEY));
|
||||
catalogueConfiguration.setModerationEnabled((boolean) configurationSimpleFacet.getAdditionalProperty(CatalogueConfiguration.MODERATION_ENABLED_KEY));
|
||||
catalogueConfiguration.setNotificationToUsersEnabled((boolean) configurationSimpleFacet.getAdditionalProperty(CatalogueConfiguration.NOTIFICATION_TO_USER_ENABLED_KEY));
|
||||
catalogueConfiguration.setSocialPostEnabled((boolean) configurationSimpleFacet.getAdditionalProperty(CatalogueConfiguration.SOCIAL_POST_ENABLED_KEY));
|
||||
|
||||
serviceCatalogueConfiguration.setDefaultOrganization((String) configurationSimpleFacet.getAdditionalProperty(CatalogueConfiguration.DEFAULT_ORGANIZATION_KEY));
|
||||
catalogueConfiguration.setDefaultOrganization((String) configurationSimpleFacet.getAdditionalProperty(CatalogueConfiguration.DEFAULT_ORGANIZATION_KEY));
|
||||
|
||||
Object supportedOrganizationsObj = configurationSimpleFacet.getAdditionalProperty(CatalogueConfiguration.SUPPORTED_ORGANIZATIONS_KEY);
|
||||
Set<String> supportedOrganizations = new HashSet<>();
|
||||
|
||||
if(supportedOrganizationsObj instanceof Collection) {
|
||||
supportedOrganizations = new HashSet<String>((Collection<String>) supportedOrganizationsObj);
|
||||
boolean forceUpdate = false;
|
||||
|
||||
if(supportedOrganizationsObj!=null && supportedOrganizationsObj instanceof Collection) {
|
||||
@SuppressWarnings("unchecked")
|
||||
Set<String> supportedOrganizations = new HashSet<String>((Collection<String>) supportedOrganizationsObj);
|
||||
catalogueConfiguration.setSupportedOrganizations(supportedOrganizations);
|
||||
}else {
|
||||
Set<String> supportedOrganizations = new HashSet<>();
|
||||
supportedOrganizations.add(catalogueConfiguration.getDefaultOrganization());
|
||||
configurationSimpleFacet.setAdditionalProperty(CatalogueConfiguration.SUPPORTED_ORGANIZATIONS_KEY, supportedOrganizations);
|
||||
forceUpdate = true;
|
||||
catalogueConfiguration.setSupportedOrganizations(supportedOrganizations);
|
||||
}
|
||||
|
||||
supportedOrganizations.add(serviceCatalogueConfiguration.getDefaultOrganization());
|
||||
serviceCatalogueConfiguration.setSupportedOrganizations(supportedOrganizations);
|
||||
|
||||
Map<String,Object> additionalProperties = new HashMap<>(configurationSimpleFacet.getAdditionalProperties());
|
||||
|
||||
for(String key : additionalProperties.keySet()) {
|
||||
if(!CatalogueConfiguration.KNOWN_PROPERTIES.contains(key)) {
|
||||
serviceCatalogueConfiguration.setAdditionalProperty(key, additionalProperties.get(key));
|
||||
if(key.startsWith("@")) {
|
||||
continue;
|
||||
}
|
||||
Object value = additionalProperties.get(key);
|
||||
catalogueConfiguration.setAdditionalProperty(key, value);
|
||||
}
|
||||
}
|
||||
|
||||
return serviceCatalogueConfiguration;
|
||||
if(forceUpdate) {
|
||||
updateOnIS();
|
||||
}
|
||||
|
||||
return catalogueConfiguration;
|
||||
}
|
||||
|
||||
public ServiceCatalogueConfiguration setCkanServiceInfo(ServiceCatalogueConfiguration catalogueConfiguration) throws Exception {
|
||||
AccessPointFacet ckanServiceAccessPointFacet = queryCkanServiceAccessPointFacet();
|
||||
catalogueConfiguration.setCkanURL(ckanServiceAccessPointFacet.getEndpoint().toString());
|
||||
Encrypted encrypted = (Encrypted) ckanServiceAccessPointFacet.getAdditionalProperty(CatalogueConfiguration.SYS_ADMIN_TOKEN_KEY);
|
||||
String encryptedPassword = encrypted.getEncryptedValue();
|
||||
catalogueConfiguration.setSysAdminToken(encryptedPassword);
|
||||
return catalogueConfiguration;
|
||||
}
|
||||
|
||||
public ServiceCatalogueConfiguration setCkanDBInfo(ServiceCatalogueConfiguration catalogueConfiguration) throws Exception {
|
||||
AccessPointFacet postgresCkanDBAccessPointFacet = queryPostgresCkanDBAccessPointFacet();
|
||||
ServiceCKANDB ckanDB = new ServiceCKANDB();
|
||||
String ckanDbURL = postgresCkanDBAccessPointFacet.getEndpoint().toString();
|
||||
ckanDB.setUrl(ckanDbURL);
|
||||
Encrypted encrypted = (Encrypted) postgresCkanDBAccessPointFacet.getAdditionalProperty(ServiceCKANDB.PASSWORD_KEY);
|
||||
String encryptedPassword = encrypted.getEncryptedValue();
|
||||
ckanDB.setEncryptedPassword(encryptedPassword);
|
||||
String username = (String) postgresCkanDBAccessPointFacet.getAdditionalProperty(ServiceCKANDB.USERNAME_KEY);
|
||||
ckanDB.setUsername(username);
|
||||
catalogueConfiguration.setCkanDB(ckanDB);
|
||||
return catalogueConfiguration;
|
||||
}
|
||||
|
||||
public ServiceCatalogueConfiguration setSolrServiceInfo(ServiceCatalogueConfiguration catalogueConfiguration) throws Exception {
|
||||
AccessPointFacet solrServiceAccessPointFacet = querySolrServiceAccessPointFacet();
|
||||
String solrURL = solrServiceAccessPointFacet.getEndpoint().toString();
|
||||
catalogueConfiguration.setSolrURL(solrURL);
|
||||
return catalogueConfiguration;
|
||||
}
|
||||
|
||||
protected SimpleFacet getSimpleFacetFromConfiguration(ServiceCatalogueConfiguration catalogueConfiguration) {
|
||||
SimpleFacet simpleFacet = new SimpleFacetImpl();
|
||||
if(catalogueConfiguration.getID()!=null) {
|
||||
UUID uuid = null;
|
||||
try {
|
||||
uuid = UUID.fromString(catalogueConfiguration.getID());
|
||||
simpleFacet.getHeader().setUUID(uuid);
|
||||
}catch (Exception e) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
simpleFacet.setAdditionalProperty(CatalogueConfiguration.MODERATION_ENABLED_KEY, catalogueConfiguration.isModerationEnabled());
|
||||
simpleFacet.setAdditionalProperty(CatalogueConfiguration.NOTIFICATION_TO_USER_ENABLED_KEY, catalogueConfiguration.isNotificationToUsersEnabled());
|
||||
simpleFacet.setAdditionalProperty(CatalogueConfiguration.SOCIAL_POST_ENABLED_KEY, catalogueConfiguration.isSocialPostEnabled());
|
||||
|
||||
simpleFacet.setAdditionalProperty(CatalogueConfiguration.DEFAULT_ORGANIZATION_KEY, catalogueConfiguration.getDefaultOrganization());
|
||||
simpleFacet.setAdditionalProperty(CatalogueConfiguration.SUPPORTED_ORGANIZATIONS_KEY, catalogueConfiguration.getSupportedOrganizations());
|
||||
|
||||
Map<String,Object> additionalProperties = new HashMap<>(catalogueConfiguration.getAdditionalProperties());
|
||||
|
||||
for(String key : additionalProperties.keySet()) {
|
||||
if(!CatalogueConfiguration.KNOWN_PROPERTIES.contains(key)) {
|
||||
Object value = additionalProperties.get(key);
|
||||
simpleFacet.setAdditionalProperty(key, value);
|
||||
}
|
||||
}
|
||||
|
||||
return simpleFacet;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ServiceCatalogueConfiguration readFromIS() {
|
||||
try {
|
||||
ResourceRegistryClient resourceRegistryClient = ResourceRegistryClientFactory.create();
|
||||
catalogueConfiguration = new FacetBasedISServiceCatalogueConfiguration(context, this);
|
||||
|
||||
virtualService = queryVirtualService(resourceRegistryClient);
|
||||
|
||||
configuration = queryConfiguration(resourceRegistryClient, virtualService);
|
||||
configurationSimpleFacet = getConfigurationSimpleFacet();
|
||||
|
||||
ckanService = queryCkanService(resourceRegistryClient, virtualService);
|
||||
|
||||
List<EService> eServices = queryEServicesUsedByCkanService(resourceRegistryClient, ckanService);
|
||||
getSolrServiceAndCKanDB(eServices);
|
||||
|
||||
catalogueConfiguration = createServiceCatalogueConfiguration();
|
||||
configurationSimpleFacet = getISResource();
|
||||
|
||||
if(configurationSimpleFacet==null) {
|
||||
configurationSimpleFacet = getSimpleFacetFromConfiguration(catalogueConfiguration);
|
||||
}else {
|
||||
catalogueConfiguration = setConfigurationInfoFromSimpleFacet(configurationSimpleFacet, catalogueConfiguration);
|
||||
}
|
||||
|
||||
catalogueConfiguration = setCkanServiceInfo(catalogueConfiguration);
|
||||
catalogueConfiguration = setCkanDBInfo(catalogueConfiguration);
|
||||
catalogueConfiguration = setSolrServiceInfo(catalogueConfiguration);
|
||||
|
||||
}catch (InternalServerErrorException e) {
|
||||
throw e;
|
||||
|
@ -271,25 +461,51 @@ public class FacetBasedISConfigurationProxy extends ISConfigurationProxy<Configu
|
|||
|
||||
@Override
|
||||
public void delete() {
|
||||
// TODO Auto-generated method stub
|
||||
SimpleFacet simpleFacet = getISResource();
|
||||
if(simpleFacet!=null) {
|
||||
try {
|
||||
resourceRegistryPublisher.delete(simpleFacet);
|
||||
} catch (Exception e) {
|
||||
throw new InternalServerErrorException("Unable to delete SimpleFacet with UUID " + simpleFacet.getHeader().getUUID().toString(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ServiceCatalogueConfiguration createOnIS() throws Exception {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
UUID uuid = configurationSimpleFacet.getHeader().getUUID();
|
||||
if(uuid==null) {
|
||||
Configuration gcatConfiguration = queryGcatConfiguration();
|
||||
ConsistsOf<Configuration, SimpleFacet> co = new ConsistsOfImpl<>(gcatConfiguration, configurationSimpleFacet);
|
||||
co = resourceRegistryPublisher.create(co);
|
||||
configurationSimpleFacet = co.getTarget();
|
||||
setConfigurationInfoFromSimpleFacet(configurationSimpleFacet, catalogueConfiguration);
|
||||
}
|
||||
return catalogueConfiguration;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Configuration getISResource() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
protected SimpleFacet getISResource() {
|
||||
if(configurationSimpleFacet==null) {
|
||||
try {
|
||||
configurationSimpleFacet = queryConfigurationSimpleFacet();
|
||||
}catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return configurationSimpleFacet;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ServiceCatalogueConfiguration updateOnIS(Configuration configuration) throws Exception {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
protected ServiceCatalogueConfiguration updateOnIS() throws Exception {
|
||||
Header header = configurationSimpleFacet.getHeader();
|
||||
if(header!=null && header.getUUID()!=null) {
|
||||
configurationSimpleFacet = getSimpleFacetFromConfiguration(catalogueConfiguration);
|
||||
configurationSimpleFacet = resourceRegistryPublisher.update(configurationSimpleFacet);
|
||||
setConfigurationInfoFromSimpleFacet(configurationSimpleFacet, catalogueConfiguration);
|
||||
}
|
||||
return catalogueConfiguration;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
package org.gcube.gcat.configuration.isproxies;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.gcube.common.authorization.utils.manager.SecretManagerProvider;
|
||||
|
||||
public class FacetBasedISConfigurationProxyFactory {
|
||||
|
||||
private static final Map<String, FacetBasedISConfigurationProxy> isConfigurationProxies;
|
||||
|
||||
static {
|
||||
isConfigurationProxies = new HashMap<>();
|
||||
}
|
||||
|
||||
private static FacetBasedISConfigurationProxy find(String context) {
|
||||
FacetBasedISConfigurationProxy isConfigurationProxy = new FacetBasedISConfigurationProxy(context);
|
||||
return isConfigurationProxy;
|
||||
}
|
||||
|
||||
public synchronized static FacetBasedISConfigurationProxy getInstance(String context) {
|
||||
FacetBasedISConfigurationProxy isConfigurationProxy = isConfigurationProxies.get(context);
|
||||
if(isConfigurationProxy == null) {
|
||||
isConfigurationProxy = find(context);
|
||||
isConfigurationProxies.put(context, isConfigurationProxy);
|
||||
}
|
||||
return isConfigurationProxy;
|
||||
}
|
||||
|
||||
public static FacetBasedISConfigurationProxy getInstance() {
|
||||
String context = SecretManagerProvider.instance.get().getContext();
|
||||
return getInstance(context);
|
||||
}
|
||||
|
||||
}
|
|
@ -91,24 +91,13 @@ public class GCoreISConfigurationProxy extends ISConfigurationProxy<ServiceEndpo
|
|||
private final static String OLD_NAME = "CKanDataCatalogue";
|
||||
|
||||
protected ObjectMapper mapper;
|
||||
protected ServiceEndpoint serviceEndpoint;
|
||||
|
||||
public GCoreISConfigurationProxy(String context) {
|
||||
super(context);
|
||||
this.mapper = new ObjectMapper();
|
||||
}
|
||||
|
||||
public GCoreISConfigurationProxy(String context, ServiceCatalogueConfiguration catalogueConfiguration) {
|
||||
super(context, catalogueConfiguration);
|
||||
this.mapper = new ObjectMapper();
|
||||
}
|
||||
|
||||
public ServiceCatalogueConfiguration getCatalogueConfiguration() throws WebApplicationException {
|
||||
if (catalogueConfiguration == null) {
|
||||
catalogueConfiguration = readFromIS();
|
||||
}
|
||||
return catalogueConfiguration;
|
||||
}
|
||||
|
||||
protected AccessPoint getAccessPoint(Profile profile) {
|
||||
Group<AccessPoint> accessPoints = profile.accessPoints();
|
||||
Iterator<AccessPoint> accessPointIterator = accessPoints.iterator();
|
||||
|
@ -169,13 +158,15 @@ public class GCoreISConfigurationProxy extends ISConfigurationProxy<ServiceEndpo
|
|||
|
||||
@Override
|
||||
protected ServiceEndpoint getISResource() {
|
||||
List<ServiceEndpoint> serviceEndpoints = getServiceEndpoints(GCatConstants.CONFIGURATION_CATEGORY, GCatConstants.CONFIGURATION_NAME);
|
||||
if (serviceEndpoints==null || serviceEndpoints.size() == 0) {
|
||||
logger.error("There is no {} having Category {} and Name {} in this context.",
|
||||
ServiceEndpoint.class.getSimpleName(), GCatConstants.CONFIGURATION_CATEGORY, GCatConstants.CONFIGURATION_NAME);
|
||||
return null;
|
||||
if(serviceEndpoint==null) {
|
||||
List<ServiceEndpoint> serviceEndpoints = getServiceEndpoints(GCatConstants.CONFIGURATION_CATEGORY, GCatConstants.CONFIGURATION_NAME);
|
||||
if (serviceEndpoints==null || serviceEndpoints.size() == 0) {
|
||||
logger.error("There is no {} having Category {} and Name {} in this context.",
|
||||
ServiceEndpoint.class.getSimpleName(), GCatConstants.CONFIGURATION_CATEGORY, GCatConstants.CONFIGURATION_NAME);
|
||||
return null;
|
||||
}
|
||||
serviceEndpoint = serviceEndpoints.get(0);
|
||||
}
|
||||
ServiceEndpoint serviceEndpoint = serviceEndpoints.get(0);
|
||||
return serviceEndpoint;
|
||||
}
|
||||
|
||||
|
@ -671,8 +662,9 @@ public class GCoreISConfigurationProxy extends ISConfigurationProxy<ServiceEndpo
|
|||
}
|
||||
|
||||
@Override
|
||||
protected ServiceCatalogueConfiguration updateOnIS(ServiceEndpoint serviceEndpoint) throws Exception {
|
||||
protected ServiceCatalogueConfiguration updateOnIS() throws Exception {
|
||||
RegistryPublisher registryPublisher = RegistryPublisherFactory.create();
|
||||
ServiceEndpoint serviceEndpoint = getISResource();
|
||||
String id = serviceEndpoint.id();
|
||||
catalogueConfiguration.setID(id);
|
||||
serviceEndpoint = createServiceEndpoint(serviceEndpoint);
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
package org.gcube.gcat.configuration.isproxies;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.gcube.common.authorization.utils.manager.SecretManagerProvider;
|
||||
|
||||
public class GCoreISConfigurationProxyFactory {
|
||||
|
||||
private static final Map<String, GCoreISConfigurationProxy> isConfigurationProxies;
|
||||
|
||||
static {
|
||||
isConfigurationProxies = new HashMap<>();
|
||||
}
|
||||
|
||||
private static GCoreISConfigurationProxy find(String context) {
|
||||
GCoreISConfigurationProxy isConfigurationProxy = new GCoreISConfigurationProxy(context);
|
||||
return isConfigurationProxy;
|
||||
}
|
||||
|
||||
public synchronized static GCoreISConfigurationProxy getInstance(String context) {
|
||||
GCoreISConfigurationProxy isConfigurationProxy = isConfigurationProxies.get(context);
|
||||
if(isConfigurationProxy == null) {
|
||||
isConfigurationProxy = find(context);
|
||||
isConfigurationProxies.put(context, isConfigurationProxy);
|
||||
}
|
||||
return isConfigurationProxy;
|
||||
}
|
||||
|
||||
public static GCoreISConfigurationProxy getInstance() {
|
||||
String context = SecretManagerProvider.instance.get().getContext();
|
||||
return getInstance(context);
|
||||
}
|
||||
|
||||
}
|
|
@ -31,12 +31,16 @@ public abstract class ISConfigurationProxy<ISResource extends Object> {
|
|||
}
|
||||
return catalogueConfiguration;
|
||||
}
|
||||
|
||||
public void setCatalogueConfiguration(ServiceCatalogueConfiguration catalogueConfiguration) {
|
||||
this.catalogueConfiguration = catalogueConfiguration;
|
||||
}
|
||||
|
||||
public ServiceCatalogueConfiguration createOrUpdateOnIS() throws Exception {
|
||||
ISResource isResource = getISResource();
|
||||
if(isResource!=null) {
|
||||
// It's an update
|
||||
catalogueConfiguration = updateOnIS(isResource);
|
||||
catalogueConfiguration = updateOnIS();
|
||||
}else {
|
||||
// It's a create
|
||||
catalogueConfiguration = createOnIS();
|
||||
|
@ -51,7 +55,7 @@ public abstract class ISConfigurationProxy<ISResource extends Object> {
|
|||
Version version = new Version(applicationConfiguration.version());
|
||||
return version;
|
||||
}catch (Exception e) {
|
||||
return new Version("2.2.0");
|
||||
return new Version("2.4.2");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -61,7 +65,7 @@ public abstract class ISConfigurationProxy<ISResource extends Object> {
|
|||
|
||||
protected abstract ServiceCatalogueConfiguration readFromIS();
|
||||
|
||||
protected abstract ServiceCatalogueConfiguration updateOnIS(ISResource isResource) throws Exception;
|
||||
protected abstract ServiceCatalogueConfiguration updateOnIS() throws Exception;
|
||||
|
||||
public abstract void delete();
|
||||
|
||||
|
|
|
@ -0,0 +1,86 @@
|
|||
package org.gcube.gcat.configuration.service;
|
||||
|
||||
import javax.ws.rs.InternalServerErrorException;
|
||||
|
||||
import org.gcube.com.fasterxml.jackson.annotation.JsonGetter;
|
||||
import org.gcube.com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import org.gcube.com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import org.gcube.gcat.configuration.isproxies.FacetBasedISConfigurationProxy;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* @author Luca Frosini (ISTI - CNR)
|
||||
*/
|
||||
public class FacetBasedISServiceCatalogueConfiguration extends ServiceCatalogueConfiguration {
|
||||
|
||||
private static Logger logger = LoggerFactory.getLogger(FacetBasedISServiceCatalogueConfiguration.class);
|
||||
|
||||
protected final FacetBasedISConfigurationProxy facetBasedISConfigurationProxy;
|
||||
|
||||
public FacetBasedISServiceCatalogueConfiguration(String context, FacetBasedISConfigurationProxy facetBasedISConfigurationProxy) {
|
||||
super(context);
|
||||
this.facetBasedISConfigurationProxy = facetBasedISConfigurationProxy;
|
||||
}
|
||||
|
||||
@JsonProperty(value = CKAN_URL_KEY)
|
||||
public String getCkanURL() {
|
||||
if(ckanURL==null) {
|
||||
try {
|
||||
facetBasedISConfigurationProxy.setCkanServiceInfo(this);
|
||||
} catch (Exception e) {
|
||||
throw new InternalServerErrorException(e);
|
||||
}
|
||||
}
|
||||
return ckanURL;
|
||||
}
|
||||
|
||||
@JsonIgnore
|
||||
public String getSysAdminToken() {
|
||||
if(sysAdminToken==null) {
|
||||
try {
|
||||
facetBasedISConfigurationProxy.setCkanServiceInfo(this);
|
||||
} catch (Exception e) {
|
||||
throw new InternalServerErrorException(e);
|
||||
}
|
||||
}
|
||||
return sysAdminToken;
|
||||
}
|
||||
|
||||
@JsonGetter(value=SYS_ADMIN_TOKEN_KEY)
|
||||
public String getEncryptedSysAdminToken() {
|
||||
if(encryptedSysAdminToken==null) {
|
||||
try {
|
||||
facetBasedISConfigurationProxy.setCkanServiceInfo(this);
|
||||
} catch (Exception e) {
|
||||
throw new InternalServerErrorException(e);
|
||||
}
|
||||
}
|
||||
return encryptedSysAdminToken;
|
||||
}
|
||||
|
||||
@JsonGetter(value = CKAN_DB_KEY)
|
||||
public ServiceCKANDB getCkanDB() {
|
||||
if(ckanDB==null) {
|
||||
try {
|
||||
facetBasedISConfigurationProxy.setCkanDBInfo(this);
|
||||
} catch (Exception e) {
|
||||
throw new InternalServerErrorException(e);
|
||||
}
|
||||
}
|
||||
return (ServiceCKANDB) ckanDB;
|
||||
}
|
||||
|
||||
|
||||
@JsonProperty(value = SOLR_URL_KEY)
|
||||
public String getSolrURL() {
|
||||
if(solrURL==null) {
|
||||
try {
|
||||
facetBasedISConfigurationProxy.setSolrServiceInfo(this);
|
||||
} catch (Exception e) {
|
||||
throw new InternalServerErrorException(e);
|
||||
}
|
||||
}
|
||||
return solrURL;
|
||||
}
|
||||
}
|
|
@ -14,6 +14,7 @@ import org.gcube.gcat.api.configuration.CKANDB;
|
|||
*/
|
||||
public class ServiceCKANDB extends CKANDB {
|
||||
|
||||
public static final String USERNAME_KEY = "username";
|
||||
public static final String PASSWORD_KEY = "password";
|
||||
|
||||
protected String encryptedPassword;
|
||||
|
|
|
@ -43,7 +43,7 @@ public class ServiceCatalogueConfiguration extends CatalogueConfiguration {
|
|||
|
||||
@JsonIgnore
|
||||
public String getPlainSysAdminToken() {
|
||||
return sysAdminToken;
|
||||
return getSysAdminToken();
|
||||
}
|
||||
|
||||
@JsonGetter(value=SYS_ADMIN_TOKEN_KEY)
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
{
|
||||
"@class" : "QueryTemplate",
|
||||
"name" : "GCat-Get-CallsFor-to-VirtualService",
|
||||
"description" : "The following query return all CallsFor relation from the EService of gcat identified by the UUID provided as parameter to the Virtual Service with name 'catalogue-virtual-service'. The content of the request to run this query template will be something like {\"$uuid\": \"335580b6-c164-4506-980a-21e5bcf8dbcf\"}",
|
||||
"template" : {
|
||||
"@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"
|
||||
}
|
||||
} ]
|
||||
}
|
||||
},
|
||||
"templateVariables" : {
|
||||
"$uuid" : {
|
||||
"@class": "TemplateVariable",
|
||||
"name": "$uuid",
|
||||
"description": "The uuid of the gCat EService, e.g. 335580b6-c164-4506-980a-21e5bcf8dbcf. Please note that the default value has no meaning but we need a valid value so that the query can be tested by the resource-registry service.",
|
||||
"defaultValue": "335580b6-c164-4506-980a-21e5bcf8dbcf"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
|
||||
Configuration
|
||||
----------------------
|
||||
IsCustomizedBy | |
|
||||
-----------------> | gcat-configuration |
|
||||
/ | |
|
||||
/ ----------------------
|
||||
EService VirtualService /
|
||||
------------ -----------------------------
|
||||
| | CallsFor | |
|
||||
| gcat | ------------> | catalogue-virtual-service |
|
||||
| | | |
|
||||
------------ -----------------------------
|
||||
\ EService
|
||||
\ --------------------
|
||||
\ Uses | |
|
||||
\ ------------------> | postgres-ckan-db |
|
||||
\ / | |
|
||||
\ EService / --------------------
|
||||
\ -----------------
|
||||
\ CallsFor | |
|
||||
-------------> | ckan |
|
||||
| |
|
||||
----------------- EService
|
||||
\ --------------------
|
||||
\ Uses | |
|
||||
------------------> | solr |
|
||||
| |
|
||||
--------------------
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
package org.gcube.gcat.configuration;
|
||||
|
||||
import org.gcube.gcat.ContextTest;
|
||||
import org.gcube.gcat.configuration.service.ServiceCatalogueConfiguration;
|
||||
import org.junit.Test;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* @author Luca Frosini (ISTI - CNR)
|
||||
*/
|
||||
public class CatalogueConfigurationFactoryTest extends ContextTest {
|
||||
|
||||
private static Logger logger = LoggerFactory.getLogger(CatalogueConfigurationFactoryTest.class);
|
||||
|
||||
@Test
|
||||
public void testConf() throws Exception {
|
||||
ServiceCatalogueConfiguration serviceCatalogueConfiguration = CatalogueConfigurationFactory.getInstance();
|
||||
logger.debug("{}", serviceCatalogueConfiguration.toJsonString());
|
||||
logger.debug("{}", serviceCatalogueConfiguration.toJsonString(true));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
package org.gcube.gcat.configuration.isproxies;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.gcube.gcat.ContextTest;
|
||||
import org.gcube.gcat.configuration.service.ServiceCatalogueConfiguration;
|
||||
import org.gcube.informationsystem.utils.ElementMapper;
|
||||
import org.gcube.resourcemanagement.model.reference.entities.facets.SimpleFacet;
|
||||
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.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* @author Luca Frosini (ISTI - CNR)
|
||||
*/
|
||||
public class FacetBasedISConfigurationProxyTest extends ContextTest {
|
||||
|
||||
private static Logger logger = LoggerFactory.getLogger(FacetBasedISConfigurationProxyTest.class);
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void test() throws Exception {
|
||||
FacetBasedISConfigurationProxy fbiscp = FacetBasedISConfigurationProxyFactory.getInstance();
|
||||
fbiscp.setGcatEServiceID("f00bbacd-92b8-46d7-b41c-828f71a78753");
|
||||
CallsFor<EService, VirtualService> callsFor = fbiscp.createCallsForToVirtualService();
|
||||
logger.debug("Created {}", ElementMapper.marshal(callsFor));
|
||||
|
||||
SimpleFacet simpleFacet = fbiscp.getISResource();
|
||||
logger.debug("{}", ElementMapper.marshal(simpleFacet));
|
||||
|
||||
ServiceCatalogueConfiguration catalogueConfiguration = fbiscp.getCatalogueConfiguration();
|
||||
logger.debug("{}", catalogueConfiguration.toJsonString());
|
||||
logger.debug("{}", catalogueConfiguration.toJsonString(true));
|
||||
|
||||
List<CallsFor<EService, VirtualService>> callsForList = fbiscp.deleteCallsForToVirtualService();
|
||||
logger.debug("Deleted {} {} relations {}", callsForList.size(), CallsFor.NAME, ElementMapper.marshal(callsForList));
|
||||
}
|
||||
|
||||
}
|
|
@ -75,7 +75,8 @@ public class GCoreISConfigurationProxyTest extends ContextTest {
|
|||
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(DEVVRE_CONFIG_JSON);
|
||||
String json = new BufferedReader(new InputStreamReader(inputStream)).lines().collect(Collectors.joining("\n"));
|
||||
ServiceCatalogueConfiguration catalogueConfiguration = ServiceCatalogueConfiguration.getServiceCatalogueConfiguration(json);
|
||||
GCoreISConfigurationProxy gCoreISConfigurationProxy = new GCoreISConfigurationProxy(context, catalogueConfiguration);
|
||||
GCoreISConfigurationProxy gCoreISConfigurationProxy = new GCoreISConfigurationProxy(context);
|
||||
gCoreISConfigurationProxy.setCatalogueConfiguration(catalogueConfiguration);
|
||||
gCoreISConfigurationProxy.createOnIS();
|
||||
}
|
||||
|
||||
|
|
|
@ -6,3 +6,4 @@
|
|||
/config.properties.old
|
||||
/config.properties-new-authz
|
||||
/devvre.conf.json
|
||||
/config.ini
|
||||
|
|
Loading…
Reference in New Issue