001/* ======================================================================== 002 * JCommon : a free general purpose class library for the Java(tm) platform 003 * ======================================================================== 004 * 005 * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors. 006 * 007 * Project Info: http://www.jfree.org/jcommon/index.html 008 * 009 * This library is free software; you can redistribute it and/or modify it 010 * under the terms of the GNU Lesser General Public License as published by 011 * the Free Software Foundation; either version 2.1 of the License, or 012 * (at your option) any later version. 013 * 014 * This library is distributed in the hope that it will be useful, but 015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 017 * License for more details. 018 * 019 * You should have received a copy of the GNU Lesser General Public 020 * License along with this library; if not, write to the Free Software 021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 022 * USA. 023 * 024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 025 * in the United States and other countries.] 026 * 027 * ------------------------------- 028 * SystemPropertiesTableModel.java 029 * ------------------------------- 030 * (C) Copyright 2000-2008, by Object Refinery Limited. 031 * 032 * Original Author: David Gilbert (for Object Refinery Limited); 033 * Contributor(s): -; 034 * 035 * $Id: SystemPropertiesTableModel.java,v 1.6 2008/12/18 09:57:32 mungady Exp $ 036 * 037 * Changes (from 26-Oct-2001) 038 * -------------------------- 039 * 26-Oct-2001 : Changed package to com.jrefinery.ui (DG); 040 * 28-Feb-2001 : Changed package to com.jrefinery.ui.about (DG); 041 * 15-Mar-2002 : Modified to use a ResourceBundle for elements that require 042 * localisation (DG); 043 * 08-Oct-2002 : Fixed errors reported by Checkstyle (DG); 044 * 18-Dec-2008 : Use ResourceBundleWrapper - see JFreeChart patch 1607918 by 045 * Jess Thrysoee (DG); 046 * 047 */ 048 049package org.jfree.ui.about; 050 051import java.util.Collections; 052import java.util.Comparator; 053import java.util.Iterator; 054import java.util.List; 055import java.util.Properties; 056import java.util.ResourceBundle; 057 058import org.jfree.ui.SortableTableModel; 059import org.jfree.util.ResourceBundleWrapper; 060 061/** 062 * A sortable table model containing the system properties. 063 * 064 * @author David Gilbert 065 */ 066public class SystemPropertiesTableModel extends SortableTableModel { 067 068 /** 069 * Useful class for holding the name and value of a system property. 070 * 071 */ 072 protected static class SystemProperty { 073 074 /** The property name. */ 075 private String name; 076 077 /** The property value. */ 078 private String value; 079 080 /** 081 * Standard constructor - builds a new SystemProperty. 082 * 083 * @param name the property name. 084 * @param value the property value. 085 */ 086 public SystemProperty(final String name, final String value) { 087 this.name = name; 088 this.value = value; 089 } 090 091 /** 092 * Returns the property name. 093 * 094 * @return the property name. 095 */ 096 public String getName() { 097 return this.name; 098 } 099 100 /** 101 * Returns the property value. 102 * 103 * @return the property value. 104 */ 105 public String getValue() { 106 return this.value; 107 } 108 109 } 110 111 /** 112 * A class for comparing SystemProperty objects. 113 * 114 */ 115 protected static class SystemPropertyComparator implements Comparator { 116 117 /** Indicates the sort order. */ 118 private boolean ascending; 119 120 /** 121 * Standard constructor. 122 * 123 * @param ascending a flag that controls the sort order (ascending or 124 * descending). 125 */ 126 public SystemPropertyComparator(final boolean ascending) { 127 this.ascending = ascending; 128 } 129 130 /** 131 * Compares two objects. 132 * 133 * @param o1 the first object. 134 * @param o2 the second object. 135 * 136 * @return an integer that indicates the relative order of the objects. 137 */ 138 public int compare(final Object o1, final Object o2) { 139 140 if ((o1 instanceof SystemProperty) 141 && (o2 instanceof SystemProperty)) { 142 final SystemProperty sp1 = (SystemProperty) o1; 143 final SystemProperty sp2 = (SystemProperty) o2; 144 if (this.ascending) { 145 return sp1.getName().compareTo(sp2.getName()); 146 } 147 else { 148 return sp2.getName().compareTo(sp1.getName()); 149 } 150 } 151 else { 152 return 0; 153 } 154 155 } 156 157 /** 158 * Returns <code>true</code> if this object is equal to the specified 159 * object, and <code>false</code> otherwise. 160 * 161 * @param o the other object. 162 * 163 * @return A boolean. 164 */ 165 public boolean equals(final Object o) { 166 if (this == o) { 167 return true; 168 } 169 if (!(o instanceof SystemPropertyComparator)) { 170 return false; 171 } 172 173 final SystemPropertyComparator systemPropertyComparator 174 = (SystemPropertyComparator) o; 175 176 if (this.ascending != systemPropertyComparator.ascending) { 177 return false; 178 } 179 180 return true; 181 } 182 183 /** 184 * Returns a hash code value for the object. 185 * 186 * @return the hashcode 187 */ 188 public int hashCode() { 189 return (this.ascending ? 1 : 0); 190 } 191 } 192 193 /** Storage for the properties. */ 194 private List properties; 195 196 /** Localised name column label. */ 197 private String nameColumnLabel; 198 199 /** Localised property column label. */ 200 private String valueColumnLabel; 201 202 /** 203 * Creates a new table model using the properties of the current Java 204 * Virtual Machine. 205 */ 206 public SystemPropertiesTableModel() { 207 208 this.properties = new java.util.ArrayList(); 209 try { 210 final Properties p = System.getProperties(); 211 final Iterator iterator = p.keySet().iterator(); 212 while (iterator.hasNext()) { 213 final String name = (String) iterator.next(); 214 final String value = System.getProperty(name); 215 final SystemProperty sp = new SystemProperty(name, value); 216 this.properties.add(sp); 217 } 218 } 219 catch (SecurityException se) { 220 // ignore SecurityExceptions 221 } 222 223 Collections.sort(this.properties, new SystemPropertyComparator(true)); 224 225 final String baseName = "org.jfree.ui.about.resources.AboutResources"; 226 final ResourceBundle resources = ResourceBundleWrapper.getBundle( 227 baseName); 228 229 this.nameColumnLabel = resources.getString( 230 "system-properties-table.column.name"); 231 this.valueColumnLabel = resources.getString( 232 "system-properties-table.column.value"); 233 234 } 235 236 /** 237 * Returns true for the first column, and false otherwise - sorting is only 238 * allowed on the first column. 239 * 240 * @param column the column index. 241 * 242 * @return true for column 0, and false for all other columns. 243 */ 244 public boolean isSortable(final int column) { 245 246 if (column == 0) { 247 return true; 248 } 249 else { 250 return false; 251 } 252 253 } 254 255 /** 256 * Returns the number of rows in the table model (that is, the number of 257 * system properties). 258 * 259 * @return the row count. 260 */ 261 public int getRowCount() { 262 return this.properties.size(); 263 } 264 265 /** 266 * Returns the number of columns in the table model. In this case, there 267 * are two columns: one for the property name, and one for the property 268 * value. 269 * 270 * @return the column count (always 2 in this case). 271 */ 272 public int getColumnCount() { 273 return 2; 274 } 275 276 /** 277 * Returns the name of the specified column. 278 * 279 * @param column the column index. 280 * 281 * @return the column name. 282 */ 283 public String getColumnName(final int column) { 284 285 if (column == 0) { 286 return this.nameColumnLabel; 287 } 288 else { 289 return this.valueColumnLabel; 290 } 291 292 } 293 294 /** 295 * Returns the value at the specified row and column. This method supports 296 * the TableModel interface. 297 * 298 * @param row the row index. 299 * @param column the column index. 300 * 301 * @return the value. 302 */ 303 public Object getValueAt(final int row, final int column) { 304 305 final SystemProperty sp = (SystemProperty) this.properties.get(row); 306 if (column == 0) { 307 return sp.getName(); 308 } 309 else { 310 if (column == 1) { 311 return sp.getValue(); 312 } 313 else { 314 return null; 315 } 316 } 317 318 } 319 320 /** 321 * Sorts on the specified column. 322 * 323 * @param column the column index. 324 * @param ascending a flag that controls the sort order. 325 * 326 */ 327 public void sortByColumn(final int column, final boolean ascending) { 328 329 if (isSortable(column)) { 330 super.sortByColumn(column, ascending); 331 Collections.sort(this.properties, 332 new SystemPropertyComparator(ascending)); 333 } 334 335 } 336 337 338}