package de.onyxbits.tradetrax.pages.tools;
import java.sql.Timestamp;
import java.text.ChoiceFormat;
import java.text.DateFormat;
import java.util.List;
import org.apache.tapestry5.alerts.AlertManager;
import org.apache.tapestry5.alerts.Duration;
import org.apache.tapestry5.alerts.Severity;
import org.apache.tapestry5.annotations.Component;
import org.apache.tapestry5.annotations.Import;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.beaneditor.BeanModel;
import org.apache.tapestry5.beaneditor.PropertyModel;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.corelib.components.TextField;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.services.BeanModelSource;
import org.apache.tapestry5.services.javascript.JavaScriptSupport;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import de.onyxbits.tradetrax.entities.LogEntry;
import de.onyxbits.tradetrax.remix.LogEntryPagedGridDataSource;
import de.onyxbits.tradetrax.remix.PurgeType;
import de.onyxbits.tradetrax.services.SettingsStore;
/**
* Display the log table.
*
* @author patrick
*
*/
@Import(library = "context:js/mousetrap.min.js")
public class LedgerLog {
private static final long DAY = 1000l * 60l * 60l * 24l;
@Property
private LogEntry logEntry;
@Property
private LogEntry row;
@Property
private PurgeType purgeType;
@Inject
private Session session;
@Inject
private BeanModelSource logSource;
@Inject
private SettingsStore settingsStore;
@Inject
private Messages messages;
@Property
@Persist
private String filter;
@Property
private boolean showPurgeForm;
@Component(id = "filter")
private TextField filterField;
@Component(id = "filterForm")
private Form filterForm;
@Component(id = "purgeForm")
private Form purgeForm;
@Inject
private JavaScriptSupport javaScriptSupport;
@Inject
private AlertManager alertManager;
@Property
private LogEntryPagedGridDataSource logs;
private DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
DateFormat.MEDIUM);
public String getFullTime() {
return dateFormat.format(row.getTimestamp());
}
public BeanModel<LogEntry> getLogModel() {
BeanModel<LogEntry> model = logSource.createDisplayModel(LogEntry.class, messages);
List<String> lst = model.getPropertyNames();
for (String s : lst) {
try {
PropertyModel nameColumn = model.getById(s);
nameColumn.sortable(false);
}
catch (Exception e) {
}
}
return model;
}
public LedgerLog withFilter(String filter) {
this.filter = filter;
return this;
}
public void setupRender() {
logs = new LogEntryPagedGridDataSource(session, filter);
showPurgeForm = logs.getAvailableRows() > 0;
}
public void afterRender() {
javaScriptSupport
.addScript("Mousetrap.prototype.stopCallback = function(e, element) {return false;};");
javaScriptSupport
.addScript("Mousetrap.bind('esc', function() {window.history.back(); return false;});");
}
@CommitAfter
public void onSuccessFromPurgeForm() {
if (purgeType == null) {
alertManager.alert(Duration.SINGLE, Severity.INFO, messages.get("feedback.0"));
return;
}
Criteria crit = session.createCriteria(LogEntry.class);
switch (purgeType) {
case SHOWING: {
if (filter != null) {
crit.add(Restrictions.ilike("details", "%" + filter + "%"));
}
break;
}
case YEAR: {
Timestamp ts = new Timestamp(System.currentTimeMillis() - DAY * 365l);
crit.add(Restrictions.lt("timestamp", ts)).list();
break;
}
case MONTH: {
Timestamp ts = new Timestamp(System.currentTimeMillis() - DAY * 30l);
crit.add(Restrictions.lt("timestamp", ts)).list();
break;
}
case WEEK: {
Timestamp ts = new Timestamp(System.currentTimeMillis() - DAY * 7l);
crit.add(Restrictions.lt("timestamp", ts)).list();
break;
}
}
@SuppressWarnings("unchecked")
List<LogEntry> lst = crit.list();
if (lst.size() > 0) {
for (LogEntry e : lst) {
session.delete(e);
}
}
String[] s = {
messages.get("feedback.0"),
messages.get("feedback.1"),
messages.getFormatter("feedback.x").format(lst.size()) };
double[] limits = { 0, 1, 2 };
alertManager.alert(Duration.SINGLE, Severity.INFO,
new ChoiceFormat(limits, s).format(lst.size()));
}
}