001 /* 002 * Copyright 2007 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 005 * use this file except in compliance with the License. You may obtain a copy of 006 * the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 013 * License for the specific language governing permissions and limitations under 014 * the License. 015 */ 016 package org.springframework.richclient.beans; 017 018 import org.springframework.beans.PropertyAccessor; 019 020 /** 021 * Utility methods for classes that perform bean property access 022 * according to the {@link PropertyAccessor} interface. 023 * 024 * @author Arne Limburg 025 */ 026 public abstract class PropertyAccessorUtils extends org.springframework.beans.PropertyAccessorUtils { 027 028 /** 029 * Returns the path to the parent component of the provided property path. 030 */ 031 public static String getParentPropertyPath(String propertyPath) { 032 int propertySeparatorIndex = getLastNestedPropertySeparatorIndex(propertyPath); 033 return propertySeparatorIndex == -1? "": propertyPath.substring(0, propertySeparatorIndex); 034 } 035 036 /** 037 * Returns the last component of the specified property path 038 */ 039 public static String getPropertyName(String propertyPath) { 040 int propertySeparatorIndex = PropertyAccessorUtils.getLastNestedPropertySeparatorIndex(propertyPath); 041 return propertySeparatorIndex == -1? propertyPath: propertyPath.substring(propertySeparatorIndex + 1); 042 } 043 044 /** 045 * Tests whether the specified property path denotes an indexed property. 046 */ 047 public static boolean isIndexedProperty(String propertyName) { 048 return propertyName.indexOf(PropertyAccessor.PROPERTY_KEY_PREFIX_CHAR) != -1 049 && propertyName.charAt(propertyName.length() - 1) == PropertyAccessor.PROPERTY_KEY_SUFFIX_CHAR; 050 } 051 052 public static boolean isNestedProperty(String propertyPath) { 053 return getFirstNestedPropertySeparatorIndex(propertyPath) != -1; 054 } 055 056 public static int getNestingLevel(String propertyName) { 057 propertyName = getPropertyName(propertyName); 058 int nestingLevel = 0; 059 boolean inKey = false; 060 for (int i = 0; i < propertyName.length(); i++) { 061 switch (propertyName.charAt(i)) { 062 case PropertyAccessor.PROPERTY_KEY_PREFIX_CHAR: 063 if (!inKey) { 064 nestingLevel++; 065 } 066 case PropertyAccessor.PROPERTY_KEY_SUFFIX_CHAR: 067 inKey = !inKey; 068 } 069 } 070 return nestingLevel; 071 } 072 }