Correctly parse property name in path "map[key[foo]]"
This commit is contained in:
		
							parent
							
								
									7b11c3b599
								
							
						
					
					
						commit
						6899624155
					
				| 
						 | 
				
			
			@ -933,7 +933,7 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA
 | 
			
		|||
			int keyStart = propertyName.indexOf(PROPERTY_KEY_PREFIX, searchIndex);
 | 
			
		||||
			searchIndex = -1;
 | 
			
		||||
			if (keyStart != -1) {
 | 
			
		||||
				int keyEnd = propertyName.indexOf(PROPERTY_KEY_SUFFIX, keyStart + PROPERTY_KEY_PREFIX.length());
 | 
			
		||||
				int keyEnd = getPropertyNameKeyEnd(propertyName, keyStart + PROPERTY_KEY_PREFIX.length());
 | 
			
		||||
				if (keyEnd != -1) {
 | 
			
		||||
					if (actualName == null) {
 | 
			
		||||
						actualName = propertyName.substring(0, keyStart);
 | 
			
		||||
| 
						 | 
				
			
			@ -958,6 +958,29 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA
 | 
			
		|||
		return tokens;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private static int getPropertyNameKeyEnd(String propertyName, int startIndex) {
 | 
			
		||||
		int unclosedPrefixes = 0;
 | 
			
		||||
		int length = propertyName.length();
 | 
			
		||||
		for (int i = startIndex; i < length; i++) {
 | 
			
		||||
			switch (propertyName.charAt(i)) {
 | 
			
		||||
				case PropertyAccessor.PROPERTY_KEY_PREFIX_CHAR:
 | 
			
		||||
					// The property name contains opening prefix(es)
 | 
			
		||||
					unclosedPrefixes++;
 | 
			
		||||
					break;
 | 
			
		||||
				case PropertyAccessor.PROPERTY_KEY_SUFFIX_CHAR:
 | 
			
		||||
					if (unclosedPrefixes == 0) {
 | 
			
		||||
						// No unclosed prefix(es) in the property name (left), this is the suffix we are looking for
 | 
			
		||||
						return i;
 | 
			
		||||
					} else {
 | 
			
		||||
						// This suffix does not close the initial prefix, but one that occurred within the property name
 | 
			
		||||
						unclosedPrefixes--;
 | 
			
		||||
					}
 | 
			
		||||
					break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		StringBuilder sb = new StringBuilder(getClass().getName());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1599,6 +1599,7 @@ public abstract class AbstractPropertyAccessorTests {
 | 
			
		|||
		TestBean tb7 = ((TestBean) target.getSet().toArray()[1]);
 | 
			
		||||
		TestBean tb4 = ((TestBean) target.getMap().get("key1"));
 | 
			
		||||
		TestBean tb5 = ((TestBean) target.getMap().get("key.3"));
 | 
			
		||||
		TestBean tb8 = ((TestBean) target.getMap().get("key5[foo]"));
 | 
			
		||||
		assertEquals("name0", tb0.getName());
 | 
			
		||||
		assertEquals("name1", tb1.getName());
 | 
			
		||||
		assertEquals("name2", tb2.getName());
 | 
			
		||||
| 
						 | 
				
			
			@ -1607,6 +1608,7 @@ public abstract class AbstractPropertyAccessorTests {
 | 
			
		|||
		assertEquals("name7", tb7.getName());
 | 
			
		||||
		assertEquals("name4", tb4.getName());
 | 
			
		||||
		assertEquals("name5", tb5.getName());
 | 
			
		||||
		assertEquals("name8", tb8.getName());
 | 
			
		||||
		assertEquals("name0", accessor.getPropertyValue("array[0].name"));
 | 
			
		||||
		assertEquals("name1", accessor.getPropertyValue("array[1].name"));
 | 
			
		||||
		assertEquals("name2", accessor.getPropertyValue("list[0].name"));
 | 
			
		||||
| 
						 | 
				
			
			@ -1619,6 +1621,9 @@ public abstract class AbstractPropertyAccessorTests {
 | 
			
		|||
		assertEquals("name5", accessor.getPropertyValue("map[\"key.3\"].name"));
 | 
			
		||||
		assertEquals("nameX", accessor.getPropertyValue("map[key4][0].name"));
 | 
			
		||||
		assertEquals("nameY", accessor.getPropertyValue("map[key4][1].name"));
 | 
			
		||||
		assertEquals("name8", accessor.getPropertyValue("map[key5[foo]].name"));
 | 
			
		||||
		assertEquals("name8", accessor.getPropertyValue("map['key5[foo]'].name"));
 | 
			
		||||
		assertEquals("name8", accessor.getPropertyValue("map[\"key5[foo]\"].name"));
 | 
			
		||||
 | 
			
		||||
		MutablePropertyValues pvs = new MutablePropertyValues();
 | 
			
		||||
		pvs.add("array[0].name", "name5");
 | 
			
		||||
| 
						 | 
				
			
			@ -1631,6 +1636,7 @@ public abstract class AbstractPropertyAccessorTests {
 | 
			
		|||
		pvs.add("map['key.3'].name", "name0");
 | 
			
		||||
		pvs.add("map[key4][0].name", "nameA");
 | 
			
		||||
		pvs.add("map[key4][1].name", "nameB");
 | 
			
		||||
		pvs.add("map[key5[foo]].name", "name10");
 | 
			
		||||
		accessor.setPropertyValues(pvs);
 | 
			
		||||
		assertEquals("name5", tb0.getName());
 | 
			
		||||
		assertEquals("name4", tb1.getName());
 | 
			
		||||
| 
						 | 
				
			
			@ -1648,6 +1654,7 @@ public abstract class AbstractPropertyAccessorTests {
 | 
			
		|||
		assertEquals("name0", accessor.getPropertyValue("map['key.3'].name"));
 | 
			
		||||
		assertEquals("nameA", accessor.getPropertyValue("map[key4][0].name"));
 | 
			
		||||
		assertEquals("nameB", accessor.getPropertyValue("map[key4][1].name"));
 | 
			
		||||
		assertEquals("name10", accessor.getPropertyValue("map[key5[foo]].name"));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -66,6 +66,7 @@ public class IndexedTestBean {
 | 
			
		|||
		TestBean tb5 = new TestBean("name5", 0);
 | 
			
		||||
		TestBean tb6 = new TestBean("name6", 0);
 | 
			
		||||
		TestBean tb7 = new TestBean("name7", 0);
 | 
			
		||||
		TestBean tb8 = new TestBean("name8", 0);
 | 
			
		||||
		TestBean tbX = new TestBean("nameX", 0);
 | 
			
		||||
		TestBean tbY = new TestBean("nameY", 0);
 | 
			
		||||
		this.array = new TestBean[] {tb0, tb1};
 | 
			
		||||
| 
						 | 
				
			
			@ -83,6 +84,7 @@ public class IndexedTestBean {
 | 
			
		|||
		list.add(tbX);
 | 
			
		||||
		list.add(tbY);
 | 
			
		||||
		this.map.put("key4", list);
 | 
			
		||||
		this.map.put("key5[foo]", tb8);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue