package de.onyxbits.tradetrax.pages.edit;
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.InjectPage;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.beaneditor.Validate;
import org.apache.tapestry5.corelib.components.EventLink;
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.javascript.JavaScriptSupport;
import org.hibernate.Session;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import de.onyxbits.tradetrax.entities.Bookmark;
import de.onyxbits.tradetrax.entities.Name;
import de.onyxbits.tradetrax.entities.Stock;
import de.onyxbits.tradetrax.pages.Index;
import de.onyxbits.tradetrax.pages.tools.LabelManager;
import de.onyxbits.tradetrax.services.EventLogger;
/**
* A simple editor page for changing or deleting a {@link Name} object and
* returning to the main page afterwards.
*
* @author patrick
*
*/
@Import(library = "context:js/mousetrap.min.js")
public class NameEditor {
@Property
private long nameId;
@Property
@Validate("required,minlength=3")
private String name;
@Property
private String status;
@Component(id = "nameField")
private TextField nameField;
@Component(id = "editForm")
private Form form;
@Inject
private Session session;
@Inject
private AlertManager alertManager;
@Inject
private Messages messages;
@Inject
private EventLogger eventLogger;
@InjectPage
private Index index;
private boolean eventDelete;
@Component(id = "show")
private EventLink show;
@Inject
private JavaScriptSupport javaScriptSupport;
protected Object onShow() {
Name n = (Name) session.get(Name.class, nameId);
if (n != null) {
index.withNoFilters().withFilterName(n.getLabel());
}
return index;
}
protected void onActivate(Long nameId) {
this.nameId = nameId;
}
protected void setupRender() {
Name n = (Name) session.get(Name.class, nameId);
if (n != null) {
name = n.getLabel();
status = messages.format("status-count",
session.createCriteria(Stock.class).add(Restrictions.eq("name.id", this.nameId))
.setProjection(Projections.rowCount()).uniqueResult());
}
}
protected Long onPassivate() {
return nameId;
}
public void onValidateFromEditForm() {
if (name == null) {
form.recordError(messages.get("validate-not-empty"));
}
else {
if (name.trim().length() < name.length()) {
form.recordError(messages.get("validate-not-trimmed"));
}
}
}
public void onSelectedFromDelete() {
eventDelete = true;
}
public void onSelectedFromSave() {
eventDelete = false;
}
@CommitAfter
public Object onSuccess() {
if (eventDelete) {
doDelete();
}
else {
doSave();
}
return LabelManager.class;
}
private void doSave() {
try {
Name n = (Name) session.load(Name.class, nameId);
String s = n.getLabel();
n.setLabel(name);
session.update(n);
alertManager.alert(Duration.SINGLE, Severity.INFO, messages.format("renamed", s, name));
eventLogger.rename(s, name);
}
catch (Exception e) {
// TODO: Figure out how we got here and give the user better feedback
alertManager.alert(Duration.SINGLE, Severity.WARN, messages.format("exception", e));
}
}
private void doDelete() {
try {
Name bye = (Name) session.load(Name.class, nameId);
@SuppressWarnings("unchecked")
List<Stock> lst = session.createCriteria(Stock.class).add(Restrictions.eq("name", bye))
.list();
for (Stock s : lst) {
Bookmark bm = (Bookmark) session.get(Bookmark.class, s.getId());
if (bm != null) {
session.delete(bm);
}
s.setVariant(null);
session.delete(s);
eventLogger.deleted(s);
}
session.delete(bye);
eventLogger.deleted(bye.getLabel());
alertManager
.alert(Duration.SINGLE, Severity.INFO, messages.format("deleted", bye.getLabel()));
}
catch (Exception e) {
alertManager.alert(Duration.SINGLE, Severity.WARN, messages.format("exception", e));
}
}
public void afterRender() {
javaScriptSupport
.addScript("Mousetrap.prototype.stopCallback = function(e, element) {return false;};");
javaScriptSupport.addScript("Mousetrap.bind('esc', function() {window.history.back(); return false;});");
}
}