1 /*
2  * JBoss, Home of Professional Open Source.
3  * Copyright 2014 Red Hat, Inc., and individual contributors
4  * as indicated by the @author tags.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  *  Unless required by applicable law or agreed to in writing, software
13  *  distributed under the License is distributed on an "AS IS" BASIS,
14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  *  See the License for the specific language governing permissions and
16  *  limitations under the License.
17  */

18
19 package io.undertow.servlet.api;
20
21 import java.lang.reflect.Constructor;
22 import java.util.Collections;
23 import java.util.HashMap;
24 import java.util.Map;
25
26 import javax.servlet.Filter;
27
28 import io.undertow.servlet.UndertowServletMessages;
29 import io.undertow.servlet.util.ConstructorInstanceFactory;
30
31 /**
32  * @author Stuart Douglas
33  */

34 public class FilterInfo implements Cloneable {
35
36     private final Class<? extends Filter> filterClass;
37     private final String name;
38     private volatile InstanceFactory<? extends Filter> instanceFactory;
39
40     private final Map<String, String> initParams = new HashMap<>();
41     private volatile boolean asyncSupported;
42
43
44     public FilterInfo(final String name, final Class<? extends Filter> filterClass) {
45         if (name == null) {
46             throw UndertowServletMessages.MESSAGES.paramCannotBeNull("name");
47         }
48         if (filterClass == null) {
49             throw UndertowServletMessages.MESSAGES.paramCannotBeNull("filterClass""Filter", name);
50         }
51         if (!Filter.class.isAssignableFrom(filterClass)) {
52             throw UndertowServletMessages.MESSAGES.filterMustImplementFilter(name, filterClass);
53         }
54         try {
55             final Constructor<Filter> ctor = (Constructor<Filter>) filterClass.getDeclaredConstructor();
56             ctor.setAccessible(true);
57             this.instanceFactory = new ConstructorInstanceFactory<>(ctor);
58             this.name = name;
59             this.filterClass = filterClass;
60         } catch (NoSuchMethodException e) {
61             throw UndertowServletMessages.MESSAGES.componentMustHaveDefaultConstructor("Filter", filterClass);
62         }
63     }
64
65
66     public FilterInfo(final String name, final Class<? extends Filter> filterClass, final InstanceFactory<? extends Filter> instanceFactory) {
67         if (name == null) {
68             throw UndertowServletMessages.MESSAGES.paramCannotBeNull("name");
69         }
70         if (filterClass == null) {
71             throw UndertowServletMessages.MESSAGES.paramCannotBeNull("filterClass""Filter", name);
72         }
73         if (!Filter.class.isAssignableFrom(filterClass)) {
74             throw UndertowServletMessages.MESSAGES.filterMustImplementFilter(name, filterClass);
75         }
76         this.instanceFactory = instanceFactory;
77         this.name = name;
78         this.filterClass = filterClass;
79     }
80
81     public void validate() {
82         //TODO
83     }
84
85     @Override
86     public FilterInfo clone() {
87         FilterInfo info = new FilterInfo(name, filterClass, instanceFactory)
88                 .setAsyncSupported(asyncSupported);
89         info.initParams.putAll(initParams);
90         return info;
91     }
92
93     public Class<? extends Filter> getFilterClass() {
94         return filterClass;
95     }
96
97     public String getName() {
98         return name;
99     }
100     public InstanceFactory<? extends Filter> getInstanceFactory() {
101         return instanceFactory;
102     }
103
104     public void setInstanceFactory(InstanceFactory<? extends Filter> instanceFactory) {
105         this.instanceFactory = instanceFactory;
106     }
107
108     public FilterInfo addInitParam(final String name, final String value) {
109         initParams.put(name, value);
110         return this;
111     }
112
113     public Map<String, String> getInitParams() {
114         return Collections.unmodifiableMap(initParams);
115     }
116
117     public boolean isAsyncSupported() {
118         return asyncSupported;
119     }
120
121     public FilterInfo setAsyncSupported(final boolean asyncSupported) {
122         this.asyncSupported = asyncSupported;
123         return this;
124     }
125
126     @Override
127     public String toString() {
128         return "FilterInfo{" +
129                 "filterClass=" + filterClass +
130                 ", name='" + name + '\'' +
131                 '}';
132     }
133 }
134