1
2
3
4
5
6
7
8
9
10
11 package org.mule.transport.servlet.jetty;
12
13 import org.mule.api.endpoint.EndpointException;
14 import org.mule.api.transport.MessageReceiver;
15 import org.mule.api.transport.NoReceiverForEndpointException;
16 import org.mule.routing.filters.WildcardFilter;
17 import org.mule.transport.servlet.MuleReceiverServlet;
18 import org.mule.util.StringUtils;
19
20 import java.util.Iterator;
21
22 import javax.servlet.ServletConfig;
23 import javax.servlet.ServletException;
24 import javax.servlet.http.HttpServletRequest;
25
26 import edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap;
27 import edu.emory.mathcs.backport.java.util.concurrent.ConcurrentMap;
28
29 public class JettyReceiverServlet extends MuleReceiverServlet
30 {
31
32
33
34 private static final long serialVersionUID = 238326861089137293L;
35
36 private ConcurrentMap receivers = new ConcurrentHashMap(4);
37
38
39 protected void doInit(ServletConfig servletConfig) throws ServletException
40 {
41
42 }
43
44
45 protected MessageReceiver getReceiverForURI(HttpServletRequest httpServletRequest)
46 throws EndpointException
47 {
48 String key = httpServletRequest.getLocalPort() + httpServletRequest.getPathInfo();
49
50 MessageReceiver receiver = (MessageReceiver)receivers.get(key);
51 if (receiver == null)
52 {
53 for (Iterator iterator = receivers.keySet().iterator(); iterator.hasNext();)
54 {
55 String s = (String) iterator.next();
56 if(new WildcardFilter(s).accept(key))
57 {
58 receiver = (MessageReceiver)receivers.get(s);
59 break;
60 }
61 }
62 if (receiver == null)
63 {
64 throw new NoReceiverForEndpointException(httpServletRequest.getPathInfo());
65 }
66 }
67 return receiver;
68 }
69
70 void addReceiver(MessageReceiver receiver)
71 {
72 receivers.putIfAbsent(getReceiverKey(receiver), receiver);
73 }
74
75 boolean removeReceiver(MessageReceiver receiver)
76 {
77 return receivers.remove(getReceiverKey(receiver), receiver);
78 }
79
80 protected String getReceiverKey(MessageReceiver receiver)
81 {
82 String key = receiver.getEndpointURI().getPath();
83 if(StringUtils.isEmpty(key))
84 {
85 key = "/";
86 }
87 return receiver.getEndpointURI().getPort() + key;
88 }
89 }