/**
* This file is part of the Kompics P2P Framework.
*
* Copyright (C) 2009 Swedish Institute of Computer Science (SICS) Copyright (C)
* 2009 Royal Institute of Technology (KTH)
*
* Kompics is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package se.sics.gvod.ls.peer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import se.sics.kompics.ComponentDefinition;
import se.sics.kompics.Handler;
import se.sics.kompics.Positive;
import se.sics.kompics.Negative;
import se.sics.gvod.timer.Timer;
import se.sics.gvod.bootstrap.port.BootstrapPort;
import se.sics.gvod.bootstrap.port.BootstrapRequest;
import se.sics.gvod.bootstrap.port.BootstrapResponse;
import se.sics.gvod.bootstrap.port.Rebootstrap;
import se.sics.gvod.bootstrap.port.RebootstrapResponse;
import se.sics.kompics.Component;
import se.sics.gvod.bootstrap.client.BootstrapClient;
import se.sics.gvod.bootstrap.client.BootstrapClientInit;
import se.sics.gvod.bootstrap.port.*;
import se.sics.gvod.common.Self;
import se.sics.gvod.croupier.Croupier;
import se.sics.gvod.croupier.CroupierPort;
import se.sics.gvod.croupier.events.CroupierInit;
import se.sics.gvod.common.evts.JoinCompleted;
import se.sics.gvod.croupier.events.CroupierJoin;
import se.sics.gvod.ls.interas.InterAs;
import se.sics.gvod.ls.interas.InterAsInit;
import se.sics.gvod.ls.system.LSConfig;
import se.sics.gvod.ls.video.Video;
import se.sics.gvod.ls.video.VideoInit;
import se.sics.gvod.net.VodNetwork;
import se.sics.gvod.timer.SchedulePeriodicTimeout;
import se.sics.gvod.timer.Timeout;
import se.sics.kompics.*;
/**
*
* @author gautier
*/
public final class VideoPeer extends ComponentDefinition {
Positive<VodNetwork> network = positive(VodNetwork.class);
Positive<Timer> timer = positive(Timer.class);
Negative<VideoPeerPort> peerPort = negative(VideoPeerPort.class);
private Component croupier, video, interas, bootstrap;
private Self self;
private Logger logger = LoggerFactory.getLogger(VideoPeer.class);
private boolean bootstrapped = false;
public static final class BootServerKeepAlive extends Timeout {
public BootServerKeepAlive(SchedulePeriodicTimeout request) {
super(request);
}
}
public VideoPeer() {
bootstrap = create(BootstrapClient.class);
croupier = create(Croupier.class);
video = create(Video.class);
interas = create(InterAs.class);
connect(network, bootstrap.getNegative(VodNetwork.class));
connect(timer, bootstrap.getNegative(Timer.class));
connect(network, croupier.getNegative(VodNetwork.class));
connect(timer, croupier.getNegative(Timer.class));
connect(network, interas.getNegative(VodNetwork.class));
connect(timer, interas.getNegative(Timer.class));
connect(network, video.getNegative(VodNetwork.class));
connect(timer, video.getNegative(Timer.class));
subscribe(handleInit, control);
subscribe(handleStop, control);
subscribe(handleRebootstrap, croupier.getPositive(CroupierPort.class));
subscribe(handleJoinCompleted, croupier.getPositive(CroupierPort.class));
subscribe(handleJoin, peerPort);
subscribe(handleBootstrapResponse, bootstrap.getPositive(BootstrapPort.class));
subscribe(handleAddOverlayResponse, bootstrap.getPositive(BootstrapPort.class));
}
Handler<VideoPeerInit> handleInit = new Handler<VideoPeerInit>() {
@Override
public void handle(VideoPeerInit init) {
logger.trace("handle gvodPeerInit");
self = init.getSelf();
trigger(new BootstrapClientInit(self,
init.getBootstrapConfiguration()), bootstrap.getControl());
trigger(new CroupierInit(self, init.getCroupierConfiguration()),
croupier.getControl());
trigger(new InterAsInit(self,
init.getCroupierConfiguration().getShufflePeriod(),
init.getCroupierConfiguration().getRto()),
interas.getControl());
trigger(new VideoInit(self, init.isSource(), init.getVideoConfiguration()),
video.getControl());
if (LSConfig.hasSourceUrlSet()) {
AddOverlayRequest addRequest =
new AddOverlayRequest(LSConfig.getBootstrapServer(),
LSConfig.SYSTEM_OVERLAY_ID, "video",
"Live streaming", new byte[]{'a'}, "");
trigger(addRequest, bootstrap.getPositive(BootstrapPort.class));
}
}
};
Handler<JoinPeer> handleJoin = new Handler<JoinPeer>() {
@Override
public void handle(JoinPeer event) {
trigger(new BootstrapRequest(LSConfig.SYSTEM_OVERLAY_ID),
bootstrap.getPositive(BootstrapPort.class));
}
};
Handler<Stop> handleStop = new Handler<Stop>() {
@Override
public void handle(Stop event) {
// TODO - cleanup connections.
// disconnect from Bootstrap server
// Stop monitoring client
// destroy bootstrap client
}
};
Handler<Rebootstrap> handleRebootstrap = new Handler<Rebootstrap>() {
@Override
public void handle(Rebootstrap event) {
BootstrapRequest request = new BootstrapRequest(event.getOverlay(), event.getUtility());
trigger(request, bootstrap.getPositive(BootstrapPort.class));
}
};
Handler<AddOverlayResponse> handleAddOverlayResponse = new Handler<AddOverlayResponse>() {
@Override
public void handle(AddOverlayResponse event) {
logger.info(self.getAddress() + " adding overlay "
+ event.getOverlayId() + " result: " + event.isSucceeded());
}
};
Handler<BootstrapResponse> handleBootstrapResponse = new Handler<BootstrapResponse>() {
@Override
public void handle(BootstrapResponse event) {
if (!bootstrapped) {
logger.debug("Bootstrapped with {} peers.",
event.getPeers());
trigger(new CroupierJoin(event.getPeers()), croupier.getPositive(CroupierPort.class));
bootstrapped = true;
} else {
trigger(new RebootstrapResponse(self.getId(), event.getPeers()), croupier.getPositive(CroupierPort.class));
}
}
};
Handler<JoinCompleted> handleJoinCompleted = new Handler<JoinCompleted>() {
@Override
public void handle(JoinCompleted event) {
}
};
}