1 package org.apache.commons.digester3.binder;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import static java.lang.String.format;
23
24 import java.util.ArrayList;
25 import java.util.List;
26
27 import org.apache.commons.digester3.RuleSet;
28
29
30
31
32
33
34 final class DefaultRulesBinder
35 implements RulesBinder
36 {
37
38
39
40
41 private final List<ErrorMessage> errors = new ArrayList<ErrorMessage>();
42
43
44
45
46 private final FromBinderRuleSet fromBinderRuleSet = new FromBinderRuleSet();
47
48
49
50
51 private ClassLoader classLoader;
52
53
54
55
56
57
58 void initialize( ClassLoader classLoader )
59 {
60 this.classLoader = classLoader;
61 fromBinderRuleSet.clear();
62 errors.clear();
63 }
64
65
66
67
68 public ClassLoader getContextClassLoader()
69 {
70 return this.classLoader;
71 }
72
73
74
75
76 public void addError( String messagePattern, Object... arguments )
77 {
78 StackTraceElement[] stackTrace = new Exception().getStackTrace();
79 StackTraceElement element = null;
80
81 int stackIndex = stackTrace.length - 1;
82 while ( element == null && stackIndex > 0 )
83 {
84 Class<?> moduleClass;
85 try
86 {
87
88 moduleClass = Class.forName( stackTrace[stackIndex].getClassName(), false, this.classLoader );
89 }
90 catch ( ClassNotFoundException e )
91 {
92 try
93 {
94
95 moduleClass =
96 Class.forName( stackTrace[stackIndex].getClassName(), false, this.getClass().getClassLoader() );
97 }
98 catch ( ClassNotFoundException e1 )
99 {
100
101
102 moduleClass = null;
103 }
104 }
105
106 if ( moduleClass != null && RulesModule.class.isAssignableFrom( moduleClass ) )
107 {
108 element = stackTrace[stackIndex];
109 }
110
111 stackIndex--;
112 }
113
114 if ( element != null )
115 {
116 messagePattern = format( "%s (%s:%s)", messagePattern, element.getFileName(), element.getLineNumber() );
117 }
118 addError( new ErrorMessage( messagePattern, arguments ) );
119 }
120
121
122
123
124 public void addError( Throwable t )
125 {
126 String message = "An exception was caught and reported. Message: " + t.getMessage();
127 addError( new ErrorMessage( message, t ) );
128 }
129
130
131
132
133
134
135
136 private void addError( ErrorMessage errorMessage )
137 {
138 this.errors.add( errorMessage );
139 }
140
141
142
143
144 public void install( RulesModule rulesModule )
145 {
146 rulesModule.configure( this );
147 }
148
149
150
151
152 public LinkedRuleBuilder forPattern( String pattern )
153 {
154 final String keyPattern;
155
156 if ( pattern == null || pattern.length() == 0 )
157 {
158 addError( "Null or empty pattern is not valid" );
159 keyPattern = null;
160 }
161 else
162 {
163 if ( pattern.endsWith( "/" ) )
164 {
165
166 keyPattern = pattern.substring( 0, pattern.length() - 1 );
167 }
168 else
169 {
170 keyPattern = pattern;
171 }
172 }
173
174 return new LinkedRuleBuilder( this, fromBinderRuleSet, classLoader, keyPattern );
175 }
176
177
178
179
180
181
182 boolean hasError()
183 {
184 return !errors.isEmpty();
185 }
186
187
188
189
190
191
192 int errorsSize()
193 {
194 return errors.size();
195 }
196
197
198
199
200
201
202 Iterable<ErrorMessage> getErrors()
203 {
204 return errors;
205 }
206
207
208
209
210
211
212 RuleSet getFromBinderRuleSet()
213 {
214 return fromBinderRuleSet;
215 }
216
217 }