package org.mobicents.servlet.sip.message; import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.io.Serializable; import java.net.InetAddress; import java.net.InetSocketAddress; import java.security.Principal; import java.text.ParseException; import java.util.Enumeration; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.concurrent.Semaphore; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.sip.Address; import javax.servlet.sip.SipApplicationSession; import javax.servlet.sip.SipServletRequest; import javax.servlet.sip.SipURI; import javax.servlet.sip.URI; import javax.servlet.sip.ar.SipApplicationRouterInfo; import javax.servlet.sip.ar.SipApplicationRoutingRegion; import javax.sip.Dialog; import javax.sip.SipException; import javax.sip.Transaction; import org.apache.log4j.Logger; import org.mobicents.servlet.sip.core.session.MobicentsSipApplicationSession; import org.mobicents.servlet.sip.core.session.MobicentsSipSession; import org.mobicents.servlet.sip.core.session.SessionManagerUtil; import org.mobicents.servlet.sip.core.session.SipApplicationSessionKey; import org.mobicents.servlet.sip.core.session.SipManager; import org.mobicents.servlet.sip.core.session.SipSessionKey; import org.mobicents.servlet.sip.proxy.ProxyImpl; import org.mobicents.servlet.sip.startup.SipContext; import org.mobicents.servlet.sip.startup.StaticServiceHolder; /** * The purpose of this class is to be a facade to the real sip session as well as a * serializable session class that can be put as a session attribute in other sessions or even its own session. * Basically instead of replicating the whole attribute map, we will replicate the id, then on the remote side we will * read the ID and look it up in the remote session manager. * * @author vralev * @author jean.deruelle@gmail.com * */ public class MobicentsSipSessionFacade implements MobicentsSipSession, Externalizable { private static final long serialVersionUID = 1L; private static transient Logger logger = Logger.getLogger(MobicentsSipSessionFacade.class); private MobicentsSipSession sipSession; public MobicentsSipSessionFacade() { } public MobicentsSipSessionFacade(MobicentsSipSession sipSession) { this.sipSession = sipSession; } public SipServletRequest createRequest(String arg0) { return sipSession.createRequest(arg0); } public SipApplicationSession getApplicationSession() { return sipSession.getApplicationSession(); } public Object getAttribute(String arg0) { return sipSession.getAttribute(arg0); } public Enumeration<String> getAttributeNames() { return sipSession.getAttributeNames(); } public String getCallId() { return sipSession.getCallId(); } public long getCreationTime() { return sipSession.getCreationTime(); } public String getId() { return sipSession.getId(); } public boolean getInvalidateWhenReady() { return sipSession.getInvalidateWhenReady(); } public long getLastAccessedTime() { return sipSession.getLastAccessedTime(); } public Address getLocalParty() { return sipSession.getLocalParty(); } public SipApplicationRoutingRegion getRegion() { return sipSession.getRegion(); } public Address getRemoteParty() { return sipSession.getRemoteParty(); } public ServletContext getServletContext() { return sipSession.getServletContext(); } public State getState() { return sipSession.getState(); } public URI getSubscriberURI() { return sipSession.getSubscriberURI(); } public void invalidate() { sipSession.invalidate(); } public boolean isReadyToInvalidate() { return sipSession.isReadyToInvalidate(); } public boolean isValid() { return sipSession.isValid(); } public void removeAttribute(String arg0) { sipSession.removeAttribute(arg0); } public void setAttribute(String arg0, Object arg1) { sipSession.setAttribute(arg0, arg1); } public void setHandler(String arg0) throws ServletException { sipSession.setHandler(arg0); } public void setInvalidateWhenReady(boolean arg0) { sipSession.setInvalidateWhenReady(arg0); } public void setOutboundInterface(InetAddress arg0) { sipSession.setOutboundInterface(arg0); } public void setOutboundInterface(InetSocketAddress arg0) { sipSession.setOutboundInterface(arg0); } public void readExternal(ObjectInput arg0) throws IOException, ClassNotFoundException { String sipSessionId = arg0.readUTF(); String sipAppSessionId = arg0.readUTF(); String sipAppName = arg0.readUTF(); SipContext sipContext = StaticServiceHolder.sipStandardService .getSipApplicationDispatcher().findSipApplication(sipAppName); SipSessionKey key = null; try { key = SessionManagerUtil.parseSipSessionKey(sipSessionId); } catch (ParseException e) { logger.error("Couldn't parse the following sip session key " + sipSessionId, e); throw new RuntimeException(e); } SipApplicationSessionKey sipAppKey = null; try { sipAppKey = SessionManagerUtil.parseSipApplicationSessionKey(sipAppSessionId); } catch (ParseException e) { logger.error("Couldn't parse the following sip application session key " + sipAppSessionId, e); throw new RuntimeException(e); } MobicentsSipApplicationSession sipApplicationSession = ((SipManager)sipContext.getManager()).getSipApplicationSession(sipAppKey, false); this.sipSession = ((SipManager)sipContext.getManager()).getSipSession(key, false, null, sipApplicationSession); if(this.sipSession == null) throw new NullPointerException( "We just tried to pull a SipSession from the distributed cache and it's null, key=" + key); } public void writeExternal(ObjectOutput arg0) throws IOException { MobicentsSipSession sipSessionImpl = (MobicentsSipSession) this.sipSession; MobicentsSipApplicationSession sipAppSession = (MobicentsSipApplicationSession) sipSessionImpl.getSipApplicationSession(); arg0.writeUTF(sipSessionImpl.getId()); arg0.writeUTF(sipAppSession.getId()); arg0.writeUTF(sipAppSession.getApplicationName()); } public void access() { sipSession.access(); } public void addDerivedSipSessions(MobicentsSipSession derivedSession) { sipSession.addDerivedSipSessions(derivedSession); } public void addOngoingTransaction(Transaction transaction) { sipSession.addOngoingTransaction(transaction); } public void addSubscription(SipServletMessageImpl sipServletMessage) throws SipException { sipSession.addSubscription(sipServletMessage); } public MobicentsSipSession findDerivedSipSession(String toTag) { return findDerivedSipSession(toTag); } public B2buaHelperImpl getB2buaHelper() { return sipSession.getB2buaHelper(); } public Iterator<MobicentsSipSession> getDerivedSipSessions() { return sipSession.getDerivedSipSessions(); } public String getHandler() { return sipSession.getHandler(); } public SipSessionKey getKey() { return sipSession.getKey(); } public Set<Transaction> getOngoingTransactions() { return sipSession.getOngoingTransactions(); } public SipURI getOutboundInterface() { return sipSession.getOutboundInterface(); } public ProxyImpl getProxy() { return sipSession.getProxy(); } public SipApplicationRoutingRegion getRegionInternal() { return sipSession.getRegionInternal(); } public Semaphore getSemaphore() { return sipSession.getSemaphore(); } public Dialog getSessionCreatingDialog() { return sipSession.getSessionCreatingDialog(); } public Transaction getSessionCreatingTransaction() { return sipSession.getSessionCreatingTransaction(); } public MobicentsSipApplicationSession getSipApplicationSession() { return sipSession.getSipApplicationSession(); } public Map<String, Object> getSipSessionAttributeMap() { return sipSession.getSipSessionAttributeMap(); } public URI getSipSubscriberURI() { return sipSession.getSipSubscriberURI(); } public Serializable getStateInfo() { return sipSession.getStateInfo(); } public Principal getUserPrincipal() { return sipSession.getUserPrincipal(); } public void onReadyToInvalidate() { sipSession.onReadyToInvalidate(); } public void onTerminatedState() { sipSession.onTerminatedState(); } public MobicentsSipSession removeDerivedSipSession(String toTag) { return sipSession.removeDerivedSipSession(toTag); } public void removeOngoingTransaction(Transaction transaction) { sipSession.removeOngoingTransaction(transaction); } public void removeSubscription(SipServletMessageImpl sipServletMessage) { sipSession.removeSubscription(sipServletMessage); } public void setB2buaHelper(B2buaHelperImpl helperImpl) { sipSession.setB2buaHelper(helperImpl); } public void setLocalParty(Address addressImpl) { sipSession.setLocalParty(addressImpl); } public void setParentSession(MobicentsSipSession mobicentsSipSession) { sipSession.setParentSession(mobicentsSipSession); } public void setProxy(ProxyImpl proxy) { sipSession.setProxy(proxy); } public void setRemoteParty(Address addressImpl) { sipSession.setRemoteParty(addressImpl); } public void setRoutingRegion(SipApplicationRoutingRegion routingRegion) { sipSession.setRoutingRegion(routingRegion); } public void setSessionCreatingDialog(Dialog dialog) { sipSession.setSessionCreatingDialog(dialog); } public void setSessionCreatingTransaction(Transaction transaction) { sipSession.setSessionCreatingTransaction(transaction); } public void setSipSessionAttributeMap( Map<String, Object> sipSessionAttributeMap) { sipSession.setSipSessionAttributeMap(sipSessionAttributeMap); } public void setSipSubscriberURI(URI subscriberURI) { sipSession.setSipSubscriberURI(subscriberURI); } public void setState(State state) { sipSession.setState(state); } public void setStateInfo(Serializable stateInfo) { sipSession.setStateInfo(stateInfo); } public void setUserPrincipal(Principal principal) { sipSession.setUserPrincipal(principal); } public void updateStateOnResponse( SipServletResponseImpl sipServletResponseImpl, boolean receive) { sipSession.updateStateOnResponse(sipServletResponseImpl, receive); } public void updateStateOnSubsequentRequest( SipServletRequestImpl sipServletRequestImpl, boolean receive) { sipSession.updateStateOnSubsequentRequest(sipServletRequestImpl, receive); } public MobicentsSipSessionFacade getSession() { return sipSession.getSession(); } @Override public boolean equals(Object obj) { return sipSession.equals(obj); } @Override public int hashCode() { return sipSession.hashCode(); } @Override public String toString() { return sipSession.toString(); } public SipApplicationRouterInfo getNextSipApplicationRouterInfo() { return sipSession.getNextSipApplicationRouterInfo(); } public void setNextSipApplicationRouterInfo( SipApplicationRouterInfo routerInfo) { sipSession.setNextSipApplicationRouterInfo(routerInfo); } public void setAckReceived(boolean ackReceived) { } public boolean isAckReceived() { return false; } public void setCseq(long cseq) { } public long getCseq() { return 0; } }