package de.tum.in.www1.jReto.routing.managed_module;
import java.util.Date;
import java.util.UUID;
import java.util.concurrent.Executor;
import de.tum.in.www1.jReto.module.api.Address;
import de.tum.in.www1.jReto.module.api.Browser;
import de.tum.in.www1.jReto.util.StartStopHelper;
/**
* A ManagedBrowser automatically attempts to restart a Browser if starting the browser failed. The same concept applies to stopping the Browser.
* */
public class ManagedBrowser implements Browser, Browser.Handler{
private final Browser browser;
private final StartStopHelper startStopHelper;
private Browser.Handler handler;
public ManagedBrowser(Browser browser, Executor executor) {
this.browser = browser;
this.browser.setBrowserHandler(this);
this.startStopHelper = new StartStopHelper(
attemptNumber -> attemptStart(attemptNumber),
attemptNumber -> attemptStop(attemptNumber),
ManagedModule.DEFAULT_TIMER_SETTINGS,
executor
);
}
private void attemptStart(int attemptNumber) {
if (attemptNumber > 1) System.out.println(new Date()+": Retrying to start browser (attempt "+attemptNumber+"): "+ this.browser);
this.browser.startBrowsing();
}
private void attemptStop(int attemptNumber) {
if (attemptNumber > 1) System.out.println(new Date()+": Retrying to stop browser (attempt "+attemptNumber+"): "+ this.browser);
this.browser.stopBrowsing();
}
@Override
public void onBrowsingStarted(Browser browser) {
this.startStopHelper.onStart();
this.handler.onBrowsingStarted(this);
}
@Override
public void onBrowsingStopped(Browser browser, Object error) {
this.startStopHelper.onStop();
this.handler.onBrowsingStopped(this, error);
}
@Override
public void onAddressDiscovered(Browser browser, Address address, UUID identifier) {
this.handler.onAddressDiscovered(this, address, identifier);
}
@Override
public void onAddressRemoved(Browser browser, Address address, UUID identifier) {
this.handler.onAddressRemoved(this, address, identifier);
}
@Override
public void setBrowserHandler(Handler handler) {
this.handler = handler;
}
@Override
public Handler getBrowserHandler() {
return this.handler;
}
@Override
public boolean isBrowsing() {
return this.browser.isBrowsing();
}
@Override
public void startBrowsing() {
this.startStopHelper.start();
}
@Override
public void stopBrowsing() {
this.startStopHelper.stop();
}
}