package org.mobicents.ipbx.session.call.logging;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.servlet.sip.SipServletRequest;
import javax.servlet.sip.SipServletResponse;
import javax.servlet.sip.SipSession;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Observer;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.mobicents.ipbx.entity.History;
import org.mobicents.ipbx.entity.User;
import org.mobicents.ipbx.session.DataLoader;
import org.mobicents.ipbx.session.call.model.CallParticipant;
import org.mobicents.ipbx.session.call.model.WorkspaceStateManager;
import org.mobicents.ipbx.session.util.DateUtil;
@Name("callHistory")
@Scope(ScopeType.STATELESS)
public class CallHistory {
@In EntityManagerFactory ipbxEntityManagerFactory;
@In SipSession sipSession;
@In DataLoader dataLoader;
@In EntityManager entityManager;
@In(scope=ScopeType.SESSION, required=false) @Out(scope=ScopeType.SESSION, required=false) List historyCache;
@Observer("RESPONSE")
public void response(SipServletResponse response) {
int status = response.getStatus();
if(status >= 300) {
String message = "Call to " + response.getTo().getURI() +
" has failed with status code " + status;
addHistory(message);
} else if (status >= 200) {
String method = response.getRequest().getMethod();
if(method.equalsIgnoreCase("INVITE")) {
String message = "Call to " + response.getTo().getURI() +
" has succeeded with status code " + status;
addHistory(message);
} else if(method.equalsIgnoreCase("BYE")) {
String message = "Call with " + response.getTo().getURI() +
" has ended with status code " + status;
addHistory(message);
}
}
}
@Observer("incomingCall")
public void acceptedCall(SipServletRequest request) {
addHistory("Incoming call from " + request.getFrom().getURI());
}
@Observer("onHold")
public void onHold(CallParticipant participant) {
addHistory(participant.getUri() + " is on hold");
}
@Observer("unonHold")
public void unonHold(CallParticipant participant) {
addHistory(participant.getUri() + " is back in the call");
}
@Observer("rejectedCall")
public void rejectedCall(String from, String to) {
// TODO
}
public void addHistory(String message) {
// The database logging is deisabled for now and is replaced by this in-memory logging
try {
User user = (User) sipSession.getAttribute("user");
if(user == null) return;
if(DataLoader.history.get(user.getName()) == null) {
DataLoader.history.put(user.getName(), new ArrayList<History>());
}
History history = new History();
history.setMessage(message);
history.setTimestamp(DateUtil.now());
history.setUser(user);
DataLoader.history.get(user.getName()).add(0, history);
WorkspaceStateManager.instance().getWorkspace(user.getName()).makeHistoryDirty();
} catch(Exception e) {
// if something fails here we don't care because loggig is secondary function
e.printStackTrace();
}
/*
try {
EntityManager em = entityManager;//ipbxEntityManagerFactory.createEntityManager();
//em.flush();
User user = (User) sipSession.getAttribute("user");
if(user == null) return;
user = (User) em.createQuery(
"SELECT user FROM User user where user.id=:uid")
.setParameter("uid", user.getId()).getSingleResult();
em.lock(user, LockModeType.READ);
History history = new History();
history.setMessage(message);
history.setTimestamp(DateUtil.now());
history.setUser(user);
if(user.getHistory() == null) {
user.setHistory(new HashSet<History>());
}
user.getHistory().add(history);
em.persist(history);
//workspaceStateManager.getCurrentState(user.getName()).makeHistoryDirty();
} catch (Exception e) {
e.printStackTrace();
}*/
}
@Observer("INVITE")
public void logInvite(SipServletRequest request) {
addHistory("Incoming INVITE from "+ request.getFrom());
}
@Observer("REGISTER")
public void logRegister(SipServletRequest request) {
addHistory("Registering "+ request.getFrom());
}
}