| package javax.sip; |
| |
| import java.lang.reflect.Constructor; |
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.Properties; |
| import javax.sip.address.AddressFactory; |
| import javax.sip.header.HeaderFactory; |
| import javax.sip.message.MessageFactory; |
| |
| public class SipFactory { |
| private static final String IP_ADDRESS_PROP = "javax.sip.IP_ADDRESS"; |
| private static final String STACK_NAME_PROP = "javax.sip.STACK_NAME"; |
| |
| private static SipFactory sSipFactory = null; |
| |
| public static synchronized SipFactory getInstance() { |
| if (sSipFactory == null) sSipFactory = new SipFactory(); |
| return sSipFactory; |
| } |
| |
| // name-to-SipStack map; name could be IP address for backward compatibility |
| private Map<String, SipStack> mNameSipStackMap = |
| new HashMap<String, SipStack>(); |
| |
| private SipFactory() { |
| } |
| |
| public synchronized void resetFactory() { |
| mNameSipStackMap.clear(); |
| } |
| |
| public synchronized SipStack createSipStack(Properties properties) |
| throws PeerUnavailableException { |
| // for backward compatibility, if IP_ADDRESS_PROP exists, use it and |
| // ignore STACK_NAME_PROP. |
| String name = properties.getProperty(IP_ADDRESS_PROP); |
| if (name == null) { |
| name = properties.getProperty(STACK_NAME_PROP); |
| if (name == null ) { |
| throw new PeerUnavailableException( |
| STACK_NAME_PROP + " property not found"); |
| } |
| } |
| |
| SipStack sipStack = mNameSipStackMap.get(name); |
| if (sipStack == null) { |
| String implClassName = "gov.nist." |
| + SipStack.class.getCanonicalName() + "Impl"; |
| try { |
| sipStack = Class.forName(implClassName) |
| .asSubclass(SipStack.class) |
| .getConstructor(new Class[] {Properties.class}) |
| .newInstance(new Object[] {properties}); |
| } catch (Exception e) { |
| throw new PeerUnavailableException( |
| "Failed to initiate " + implClassName, e); |
| } |
| mNameSipStackMap.put(name, sipStack); |
| } |
| return sipStack; |
| } |
| |
| public AddressFactory createAddressFactory() |
| throws PeerUnavailableException { |
| try { |
| return new gov.nist.javax.sip.address.AddressFactoryImpl(); |
| } catch (Exception e) { |
| if (e instanceof PeerUnavailableException) { |
| throw (PeerUnavailableException) e; |
| } else { |
| throw new PeerUnavailableException( |
| "Failed to create AddressFactory", e); |
| } |
| } |
| } |
| |
| public HeaderFactory createHeaderFactory() throws PeerUnavailableException { |
| try { |
| return new gov.nist.javax.sip.header.HeaderFactoryImpl(); |
| } catch (Exception e) { |
| if (e instanceof PeerUnavailableException) { |
| throw (PeerUnavailableException) e; |
| } else { |
| throw new PeerUnavailableException( |
| "Failed to create HeaderFactory", e); |
| } |
| } |
| } |
| |
| public MessageFactory createMessageFactory() |
| throws PeerUnavailableException { |
| try { |
| return new gov.nist.javax.sip.message.MessageFactoryImpl(); |
| } catch (Exception e) { |
| if (e instanceof PeerUnavailableException) { |
| throw (PeerUnavailableException) e; |
| } else { |
| throw new PeerUnavailableException( |
| "Failed to create MessageFactory", e); |
| } |
| } |
| } |
| } |