diff --git a/src/main/java/org/gcube/gcat/configuration/isproxies/RestISConfigurationProxy.java b/src/main/java/org/gcube/gcat/configuration/isproxies/RestISConfigurationProxy.java index dcf858e..6ad0d76 100644 --- a/src/main/java/org/gcube/gcat/configuration/isproxies/RestISConfigurationProxy.java +++ b/src/main/java/org/gcube/gcat/configuration/isproxies/RestISConfigurationProxy.java @@ -1,13 +1,53 @@ package org.gcube.gcat.configuration.isproxies; +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 javax.ws.rs.InternalServerErrorException; + +import org.gcube.com.fasterxml.jackson.core.JsonProcessingException; +import org.gcube.gcat.api.GCatConstants; +import org.gcube.gcat.api.configuration.CatalogueConfiguration; 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.reference.relations.ConsistsOf; +import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException; +import org.gcube.informationsystem.resourceregistry.client.ResourceRegistryClient; +import org.gcube.informationsystem.resourceregistry.client.ResourceRegistryClientFactory; +import org.gcube.informationsystem.types.TypeMapper; +import org.gcube.informationsystem.utils.ElementMapper; +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.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 RestISConfigurationProxy extends ISConfigurationProxy { + private static Logger logger = LoggerFactory.getLogger(RestISConfigurationProxy.class); + + protected VirtualService virtualService; + protected Configuration configuration; + protected SimpleFacet configurationSimpleFacet; + + protected EService ckanService; + protected EService solrService; + protected EService ckanDB; + public RestISConfigurationProxy(String context) { super(context); } @@ -16,10 +56,216 @@ public class RestISConfigurationProxy extends ISConfigurationProxy facetConstraint = new HashMap<>(); + facetConstraint.put(SoftwareFacet.GROUP_PROPERTY, GCatConstants.CONFIGURATION_CATEGORY); + facetConstraint.put(SoftwareFacet.NAME_PROPERTY, GCatConstants.CATALOGUE_SERVICE_VIRTUAL_SERVICE_ID); + + logger.trace("Going to query for {} --{}--> ({} with {})", + VirtualService.NAME, IsIdentifiedBy.NAME, SoftwareFacet.NAME, facetConstraint); + + List 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()); + 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)); + logger.error(message); + throw new InternalServerErrorException(message); + } + + return virtualServices.get(0); + } + + + protected Configuration queryConfiguration(ResourceRegistryClient resourceRegistryClient, VirtualService virtualService) throws ResourceRegistryException, JsonProcessingException { + List 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 > F getFacetFromResource(Resource resource, Class coClz, Class fClz) throws JsonProcessingException { + List 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 eServices = resourceRegistryClient.getRelatedResourcesFromReferenceResource( + EService.class, Uses.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, IsCustomizedBy.NAME, VirtualService.NAME, + virtualService.getHeader().getUUID(), size, ElementMapper.marshal(eServices)); + logger.error(message); + throw new InternalServerErrorException(message); + } + + return eServices.get(0); + } + + protected List queryEServicesUsedByCkanService(ResourceRegistryClient resourceRegistryClient, EService ckanService) throws ResourceRegistryException, JsonProcessingException { + List 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 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 ServiceCatalogueConfiguration createServiceCatalogueConfiguration() { + ServiceCatalogueConfiguration serviceCatalogueConfiguration = new ServiceCatalogueConfiguration(context); + + 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)); + + serviceCatalogueConfiguration.setDefaultOrganization((String) configurationSimpleFacet.getAdditionalProperty(CatalogueConfiguration.DEFAULT_ORGANIZATION_KEY)); + + Object supportedOrganizationsObj = configurationSimpleFacet.getAdditionalProperty(CatalogueConfiguration.SUPPORTED_ORGANIZATIONS_KEY); + Set supportedOrganizations = new HashSet<>(); + + if(supportedOrganizationsObj instanceof Collection) { + supportedOrganizations = new HashSet((Collection) supportedOrganizationsObj); + } + + supportedOrganizations.add(serviceCatalogueConfiguration.getDefaultOrganization()); + serviceCatalogueConfiguration.setSupportedOrganizations(supportedOrganizations); + + Map additionalProperties = new HashMap<>(configurationSimpleFacet.getAdditionalProperties()); + + for(String key : additionalProperties.keySet()) { + if(!CatalogueConfiguration.KNOWN_PROPERTIES.contains(key)) { + serviceCatalogueConfiguration.setAdditionalProperty(key, additionalProperties.get(key)); + } + } + + return serviceCatalogueConfiguration; + } + @Override protected ServiceCatalogueConfiguration readFromIS() { - // TODO Auto-generated method stub - return null; + try { + ResourceRegistryClient resourceRegistryClient = ResourceRegistryClientFactory.create(); + + virtualService = queryVirtualService(resourceRegistryClient); + + configuration = queryConfiguration(resourceRegistryClient, virtualService); + configurationSimpleFacet = getConfigurationSimpleFacet(); + + ckanService = queryCkanService(resourceRegistryClient, virtualService); + + List eServices = queryEServicesUsedByCkanService(resourceRegistryClient, ckanService); + getSolrServiceAndCKanDB(eServices); + + catalogueConfiguration = createServiceCatalogueConfiguration(); + + + + }catch (InternalServerErrorException e) { + throw e; + }catch (Exception e) { + throw new InternalServerErrorException(e); + } + + return catalogueConfiguration; } @Override