1
2
3
4
5
6
7
8
9
10
11
12
13
14 package ch.qos.logback.access.sift;
15
16 import javax.servlet.http.HttpServletRequest;
17 import javax.servlet.http.HttpSession;
18
19 import ch.qos.logback.access.spi.AccessEvent;
20 import ch.qos.logback.core.sift.Discriminator;
21 import ch.qos.logback.core.spi.ContextAwareBase;
22
23
24
25
26
27
28
29
30
31
32
33 public class AccessEventDiscriminator extends ContextAwareBase implements
34 Discriminator<AccessEvent> {
35
36 boolean started = false;
37
38
39
40
41
42
43
44
45
46
47 public enum FieldName {
48 COOKIE, REQUEST_ATTRIBUTE, SESSION_ATTRIBUTE, REMOTE_ADDRESS, LOCAL_PORT, REQUEST_URI
49 }
50
51 String defaultValue;
52 String key;
53 FieldName fieldName;
54 String additionalKey;
55
56 public String getDiscriminatingValue(AccessEvent acccessEvent) {
57 String rawValue = getRawDiscriminatingValue(acccessEvent);
58 if (rawValue == null || rawValue.length() == 0) {
59 return defaultValue;
60 } else {
61 return rawValue;
62 }
63 }
64
65 public String getRawDiscriminatingValue(AccessEvent acccessEvent) {
66 switch (fieldName) {
67 case COOKIE:
68
69 return acccessEvent.getCookie(additionalKey);
70 case LOCAL_PORT:
71 return String.valueOf(acccessEvent.getLocalPort());
72 case REQUEST_ATTRIBUTE:
73
74 return getRequestAttribute(acccessEvent);
75 case SESSION_ATTRIBUTE:
76 return getSessionAttribute(acccessEvent);
77 case REMOTE_ADDRESS:
78 return acccessEvent.getRemoteAddr();
79 case REQUEST_URI:
80
81 return getRequestURI(acccessEvent);
82 default:
83 return null;
84 }
85 }
86
87 private String getRequestAttribute(AccessEvent acccessEvent) {
88 String attr = acccessEvent.getAttribute(additionalKey);
89 if (AccessEvent.NA.equals(attr)) {
90 return null;
91 } else {
92 return attr;
93 }
94 }
95
96 private String getRequestURI(AccessEvent acccessEvent) {
97 String uri = acccessEvent.getRequestURI();
98 if (uri != null && uri.length() >= 1 && uri.charAt(0) == '/') {
99 return uri.substring(1);
100 } else {
101 return uri;
102 }
103 }
104
105 private String getSessionAttribute(AccessEvent acccessEvent) {
106 HttpServletRequest req = acccessEvent.getRequest();
107 if (req != null) {
108 HttpSession session = req.getSession(false);
109 if (session != null) {
110 if ("id".equalsIgnoreCase(additionalKey)) {
111 return session.getId();
112 } else {
113 Object v = session.getAttribute(additionalKey);
114 if (v != null) {
115 return v.toString();
116 }
117 }
118 }
119 }
120 return null;
121 }
122
123 public boolean isStarted() {
124 return started;
125 }
126
127 public void start() {
128
129 int errorCount = 0;
130
131 if (defaultValue == null) {
132 addError("\"DefaultValue\" property must be set.");
133 }
134 if (fieldName == null) {
135 addError("\"FieldName\" property must be set.");
136 errorCount++;
137 }
138
139 switch (fieldName) {
140 case SESSION_ATTRIBUTE:
141 case REQUEST_ATTRIBUTE:
142 case COOKIE:
143 if (additionalKey == null) {
144 addError("\"OptionalKey\" property is mandatory for field name "
145 + fieldName.toString());
146 errorCount++;
147 }
148 }
149
150 if (errorCount == 0) {
151 started = true;
152 }
153 }
154
155 public void stop() {
156 started = false;
157 }
158
159 public void setFieldName(FieldName fieldName) {
160 this.fieldName = fieldName;
161 }
162
163 public FieldName getFieldName() {
164 return fieldName;
165 }
166
167 public String getAdditionalKey() {
168 return additionalKey;
169 }
170
171 public void setAdditionalKey(String additionalKey) {
172 this.additionalKey = additionalKey;
173 }
174
175
176
177
178
179 public String getDefaultValue() {
180 return defaultValue;
181 }
182
183
184
185
186
187
188
189 public void setDefaultValue(String defaultValue) {
190 this.defaultValue = defaultValue;
191 }
192
193 public String getKey() {
194 return key;
195 }
196
197 public void setKey(String key) {
198 this.key = key;
199 }
200
201 }