package com.bloatit.mail; import java.util.ArrayList; import java.util.Date; import java.util.Locale; import com.bloatit.framework.exceptions.highlevel.BadProgrammerException; import com.bloatit.framework.utils.i18n.Localizator; import com.bloatit.framework.webprocessor.components.HtmlDiv; import com.bloatit.framework.webprocessor.components.HtmlImage; import com.bloatit.framework.webprocessor.components.HtmlLink; import com.bloatit.framework.webprocessor.components.PlaceHolderElement; import com.bloatit.framework.webprocessor.components.meta.HtmlBranch; import com.bloatit.framework.webprocessor.components.meta.HtmlMixedText; import com.bloatit.framework.webprocessor.context.Context; import com.bloatit.framework.webprocessor.url.UrlString; import com.bloatit.model.Bug; import com.bloatit.model.Event.BugCommentEvent; import com.bloatit.model.Event.BugEvent; import com.bloatit.model.Event.ContributionEvent; import com.bloatit.model.Event.EventVisitor; import com.bloatit.model.Event.FeatureCommentEvent; import com.bloatit.model.Event.FeatureEvent; import com.bloatit.model.Event.OfferEvent; import com.bloatit.model.Event.ReleaseEvent; import com.bloatit.model.Feature; import com.bloatit.web.WebConfiguration; import com.bloatit.web.components.HtmlAuthorLink; import com.bloatit.web.components.MoneyDisplayComponent; import com.bloatit.web.linkable.features.FeatureTabPane.FeatureTabKey; import com.bloatit.web.url.BugPageUrl; import com.bloatit.web.url.FeaturePageUrl; import com.bloatit.web.url.ReleasePageUrl; public abstract class GenericEventVisitor implements EventVisitor<String> { private static final HtmlImage LOGO_FEATURE = new HtmlImage(new UrlString(WebConfiguration.getImgIdeaTiny()).externalUrlString()); private static final HtmlImage LOGO_CONTRIBUTION = new HtmlImage(new UrlString(WebConfiguration.getImgContributionTiny()).externalUrlString()); private static final HtmlImage LOGO_OFFER = new HtmlImage(new UrlString(WebConfiguration.getImgOfferTiny()).externalUrlString()); private static final HtmlImage LOGO_COMMENT = new HtmlImage(new UrlString(WebConfiguration.getImgCommentTiny()).externalUrlString()); private static final HtmlImage LOGO_RELEASE = new HtmlImage(new UrlString(WebConfiguration.getImgReleaseTiny()).externalUrlString()); private static final HtmlImage LOGO_BUG = new HtmlImage(new UrlString(WebConfiguration.getImgBugTiny()).externalUrlString()); protected final Locale locale; private final Localizator l; public GenericEventVisitor(final Localizator localizator) { this.locale = localizator.getLocale(); this.l = localizator; } public class Entries extends ArrayList<HtmlEntry> { private static final long serialVersionUID = 4240985577107981629L; } protected abstract void addFeatureEntry(Feature f, HtmlEntry b, Date date); protected abstract void addBugEntry(Bug f, HtmlEntry b, Date date); @Override public String visit(final FeatureEvent event) { HtmlEntry entry; final FeaturePageUrl featureUrl = new FeaturePageUrl(event.getFeature(), FeatureTabKey.description); final HtmlBranch featureLink = new HtmlLink(featureUrl.externalUrlString(locale)); switch (event.getType()) { case CREATE_FEATURE: entry = new HtmlEntry(event.getDate(), LOGO_FEATURE, new HtmlMixedText(l.tr("<0::+feature> created by <1:@thomas:>"), featureLink, new HtmlAuthorLink(event.getFeature()))); break; case IN_DEVELOPING_STATE: entry = new HtmlEntry(event.getDate(), LOGO_FEATURE, new HtmlMixedText(l.tr("the <0::+feature> is now in development"), featureLink)); break; case DISCARDED: entry = new HtmlEntry(event.getDate(), LOGO_FEATURE, new HtmlMixedText(l.tr("the <0::+feature> has been discarded"), featureLink)); break; case FINICHED: entry = new HtmlEntry(event.getDate(), LOGO_FEATURE, new HtmlMixedText(l.tr("the <0::+feature> is now successful"), featureLink)); break; default: throw new BadProgrammerException("You should have managed all the cases."); } addFeatureEntry(event.getFeature(), entry, event.getDate()); return null; } @Override public String visit(final BugEvent event) { HtmlEntry entry; final BugPageUrl bugUrl = new BugPageUrl(event.getBug()); switch (event.getType()) { case ADD_BUG: final HtmlLink bugLink = new HtmlLink(bugUrl.externalUrlString(locale)); bugLink.setCssClass("bug_link"); String criticity = ""; switch (event.getBug().getErrorLevel()) { case FATAL: criticity = Context.tr("critical"); break; case MAJOR: criticity = Context.tr("major"); break; case MINOR: criticity = Context.tr("minor"); break; default: criticity = Context.tr("strange"); break; } entry = new HtmlEntry(event.getDate(), LOGO_BUG, new PlaceHolderElement().add(new HtmlMixedText(Context.tr("new <0::+bug> ({0})", criticity), bugLink))); addFeatureEntry(event.getFeature(), entry, event.getDate()); break; case BUG_CHANGE_LEVEL: HtmlBranch bugLn = new HtmlLink(bugUrl.externalUrlString(locale)); switch (event.getBug().getErrorLevel()) { case FATAL: entry = new HtmlEntry(event.getDate(), LOGO_BUG, new HtmlMixedText(l.tr("the <0::+bug> level is now to 'critical'"), bugLn)); break; case MAJOR: entry = new HtmlEntry(event.getDate(), LOGO_BUG, new HtmlMixedText(l.tr("the <0::+bug> level is now to 'major'"), bugLn)); break; case MINOR: entry = new HtmlEntry(event.getDate(), LOGO_BUG, new HtmlMixedText(l.tr("the <0::+bug> level is now 'minor'"), bugLn)); break; default: entry = new HtmlEntry(event.getDate(), LOGO_BUG, new HtmlMixedText(l.tr("the <0::+bug> is now in a new state"), bugLn)); break; } addBugEntry(event.getBug(), entry, event.getDate()); break; case BUG_SET_RESOLVED: bugLn = new HtmlLink(bugUrl.externalUrlString(locale)); entry = new HtmlEntry(event.getDate(), LOGO_FEATURE, new HtmlMixedText(l.tr("the <0::+bug> is now resolved"), bugLn)); addBugEntry(event.getBug(), entry, event.getDate()); break; case BUG_SET_DEVELOPING: bugLn = new HtmlLink(bugUrl.externalUrlString(locale)); entry = new HtmlEntry(event.getDate(), LOGO_FEATURE, new HtmlMixedText(l.tr("the <0::+bug> is being developed"), bugLn)); addBugEntry(event.getBug(), entry, event.getDate()); break; default: throw new BadProgrammerException("You should have managed all the cases."); } return null; } @Override public String visit(final BugCommentEvent event) { final HtmlEntry entry = new HtmlEntry(event.getDate(), LOGO_FEATURE, new PlaceHolderElement().addText(l.tr("1 new comment by ")) .add(new HtmlAuthorLink(event.getComment()))); addBugEntry(event.getBug(), entry, event.getDate()); return null; } @Override public String visit(final ContributionEvent event) { HtmlEntry entry; switch (event.getType()) { case ADD_CONTRIBUTION: entry = new HtmlEntry(event.getDate(), LOGO_CONTRIBUTION, new MoneyDisplayComponent(event.getContribution().getAmount(), l).addText(l.tr(" financed by ")) .add(new HtmlAuthorLink(event.getContribution()))); break; case REMOVE_CONTRIBUTION: entry = new HtmlEntry(event.getDate(), LOGO_CONTRIBUTION, new HtmlDiv().addText("contribution removed by") .add(new HtmlAuthorLink(event.getContribution()))); break; default: throw new BadProgrammerException("You should have managed all the cases."); } addFeatureEntry(event.getFeature(), entry, event.getDate()); return null; } @Override public String visit(final FeatureCommentEvent event) { final HtmlEntry entry = new HtmlEntry(event.getDate(), LOGO_COMMENT, new PlaceHolderElement().addText(l.tr("1 new comment by ")) .add(new HtmlAuthorLink(event.getComment()))); addFeatureEntry(event.getFeature(), entry, event.getDate()); return null; } @Override public String visit(final OfferEvent event) { HtmlEntry entry; final FeaturePageUrl featureUrl = new FeaturePageUrl(event.getFeature(), FeatureTabKey.offers); final HtmlBranch offerLn = new HtmlLink(featureUrl.externalUrlString(locale)); switch (event.getType()) { case ADD_OFFER: entry = new HtmlEntry(event.getDate(), LOGO_OFFER, new HtmlMixedText(l.tr("<0::+offer> created by <1:@thomas:>"), offerLn, new HtmlAuthorLink(event.getOffer()))); break; case REMOVE_OFFER: entry = new HtmlEntry(event.getDate(), LOGO_OFFER, new HtmlMixedText(l.tr("the <0::+offer> by <1:@thomas:> has been removed"), offerLn, new HtmlAuthorLink(event.getOffer()))); break; case ADD_SELECTED_OFFER: entry = new HtmlEntry(event.getDate(), LOGO_OFFER, new HtmlMixedText(l.tr("the <0::+offer> by <1:@thomas:> is selected"), offerLn, new HtmlAuthorLink(event.getOffer()))); break; case CHANGE_SELECTED_OFFER: entry = new HtmlEntry(event.getDate(), LOGO_OFFER, new HtmlMixedText(l.tr("the <0::+offer> by <1:@thomas:> is selected"), offerLn, new HtmlAuthorLink(event.getOffer()))); break; case REMOVE_SELECTED_OFFER: entry = new HtmlEntry(event.getDate(), LOGO_OFFER, "no offer selected"); break; default: throw new BadProgrammerException("You should have managed all the cases."); } addFeatureEntry(event.getFeature(), entry, event.getDate()); return null; } @Override public String visit(final ReleaseEvent event) { final ReleasePageUrl url = new ReleasePageUrl(event.getRelease()); final String urlString = url.externalUrlString(locale); final HtmlEntry entry = new HtmlEntry(event.getDate(), LOGO_RELEASE, new HtmlMixedText(l.tr("new <0::+release> ({0})", event.getRelease() .getVersion()), new HtmlLink(urlString))); addFeatureEntry(event.getFeature(), entry, event.getDate()); return null; } }