AbstractSubscriber.java

package com.jsql.view.subscriber;

import com.jsql.util.LogLevelUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import javax.swing.*;
import java.util.concurrent.Flow.Subscriber;
import java.util.concurrent.Flow.Subscription;

public abstract class AbstractSubscriber implements Subscriber<Seal> {

    private static final Logger LOGGER = LogManager.getRootLogger();

    private Subscription subscription;

    @Override
    public void onSubscribe(Subscription subscription) {
        this.subscription = subscription;
        subscription.request(1);  // enable receiving items
    }

    @Override
    public void onNext(Seal request) {
        this.subscription.request(1);

        // Display model thread name in logs instead of the observer name
        String nameThread = Thread.currentThread().getName();
        SwingUtilities.invokeLater(() -> {
            Thread.currentThread().setName("from " + nameThread);
            this.execute(request);
        });
    }

    protected abstract void execute(Seal request);

    @Override
    public void onError(Throwable e) {
        LOGGER.log(LogLevelUtil.CONSOLE_JAVA, e, e);
    }

    @Override
    public void onComplete() {
        // Nothing
    }

    /**
     * Observer pattern.<br>
     * Receive an update order from the model:<br>
     * - Use the Request message to get the Interaction class,<br>
     * - Pass the parameters to that class.
     */
    public Subscription getSubscription() {
        return this.subscription;
    }
}