package de.onyxbits.tradetrax.pages; import java.sql.Timestamp; import java.text.DateFormat; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Vector; 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.BeanModel; import org.apache.tapestry5.corelib.components.EventLink; 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.Session; import de.onyxbits.tradetrax.entities.Stock; import de.onyxbits.tradetrax.remix.TalliedStock; import de.onyxbits.tradetrax.remix.TalliedStockPagedGridDataSource; import de.onyxbits.tradetrax.services.SettingsStore; @Import(library = "context:js/mousetrap.min.js") public class Summary { @Property private long totalInvestment; @Property private long totalProfit; @Property private long expectedProfit; @Inject private Session session; @Inject private Messages messages; @Inject private SettingsStore settingsStore; @Property private List<TalliedStock> usage; @Inject private BeanModelSource tallySource; @InjectPage private Index index; @Property private TalliedStock row; @Component(id = "show") private EventLink show; @Property private int assetsOnHand; @Property private int itemsOnHand; private HashMap<String, TalliedStock> tallied; @Inject private JavaScriptSupport javaScriptSupport; public BeanModel<Object> getTallyModel() { BeanModel<Object> model = tallySource.createDisplayModel(Object.class, messages); model.addEmpty(TalliedStockPagedGridDataSource.NAME).sortable(true); model.addEmpty(TalliedStockPagedGridDataSource.AMOUNT).sortable(true); model.addEmpty(TalliedStockPagedGridDataSource.TOTALINVESTMENT).sortable(true); model.addEmpty(TalliedStockPagedGridDataSource.TOTALPROFIT).sortable(true); return model; } public TalliedStockPagedGridDataSource getData() { return new TalliedStockPagedGridDataSource(usage); } protected Object onShow(String name) { if (name != null) { index.withNoFilters().withFilterName(name); } return index; } public String getCreated() { try { DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); return (df.format(Timestamp.valueOf(settingsStore.get(SettingsStore.CREATED, null)))); } catch (Exception e) { } return ""; } private TalliedStock getCounterFor(Stock s) { String tmp = s.getName().getLabel(); TalliedStock ret = tallied.get(tmp); if (ret == null) { ret = new TalliedStock(); ret.name = tmp; tallied.put(tmp, ret); } return ret; } public void setupRender() { // TODO: This is a rather heavy piece of code. It may be necessary to run it // in a background service and cache the results. usage = new Vector<TalliedStock>(); tallied = new HashMap<String, TalliedStock>(); @SuppressWarnings("unchecked") List<Stock> lst = session.createCriteria(Stock.class).list(); for (Stock stock : lst) { if (stock.getAcquired() != null) { TalliedStock ts = getCounterFor(stock); long buyPrice = stock.getBuyPrice(); long sellPrice = stock.getSellPrice(); int unitCount = stock.getUnitCount(); if (stock.getLiquidated() == null) { long inv = buyPrice * unitCount; totalInvestment += inv; assetsOnHand++; itemsOnHand += unitCount; if (sellPrice != 0) { expectedProfit += (sellPrice - buyPrice) * unitCount; } ts.assetCount++; ts.totalUnits += unitCount; ts.totalInvestment += inv; } else { long pro = (sellPrice - buyPrice) * unitCount; totalProfit += pro; ts.totalProfit += pro; } } } Iterator<String> it = tallied.keySet().iterator(); while (it.hasNext()) { TalliedStock ts = tallied.get(it.next()); usage.add(ts); } Collections.sort(usage); } public void afterRender() { javaScriptSupport .addScript("Mousetrap.prototype.stopCallback = function(e, element) {return false;};"); javaScriptSupport.addScript("Mousetrap.bind('esc', function() {window.history.back(); return false;});"); } }