James Moger
2015-11-22 ed552ba47c02779c270ffd62841d6d1048dade70
commit | author | age
ec2456 1 /*
DO 2  * Copyright 2014 gitblit.com.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.gitblit.servlet;
17
18 import java.io.IOException;
1b34b0 19 import java.util.ArrayList;
ec2456 20 import java.util.Iterator;
DO 21 import java.util.List;
22
cdb2fe 23 import com.google.inject.Inject;
JM 24 import com.google.inject.Singleton;
1b34b0 25 import javax.servlet.Filter;
ec2456 26 import javax.servlet.FilterChain;
DO 27 import javax.servlet.FilterConfig;
28 import javax.servlet.ServletException;
29 import javax.servlet.ServletRequest;
30 import javax.servlet.ServletResponse;
31
cf5db4 32 import ro.fortsoft.pf4j.PluginWrapper;
JM 33
ec2456 34 import com.gitblit.extensions.HttpRequestFilter;
DO 35 import com.gitblit.manager.IPluginManager;
cf5db4 36 import com.gitblit.manager.IRuntimeManager;
ec2456 37
DO 38 /**
cf5db4 39  * A request filter than allows registered extension request filters to access
ec2456 40  * request data.  The intended purpose is for server monitoring plugins.
DO 41  *
42  * @author David Ostrovsky
43  * @since 1.6.0
44  */
1b34b0 45 @Singleton
JM 46 public class ProxyFilter implements Filter {
47     private final IRuntimeManager runtimeManager;
48
49     private final IPluginManager pluginManager;
50
51     private final List<HttpRequestFilter> filters;
52
53     @Inject
54     public ProxyFilter(
55             IRuntimeManager runtimeManager,
56             IPluginManager pluginManager) {
57
58         this.runtimeManager = runtimeManager;
59         this.pluginManager = pluginManager;
60         this.filters = new ArrayList<>();
61
62     }
ec2456 63
DO 64     @Override
1b34b0 65     public void init(FilterConfig filterConfig) throws ServletException {
cf5db4 66
1b34b0 67         filters.addAll(pluginManager.getExtensions(HttpRequestFilter.class));
ec2456 68         for (HttpRequestFilter f : filters) {
cf5db4 69             // wrap the filter config for Gitblit settings retrieval
JM 70             PluginWrapper pluginWrapper = pluginManager.whichPlugin(f.getClass());
71             FilterConfig runtimeConfig = new FilterRuntimeConfig(runtimeManager,
72                     pluginWrapper.getPluginId(), filterConfig);
73
74             f.init(runtimeConfig);
ec2456 75         }
DO 76     }
77
78     @Override
79     public void doFilter(ServletRequest req, ServletResponse res, final FilterChain last)
80             throws IOException, ServletException {
81         final Iterator<HttpRequestFilter> itr = filters.iterator();
82         new FilterChain() {
83             @Override
84             public void doFilter(ServletRequest req, ServletResponse res) throws IOException,
85                     ServletException {
86                 if (itr.hasNext()) {
87                     itr.next().doFilter(req, res, this);
88                 } else {
89                     last.doFilter(req, res);
90                 }
91             }
92         }.doFilter(req, res);
93     }
94
95     @Override
96     public void destroy() {
97         for (HttpRequestFilter f : filters) {
98             f.destroy();
99         }
100     }
101 }