1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.jetspeed.profiler.rules.impl;
18
19 import java.util.Iterator;
20 import java.util.StringTokenizer;
21
22 import org.apache.commons.logging.Log;
23 import org.apache.commons.logging.LogFactory;
24 import org.apache.jetspeed.profiler.ProfileLocator;
25 import org.apache.jetspeed.profiler.Profiler;
26 import org.apache.jetspeed.profiler.rules.ProfileResolvers;
27 import org.apache.jetspeed.profiler.rules.ProfilingRule;
28 import org.apache.jetspeed.profiler.rules.RuleCriterion;
29 import org.apache.jetspeed.profiler.rules.RuleCriterionResolver;
30 import org.apache.jetspeed.request.RequestContext;
31
32 /***
33 * RoleFallbackProfilingRule
34 *
35 * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
36 * @version $Id: RoleFallbackProfilingRule.java 517121 2007-03-12 07:45:49Z ate $
37 */
38 public class RoleFallbackProfilingRule
39 extends AbstractProfilingRule
40 implements ProfilingRule
41 {
42 protected final static Log log = LogFactory.getLog(RoleFallbackProfilingRule.class);
43 private final static long serialVersionUID = 1L;
44
45 public RoleFallbackProfilingRule()
46 {
47 this.setClassname(this.getClass().getName());
48
49 }
50
51 public RoleFallbackProfilingRule(ProfileResolvers resolvers)
52 {
53 super(resolvers);
54 this.setClassname(this.getClass().getName());
55 }
56
57
58
59
60
61 public ProfileLocator apply(RequestContext context, Profiler service)
62 {
63 StringBuffer key = new StringBuffer();
64 int count = 0;
65
66
67 Iterator criteria = this.getRuleCriteria().iterator();
68 while (criteria.hasNext())
69 {
70 RuleCriterion criterion = (RuleCriterion)criteria.next();
71 if (criterion.getType() == null)
72 {
73 log.warn("Invalid criterion provided - type null on rule " + this);
74 }
75 RuleCriterionResolver resolver = getResolver(criterion.getType());
76 if (resolver == null)
77 {
78 resolver = getDefaultResolver();
79 }
80 String value = resolver.resolve(context, criterion);
81 if (value != null && (resolver instanceof RoleCriterionResolver ||
82 resolver instanceof GroupCriterionResolver))
83 {
84 StringTokenizer tokenizer = new StringTokenizer(value, StandardResolver.VALUE_DELIMITER);
85 while (tokenizer.hasMoreTokens())
86 {
87 String token = tokenizer.nextToken();
88 key.append(criterion.getName());
89 key.append(ProfileLocator.PATH_SEPARATOR);
90 key.append(token);
91 if (tokenizer.hasMoreTokens())
92 {
93 key.append(ProfileLocator.PATH_SEPARATOR);
94 }
95 }
96 }
97 else
98 {
99 key.append(criterion.getName());
100 key.append(ProfileLocator.PATH_SEPARATOR);
101 key.append(value);
102 }
103 if (criteria.hasNext())
104 {
105 key.append(ProfileLocator.PATH_SEPARATOR);
106 }
107 count++;
108 }
109
110
111 String requestPath = context.getPath();
112 String locatorKey = ((requestPath != null) ? requestPath : "/") + ProfileLocator.PATH_SEPARATOR + key.toString();
113 ProfileLocator locator = getLocatorFromCache(locatorKey);
114 if (locator != null)
115 {
116 return locator;
117 }
118
119
120 locator = service.createLocator(context);
121 criteria = this.getRuleCriteria().iterator();
122 while (criteria.hasNext())
123 {
124 RuleCriterion criterion = (RuleCriterion)criteria.next();
125 if (criterion.getType() == null)
126 {
127 log.warn("Invalid criterion provided - name or type null on rule " + this);
128 }
129 RuleCriterionResolver resolver = getResolver(criterion.getType());
130 if (resolver != null)
131 {
132 String value = resolver.resolve(context, criterion);
133 boolean isControl = resolver.isControl(criterion);
134 boolean isNavigation = resolver.isNavigation(criterion);
135 if (value != null && (resolver instanceof RoleCriterionResolver ||
136 resolver instanceof GroupCriterionResolver))
137 {
138 StringTokenizer tokenizer = new StringTokenizer(value, StandardResolver.VALUE_DELIMITER);
139 while (tokenizer.hasMoreTokens())
140 {
141 String token = tokenizer.nextToken();
142 locator.add(criterion, isControl, isNavigation, token);
143 }
144 }
145 else
146 {
147 locator.add(criterion, isControl, isNavigation, value);
148 }
149 }
150 }
151
152 addLocatorToCache(locatorKey, locator);
153 return locator;
154
155 }
156 }