package com.destinationradiodenver.mobileStreaming.application;
import java.io.Serializable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
import javax.annotation.PostConstruct;
import javax.ejb.AccessTimeout;
import javax.ejb.ConcurrencyManagement;
import javax.ejb.ConcurrencyManagementType;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.inject.Inject;
import javax.inject.Named;
import org.jboss.logging.Logger;
import com.destinationradiodenver.mobileStreaming.messages.EncoderDispatchMessage;
import com.destinationradiodenver.mobileStreaming.messages.EncoderDispatchMessage.Task;
import com.destinationradiodenver.mobileStreaming.web.entity.Encoder;
import com.destinationradiodenver.mobileStreaming.web.entity.Stream;
@Startup
@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
@AccessTimeout(value=10, unit=TimeUnit.SECONDS)
@Named
public class Streams extends CopyOnWriteArrayList<Stream> implements Serializable {
/**
* @author cpenhale
*/
private static final long serialVersionUID = -5411315964008656521L;
private static final Logger log = Logger.getLogger(Streams.class);
private ConcurrentHashMap<Stream, Integer> streamSubscribers;
private CopyOnWriteArrayList<Stream> streamRecording;
@Inject
private Encoders encoders;
@Inject
private EncoderDispatcher encoderDispatcher;
public Streams(){
}
@PostConstruct
private void init(){
log.info("Encoders Streams initialized");
streamSubscribers = new ConcurrentHashMap<Stream, Integer>();
streamRecording = new CopyOnWriteArrayList<Stream>();
}
public boolean addStream(Stream stream){
log.infof("Stream %s added to mobileConsole Encoder list",stream.getFriendlyName());
if(stream.getAutomaticallyStartEncoders()){
log.infof("Stream %s added to mobileConsole Encoder list wants to automatically start Encoders", stream.getFriendlyName());
for(Encoder enc : stream.getEncoders()){
log.infof("Starting Encoder %s for Stream %s", enc.getMobileProfile(), stream.getFriendlyName());
EncoderDispatchMessage edm = EncoderDispatchMessage.generateEncoderDispatchMessage(enc);
edm.setTask(Task.START_ENCODING);
encoderDispatcher.dispatch(edm);
}
}
getStreamSubscribers().put(stream, 0);
return super.add(stream);
}
public boolean removeStream(Stream stream){
for(Encoder enc : stream.getEncoders()){
if(encoders.contains(enc)){
EncoderDispatchMessage edm = EncoderDispatchMessage.generateEncoderDispatchMessage(enc);
edm.setTask(Task.STOP_ENCODING);
encoderDispatcher.dispatch(edm);
}
}
getStreamSubscribers().remove(stream);
return super.remove(stream);
}
public void addListener(Stream stream){
Integer listeners = getStreamSubscribers().get(stream);
listeners++;
getStreamSubscribers().replace(stream, listeners);
}
public void removeListener(Stream stream){
Integer listeners = getStreamSubscribers().get(stream);
listeners--;
getStreamSubscribers().replace(stream, listeners);
}
public Integer getListeners(Stream stream){
Integer listeners = getStreamSubscribers().get(stream);
for(Encoder enc : stream.getEncoders()){
if(encoders.contains(enc)){
listeners--;
}
}
return listeners;
}
public void addStreamRecording(Stream stream){
getStreamRecording().add(stream);
}
public void removeStreamRecording(Stream stream){
getStreamRecording().remove(stream);
}
public boolean getStreamRecordingStatus(Stream stream){
return getStreamRecording().contains(stream);
}
public ConcurrentHashMap<Stream, Integer> getStreamSubscribers() {
return streamSubscribers;
}
public void setStreamSubscribers(ConcurrentHashMap<Stream, Integer> streamSubscribers) {
this.streamSubscribers = streamSubscribers;
}
public CopyOnWriteArrayList<Stream> getStreamRecording() {
return streamRecording;
}
public void setStreamRecording(CopyOnWriteArrayList<Stream> streamRecording) {
this.streamRecording = streamRecording;
}
}