package de.onyxbits.tradetrax.pages.tools; 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.Property; import org.apache.tapestry5.corelib.components.Checkbox; import org.apache.tapestry5.corelib.components.Form; import org.apache.tapestry5.hibernate.annotations.CommitAfter; import org.apache.tapestry5.ioc.Messages; import org.apache.tapestry5.ioc.annotations.Inject; import org.hibernate.Session; import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import de.onyxbits.tradetrax.entities.Name; import de.onyxbits.tradetrax.entities.Stock; import de.onyxbits.tradetrax.entities.Variant; import de.onyxbits.tradetrax.remix.LabelActions; import de.onyxbits.tradetrax.services.EventLogger; /** * An index of all labels in the system with the option to make them canonical * * @author patrick * */ public class LabelManager { @Inject private Session session; @Inject private AlertManager alertManager; @Inject private Messages messages; @Inject private EventLogger eventLogger; @Property private Name name; @Property private Variant variant; @Property private LabelActions actions; @Property private boolean applyToNames; @Property private boolean applyToVariants; @Component(id = "applyToNames") private Checkbox applyToNamesField; @Component(id = "applyToVariants") private Checkbox applyToVariantsField; @Component(id = "actionForm") private Form actionForm; @Property private int affected; @SuppressWarnings("unchecked") public List<Name> getNames() { return session.createCriteria(Name.class).addOrder(Order.asc("label")).list(); } @SuppressWarnings("unchecked") public List<Variant> getVariants() { return session.createCriteria(Variant.class).addOrder(Order.asc("label")).list(); } public void setupRender() { affected=0; } @CommitAfter public LabelManager onSuccessFromActionForm() { if (actions == LabelActions.TRIM) { trimLabels(); alertManager.alert(Duration.SINGLE,Severity.INFO,messages.format("deleted",affected)); } else { sanitizeLabels(); alertManager.alert(Duration.SINGLE,Severity.INFO,messages.format("updated",affected)); } return this; } @SuppressWarnings("unchecked") private void sanitizeLabels() { if (applyToNames) { List<Name> lst = session.createCriteria(Name.class).list(); for (Name n : lst) { switch (actions) { case UPPERCASE: { String s = n.getLabel().toUpperCase().trim(); if (!s.equals(n.getLabel())) { eventLogger.rename(n.getLabel(), s); n.setLabel(s); affected++; } break; } case LOWERCASE: { String s = n.getLabel().toLowerCase().trim(); if (!s.equals(n.getLabel())) { eventLogger.rename(n.getLabel(), s); n.setLabel(s); affected++; } break; } case CAPITALIZE: { String s = n.getLabel().toLowerCase().trim(); if (s.length() >= 1) { s = Character.toUpperCase(s.charAt(0)) + s.substring(1); } if (!s.equals(n.getLabel())) { eventLogger.rename(n.getLabel(), s); n.setLabel(s); affected++; } } default: break; } session.update(n); } } if (applyToVariants) { List<Variant> lst = session.createCriteria(Variant.class).list(); for (Variant v : lst) { switch (actions) { case UPPERCASE: { String s = v.getLabel().toUpperCase().trim(); if (!s.equals(v.getLabel())) { eventLogger.rename(v.getLabel(), s); v.setLabel(s); affected++; } break; } case LOWERCASE: { String s = v.getLabel().toLowerCase().trim(); if (!s.equals(v.getLabel())) { eventLogger.rename(v.getLabel(), s); v.setLabel(s); affected++; } break; } case CAPITALIZE: { String s = v.getLabel().toLowerCase().trim(); if (s.length() >= 1) { s = Character.toUpperCase(s.charAt(0)) + s.substring(1); } if (!s.equals(v.getLabel())) { eventLogger.rename(v.getLabel(), s); v.setLabel(s); affected++; } } default: break; } session.update(v); } } } @SuppressWarnings("unchecked") private void trimLabels() { // Yes, this is super inefficient, but these tables are not that big if (applyToNames) { List<Name> lst = session.createCriteria(Name.class).list(); for (Name n : lst) { long count = (Long) session.createCriteria(Stock.class) .add(Restrictions.eq("name.id", n.getId())).setProjection(Projections.rowCount()) .uniqueResult(); if (count < 1) { session.delete(n); eventLogger.deleted(n.getLabel()); affected++; } } } if (applyToVariants) { List<Variant> lst = session.createCriteria(Variant.class).list(); for (Variant v : lst) { long count = (Long) session.createCriteria(Stock.class) .add(Restrictions.eq("variant.id", v.getId())).setProjection(Projections.rowCount()) .uniqueResult(); if (count < 1) { session.delete(v); eventLogger.deleted(v.getLabel()); affected++; } } } } }