svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.expressionevaluator / org.gvsig.expressionevaluator.lib / org.gvsig.expressionevaluator.lib.impl / src / main / java / org / gvsig / expressionevaluator / impl / DefaultExpressionEvaluatorManager.java @ 44769
History | View | Annotate | Download (15.9 KB)
1 | 43521 | jjdelcerro | package org.gvsig.expressionevaluator.impl; |
---|---|---|---|
2 | |||
3 | 44389 | jjdelcerro | import java.io.StringWriter; |
4 | 44339 | jjdelcerro | import java.net.URI; |
5 | 44644 | jjdelcerro | import java.util.ArrayList; |
6 | 44139 | jjdelcerro | import org.gvsig.expressionevaluator.Grammar; |
7 | import org.gvsig.expressionevaluator.GrammarFactory; |
||
8 | 43983 | jjdelcerro | import java.util.Collection; |
9 | 44750 | jjdelcerro | import java.util.Collections; |
10 | 43939 | jjdelcerro | import java.util.HashMap; |
11 | 44644 | jjdelcerro | import java.util.List; |
12 | 43939 | jjdelcerro | import java.util.Map; |
13 | 44389 | jjdelcerro | import java.util.Objects; |
14 | 44392 | jjdelcerro | import java.util.regex.Matcher; |
15 | import java.util.regex.Pattern; |
||
16 | 44339 | jjdelcerro | import org.apache.commons.io.FilenameUtils; |
17 | import org.apache.commons.io.IOUtils; |
||
18 | 44389 | jjdelcerro | import org.apache.commons.lang3.ArrayUtils; |
19 | import org.apache.commons.lang3.StringUtils; |
||
20 | 43521 | jjdelcerro | import org.gvsig.expressionevaluator.Code; |
21 | import org.gvsig.expressionevaluator.CodeBuilder; |
||
22 | 43983 | jjdelcerro | import org.gvsig.expressionevaluator.Expression; |
23 | 44006 | jjdelcerro | import org.gvsig.expressionevaluator.ExpressionBuilder; |
24 | 43521 | jjdelcerro | import org.gvsig.expressionevaluator.ExpressionEvaluatorManager; |
25 | import org.gvsig.expressionevaluator.Interpreter; |
||
26 | import org.gvsig.expressionevaluator.LexicalAnalyzer; |
||
27 | import org.gvsig.expressionevaluator.MutableSymbolTable; |
||
28 | 44009 | jjdelcerro | import org.gvsig.expressionevaluator.Optimizer; |
29 | 43521 | jjdelcerro | import org.gvsig.expressionevaluator.SymbolTable; |
30 | 44126 | jjdelcerro | import org.gvsig.expressionevaluator.SymbolTableFactory; |
31 | 44139 | jjdelcerro | import org.gvsig.expressionevaluator.Compiler; |
32 | 44769 | jjdelcerro | import org.gvsig.expressionevaluator.Formatter; |
33 | 44139 | jjdelcerro | import org.gvsig.expressionevaluator.GrammarSet; |
34 | 44644 | jjdelcerro | import org.gvsig.expressionevaluator.ReprMethod; |
35 | import org.gvsig.expressionevaluator.impl.repr.ReprNull; |
||
36 | import org.gvsig.expressionevaluator.impl.repr.ReprObject; |
||
37 | 44769 | jjdelcerro | import org.gvsig.expressionevaluator.spi.formatter.value.BaseFormatter; |
38 | 44390 | jjdelcerro | import org.gvsig.tools.bookmarksandhistory.Bookmarks; |
39 | import org.gvsig.tools.bookmarksandhistory.History; |
||
40 | import org.gvsig.tools.bookmarksandhistory.impl.BaseBookmarks; |
||
41 | import org.gvsig.tools.bookmarksandhistory.impl.BaseHistory; |
||
42 | 44392 | jjdelcerro | import org.gvsig.tools.resourcesstorage.ResourcesStorage; |
43 | 44339 | jjdelcerro | import org.gvsig.tools.script.Script; |
44 | 44006 | jjdelcerro | import org.slf4j.Logger; |
45 | import org.slf4j.LoggerFactory; |
||
46 | 43521 | jjdelcerro | |
47 | |||
48 | 44339 | jjdelcerro | @SuppressWarnings("UseSpecificCatch") |
49 | 43521 | jjdelcerro | public class DefaultExpressionEvaluatorManager implements ExpressionEvaluatorManager { |
50 | |||
51 | 44006 | jjdelcerro | private static final Logger LOGGER = LoggerFactory.getLogger(DefaultExpressionEvaluatorManager.class); |
52 | |||
53 | 43521 | jjdelcerro | private Double accuracy; |
54 | 44126 | jjdelcerro | private final Map<String,SymbolTableFactory>symbolTableFactories; |
55 | 44139 | jjdelcerro | private final Map<String,GrammarFactory> grammarFactories; |
56 | 44390 | jjdelcerro | private Bookmarks<Expression> bookmarks; |
57 | private History<Expression> history; |
||
58 | 44446 | jjdelcerro | private SymbolTable inmutableSymbolTable;
|
59 | 44533 | jjdelcerro | private ResourcesStorage scriptsResourcesStorage;
|
60 | 44750 | jjdelcerro | private List<ClassLoader> loaders; |
61 | 44769 | jjdelcerro | private Formatter<ExpressionBuilder.Value> expressionBuilderFormatter; |
62 | 43521 | jjdelcerro | |
63 | public DefaultExpressionEvaluatorManager() {
|
||
64 | 44126 | jjdelcerro | this.symbolTableFactories = new HashMap<>(); |
65 | 44139 | jjdelcerro | this.grammarFactories = new HashMap<>(); |
66 | 44750 | jjdelcerro | this.loaders = new ArrayList<>(); |
67 | 44533 | jjdelcerro | this.scriptsResourcesStorage = ResourcesStorage.EMPTY_RESOURCESSTORAGE;
|
68 | 44750 | jjdelcerro | this.loaders.add(this.getClass().getClassLoader()); |
69 | 44769 | jjdelcerro | this.expressionBuilderFormatter = new BaseFormatter(); |
70 | 43939 | jjdelcerro | } |
71 | |||
72 | 43521 | jjdelcerro | @Override
|
73 | 43983 | jjdelcerro | public SymbolTable getSymbolTable(String name) { |
74 | 44126 | jjdelcerro | if( name == null ) { |
75 | return null; |
||
76 | } |
||
77 | SymbolTableFactory factory = this.symbolTableFactories.get(name.toUpperCase());
|
||
78 | if( factory == null ) { |
||
79 | return null; |
||
80 | } |
||
81 | 44389 | jjdelcerro | return factory.create();
|
82 | 43939 | jjdelcerro | } |
83 | |||
84 | @Override
|
||
85 | 44126 | jjdelcerro | public Collection<SymbolTableFactory> getSymbolTableFactories() { |
86 | return this.symbolTableFactories.values(); |
||
87 | 43939 | jjdelcerro | } |
88 | |||
89 | @Override
|
||
90 | 44126 | jjdelcerro | public final void registerSymbolTable(SymbolTableFactory factory) { |
91 | if( factory == null ) { |
||
92 | throw new IllegalArgumentException("factory can't be null"); |
||
93 | 44006 | jjdelcerro | } |
94 | 44126 | jjdelcerro | this.symbolTableFactories.put(factory.getName().toUpperCase(),factory);
|
95 | 44446 | jjdelcerro | this.inmutableSymbolTable = null; |
96 | 43939 | jjdelcerro | } |
97 | 43987 | jjdelcerro | |
98 | 43939 | jjdelcerro | @Override
|
99 | 44446 | jjdelcerro | public SymbolTable getInmutableSymbolTable() {
|
100 | if( this.inmutableSymbolTable==null ) { |
||
101 | this.inmutableSymbolTable = new InmutableSymbolTable(); |
||
102 | } |
||
103 | return this.inmutableSymbolTable; |
||
104 | } |
||
105 | |||
106 | @Override
|
||
107 | 43521 | jjdelcerro | public Object evaluate(String source) { |
108 | DefaultInterpreter interpreter = new DefaultInterpreter();
|
||
109 | 44644 | jjdelcerro | DefaultCompiler compiler = new DefaultCompiler(this); |
110 | 43521 | jjdelcerro | Code code = compiler.compileExpression(source); |
111 | return interpreter.run(code);
|
||
112 | } |
||
113 | 44389 | jjdelcerro | |
114 | 43521 | jjdelcerro | @Override
|
115 | public Object evaluate(SymbolTable symbolTable, String source) { |
||
116 | DefaultInterpreter interpreter = new DefaultInterpreter();
|
||
117 | 44644 | jjdelcerro | DefaultCompiler compiler = new DefaultCompiler(this); |
118 | 43521 | jjdelcerro | Code code = compiler.compileExpression(source); |
119 | 44446 | jjdelcerro | if( symbolTable!=null ) { |
120 | interpreter.setSymbolTable(symbolTable); |
||
121 | } |
||
122 | 43521 | jjdelcerro | return interpreter.run(code);
|
123 | } |
||
124 | |||
125 | @Override
|
||
126 | public Object evaluate(SymbolTable symbolTable, Code code) { |
||
127 | DefaultInterpreter interpreter = new DefaultInterpreter();
|
||
128 | 44446 | jjdelcerro | if( symbolTable!=null ) { |
129 | interpreter.setSymbolTable(symbolTable); |
||
130 | } |
||
131 | 43521 | jjdelcerro | return interpreter.run(code);
|
132 | } |
||
133 | |||
134 | @Override
|
||
135 | 44397 | jjdelcerro | public String evaluateDynamicText(String source) { |
136 | return evaluateDynamicText(null, source); |
||
137 | 44389 | jjdelcerro | } |
138 | |||
139 | @Override
|
||
140 | 44397 | jjdelcerro | public boolean isDynamicText(String source) { |
141 | 44389 | jjdelcerro | String[] sources = StringUtils.substringsBetween(source, "<%", "%>"); |
142 | if( ArrayUtils.isEmpty(sources) ) {
|
||
143 | 44397 | jjdelcerro | return false; |
144 | } |
||
145 | return true; |
||
146 | } |
||
147 | |||
148 | @Override
|
||
149 | public String evaluateDynamicText(SymbolTable symbolTable, String source) { |
||
150 | String[] sources = StringUtils.substringsBetween(source, "<%", "%>"); |
||
151 | if( ArrayUtils.isEmpty(sources) ) {
|
||
152 | 44389 | jjdelcerro | return source;
|
153 | } |
||
154 | String[] values = new String[sources.length]; |
||
155 | |||
156 | DefaultInterpreter interpreter = new DefaultInterpreter();
|
||
157 | if( symbolTable!=null ) { |
||
158 | interpreter.setSymbolTable(symbolTable); |
||
159 | } |
||
160 | StringWriter writer = new StringWriter(); |
||
161 | interpreter.setWriter(writer); |
||
162 | 44644 | jjdelcerro | DefaultCompiler compiler = new DefaultCompiler(this); |
163 | 44389 | jjdelcerro | for (int i = 0; i < sources.length; i++) { |
164 | String theSource = sources[i];
|
||
165 | if( StringUtils.startsWith(theSource, "=") ) { |
||
166 | Code code = compiler.compileExpression(theSource.substring(1));
|
||
167 | Object value = interpreter.run(code);
|
||
168 | values[i] = Objects.toString(value, "");
|
||
169 | } else {
|
||
170 | Code code = compiler.compileExpression(theSource.substring(1));
|
||
171 | writer.getBuffer().setLength(0);
|
||
172 | interpreter.run(code); |
||
173 | values[i] = writer.toString(); |
||
174 | } |
||
175 | 44390 | jjdelcerro | sources[i] = "<%"+sources[i]+"%>"; |
176 | 44389 | jjdelcerro | } |
177 | String output = StringUtils.replaceEach(source, sources, values);
|
||
178 | return output;
|
||
179 | } |
||
180 | |||
181 | @Override
|
||
182 | 43521 | jjdelcerro | public Code compile(String source) { |
183 | 44139 | jjdelcerro | Compiler compiler = this.createCompiler(); |
184 | 43521 | jjdelcerro | return compiler.compileExpression(source);
|
185 | } |
||
186 | |||
187 | @Override
|
||
188 | public Code compile(LexicalAnalyzer lex, String source) { |
||
189 | 44139 | jjdelcerro | Compiler compiler = this.createCompiler(); |
190 | 43521 | jjdelcerro | compiler.setLexicalAnalyzer(lex); |
191 | return compiler.compileExpression(source);
|
||
192 | } |
||
193 | |||
194 | @Override
|
||
195 | 44019 | jjdelcerro | public Code optimize(SymbolTable symbolTable, Code code) {
|
196 | Optimizer optimizer = this.createOptimizer();
|
||
197 | return optimizer.optimize(symbolTable, code);
|
||
198 | } |
||
199 | |||
200 | @Override
|
||
201 | 43521 | jjdelcerro | public MutableSymbolTable createSymbolTable() {
|
202 | 43987 | jjdelcerro | DefaultSymbolTable theSymbolTable = new DefaultSymbolTable();
|
203 | return theSymbolTable;
|
||
204 | 43521 | jjdelcerro | } |
205 | 43939 | jjdelcerro | |
206 | 43987 | jjdelcerro | public void populateSymbolTable(SymbolTable aSymbolTable) { |
207 | 44126 | jjdelcerro | for (SymbolTableFactory factory : this.getSymbolTableFactories() ) { |
208 | 44394 | jjdelcerro | try {
|
209 | if( factory.isAutoload() ) {
|
||
210 | SymbolTable symbolTable = factory.create(); |
||
211 | aSymbolTable.addSymbolTable(symbolTable); |
||
212 | } |
||
213 | } catch(Throwable th) { |
||
214 | String factoryName = "Unknown"; |
||
215 | try {
|
||
216 | factoryName = factory.getName(); |
||
217 | } catch(Throwable th2) { |
||
218 | // Do nothing
|
||
219 | } |
||
220 | LOGGER.warn("Can't create symbol table '"+factoryName+"'.", th); |
||
221 | 43987 | jjdelcerro | } |
222 | } |
||
223 | } |
||
224 | |||
225 | 43521 | jjdelcerro | @Override
|
226 | public LexicalAnalyzer createLexicalAnalyzer() {
|
||
227 | return new SQLLexicalAnalyzer(); |
||
228 | } |
||
229 | |||
230 | @Override
|
||
231 | public CodeBuilder createCodeBuilder() {
|
||
232 | 44644 | jjdelcerro | return new DefaultCodeBuilder(this); |
233 | 43521 | jjdelcerro | } |
234 | |||
235 | @Override
|
||
236 | public Compiler createCompiler() { |
||
237 | 44644 | jjdelcerro | DefaultCompiler compiler = new DefaultCompiler(this); |
238 | 44139 | jjdelcerro | this.populateGrammars(compiler);
|
239 | return compiler;
|
||
240 | 43521 | jjdelcerro | } |
241 | |||
242 | @Override
|
||
243 | public Interpreter createInterpreter() {
|
||
244 | 44533 | jjdelcerro | Interpreter interpreter = new DefaultInterpreter();
|
245 | interpreter.setResourcesStorage(this.scriptsResourcesStorage);
|
||
246 | return interpreter;
|
||
247 | 43521 | jjdelcerro | } |
248 | |||
249 | @Override
|
||
250 | public Double getAccuracy() { |
||
251 | return this.accuracy; |
||
252 | } |
||
253 | |||
254 | @Override
|
||
255 | public void setAccuracy(Double accuracy) { |
||
256 | this.accuracy = accuracy;
|
||
257 | } |
||
258 | 43983 | jjdelcerro | |
259 | @Override
|
||
260 | public Expression createExpression() { |
||
261 | 44644 | jjdelcerro | DefaultExpression e = new DefaultExpression(this); |
262 | 43983 | jjdelcerro | return e;
|
263 | } |
||
264 | 44006 | jjdelcerro | |
265 | @Override
|
||
266 | public ExpressionBuilder createExpressionBuilder() {
|
||
267 | 44644 | jjdelcerro | ExpressionBuilder x = new DefaultExpressionBuilder(this); |
268 | 44006 | jjdelcerro | return x;
|
269 | } |
||
270 | 44009 | jjdelcerro | |
271 | @Override
|
||
272 | public Optimizer createOptimizer() {
|
||
273 | 44644 | jjdelcerro | Optimizer x = new DefaultOptimizer(this); |
274 | 44009 | jjdelcerro | return x;
|
275 | } |
||
276 | 44139 | jjdelcerro | |
277 | @Override
|
||
278 | public void registerGrammar(GrammarFactory factory) { |
||
279 | if( factory==null ) { |
||
280 | throw new IllegalArgumentException("factory can't be null"); |
||
281 | } |
||
282 | this.grammarFactories.put(factory.getName(), factory);
|
||
283 | } |
||
284 | |||
285 | @Override
|
||
286 | public Collection<GrammarFactory> getGrammarFactories() { |
||
287 | return this.grammarFactories.values(); |
||
288 | } |
||
289 | |||
290 | public void populateGrammars(Compiler compiler) { |
||
291 | GrammarSet grammarSet = compiler.getGrammars(); |
||
292 | for (GrammarFactory factory : this.getGrammarFactories() ) { |
||
293 | if( factory.isAutoload() ) {
|
||
294 | 44389 | jjdelcerro | Grammar grammar = factory.create(); |
295 | 44139 | jjdelcerro | grammarSet.add(grammar); |
296 | } |
||
297 | } |
||
298 | } |
||
299 | |||
300 | 44263 | jjdelcerro | @Override
|
301 | 44139 | jjdelcerro | public Grammar createGrammar(String name) { |
302 | DefaultGrammar grammar = new DefaultGrammar(name);
|
||
303 | return grammar;
|
||
304 | } |
||
305 | 44263 | jjdelcerro | |
306 | @Override
|
||
307 | 44390 | jjdelcerro | public Bookmarks<Expression> getBookmarks() { |
308 | 44263 | jjdelcerro | if( this.bookmarks==null ) { |
309 | 44392 | jjdelcerro | this.bookmarks = new BaseBookmarks<>(); |
310 | 44263 | jjdelcerro | } |
311 | return this.bookmarks; |
||
312 | } |
||
313 | |||
314 | @Override
|
||
315 | 44390 | jjdelcerro | public History<Expression> getHistory() { |
316 | 44263 | jjdelcerro | if( this.history==null ) { |
317 | 44392 | jjdelcerro | this.history = new BaseHistory<>(20); |
318 | 44263 | jjdelcerro | } |
319 | return this.history; |
||
320 | } |
||
321 | 44339 | jjdelcerro | |
322 | @Override
|
||
323 | public Script createScript(String name, String code, String languaje) { |
||
324 | 44389 | jjdelcerro | SimpleScript sc = new SimpleScript(this.createInterpreter(), name, code); |
325 | 44339 | jjdelcerro | return sc;
|
326 | } |
||
327 | |||
328 | @Override
|
||
329 | public Script locateScript(String name) { |
||
330 | 44533 | jjdelcerro | return loadScript(this.scriptsResourcesStorage, name); |
331 | 44339 | jjdelcerro | } |
332 | |||
333 | @Override
|
||
334 | 44392 | jjdelcerro | public Script loadScript(final URI location) { |
335 | ResourcesStorage.Resource res = null;
|
||
336 | 44339 | jjdelcerro | try {
|
337 | 44392 | jjdelcerro | if( location==null ) { |
338 | return null; |
||
339 | } |
||
340 | 44710 | jjdelcerro | String resourceName = FilenameUtils.getBaseName(location.getPath());
|
341 | res = ResourcesStorage.createResource(resourceName, location); |
||
342 | 44392 | jjdelcerro | if( res == null || !res.exists() ) { |
343 | return null; |
||
344 | } |
||
345 | 44710 | jjdelcerro | Script script = loadScript(res, resourceName); |
346 | 44392 | jjdelcerro | return script;
|
347 | } catch (Exception ex) { |
||
348 | LOGGER.warn("Can't load script from URI.", ex);
|
||
349 | 44339 | jjdelcerro | return null; |
350 | } finally {
|
||
351 | 44392 | jjdelcerro | IOUtils.closeQuietly(res); |
352 | 44339 | jjdelcerro | } |
353 | } |
||
354 | 44392 | jjdelcerro | |
355 | |||
356 | @Override
|
||
357 | public Script loadScript(ResourcesStorage storage, String name) { |
||
358 | ResourcesStorage.Resource res = null;
|
||
359 | try {
|
||
360 | if( storage==null ) { |
||
361 | return null; |
||
362 | } |
||
363 | res = storage.getResource(name); |
||
364 | if( res == null || !res.exists() ) { |
||
365 | return null; |
||
366 | } |
||
367 | Script script = loadScript(res, name); |
||
368 | return script;
|
||
369 | } catch (Exception ex) { |
||
370 | LOGGER.warn("Can't load script from resources storage.", ex);
|
||
371 | return null; |
||
372 | } finally {
|
||
373 | IOUtils.closeQuietly(res); |
||
374 | } |
||
375 | |||
376 | } |
||
377 | |||
378 | 44592 | jjdelcerro | private static final Pattern RE_LANG = Pattern.compile(".*lang[:]\\s*([a-zA-Z_][a-zA-Z_0-9_]*).*"); |
379 | private static final Pattern RE_ENCODING = Pattern.compile(".*encoding[:]\\s*([a-zA-Z_][a-zA-Z0-9_-]*).*"); |
||
380 | 44392 | jjdelcerro | |
381 | private Script loadScript(ResourcesStorage.Resource res, String name) { |
||
382 | try {
|
||
383 | if( res == null || !res.exists() ) { |
||
384 | return null; |
||
385 | } |
||
386 | byte[] head_bytes = new byte[500]; |
||
387 | IOUtils.read(res.asInputStream(), head_bytes); |
||
388 | IOUtils.closeQuietly(res); |
||
389 | String head = new String(head_bytes); |
||
390 | if( StringUtils.isEmpty(head) ) {
|
||
391 | return null; |
||
392 | } |
||
393 | 44592 | jjdelcerro | head = StringUtils.split(head, "\n")[0]; |
394 | 44339 | jjdelcerro | |
395 | 44392 | jjdelcerro | String lang = "cosa"; |
396 | String encoding = null; |
||
397 | Matcher m = RE_LANG.matcher(head);
|
||
398 | 44592 | jjdelcerro | if( m!=null && m.matches() && m.groupCount()==1 ) { |
399 | 44392 | jjdelcerro | String s = m.group(1); |
400 | if( !StringUtils.isBlank(s) ) {
|
||
401 | lang = s; |
||
402 | } |
||
403 | } |
||
404 | m = RE_ENCODING.matcher(head); |
||
405 | 44592 | jjdelcerro | if( m!=null && m.matches() && m.groupCount()==1 ) { |
406 | 44392 | jjdelcerro | String s = m.group(1); |
407 | if( !StringUtils.isBlank(s) ) {
|
||
408 | encoding = s; |
||
409 | } |
||
410 | } |
||
411 | |||
412 | String source;
|
||
413 | if( StringUtils.isBlank(encoding) ) {
|
||
414 | source = IOUtils.toString(res.asInputStream()); |
||
415 | } else {
|
||
416 | source = IOUtils.toString(res.asInputStream(), encoding); |
||
417 | } |
||
418 | Script script = this.createScript(name, source, lang);
|
||
419 | return script;
|
||
420 | } catch (Exception ex) { |
||
421 | LOGGER.warn("Can't load script from resource.", ex);
|
||
422 | return null; |
||
423 | } finally {
|
||
424 | IOUtils.closeQuietly(res); |
||
425 | } |
||
426 | |||
427 | } |
||
428 | 44533 | jjdelcerro | |
429 | @Override
|
||
430 | public ResourcesStorage getScriptsResourcesStorage() {
|
||
431 | return this.scriptsResourcesStorage; |
||
432 | } |
||
433 | |||
434 | @Override
|
||
435 | public void setScriptsResourcesStorage(ResourcesStorage scriptsResourcesStorage) { |
||
436 | this.scriptsResourcesStorage = scriptsResourcesStorage;
|
||
437 | } |
||
438 | 44644 | jjdelcerro | |
439 | 44533 | jjdelcerro | |
440 | 44644 | jjdelcerro | private final List<ReprMethod> reprMethods = new ArrayList<>(); |
441 | private final Map<Class,ReprMethod> reprMethodsCache = new HashMap<>(); |
||
442 | private final ReprMethod reprNull = new ReprNull(); |
||
443 | private final ReprMethod reprObject = new ReprObject(); |
||
444 | |||
445 | @Override
|
||
446 | public void addReprMethod(ReprMethod method) { |
||
447 | this.reprMethods.add(method);
|
||
448 | this.reprMethodsCache.clear();
|
||
449 | } |
||
450 | |||
451 | @Override
|
||
452 | public ReprMethod getReprMethod(Object value) { |
||
453 | if( value == null ) { |
||
454 | return this.reprNull; |
||
455 | } |
||
456 | ReprMethod method = this.reprMethodsCache.get(value.getClass());
|
||
457 | if( method!=null ) { |
||
458 | return method;
|
||
459 | } |
||
460 | for (ReprMethod theMethod : reprMethods) {
|
||
461 | if( theMethod.isApplicable(value) ) {
|
||
462 | this.reprMethodsCache.put(value.getClass(), theMethod);
|
||
463 | return theMethod;
|
||
464 | } |
||
465 | } |
||
466 | return this.reprObject; |
||
467 | } |
||
468 | 44750 | jjdelcerro | |
469 | @Override
|
||
470 | public void registerClassLoader(ClassLoader loader) { |
||
471 | this.loaders.add(loader);
|
||
472 | } |
||
473 | |||
474 | @Override
|
||
475 | public List<ClassLoader> getClassLoaders() { |
||
476 | return Collections.unmodifiableList(loaders); |
||
477 | } |
||
478 | 44769 | jjdelcerro | |
479 | @Override
|
||
480 | public Formatter<ExpressionBuilder.Value> getExpressionBuilderFormatter() { |
||
481 | return expressionBuilderFormatter;
|
||
482 | } |
||
483 | |||
484 | @Override
|
||
485 | public void registerExpressionBuilderFormatter(Formatter<ExpressionBuilder.Value> formatter) { |
||
486 | this.expressionBuilderFormatter = formatter;
|
||
487 | } |
||
488 | |||
489 | 43521 | jjdelcerro | } |