1
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
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
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