// Path: send-notification/src/main/java/fr/jcgay/notification/Application.java
// @AutoValue
// public abstract class Application {
// 
//     /**
//      * Uniquely identify an application. <br>
//      * In order to ensure your application's signature is unique, the recommendation is to follow the Internet Media
//      * type (also known as MIME content type) format as defined in IETF <a href="http://tools.ietf.org/html/rfc2046">RFC 2046</a>
//      * which contains the application vendor's name - specifically: {@code application/x-vnd-some_vendor.some_app}. <br>
//      * The signature must not contain spaces. <br>
//      * Some examples of acceptable signatures:
//      * <ul>
//      *     <li>{@code application/x-vnd-acme.hello_world}</li>
//      *     <li>{@code application/x-vnd-fullphat.snaRSS}</li>
//      * </ul>
//      *
//      * @return unique identifier.
//      */
//     public abstract String id();
// 
//     /**
//      * A name that will identify the application for the user. <br>
//      * Examples:
//      * <ul>
//      *     <li>Maven</li>
//      *     <li>Gradle</li>
//      * </ul>
//      *
//      * @return application name.
//      */
//     public abstract String name();
// 
//     /**
//      * A timeout to wait for before cancelling application registration or notification sending.
//      *
//      * @return timeout in milliseconds, or {@code -1} if not specified.
//      */
//     public abstract long timeout();
// 
//     /**
//      * The application icon.
//      *
//      * @return application icon.
//      */
//     public abstract Icon icon();
// 
//     Application() {
//         // prevent external subclasses
//     }
// 
//     public static Builder builder() {
//         return new AutoValue_Application.Builder()
//             .timeout(-1);
//     }
// 
//     public static Builder builder(String id, String name, Icon icon) {
//         return builder()
//             .id(id)
//             .name(name)
//             .icon(icon);
//     }
// 
//     @AutoValue.Builder
//     public interface Builder {
//         Builder id(String id);
//         Builder name(String name);
//         Builder icon(Icon icon);
//         Builder timeout(long timeout);
//         Application build();
//     }
// }
// 
// Path: send-notification/src/main/java/fr/jcgay/notification/DiscoverableNotifier.java
// public interface DiscoverableNotifier extends Notifier {
// 
//     /**
//      * Initialize before usage. <br>
//      * This method must be called before trying to send a notification. <br>
//      * Calling {@code init()} multiple time should not fail. <br>
//      *
//      * For example a notifier can open a connection to register the application, or it can do nothing.
//      *
//      * @return a usable initiated {@link Notifier} to send notification(s)
//      * @throws fr.jcgay.notification.SendNotificationException when something fails.
//      */
//     Notifier init();
// 
//     boolean tryInit();
// }
// 
// Path: send-notification/src/main/java/fr/jcgay/notification/Notification.java
// @AutoValue
// public abstract class Notification {
// 
//     /**
//      * Indicate notification priority.
//      */
//     public enum Level {INFO, WARNING, ERROR}
// 
//     /**
//      * Notification message.
//      *
//      * @return message.
//      */
//     public abstract String message();
// 
//     /**
//      * Notification title.
//      *
//      * @return title.
//      */
//     public abstract String title();
// 
//     /**
//      * Notification subtitle. <br>
//      * Not available for all notifier implementation.
//      *
//      * @return subtitle.
//      */
//     @Nullable
//     public abstract String subtitle();
// 
//     /**
//      * Notification icon.
//      *
//      * @return icon.
//      */
//     public abstract Icon icon();
// 
//     /**
//      * Indicate the notification priority type.
//      *
//      * @return type
//      */
//     public abstract Level level();
// 
//     Notification() {
//         // prevent external subclasses
//     }
// 
//     public static Builder builder(String title, String message, Icon icon) {
//         return builder()
//             .title(title)
//             .message(message)
//             .icon(icon);
//     }
// 
//     public static Builder builder() {
//         return new AutoValue_Notification.Builder().level(INFO);
//     }
// 
//     @AutoValue.Builder
//     public interface Builder {
//         Builder title(String title);
//         Builder message(String message);
//         Builder icon(Icon icon);
//         Builder subtitle(String subtitle);
//         Builder level(Level level);
//         Notification build();
//     }
// }
// 
// Path: send-notification/src/main/java/fr/jcgay/notification/Notifier.java
// public interface Notifier {
// 
//     /**
//      * Send a notification.
//      *
//      * @param notification a notification.
//      *
//      * @throws fr.jcgay.notification.SendNotificationException when something fails.
//      */
//     void send(Notification notification);
// 
//     /**
//      * Close the notifier. <br>
//      * This method must be called to release resources when the notifier is not needed anymore.
//      */
//     void close();
// 
//     /**
//      * Indicate if the notifier is always displayed somewhere (menu/task bar, etc).
//      * @return {@code true} if the notifier is persistent.
//      */
//     boolean isPersistent();
// }
// 
// Path: send-notification/src/main/java/fr/jcgay/notification/notifier/executor/Executor.java
// public interface Executor {
//     void exec(String[] command);
//     boolean tryExec(String[] command);
//     void close();
// }


import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import fr.jcgay.notification.Application;
import fr.jcgay.notification.DiscoverableNotifier;
import fr.jcgay.notification.Notification;
import fr.jcgay.notification.Notifier;
import fr.jcgay.notification.notifier.executor.Executor;
import org.slf4j.Logger;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static org.slf4j.LoggerFactory.getLogger;
package fr.jcgay.notification.notifier.notifu;




public class NotifuNotifier implements DiscoverableNotifier {

    private static final Logger LOGGER = getLogger(NotifuNotifier.class);

// Path: send-notification/src/main/java/fr/jcgay/notification/Application.java
// @AutoValue
// public abstract class Application {
// 
//     /**
//      * Uniquely identify an application. <br>
//      * In order to ensure your application's signature is unique, the recommendation is to follow the Internet Media
//      * type (also known as MIME content type) format as defined in IETF <a href="http://tools.ietf.org/html/rfc2046">RFC 2046</a>
//      * which contains the application vendor's name - specifically: {@code application/x-vnd-some_vendor.some_app}. <br>
//      * The signature must not contain spaces. <br>
//      * Some examples of acceptable signatures:
//      * <ul>
//      *     <li>{@code application/x-vnd-acme.hello_world}</li>
//      *     <li>{@code application/x-vnd-fullphat.snaRSS}</li>
//      * </ul>
//      *
//      * @return unique identifier.
//      */
//     public abstract String id();
// 
//     /**
//      * A name that will identify the application for the user. <br>
//      * Examples:
//      * <ul>
//      *     <li>Maven</li>
//      *     <li>Gradle</li>
//      * </ul>
//      *
//      * @return application name.
//      */
//     public abstract String name();
// 
//     /**
//      * A timeout to wait for before cancelling application registration or notification sending.
//      *
//      * @return timeout in milliseconds, or {@code -1} if not specified.
//      */
//     public abstract long timeout();
// 
//     /**
//      * The application icon.
//      *
//      * @return application icon.
//      */
//     public abstract Icon icon();
// 
//     Application() {
//         // prevent external subclasses
//     }
// 
//     public static Builder builder() {
//         return new AutoValue_Application.Builder()
//             .timeout(-1);
//     }
// 
//     public static Builder builder(String id, String name, Icon icon) {
//         return builder()
//             .id(id)
//             .name(name)
//             .icon(icon);
//     }
// 
//     @AutoValue.Builder
//     public interface Builder {
//         Builder id(String id);
//         Builder name(String name);
//         Builder icon(Icon icon);
//         Builder timeout(long timeout);
//         Application build();
//     }
// }
// 
// Path: send-notification/src/main/java/fr/jcgay/notification/DiscoverableNotifier.java
// public interface DiscoverableNotifier extends Notifier {
// 
//     /**
//      * Initialize before usage. <br>
//      * This method must be called before trying to send a notification. <br>
//      * Calling {@code init()} multiple time should not fail. <br>
//      *
//      * For example a notifier can open a connection to register the application, or it can do nothing.
//      *
//      * @return a usable initiated {@link Notifier} to send notification(s)
//      * @throws fr.jcgay.notification.SendNotificationException when something fails.
//      */
//     Notifier init();
// 
//     boolean tryInit();
// }
// 
// Path: send-notification/src/main/java/fr/jcgay/notification/Notification.java
// @AutoValue
// public abstract class Notification {
// 
//     /**
//      * Indicate notification priority.
//      */
//     public enum Level {INFO, WARNING, ERROR}
// 
//     /**
//      * Notification message.
//      *
//      * @return message.
//      */
//     public abstract String message();
// 
//     /**
//      * Notification title.
//      *
//      * @return title.
//      */
//     public abstract String title();
// 
//     /**
//      * Notification subtitle. <br>
//      * Not available for all notifier implementation.
//      *
//      * @return subtitle.
//      */
//     @Nullable
//     public abstract String subtitle();
// 
//     /**
//      * Notification icon.
//      *
//      * @return icon.
//      */
//     public abstract Icon icon();
// 
//     /**
//      * Indicate the notification priority type.
//      *
//      * @return type
//      */
//     public abstract Level level();
// 
//     Notification() {
//         // prevent external subclasses
//     }
// 
//     public static Builder builder(String title, String message, Icon icon) {
//         return builder()
//             .title(title)
//             .message(message)
//             .icon(icon);
//     }
// 
//     public static Builder builder() {
//         return new AutoValue_Notification.Builder().level(INFO);
//     }
// 
//     @AutoValue.Builder
//     public interface Builder {
//         Builder title(String title);
//         Builder message(String message);
//         Builder icon(Icon icon);
//         Builder subtitle(String subtitle);
//         Builder level(Level level);
//         Notification build();
//     }
// }
// 
// Path: send-notification/src/main/java/fr/jcgay/notification/Notifier.java
// public interface Notifier {
// 
//     /**
//      * Send a notification.
//      *
//      * @param notification a notification.
//      *
//      * @throws fr.jcgay.notification.SendNotificationException when something fails.
//      */
//     void send(Notification notification);
// 
//     /**
//      * Close the notifier. <br>
//      * This method must be called to release resources when the notifier is not needed anymore.
//      */
//     void close();
// 
//     /**
//      * Indicate if the notifier is always displayed somewhere (menu/task bar, etc).
//      * @return {@code true} if the notifier is persistent.
//      */
//     boolean isPersistent();
// }
// 
// Path: send-notification/src/main/java/fr/jcgay/notification/notifier/executor/Executor.java
// public interface Executor {
//     void exec(String[] command);
//     boolean tryExec(String[] command);
//     void close();
// }


// Path: send-notification/src/main/java/fr/jcgay/notification/notifier/notifu/NotifuNotifier.java
import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import fr.jcgay.notification.Application;
import fr.jcgay.notification.DiscoverableNotifier;
import fr.jcgay.notification.Notification;
import fr.jcgay.notification.Notifier;
import fr.jcgay.notification.notifier.executor.Executor;
import org.slf4j.Logger;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static org.slf4j.LoggerFactory.getLogger;

package fr.jcgay.notification.notifier.notifu;




public class NotifuNotifier implements DiscoverableNotifier {

    private static final Logger LOGGER = getLogger(NotifuNotifier.class);

    private final Application application;