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());
+ }
+}