/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.smartitengineering.user.service.impl.cache;
import com.google.inject.Inject;
import com.google.inject.name.Named;
import com.smartitengineering.dao.common.cache.CacheServiceProvider;
import com.smartitengineering.dao.common.cache.Lock;
import com.smartitengineering.dao.common.cache.Mutex;
import com.smartitengineering.dao.common.cache.impl.CacheAPIFactory;
import com.smartitengineering.user.domain.Organization;
import com.smartitengineering.user.filter.OrganizationFilter;
import com.smartitengineering.user.service.OrganizationService;
import java.util.Collection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author imyousuf
*/
public class OrganizationServiceCacheImpl implements OrganizationService {
@Inject
@Named("primaryService")
private OrganizationService primaryService;
@Inject
private CacheServiceProvider<String, Organization> orgCacheProvider;
private transient final Logger logger = LoggerFactory.getLogger(getClass());
private final Mutex<String> mutex = CacheAPIFactory.<String>getMutex();
@Override
public void save(Organization organization) {
//Simply delegate
primaryService.save(organization);
}
@Override
public void update(Organization organization) {
//First update then delete if update successful!
try {
primaryService.update(organization);
orgCacheProvider.expireFromCache(organization.getId());
}
catch (RuntimeException exception) {
logger.info("Could not update thus invalidate cache!", exception);
throw exception;
}
}
@Override
public void delete(Organization organization) {
//First update then delete if update successful!
try {
primaryService.delete(organization);
orgCacheProvider.expireFromCache(organization.getId());
}
catch (RuntimeException exception) {
logger.warn("Could not update thus invalidate cache!", exception);
throw exception;
}
}
@Override
public Collection<Organization> search(OrganizationFilter organizationFilter) {
//No caching
return primaryService.search(organizationFilter);
}
@Override
public Collection<Organization> getAllOrganization() {
//No caching
return primaryService.getAllOrganization();
}
@Override
public Collection<Organization> getOrganizations(String organizationNameLike, String shortName, boolean isSmallerThan,
int count) {
//No caching
return primaryService.getOrganizations(organizationNameLike, shortName, isSmallerThan, count);
}
@Override
public Organization getOrganizationByUniqueShortName(String uniqueShortName) {
//Check cache first
Organization organization = orgCacheProvider.retrieveFromCache(uniqueShortName);
if (organization != null) {
return organization;
}
else {
try {
Lock<String> lock = mutex.acquire(uniqueShortName);
organization = orgCacheProvider.retrieveFromCache(uniqueShortName);
if (organization != null) {
return organization;
}
organization = primaryService.getOrganizationByUniqueShortName(uniqueShortName);
if (organization != null) {
orgCacheProvider.putToCache(uniqueShortName, organization);
}
mutex.release(lock);
}
catch (Exception ex) {
logger.warn("Could not do cache lookup!", ex);
}
return organization;
}
}
@Override
public void validateOrganization(Organization organization) {
//No caching
primaryService.validateOrganization(organization);
}
}