package org.ifsoft.openlink.component;
import java.io.Serializable;
import java.util.*;
import org.xmpp.packet.JID;
import org.jivesoftware.util.Log;
import org.ifsoft.openlink.calllog.*;
public class OpenlinkUserInterest extends AbstractUserInterest
{
private OpenlinkUser traderLyncUser;
private OpenlinkInterest traderLyncInterest;
private String defaultInterest;
private String callFWD = "false";
private String callFWDDigits = "";
private Map<String, OpenlinkCall> traderLyncCalls;
private Map<String, OpenlinkSubscriber> traderLyncSubscribers;
private int maxNumCalls = 0;
public OpenlinkUserInterest()
{
defaultInterest = "false";
traderLyncCalls = Collections.synchronizedMap( new HashMap<String, OpenlinkCall>());
traderLyncSubscribers = Collections.synchronizedMap( new HashMap<String, OpenlinkSubscriber>());
}
public String getInterestName() {
return traderLyncInterest.getInterestId() + traderLyncUser.getUserNo();
}
public void handleCallInfo(String sCallNo, String sOpenlinkLineNo, String sOpenlinkLineName, String sNewLineState, String speakerCount, String handsetCount, String direction, String sPrivacyOn, String sRealDDI, String lineType, String sELC)
{
OpenlinkCall traderLyncCall = createCallById(sCallNo);
traderLyncCall.start();
traderLyncCall.line = sOpenlinkLineNo;
traderLyncCall.label = sOpenlinkLineName;
traderLyncCall.console = getUser().getDeviceNo();
traderLyncCall.handset = getUser().getHandsetNo();
traderLyncCall.direction = "I".equals(direction) ? "Incoming" : "Outgoing";
traderLyncCall.setPrivacy(sPrivacyOn);
if ("I".equals(sNewLineState))
{
traderLyncCall.setState("ConnectionCleared");
}
if ("R".equals(sNewLineState))
{
traderLyncCall.setState("CallDelivered");
traderLyncCall.direction = "Incoming";
}
if ("C".equals(sNewLineState) || "A".equals(sNewLineState))
{
traderLyncCall.setState("CallEstablished");
}
if ("H".equals(sNewLineState))
{
traderLyncCall.setState("CallHeld");
}
if ("F".equals(sNewLineState))
{
traderLyncCall.setState("CallConferenced");
}
traderLyncCall.setValidActions();
}
public void handleCallELC(String sCallNo, String sOpenlinkLineNo, String sOpenlinkLineName, String sOpenlinkConsoleNo, String sOpenlinkUserNo, String sHandsetNo, String sELC, String sConnectOrDisconnect)
{
OpenlinkCall traderLyncCall = createCallById(sCallNo);
traderLyncCall.line = sOpenlinkLineNo;
Log.info("handleCallELC " + traderLyncCall.callid + " " + sConnectOrDisconnect);
if("C".equals(sConnectOrDisconnect))
{
traderLyncCall.localConferenced = true;
traderLyncCall.setState("CallConferenced");
} else {
traderLyncCall.localConferenced = false;
traderLyncCall.setState("CallEstablished");
}
traderLyncCall.setValidActions();
}
public void handleBusyLine(String sCallNo, String sOpenlinkLineNo, String sOpenlinkLineName, String sOpenlinkConsoleNo, String sOpenlinkUserNo, String sOldLineState, String sNewLineState,
String sHandsetOrSpeaker, String sSpeakerNo, String sHandsetNo, String sConnectOrDisconnect)
{
}
public void handleConnectionCleared(String sCallNo)
{
OpenlinkCall traderLyncCall = createCallById(sCallNo);
traderLyncCall.setState("ConnectionCleared");
traderLyncCall.setValidActions();
traderLyncCall.participation = "Inactive";
traderLyncCall.endDuration();
traderLyncCall.clear();
getUser().setIntercom(false);
/*
if ("1".equals(sHandsetNo))
getUser().setCurrentHS1Call(null);
else if ("2".equals(sHandsetNo))
getUser().setCurrentHS2Call(null);
else if ("65".equals(sSpeakerNo))
getUser().setCurrentICMCall(null);
*/
}
public void handleCallOutgoing(String state, String sCallNo, String sCLI, String sOpenlinkLabel)
{
OpenlinkCall traderLyncCall = createCallById(sCallNo);
traderLyncCall.setCLI(sCLI);
traderLyncCall.setCLILabel(sCLI);
traderLyncCall.label = sOpenlinkLabel;
traderLyncCall.direction = "Outgoing";
traderLyncCall.connectState = state;
traderLyncCall.setState(state);
traderLyncCall.setValidActions();
traderLyncCall.participation = "Active";
}
public void handleCallIncoming(String sCallNo, String from, String to)
{
OpenlinkCall traderLyncCall = createCallById(sCallNo);
traderLyncCall.start();
traderLyncCall.line = sCallNo;
traderLyncCall.ddi = to;
traderLyncCall.ddiLabel = to;
traderLyncCall.setCLI(from);
traderLyncCall.setCLILabel(from);
traderLyncCall.label = getInterest().getInterestLabel();
traderLyncCall.direction = "Incoming";
traderLyncCall.connectState = "CallEstablished";
traderLyncCall.setState("CallDelivered");
traderLyncCall.setValidActions();
traderLyncCall.participation = "Inactive";
}
public void handleCallConnected(String sCallNo)
{
Log.debug("setCurrentCall " + sCallNo);
OpenlinkCall traderLyncCall = createCallById(sCallNo);
traderLyncCall.start();
traderLyncCall.label = getInterest().getInterestLabel();
setCurrentCall(traderLyncCall);
traderLyncCall.setState(traderLyncCall.connectState);
traderLyncCall.setValidActions();
traderLyncCall.startDuration();
traderLyncCall.participation = "Active";
traderLyncCall.startParticipation();
}
public void handleCallPrivate(String sCallNo, String sOpenlinkLineNo, String sOpenlinkConsoleNo, String sOpenlinkUserNo, String sHandsetNo, String sPrivacyOn)
{
OpenlinkCall traderLyncCall = getCallById(sCallNo);
if (traderLyncCall != null)
{
traderLyncCall.setPrivacy(sPrivacyOn);
traderLyncCall.setValidActions();
}
}
public void handleCallPrivateElsewhere(String sCallNo, String sOpenlinkLineNo, String sOpenlinkConsoleNo, String sOpenlinkUserNo, String sHandsetNo, String sPrivacyOn)
{
OpenlinkCall traderLyncCall = getCallById(sCallNo);
if (traderLyncCall != null)
{
traderLyncCall.setPrivacy(sPrivacyOn);
traderLyncCall.setValidActions();
}
}
public void handleCallAbandoned(String sCallNo)
{
OpenlinkCall traderLyncCall = getCallById(sCallNo);
if (traderLyncCall != null)
{
traderLyncCall.setState("CallMissed");
traderLyncCall.setValidActions();
traderLyncCall.clear();
}
}
public void handleCallConferenced(String sCallNo)
{
OpenlinkCall traderLyncCall = getCallById(sCallNo);
if (traderLyncCall != null)
{
setCurrentCall(traderLyncCall);
traderLyncCall.setState("CallConferenced");
traderLyncCall.setValidActions();
traderLyncCall.startDuration();
traderLyncCall.participation = "Active";
traderLyncCall.startParticipation();
}
}
public OpenlinkCall getCurrentCall(String handset)
{
OpenlinkCall traderLyncCall = null;
OpenlinkCall intercomCall = getUser().getCurrentICMCall();
OpenlinkCall traderLyncCall1 = getUser().getCurrentHS1Call();
OpenlinkCall traderLyncCall2 = getUser().getCurrentHS2Call();
if ("1".equals(handset))
traderLyncCall = traderLyncCall1;
else if ("2".equals(handset))
traderLyncCall = traderLyncCall2;
else if ("0".equals(handset))
traderLyncCall = intercomCall;
else if ("3".equals(handset))
traderLyncCall = traderLyncCall1;
return traderLyncCall;
}
private void setCurrentCall(OpenlinkCall traderLyncCall)
{
Log.debug("setCurrentCall " + traderLyncCall.getCallID() + " " + traderLyncCall.handset + " " + traderLyncCall.speaker);
traderLyncCall.console = getUser().getDeviceNo();
if ("1".equals(traderLyncCall.handset))
getUser().setCurrentHS1Call(traderLyncCall);
else if ("2".equals(traderLyncCall.handset))
getUser().setCurrentHS2Call(traderLyncCall);
else if ("65".equals(traderLyncCall.speaker))
getUser().setCurrentICMCall(traderLyncCall);
else if ("3".equals(traderLyncCall.handset))
getUser().setCurrentHS1Call(traderLyncCall);
}
public void handleCallBusy(String sCallNo)
{
OpenlinkCall traderLyncCall = getCallById(sCallNo);
if (traderLyncCall != null)
{
traderLyncCall.start();
traderLyncCall.setState("CallBusy");
traderLyncCall.delivered = true;
traderLyncCall.setValidActions();
traderLyncCall.participation = "Inactive";
}
}
public void handleCallFailed(String sCallNo, String sOpenlinkLineNo, String sOpenlinkLineName, String sOpenlinkConsoleNo, String sOpenlinkUserNo, String sOldLineState, String sNewLineState,
String sHandsetOrSpeaker, String sSpeakerNo, String sHandsetNo, String sConnectOrDisconnect)
{
OpenlinkCall traderLyncCall = getCallById(sCallNo);
if (traderLyncCall != null)
{
traderLyncCall.clear();
traderLyncCall.line = sOpenlinkLineNo;
traderLyncCall.label = sOpenlinkLineName;
traderLyncCall.setState("CallFailed");
traderLyncCall.setValidActions();
traderLyncCall.participation = "Inactive";
}
}
public void handleCallHeld(String sCallNo)
{
OpenlinkCall traderLyncCall = getCallById(sCallNo);
if (traderLyncCall != null)
{
traderLyncCall.setState("CallHeld");
traderLyncCall.setValidActions();
traderLyncCall.participation = "Inactive";
traderLyncCall.endDuration();
}
}
public void handleTransfer(String sCallNo, String sOpenlinkLineNo, String sOpenlinkConsoleNo, String sOpenlinkUserNo, String sTransferUserNo)
{
OpenlinkCall traderLyncCall = getCallById(sCallNo);
if (traderLyncCall != null)
{
traderLyncCall.traderLyncTransferFlag = true;
}
}
public void handleIntercom(String sCallNo)
{
OpenlinkCall traderLyncCall = createCallById(sCallNo);
traderLyncCall.platformIntercom = true;
traderLyncCall.setState("CallEstablished");
traderLyncCall.setValidActions();
getUser().setIntercom(true);
}
public void handleCallProgress(String sCallNo, String sOpenlinkLineNo, String sChannelNo, String sOpenlinkFlag)
{
OpenlinkCall traderLyncCall = getCallById(sCallNo);
if (traderLyncCall != null)
{
traderLyncCall.setCallProgress(sOpenlinkFlag);
if ("Outgoing".equals(traderLyncCall.direction))
{
if("CallOriginated".equals(traderLyncCall.getState()))
{
if("0".equals(sOpenlinkFlag))
{
if("D".equals(getInterest().getInterestType()))
{
traderLyncCall.setState("CallDelivered");
} else
traderLyncCall.setState("CallEstablished");
} else if("4".equals(sOpenlinkFlag) || "1".equals(sOpenlinkFlag)) {
traderLyncCall.setState("CallEstablished");
} else
traderLyncCall.setState("CallFailed");
} else
if("CallDelivered".equals(traderLyncCall.getState()))
{
if("2".equals(sOpenlinkFlag))
{
traderLyncCall.setState("CallEstablished");
} else if("4".equals(sOpenlinkFlag) || "1".equals(sOpenlinkFlag)) {
traderLyncCall.setState("CallEstablished");
} else
traderLyncCall.setState("CallFailed");
}
traderLyncCall.setValidActions();
}
if("CallEstablished".equals(traderLyncCall.getState()))
{
traderLyncCall.startDuration();
}
}
}
public void handleCallProceeding(OpenlinkComponent component, String sCallNo, String sOpenlinkLineNo, String sDigits, String sEndFlag)
{
OpenlinkCall traderLyncCall = getCallById(sCallNo);
if (traderLyncCall != null)
{
traderLyncCall.proceedingDigitsBuffer = (new StringBuilder()).append(traderLyncCall.proceedingDigitsBuffer).append(sDigits.trim()).toString();
if("Y".equals(sEndFlag) && !"".equals(traderLyncCall.proceedingDigitsBuffer))
{
traderLyncCall.proceedingDigits = traderLyncCall.proceedingDigitsBuffer;
traderLyncCall.proceedingDigitsBuffer = "";
traderLyncCall.proceedingDigitsLabel = traderLyncCall.proceedingDigits;
String cononicalNumber = traderLyncCall.proceedingDigits;
try
{
cononicalNumber = component.formatCanonicalNumber(traderLyncCall.proceedingDigits);
}
catch(Exception e) { }
//if(component.traderLyncLdapService.cliLookupTable.containsKey(cononicalNumber))
// traderLyncCall.proceedingDigitsLabel = (String)component.traderLyncLdapService.cliLookupTable.get(cononicalNumber);
}
}
}
public void handleCallMoved(String sCallNo, String sOpenlinkLineNo, String sOpenlinkLineNo2)
{
OpenlinkCall traderLyncCall = getCallById(sCallNo);
if (traderLyncCall != null)
{
traderLyncCall.line = sOpenlinkLineNo2;
}
}
public void handleRecallTransfer(String sCallNo, String sOpenlinkLineNo, String sOpenlinkLineNo2, String transferStatusFlag)
{
OpenlinkCall traderLyncCall = getCallById(sCallNo);
if (traderLyncCall != null)
{
if("0".equals(transferStatusFlag))
{
traderLyncCall.setState("CallTransferring");
traderLyncCall.transferFlag = false;
} else if("1".equals(transferStatusFlag)) {
traderLyncCall.setState("CallEstablished");
traderLyncCall.transferFlag = false;
if (traderLyncCall.previousCalledNumber != null)
{
Iterator<OpenlinkUserInterest> it3 = getInterest().getUserInterests().values().iterator();
while( it3.hasNext() )
{
OpenlinkUserInterest theUserInterest = (OpenlinkUserInterest)it3.next();
OpenlinkCall theCall = theUserInterest.getCallByLine(traderLyncCall.getLine());
if (theCall != null)
{
theCall.proceedingDigits = traderLyncCall.previousCalledNumber;
theCall.proceedingDigitsLabel = traderLyncCall.previousCalledLabel;
}
}
}
} else if("2".equals(transferStatusFlag)) {
traderLyncCall.setState("CallTransferred");
}
traderLyncCall.setValidActions();
}
}
public String getDefault()
{
return defaultInterest;
}
public void setDefault(String defaultInterest)
{
this.defaultInterest = defaultInterest;
}
public OpenlinkUser getUser()
{
return traderLyncUser;
}
public void setUser(OpenlinkUser traderLyncUser)
{
this.traderLyncUser = traderLyncUser;
}
public Map<String, OpenlinkSubscriber> getSubscribers()
{
return traderLyncSubscribers;
}
public void setSubscribers(Map<String, OpenlinkSubscriber> traderLyncSubscribers)
{
this.traderLyncSubscribers = traderLyncSubscribers;
}
public boolean isSubscribed(JID subscriber)
{
return traderLyncSubscribers.containsKey(subscriber.getNode());
}
public OpenlinkSubscriber getSubscriber(JID subscriber)
{
OpenlinkSubscriber traderLyncSubscriber = null;
if (traderLyncSubscribers.containsKey(subscriber.getNode()))
{
traderLyncSubscriber = (OpenlinkSubscriber)traderLyncSubscribers.get(subscriber.getNode());
} else
{
traderLyncSubscriber = new OpenlinkSubscriber();
traderLyncSubscriber.setJID(subscriber);
traderLyncSubscribers.put(subscriber.getNode(), traderLyncSubscriber);
}
return traderLyncSubscriber;
}
public void removeSubscriber(JID subscriber)
{
traderLyncSubscribers.remove(subscriber.getNode());
}
public boolean canPublish(OpenlinkComponent component)
{
if (traderLyncSubscribers.size() == 0)
{
return false;
}
boolean anySubscriberOnline = false;
Iterator<OpenlinkSubscriber> iter = traderLyncSubscribers.values().iterator();
while( iter.hasNext() )
{
OpenlinkSubscriber subscriber = (OpenlinkSubscriber)iter.next();
if (subscriber.getOnline() || component.isComponent(subscriber.getJID()))
{
anySubscriberOnline = true;
break;
}
}
return anySubscriberOnline;
}
public OpenlinkInterest getInterest()
{
return traderLyncInterest;
}
public void setInterest(OpenlinkInterest traderLyncInterest)
{
this.traderLyncInterest = traderLyncInterest;
}
public synchronized OpenlinkCall createCallById(String callID)
{
Log.debug("createCallById " + callID);
OpenlinkCall traderLyncCall = null;
if(traderLyncCalls.containsKey(callID))
{
traderLyncCall = (OpenlinkCall)traderLyncCalls.get(callID);
} else {
traderLyncCall = new OpenlinkCall();
traderLyncCall.callid = callID;
traderLyncCall.setOpenlinkUserInterest(this);
if("D".equals(getInterest().getInterestType())) // set default caller ID for directory numbers
{
traderLyncCall.ddi = getInterest().getInterestValue();
traderLyncCall.ddiLabel = getInterest().getInterestLabel();
}
traderLyncCall.initialiseDuration();
traderLyncCalls.put(callID, traderLyncCall);
}
return traderLyncCall;
}
public OpenlinkCall getCallById(String callID)
{
OpenlinkCall traderLyncCall = null;
if(traderLyncCalls.containsKey(callID))
{
traderLyncCall = (OpenlinkCall)traderLyncCalls.get(callID);
}
return traderLyncCall;
}
public OpenlinkCall getCallByLine(String line)
{
OpenlinkCall lineCall = null;
Iterator it2 = traderLyncCalls.values().iterator();
while( it2.hasNext() )
{
OpenlinkCall traderLyncCall = (OpenlinkCall)it2.next();
if (line.equals(traderLyncCall.line))
{
lineCall = traderLyncCall;
break;
}
}
return lineCall;
}
public OpenlinkCall removeCallById(String callID)
{
OpenlinkCall traderLyncCall = null;
if(traderLyncCalls.containsKey(callID))
{
traderLyncCall = (OpenlinkCall)traderLyncCalls.get(callID);
traderLyncCalls.remove(callID);
}
return traderLyncCall;
}
public Map<String, OpenlinkCall> getCalls()
{
return traderLyncCalls;
}
public boolean isLineActive(String line)
{
OpenlinkCall traderLyncCall1 = getUser().getCurrentHS1Call();
OpenlinkCall traderLyncCall2 = getUser().getCurrentHS2Call();
boolean active = false;
if (traderLyncCall1 != null && !"".equals(traderLyncCall1.line))
{
if (line.equals(String.valueOf(Long.parseLong(traderLyncCall1.line))))
active = true;
}
if (traderLyncCall2 != null && !"".equals(traderLyncCall2.line))
{
if (line.equals(String.valueOf(Long.parseLong(traderLyncCall2.line))))
active = true;
}
return active;
}
public boolean getHandsetBusyStatus()
{
OpenlinkCall traderLyncCall1 = getUser().getCurrentHS1Call();
OpenlinkCall traderLyncCall2 = getUser().getCurrentHS2Call();
if (traderLyncCall1 == null && traderLyncCall2 == null)
return false;
Iterator it2 = traderLyncCalls.values().iterator();
boolean busy1 = false;
boolean busy2 = false;
while( it2.hasNext() )
{
OpenlinkCall traderLyncCall = (OpenlinkCall)it2.next();
if (traderLyncCall1 != null && traderLyncCall.getCallID().equals(traderLyncCall1.getCallID()))
{
busy1 = true;
}
if (traderLyncCall2 != null && traderLyncCall.getCallID().equals(traderLyncCall2.getCallID()))
{
busy2 = true;
}
}
return busy1 && busy2;
}
public int getActiveCalls()
{
Iterator it2 = traderLyncCalls.values().iterator();
int calls = 0;
while( it2.hasNext() )
{
OpenlinkCall traderLyncCall = (OpenlinkCall)it2.next();
if (! "ConnectionCleared".equals(traderLyncCall.getState()))
{
calls++;
}
}
return calls;
}
public boolean getBusyStatus()
{
return (getActiveCalls() >= getMaxNumCalls());
}
public String getCallFWD() {
return callFWD;
}
public void setCallFWD(String callFWD) {
this.callFWD = callFWD;
}
public String getCallFWDDigits() {
return callFWDDigits;
}
public void setCallFWDDigits(String callFWDDigits) {
this.callFWDDigits = callFWDDigits;
}
public void setMaxNumCalls(int maxNumCalls) {
this.maxNumCalls = maxNumCalls;
}
public int getMaxNumCalls() {
return maxNumCalls;
}
public void logCall(OpenlinkCall traderLyncCall, String domain, long site)
{
String callId = traderLyncCall.getCallID() + "-" + System.currentTimeMillis();
String tscId = traderLyncCall.line;
//if ("CallMissed".equals(traderLyncCall.getState()) || "CallEstablished".equals(traderLyncCall.getState()))
//{
Log.debug("writing call record " + callId + " " + traderLyncCall.getState());
CallLogger.getLogger().logCall(tscId, callId, getUser().getProfileName(), getInterestName(), traderLyncCall.getState(), traderLyncCall.direction, traderLyncCall.creationTimeStamp, traderLyncCall.getDuration(), traderLyncCall.getCallerNumber(getInterest().getInterestType()), traderLyncCall.getCallerName(getInterest().getInterestType()), traderLyncCall.getCalledNumber(getInterest().getInterestType()), traderLyncCall.getCalledName(getInterest().getInterestType()));
Iterator it3 = getInterest().getUserInterests().values().iterator();
while( it3.hasNext() )
{
OpenlinkUserInterest traderLyncParticipant = (OpenlinkUserInterest)it3.next();
OpenlinkCall participantCall = traderLyncParticipant.getCallByLine(traderLyncCall.getLine());
if (participantCall != null)
{
Log.debug("writing call participant record " + callId + " " + traderLyncParticipant.getUser().getUserId());
//if (("Active".equals(participantCall.firstParticipation) && "ConnectionCleared".equals(participantCall.getState())))
//{
CallLogger.getLogger().logParticipant(tscId, callId, traderLyncParticipant.getUser().getUserId() + "@" + traderLyncParticipant.getUser().getUserNo() + "." + domain, participantCall.direction, participantCall.firstParticipation, participantCall.firstTimeStamp, participantCall.getDuration());
//}
//if ("CallMissed".equals(participantCall.getState()))
//{
// CallLogger.getLogger().logParticipant(tscId, callId, traderLyncParticipant.getUser().getUserId() + "@" + traderLyncParticipant.getUser().getUserNo() + "." + domain, participantCall.direction, participantCall.firstParticipation, participantCall.creationTimeStamp, participantCall.getRingDuration());
//}
}
}
//}
}
}