001/* ======================================================================== 002 * JCommon : a free general purpose class library for the Java(tm) platform 003 * ======================================================================== 004 * 005 * (C) Copyright 2000-2005, 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-2004, by Object Refinery Limited. 031 * 032 * Original Author: David Gilbert (for Object Refinery Limited); 033 * Contributor(s): -; 034 * 035 * $Id: SystemPropertiesTableModel.java,v 1.5 2005/10/18 13:19:13 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 localisation (DG); 042 * 08-Oct-2002 : Fixed errors reported by Checkstyle (DG); 043 * 044 */ 045 046package org.jfree.ui.about; 047 048import java.util.Collections; 049import java.util.Comparator; 050import java.util.Iterator; 051import java.util.List; 052import java.util.Properties; 053import java.util.ResourceBundle; 054 055import org.jfree.ui.SortableTableModel; 056 057/** 058 * A sortable table model containing the system properties. 059 * 060 * @author David Gilbert 061 */ 062public class SystemPropertiesTableModel extends SortableTableModel { 063 064 /** 065 * Useful class for holding the name and value of a system property. 066 * 067 */ 068 protected static class SystemProperty { 069 070 /** The property name. */ 071 private String name; 072 073 /** The property value. */ 074 private String value; 075 076 /** 077 * Standard constructor - builds a new SystemProperty. 078 * 079 * @param name the property name. 080 * @param value the property value. 081 */ 082 public SystemProperty(final String name, final String value) { 083 this.name = name; 084 this.value = value; 085 } 086 087 /** 088 * Returns the property name. 089 * 090 * @return the property name. 091 */ 092 public String getName() { 093 return this.name; 094 } 095 096 /** 097 * Returns the property value. 098 * 099 * @return the property value. 100 */ 101 public String getValue() { 102 return this.value; 103 } 104 105 } 106 107 /** 108 * A class for comparing SystemProperty objects. 109 * 110 */ 111 protected static class SystemPropertyComparator implements Comparator { 112 113 /** Indicates the sort order. */ 114 private boolean ascending; 115 116 /** 117 * Standard constructor. 118 * 119 * @param ascending a flag that controls the sort order (ascending or descending). 120 */ 121 public SystemPropertyComparator(final boolean ascending) { 122 this.ascending = ascending; 123 } 124 125 /** 126 * Compares two objects. 127 * 128 * @param o1 the first object. 129 * @param o2 the second object. 130 * 131 * @return an integer that indicates the relative order of the objects. 132 */ 133 public int compare(final Object o1, final Object o2) { 134 135 if ((o1 instanceof SystemProperty) && (o2 instanceof SystemProperty)) { 136 final SystemProperty sp1 = (SystemProperty) o1; 137 final SystemProperty sp2 = (SystemProperty) o2; 138 if (this.ascending) { 139 return sp1.getName().compareTo(sp2.getName()); 140 } 141 else { 142 return sp2.getName().compareTo(sp1.getName()); 143 } 144 } 145 else { 146 return 0; 147 } 148 149 } 150 151 /** 152 * Returns <code>true</code> if this object is equal to the specified object, and 153 * <code>false</code> otherwise. 154 * 155 * @param o the other object. 156 * 157 * @return A boolean. 158 */ 159 public boolean equals(final Object o) { 160 if (this == o) { 161 return true; 162 } 163 if (!(o instanceof SystemPropertyComparator)) { 164 return false; 165 } 166 167 final SystemPropertyComparator systemPropertyComparator = (SystemPropertyComparator) o; 168 169 if (this.ascending != systemPropertyComparator.ascending) { 170 return false; 171 } 172 173 return true; 174 } 175 176 /** 177 * Returns a hash code value for the object. 178 * 179 * @return the hashcode 180 */ 181 public int hashCode() { 182 return (this.ascending ? 1 : 0); 183 } 184 } 185 186 /** Storage for the properties. */ 187 private List properties; 188 189 /** Localised name column label. */ 190 private String nameColumnLabel; 191 192 /** Localised property column label. */ 193 private String valueColumnLabel; 194 195 /** 196 * Creates a new table model using the properties of the current Java Virtual Machine. 197 */ 198 public SystemPropertiesTableModel() { 199 200 this.properties = new java.util.ArrayList(); 201 try { 202 final Properties p = System.getProperties(); 203 final Iterator iterator = p.keySet().iterator(); 204 while (iterator.hasNext()) { 205 final String name = (String) iterator.next(); 206 final String value = System.getProperty(name); 207 final SystemProperty sp = new SystemProperty(name, value); 208 this.properties.add(sp); 209 } 210 } 211 catch (SecurityException se) { 212 // ignore SecurityExceptions 213 } 214 215 Collections.sort(this.properties, new SystemPropertyComparator(true)); 216 217 final String baseName = "org.jfree.ui.about.resources.AboutResources"; 218 final ResourceBundle resources = ResourceBundle.getBundle(baseName); 219 220 this.nameColumnLabel = resources.getString("system-properties-table.column.name"); 221 this.valueColumnLabel = resources.getString("system-properties-table.column.value"); 222 223 } 224 225 /** 226 * Returns true for the first column, and false otherwise - sorting is only allowed on the 227 * first column. 228 * 229 * @param column the column index. 230 * 231 * @return true for column 0, and false for all other columns. 232 */ 233 public boolean isSortable(final int column) { 234 235 if (column == 0) { 236 return true; 237 } 238 else { 239 return false; 240 } 241 242 } 243 244 /** 245 * Returns the number of rows in the table model (that is, the number of system properties). 246 * 247 * @return the row count. 248 */ 249 public int getRowCount() { 250 return this.properties.size(); 251 } 252 253 /** 254 * Returns the number of columns in the table model. In this case, there are two columns: one 255 * for the property name, and one for the property value. 256 * 257 * @return the column count (always 2 in this case). 258 */ 259 public int getColumnCount() { 260 return 2; 261 } 262 263 /** 264 * Returns the name of the specified column. 265 * 266 * @param column the column index. 267 * 268 * @return the column name. 269 */ 270 public String getColumnName(final int column) { 271 272 if (column == 0) { 273 return this.nameColumnLabel; 274 } 275 else { 276 return this.valueColumnLabel; 277 } 278 279 } 280 281 /** 282 * Returns the value at the specified row and column. This method supports the TableModel 283 * interface. 284 * 285 * @param row the row index. 286 * @param column the column index. 287 * 288 * @return the value. 289 */ 290 public Object getValueAt(final int row, final int column) { 291 292 final SystemProperty sp = (SystemProperty) this.properties.get(row); 293 if (column == 0) { 294 return sp.getName(); 295 } 296 else { 297 if (column == 1) { 298 return sp.getValue(); 299 } 300 else { 301 return null; 302 } 303 } 304 305 } 306 307 /** 308 * Sorts on the specified column. 309 * 310 * @param column the column index. 311 * @param ascending a flag that controls the sort order. 312 * 313 */ 314 public void sortByColumn(final int column, final boolean ascending) { 315 316 if (isSortable(column)) { 317 super.sortByColumn(column, ascending); 318 Collections.sort(this.properties, new SystemPropertyComparator(ascending)); 319 } 320 321 } 322 323 324}