001 // Copyright 2004, 2005 The Apache Software Foundation 002 // 003 // Licensed under the Apache License, Version 2.0 (the "License"); 004 // you may not use this file except in compliance with the License. 005 // You may obtain a copy of the License at 006 // 007 // http://www.apache.org/licenses/LICENSE-2.0 008 // 009 // Unless required by applicable law or agreed to in writing, software 010 // distributed under the License is distributed on an "AS IS" BASIS, 011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 // See the License for the specific language governing permissions and 013 // limitations under the License. 014 package org.apache.tapestry.form; 015 016 import org.apache.commons.beanutils.BeanUtils; 017 018 import java.io.Serializable; 019 import java.util.ArrayList; 020 import java.util.Arrays; 021 import java.util.Collection; 022 import java.util.List; 023 024 /** 025 * This class is a property selection model for an object list. This is used in {@link PropertySelection}, 026 * MultiplePropertySelection or Palette tapestry components. For example, to use for a Hospital 027 * class, and have the labels be the hospital names. 028 * 029 * <p> 030 * <code> 031 * List<Hospital> list = ...; 032 * return new BeanPropertySelectionModel(hospitals, "name"); 033 * </code> 034 * </p> 035 * <p>This will use getName() on the Hospital object, as its display.</p> 036 * 037 * @author Gabriel Handford 038 */ 039 public class BeanPropertySelectionModel implements IPropertySelectionModel, Serializable 040 { 041 042 /** Comment for <code>serialVersionUID</code>. */ 043 private static final long serialVersionUID = 3763091973006766644L; 044 protected List _list; 045 protected String _labelField; 046 047 /** 048 * Build an empty property selection model. 049 */ 050 public BeanPropertySelectionModel() 051 { 052 this(Arrays.asList(new Object[0]), null); 053 } 054 055 /** 056 * Build a bean property selection model. 057 * 058 * @param list 059 * The list 060 * @param labelField 061 * The label field 062 */ 063 public BeanPropertySelectionModel(List list, String labelField) 064 { 065 _list = list; 066 _labelField = labelField; 067 } 068 069 /** 070 * Build a bean property selection model. 071 * 072 * @param c 073 * Collection 074 * @param labelField 075 * The label field 076 */ 077 public BeanPropertySelectionModel(Collection c, String labelField) 078 { 079 _list = new ArrayList(c); 080 _labelField = labelField; 081 } 082 083 /** 084 * Get the number of options. 085 * 086 * @return option count 087 */ 088 public int getOptionCount() 089 { 090 return _list.size(); 091 } 092 093 /** 094 * Get the option at index. 095 * 096 * @param index 097 * Index 098 * @return object Object at index 099 */ 100 public Object getOption(int index) 101 { 102 if (index > (_list.size() - 1)) 103 { 104 return null; 105 } 106 107 return _list.get(index); 108 } 109 110 /** 111 * Get the label at index. 112 * 113 * @param index 114 * Index 115 * @return label Label at index 116 */ 117 public String getLabel(int index) 118 { 119 Object obj = _list.get(index); 120 121 try 122 { 123 return BeanUtils.getProperty(obj, _labelField); 124 } catch (Exception e) 125 { 126 throw new RuntimeException("Error getting property", e); 127 } 128 } 129 130 /** 131 * Get the value at index. 132 * 133 * @param index 134 * Index 135 * @return value Value at index 136 */ 137 public String getValue(int index) 138 { 139 return String.valueOf(index); 140 } 141 142 public boolean isDisabled(int index) 143 { 144 return false; 145 } 146 147 /** 148 * Translate value to object. 149 * 150 * @param value 151 * Value 152 * @return object Object from value 153 */ 154 public Object translateValue(String value) 155 { 156 if (value == null) 157 { 158 return null; 159 } 160 161 return getOption( Integer.parseInt(value)); 162 } 163 164 public String toString() 165 { 166 return "BeanPropertySelectionModel[" + 167 "_list=" + _list + 168 '\n' + 169 ", _labelField='" + _labelField + '\'' + 170 '\n' + 171 ']'; 172 } 173 174 public boolean equals(Object o) 175 { 176 if (this == o) return true; 177 if (!(o instanceof BeanPropertySelectionModel)) return false; 178 179 BeanPropertySelectionModel that = (BeanPropertySelectionModel) o; 180 181 if (_labelField != null ? !_labelField.equals(that._labelField) : that._labelField != null) return false; 182 if (_list != null ? !_list.equals(that._list) : that._list != null) return false; 183 184 return true; 185 } 186 187 public int hashCode() 188 { 189 int result; 190 result = (_list != null ? _list.hashCode() : 0); 191 result = 31 * result + (_labelField != null ? _labelField.hashCode() : 0); 192 return result; 193 } 194 }