diff --git a/pom.xml b/pom.xml index 18c4dc9..424a1d9 100644 --- a/pom.xml +++ b/pom.xml @@ -87,21 +87,18 @@ - - - + org.glassfish.jersey.containers jersey-container-servlet - + + org.glassfish.jersey.media @@ -129,6 +126,22 @@ + + + javax.cache + cache-api + 1.0.0 + + + org.ehcache + ehcache + 3.5.2 + runtime + + + + + com.fasterxml.jackson.core diff --git a/src/main/java/org/gcube/gcat/exception/ScienceCatalogueException.java b/src/main/java/org/gcube/gcat/exception/ScienceCatalogueException.java deleted file mode 100644 index 50cc54a..0000000 --- a/src/main/java/org/gcube/gcat/exception/ScienceCatalogueException.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.gcube.gcat.exception; - -/** - * @author Luca Frosini (ISTI - CNR) - */ -public class ScienceCatalogueException extends Exception { - - /** - * Generated Serial Version UID - */ - private static final long serialVersionUID = -5449813222333935588L; - - public ScienceCatalogueException(String message) { - super(message); - } - - public ScienceCatalogueException(Throwable cause) { - super(cause); - } - - public ScienceCatalogueException(String message, Throwable cause) { - super(message, cause); - } - -} 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 6b35ab5..7792c40 100644 --- a/src/main/java/org/gcube/gcat/persistence/ckan/CKANPackage.java +++ b/src/main/java/org/gcube/gcat/persistence/ckan/CKANPackage.java @@ -171,7 +171,7 @@ public class CKANPackage extends CKAN { - CKANUser ckanUser = CKANUser.getCurrentCKANUser(); + CKANUser ckanUser = CKANUserCache.getCurrrentCKANUser(); objectNode.put(AUTHOR_KEY, ckanUser.getName()); objectNode.put(AUTHOR_EMAIL_KEY, ckanUser.getPortalUser().getEMail()); diff --git a/src/main/java/org/gcube/gcat/persistence/ckan/CKANUser.java b/src/main/java/org/gcube/gcat/persistence/ckan/CKANUser.java index 5cfa761..56b9281 100644 --- a/src/main/java/org/gcube/gcat/persistence/ckan/CKANUser.java +++ b/src/main/java/org/gcube/gcat/persistence/ckan/CKANUser.java @@ -103,21 +103,6 @@ public class CKANUser extends CKAN { } } - private static final InheritableThreadLocal currentCkanUser = new InheritableThreadLocal() { - - @Override - protected CKANUser initialValue() { - CKANUser ckanUser = new CKANUser(); - ckanUser.retrieve(); - return ckanUser; - } - - }; - - public static CKANUser getCurrentCKANUser() { - return currentCkanUser.get(); - } - protected PortalUser portalUser; protected Role role; @@ -229,7 +214,7 @@ public class CKANUser extends CKAN { return toBeUpdated; } - private void retrieve() { + protected void retrieve() { setApiKey(CKANUtility.getSysAdminAPI()); try { if(name==null || name.compareTo("")==0) { diff --git a/src/main/java/org/gcube/gcat/persistence/ckan/CKANUserCache.java b/src/main/java/org/gcube/gcat/persistence/ckan/CKANUserCache.java new file mode 100644 index 0000000..20e3ff0 --- /dev/null +++ b/src/main/java/org/gcube/gcat/persistence/ckan/CKANUserCache.java @@ -0,0 +1,66 @@ +package org.gcube.gcat.persistence.ckan; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import javax.cache.Cache; +import javax.cache.CacheManager; +import javax.cache.Caching; +import javax.cache.configuration.MutableConfiguration; +import javax.cache.expiry.CreatedExpiryPolicy; +import javax.cache.expiry.Duration; +import javax.cache.spi.CachingProvider; + +public abstract class CKANUserCache { + + private static final CacheManager cacheManager; + + private static final String USERS_CACHE = "userCache"; + + private static final MutableConfiguration userCacheConfiguration; + + private static final Map> userCachePerCkanInstance; + + static { + CachingProvider provider = Caching.getCachingProvider(); + cacheManager = provider.getCacheManager(); + + userCacheConfiguration = new MutableConfiguration().setTypes(String.class, CKANUser.class) + .setStoreByValue(false) + .setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(TimeUnit.HOURS, 3))); + + userCachePerCkanInstance = new HashMap>(); + + + + + } + + private CKANUserCache() { + } + + public static CKANUser getCurrrentCKANUser() { + String ckanURL = CKANInstance.getInstance().getCKANURL(); + Cache userCache = userCachePerCkanInstance.get(ckanURL); + if(userCache==null) { + userCache = cacheManager.createCache(USERS_CACHE, userCacheConfiguration); + userCachePerCkanInstance.put(ckanURL, userCache); + } + + String ckanUserName = CKANUser.getCKANUsername(); + CKANUser ckanUser = userCache.get(ckanUserName); + if(ckanUser==null) { + ckanUser = new CKANUser(); + ckanUser.retrieve(); + } + return ckanUser; + } + + @Override + protected void finalize() throws Throwable { + super.finalize(); + cacheManager.close(); + } + +} diff --git a/src/main/java/org/gcube/gcat/persistence/ckan/CKANUtility.java b/src/main/java/org/gcube/gcat/persistence/ckan/CKANUtility.java index 021ceb4..b3f21d3 100644 --- a/src/main/java/org/gcube/gcat/persistence/ckan/CKANUtility.java +++ b/src/main/java/org/gcube/gcat/persistence/ckan/CKANUtility.java @@ -17,7 +17,7 @@ public class CKANUtility { public static String getApiKey() { try { - CKANUser ckanUser = CKANUser.getCurrentCKANUser(); + CKANUser ckanUser = CKANUserCache.getCurrrentCKANUser(); return ckanUser.getApiKey(); }catch (Exception e) { throw new InternalServerErrorException(e); diff --git a/src/main/java/org/gcube/gcat/social/PortalUser.java b/src/main/java/org/gcube/gcat/social/PortalUser.java index f35a521..f82cf1c 100644 --- a/src/main/java/org/gcube/gcat/social/PortalUser.java +++ b/src/main/java/org/gcube/gcat/social/PortalUser.java @@ -73,7 +73,7 @@ public class PortalUser { public JsonNode getOAuthUserProfile() { if(oAuthUserProfile == null) { try { - String socialServiceBasePath = SocialServiceDiscovery.getCurrentScopeSocialServiceBasePath(); + String socialServiceBasePath = SocialService.getSocialService().getServiceBasePath(); GXHTTPStringRequest gxhttpStringRequest = HTTPUtility.createGXHTTPStringRequest(socialServiceBasePath, SOCIAL_SERVICE_GET_OAUTH_USER_PROFILE_PATH, false); diff --git a/src/main/java/org/gcube/gcat/social/SocialPost.java b/src/main/java/org/gcube/gcat/social/SocialPost.java index bb95300..351ad0d 100644 --- a/src/main/java/org/gcube/gcat/social/SocialPost.java +++ b/src/main/java/org/gcube/gcat/social/SocialPost.java @@ -10,7 +10,7 @@ import javax.ws.rs.core.MediaType; import org.gcube.common.gxhttp.request.GXHTTPStringRequest; import org.gcube.gcat.persistence.ckan.CKANInstance; -import org.gcube.gcat.persistence.ckan.CKANUser; +import org.gcube.gcat.persistence.ckan.CKANUserCache; import org.gcube.gcat.utils.Constants; import org.gcube.gcat.utils.ContextUtility; import org.gcube.gcat.utils.HTTPUtility; @@ -128,9 +128,9 @@ public class SocialPost extends Thread { public void sendSocialPost(boolean notifyUsers) { try { - String fullName = CKANUser.getCurrentCKANUser().getPortalUser().getFullName(); + String fullName = CKANUserCache.getCurrrentCKANUser().getPortalUser().getFullName(); - String basePath = SocialServiceDiscovery.getCurrentScopeSocialServiceBasePath(); + String basePath = SocialService.getSocialService().getServiceBasePath(); if(basePath == null) { logger.info("Unable to write a post because there is no social networking service available"); return; diff --git a/src/main/java/org/gcube/gcat/social/SocialServiceDiscovery.java b/src/main/java/org/gcube/gcat/social/SocialService.java similarity index 71% rename from src/main/java/org/gcube/gcat/social/SocialServiceDiscovery.java rename to src/main/java/org/gcube/gcat/social/SocialService.java index 2ae02a2..1f945a9 100644 --- a/src/main/java/org/gcube/gcat/social/SocialServiceDiscovery.java +++ b/src/main/java/org/gcube/gcat/social/SocialService.java @@ -16,55 +16,40 @@ import org.slf4j.LoggerFactory; /** * Discover the Social Networking Service in the Infrastructure. - * @author Costantino Perciante (ISTI - CNR) * @author Luca Frosini (ISTI - CNR) */ - -// TODO Add a context based cache -public class SocialServiceDiscovery { +public class SocialService { private static final String RESOURCE = "jersey-servlet"; private static final String SERVICE_NAME = "SocialNetworking"; private static final String SERVICE_CLASSE = "Portal"; - private static final String SOCIAL_SERVICE_HA_PROXY_URL = "https://api.d4science.org/rest"; - - private static Logger logger = LoggerFactory.getLogger(SocialServiceDiscovery.class); + private static Logger logger = LoggerFactory.getLogger(SocialService.class); private String serviceBasePath; - // Map - private static Map socialServiceBasePathPerContext; + // Map + private static Map socialServicePerContext; static { - socialServiceBasePathPerContext = new HashMap<>(); + socialServicePerContext = new HashMap<>(); } - public static String getCurrentScopeSocialServiceBasePath() throws Exception { + public static SocialService getSocialService() throws Exception { String contex = ContextUtility.getCurrentContext(); - String serviceBasePath = socialServiceBasePathPerContext.get(contex); - if(serviceBasePath==null) { - SocialServiceDiscovery gcoreEndpointReaderSNL = new SocialServiceDiscovery(); - serviceBasePath = gcoreEndpointReaderSNL.getServiceBasePath(); - socialServiceBasePathPerContext.put(contex, serviceBasePath); + SocialService socialService = socialServicePerContext.get(contex); + if(socialService==null) { + socialService = new SocialService(); + socialServicePerContext.put(contex, socialService); } - return serviceBasePath; + return socialService; } /** * Discover the gcore endpoint for the social networking service. * @throws Exception the exception */ - private SocialServiceDiscovery() throws Exception { - getServiceBasePathViaServiceEndpoint(); - - if(serviceBasePath==null) { - getServiceBasePathViaGCoreEndpoint(); - } - } - - protected void getServiceBasePathViaServiceEndpoint() throws Exception { - // TODO Discover on IS - serviceBasePath = SOCIAL_SERVICE_HA_PROXY_URL; + private SocialService() throws Exception { + getServiceBasePathViaGCoreEndpoint(); } protected void getServiceBasePathViaGCoreEndpoint() throws Exception { diff --git a/src/test/java/org/gcube/gcat/persistence/ckan/CKANGroupTest.java b/src/test/java/org/gcube/gcat/persistence/ckan/CKANGroupTest.java index 0c1e7f6..37f973e 100644 --- a/src/test/java/org/gcube/gcat/persistence/ckan/CKANGroupTest.java +++ b/src/test/java/org/gcube/gcat/persistence/ckan/CKANGroupTest.java @@ -9,11 +9,19 @@ public class CKANGroupTest extends ContextTest { private static Logger logger = LoggerFactory.getLogger(CKANGroupTest.class); + @Test + public void list() throws Exception { + CKANGroup ckanGroup = new CKANGroup(); + String ret = ckanGroup.list(10,0); + logger.debug("{}", ret); + } + + @Test public void read() throws Exception { CKANGroup ckanGroup = new CKANGroup(); ckanGroup.setApiKey(CKANUtility.getSysAdminAPI()); - String name = ""; + String name = "abundance-level"; ckanGroup.setName(name); String ret = ckanGroup.read(); logger.debug("{}", ret); diff --git a/src/test/java/org/gcube/gcat/persistence/ckan/CKANUserTest.java b/src/test/java/org/gcube/gcat/persistence/ckan/CKANUserTest.java index ff5f6f7..5346ffd 100644 --- a/src/test/java/org/gcube/gcat/persistence/ckan/CKANUserTest.java +++ b/src/test/java/org/gcube/gcat/persistence/ckan/CKANUserTest.java @@ -75,7 +75,13 @@ public class CKANUserTest extends ContextTest { @Test public void checkAndUpdateInformation() throws Exception { - CKANUser ckanUser = CKANUser.getCurrentCKANUser(); + CKANUser ckanUser = CKANUserCache.getCurrrentCKANUser(); + logger.debug("{}", ckanUser.result); + + ckanUser = CKANUserCache.getCurrrentCKANUser(); + logger.debug("{}", ckanUser.result); + + ckanUser = CKANUserCache.getCurrrentCKANUser(); logger.debug("{}", ckanUser.result); } } diff --git a/src/test/java/org/gcube/gcat/social/SocialServiceTest.java b/src/test/java/org/gcube/gcat/social/SocialServiceTest.java new file mode 100644 index 0000000..71a0f7c --- /dev/null +++ b/src/test/java/org/gcube/gcat/social/SocialServiceTest.java @@ -0,0 +1,18 @@ +package org.gcube.gcat.social; + +import org.gcube.gcat.ContextTest; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SocialServiceTest { + + private static Logger logger = LoggerFactory.getLogger(SocialServiceTest.class); + + @Test + public void get() throws Exception { + ContextTest.setContextByName("/d4science.research-infrastructures.eu/D4Research/AGINFRAplusDev"); + SocialService socialService = SocialService.getSocialService(); + logger.debug(socialService.getServiceBasePath()); + } +}