@Override public String toString() { return "CDR SID: "+getSid()+" | InstanceId: "+getInstanceId()+" | ParentCallSid: "+getParentCallSid()+" | ConferenceSid: "+getConferenceSid()+" | DateCreated: "+getDateCreated()+" | DateUpdated: "+getDateUpdated()+" | AccountSid: "+getAccountSid()+" | To: "+getTo()+" | From: "+getFrom() +" | PhoneNumberSid: "+getPhoneNumberSid()+" | Status: "+getStatus()+" | StartTime: "+getStartTime()+" | EndTime: "+getEndTime()+" | Duration: "+getDuration()+" | Price: "+getPrice()+" | PriceUnit: "+getPriceUnit()+" | Direction: "+getDirection()+" | AnsweredBy: "+getAnsweredBy() +" | ApiVersion: "+getApiVersion()+" | ForwaredFrom: "+getForwardedFrom()+" | CallerName: "+getCallerName()+" | Uri: "+getUri()+" | CallPath: "+getCallPath()+" | RingDuration: "+getRingDuration()+" | Muted: "+isMuted()+" | StartConferenceOnEnter: "+isStartConferenceOnEnter() +" | isEndConferenceOnExit: "+ isEndConferenceOnExit()+" | isOnHold: "+isOnHold(); }
private String prefix(final CallDetailRecord cdr) { final StringBuilder buffer = new StringBuilder(); buffer.append("/").append(apiVersion).append("/Accounts/"); buffer.append(cdr.getAccountSid().toString()).append("/Calls/"); buffer.append(cdr.getSid()); return buffer.toString(); }
@Override public JsonElement serialize(final CallDetailRecord cdr, Type type, final JsonSerializationContext context) { final JsonObject object = new JsonObject(); writeSid(cdr.getSid(), object); writeConferenceSid(cdr.getParentCallSid(), object); writeDateCreated(cdr.getDateCreated(), object); writeDateUpdated(cdr.getDateUpdated(), object); writeAccountSid(cdr.getAccountSid(), object); writeMuted(cdr.isMuted(), object); writeHold(cdr.isOnHold(), object); writeStartConferenceOnEnter(cdr.isStartConferenceOnEnter(), object); writeEndConferenceOnEnter(cdr.isEndConferenceOnExit(), object); writeUri(cdr.getUri(), object); return object; }
@Override public JsonElement serialize(final CallDetailRecord cdr, Type type, final JsonSerializationContext context) { final JsonObject object = new JsonObject(); writeSid(cdr.getSid(), object); writeInstanceId(cdr.getInstanceId(), object); writeDateCreated(cdr.getDateCreated(), object); writeDateUpdated(cdr.getDateUpdated(), object); writeParentCallSid(cdr.getParentCallSid(), object); writeAccountSid(cdr.getAccountSid(), object); writeTo(cdr.getTo(), object); writeFrom(cdr.getFrom(), object); writePhoneNumberSid(cdr.getPhoneNumberSid(), object); writeStatus(cdr.getStatus(), object); writeStartTime(cdr.getStartTime(), object); writeEndTime(cdr.getEndTime(), object); writeDuration(cdr.getDuration(), object); writePriceUnit(cdr.getPriceUnit(), object); writeDirection(cdr.getDirection(), object); writeAnsweredBy(cdr.getAnsweredBy(), object); writeApiVersion(cdr.getApiVersion(), object); writeForwardedFrom(cdr.getForwardedFrom(), object); writeCallerName(cdr.getCallerName(), object); writeUri(cdr.getUri(), object); writeRingDuration(cdr.getRingDuration(), object); writeSubResources(cdr, object); return object; }
logger.debug("CDR current values: "+cdr); cdr = message.getStatus() == null ? cdr : cdr.setStatus(message.getStatus().toString()); cdr = message.getStartTime() == null ? cdr : cdr.setStartTime(message.getStartTime()); cdr = message.getEndTime() == null ? cdr : cdr.setEndTime(message.getEndTime()); cdr = message.getPrice() == null ? cdr : cdr.setPrice(message.getPrice()); cdr = message.getAnsweredBy() == null ? cdr : cdr.setAnsweredBy(message.getAnsweredBy()); cdr = message.getConferenceSid() == null ? cdr : cdr.setConferenceSid(message.getConferenceSid()); cdr = message.getMuted() == null ? cdr : cdr.setMuted(message.getMuted()); cdr = message.getStartConferenceOnEnter() == null ? cdr : cdr.setStartConferenceOnEnter(message.getStartConferenceOnEnter()); cdr = message.getEndConferenceOnExit() == null ? cdr : cdr.setEndConferenceOnExit(message.getEndConferenceOnExit()); cdr = message.getOnHold() == null ? cdr : cdr.setOnHold(message.getOnHold()); cdr = message.getMsId() == null ? cdr : cdr.setMsId(message.getMsId()); cdr = message.upateDuration() ? cdr : cdr.setDuration((int) ((DateTime.now().getMillis() - cdr.getStartTime().getMillis()) / 1000)); cdr = message.updateRingDuration() ? cdr : cdr.setRingDuration((int) ((DateTime.now().getMillis() - cdr.getStartTime().getMillis()) / 1000));
callRecord = callRecord.setStatus(CallStateChanged.State.CANCELED.name()); final DateTime now = DateTime.now(); callRecord = callRecord.setEndTime(now); int seconds; if (callRecord.getStartTime() != null) { seconds = (int) (DateTime.now().getMillis() - callRecord.getStartTime().getMillis()) / 1000; } else { seconds = 0; callRecord = callRecord.setDuration(seconds); records.updateCallDetailRecord(callRecord); Sid organizationSid = daoManager.getAccountsDao().getAccount(callRecord.getAccountSid()).getOrganizationSid(); Registration registration = daoManager.getRegistrationsDao().getRegistration(callRecord.getTo(), organizationSid); String externalIp; if (registration != null) { externalIp = registration.getLocation().split(":")[1].split("@")[1]; } else { externalIp = callRecord.getTo().split(":")[1].split("@")[1]; callRecord = callRecord.setStatus(CallStateChanged.State.RINGING.name()); } else if (response.getStatus() == 200 || response.getStatus() == 202) { callRecord = callRecord.setStatus(CallStateChanged.State.IN_PROGRESS.name()); callRecord = callRecord.setAnsweredBy(((SipURI) response.getTo().getURI()).getUser()); final DateTime now = DateTime.now(); callRecord = callRecord.setStartTime(now); callRecord = callRecord.setStatus(CallStateChanged.State.BUSY.name());
CallDetailRecordsDao dao = daoManager.getCallDetailRecordsDao(); cdr = dao.getCallDetailRecord(sid); cdr = cdr.setStatus(callState.toString()); cdr = cdr.setDuration(0); cdr = cdr.setRingDuration((int) ((DateTime.now().getMillis() - cdr.getStartTime().getMillis()) / 1000)); break; case IN_PROGRESS: if( isInbound() || ( isOutbound() && !cdr.getStatus().equalsIgnoreCase("in_progress") ) ){ cdr = cdr.setStartTime(new DateTime()); cdr = cdr.setAnsweredBy(callInfo.to()); cdr = cdr.setEndTime(DateTime.now()); cdr = cdr.setDuration((int) ((DateTime.now().getMillis() - cdr.getStartTime().getMillis()) / 1000)); break;
public static void updateCDR(ActorSystem system, SipServletMessage message, CallStateChanged.State state) { CallDetailRecordsDao records = daoManager.getCallDetailRecordsDao(); SipServletRequest request = null; // Update CallDetailRecord if (message instanceof SipServletResponse) { request = (SipServletRequest) getLinkedSession(message).getAttribute(B2BUA_LAST_REQUEST); } else if (message instanceof SipServletRequest) { request = (SipServletRequest) message; } CallDetailRecord callRecord = records.getCallDetailRecord((Sid) request.getSession().getAttribute(CDR_SID)); if (callRecord != null) { if(logger.isInfoEnabled()) { logger.info("CDR found! Updating"); } callRecord = callRecord.setStatus(state.name()); final DateTime now = DateTime.now(); callRecord = callRecord.setEndTime(now); int seconds; if (callRecord.getStartTime() != null) { seconds = (int) (DateTime.now().getMillis() - callRecord.getStartTime().getMillis()) / 1000; } else { seconds = 0; } callRecord = callRecord.setDuration(seconds); records.updateCallDetailRecord(callRecord); sendCallInfoStreamEvent(system, message, state); } }
logger.debug("CDRs for ConferenceSid: "+conferenceSid); for (CallDetailRecord cdr: allCdrs) { logger.debug("CDR sid: "+cdr.getSid()+", status: "+cdr.getStatus()+", conferenceSid: "+cdr.getConferenceSid());
secure(account, cdr.getAccountSid(), SecuredType.SECURED_STANDARD); } catch (final AuthorizationException exception) { return status(UNAUTHORIZED).build(); final CallInfo callInfo; try { callPath = cdr.getCallPath(); Future<Object> future = (Future<Object>) ask(callManager, new GetCall(callPath), expires); call = (ActorRef) Await.result(future, Duration.create(100000, TimeUnit.SECONDS));
final CallDetailRecord.Builder builder = CallDetailRecord.builder(); builder.setSid(Sid.generate(Sid.Type.CALL)); builder.setInstanceId(RestcommConfiguration.getInstance().getMain().getInstanceId()); records.addCallDetailRecord(callRecord); incomingSession.setAttribute(CDR_SID, callRecord.getSid()); outgoingSession.setAttribute(CDR_SID, callRecord.getSid()); incomingSession.setAttribute(CDR_ACCOUNT_SID, fromClient.getSid()); outgoingSession.setAttribute(CDR_ACCOUNT_SID, fromClient.getSid());
protected Response getCall(final String accountSid, final String sid, final MediaType responseType) { Account account = daos.getAccountsDao().getAccount(accountSid); try { secure(account, "RestComm:Read:Calls"); } catch (final AuthorizationException exception) { return status(UNAUTHORIZED).build(); } final CallDetailRecordsDao dao = daos.getCallDetailRecordsDao(); final CallDetailRecord cdr = dao.getCallDetailRecord(new Sid(sid)); if (cdr == null) { return status(NOT_FOUND).build(); } else { try { secure(account, cdr.getAccountSid(), SecuredType.SECURED_STANDARD); } catch (final AuthorizationException exception) { return status(UNAUTHORIZED).build(); } if (APPLICATION_XML_TYPE.equals(responseType)) { final RestCommResponse response = new RestCommResponse(cdr); return ok(xstream.toXML(response), APPLICATION_XML).build(); } else if (APPLICATION_JSON_TYPE.equals(responseType)) { return ok(gson.toJson(cdr), APPLICATION_JSON).build(); } else { return null; } } }
private boolean isInbound() { return INBOUND.equals(cdr.getDirection()); }
private String getNextPageUri(CallDetailRecordList list) { String lastSid = (page == getTotalPages()) ? "null" : list.getCallDetailRecords().get(pageSize - 1).getSid().toString(); return (page == getTotalPages()) ? "null" : pathUri + "?Page=" + (page + 1) + "&PageSize=" + pageSize + "&AfterSid=" + lastSid; }
/** * addNewConferenceRecord * @param accountSid * @param callRecord * @param friendlyName */ protected void addNewConferenceRecord(String accountSid, CallDetailRecord callRecord, String friendlyName){ final ConferenceDetailRecord.Builder conferenceBuilder = ConferenceDetailRecord.builder(); Sid sid = Sid.generate(Sid.Type.CONFERENCE); conferenceBuilder.setSid(sid); conferenceBuilder.setDateCreated(DateTime.now()); conferenceBuilder.setAccountSid(new Sid(accountSid)); conferenceBuilder.setStatus(ConferenceStateChanged.State.RUNNING_INITIALIZING+""); conferenceBuilder.setApiVersion(callRecord.getApiVersion()); final StringBuilder UriBuffer = new StringBuilder(); UriBuffer.append("/").append(callRecord.getApiVersion()).append("/Accounts/").append(accountSid).append("/Conferences/"); UriBuffer.append(sid); final URI uri = URI.create(UriBuffer.toString()); conferenceBuilder.setUri(uri); conferenceBuilder.setFriendlyName(friendlyName); conferenceBuilder.setMasterMsId(localMsId); ConferenceDetailRecord cdr = conferenceBuilder.build(); storage.getConferenceDetailRecordsDao().addConferenceDetailRecord(cdr); }
if(cdr == null){ final CallDetailRecord.Builder builder = CallDetailRecord.builder(); builder.setSid(callInfo.sid()); builder.setInstanceId(RestcommConfiguration.getInstance().getMain().getInstanceId());
@Override public void marshal(final Object object, final HierarchicalStreamWriter writer, final MarshallingContext context) { final CallDetailRecord cdr = (CallDetailRecord) object; writer.startNode("Call"); writeSid(cdr.getSid(), writer); writeInstanceId(cdr.getInstanceId(), writer); writeDateCreated(cdr.getDateCreated(), writer); writeDateUpdated(cdr.getDateUpdated(), writer); writeParentCallSid(cdr.getParentCallSid(), writer); writeAccountSid(cdr.getAccountSid(), writer); writeTo(cdr.getTo(), writer); writeFrom(cdr.getFrom(), writer); writePhoneNumberSid(cdr.getPhoneNumberSid(), writer); writeStatus(cdr.getStatus(), writer); writeStartTime(cdr.getStartTime(), writer); writeEndTime(cdr.getEndTime(), writer); writeDuration(cdr.getDuration(), writer); writePrice(cdr.getPrice(), writer); writePriceUnit(cdr.getPriceUnit(), writer); writeDirection(cdr.getDirection(), writer); writeAnsweredBy(cdr.getAnsweredBy(), writer); writeApiVersion(cdr.getApiVersion(), writer); writeForwardedFrom(cdr.getForwardedFrom(), writer); writeCallerName(cdr.getCallerName(), writer); writeUri(cdr.getUri(), writer); writeSubResources(cdr, writer); writeRingDuration(cdr.getRingDuration(), writer); writer.endNode(); }
@Override public void marshal(final Object object, final HierarchicalStreamWriter writer, final MarshallingContext context) { final CallDetailRecord cdr = (CallDetailRecord) object; writer.startNode("Call"); writeSid(cdr.getSid(), writer); writeConferenceSid(cdr.getConferenceSid(), writer); writeDateCreated(cdr.getDateCreated(), writer); writeDateUpdated(cdr.getDateUpdated(), writer); writeAccountSid(cdr.getAccountSid(), writer); writeMuted(cdr.isMuted(), writer); writeHold(cdr.isOnHold(), writer); writeStartConferenceOnEnter(cdr.isStartConferenceOnEnter(), writer); writeEndConferenceOnEnter(cdr.isEndConferenceOnExit(), writer); writeUri(cdr.getUri(), writer); writer.endNode(); }
private String prefix(final CallDetailRecord cdr) { final StringBuilder buffer = new StringBuilder(); buffer.append("/").append(apiVersion).append("/Accounts/"); buffer.append(cdr.getAccountSid().toString()).append("/Calls/"); buffer.append(cdr.getSid()); return buffer.toString(); }
secure(account, cdr.getAccountSid(), SecuredType.SECURED_STANDARD); callPath = cdr.getCallPath(); Future<Object> future = (Future<Object>) ask(callManager, new GetCall(callPath), expires); call = (ActorRef) Await.result(future, Duration.create(10, TimeUnit.SECONDS));