package de.tum.in.www1.jReto.module.util;
import java.util.Collection;
import java.util.HashSet;
import java.util.UUID;
import de.tum.in.www1.jReto.module.api.Address;
import de.tum.in.www1.jReto.module.api.Browser;
/** A CompositeBrowser combines multiple Reto Browsers into a single one. */
public class CompositeBrowser implements Browser {
private Browser.Handler handler;
private Collection<Browser> browsers;
private boolean isBrowsing;
public CompositeBrowser(Collection<Browser> browsers, Handler handler) {
this.browsers = new HashSet<Browser>();
this.isBrowsing = false;
this.handler = handler;
for (Browser browser : browsers) this.addBrowser(browser);
}
public void addBrowser(Browser browser) {
this.browsers.add(browser);
browser.setBrowserHandler(new Browser.Handler() {
@Override
public void onAddressRemoved(Browser browser, Address address, UUID identifier) {
CompositeBrowser.this.handler.onAddressRemoved(CompositeBrowser.this, address, identifier);
}
@Override
public void onAddressDiscovered(Browser browser, Address address, UUID identifier) {
CompositeBrowser.this.handler.onAddressDiscovered(CompositeBrowser.this, address, identifier);
}
@Override
public void onBrowsingStopped(Browser browser, Object error) {}
@Override
public void onBrowsingStarted(Browser browser) {}
});
if (this.isBrowsing) browser.startBrowsing();
}
public void removeBrowser(Browser browser) {
if (!this.browsers.contains(browser)) throw new IllegalArgumentException("Attempted to remove a browser that was not added previously.");
this.browsers.remove(browser);
browser.stopBrowsing();
}
public void setBrowserHandler(Handler handler) {
this.handler = handler;
}
public Handler getBrowserHandler() {
return this.handler;
}
public void startBrowsing() {
this.isBrowsing = true;
for (Browser browser : this.browsers) browser.startBrowsing();
this.handler.onBrowsingStarted(this);
}
public void stopBrowsing() {
this.isBrowsing = false;
for (Browser browser : this.browsers) browser.stopBrowsing();
this.handler.onBrowsingStopped(this, null);
}
@Override
public boolean isBrowsing() {
return this.isBrowsing;
}
}