xref: /aosp_15_r20/external/nist-sip/java/javax/sip/SipFactory.java (revision 4dd4ff528b8b07036318f5d4191b0009f17bc7b3)
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