package de.tum.in.www1.jReto.module.util;
import java.util.Collection;
import java.util.UUID;
import de.tum.in.www1.jReto.module.api.Advertiser;
import de.tum.in.www1.jReto.module.api.Connection;
/** A CompositeAdvertiser combines multiple Reto Advertisers into a single one. */
public class CompositeAdvertiser implements Advertiser {
private Collection<Advertiser> advertisers;
private Advertiser.Handler handler;
private UUID localPeerIdentifier;
private boolean isAdvertising = false;
private Advertiser.Handler advertiserDelegate = new Advertiser.Handler() {
public void onConnection(Advertiser advertiser, Connection connection) {
CompositeAdvertiser.this.handleIncomingConnection(connection);
}
public void onAdvertisingStopped(Advertiser advertiser) {
CompositeAdvertiser.this.advertiserStopped();
}
public void onAdvertisingStarted(Advertiser advertiser) {
CompositeAdvertiser.this.advertiserStarted();
}
};
public CompositeAdvertiser(UUID localPeerIdentifier, Collection<Advertiser> advertisers, Handler handler) {
if (localPeerIdentifier == null) throw new IllegalArgumentException();
if (advertisers == null) throw new IllegalArgumentException();
if (handler == null) throw new IllegalArgumentException();
this.localPeerIdentifier = localPeerIdentifier;
this.advertisers = advertisers;
this.handler = handler;
for (Advertiser advertiser : advertisers) this.addAdvertiser(advertiser);
}
public void addAdvertiser(Advertiser advertiser) {
this.advertisers.add(advertiser);
advertiser.setAdvertiserHandler(this.advertiserDelegate);
if (this.isAdvertising) advertiser.startAdvertisingWithPeerIdentifier(this.localPeerIdentifier);
}
public void removeAdvertiser(Advertiser advertiser) {
if (!this.advertisers.contains(advertiser)) throw new IllegalArgumentException("Tried to remove an advertiser that was not previously added.");
this.advertisers.remove(advertiser);
advertiser.stopAdvertising();
}
public void stopAdvertising() {
this.isAdvertising = false;
for (Advertiser advertiser : advertisers) advertiser.stopAdvertising();
}
public void setAdvertiserHandler(Handler handler) {
this.handler = handler;
}
public Handler getAdvertiserHandler() {
return this.handler;
}
public UUID getLocalPeerIdentifier() {
return this.localPeerIdentifier;
}
private void handleIncomingConnection(final Connection connection) {
this.handler.onConnection(this, connection);
}
private void advertiserStopped() {}
private void advertiserStarted() {}
@Override
public boolean isAdvertising() {
return this.isAdvertising;
}
@Override
public void startAdvertisingWithPeerIdentifier(UUID identifier) {
this.isAdvertising = true;
for (Advertiser advertiser : advertisers) {
advertiser.startAdvertisingWithPeerIdentifier(identifier);
}
}
}