diff --git a/src/main/java/org/gcube/gcat/configuration/GCoreISConfigurationProxy.java b/src/main/java/org/gcube/gcat/configuration/GCoreISConfigurationProxy.java index 7418482..318efc1 100644 --- a/src/main/java/org/gcube/gcat/configuration/GCoreISConfigurationProxy.java +++ b/src/main/java/org/gcube/gcat/configuration/GCoreISConfigurationProxy.java @@ -45,14 +45,15 @@ public class GCoreISConfigurationProxy { private static final Logger logger = LoggerFactory.getLogger(GCoreISConfigurationProxy.class); // property to retrieve the master service endpoint into the /root scope - private final static String IS_MASTER_ROOT_KEY_PROPERTY = "IS_ROOT_MASTER"; // true, false.. missing means false as + private final static String IS_ROOT_MASTER_PROPERTY_KEY = "IS_ROOT_MASTER"; // true, false.. missing means false as - private final static String DEFAULT_ORGANIZATION_PROPERTY = "DEFAULT_ORGANIZATION"; - private final static String SUPPORTED_ORGANIZATION_PROPERTY = "SUPPORTED_ORGANIZATION"; - private final static String API_KEY_PROPERTY = "API_KEY"; - private final static String SOCIAL_POST_PROPERTY = "SOCIAL_POST"; - private final static String ALERT_USERS_ON_POST_CREATION_PROPERTY = "ALERT_USERS_ON_POST_CREATION"; - private final static String MODERATION_ENABLED_KEY_PROPERTY = "MODERATION_ENABLED"; + private final static String DEFAULT_ORGANIZATION_PROPERTY_KEY = "DEFAULT_ORGANIZATION"; + private final static String SUPPORTED_ORGANIZATION_PROPERTY_KEY = "SUPPORTED_ORGANIZATION"; + private final static String API_KEY_PROPERTY_KEY = "API_KEY"; + private final static String SOLR_INDEX_ADDRESS_PROPERTY_KEY = "SOLR_INDEX_ADDRESS"; + private final static String SOCIAL_POST_PROPERTY_KEY = "SOCIAL_POST"; + private final static String ALERT_USERS_ON_POST_CREATION_PROPERTY_KEY = "ALERT_USERS_ON_POST_CREATION"; + private final static String MODERATION_ENABLED_KEY_PROPERTY_KEY = "MODERATION_ENABLED"; // CKAN Instance info private final static String CATEGORY = "Application"; @@ -108,30 +109,37 @@ public class GCoreISConfigurationProxy { Map propertyMap = accessPoint.propertyMap(); // retrieve sys admin token - String sysAdminToken = propertyMap.get(API_KEY_PROPERTY).value(); + String sysAdminToken = propertyMap.get(API_KEY_PROPERTY_KEY).value(); sysAdminToken = StringEncrypter.getEncrypter().decrypt(sysAdminToken); catalogueConfiguration.setSysAdminToken(sysAdminToken); - String organization = CatalogueConfiguration.getOrganizationName(context); - if (propertyMap.containsKey(DEFAULT_ORGANIZATION_PROPERTY)) { - String org = propertyMap.get(DEFAULT_ORGANIZATION_PROPERTY).value().trim(); + String defaultOrganization = CatalogueConfiguration.getOrganizationName(context); + if (propertyMap.containsKey(DEFAULT_ORGANIZATION_PROPERTY_KEY)) { + String org = propertyMap.get(DEFAULT_ORGANIZATION_PROPERTY_KEY).value().trim(); if(org!=null && org.compareTo("")==0) { mustBeUpdated = true; }else { - organization = org; + defaultOrganization = org; } }else { mustBeUpdated = true; } - catalogueConfiguration.setOrganization(organization); + catalogueConfiguration.setDefaultOrganization(defaultOrganization); + + + String solrURL = null; + if (propertyMap.containsKey(SOLR_INDEX_ADDRESS_PROPERTY_KEY)) { + solrURL = propertyMap.get(SOLR_INDEX_ADDRESS_PROPERTY_KEY).value(); + catalogueConfiguration.setSolrURL(solrURL); + } // retrieve option to check if the social post has to be made Boolean socialPostEnabled = true; - if (propertyMap.containsKey(SOCIAL_POST_PROPERTY)) { - if (propertyMap.get(SOCIAL_POST_PROPERTY).value().trim().equalsIgnoreCase("false")) { + if (propertyMap.containsKey(SOCIAL_POST_PROPERTY_KEY)) { + if (propertyMap.get(SOCIAL_POST_PROPERTY_KEY).value().trim().equalsIgnoreCase("false")) { socialPostEnabled = false; } }else { @@ -141,8 +149,8 @@ public class GCoreISConfigurationProxy { // retrieve option for user alert boolean notificationToUsersEnabled = false; // default is false - if (propertyMap.containsKey(ALERT_USERS_ON_POST_CREATION_PROPERTY)) { - if (propertyMap.get(ALERT_USERS_ON_POST_CREATION_PROPERTY).value().trim() + if (propertyMap.containsKey(ALERT_USERS_ON_POST_CREATION_PROPERTY_KEY)) { + if (propertyMap.get(ALERT_USERS_ON_POST_CREATION_PROPERTY_KEY).value().trim() .equalsIgnoreCase("true")) { notificationToUsersEnabled = true; } @@ -152,8 +160,8 @@ public class GCoreISConfigurationProxy { catalogueConfiguration.setNotificationToUsersEnabled(notificationToUsersEnabled); boolean moderationEnabled = false; // default is false - if (propertyMap.containsKey(MODERATION_ENABLED_KEY_PROPERTY)) { - if (propertyMap.get(MODERATION_ENABLED_KEY_PROPERTY).value().trim().equalsIgnoreCase("true")) { + if (propertyMap.containsKey(MODERATION_ENABLED_KEY_PROPERTY_KEY)) { + if (propertyMap.get(MODERATION_ENABLED_KEY_PROPERTY_KEY).value().trim().equalsIgnoreCase("true")) { moderationEnabled = true; } }else { @@ -162,8 +170,8 @@ public class GCoreISConfigurationProxy { catalogueConfiguration.setModerationEnabled(moderationEnabled); Set supportedOrganizations = null; - if (propertyMap.containsKey(SUPPORTED_ORGANIZATION_PROPERTY)) { - String jsonArray = propertyMap.get(SUPPORTED_ORGANIZATION_PROPERTY).value(); + if (propertyMap.containsKey(SUPPORTED_ORGANIZATION_PROPERTY_KEY)) { + String jsonArray = propertyMap.get(SUPPORTED_ORGANIZATION_PROPERTY_KEY).value(); supportedOrganizations = unmarshallSupportedOrganizations(jsonArray); removeAllGenericResources(); }else { @@ -196,7 +204,7 @@ public class GCoreISConfigurationProxy { */ private List getServiceEndpoints() { SimpleQuery query = queryFor(ServiceEndpoint.class); - query.addCondition("$resource/Profile/Category/Name/text() eq '" + CATEGORY + "'"); + query.addCondition("$resource/Profile/Category/text() eq '" + CATEGORY + "'"); query.addCondition("$resource/Profile/Name/text() eq '" + NAME + "'"); DiscoveryClient client = clientFor(ServiceEndpoint.class); @@ -217,7 +225,7 @@ public class GCoreISConfigurationProxy { if (serviceEndpoints.size() > 1) { logger.info("Too many {} having Category {} and Name {} in this context. Looking for the one that has the property {}", - ServiceEndpoint.class.getSimpleName(), CATEGORY, NAME, IS_MASTER_ROOT_KEY_PROPERTY); + ServiceEndpoint.class.getSimpleName(), CATEGORY, NAME, IS_ROOT_MASTER_PROPERTY_KEY); for (ServiceEndpoint se : serviceEndpoints) { Iterator accessPointIterator = se.profile().accessPoints().iterator(); @@ -225,7 +233,7 @@ public class GCoreISConfigurationProxy { ServiceEndpoint.AccessPoint accessPoint = accessPointIterator.next(); // get the is master property - Property entry = accessPoint.propertyMap().get(IS_MASTER_ROOT_KEY_PROPERTY); + Property entry = accessPoint.propertyMap().get(IS_ROOT_MASTER_PROPERTY_KEY); String isMaster = entry != null ? entry.value() : null; if (isMaster == null || !isMaster.equals("true")) { @@ -363,7 +371,7 @@ public class GCoreISConfigurationProxy { return property; } - protected AccessPoint setAccessPointProperties(AccessPoint accessPoint, boolean update) throws JsonProcessingException { + protected Group setAccessPointProperties(AccessPoint accessPoint, boolean update) throws JsonProcessingException { accessPoint.description(String.format("Access Point %s by gcat %s", update ? "updated" : "created", getGcatVersion().toString())); accessPoint.address(catalogueConfiguration.getCkanURL()); @@ -372,14 +380,15 @@ public class GCoreISConfigurationProxy { accessPoint.name("CKan Data Catalogue"); Group properties = accessPoint.properties(); - addProperty(properties, DEFAULT_ORGANIZATION_PROPERTY, catalogueConfiguration.getOrganization()); - addProperty(properties, API_KEY_PROPERTY, catalogueConfiguration.getSysAdminToken(), true); - addProperty(properties, SOCIAL_POST_PROPERTY, Boolean.toString(catalogueConfiguration.isSocialPostEnabled())); - addProperty(properties, ALERT_USERS_ON_POST_CREATION_PROPERTY, Boolean.toString(catalogueConfiguration.isNotificationToUsersEnabled())); - addProperty(properties, MODERATION_ENABLED_KEY_PROPERTY, Boolean.toString(catalogueConfiguration.isModerationEnabled())); - addProperty(properties, SUPPORTED_ORGANIZATION_PROPERTY, marshallSupportedOrganizations()); + addProperty(properties, SOLR_INDEX_ADDRESS_PROPERTY_KEY, catalogueConfiguration.getSolrURL()); + addProperty(properties, DEFAULT_ORGANIZATION_PROPERTY_KEY, catalogueConfiguration.getDefaultOrganization()); + addProperty(properties, API_KEY_PROPERTY_KEY, catalogueConfiguration.getSysAdminToken(), true); + addProperty(properties, SOCIAL_POST_PROPERTY_KEY, Boolean.toString(catalogueConfiguration.isSocialPostEnabled())); + addProperty(properties, ALERT_USERS_ON_POST_CREATION_PROPERTY_KEY, Boolean.toString(catalogueConfiguration.isNotificationToUsersEnabled())); + addProperty(properties, MODERATION_ENABLED_KEY_PROPERTY_KEY, Boolean.toString(catalogueConfiguration.isModerationEnabled())); + addProperty(properties, SUPPORTED_ORGANIZATION_PROPERTY_KEY, marshallSupportedOrganizations()); - return accessPoint; + return properties; } private final static String PLATFORM_NAME = "Tomcat"; @@ -455,25 +464,40 @@ public class GCoreISConfigurationProxy { return profile; } + protected boolean isRootMaster(ServiceEndpoint serviceEndpoint) { + Profile profile = serviceEndpoint.profile(); + AccessPoint accessPoint = getAccessPoint(profile); + Map propertyMap = accessPoint.propertyMap(); + if (propertyMap.containsKey(IS_ROOT_MASTER_PROPERTY_KEY)) { + if (propertyMap.get(IS_ROOT_MASTER_PROPERTY_KEY).value().trim().equalsIgnoreCase("true")) { + return true; + } + } + return false; + } + protected ServiceEndpoint createServiceEndpoint(ServiceEndpoint serviceEndpoint) throws Exception { boolean update = serviceEndpoint != null; + boolean rootMaster = false; if(update) { if(catalogueConfiguration.getSysAdminToken()==null) { Profile profile = serviceEndpoint.profile(); AccessPoint accessPoint = getAccessPoint(profile); + Map propertyMap = accessPoint.propertyMap(); // add this host String ckanURL = accessPoint.address(); catalogueConfiguration.setCkanURL(ckanURL); - Map propertyMap = accessPoint.propertyMap(); - // retrieve sys admin token - String sysAdminToken = propertyMap.get(API_KEY_PROPERTY).value(); + String sysAdminToken = propertyMap.get(API_KEY_PROPERTY_KEY).value(); sysAdminToken = StringEncrypter.getEncrypter().decrypt(sysAdminToken); catalogueConfiguration.setSysAdminToken(sysAdminToken); } + + rootMaster = isRootMaster(serviceEndpoint); + } @@ -491,7 +515,11 @@ public class GCoreISConfigurationProxy { Group accessPoints = profile.accessPoints(); AccessPoint accessPoint = accessPoints.add(); - setAccessPointProperties(accessPoint, update); + Group properties = setAccessPointProperties(accessPoint, update); + + if(rootMaster) { + addProperty(properties, IS_ROOT_MASTER_PROPERTY_KEY, Boolean.toString(rootMaster)); + } return serviceEndpoint; } diff --git a/src/main/java/org/gcube/gcat/persistence/ckan/CKANPackage.java b/src/main/java/org/gcube/gcat/persistence/ckan/CKANPackage.java index d455001..8ae7d68 100644 --- a/src/main/java/org/gcube/gcat/persistence/ckan/CKANPackage.java +++ b/src/main/java/org/gcube/gcat/persistence/ckan/CKANPackage.java @@ -170,7 +170,7 @@ public class CKANPackage extends CKAN implements Moderated { if(ckanOrganization == null) { // owner organization must be specified if the token belongs to a VRE - String organizationFromContext = configuration.getOrganization(); + String organizationFromContext = configuration.getDefaultOrganization(); ckanOrganization = checkGotOrganization(organizationFromContext); objectNode.put(OWNER_ORG_KEY, organizationFromContext); } diff --git a/src/main/java/org/gcube/gcat/rest/Configuration.java b/src/main/java/org/gcube/gcat/rest/Configuration.java index 8a753c3..511a515 100644 --- a/src/main/java/org/gcube/gcat/rest/Configuration.java +++ b/src/main/java/org/gcube/gcat/rest/Configuration.java @@ -60,10 +60,10 @@ public class Configuration extends BaseREST implements org.gcube.gcat.api.interf return c; } - private String createOrUpdate(ObjectMapper mapper, CatalogueConfiguration catalogueConfiguration) throws WebServiceException { + private String createOrUpdate(CatalogueConfiguration catalogueConfiguration) throws WebServiceException { try { CatalogueConfiguration gotCatalogueConfiguration = CatalogueConfigurationFactory.createOrUpdate(catalogueConfiguration); - String configuration = mapper.writeValueAsString(gotCatalogueConfiguration); + String configuration = gotCatalogueConfiguration.toJsonString(); logger.debug("The new configuration in context {} is {}", catalogueConfiguration.getContext(), configuration); return configuration; }catch (WebServiceException e) { @@ -82,7 +82,7 @@ public class Configuration extends BaseREST implements org.gcube.gcat.api.interf ObjectMapper mapper = new ObjectMapper(); CatalogueConfiguration catalogueConfiguration = mapper.readValue(json, CatalogueConfiguration.class); checkContext(context, catalogueConfiguration); - return createOrUpdate(mapper, catalogueConfiguration); + return createOrUpdate(catalogueConfiguration); }catch (WebServiceException e) { throw e; }catch (Exception e) { @@ -100,7 +100,7 @@ public class Configuration extends BaseREST implements org.gcube.gcat.api.interf ObjectMapper mapper = new ObjectMapper(); CatalogueConfiguration catalogueConfiguration = mapper.readValue(json, CatalogueConfiguration.class); checkContext(CURRENT_CONTEXT_PATH_PARAMETER, catalogueConfiguration); - String ret = createOrUpdate(mapper, catalogueConfiguration); + String ret = createOrUpdate(catalogueConfiguration); ResponseBuilder responseBuilder = Response.status(Status.CREATED); if(ret!=null) { responseBuilder.entity(ret).type(ResourceInitializer.APPLICATION_JSON_CHARSET_UTF_8); @@ -188,7 +188,7 @@ public class Configuration extends BaseREST implements org.gcube.gcat.api.interf node.remove(CURRENT_CONTEXT_PATH_PARAMETER); } - ObjectNode configuration = mapper.valueToTree(catalogueConfiguration); + ObjectNode configuration = catalogueConfiguration.toObjetNode(); Iterator fieldNames = node.fieldNames(); while(fieldNames.hasNext()) { diff --git a/src/test/java/org/gcube/gcat/configuration/GCoreISConfigurationProxyTest.java b/src/test/java/org/gcube/gcat/configuration/GCoreISConfigurationProxyTest.java index b64518c..af82238 100644 --- a/src/test/java/org/gcube/gcat/configuration/GCoreISConfigurationProxyTest.java +++ b/src/test/java/org/gcube/gcat/configuration/GCoreISConfigurationProxyTest.java @@ -1,21 +1,10 @@ package org.gcube.gcat.configuration; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.List; import java.util.Set; -import org.gcube.com.fasterxml.jackson.databind.ObjectMapper; -import org.gcube.com.fasterxml.jackson.databind.node.ArrayNode; -import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode; import org.gcube.common.authorization.utils.manager.SecretManager; -import org.gcube.common.resources.gcore.GenericResource; -import org.gcube.common.resources.gcore.Resources; -import org.gcube.common.scope.impl.ScopeBean; import org.gcube.gcat.ContextTest; import org.gcube.gcat.api.configuration.CatalogueConfiguration; -import org.gcube.informationsystem.publisher.RegistryPublisher; -import org.gcube.informationsystem.publisher.RegistryPublisherFactory; import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; @@ -33,70 +22,80 @@ public class GCoreISConfigurationProxyTest extends ContextTest { Set organizations = gCoreISConfigurationProxy.getSupportedOrganizationsFromGenericResource(); Assert.assertTrue(organizations.size()>0); } - - protected GenericResource instantiateGenericResource(String secondaryType, String name, String xml) throws Exception { - GenericResource genericResource = new GenericResource(); - org.gcube.common.resources.gcore.GenericResource.Profile profile = genericResource.newProfile(); - profile.type(secondaryType); - profile.name(name); - profile.description("This resource is read by gCat and define the list of CKAN organizations where a client is allowed to publish for the current context"); - profile.newBody(xml); - StringWriter stringWriter = new StringWriter(); - Resources.marshal(genericResource, stringWriter); - logger.debug("The generated {} is\n{}", GenericResource.class.getSimpleName(), stringWriter.toString()); - return genericResource; + + @Test + public void testCatalogueConfiguration() throws Exception { + ContextTest.setContextByName("/gcube/devsec"); + String context = SecretManager.instance.get().getContext(); + GCoreISConfigurationProxy gCoreISConfigurationProxy = new GCoreISConfigurationProxy(context); + CatalogueConfiguration catalogueConfiguration = gCoreISConfigurationProxy.getCatalogueConfigurationFromIS(); + logger.info("Configuration inn context {} is {}", context, catalogueConfiguration.toJsonString()); } - protected void createGenericResource(String xml) throws Exception { - GenericResource genericResource = instantiateGenericResource( - GCoreISConfigurationProxy.GENERIC_RESOURCE_SECONDARY_TYPE_FOR_ORGANIZATIONS, - GCoreISConfigurationProxy.GENERIC_RESOURCE_NAME_FOR_ORGANIZATIONS, xml); - RegistryPublisher registryPublisher = RegistryPublisherFactory.create(); - genericResource = registryPublisher.create(genericResource); - StringWriter stringWriter = new StringWriter(); - Resources.marshal(genericResource, stringWriter); - logger.trace("The {} with ID {} has been created \n{}", GenericResource.class.getSimpleName(), - genericResource.id(), stringWriter.toString()); - } - protected String createGRBody(List organizations) throws Exception { - if(organizations==null || organizations.size()<1) { - throw new Exception("Unable to create the body for the generic resource with empty organization list"); - } - ObjectMapper objectMapper = new ObjectMapper(); - ObjectNode objectNode = objectMapper.createObjectNode(); - ArrayNode arrayNode = objectNode.putArray(GCoreISConfigurationProxy.GENERIC_RESOURCE_CKAN_ORGANIZATIONS); - for(String organizationName : organizations) { - arrayNode.add(organizationName); - } - return objectMapper.writeValueAsString(objectNode); - } - - protected void createGenericResourceForSupportedOrganizations(List organizations) throws Exception { - String json = createGRBody(organizations); - createGenericResource(json); - } - - // @Test - public void createGenericResourceForSupportedOrganizationsByName() throws Exception { - List organizations = new ArrayList<>(); - organizations.add("nextnext"); - organizations.add("devvre"); - createGenericResourceForSupportedOrganizations(organizations); - } - - // @Test - public void createGenericResourceForSupportedOrganizationsByScopeBean() throws Exception { - ContextTest.setContextByName("/gcube/devNext/NextNext"); - - List scopeBeans = new ArrayList<>(); - scopeBeans.add(new ScopeBean("/gcube/devNext/NextNext")); - scopeBeans.add(new ScopeBean("/gcube/devsec/devVRE")); - List organizations = new ArrayList<>(); - for(ScopeBean scopeBean : scopeBeans) { - organizations.add(CatalogueConfiguration.getOrganizationName(scopeBean)); - } - createGenericResourceForSupportedOrganizations(organizations); - } +// protected GenericResource instantiateGenericResource(String secondaryType, String name, String xml) throws Exception { +// GenericResource genericResource = new GenericResource(); +// org.gcube.common.resources.gcore.GenericResource.Profile profile = genericResource.newProfile(); +// profile.type(secondaryType); +// profile.name(name); +// profile.description("This resource is read by gCat and define the list of CKAN organizations where a client is allowed to publish for the current context"); +// profile.newBody(xml); +// StringWriter stringWriter = new StringWriter(); +// Resources.marshal(genericResource, stringWriter); +// logger.debug("The generated {} is\n{}", GenericResource.class.getSimpleName(), stringWriter.toString()); +// return genericResource; +// } +// +// protected void createGenericResource(String xml) throws Exception { +// GenericResource genericResource = instantiateGenericResource( +// GCoreISConfigurationProxy.GENERIC_RESOURCE_SECONDARY_TYPE_FOR_ORGANIZATIONS, +// GCoreISConfigurationProxy.GENERIC_RESOURCE_NAME_FOR_ORGANIZATIONS, xml); +// RegistryPublisher registryPublisher = RegistryPublisherFactory.create(); +// genericResource = registryPublisher.create(genericResource); +// StringWriter stringWriter = new StringWriter(); +// Resources.marshal(genericResource, stringWriter); +// logger.trace("The {} with ID {} has been created \n{}", GenericResource.class.getSimpleName(), +// genericResource.id(), stringWriter.toString()); +// } +// +// protected String createGRBody(List organizations) throws Exception { +// if(organizations==null || organizations.size()<1) { +// throw new Exception("Unable to create the body for the generic resource with empty organization list"); +// } +// ObjectMapper objectMapper = new ObjectMapper(); +// ObjectNode objectNode = objectMapper.createObjectNode(); +// ArrayNode arrayNode = objectNode.putArray(GCoreISConfigurationProxy.GENERIC_RESOURCE_CKAN_ORGANIZATIONS); +// for(String organizationName : organizations) { +// arrayNode.add(organizationName); +// } +// return objectMapper.writeValueAsString(objectNode); +// } +// +// protected void createGenericResourceForSupportedOrganizations(List organizations) throws Exception { +// String json = createGRBody(organizations); +// createGenericResource(json); +// } +// +// // @Test +// public void createGenericResourceForSupportedOrganizationsByName() throws Exception { +// List organizations = new ArrayList<>(); +// organizations.add("nextnext"); +// organizations.add("devvre"); +// createGenericResourceForSupportedOrganizations(organizations); +// } +// +// // @Test +// public void createGenericResourceForSupportedOrganizationsByScopeBean() throws Exception { +// ContextTest.setContextByName("/gcube/devNext/NextNext"); +// +// List scopeBeans = new ArrayList<>(); +// scopeBeans.add(new ScopeBean("/gcube/devNext/NextNext")); +// scopeBeans.add(new ScopeBean("/gcube/devsec/devVRE")); +// List organizations = new ArrayList<>(); +// for(ScopeBean scopeBean : scopeBeans) { +// organizations.add(CatalogueConfiguration.getOrganizationName(scopeBean)); +// } +// createGenericResourceForSupportedOrganizations(organizations); +// } }