package br.com.centralit.asterisk;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.asteriskjava.live.AsteriskChannel;
import org.asteriskjava.live.AsteriskQueueEntry;
import org.asteriskjava.live.AsteriskServer;
import org.asteriskjava.live.AsteriskServerListener;
import org.asteriskjava.live.DefaultAsteriskServer;
import org.asteriskjava.live.MeetMeUser;
import org.asteriskjava.live.internal.AsteriskAgentImpl;
import org.asteriskjava.manager.ManagerConnectionState;
import br.com.centralit.citcorpore.util.Enumerados.ParametroSistema;
import br.com.centralit.citcorpore.util.ParametroUtil;
public class Asterisk implements AsteriskServerListener, PropertyChangeListener{
AsteriskServer asteriskServer;
public List<ChamadaDTO> telefonesChamando() throws IOException {
String asteriskIP = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.SERVASTERISKIP, "0.0.0.0");
String asteriskLogin = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.SERVASTERISKLOGIN, "admin");
String asteriskSenha = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.SERVASTERISKSENHA, "0");
asteriskServer = new DefaultAsteriskServer(asteriskIP, asteriskLogin, asteriskSenha);
List<ChamadaDTO> listaTelefones = new ArrayList<ChamadaDTO> ();
// listen for new events
asteriskServer.addAsteriskServerListener(this);
if (ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.SERVASTERISKALGORITMOCAPTURA, "1").equalsIgnoreCase("1")) {
listaTelefones = capturaUniqueID(asteriskServer.getChannels());
} else {
listaTelefones = capturaDialingChannel(asteriskServer.getChannels());
}
this.closeServerAsterisk();
return listaTelefones;
}
public List<ChamadaDTO> capturaDialingChannel(Collection<AsteriskChannel> canaisAsterisk) {
List<ChamadaDTO> chamadas = new ArrayList<ChamadaDTO>();
ChamadaDTO chamadaDTO;
try {
for (AsteriskChannel asteriskChannel : canaisAsterisk) {
if ((asteriskChannel.getState() != null) && (asteriskChannel.getState().toString().equals("RINGING"))) {
if ((asteriskChannel.getCallerId() != null) && (asteriskChannel.getCallerId().getNumber() != null) && (asteriskChannel.getDialingChannel() != null) && (asteriskChannel.getDialingChannel().getCallerId() != null) && (asteriskChannel.getDialingChannel().getCallerId().getNumber() != null)) {
chamadaDTO = new ChamadaDTO();
chamadaDTO.setNumeroOrigem(asteriskChannel.getDialingChannel().getCallerId().getNumber().toString());
chamadaDTO.setNumeroDestino(asteriskChannel.getCallerId().getNumber().toString());
chamadas.add(chamadaDTO);
}
}
asteriskChannel.addPropertyChangeListener(this);
}
} catch (Exception e) {
e.getStackTrace();
}
return chamadas;
}
private List<ChamadaDTO> capturaUniqueID(Collection<AsteriskChannel> canaisAsterisk) {
List<ChamadaDTO> chamadas = new ArrayList<ChamadaDTO>();
ChamadaDTO chamadaDTO;
AsteriskChannel asteriskChannelDestino;
for (AsteriskChannel asteriskChannelOrigem : canaisAsterisk) {
if ((asteriskChannelOrigem.getState() != null) && (asteriskChannelOrigem.getState().toString().equals("RING")) && (asteriskChannelOrigem.getCallerId() != null) && (asteriskChannelOrigem.getCallerId().getNumber() != null)) {
asteriskChannelDestino = this.findRingingCall(asteriskChannelOrigem, canaisAsterisk);
if ((asteriskChannelDestino != null) && (asteriskChannelDestino.getCallerId() != null) && (asteriskChannelDestino.getCallerId().getNumber() != null)) {
chamadaDTO = new ChamadaDTO();
chamadaDTO.setNumeroOrigem(asteriskChannelOrigem.getCallerId().getNumber().toString());
chamadaDTO.setNumeroDestino(asteriskChannelDestino.getCallerId().getNumber().toString());
chamadas.add(chamadaDTO);
}
}
asteriskChannelOrigem.addPropertyChangeListener(this);
}
return chamadas;
}
private AsteriskChannel findRingingCall(AsteriskChannel asteriskChannelOrigem, Collection<AsteriskChannel> canaisAsterisk) {
String idLigacao = asteriskChannelOrigem.getId().substring(0, asteriskChannelOrigem.getId().indexOf("."));
AsteriskChannel ringingCall = null;
for (AsteriskChannel asteriskChannel : canaisAsterisk) {
if ((asteriskChannel.getState() != null) && (asteriskChannel.getId() != null) && (asteriskChannel.getState().toString().equalsIgnoreCase("RINGING")) && (asteriskChannel.getId().contains(idLigacao))) {
ringingCall = asteriskChannel;
break;
}
asteriskChannel.addPropertyChangeListener(this);
}
return ringingCall;
}
public void closeServerAsterisk() {
if (asteriskServer.getManagerConnection().getState().equals(ManagerConnectionState.CONNECTED) || asteriskServer.getManagerConnection().getState().equals(ManagerConnectionState.RECONNECTING)) {
asteriskServer.getManagerConnection().logoff();
}
asteriskServer = null;
}
@Override
public void propertyChange(PropertyChangeEvent arg0) {
}
@Override
public void onNewAgent(AsteriskAgentImpl arg0) {
}
@Override
public void onNewAsteriskChannel(AsteriskChannel channel) {
channel.addPropertyChangeListener(this);
}
@Override
public void onNewMeetMeUser(MeetMeUser user) {
user.addPropertyChangeListener(this);
}
@Override
public void onNewQueueEntry(AsteriskQueueEntry arg0) {
}
}