1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.acegisecurity.intercept.web;
17
18 import org.acegisecurity.ConfigAttributeDefinition;
19 import org.acegisecurity.ConfigAttributeEditor;
20
21 import org.apache.commons.logging.Log;
22 import org.apache.commons.logging.LogFactory;
23
24 import org.springframework.util.StringUtils;
25
26 import java.beans.PropertyEditorSupport;
27
28 import java.io.BufferedReader;
29 import java.io.IOException;
30 import java.io.StringReader;
31
32
33 /***
34 * Property editor to assist with the setup of a {@link
35 * FilterInvocationDefinitionSource}.
36 *
37 * <p>
38 * The class creates and populates a {@link
39 * RegExpBasedFilterInvocationDefinitionMap} or {@link
40 * PathBasedFilterInvocationDefinitionMap} (depending on the type of patterns
41 * presented).
42 * </p>
43 *
44 * <P>
45 * By default the class treats presented patterns as regular expressions. If
46 * the keyword <code>PATTERN_TYPE_APACHE_ANT</code> is present (case
47 * sensitive), patterns will be treated as Apache Ant paths rather than
48 * regular expressions.
49 * </p>
50 *
51 * @author Ben Alex
52 * @version $Id: FilterInvocationDefinitionSourceEditor.java,v 1.3 2005/11/17 00:55:50 benalex Exp $
53 */
54 public class FilterInvocationDefinitionSourceEditor
55 extends PropertyEditorSupport {
56
57
58 private static final Log logger = LogFactory.getLog(FilterInvocationDefinitionSourceEditor.class);
59
60
61
62 public void setAsText(String s) throws IllegalArgumentException {
63 FilterInvocationDefinitionMap source = new RegExpBasedFilterInvocationDefinitionMap();
64
65 if ((s == null) || "".equals(s)) {
66
67 } else {
68
69 if (s.lastIndexOf("PATTERN_TYPE_APACHE_ANT") != -1) {
70 source = new PathBasedFilterInvocationDefinitionMap();
71
72 if (logger.isDebugEnabled()) {
73 logger.debug(("Detected PATTERN_TYPE_APACHE_ANT directive; using Apache Ant style path expressions"));
74 }
75 }
76
77 BufferedReader br = new BufferedReader(new StringReader(s));
78 int counter = 0;
79 String line;
80
81 while (true) {
82 counter++;
83
84 try {
85 line = br.readLine();
86 } catch (IOException ioe) {
87 throw new IllegalArgumentException(ioe.getMessage());
88 }
89
90 if (line == null) {
91 break;
92 }
93
94 line = line.trim();
95
96 if (logger.isDebugEnabled()) {
97 logger.debug("Line " + counter + ": " + line);
98 }
99
100 if (line.startsWith("//")) {
101 continue;
102 }
103
104 if (line.equals("CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON")) {
105 if (logger.isDebugEnabled()) {
106 logger.debug("Line " + counter
107 + ": Instructing mapper to convert URLs to lowercase before comparison");
108 }
109
110 source.setConvertUrlToLowercaseBeforeComparison(true);
111
112 continue;
113 }
114
115 if (line.lastIndexOf('=') == -1) {
116 continue;
117 }
118
119
120 String[] nameValue = StringUtils.delimitedListToStringArray(line,
121 "=");
122 String name = nameValue[0];
123 String value = nameValue[1];
124
125
126 ConfigAttributeEditor configAttribEd = new ConfigAttributeEditor();
127 configAttribEd.setAsText(value);
128
129 ConfigAttributeDefinition attr = (ConfigAttributeDefinition) configAttribEd
130 .getValue();
131
132
133 source.addSecureUrl(name, attr);
134 }
135 }
136
137 setValue(source);
138 }
139 }