package fr.jcgay.notification;
import fr.jcgay.notification.configuration.ChosenNotifiers;
import fr.jcgay.notification.configuration.OperatingSystem;
import fr.jcgay.notification.notifier.DoNothingNotifier;
import fr.jcgay.notification.notifier.additional.AdditionalNotifier;
import fr.jcgay.notification.notifier.anybar.AnyBarConfiguration;
import fr.jcgay.notification.notifier.anybar.AnyBarNotifier;
import fr.jcgay.notification.notifier.burnttoast.BurntToastNotifier;
import fr.jcgay.notification.notifier.burnttoast.BurntToastNotifierConfiguration;
import fr.jcgay.notification.notifier.executor.RuntimeExecutor;
import fr.jcgay.notification.notifier.growl.GrowlConfiguration;
import fr.jcgay.notification.notifier.growl.GrowlNotifier;
import fr.jcgay.notification.notifier.kdialog.KdialogConfiguration;
import fr.jcgay.notification.notifier.kdialog.KdialogNotifier;
import fr.jcgay.notification.notifier.notificationcenter.SimpleNotificationCenterNotifier;
import fr.jcgay.notification.notifier.notificationcenter.TerminalNotifier;
import fr.jcgay.notification.notifier.notificationcenter.TerminalNotifierConfiguration;
import fr.jcgay.notification.notifier.notifu.NotifuConfiguration;
import fr.jcgay.notification.notifier.notifu.NotifuNotifier;
import fr.jcgay.notification.notifier.notify.NotifyConfiguration;
import fr.jcgay.notification.notifier.notify.NotifyNotifier;
import fr.jcgay.notification.notifier.notifysend.NotifySendConfiguration;
import fr.jcgay.notification.notifier.notifysend.NotifySendNotifier;
import fr.jcgay.notification.notifier.pushbullet.PushbulletConfiguration;
import fr.jcgay.notification.notifier.pushbullet.PushbulletNotifier;
import fr.jcgay.notification.notifier.slack.SlackConfiguration;
import fr.jcgay.notification.notifier.slack.SlackNotifier;
import fr.jcgay.notification.notifier.snarl.SnarlConfiguration;
import fr.jcgay.notification.notifier.snarl.SnarlNotifier;
import fr.jcgay.notification.notifier.systemtray.SystemTrayNotifier;
import fr.jcgay.notification.notifier.toaster.ToasterConfiguration;
import fr.jcgay.notification.notifier.toaster.ToasterNotifier;
import java.util.LinkedHashSet;
import java.util.Properties;
import java.util.Set;
import static fr.jcgay.notification.notifier.growl.GntpSlf4jListener.DEBUG;
import static fr.jcgay.notification.notifier.growl.GntpSlf4jListener.ERROR;
import static java.util.Collections.unmodifiableSet;
class NotifierProvider {
private static final ChosenNotifiers GROWL = ChosenNotifiers.from("growl");
private static final ChosenNotifiers NOTIFICATION_CENTER = ChosenNotifiers.from("notificationcenter");
private static final ChosenNotifiers NOTIFY_SEND = ChosenNotifiers.from("notifysend");
private static final ChosenNotifiers PUSHBULLET = ChosenNotifiers.from("pushbullet");
private static final ChosenNotifiers SNARL = ChosenNotifiers.from("snarl");
private static final ChosenNotifiers SYSTEM_TRAY = ChosenNotifiers.from("systemtray");
private static final ChosenNotifiers NOTIFU = ChosenNotifiers.from("notifu");
private static final ChosenNotifiers KDIALOG = ChosenNotifiers.from("kdialog");
private static final ChosenNotifiers ANYBAR = ChosenNotifiers.from("anybar");
private static final ChosenNotifiers SIMPLE_NOTIFICATION_CENTER = ChosenNotifiers.from("simplenc");
private static final ChosenNotifiers TOASTER = ChosenNotifiers.from("toaster");
private static final ChosenNotifiers NOTIFY = ChosenNotifiers.from("notify");
private static final ChosenNotifiers BURNT_TOAST = ChosenNotifiers.from("burnttoast");
private static final ChosenNotifiers SLACK = ChosenNotifiers.from("slack");
private final RuntimeExecutor executor = new RuntimeExecutor();
private final OperatingSystem os;
public NotifierProvider(OperatingSystem os) {
this.os = os;
}
public DiscoverableNotifier byName(ChosenNotifiers notifier, Properties properties, Application application) {
if (!notifier.secondary().isEmpty()) {
LinkedHashSet<DiscoverableNotifier> secondary = new LinkedHashSet<DiscoverableNotifier>(notifier.secondary().size());
for (String secondaryNotifier : notifier.secondary()) {
secondary.add(byName(ChosenNotifiers.from(secondaryNotifier), properties, application));
}
return new AdditionalNotifier(
byName(ChosenNotifiers.from(notifier.primary()), properties, application),
unmodifiableSet(secondary)
);
}
if (GROWL.equals(notifier)) {
return new GrowlNotifier(application, GrowlConfiguration.create(properties), ERROR);
}
if (NOTIFICATION_CENTER.equals(notifier)) {
return new TerminalNotifier(application, TerminalNotifierConfiguration.create(properties), executor);
}
if (NOTIFY_SEND.equals(notifier)) {
return new NotifySendNotifier(application, NotifySendConfiguration.create(properties), executor);
}
if (PUSHBULLET.equals(notifier)) {
return new PushbulletNotifier(application, PushbulletConfiguration.create(properties));
}
if (SNARL.equals(notifier)) {
return new SnarlNotifier(application, SnarlConfiguration.create(properties));
}
if (SYSTEM_TRAY.equals(notifier)) {
return new SystemTrayNotifier(application);
}
if (NOTIFU.equals(notifier)) {
return new NotifuNotifier(application, NotifuConfiguration.create(properties), executor);
}
if (KDIALOG.equals(notifier)) {
return new KdialogNotifier(application, KdialogConfiguration.create(properties), executor);
}
if (ANYBAR.equals(notifier)) {
return AnyBarNotifier.create(application, AnyBarConfiguration.create(properties));
}
if (SIMPLE_NOTIFICATION_CENTER.equals(notifier)) {
return new SimpleNotificationCenterNotifier(TerminalNotifierConfiguration.create(properties), executor);
}
if (TOASTER.equals(notifier)) {
return new ToasterNotifier(ToasterConfiguration.create(properties), executor);
}
if (NOTIFY.equals(notifier)) {
return new NotifyNotifier(application, NotifyConfiguration.create(properties));
}
if (BURNT_TOAST.equals(notifier)) {
return new BurntToastNotifier(application, BurntToastNotifierConfiguration.create(properties));
}
if (SLACK.equals(notifier)) {
return new SlackNotifier(application, SlackConfiguration.create(properties));
}
return DoNothingNotifier.doNothing();
}
public Set<DiscoverableNotifier> available(Properties configuration, Application application) {
if (os.isMac()) {
Set<DiscoverableNotifier> macNotifiers = new LinkedHashSet<DiscoverableNotifier>();
macNotifiers.add(new GrowlNotifier(application, GrowlConfiguration.create(configuration), DEBUG));
macNotifiers.add(byName(NOTIFICATION_CENTER, configuration, application));
macNotifiers.add(byName(SYSTEM_TRAY, configuration, application));
return unmodifiableSet(macNotifiers);
}
if (os.isWindows()) {
Set<DiscoverableNotifier> winNotifiers = new LinkedHashSet<DiscoverableNotifier>();
winNotifiers.add(byName(SNARL, configuration, application));
winNotifiers.add(new GrowlNotifier(application, GrowlConfiguration.create(configuration), DEBUG));
winNotifiers.add(byName(TOASTER, configuration, application));
winNotifiers.add(byName(BURNT_TOAST, configuration, application));
winNotifiers.add(byName(SYSTEM_TRAY, configuration, application));
return unmodifiableSet(winNotifiers);
}
Set<DiscoverableNotifier> linuxNotifiers = new LinkedHashSet<DiscoverableNotifier>();
linuxNotifiers.add(byName(KDIALOG, configuration, application));
linuxNotifiers.add(byName(NOTIFY_SEND, configuration, application));
linuxNotifiers.add(byName(SYSTEM_TRAY, configuration, application));
return unmodifiableSet(linuxNotifiers);
}
}