package com.voxeo.moho.presence.sip; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.sip.SipServletRequest; import com.voxeo.moho.presence.NotifyBody; import com.voxeo.moho.presence.PresenceFactory; import com.voxeo.moho.presence.sip.impl.SIPPresenceResourceImpl; import com.voxeo.moho.presence.sip.impl.notifybody.PIDFNotifyBody; import com.voxeo.moho.spi.ExecutionContext; public class SipPresenceFactory implements PresenceFactory { protected static final Map<String, String> DEFAULT_NOTIFY_BODY = new HashMap<String, String>(); static { DEFAULT_NOTIFY_BODY.put("presence", "application/pidf+xml"); } protected int _subscribeDefaultExpires = 3600; protected int _subscribeMaxExpires = 3600000; protected int _subscribeMinExpires = 30; protected int _publishDefaultExpires = 300; protected int _publishMaxExpires = 3000; protected int _publishMinExpires = 5; private ExecutionContext _contex; @Override public SIPResource createResource(String resourceUri, String eventName) { if ("presence".equalsIgnoreCase(eventName)) { return new SIPPresenceResourceImpl(_contex, resourceUri, eventName); } else { throw new IllegalArgumentException("Unsupported event[" + eventName + "]"); } } public NotifyBody createNotifyBody(SipServletRequest req) throws IOException { String eventName = req.getHeader("Event"); if ("presence".equalsIgnoreCase(eventName)) { return new PIDFNotifyBody(req.getCharacterEncoding(), req.getRawContent()); } else { throw new IllegalArgumentException("Unsupported event[" + eventName + "]"); } } public String getDefaultNotifyBodyName(String eventName) { if (DEFAULT_NOTIFY_BODY.containsKey(eventName)) { return DEFAULT_NOTIFY_BODY.get(eventName); } throw new IllegalArgumentException("Can't find default notifyBodyType for event[" + eventName + "]"); } /** * @param expires * @return a compliant expire value, if -1, the expire value is too brief */ public int checkSubscribeExpires(int expires) { int retv = expires; if (retv < 0) { retv = getSubscribeDefaultExpires(); } if (retv > getSubscribeMaxExpires()) { retv = getSubscribeMaxExpires(); } if (retv > 0 && retv < 3600 && retv < getSubscribeMinExpires()) { return -1; } return retv; } /** * @param expires * @return a compliant expire value, if -1, the expire value is too brief */ public int checkPublishExpires(int expires) { if (expires < 0) { expires = getPublishDefaultExpires(); } if (expires > getPublishMaxExpires()) { expires = getPublishMaxExpires(); } if (expires > 0 && expires < getPublishMinExpires()) { return -1; } return expires; } public int getSubscribeDefaultExpires() { return _subscribeDefaultExpires; } public void setSubscribeDefaultExpires(int subscribeDefaultExpires) { _subscribeDefaultExpires = subscribeDefaultExpires; } public int getSubscribeMaxExpires() { return _subscribeMaxExpires; } public void setSubscribeMaxExpires(int subscribeMaxExpires) { _subscribeMaxExpires = subscribeMaxExpires; } public int getSubscribeMinExpires() { return _subscribeMinExpires; } public void setSubscribeMinExpires(int subscribeMinExpires) { _subscribeMinExpires = subscribeMinExpires; } public int getPublishDefaultExpires() { return _publishDefaultExpires; } public void setPublishDefaultExpires(int publishDefaultExpires) { _publishDefaultExpires = publishDefaultExpires; } public int getPublishMaxExpires() { return _publishMaxExpires; } public void setPublishMaxExpires(int publishMaxExpires) { _publishMaxExpires = publishMaxExpires; } public int getPublishMinExpires() { return _publishMinExpires; } public void setPublishMinExpires(int publishMinExpires) { _publishMinExpires = publishMinExpires; } @Override public void init(ExecutionContext context, Map<String, String> properties) throws Exception { _contex = context; if (properties.get(SIPPresenceService.MAX_EXPIRE) != null) { _subscribeMaxExpires = Integer.parseInt(properties.get(SIPPresenceService.MAX_EXPIRE)); } if (properties.get(SIPPresenceService.MIN_EXPIRE) != null) { _subscribeMinExpires = Integer.parseInt(properties.get(SIPPresenceService.MIN_EXPIRE)); } } @Override public void destroy() { } @Override public String getName() { return SipPresenceFactory.class.getName(); } }