001 /* 002 * $Id: TestExpressionCompiler.java 1230454 2012-01-12 09:35:53Z mcucchiara $ 003 * Licensed to the Apache Software Foundation (ASF) under one 004 * or more contributor license agreements. See the NOTICE file 005 * distributed with this work for additional information 006 * regarding copyright ownership. The ASF licenses this file 007 * to you under the Apache License, Version 2.0 (the 008 * "License"); you may not use this file except in compliance 009 * with the License. You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, 014 * software distributed under the License is distributed on an 015 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 016 * KIND, either express or implied. See the License for the 017 * specific language governing permissions and limitations 018 * under the License. 019 */ 020 /** 021 * 022 */ 023 package org.apache.commons.ognl.test.enhance; 024 025 import org.apache.commons.ognl.Node; 026 import org.apache.commons.ognl.Ognl; 027 import org.apache.commons.ognl.OgnlContext; 028 import org.apache.commons.ognl.enhance.ExpressionCompiler; 029 import org.apache.commons.ognl.enhance.OgnlExpressionCompiler; 030 import org.apache.commons.ognl.test.objects.Bean1; 031 import org.apache.commons.ognl.test.objects.GenericRoot; 032 import org.apache.commons.ognl.test.objects.IndexedMapObject; 033 import org.apache.commons.ognl.test.objects.Inherited; 034 import org.apache.commons.ognl.test.objects.Root; 035 import org.apache.commons.ognl.test.objects.TestInherited1; 036 import org.apache.commons.ognl.test.objects.TestInherited2; 037 import org.junit.Before; 038 import org.junit.Test; 039 040 import java.util.Collection; 041 import java.util.HashMap; 042 import java.util.Map; 043 044 import static junit.framework.Assert.*; 045 046 /** 047 * Tests functionality of {@link ExpressionCompiler}. 048 */ 049 public class TestExpressionCompiler 050 { 051 OgnlExpressionCompiler _compiler; 052 053 OgnlContext _context = (OgnlContext) Ognl.createDefaultContext( null ); 054 055 @Before 056 public void setUp() 057 { 058 _compiler = new ExpressionCompiler(); 059 } 060 061 @Test 062 public void test_Get_Property_Access() 063 throws Throwable 064 { 065 Node expr = (Node) Ognl.parseExpression( "bean2" ); 066 Bean1 root = new Bean1(); 067 068 _compiler.compileExpression( _context, expr, root ); 069 070 assertNotNull( expr.getAccessor().get( _context, root ) ); 071 } 072 073 @Test 074 public void test_Get_Indexed_Property() 075 throws Throwable 076 { 077 Node expr = (Node) Ognl.parseExpression( "bean2.bean3.indexedValue[25]" ); 078 Bean1 root = new Bean1(); 079 080 assertNull( Ognl.getValue( expr, _context, root ) ); 081 082 _compiler.compileExpression( _context, expr, root ); 083 084 assertNull( expr.getAccessor().get( _context, root ) ); 085 } 086 087 @Test 088 public void test_Set_Indexed_Property() 089 throws Throwable 090 { 091 Node expr = (Node) Ognl.parseExpression( "bean2.bean3.indexedValue[25]" ); 092 Bean1 root = new Bean1(); 093 094 assertNull( Ognl.getValue( expr, _context, root ) ); 095 096 _compiler.compileExpression( _context, expr, root ); 097 098 expr.getAccessor().set( _context, root, "test string" ); 099 100 assertEquals( "test string", expr.getAccessor().get( _context, root ) ); 101 } 102 103 @Test 104 public void test_Expression() 105 throws Throwable 106 { 107 Node expr = (Node) Ognl.parseExpression( "bean2.bean3.value <= 24" ); 108 Bean1 root = new Bean1(); 109 110 assertEquals( Boolean.FALSE, Ognl.getValue( expr, _context, root ) ); 111 112 _compiler.compileExpression( _context, expr, root ); 113 114 assertEquals( Boolean.FALSE, expr.getAccessor().get( _context, root ) ); 115 } 116 117 @Test 118 public void test_Get_Context_Property() 119 throws Throwable 120 { 121 _context.put( "key", "foo" ); 122 Node expr = (Node) Ognl.parseExpression( "bean2.bean3.map[#key]" ); 123 Bean1 root = new Bean1(); 124 125 assertEquals( "bar", Ognl.getValue( expr, _context, root ) ); 126 127 _compiler.compileExpression( _context, expr, root ); 128 129 assertEquals( "bar", expr.getAccessor().get( _context, root ) ); 130 131 _context.put( "key", "bar" ); 132 133 assertEquals( "baz", Ognl.getValue( expr, _context, root ) ); 134 assertEquals( "baz", expr.getAccessor().get( _context, root ) ); 135 } 136 137 @Test 138 public void test_Set_Context_Property() 139 throws Throwable 140 { 141 _context.put( "key", "foo" ); 142 Node expr = (Node) Ognl.parseExpression( "bean2.bean3.map[#key]" ); 143 Bean1 root = new Bean1(); 144 145 _compiler.compileExpression( _context, expr, root ); 146 147 assertEquals( "bar", expr.getAccessor().get( _context, root ) ); 148 149 _context.put( "key", "bar" ); 150 assertEquals( "baz", expr.getAccessor().get( _context, root ) ); 151 152 expr.getAccessor().set( _context, root, "bam" ); 153 assertEquals( "bam", expr.getAccessor().get( _context, root ) ); 154 } 155 156 @Test 157 public void test_Property_Index() 158 throws Throwable 159 { 160 Root root = new Root(); 161 Node expr = Ognl.compileExpression( _context, root, "{index + 1}" ); 162 163 Object ret = expr.getAccessor().get( _context, root ); 164 165 assertTrue( Collection.class.isInstance( ret ) ); 166 } 167 168 @Test 169 public void test_Root_Expression_Inheritance() 170 throws Throwable 171 { 172 Inherited obj1 = new TestInherited1(); 173 Inherited obj2 = new TestInherited2(); 174 175 Node expr = Ognl.compileExpression( _context, obj1, "myString" ); 176 177 assertEquals( expr.getAccessor().get( _context, obj1 ), "inherited1" ); 178 assertEquals( expr.getAccessor().get( _context, obj2 ), "inherited2" ); 179 } 180 181 @Test 182 public void test_Create_Empty_Collection() 183 throws Throwable 184 { 185 Node expr = Ognl.compileExpression( _context, null, "{}" ); 186 187 Object ret = expr.getAccessor().get( _context, null ); 188 189 assertNotNull( ret ); 190 assertTrue( Collection.class.isAssignableFrom( ret.getClass() ) ); 191 } 192 193 public String getKey() 194 { 195 return "key"; 196 } 197 198 @Test 199 public void test_Indexed_Property() 200 throws Throwable 201 { 202 Map<String,String> map = new HashMap<String,String>(); 203 map.put( "key", "value" ); 204 205 Node expression = Ognl.compileExpression( _context, this, "key" ); 206 assertEquals( "key", expression.getAccessor().get( _context, this ) ); 207 } 208 209 IndexedMapObject mapObject = new IndexedMapObject( "propertyValue" ); 210 211 public IndexedMapObject getObject() 212 { 213 return mapObject; 214 } 215 216 public String getPropertyKey() 217 { 218 return "property"; 219 } 220 221 @Test 222 public void test_Indexed_Map_Property() 223 throws Throwable 224 { 225 assertEquals( "propertyValue", Ognl.getValue( "object[propertyKey]", this ) ); 226 227 _context.clear(); 228 Node expression = Ognl.compileExpression( _context, this, "object[#this.propertyKey]" ); 229 assertEquals( "propertyValue", expression.getAccessor().get( _context, this ) ); 230 231 _context.clear(); 232 expression = Ognl.compileExpression( _context, this, "object[propertyKey]" ); 233 assertEquals( "propertyValue", expression.getAccessor().get( _context, this ) ); 234 } 235 236 @Test 237 public void test_Set_Generic_Property() 238 throws Exception 239 { 240 _context.clear(); 241 242 GenericRoot root = new GenericRoot(); 243 244 Node node = Ognl.compileExpression( _context, root, "cracker.param" ); 245 assertEquals( null, node.getAccessor().get( _context, root ) ); 246 247 node.getAccessor().set( _context, root, 0 ); 248 assertEquals( 0, node.getAccessor().get( _context, root ) ); 249 250 node.getAccessor().set( _context, root, 12 ); 251 assertEquals( 12, node.getAccessor().get( _context, root ) ); 252 } 253 }