/* * Copyright 2003,2004 Colin Crist * * 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 hermes.browser.model; import hermes.browser.HermesBrowser; import hermes.config.PropertyConfig; import hermes.config.PropertySetConfig; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import java.util.Vector; import javax.swing.table.AbstractTableModel; import javax.xml.bind.JAXBException; import org.apache.commons.beanutils.BeanUtils; import org.apache.log4j.Logger; /** * @author colincrist@hermesjms.com * @version $Id: PropertySetTableModel.java,v 1.2 2004/07/30 17:25:14 colincrist * Exp $ */ public class PropertySetTableModel extends AbstractTableModel { /** * */ private static final long serialVersionUID = 6861616752274437531L; private static Set ignore = new HashSet(); private static final Logger log = Logger.getLogger(BeanTableModel.class); private final PropertySetConfig propertySet; private Map filter; private final Vector rows = new Vector(); private final String[] columns = { "Property", "Value" }; private Object bean; private Map beanProperties; static { ignore.add("class"); } public PropertySetTableModel(Object bean, PropertySetConfig propertySet, Set filter) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { this.propertySet = propertySet; Set iterSet = null; SortedMap sortMap = new TreeMap(); if (propertySet.getProperty() != null) { for (Iterator iter = propertySet.getProperty().iterator(); iter.hasNext();) { PropertyConfig property = (PropertyConfig) iter.next(); if (!ignore.contains(property.getName())) { Object propertyValue = property.getValue(); if (propertyValue == null) { propertyValue = "null"; } sortMap.put(property.getName(), propertyValue); } } for (Iterator iter2 = sortMap.entrySet().iterator(); iter2.hasNext();) { Map.Entry entry = (Map.Entry) iter2.next(); Vector row = new Vector(); row.add(entry.getKey()); row.add(entry.getValue()); rows.add(row); } } setBean(bean); } public void setBean(Object bean) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { beanProperties = new TreeMap(BeanUtils.describe(bean)); for (Iterator iter = ignore.iterator(); iter.hasNext();) { beanProperties.remove((iter.next())); } for (Iterator iter = rows.iterator(); iter.hasNext();) { Vector row = (Vector) iter.next(); String propertyName = (String) row.elementAt(0); if (propertyName == null || propertyName.equals("") || !isValidProperty(propertyName)) { log.debug(propertyName + " is not a valid property for " + bean.getClass().getName() + " - removed"); iter.remove(); } } fireTableDataChanged(); } public Set getValidProperties() { return beanProperties.keySet(); } public boolean isValidProperty(String propertyName) { return getValidProperties().contains(propertyName); } public void insertRow() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { Vector row = new Vector(); row.add(""); row.add(""); rows.add(row); fireTableRowsInserted(rows.size() - 1, rows.size()); } public void removeRow(int index) { if (index < rows.size()) { Vector r = (Vector) rows.remove(index); } fireTableDataChanged(); } /** * @see javax.swing.table.TableModel#getRowCount() */ @Override public int getRowCount() { return rows.size(); } /** * @see javax.swing.table.TableModel#getColumnCount() */ @Override public int getColumnCount() { return columns.length; } /** * @see javax.swing.table.TableModel#getValueAt(int, int) */ @Override public Object getValueAt(int arg0, int arg1) { Vector row = (Vector) rows.elementAt(arg0); return row.elementAt(arg1); } @Override public String getColumnName(int x) { return columns[x]; } @Override public boolean isCellEditable(int y, int x) { return true; } @Override public void setValueAt(Object value, int y, int x) { Vector row = (Vector) rows.elementAt(y); String propertyName; Object propertyValue; if (x == 0) { propertyName = (String) value; propertyValue = row.elementAt(1); if (isValidProperty(propertyName)) { row.set(0, value); } else { log.error(propertyName + " is not a valid property for " + bean.getClass().getName()); } } else { propertyName = (String) row.elementAt(0); propertyValue = value; row.set(1, value); } log.debug("set (cached) " + propertyName + "=" + propertyValue.toString()); fireTableCellUpdated(y, x); } public List getProperties() throws JAXBException { List list = new ArrayList(); for (Iterator iter = rows.iterator(); iter.hasNext();) { Vector row = (Vector) iter.next(); String key = (String) row.elementAt(0); String value = (String) row.elementAt(1); if (key != null && !key.equals("")) { PropertyConfig pConfig = HermesBrowser.getConfigDAO().getFactory().createPropertyConfig(); pConfig.setName(key); pConfig.setValue(value); list.add(pConfig); } else { iter.remove(); } } return list; } }