Source code: org/acegisecurity/intercept/web/FilterInvocationDefinitionSourceEditor.java
1 /* Copyright 2004 Acegi Technology Pty Limited
2 *
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
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 //~ Static fields/initializers =============================================
57
58 private static final Log logger = LogFactory.getLog(FilterInvocationDefinitionSourceEditor.class);
59
60 //~ Methods ================================================================
61
62 public void setAsText(String s) throws IllegalArgumentException {
63 FilterInvocationDefinitionMap source = new RegExpBasedFilterInvocationDefinitionMap();
64
65 if ((s == null) || "".equals(s)) {
66 // Leave target object empty
67 } else {
68 // Check if we need to override the default definition map
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 // Tokenize the line into its name/value tokens
120 String[] nameValue = StringUtils.delimitedListToStringArray(line,
121 "=");
122 String name = nameValue[0];
123 String value = nameValue[1];
124
125 // Convert value to series of security configuration attributes
126 ConfigAttributeEditor configAttribEd = new ConfigAttributeEditor();
127 configAttribEd.setAsText(value);
128
129 ConfigAttributeDefinition attr = (ConfigAttributeDefinition) configAttribEd
130 .getValue();
131
132 // Register the regular expression and its attribute
133 source.addSecureUrl(name, attr);
134 }
135 }
136
137 setValue(source);
138 }
139 }