1*4dd4ff52SXin Li package javax.sip; 2*4dd4ff52SXin Li 3*4dd4ff52SXin Li import java.lang.reflect.Constructor; 4*4dd4ff52SXin Li import java.util.HashMap; 5*4dd4ff52SXin Li import java.util.Map; 6*4dd4ff52SXin Li import java.util.Properties; 7*4dd4ff52SXin Li import javax.sip.address.AddressFactory; 8*4dd4ff52SXin Li import javax.sip.header.HeaderFactory; 9*4dd4ff52SXin Li import javax.sip.message.MessageFactory; 10*4dd4ff52SXin Li 11*4dd4ff52SXin Li public class SipFactory { 12*4dd4ff52SXin Li private static final String IP_ADDRESS_PROP = "javax.sip.IP_ADDRESS"; 13*4dd4ff52SXin Li private static final String STACK_NAME_PROP = "javax.sip.STACK_NAME"; 14*4dd4ff52SXin Li 15*4dd4ff52SXin Li private static SipFactory sSipFactory = null; 16*4dd4ff52SXin Li getInstance()17*4dd4ff52SXin Li public static synchronized SipFactory getInstance() { 18*4dd4ff52SXin Li if (sSipFactory == null) sSipFactory = new SipFactory(); 19*4dd4ff52SXin Li return sSipFactory; 20*4dd4ff52SXin Li } 21*4dd4ff52SXin Li 22*4dd4ff52SXin Li // name-to-SipStack map; name could be IP address for backward compatibility 23*4dd4ff52SXin Li private Map<String, SipStack> mNameSipStackMap = 24*4dd4ff52SXin Li new HashMap<String, SipStack>(); 25*4dd4ff52SXin Li SipFactory()26*4dd4ff52SXin Li private SipFactory() { 27*4dd4ff52SXin Li } 28*4dd4ff52SXin Li resetFactory()29*4dd4ff52SXin Li public synchronized void resetFactory() { 30*4dd4ff52SXin Li mNameSipStackMap.clear(); 31*4dd4ff52SXin Li } 32*4dd4ff52SXin Li createSipStack(Properties properties)33*4dd4ff52SXin Li public synchronized SipStack createSipStack(Properties properties) 34*4dd4ff52SXin Li throws PeerUnavailableException { 35*4dd4ff52SXin Li // for backward compatibility, if IP_ADDRESS_PROP exists, use it and 36*4dd4ff52SXin Li // ignore STACK_NAME_PROP. 37*4dd4ff52SXin Li String name = properties.getProperty(IP_ADDRESS_PROP); 38*4dd4ff52SXin Li if (name == null) { 39*4dd4ff52SXin Li name = properties.getProperty(STACK_NAME_PROP); 40*4dd4ff52SXin Li if (name == null ) { 41*4dd4ff52SXin Li throw new PeerUnavailableException( 42*4dd4ff52SXin Li STACK_NAME_PROP + " property not found"); 43*4dd4ff52SXin Li } 44*4dd4ff52SXin Li } 45*4dd4ff52SXin Li 46*4dd4ff52SXin Li SipStack sipStack = mNameSipStackMap.get(name); 47*4dd4ff52SXin Li if (sipStack == null) { 48*4dd4ff52SXin Li String implClassName = "gov.nist." 49*4dd4ff52SXin Li + SipStack.class.getCanonicalName() + "Impl"; 50*4dd4ff52SXin Li try { 51*4dd4ff52SXin Li sipStack = Class.forName(implClassName) 52*4dd4ff52SXin Li .asSubclass(SipStack.class) 53*4dd4ff52SXin Li .getConstructor(new Class[] {Properties.class}) 54*4dd4ff52SXin Li .newInstance(new Object[] {properties}); 55*4dd4ff52SXin Li } catch (Exception e) { 56*4dd4ff52SXin Li throw new PeerUnavailableException( 57*4dd4ff52SXin Li "Failed to initiate " + implClassName, e); 58*4dd4ff52SXin Li } 59*4dd4ff52SXin Li mNameSipStackMap.put(name, sipStack); 60*4dd4ff52SXin Li } 61*4dd4ff52SXin Li return sipStack; 62*4dd4ff52SXin Li } 63*4dd4ff52SXin Li createAddressFactory()64*4dd4ff52SXin Li public AddressFactory createAddressFactory() 65*4dd4ff52SXin Li throws PeerUnavailableException { 66*4dd4ff52SXin Li try { 67*4dd4ff52SXin Li return new gov.nist.javax.sip.address.AddressFactoryImpl(); 68*4dd4ff52SXin Li } catch (Exception e) { 69*4dd4ff52SXin Li if (e instanceof PeerUnavailableException) { 70*4dd4ff52SXin Li throw (PeerUnavailableException) e; 71*4dd4ff52SXin Li } else { 72*4dd4ff52SXin Li throw new PeerUnavailableException( 73*4dd4ff52SXin Li "Failed to create AddressFactory", e); 74*4dd4ff52SXin Li } 75*4dd4ff52SXin Li } 76*4dd4ff52SXin Li } 77*4dd4ff52SXin Li createHeaderFactory()78*4dd4ff52SXin Li public HeaderFactory createHeaderFactory() throws PeerUnavailableException { 79*4dd4ff52SXin Li try { 80*4dd4ff52SXin Li return new gov.nist.javax.sip.header.HeaderFactoryImpl(); 81*4dd4ff52SXin Li } catch (Exception e) { 82*4dd4ff52SXin Li if (e instanceof PeerUnavailableException) { 83*4dd4ff52SXin Li throw (PeerUnavailableException) e; 84*4dd4ff52SXin Li } else { 85*4dd4ff52SXin Li throw new PeerUnavailableException( 86*4dd4ff52SXin Li "Failed to create HeaderFactory", e); 87*4dd4ff52SXin Li } 88*4dd4ff52SXin Li } 89*4dd4ff52SXin Li } 90*4dd4ff52SXin Li createMessageFactory()91*4dd4ff52SXin Li public MessageFactory createMessageFactory() 92*4dd4ff52SXin Li throws PeerUnavailableException { 93*4dd4ff52SXin Li try { 94*4dd4ff52SXin Li return new gov.nist.javax.sip.message.MessageFactoryImpl(); 95*4dd4ff52SXin Li } catch (Exception e) { 96*4dd4ff52SXin Li if (e instanceof PeerUnavailableException) { 97*4dd4ff52SXin Li throw (PeerUnavailableException) e; 98*4dd4ff52SXin Li } else { 99*4dd4ff52SXin Li throw new PeerUnavailableException( 100*4dd4ff52SXin Li "Failed to create MessageFactory", e); 101*4dd4ff52SXin Li } 102*4dd4ff52SXin Li } 103*4dd4ff52SXin Li } 104*4dd4ff52SXin Li } 105