/* * Copyright 2007 The Fornax Project Team, including the original * author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.sculptor.framework.propertyeditor; import java.beans.PropertyEditor; import java.beans.PropertyEditorSupport; import org.apache.commons.beanutils.PropertyUtils; import org.springframework.beans.PropertyEditorRegistry; /** * This PropertyEditor is typically used to format * options in select lists. It concatenates the defined * properties, using the PropertyEditors already registered * for the individual properties. * */ public class OptionEditor extends PropertyEditorSupport { private PropertyEditorRegistry registry; private String[] properties; private String registryPropertyNamePrefix = ""; private String separator = " | "; public OptionEditor(PropertyEditorRegistry registry, String[] properties) { this.registry = registry; this.properties = properties; } /** * @param registry The registry with already registered PropertyEditors that * will be used to format the individual property values. * @param properties The names of the properties to concatenate, it may be nested paths * @param registryPropertyNamePrefix When looking for PropertyEditors in the registry * this prefix will be used in front of the property name. */ public OptionEditor(PropertyEditorRegistry registry, String[] properties, String registryPropertyNamePrefix) { this(registry, properties); this.registryPropertyNamePrefix = registryPropertyNamePrefix; } public String getSeparator() { return separator; } public void setSeparator(String separator) { this.separator = separator; } /** * Format the Object as String of concatenated properties. */ public String getAsText() { Object value = getValue(); if (value == null) { return ""; } String propertyName = null; // used in error handling below try { StringBuffer label = new StringBuffer(); for (int i = 0; i < properties.length; i++) { propertyName = properties[i]; Class<?> propertyType = PropertyUtils.getPropertyType(value, propertyName); Object propertyValue = PropertyUtils.getNestedProperty(value, propertyName); PropertyEditor editor = registry.findCustomEditor(propertyType, registryPropertyNamePrefix + propertyName); if (editor == null) { label.append(propertyValue); } else { editor.setValue(propertyValue); label.append(editor.getAsText()); editor.setValue(null); } if (i < (properties.length - 1)) { label.append(separator); } } return label.toString(); } catch (Exception e) { throw new IllegalArgumentException("Couldn't access " + propertyName + " of " + value.getClass().getName() + " : " + e.getMessage(), e); } } /** * Parse the value from the given text is not supported by this editor */ public void setAsText(String text) throws IllegalArgumentException { throw new UnsupportedOperationException("setAsText not supported by OptionEditor"); } }