CacheObjectsService.java
package sk.iway.iwcm.components.memory_cleanup.cache_objects;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.support.PagedListHolder;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import sk.iway.iwcm.*;
import sk.iway.iwcm.doc.DocDB;
import sk.iway.iwcm.doc.GroupsDB;
import sk.iway.iwcm.doc.TemplatesDB;
import sk.iway.iwcm.io.IwcmFile;
import sk.iway.iwcm.system.cluster.ClusterDB;
import sk.iway.iwcm.tags.CombineTag;
import sk.iway.iwcm.users.UserGroupsDB;
import sk.iway.iwcm.utils.Pair;
import javax.servlet.http.HttpServletRequest;
import java.sql.Timestamp;
import java.util.*;
@Service
public class CacheObjectsService {
private final CacheObjectsMapper memoryCleanupMapper;
private final CacheDtoComparator cacheDtoComparator;
@Autowired
public CacheObjectsService(CacheObjectsMapper memoryCleanupMapper, CacheDtoComparator cacheDtoComparator) {
this.memoryCleanupMapper = memoryCleanupMapper;
this.cacheDtoComparator = cacheDtoComparator;
}
Page<CacheDto> getAllCacheBeans(HttpServletRequest request, Pageable pageable) {
Cache cache = Cache.getInstance();
Enumeration<CacheBean> cacheBeans = cache.getAllElements();
List<CacheBean> listOfCacheBeans = Collections.list(cacheBeans);
List<CacheDto> cacheDtoList = memoryCleanupMapper.beanListToDtoList(listOfCacheBeans);
String sort = request.getParameter("sort");
if (sort != null) {
String[] sortArray = sort.split(",");
Pair<String, String> sortPair = new Pair<>(sortArray[0], sortArray[1]);
sortCacheDtos(sortPair, cacheDtoList);
}
PagedListHolder<CacheDto> holder = new PagedListHolder<>(cacheDtoList);
holder.setPage(pageable.getPageNumber());
holder.setPageSize(pageable.getPageSize());
return new PageImpl<>(holder.getPageList(), pageable, cacheDtoList.size());
}
boolean deleteCacheBean(CacheDto cacheBean) {
Cache cache = Cache.getInstance();
cache.removeObject(cacheBean.getName());
ClusterDB.addRefresh(DB.prepareString("sk.iway.iwcm.Cache-" + cacheBean.getName(), 250));
Adminlog.add(Adminlog.TYPE_DATA_DELETING, "Deleting cache, key= " + cacheBean.getName(), -1, -1);
return true;
}
boolean deleteAllCacheBeans() {
Cache cache = Cache.getInstance();
try {
cache.clearAll();
//zmaz aj doc db a podobne
DocDB.getInstance(true);
GroupsDB.getInstance(true);
TemplatesDB.getInstance(true);
UserGroupsDB.getInstance(true);
//prenes zmenu na cely cluster
ClusterDB.addRefresh("sk.iway.iwcm.Cache-delAll");
//zmen version tag
long now = Tools.getNow();
ClusterDB.addRefresh("sk.iway.iwcm.tags.CombineTag-"+now);
DB.resetHtmlAllowedFields();
CombineTag.setVersion(now);
//Clear all spam protection maps
SpamProtection.clearAll();
Adminlog.add(Adminlog.TYPE_DATA_DELETING, "Deleting cache ALL", -1, -1);
} catch (Exception e) {
Logger.error(CacheObjectsService.class, "Error deleting all cache objects. Error message: " + e.getMessage());
return false;
}
return true;
}
boolean deletePictureCache() {
String dirStr = sk.iway.iwcm.Tools.getRealPath(Constants.getString("thumbServletCacheDir"));
IwcmFile dir = new IwcmFile(dirStr);
try {
deletePictureCacheCycleClass(dir);
} catch (Exception e) {
Logger.error(CacheObjectsService.class, "Error deleting picture cache. Error message: " + e.getMessage());
return false;
}
return true;
}
private void deletePictureCacheCycleClass(IwcmFile iwcmFile) {
for (IwcmFile file : iwcmFile.listFiles()) {
if (file.isDirectory()) {
deletePictureCacheCycleClass(file);
} else {
file.delete();
}
}
}
Page<CacheDto> getFilteredCacheDtos(Map<String, String> searchMap, Pair<String, String> sortPair,
Pageable pageable) {
Cache cache = Cache.getInstance();
Enumeration<CacheBean> cacheBeans = cache.getAllElements();
List<CacheBean> listOfCacheBeans = Collections.list(cacheBeans);
List<CacheDto> cacheDtoList = memoryCleanupMapper.beanListToDtoList(listOfCacheBeans);
List<CacheDto> filteredCacheDtos = new ArrayList<>();
for (CacheDto entity : cacheDtoList) {
BeanWrapper beanWrapper = new BeanWrapperImpl(entity);
boolean present = false;
for (Map.Entry<String, String> searchParameter : searchMap.entrySet()) {
present = false;
if (searchParameter.getKey().equals("expirationDate")) {
Pair<Timestamp, Timestamp> datePair = getCleanExpirationDateValue(searchParameter.getValue());
if (null == datePair.first) {
if (null != entity.getExpirationDate() && entity.getExpirationDate().before(datePair.second)) {
present = true;
}
} else if (null == datePair.second) {
if (null != entity.getExpirationDate() && entity.getExpirationDate().after(datePair.first)) {
present = true;
}
} else {
if (null != entity.getExpirationDate() && entity.getExpirationDate().after(datePair.first) && entity.getExpirationDate().before(datePair.second)) {
present = true;
}
}
} else {
String entityValue = (String) beanWrapper.getPropertyValue(searchParameter.getKey());
if (null == entityValue) break;
if (entityValue.toLowerCase().contains(searchParameter.getValue().toLowerCase())) present = true;
if (!present) break;
}
}
if (present) filteredCacheDtos.add(entity);
}
sortCacheDtos(sortPair, filteredCacheDtos);
PagedListHolder<CacheDto> holder = new PagedListHolder<>(filteredCacheDtos);
holder.setPage(pageable.getPageNumber());
holder.setPageSize(pageable.getPageSize());
return new PageImpl<>(holder.getPageList(), pageable, filteredCacheDtos.size());
}
private Pair<Timestamp, Timestamp> getCleanExpirationDateValue(String updateDate) {
//String filteredDate = updateDate.replace("daterange:", "");
//String[] stringDateArray = new String[2];
Timestamp from = null;
Timestamp to = null;
String[] values = Tools.getTokens(updateDate.substring(updateDate.indexOf(":") + 1), "-");
if (values.length == 2) {
from = new Timestamp(Tools.getLongValue(values[0], 0));
to = new Timestamp(Tools.getLongValue(values[1], 0));
} else if (values.length == 1) {
if (updateDate.contains("range:-")) to = new Timestamp(Tools.getLongValue(values[0], 0));
else from = new Timestamp(Tools.getLongValue(values[0], 0));
}
if (to != null) {
//to nam pride vo formate 2.6.2020 ale mysli sa do konca dna, je potrebne pridat 24 hodin
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(to.getTime());
cal.add(Calendar.DATE, 1);
to = new Timestamp(cal.getTimeInMillis());
}
// if (filteredDate.contains("-")) {
// if(filteredDate.startsWith("-")){
// stringDateArray[0] = "";
// stringDateArray[1] = filteredDate.replace("-", "");
// } else {
// stringDateArray = filteredDate.split("-");
// }
// } else {
// stringDateArray[0] = filteredDate.replace("-", "");
// stringDateArray[1] = "";
// }
//
// long[] longDateArray = new long[]{Tools.getLongValue(stringDateArray[0], 0), Tools.getLongValue(stringDateArray[1], new Date().getTime())};
//
// Date dateFrom = new Date(longDateArray[0]);
// Date dateTo = new Date(longDateArray[1]);
return new Pair<>(from, to);
}
private void sortCacheDtos(Pair<String, String> sortPair, List<CacheDto> cacheDtoList) {
if (sortPair.second.equals("asc")) {
cacheDtoList.sort(cacheDtoComparator.getSortingComparator(sortPair.first));
} else if (sortPair.second.equals("desc")) {
cacheDtoList.sort(cacheDtoComparator.getSortingComparator(sortPair.first).reversed());
}
}
boolean checkSearchParam(String param) {
return param.startsWith("search");
}
boolean checkSortParam(String param) {
return param.equals("sort");
}
}