1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.blossom.support;
35
36 import java.util.Enumeration;
37 import java.util.NoSuchElementException;
38
39 import javax.servlet.http.HttpServletRequest;
40 import javax.servlet.http.HttpServletRequestWrapper;
41
42
43
44
45
46
47 public class SpecialAttributeRequestWrapper extends HttpServletRequestWrapper {
48
49 private String commonPrefix;
50 private String[] names;
51 private Object[] values;
52 private boolean enabled = true;
53
54 public SpecialAttributeRequestWrapper(HttpServletRequest request) {
55 super(request);
56 }
57
58 public boolean isEnabled() {
59 return enabled;
60 }
61
62 public void setEnabled(boolean enabled) {
63 this.enabled = enabled;
64 }
65
66 protected void setOverriddenAttributes(String commonPrefix, String[] names, Object[] values) {
67 this.commonPrefix = commonPrefix;
68 this.names = names;
69 this.values = values;
70 }
71
72 @Override
73 public Object getAttribute(String name) {
74 if (enabled && name.startsWith(commonPrefix)) {
75 for (int i = 0; i < names.length; i++) {
76 if (names[i].equals(name)) {
77 return values[i];
78 }
79 }
80 }
81 return super.getAttribute(name);
82 }
83
84 public Enumeration getAttributeNames() {
85
86 if (!enabled) {
87 return super.getAttributeNames();
88 }
89
90 return new Enumeration() {
91
92 private int pos = 0;
93 private String next = null;
94 private Enumeration parentEnumeration = SpecialAttributeRequestWrapper.super.getAttributeNames();
95
96 @Override
97 public boolean hasMoreElements() {
98 if (next != null) {
99 return true;
100 }
101 while (pos < names.length) {
102 if (values[pos] != null) {
103 next = names[pos++];
104 return true;
105 }
106 pos++;
107 }
108 while (parentEnumeration.hasMoreElements()) {
109 String name = (String) parentEnumeration.nextElement();
110 if (!isAttributeOverridden(name)) {
111 next = name;
112 return true;
113 }
114 }
115 return false;
116 }
117
118 @Override
119 public String nextElement() {
120 if (next != null) {
121 String value = next;
122 next = null;
123 return value;
124 }
125 while (pos < names.length) {
126 if (values[pos] != null) {
127 return names[pos++];
128 }
129 pos++;
130 }
131 while (parentEnumeration.hasMoreElements()) {
132 String name = (String) parentEnumeration.nextElement();
133 if (!isAttributeOverridden(name)) {
134 return name;
135 }
136 }
137 throw new NoSuchElementException();
138 }
139 };
140 }
141
142 @Override
143 public void setAttribute(String name, Object o) {
144 if (enabled && isAttributeOverridden(name)) {
145 return;
146 }
147 super.setAttribute(name, o);
148 }
149
150 @Override
151 public void removeAttribute(String name) {
152 if (enabled && isAttributeOverridden(name)) {
153 return;
154 }
155 super.removeAttribute(name);
156 }
157
158 private boolean isAttributeOverridden(String name) {
159 if (name.startsWith(commonPrefix)) {
160 for (String overriddenName : names) {
161 if (name.equals(overriddenName)) {
162 return true;
163 }
164 }
165 }
166 return false;
167 }
168 }