1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.jumpmind.symmetric.web;
23
24 import java.util.ArrayList;
25 import java.util.Iterator;
26 import java.util.List;
27 import java.util.Map;
28
29 import javax.servlet.ServletConfig;
30 import javax.servlet.ServletException;
31 import javax.servlet.http.HttpServlet;
32 import javax.servlet.http.HttpServletRequest;
33 import javax.servlet.http.HttpServletResponse;
34
35 import org.apache.commons.logging.Log;
36 import org.apache.commons.logging.LogFactory;
37
38 /***
39 * The SymmetricServlet manages all of the other servlets. This allows for
40 * easier configuration since spring manages the individual servlets.
41 *
42 * Configured within web.xml
43 *
44 * <pre>
45 * <servlet>
46 * <servlet-name>SymmetricServlet</filter-name>
47 * <servlet-class>
48 * org.jumpmind.symmetric.web.SymmetricServlet
49 * </servlet-class>
50 * </servlet>
51 *
52 * <servlet-mapping>
53 * <servlet-name>SymmetricServlet</servlet-name>
54 * <url-pattern>*</url-pattern>
55 * </servlet-mapping>
56 * </pre>
57 *
58 * @since 1.4.0
59 */
60 public class SymmetricServlet extends AbstractServlet {
61
62 private static final long serialVersionUID = 1L;
63
64 private static final Log logger = LogFactory.getLog(SymmetricServlet.class);
65
66 private List<HttpServlet> servlets;
67
68 @Override
69 protected Log getLogger() {
70
71 return logger;
72 }
73
74 @Override
75 public void init(ServletConfig config) throws ServletException {
76 super.init(config);
77
78 servlets = new ArrayList<HttpServlet>();
79 @SuppressWarnings("unchecked")
80 final Map<String, HttpServlet> servletBeans = getDefaultApplicationContext().getBeansOfType(HttpServlet.class);
81
82
83 for (final Map.Entry<String, HttpServlet> servletEntry : servletBeans.entrySet()) {
84 if (logger.isInfoEnabled()) {
85 logger.info(String.format("Initializing servlet %s", servletEntry.getKey()));
86 }
87 final HttpServlet servlet = servletEntry.getValue();
88 servlet.init(this.getServletConfig());
89 servlets.add(servlet);
90 }
91 }
92
93 public void destroy() {
94 for (final HttpServlet servlet : servlets) {
95 servlet.destroy();
96 }
97 }
98
99 protected AbstractResourceServlet<?> findMatchingServlet(HttpServletRequest req, HttpServletResponse resp) {
100 AbstractResourceServlet<?> retVal = null;
101 for (Iterator<HttpServlet> iterator = servlets.iterator(); retVal == null && iterator.hasNext();) {
102 HttpServlet servlet = iterator.next();
103 if (servlet instanceof AbstractResourceServlet) {
104 final AbstractResourceServlet<?> builtinServlet = (AbstractResourceServlet<?>) servlet;
105 if (!builtinServlet.isDisabled() && builtinServlet.matches(req)) {
106 retVal = builtinServlet;
107 }
108 }
109 }
110 return retVal;
111 }
112
113 @Override
114 protected void handleDelete(HttpServletRequest req, HttpServletResponse resp) throws Exception {
115 AbstractResourceServlet<?> servlet = findMatchingServlet(req, resp);
116 if (servlet != null) {
117 servlet.handleDelete(req, resp);
118 } else {
119 super.handleDelete(req, resp);
120 }
121 }
122
123 @Override
124 protected void handleGet(HttpServletRequest req, HttpServletResponse resp) throws Exception {
125 AbstractResourceServlet<?> servlet = findMatchingServlet(req, resp);
126 if (servlet != null) {
127 servlet.handleGet(req, resp);
128 } else {
129 super.handleGet(req, resp);
130 }
131 }
132
133 @Override
134 protected void handleHead(HttpServletRequest req, HttpServletResponse resp) throws Exception {
135 AbstractResourceServlet<?> servlet = findMatchingServlet(req, resp);
136 if (servlet != null) {
137 servlet.handleHead(req, resp);
138 } else {
139 super.handleHead(req, resp);
140 }
141 }
142
143 @Override
144 protected void handleOptions(HttpServletRequest req, HttpServletResponse resp) throws Exception {
145 AbstractResourceServlet<?> servlet = findMatchingServlet(req, resp);
146 if (servlet != null) {
147 servlet.handleOptions(req, resp);
148 } else {
149 super.handleOptions(req, resp);
150 }
151 }
152
153 @Override
154 protected void handlePost(HttpServletRequest req, HttpServletResponse resp) throws Exception {
155 AbstractResourceServlet<?> servlet = findMatchingServlet(req, resp);
156 if (servlet != null) {
157 servlet.handlePost(req, resp);
158 } else {
159 super.handlePost(req, resp);
160 }
161 }
162
163 @Override
164 protected void handlePut(HttpServletRequest req, HttpServletResponse resp) throws Exception {
165 AbstractResourceServlet<?> servlet = findMatchingServlet(req, resp);
166 if (servlet != null) {
167 servlet.handlePut(req, resp);
168 } else {
169 super.handlePut(req, resp);
170 }
171 }
172
173 @Override
174 protected void handleTrace(HttpServletRequest req, HttpServletResponse resp) throws Exception {
175 AbstractResourceServlet<?> servlet = findMatchingServlet(req, resp);
176 if (servlet != null) {
177 servlet.handleTrace(req, resp);
178 } else {
179 super.handleTrace(req, resp);
180 }
181 }
182
183 }