DatabaseDeleteService.java
package sk.iway.iwcm.components.memory_cleanup.database;
import org.springframework.stereotype.Service;
import sk.iway.iwcm.Constants;
import sk.iway.iwcm.LabelValueDetails;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.components.dataDeleting.DataDeletingManager;
import sk.iway.iwcm.i18n.Prop;
import sk.iway.iwcm.utils.Pair;
import java.util.*;
/**
* Trieda sluziaca na vykonavanie funkcionalit mazania pamate.
*
* @author pgajdos
* @since 24.07.2020
*/
@Service
public class DatabaseDeleteService {
public DatabaseDeleteService() {
//konstruktor
}
private DatabaseDeleteBean buildStatBean(Prop prop, String key, String tableName, boolean tablePartitioning) {
return DatabaseDeleteBean.builder().name(prop.getText(key)).tableName(tableName).groupId(1).tablePartitioning(tablePartitioning).build();
}
private DatabaseDeleteBean buildAuditBean(Prop prop, int typeId) {
return DatabaseDeleteBean.builder().name(prop.getText("components.adminlog."+typeId)).tableName("audit").groupId(5).typeId(typeId).build();
}
/**
* Vrati zoznam vsetkych moznosti mazania dat, ako pocet na zmazanie je 0, realne nevykona nacitanie poctu zaznamov z DB
* @param prop
* @return
*/
public List<DatabaseDeleteBean> getAllItems(Prop prop) {
List<DatabaseDeleteBean> items = new ArrayList<>();
//statistika
items.add(buildStatBean(prop, "stat_menu.searchEngines", "stat_searchengine", true));
items.add(buildStatBean(prop, "components.data.deleting.stats.userlogon", "stat_userlogon", false));
items.add(buildStatBean(prop, "components.data.deleting.stats.referers", "stat_from", true));
items.add(buildStatBean(prop, "stat_menu.invalidPages", "stat_error", true));
items.add(buildStatBean(prop, "components.data.deleting.stats.view", "stat_views", true));
items.add(buildStatBean(prop, "components.stat.heat_map.title", "stat_clicks", true));
items.add(buildStatBean(prop, "components.memory_cleanup.banner_clicks", "banner_stat_clicks", false));
items.add(buildStatBean(prop, "components.memory_cleanup.banner_views", "banner_stat_views", false));
items.add(buildStatBean(prop, "components.memory_cleanup.banner_day_views", "banner_stat_views_day", false));
items.add(DatabaseDeleteBean.builder().name(prop.getText("components.data.deleting.emails")).groupId(2).tableName("emails").build());
items.add(DatabaseDeleteBean.builder().name(prop.getText("components.data.deleting.documentHistory")).groupId(3).tableName("documents_history").build());
items.add(DatabaseDeleteBean.builder().name(prop.getText("components.data.deleting.monitoring")).groupId(4).tableName("monitoring").build());
//audit
items.add(buildAuditBean(prop, 100)); //SE_SITEMAP
items.add(buildAuditBean(prop, 120)); //FORMMAIL
items.add(buildAuditBean(prop, 130)); //SENDMAIL
items.add(buildAuditBean(prop, 140)); //JSPERROR
items.add(buildAuditBean(prop, 150)); //SQLERROR
items.add(buildAuditBean(prop, 170)); //RUNTIME_ERROR
items.add(buildAuditBean(prop, 230)); //CRON
items.add(buildAuditBean(prop, 99999)); //CLIENT_SPECIFIC
//nastav idecka
int counter = 1;
for (DatabaseDeleteBean b : items) {
b.setId(Long.valueOf(counter));
counter++;
}
return items;
}
/**
* nazvy skupiny a jeho id oznacenia. Vyuzitie pri selectoch v datatabulke.
*
* @return List obsahujuci meno a id skupiny zaznamov.
*/
List<LabelValueDetails> getGroupNames(Prop prop) {
return Arrays.asList(
new LabelValueDetails(prop.getText("components.data.deleting.stats"), "1"),
new LabelValueDetails(prop.getText("components.data.deleting.emails"), "2"),
new LabelValueDetails(prop.getText("components.data.deleting.documentHistory"), "3"),
new LabelValueDetails(prop.getText("components.data.deleting.monitoring"), "4"),
new LabelValueDetails(prop.getText("components.data.deleting.audit.menu"), "5"));
}
/**
* vrati zoznam moznosti mazania vratane poctu zaznamov na zmazanie za zvolene obdobie
* @param from - datum zaciatku mazania dat
* @param to - datum konca mazania dat
* @param prop
* @return
*/
List<DatabaseDeleteBean> getMemoryCleanupEntities(Date from, Date to, Prop prop) {
List<DatabaseDeleteBean> items = getAllItems(prop);
if (from != null && to != null && to.getTime()>from.getTime()) {
Pair<Date, Date> datePair = new Pair<>(from, to);
for (DatabaseDeleteBean entity : items) {
entity.setFrom(datePair.first);
entity.setTo(datePair.second);
if (entity.isTablePartitioning() && Constants.getBoolean("statEnableTablePartitioning")) {
entity.setNumberOfEntriesToDelete(DataDeletingManager.checkTablePartitioning(entity.getTableName(), datePair.first, datePair.second));
} else if (entity.getTypeId()<1) {
if ("documents_history".equals(entity.getTableName())) {
entity.setNumberOfEntriesToDelete(DataDeletingManager.checkData(entity.getTableName(), datePair.first, datePair.second, true, -1));
} else {
entity.setNumberOfEntriesToDelete(DataDeletingManager.checkData(entity.getTableName(), datePair.first, datePair.second, false, -1));
}
} else if ("audit".equals(entity.getTableName())) {
entity.setNumberOfEntriesToDelete(DataDeletingManager.checkData(entity.getTableName(), datePair.first, datePair.second, false, entity.getTypeId()));
}
}
}
return items;
}
/**
* Metoda sluzi na zmazanie dat. Nemazu sa samotne MemoryCleanupDateDependentEntity, tie predstavuju len skupiny
* pod ktorymi su ulozene realne zaznamy na mazanie.
*
* @param entity objekt, ktoreho data sa maju zmazat
* @return boolean pre potvrdenie mazania.
*/
boolean delete(DatabaseDeleteBean entity) {
try {
Pair<Date, Date> datePair = new Pair<>(entity.getFrom(), entity.getTo());
if (entity.isTablePartitioning() && Constants.getBoolean("statEnableTablePartitioning")) {
DataDeletingManager.deleteTablePartitioning(entity.getTableName(), datePair.first, datePair.second, true);
} else if (entity.getTypeId()<1) {
if ("documents_history".equals(entity.getTableName())) {
DataDeletingManager.deleteData(entity.getTableName(), datePair.first, datePair.second, true, -1, true);
} else {
DataDeletingManager.deleteData(entity.getTableName(), datePair.first, datePair.second, false, -1, true);
}
} else if ("audit".equals(entity.getTableName())) {
DataDeletingManager.deleteData(entity.getTableName(), datePair.first, datePair.second, false, entity.getTypeId(), true);
}
} catch (Exception e) {
Logger.error(DatabaseDeleteService.class, "Error deleting entries for " + entity.getTableName() + ". Error message is: " + e.getMessage() + ".");
return false;
}
return true;
}
}