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  package org.jumpmind.symmetric.web;
22  
23  import java.util.Iterator;
24  
25  import javax.servlet.ServletConfig;
26  import javax.servlet.ServletContext;
27  import javax.servlet.ServletException;
28  import javax.servlet.ServletRequest;
29  
30  import org.jumpmind.symmetric.transport.ITransportResource;
31  import org.jumpmind.symmetric.transport.ITransportResourceHandler;
32  import org.springframework.beans.BeanUtils;
33  
34  /***
35   * @since 1.4.0
36   * 
37   * @param <T>
38   */
39  public abstract class AbstractResourceServlet<T extends ITransportResourceHandler> extends AbstractServlet implements
40          IServletResource {
41      private ServletResourceTemplate servletResourceTemplate = new ServletResourceTemplate();
42  
43      /***
44       * Returns true if this should be container compatible
45       * 
46       * @return
47       */
48      public boolean isContainerCompatible() {
49          return false;
50      }
51  
52      public void destroy() {
53          servletResourceTemplate.destroy();
54      }
55  
56      public boolean isDisabled() {
57          return servletResourceTemplate.isDisabled();
58      }
59  
60      public String[] getRegexPatterns() {
61          return servletResourceTemplate.getRegexPatterns();
62      }
63  
64      public String[] getUriPatterns() {
65          return servletResourceTemplate.getUriPatterns();
66      }
67  
68      public boolean matches(ServletRequest request) {
69          return servletResourceTemplate.matches(request);
70      }
71  
72      public void setDisabled(boolean disabled) {
73          servletResourceTemplate.setDisabled(disabled);
74      }
75      
76      public void setEnabled(boolean enabled) {
77          servletResourceTemplate.setDisabled(!enabled);
78      }
79  
80      public void setRegexPattern(String regexPattern) {
81          servletResourceTemplate.setRegexPattern(regexPattern);
82      }
83  
84      public void setRegexPatterns(String[] regexPatterns) {
85          servletResourceTemplate.setRegexPatterns(regexPatterns);
86      }
87  
88      public void setUriPattern(String uriPattern) {
89          servletResourceTemplate.setUriPattern(uriPattern);
90      }
91  
92      public void setUriPatterns(String[] uriPatterns) {
93          servletResourceTemplate.setUriPatterns(uriPatterns);
94      }
95  
96      public String toString() {
97          return servletResourceTemplate.toString();
98      }
99  
100     @Override
101     public void init(ServletConfig servletConfig) throws ServletException {
102         super.init(servletConfig);
103         servletResourceTemplate.init(getServletContext());
104         if (isContainerCompatible() && !this.isSpringManaged()) {
105             final IServletResource springBean = getSpringBean();
106             if (this != springBean) { // this != is deliberate!
107                 if (getLogger().isInfoEnabled()) {
108                     getLogger().info(String.format("Initializing servlet %s", springBean.getClass().getSimpleName()));
109                 }
110                 BeanUtils.copyProperties(springBean, this, IServletResource.class);
111                 BeanUtils.copyProperties(springBean, this, ITransportResource.class);
112                 BeanUtils.copyProperties(springBean, this, this.getClass());
113 
114                 this.refresh();
115             }
116         }
117     }
118 
119     /***
120      * Returns true if this is a spring managed resource.
121      * 
122      * @return
123      */
124     public boolean isSpringManaged() {
125         return getDefaultApplicationContext().getBeansOfType(this.getClass()).values().contains(this);
126     }
127 
128     /***
129      * Returns true if this is a container managed resource.
130      * 
131      * @return
132      */
133     @SuppressWarnings("unchecked")
134     public IServletResource getSpringBean() {
135         IServletResource retVal = this;
136         if (!isSpringManaged()) {
137             Iterator iterator = getDefaultApplicationContext().getBeansOfType(this.getClass()).values().iterator();
138             if (iterator.hasNext()) {
139                 retVal = (IServletResource) iterator.next();
140             }
141         }
142         return retVal;
143     }
144 
145     public void init(ServletContext servletContext) {
146         servletResourceTemplate.init(servletContext);
147     }
148 
149     public void refresh() {
150         servletResourceTemplate.refresh();
151     }
152 }