1 package org.apache.commons.ognl; 2 3 /* 4 * Licensed to the Apache Software Foundation (ASF) under one 5 * or more contributor license agreements. See the NOTICE file 6 * distributed with this work for additional information 7 * regarding copyright ownership. The ASF licenses this file 8 * to you under the Apache License, Version 2.0 (the 9 * "License"); you may not use this file except in compliance 10 * with the License. You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, 15 * software distributed under the License is distributed on an 16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 * KIND, either express or implied. See the License for the 18 * specific language governing permissions and limitations 19 * under the License. 20 */ 21 22 import org.apache.commons.ognl.enhance.ExpressionAccessor; 23 24 import java.io.StringReader; 25 import java.util.Map; 26 27 /** 28 * <p> 29 * This class provides static methods for parsing and interpreting OGNL expressions. 30 * </p> 31 * <p> 32 * The simplest use of the Ognl class is to get the value of an expression from an object, without extra context or 33 * pre-parsing. 34 * </p> 35 * 36 * <pre> 37 * 38 * import org.apache.commons.ognl.Ognl; 39 * import org.apache.commons.ognl.OgnlException; 40 * ... 41 * try 42 * { 43 * result = Ognl.getValue( expression, root ); 44 * } 45 * catch ( OgnlException ex ) 46 * { 47 * // Report error or recover 48 * } 49 * 50 * </pre> 51 * <p> 52 * This will parse the expression given and evaluate it against the root object given, returning the result. If there is 53 * an error in the expression, such as the property is not found, the exception is encapsulated into an 54 * {@link org.apache.commons.ognl.OgnlException OgnlException}. 55 * </p> 56 * <p> 57 * Other more sophisticated uses of Ognl can pre-parse expressions. This provides two advantages: in the case of 58 * user-supplied expressions it allows you to catch parse errors before evaluation and it allows you to cache parsed 59 * expressions into an AST for better speed during repeated use. The pre-parsed expression is always returned as an 60 * <code>Object</code> to simplify use for programs that just wish to store the value for repeated use and do not care 61 * that it is an AST. If it does care it can always safely cast the value to an <code>AST</code> type. 62 * </p> 63 * <p> 64 * The Ognl class also takes a <I>context map</I> as one of the parameters to the set and get methods. This allows you 65 * to put your own variables into the available namespace for OGNL expressions. The default context contains only the 66 * <code>#root</code> and <code>#context</code> keys, which are required to be present. The 67 * <code>addDefaultContext(Object, Map)</code> method will alter an existing <code>Map</code> to put the defaults in. 68 * Here is an example that shows how to extract the <code>documentName</code> property out of the root object and append 69 * a string with the current user name in parens: 70 * </p> 71 * 72 * <pre> 73 * 74 * private Map<String, Object> context = new HashMap<String, Object>(); 75 * ... 76 * public void setUserName( String value ) 77 * { 78 * context.put("userName", value); 79 * } 80 * ... 81 * try 82 * { 83 * // get value using our own custom context map 84 * result = Ognl.getValue( "documentName + \" (\" + ((#userName == null) ? \"<nobody>\" : #userName ) + 85 * \")\"", context, root ); 86 * } 87 * catch ( OgnlException ex ) 88 * { 89 * // Report error or recover 90 * } 91 * 92 * </pre> 93 * 94 * @author Luke Blanshard (blanshlu@netscape.net) 95 * @author Drew Davidson (drew@ognl.org) 96 * @version 27 June 1999 97 */ 98 public abstract class Ognl 99 { 100 101 /** 102 * Parses the given OGNL expression and returns a tree representation of the expression that can be used by 103 * <code>Ognl</code> static methods. 104 * 105 * @param expression the OGNL expression to be parsed 106 * @return a tree representation of the expression 107 * @throws ExpressionSyntaxException if the expression is malformed 108 * @throws OgnlException if there is a pathological environmental problem 109 */ 110 public static Object parseExpression( String expression ) 111 throws OgnlException 112 { 113 try 114 { 115 OgnlParser parser = new OgnlParser( new StringReader( expression ) ); 116 return parser.topLevelExpression(); 117 } 118 catch ( ParseException e ) 119 { 120 throw new ExpressionSyntaxException( expression, e ); 121 } 122 catch ( TokenMgrError e ) 123 { 124 throw new ExpressionSyntaxException( expression, e ); 125 } 126 } 127 128 /** 129 * Parses and compiles the given expression using the {@link org.apache.commons.ognl.enhance.OgnlExpressionCompiler} 130 * returned from 131 * {@link org.apache.commons.ognl.OgnlRuntime#getCompiler(OgnlContext)}. 132 * 133 * @param context The context to use. 134 * @param root The root object for the given expression. 135 * @param expression The expression to compile. 136 * @return The node with a compiled accessor set on {@link org.apache.commons.ognl.Node#getAccessor()} if 137 * compilation was successfull. 138 * In instances where compilation wasn't possible because of a partially null expression the 139 * {@link ExpressionAccessor} instance may be null and the compilation of this expression still possible at 140 * some as yet indertermined point in the future. 141 * @throws Exception If a compilation error occurs. 142 */ 143 public static Node compileExpression( OgnlContext context, Object root, String expression ) 144 throws Exception 145 { 146 Node expr = (Node) Ognl.parseExpression( expression ); 147 148 OgnlRuntime.compileExpression( context, expr, root ); 149 150 return expr; 151 } 152 153 /** 154 * Creates and returns a new standard naming context for evaluating an OGNL expression. 155 * 156 * @param root the root of the object graph 157 * @return a new Map with the keys <code>root</code> and <code>context</code> set appropriately 158 */ 159 public static Map<String, Object> createDefaultContext( Object root ) 160 { 161 return addDefaultContext( root, null, null, null, new OgnlContext() ); 162 } 163 164 /** 165 * Creates and returns a new standard naming context for evaluating an OGNL expression. 166 * 167 * @param root The root of the object graph. 168 * @param classResolver The resolver used to instantiate {@link Class} instances referenced in the expression. 169 * @return a new OgnlContext with the keys <code>root</code> and <code>context</code> set appropriately 170 */ 171 public static Map<String, Object> createDefaultContext( Object root, ClassResolver classResolver ) 172 { 173 return addDefaultContext( root, classResolver, null, null, new OgnlContext() ); 174 } 175 176 /** 177 * Creates and returns a new standard naming context for evaluating an OGNL expression. 178 * 179 * @param root The root of the object graph. 180 * @param classResolver The resolver used to instantiate {@link Class} instances referenced in the expression. 181 * @param converter Converter used to convert return types of an expression in to their desired types. 182 * @return a new Map with the keys <code>root</code> and <code>context</code> set appropriately 183 */ 184 public static Map<String, Object> createDefaultContext( Object root, ClassResolver classResolver, 185 TypeConverter converter ) 186 { 187 return addDefaultContext( root, classResolver, converter, null, new OgnlContext() ); 188 } 189 190 /** 191 * Creates and returns a new standard naming context for evaluating an OGNL expression. 192 * 193 * @param root The root of the object graph. 194 * @param classResolver The resolver used to instantiate {@link Class} instances referenced in the expression. 195 * @param converter Converter used to convert return types of an expression in to their desired types. 196 * @param memberAccess Java security handling object to determine semantics for accessing normally private/protected 197 * methods / fields. 198 * @return a new Map with the keys <code>root</code> and <code>context</code> set appropriately 199 */ 200 public static Map<String, Object> createDefaultContext( Object root, ClassResolver classResolver, 201 TypeConverter converter, MemberAccess memberAccess ) 202 { 203 return addDefaultContext( root, classResolver, converter, memberAccess, new OgnlContext() ); 204 } 205 206 /** 207 * Appends the standard naming context for evaluating an OGNL expression into the context given so that cached maps 208 * can be used as a context. 209 * 210 * @param root the root of the object graph 211 * @param context the context to which OGNL context will be added. 212 * @return Context Map with the keys <code>root</code> and <code>context</code> set appropriately 213 */ 214 public static Map<String, Object> addDefaultContext( Object root, Map<String, Object> context ) 215 { 216 return addDefaultContext( root, null, null, null, context ); 217 } 218 219 /** 220 * Appends the standard naming context for evaluating an OGNL expression into the context given so that cached maps 221 * can be used as a context. 222 * 223 * @param root The root of the object graph. 224 * @param classResolver The resolver used to instantiate {@link Class} instances referenced in the expression. 225 * @param context The context to which OGNL context will be added. 226 * @return Context Map with the keys <code>root</code> and <code>context</code> set appropriately 227 */ 228 public static Map<String, Object> addDefaultContext( Object root, ClassResolver classResolver, 229 Map<String, Object> context ) 230 { 231 return addDefaultContext( root, classResolver, null, null, context ); 232 } 233 234 /** 235 * Appends the standard naming context for evaluating an OGNL expression into the context given so that cached maps 236 * can be used as a context. 237 * 238 * @param root The root of the object graph. 239 * @param classResolver The resolver used to instantiate {@link Class} instances referenced in the expression. 240 * @param converter Converter used to convert return types of an expression in to their desired types. 241 * @param context The context to which OGNL context will be added. 242 * @return Context Map with the keys <code>root</code> and <code>context</code> set appropriately 243 */ 244 public static Map<String, Object> addDefaultContext( Object root, ClassResolver classResolver, 245 TypeConverter converter, Map<String, Object> context ) 246 { 247 return addDefaultContext( root, classResolver, converter, null, context ); 248 } 249 250 /** 251 * Appends the standard naming context for evaluating an OGNL expression into the context given so that cached maps 252 * can be used as a context. 253 * 254 * @param root the root of the object graph 255 * @param classResolver The class loading resolver that should be used to resolve class references. 256 * @param converter The type converter to be used by default. 257 * @param memberAccess Definition for handling private/protected access. 258 * @param context Default context to use, if not an {@link OgnlContext} will be dumped into a new 259 * {@link OgnlContext} object. 260 * @return Context Map with the keys <code>root</code> and <code>context</code> set appropriately 261 */ 262 public static Map<String, Object> addDefaultContext( Object root, ClassResolver classResolver, 263 TypeConverter converter, MemberAccess memberAccess, 264 Map<String, Object> context ) 265 { 266 OgnlContext result; 267 268 if ( !( context instanceof OgnlContext ) ) 269 { 270 result = new OgnlContext(); 271 result.setValues( context ); 272 } 273 else 274 { 275 result = (OgnlContext) context; 276 } 277 if ( classResolver != null ) 278 { 279 result.setClassResolver( classResolver ); 280 } 281 if ( converter != null ) 282 { 283 result.setTypeConverter( converter ); 284 } 285 if ( memberAccess != null ) 286 { 287 result.setMemberAccess( memberAccess ); 288 } 289 290 result.setRoot( root ); 291 return result; 292 } 293 294 /** 295 * Configures the {@link ClassResolver} to use for the given context. Will be used during expression parsing / 296 * execution to resolve class names. 297 * 298 * @param context The context to place the resolver. 299 * @param classResolver The resolver to use to resolve classes. 300 */ 301 public static void setClassResolver( Map<String, Object> context, ClassResolver classResolver ) 302 { 303 context.put( OgnlContext.CLASS_RESOLVER_CONTEXT_KEY, classResolver ); 304 } 305 306 /** 307 * Gets the previously stored {@link ClassResolver} for the given context - if any. 308 * 309 * @param context The context to get the configured resolver from. 310 * @return The resolver instance, or null if none found. 311 */ 312 public static ClassResolver getClassResolver( Map<String, Object> context ) 313 { 314 return (ClassResolver) context.get( OgnlContext.CLASS_RESOLVER_CONTEXT_KEY ); 315 } 316 317 /** 318 * Configures the type converter to use for a given context. This will be used to convert into / out of various java 319 * class types. 320 * 321 * @param context The context to configure it for. 322 * @param converter The converter to use. 323 */ 324 public static void setTypeConverter( Map<String, Object> context, TypeConverter converter ) 325 { 326 context.put( OgnlContext.TYPE_CONVERTER_CONTEXT_KEY, converter ); 327 } 328 329 /** 330 * Gets the currently configured {@link TypeConverter} for the given context - if any. 331 * 332 * @param context The context to get the converter from. 333 * @return The converter - or null if none found. 334 */ 335 public static TypeConverter getTypeConverter( Map<String, Object> context ) 336 { 337 return (TypeConverter) context.get( OgnlContext.TYPE_CONVERTER_CONTEXT_KEY ); 338 } 339 340 /** 341 * Configures the specified context with a {@link MemberAccess} instance for handling field/method protection 342 * levels. 343 * 344 * @param context The context to configure. 345 * @param memberAccess The access resolver to configure the context with. 346 */ 347 public static void setMemberAccess( Map<String, Object> context, MemberAccess memberAccess ) 348 { 349 context.put( OgnlContext.MEMBER_ACCESS_CONTEXT_KEY, memberAccess ); 350 } 351 352 /** 353 * Gets the currently stored {@link MemberAccess} object for the given context - if any. 354 * 355 * @param context The context to get the object from. 356 * @return The configured {@link MemberAccess} instance in the specified context - or null if none found. 357 */ 358 public static MemberAccess getMemberAccess( Map<String, Object> context ) 359 { 360 return (MemberAccess) context.get( OgnlContext.MEMBER_ACCESS_CONTEXT_KEY ); 361 } 362 363 /** 364 * Sets the root object to use for all expressions in the given context - doesn't necessarily replace root object 365 * instances explicitly passed in to other expression resolving methods on this class. 366 * 367 * @param context The context to store the root object in. 368 * @param root The root object. 369 */ 370 public static void setRoot( Map<String, Object> context, Object root ) 371 { 372 context.put( OgnlContext.ROOT_CONTEXT_KEY, root ); 373 } 374 375 /** 376 * Gets the stored root object for the given context - if any. 377 * 378 * @param context The context to get the root object from. 379 * @return The root object - or null if none found. 380 */ 381 public static Object getRoot( Map<String, Object> context ) 382 { 383 return context.get( OgnlContext.ROOT_CONTEXT_KEY ); 384 } 385 386 /** 387 * Gets the last {@link Evaluation} executed on the given context. 388 * 389 * @param context The context to get the evaluation from. 390 * @return The {@link Evaluation} - or null if none was found. 391 */ 392 public static Evaluation getLastEvaluation( Map<String, Object> context ) 393 { 394 return (Evaluation) context.get( OgnlContext.LAST_EVALUATION_CONTEXT_KEY ); 395 } 396 397 /** 398 * Evaluates the given OGNL expression tree to extract a value from the given root object. The default context is 399 * set for the given context and root via <code>addDefaultContext()</code>. 400 * 401 * @param tree the OGNL expression tree to evaluate, as returned by parseExpression() 402 * @param context the naming context for the evaluation 403 * @param root the root object for the OGNL expression 404 * @return the result of evaluating the expression 405 * @throws MethodFailedException if the expression called a method which failed 406 * @throws NoSuchPropertyException if the expression referred to a nonexistent property 407 * @throws InappropriateExpressionException if the expression can't be used in this context 408 * @throws OgnlException if there is a pathological environmental problem 409 */ 410 public static <T> T getValue( Object tree, Map<String, Object> context, Object root ) 411 throws OgnlException 412 { 413 return Ognl.<T> getValue( tree, context, root, null ); 414 } 415 416 /** 417 * Evaluates the given OGNL expression tree to extract a value from the given root object. The default context is 418 * set for the given context and root via <code>addDefaultContext()</code>. 419 * 420 * @param tree the OGNL expression tree to evaluate, as returned by parseExpression() 421 * @param context the naming context for the evaluation 422 * @param root the root object for the OGNL expression 423 * @param resultType the converted type of the resultant object, using the context's type converter 424 * @return the result of evaluating the expression 425 * @throws MethodFailedException if the expression called a method which failed 426 * @throws NoSuchPropertyException if the expression referred to a nonexistent property 427 * @throws InappropriateExpressionException if the expression can't be used in this context 428 * @throws OgnlException if there is a pathological environmental problem 429 */ 430 @SuppressWarnings( "unchecked" ) // will cause CCE if types are not compatible 431 public static <T> T getValue( Object tree, Map<String, Object> context, Object root, Class<T> resultType ) 432 throws OgnlException 433 { 434 T result; 435 OgnlContext ognlContext = (OgnlContext) addDefaultContext( root, context ); 436 437 Node node = (Node) tree; 438 439 if ( node.getAccessor() != null ) 440 { 441 result = (T) node.getAccessor().get( ognlContext, root ); 442 } 443 else 444 { 445 result = (T) node.getValue( ognlContext, root ); 446 } 447 448 if ( resultType != null ) 449 { 450 result = getTypeConverter( context ).convertValue( context, root, null, null, result, resultType ); 451 } 452 return result; 453 } 454 455 /** 456 * Gets the value represented by the given pre-compiled expression on the specified root object. 457 * 458 * @param expression The pre-compiled expression, as found in {@link Node#getAccessor()}. 459 * @param context The ognl context. 460 * @param root The object to retrieve the expression value from. 461 * @return The value. 462 */ 463 @SuppressWarnings( "unchecked" ) // will cause CCE if types are not compatible 464 public static <T> T getValue( ExpressionAccessor expression, OgnlContext context, Object root ) 465 { 466 return (T) expression.get( context, root ); 467 } 468 469 /** 470 * Gets the value represented by the given pre-compiled expression on the specified root object. 471 * 472 * @param expression The pre-compiled expression, as found in {@link Node#getAccessor()}. 473 * @param context The ognl context. 474 * @param root The object to retrieve the expression value from. 475 * @param resultType The desired object type that the return value should be converted to using the 476 * {@link #getTypeConverter(java.util.Map)} . 477 * @return The value. 478 */ 479 public static <T> T getValue( ExpressionAccessor expression, OgnlContext context, Object root, Class<T> resultType ) 480 throws OgnlException 481 { 482 return getTypeConverter( context ).convertValue( context, root, null, null, expression.get( context, root ), 483 resultType ); 484 } 485 486 /** 487 * Evaluates the given OGNL expression to extract a value from the given root object in a given context 488 * 489 * @see #parseExpression(String) 490 * @see #getValue(Object,Object) 491 * @param expression the OGNL expression to be parsed 492 * @param context the naming context for the evaluation 493 * @param root the root object for the OGNL expression 494 * @return the result of evaluating the expression 495 * @throws MethodFailedException if the expression called a method which failed 496 * @throws NoSuchPropertyException if the expression referred to a nonexistent property 497 * @throws InappropriateExpressionException if the expression can't be used in this context 498 * @throws OgnlException if there is a pathological environmental problem 499 */ 500 public static <T> T getValue( String expression, Map<String, Object> context, Object root ) 501 throws OgnlException 502 { 503 return Ognl.<T> getValue( expression, context, root, null ); 504 } 505 506 /** 507 * Evaluates the given OGNL expression to extract a value from the given root object in a given context 508 * 509 * @see #parseExpression(String) 510 * @see #getValue(Object,Object) 511 * @param expression the OGNL expression to be parsed 512 * @param context the naming context for the evaluation 513 * @param root the root object for the OGNL expression 514 * @param resultType the converted type of the resultant object, using the context's type converter 515 * @return the result of evaluating the expression 516 * @throws MethodFailedException if the expression called a method which failed 517 * @throws NoSuchPropertyException if the expression referred to a nonexistent property 518 * @throws InappropriateExpressionException if the expression can't be used in this context 519 * @throws OgnlException if there is a pathological environmental problem 520 */ 521 public static <T> T getValue( String expression, Map<String, Object> context, Object root, Class<T> resultType ) 522 throws OgnlException 523 { 524 return Ognl.<T> getValue( parseExpression( expression ), context, root, resultType ); 525 } 526 527 /** 528 * Evaluates the given OGNL expression tree to extract a value from the given root object. 529 * 530 * @param tree the OGNL expression tree to evaluate, as returned by parseExpression() 531 * @param root the root object for the OGNL expression 532 * @return the result of evaluating the expression 533 * @throws MethodFailedException if the expression called a method which failed 534 * @throws NoSuchPropertyException if the expression referred to a nonexistent property 535 * @throws InappropriateExpressionException if the expression can't be used in this context 536 * @throws OgnlException if there is a pathological environmental problem 537 */ 538 public static <T> T getValue( Object tree, Object root ) 539 throws OgnlException 540 { 541 return Ognl.<T> getValue( tree, root, null ); 542 } 543 544 /** 545 * Evaluates the given OGNL expression tree to extract a value from the given root object. 546 * 547 * @param tree the OGNL expression tree to evaluate, as returned by parseExpression() 548 * @param root the root object for the OGNL expression 549 * @param resultType the converted type of the resultant object, using the context's type converter 550 * @return the result of evaluating the expression 551 * @throws MethodFailedException if the expression called a method which failed 552 * @throws NoSuchPropertyException if the expression referred to a nonexistent property 553 * @throws InappropriateExpressionException if the expression can't be used in this context 554 * @throws OgnlException if there is a pathological environmental problem 555 */ 556 public static <T> T getValue( Object tree, Object root, Class<T> resultType ) 557 throws OgnlException 558 { 559 return Ognl.<T> getValue( tree, createDefaultContext( root ), root, resultType ); 560 } 561 562 /** 563 * Convenience method that combines calls to <code> parseExpression </code> and <code> getValue</code>. 564 * 565 * @see #parseExpression(String) 566 * @see #getValue(Object,Object) 567 * @param expression the OGNL expression to be parsed 568 * @param root the root object for the OGNL expression 569 * @return the result of evaluating the expression 570 * @throws ExpressionSyntaxException if the expression is malformed 571 * @throws MethodFailedException if the expression called a method which failed 572 * @throws NoSuchPropertyException if the expression referred to a nonexistent property 573 * @throws InappropriateExpressionException if the expression can't be used in this context 574 * @throws OgnlException if there is a pathological environmental problem 575 */ 576 public static <T> T getValue( String expression, Object root ) 577 throws OgnlException 578 { 579 return Ognl.<T> getValue( expression, root, null ); 580 } 581 582 /** 583 * Convenience method that combines calls to <code> parseExpression </code> and <code> getValue</code>. 584 * 585 * @see #parseExpression(String) 586 * @see #getValue(Object,Object) 587 * @param expression the OGNL expression to be parsed 588 * @param root the root object for the OGNL expression 589 * @param resultType the converted type of the resultant object, using the context's type converter 590 * @return the result of evaluating the expression 591 * @throws ExpressionSyntaxException if the expression is malformed 592 * @throws MethodFailedException if the expression called a method which failed 593 * @throws NoSuchPropertyException if the expression referred to a nonexistent property 594 * @throws InappropriateExpressionException if the expression can't be used in this context 595 * @throws OgnlException if there is a pathological environmental problem 596 */ 597 public static <T> T getValue( String expression, Object root, Class<T> resultType ) 598 throws OgnlException 599 { 600 return Ognl.<T> getValue( parseExpression( expression ), root, resultType ); 601 } 602 603 /** 604 * Evaluates the given OGNL expression tree to insert a value into the object graph rooted at the given root object. 605 * The default context is set for the given context and root via <code>addDefaultContext()</code>. 606 * 607 * @param tree the OGNL expression tree to evaluate, as returned by parseExpression() 608 * @param context the naming context for the evaluation 609 * @param root the root object for the OGNL expression 610 * @param value the value to insert into the object graph 611 * @throws MethodFailedException if the expression called a method which failed 612 * @throws NoSuchPropertyException if the expression referred to a nonexistent property 613 * @throws InappropriateExpressionException if the expression can't be used in this context 614 * @throws OgnlException if there is a pathological environmental problem 615 */ 616 public static void setValue( Object tree, Map<String, Object> context, Object root, Object value ) 617 throws OgnlException 618 { 619 OgnlContext ognlContext = (OgnlContext) addDefaultContext( root, context ); 620 Node n = (Node) tree; 621 622 if ( n.getAccessor() != null ) 623 { 624 n.getAccessor().set( ognlContext, root, value ); 625 return; 626 } 627 628 n.setValue( ognlContext, root, value ); 629 } 630 631 /** 632 * Sets the value given using the pre-compiled expression on the specified root object. 633 * 634 * @param expression The pre-compiled expression, as found in {@link Node#getAccessor()}. 635 * @param context The ognl context. 636 * @param root The object to set the expression value on. 637 * @param value The value to set. 638 */ 639 public static void setValue( ExpressionAccessor expression, OgnlContext context, Object root, Object value ) 640 { 641 expression.set( context, root, value ); 642 } 643 644 /** 645 * Evaluates the given OGNL expression to insert a value into the object graph rooted at the given root object given 646 * the context. 647 * 648 * @param expression the OGNL expression to be parsed 649 * @param root the root object for the OGNL expression 650 * @param context the naming context for the evaluation 651 * @param value the value to insert into the object graph 652 * @throws MethodFailedException if the expression called a method which failed 653 * @throws NoSuchPropertyException if the expression referred to a nonexistent property 654 * @throws InappropriateExpressionException if the expression can't be used in this context 655 * @throws OgnlException if there is a pathological environmental problem 656 */ 657 public static void setValue( String expression, Map<String, Object> context, Object root, Object value ) 658 throws OgnlException 659 { 660 setValue( parseExpression( expression ), context, root, value ); 661 } 662 663 /** 664 * Evaluates the given OGNL expression tree to insert a value into the object graph rooted at the given root object. 665 * 666 * @param tree the OGNL expression tree to evaluate, as returned by parseExpression() 667 * @param root the root object for the OGNL expression 668 * @param value the value to insert into the object graph 669 * @throws MethodFailedException if the expression called a method which failed 670 * @throws NoSuchPropertyException if the expression referred to a nonexistent property 671 * @throws InappropriateExpressionException if the expression can't be used in this context 672 * @throws OgnlException if there is a pathological environmental problem 673 */ 674 public static void setValue( Object tree, Object root, Object value ) 675 throws OgnlException 676 { 677 setValue( tree, createDefaultContext( root ), root, value ); 678 } 679 680 /** 681 * Convenience method that combines calls to <code> parseExpression </code> and <code> setValue</code>. 682 * 683 * @see #parseExpression(String) 684 * @see #setValue(Object,Object,Object) 685 * @param expression the OGNL expression to be parsed 686 * @param root the root object for the OGNL expression 687 * @param value the value to insert into the object graph 688 * @throws ExpressionSyntaxException if the expression is malformed 689 * @throws MethodFailedException if the expression called a method which failed 690 * @throws NoSuchPropertyException if the expression referred to a nonexistent property 691 * @throws InappropriateExpressionException if the expression can't be used in this context 692 * @throws OgnlException if there is a pathological environmental problem 693 */ 694 public static void setValue( String expression, Object root, Object value ) 695 throws OgnlException 696 { 697 setValue( parseExpression( expression ), root, value ); 698 } 699 700 /** 701 * Checks if the specified {@link Node} instance represents a constant expression. 702 * 703 * @param tree The {@link Node} to check. 704 * @param context The context to use. 705 * @return True if the node is a constant - false otherwise. 706 * @throws OgnlException If an error occurs checking the expression. 707 */ 708 public static boolean isConstant( Object tree, Map<String, Object> context ) 709 throws OgnlException 710 { 711 return ( (SimpleNode) tree ).isConstant( (OgnlContext) addDefaultContext( null, context ) ); 712 } 713 714 /** 715 * Checks if the specified expression represents a constant expression. 716 * 717 * @param expression The expression to check. 718 * @param context The context to use. 719 * @return True if the node is a constant - false otherwise. 720 * @throws OgnlException If an error occurs checking the expression. 721 */ 722 public static boolean isConstant( String expression, Map<String, Object> context ) 723 throws OgnlException 724 { 725 return isConstant( parseExpression( expression ), context ); 726 } 727 728 /** 729 * Same as {@link #isConstant(Object, java.util.Map)} - only the {@link Map} context is created for you. 730 * 731 * @param tree The {@link Node} to check. 732 * @return True if the node represents a constant expression - false otherwise. 733 * @throws OgnlException If an exception occurs. 734 */ 735 public static boolean isConstant( Object tree ) 736 throws OgnlException 737 { 738 return isConstant( tree, createDefaultContext( null ) ); 739 } 740 741 /** 742 * Same as {@link #isConstant(String, java.util.Map)} - only the {@link Map} instance is created for you. 743 * 744 * @param expression The expression to check. 745 * @return True if the expression represents a constant - false otherwise. 746 * @throws OgnlException If an exception occurs. 747 */ 748 public static boolean isConstant( String expression ) 749 throws OgnlException 750 { 751 return isConstant( parseExpression( expression ), createDefaultContext( null ) ); 752 } 753 754 public static boolean isSimpleProperty( Object tree, Map<String, Object> context ) 755 throws OgnlException 756 { 757 return ( (SimpleNode) tree ).isSimpleProperty( (OgnlContext) addDefaultContext( null, context ) ); 758 } 759 760 public static boolean isSimpleProperty( String expression, Map<String, Object> context ) 761 throws OgnlException 762 { 763 return isSimpleProperty( parseExpression( expression ), context ); 764 } 765 766 public static boolean isSimpleProperty( Object tree ) 767 throws OgnlException 768 { 769 return isSimpleProperty( tree, createDefaultContext( null ) ); 770 } 771 772 public static boolean isSimpleProperty( String expression ) 773 throws OgnlException 774 { 775 return isSimpleProperty( parseExpression( expression ), createDefaultContext( null ) ); 776 } 777 778 public static boolean isSimpleNavigationChain( Object tree, Map<String, Object> context ) 779 throws OgnlException 780 { 781 return ( (SimpleNode) tree ).isSimpleNavigationChain( (OgnlContext) addDefaultContext( null, context ) ); 782 } 783 784 public static boolean isSimpleNavigationChain( String expression, Map<String, Object> context ) 785 throws OgnlException 786 { 787 return isSimpleNavigationChain( parseExpression( expression ), context ); 788 } 789 790 public static boolean isSimpleNavigationChain( Object tree ) 791 throws OgnlException 792 { 793 return isSimpleNavigationChain( tree, createDefaultContext( null ) ); 794 } 795 796 public static boolean isSimpleNavigationChain( String expression ) 797 throws OgnlException 798 { 799 return isSimpleNavigationChain( parseExpression( expression ), createDefaultContext( null ) ); 800 } 801 802 /** You can't make one of these. */ 803 private Ognl() 804 { 805 } 806 }