From e040d787f01c87d41227ae160f895f09273ad77a Mon Sep 17 00:00:00 2001 From: "giancarlo.panichi" Date: Wed, 9 Nov 2016 19:01:43 +0000 Subject: [PATCH] Updated cache behavior git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/admin/accounting-manager@134002 82a268e6-3cf1-43bd-a215-b396298e98cf --- pom.xml | 12 ++ .../server/AccountingManagerServiceImpl.java | 41 ++++-- .../accountingmanager/server/SessionUtil.java | 24 +++- .../server/amservice/AccountingCaller.java | 4 +- .../amservice/cache/AccountingCache.java | 121 ++++++++++++++++++ .../amservice/query/AccountingQuery4Job.java | 2 +- .../query/AccountingQuery4Portlet.java | 2 +- .../query/AccountingQuery4Service.java | 2 +- .../query/AccountingQuery4Storage.java | 2 +- .../amservice/query/AccountingQuery4Task.java | 2 +- .../accountingmanager/shared/Constants.java | 6 +- .../TestAccountingManangerCache.java | 50 ++++++++ 12 files changed, 240 insertions(+), 28 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/cache/AccountingCache.java create mode 100644 src/test/java/org/gcube/portlets/admin/accountingmanager/TestAccountingManangerCache.java diff --git a/pom.xml b/pom.xml index 94c1b7f..20621fa 100644 --- a/pom.xml +++ b/pom.xml @@ -339,7 +339,19 @@ + + + javax.cache + cache-api + 1.0.0 + + + + org.ehcache + ehcache + 3.1.3 + diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingManagerServiceImpl.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingManagerServiceImpl.java index ec87612..3a1771f 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingManagerServiceImpl.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingManagerServiceImpl.java @@ -10,6 +10,7 @@ import org.gcube.portlets.admin.accountingmanager.client.rpc.AccountingManagerSe import org.gcube.portlets.admin.accountingmanager.server.amservice.AccountingCaller; import org.gcube.portlets.admin.accountingmanager.server.amservice.AccountingCallerInterface; import org.gcube.portlets.admin.accountingmanager.server.amservice.AccountingCallerTester; +import org.gcube.portlets.admin.accountingmanager.server.amservice.cache.AccountingCache; import org.gcube.portlets.admin.accountingmanager.server.export.CSVManager; import org.gcube.portlets.admin.accountingmanager.server.is.BuildEnableTabs; import org.gcube.portlets.admin.accountingmanager.server.state.AccountingStateData; @@ -96,8 +97,9 @@ public class AccountingManagerServiceImpl extends RemoteServiceServlet ASLSession aslSession = SessionUtil.getASLSession(session); String token = SessionUtil.getToken(aslSession); logger.debug("UserToken: " + token); - - EnableTabs enableTabs =BuildEnableTabs.build(aslSession.getScope()); + + EnableTabs enableTabs = BuildEnableTabs + .build(aslSession.getScope()); return enableTabs; } catch (ServiceException e) { @@ -123,14 +125,26 @@ public class AccountingManagerServiceImpl extends RemoteServiceServlet String token = SessionUtil.getToken(aslSession); logger.debug("UserToken: " + token); - AccountingCallerInterface accountingCaller; - if (Constants.DEBUG_MODE) { - accountingCaller = new AccountingCallerTester(); - } else { - accountingCaller = new AccountingCaller(); + AccountingCache accountingCache = SessionUtil + .getAccountingCache(session,token); + String key = new String(accountingType.name() + "_" + + seriesRequest.toString()); + SeriesResponse seriesResponse = accountingCache.get(key); + + if (seriesResponse == null) { + + AccountingCallerInterface accountingCaller; + if (Constants.DEBUG_MODE) { + accountingCaller = new AccountingCallerTester(); + } else { + accountingCaller = new AccountingCaller(); + } + seriesResponse = accountingCaller.getSeries(accountingType, + seriesRequest); + accountingCache.put(key, seriesResponse); + } - SeriesResponse seriesResponse = accountingCaller.getSeries( - accountingType, seriesRequest); + AccountingStateData accountingStateData = new AccountingStateData( accountingType, seriesRequest, seriesResponse); SessionUtil.setAccountingStateData(session, accountingType, @@ -217,7 +231,7 @@ public class AccountingManagerServiceImpl extends RemoteServiceServlet } } - + /** * * {@inheritDoc} @@ -230,9 +244,9 @@ public class AccountingManagerServiceImpl extends RemoteServiceServlet String token = SessionUtil.getToken(aslSession); logger.debug("UserToken: " + token); - Context context=SessionUtil.getContext(aslSession); - logger.debug("getContext(): "+context); - + Context context = SessionUtil.getContext(aslSession); + logger.debug("getContext(): " + context); + return context; } catch (ServiceException e) { @@ -245,7 +259,6 @@ public class AccountingManagerServiceImpl extends RemoteServiceServlet } } - @Override public ItemDescription saveCSVOnWorkspace(AccountingType accountingType) diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/SessionUtil.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/SessionUtil.java index 05b303f..0b83109 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/SessionUtil.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/SessionUtil.java @@ -11,6 +11,7 @@ import javax.servlet.http.HttpSession; import org.gcube.application.framework.core.session.ASLSession; import org.gcube.application.framework.core.session.SessionManager; import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper; +import org.gcube.portlets.admin.accountingmanager.server.amservice.cache.AccountingCache; import org.gcube.portlets.admin.accountingmanager.server.state.AccountingState; import org.gcube.portlets.admin.accountingmanager.server.state.AccountingStateData; import org.gcube.portlets.admin.accountingmanager.shared.Constants; @@ -111,13 +112,27 @@ public class SessionUtil { } } - public static Context getContext(ASLSession aslSession) throws ServiceException { + public static AccountingCache getAccountingCache(HttpSession httpSession, + String token) throws ServiceException { + AccountingCache accountingCache = (AccountingCache) httpSession + .getAttribute(Constants.ACCOUNTING_CACHE); + if (accountingCache == null) { + accountingCache = new AccountingCache(token); + httpSession.setAttribute(Constants.ACCOUNTING_CACHE, + accountingCache); + } + return accountingCache; + + } + + public static Context getContext(ASLSession aslSession) + throws ServiceException { try { logger.info("Current context is " + aslSession.getScope()); ArrayList contexts = new ArrayList<>(); contexts.add(aslSession.getScope()); - + GroupManager gm = new LiferayGroupManager(); long currentGroupId = gm .getGroupIdFromInfrastructureScope(aslSession.getScope()); @@ -156,9 +171,8 @@ public class SessionUtil { } // add the current scope too - Context context=new Context(contexts); - - + Context context = new Context(contexts); + return context; } catch (Exception e) { diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/AccountingCaller.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/AccountingCaller.java index 9f0b0e1..91a226d 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/AccountingCaller.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/AccountingCaller.java @@ -35,7 +35,7 @@ import org.slf4j.LoggerFactory; * */ public class AccountingCaller implements AccountingCallerInterface { - static Logger logger = LoggerFactory.getLogger(AccountingCaller.class); + private static Logger logger = LoggerFactory.getLogger(AccountingCaller.class); public AccountingCaller() { super(); @@ -63,7 +63,7 @@ public class AccountingCaller implements AccountingCallerInterface { try { logger.debug("getSeries(): [AccountingType=" + accountingType + " , seriesRequest=" + seriesRequest + "]"); - + AccountingQueryBuilder queryBuilder = getAccountQueryBuilder( accountingType, seriesRequest); diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/cache/AccountingCache.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/cache/AccountingCache.java new file mode 100644 index 0000000..92fc1fc --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/cache/AccountingCache.java @@ -0,0 +1,121 @@ +package org.gcube.portlets.admin.accountingmanager.server.amservice.cache; + +import java.io.Serializable; + +import javax.cache.Cache; +import javax.cache.CacheManager; +import javax.cache.Caching; +import javax.cache.configuration.MutableConfiguration; +import javax.cache.expiry.AccessedExpiryPolicy; +import javax.cache.expiry.Duration; +import javax.cache.spi.CachingProvider; + +import org.gcube.portlets.admin.accountingmanager.shared.data.response.SeriesResponse; +import org.gcube.portlets.admin.accountingmanager.shared.exception.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AccountingCache implements Serializable { + private static final long serialVersionUID = -4352823042594405108L; + + private static Logger logger = LoggerFactory + .getLogger(AccountingCache.class); + + private static final String ACCOUNTING_CACHE = "AccountingCache"; + private Cache cache; + private CacheManager cacheManager; + private String cacheName; + + public AccountingCache(String token) throws ServiceException { + super(); + try { + cacheName=ACCOUNTING_CACHE+token; + + // Resolve a cache manager + CachingProvider cachingProvider = Caching.getCachingProvider(); + cacheManager = cachingProvider.getCacheManager(); + + // configure the cache MutableConfiguration + MutableConfiguration config = new MutableConfiguration() + .setTypes(String.class, SeriesResponse.class) + .setExpiryPolicyFactory( + AccessedExpiryPolicy + .factoryOf(Duration.THIRTY_MINUTES)) + .setStatisticsEnabled(true); + + // create the cache + cache=cacheManager.getCache(cacheName); + + if(cache==null){ + cache = cacheManager.createCache(cacheName, config); + + } + + /* + * ResourcePoolsBuilder builder = ResourcePoolsBuilder + * .newResourcePoolsBuilder().heap(5L, MemoryUnit.MB); + * + * CacheConfiguration cacheConfiguration = + * CacheConfigurationBuilder + * .newCacheConfigurationBuilder(String.class, Integer.class, + * builder) .withSizeOfMaxObjectSize(2L, MemoryUnit.MB) .withExpiry( + * Expirations .timeToLiveExpiration(org.ehcache.expiry.Duration + * .of(1L, TimeUnit.HOURS))).build(); + * + * cache = cacheManager.createCache(ACCOUNTING_CACHE, + * Eh107Configuration + * .fromEhcacheCacheConfiguration(cacheConfiguration)); + */ + + } catch (Exception e) { + logger.error(e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + + } + + } + + public void put(String key, SeriesResponse value) { + cache.put(key, value); + logger.debug("Cached: [" + key + ", " + value + "]"); + + } + + public SeriesResponse get(String key) { + SeriesResponse value = cache.get(key); + logger.debug("Cached value: " + value); + return value; + } + + @Override + protected void finalize() throws Throwable { + super.finalize(); + logger.debug("Release the resource " + cacheName); + if (cache != null) { + try { + cache.close(); + } catch (Throwable e) { + logger.error("Error closing the cache " + cacheName + + ": " + e.getLocalizedMessage(), e); + } + + try { + cacheManager.destroyCache(ACCOUNTING_CACHE); + } catch (Throwable e) { + logger.error("Error destroying the cache " + cacheName + + ": " + e.getLocalizedMessage(), e); + } + + try { + cacheManager.close(); + } catch (Throwable e) { + logger.error( + "Error closing cache manager: " + + e.getLocalizedMessage(), e); + } + + } + + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Job.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Job.java index 0b8483a..8c40302 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Job.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Job.java @@ -126,7 +126,7 @@ public class AccountingQuery4Job extends AccountingQueryBuilder { } invocation = new AccountingQueryContext( AggregatedJobUsageRecord.class, - accountingFilterContext.getContexts(), + accountingFilterContext.getContext(), temporalConstraint, filters); } else { logger.error("Invalid Request: " + seriesRequest); diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Portlet.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Portlet.java index 01264a4..a01eedd 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Portlet.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Portlet.java @@ -125,7 +125,7 @@ public class AccountingQuery4Portlet extends AccountingQueryBuilder { } invocation = new AccountingQueryContext( AggregatedPortletUsageRecord.class, - accountingFilterContext.getContexts(), + accountingFilterContext.getContext(), temporalConstraint, filters); } else { logger.error("Invalid Request: " + seriesRequest); diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Service.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Service.java index c6762c6..a52fc68 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Service.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Service.java @@ -126,7 +126,7 @@ public class AccountingQuery4Service extends AccountingQueryBuilder { } invocation = new AccountingQueryContext( AggregatedServiceUsageRecord.class, - accountingFilterContext.getContexts(), + accountingFilterContext.getContext(), temporalConstraint, filters); } else { logger.error("Invalid Request: " + seriesRequest); diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Storage.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Storage.java index 4756c7b..cd918c1 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Storage.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Storage.java @@ -126,7 +126,7 @@ public class AccountingQuery4Storage extends AccountingQueryBuilder { } invocation = new AccountingQueryContext( AggregatedStorageUsageRecord.class, - accountingFilterContext.getContexts(), + accountingFilterContext.getContext(), temporalConstraint, filters); } else { logger.error("Invalid Request: " + seriesRequest); diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Task.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Task.java index 04ffbf6..6025023 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Task.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/query/AccountingQuery4Task.java @@ -125,7 +125,7 @@ public class AccountingQuery4Task extends AccountingQueryBuilder { } invocation = new AccountingQueryContext( AggregatedTaskUsageRecord.class, - accountingFilterContext.getContexts(), + accountingFilterContext.getContext(), temporalConstraint, filters); } else { diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/Constants.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/Constants.java index 5838ec2..73ae564 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/Constants.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/Constants.java @@ -19,7 +19,7 @@ public class Constants { public static final String DEFAULT_USER = "giancarlo.panichi"; public final static String DEFAULT_SCOPE = "/gcube/devNext/NextNext"; public final static String DEFAULT_TOKEN = "6af6eaff-35bd-4405-b747-f63246d0212a-98187548"; - + // public final static String DEFAULT_SCOPE = "/gcube/devsec/devVRE"; // public final static String DEFAULT_TOKEN = // "16e65d4f-11e0-4e4a-84b9-351688fccc12-98187548"; @@ -30,6 +30,8 @@ public class Constants { public static final String EXPORT_SERVLET_ACCOUNTING_TYPE_PARAMETER = "AccountingType"; public static final String SESSION_ACCOUNTING_STATE = "ACCOUNTING_STATE"; + public static final String ACCOUNTING_CACHE = "AccountingCache"; + public static final AccountingType[] DEFAULT_TABS = new AccountingType[] { AccountingType.STORAGE };; @@ -37,6 +39,6 @@ public class Constants { //IS Resource public static final String ACCOUNTING_NAME = "AccountingManager"; public static final String ACCOUNTING_CATEGORY = "AccountingProfile"; - + } diff --git a/src/test/java/org/gcube/portlets/admin/accountingmanager/TestAccountingManangerCache.java b/src/test/java/org/gcube/portlets/admin/accountingmanager/TestAccountingManangerCache.java new file mode 100644 index 0000000..cc00791 --- /dev/null +++ b/src/test/java/org/gcube/portlets/admin/accountingmanager/TestAccountingManangerCache.java @@ -0,0 +1,50 @@ +/** + * + */ +package org.gcube.portlets.admin.accountingmanager; + +import junit.framework.TestCase; + +import org.gcube.portlets.admin.accountingmanager.server.amservice.cache.AccountingCache; +import org.gcube.portlets.admin.accountingmanager.shared.Constants; +import org.gcube.portlets.admin.accountingmanager.shared.data.response.SeriesResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public class TestAccountingManangerCache extends TestCase { + + private static Logger logger = LoggerFactory + .getLogger(TestAccountingManangerCache.class); + + + public void testAccountingManagerResource() { + if (Constants.TEST_ENABLE) { + logger.debug("Test Enabled"); + + try { + AccountingCache accountingCache=new AccountingCache("token"); + SeriesResponse s=new SeriesResponse(); + accountingCache.put("key", s); + assertTrue(true); + + } catch (Exception e) { + logger.error(e.getLocalizedMessage(),e); + assertTrue("Error in cache!", false); + + } + + } else { + logger.debug("Test Disabled"); + assertTrue(true); + } + } + + + +}