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);
}
}
}
}