View Javadoc

1   /*
2    * SymmetricDS is an open source database synchronization solution.
3    *   
4    * Copyright (C) Keith Naas <knaas@users.sourceforge.net>
5    *               
6    *
7    * This library is free software; you can redistribute it and/or
8    * modify it under the terms of the GNU Lesser General Public
9    * License as published by the Free Software Foundation; either
10   * version 3 of the License, or (at your option) any later version.
11   *
12   * This library is distributed in the hope that it will be useful,
13   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15   * Lesser General Public License for more details.
16   *
17   * You should have received a copy of the GNU Lesser General Public
18   * License along with this library; if not, see
19   * <http://www.gnu.org/licenses/>.
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   *  &lt;servlet&gt;
46   *    &lt;servlet-name&gt;SymmetricServlet&lt;/filter-name&gt;
47   *    &lt;servlet-class&gt;
48   *      org.jumpmind.symmetric.web.SymmetricServlet
49   *    &lt;/servlet-class&gt;
50   *  &lt;/servlet&gt;
51   * 
52   *  &lt;servlet-mapping&gt;
53   *    &lt;servlet-name&gt;SymmetricServlet&lt;/servlet-name&gt;
54   *    &lt;url-pattern&gt;*&lt;/url-pattern&gt;
55   *  &lt;/servlet-mapping&gt;
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          // they will need to be sorted somehow, right now its just the order
82          // they appear in the spring file
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 }