diff --git a/src/main/java/org/gcube/portlet/user/my_vres/server/DistributedCacheClient.java b/src/main/java/org/gcube/portlet/user/my_vres/server/DistributedCacheClient.java deleted file mode 100644 index 5395778..0000000 --- a/src/main/java/org/gcube/portlet/user/my_vres/server/DistributedCacheClient.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.gcube.portlet.user.my_vres.server; - -import static org.gcube.resources.discovery.icclient.ICFactory.clientFor; -import static org.gcube.resources.discovery.icclient.ICFactory.queryFor; - -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.List; - -import org.gcube.common.portal.PortalContext; -import org.gcube.common.resources.gcore.ServiceEndpoint; -import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint; -import org.gcube.common.resources.gcore.utils.Group; -import org.gcube.common.scope.api.ScopeProvider; -import org.gcube.resources.discovery.client.api.DiscoveryClient; -import org.gcube.resources.discovery.client.queries.api.SimpleQuery; -import org.slf4j.LoggerFactory; - -import net.spy.memcached.KetamaConnectionFactory; -import net.spy.memcached.MemcachedClient; - -/** - * @author Massimiliano Assante at ISTI-CNR - */ -public class DistributedCacheClient { - - // Logger - private static final org.slf4j.Logger logger = LoggerFactory.getLogger(DistributedCacheClient.class); - - private static final String MEMCACHED_RESOURCE_NAME = "Memcached"; - private static final String CATEGORY = "Database"; - - private MemcachedClient mClient; - - /** - * Singleton object - */ - private static DistributedCacheClient singleton = new DistributedCacheClient(); - - /** - * Build the singleton instance - */ - private DistributedCacheClient(){ - List addrs = discoverHostOfServiceEndpoint(); - try { - mClient = new MemcachedClient(new KetamaConnectionFactory(), addrs); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * Retrieve the singleton instance - */ - public static DistributedCacheClient getInstance(){ - if (singleton == null) { - singleton = new DistributedCacheClient(); - } - return singleton; - } - - public MemcachedClient getMemcachedClient() { - return mClient; - } - - /** - * Retrieve endpoint resoruce from IS - * @return List of InetSocketAddresses - * @throws Exception - */ - private static List discoverHostOfServiceEndpoint(){ - - String currentScope = ScopeProvider.instance.get(); - String infrastructure = "/"+PortalContext.getConfiguration().getInfrastructureName(); - ScopeProvider.instance.set(infrastructure); - List toReturn = new ArrayList(); - try{ - SimpleQuery query = queryFor(ServiceEndpoint.class); - query.addCondition("$resource/Profile/Name/text() eq '"+ MEMCACHED_RESOURCE_NAME +"'"); - query.addCondition("$resource/Profile/Category/text() eq '"+ CATEGORY +"'"); - DiscoveryClient client = clientFor(ServiceEndpoint.class); - List ses = client.submit(query); - if (ses.isEmpty()) { - logger.error("There is no Memcached cluster having name: " + MEMCACHED_RESOURCE_NAME + " and Category " + CATEGORY + " on root context in this infrastructure: "); - return null; - } - for (ServiceEndpoint se : ses) { - Group aps = se.profile().accessPoints(); - for (AccessPoint ap : aps.asCollection()) { - String address = ap.address(); //e.g. socialnetworking-d-d4s.d4science.org:11211 - String[] splits = address.split(":"); - String hostname = splits[0]; - int port = Integer.parseInt(splits[1]); - toReturn.add(new InetSocketAddress(hostname, port)); - } - break; - } - } catch(Exception e){ - logger.error("Error while retrieving hosts for the Memcached cluster having name: " + MEMCACHED_RESOURCE_NAME + " and Category " + CATEGORY + " on root context"); - }finally{ - ScopeProvider.instance.set(currentScope); - } - ScopeProvider.instance.set(currentScope); - return toReturn; - } - -} diff --git a/src/main/java/org/gcube/portlet/user/my_vres/server/MyVREsServiceImpl.java b/src/main/java/org/gcube/portlet/user/my_vres/server/MyVREsServiceImpl.java index 0995f4a..0f23cc5 100644 --- a/src/main/java/org/gcube/portlet/user/my_vres/server/MyVREsServiceImpl.java +++ b/src/main/java/org/gcube/portlet/user/my_vres/server/MyVREsServiceImpl.java @@ -1,7 +1,10 @@ package org.gcube.portlet.user.my_vres.server; import static org.gcube.common.authorization.client.Constants.authorizationService; +import static org.gcube.resources.discovery.icclient.ICFactory.clientFor; +import static org.gcube.resources.discovery.icclient.ICFactory.queryFor; +import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; @@ -13,11 +16,16 @@ import javax.servlet.http.HttpServletRequest; import org.gcube.common.portal.GCubePortalConstants; import org.gcube.common.portal.PortalContext; import org.gcube.common.resources.gcore.ServiceEndpoint; +import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint; +import org.gcube.common.resources.gcore.utils.Group; +import org.gcube.common.scope.api.ScopeProvider; import org.gcube.portal.auth.AuthUtil; import org.gcube.portlet.user.my_vres.client.MyVREsService; import org.gcube.portlet.user.my_vres.shared.AuthorizationBean; import org.gcube.portlet.user.my_vres.shared.UserBelonging; import org.gcube.portlet.user.my_vres.shared.VRE; +import org.gcube.resources.discovery.client.api.DiscoveryClient; +import org.gcube.resources.discovery.client.queries.api.SimpleQuery; import org.gcube.vomanagement.usermanagement.GroupManager; import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault; import org.gcube.vomanagement.usermanagement.exception.UserManagementSystemException; @@ -35,6 +43,7 @@ import org.slf4j.LoggerFactory; import com.google.gwt.user.server.rpc.RemoteServiceServlet; import com.liferay.portal.service.UserLocalServiceUtil; +import net.spy.memcached.KetamaConnectionFactory; import net.spy.memcached.MemcachedClient; import net.spy.memcached.internal.OperationFuture; @@ -56,10 +65,10 @@ public class MyVREsServiceImpl extends RemoteServiceServlet implements MyVREsSer public static final String ADD_MORE_CATEGORY = "Add More"; public static final String ADD_MORE_IMAGE_PATH= "images/More.png"; private static final int CACHE_SECONDS_EXPIRATION = 10; - /** - * This map contains couples as - */ - private MemcachedClient entries; + + private static final String MEMCACHED_RESOURCE_NAME = "Memcached"; + private static final String CATEGORY = "Database"; + List memCachedClusteraddrs; @Override public String getSiteLandingPagePath() { @@ -349,9 +358,12 @@ public class MyVREsServiceImpl extends RemoteServiceServlet implements MyVREsSer private boolean authorizeApplication(String infrastructureName, String qToken, String tempCode, String clientId, String redirectURL) { OperationFuture writeOp = null; try { + //instance the client if first time - if (entries == null) - entries = DistributedCacheClient.getInstance().getMemcachedClient(); + if (memCachedClusteraddrs == null) { + memCachedClusteraddrs = discoverMemcachedClusterEndpoint(); + } + MemcachedClient mClient = new MemcachedClient(new KetamaConnectionFactory(), memCachedClusteraddrs); //retrieve the context of the token owner String context = authorizationService().get(qToken).getContext(); JSONObject object = new JSONObject(); @@ -360,9 +372,8 @@ public class MyVREsServiceImpl extends RemoteServiceServlet implements MyVREsSer object.put("redirect_uri", redirectURL); object.put("client_id", clientId); String JSONData = object.toJSONString(); - writeOp = entries.set(tempCode, CACHE_SECONDS_EXPIRATION, JSONData); - - + writeOp = mClient.set(tempCode, CACHE_SECONDS_EXPIRATION, JSONData); + Thread.sleep(500); } catch (Exception e) { e.printStackTrace(); return writeOp.getStatus().isSuccess(); @@ -370,6 +381,45 @@ public class MyVREsServiceImpl extends RemoteServiceServlet implements MyVREsSer return writeOp.getStatus().isSuccess(); } + /** + * Retrieve endpoint resoruce from IS + * @return List of InetSocketAddresses + * @throws Exception + */ + private static List discoverMemcachedClusterEndpoint(){ + String currentScope = ScopeProvider.instance.get(); + String infrastructure = "/"+PortalContext.getConfiguration().getInfrastructureName(); + ScopeProvider.instance.set(infrastructure); + List toReturn = new ArrayList(); + try{ + SimpleQuery query = queryFor(ServiceEndpoint.class); + query.addCondition("$resource/Profile/Name/text() eq '"+ MEMCACHED_RESOURCE_NAME +"'"); + query.addCondition("$resource/Profile/Category/text() eq '"+ CATEGORY +"'"); + DiscoveryClient client = clientFor(ServiceEndpoint.class); + List ses = client.submit(query); + if (ses.isEmpty()) { + _log.error("There is no Memcached cluster having name: " + MEMCACHED_RESOURCE_NAME + " and Category " + CATEGORY + " on root context in this infrastructure: "); + return null; + } + for (ServiceEndpoint se : ses) { + Group aps = se.profile().accessPoints(); + for (AccessPoint ap : aps.asCollection()) { + String address = ap.address(); //e.g. socialnetworking-d-d4s.d4science.org:11211 + String[] splits = address.split(":"); + String hostname = splits[0]; + int port = Integer.parseInt(splits[1]); + toReturn.add(new InetSocketAddress(hostname, port)); + } + break; + } + } catch(Exception e){ + _log.error("Error while retrieving hosts for the Memcached cluster having name: " + MEMCACHED_RESOURCE_NAME + " and Category " + CATEGORY + " on root context"); + }finally{ + ScopeProvider.instance.set(currentScope); + } + ScopeProvider.instance.set(currentScope); + return toReturn; + } } \ No newline at end of file