|
XmlXPathTableModel |
|
/* ** Luxor - XML User Interface Language (XUL) Toolkit ** Copyright (c) 2001, 2002 by Gerald Bauer ** ** This program is free software. ** ** You may redistribute it and/or modify it under the terms of the GNU ** General Public License as published by the Free Software Foundation. ** Version 2 of the license should be included with this distribution in ** the file LICENSE, as well as License.html. If the license is not ** included with this distribution, you may find a copy at the FSF web ** site at 'www.gnu.org' or 'www.fsf.org', or you may write to the ** Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139 USA. ** ** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, ** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR ** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY ** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR ** REDISTRIBUTION OF THIS SOFTWARE. ** */ package luxor.swing.datagrid; import java.util.*; import javax.swing.table.*; import org.jaxen.JaxenException; import org.jaxen.VariableContext; import org.jaxen.jdom.XPath; import org.jdom.*; import luxor.core.*; import luxor.core.widget.*; import luxor.status.*; /** * note: this code is expirimental it is currently extremely inefficient and * crude as some concepts still needs to worked out it will improve * substantially over the next couple of months */ public class XmlXPathTableModel extends AbstractTableModel implements VariableContext { static Logger T = Logger.getLogger( XmlXPathTableModel.class ); String _columnName[] = {}; XPath _columnSelect[] = {}; /* * public Class getColumnClass( int i ) { return _columnClass[i]; } */ int _currentRow; List _data; // aka rows/records in xml int _rowCount; public XmlXPathTableModel( DataGridDef def, Document doc ) { try { XPath rowSelect = def.getSelect( "/*/*" ); T.debug( "selecting rows from XML data using XPath expr " + rowSelect.toString() ); _data = rowSelect.selectNodes( doc ); } catch( JaxenException jex ) { Xul.error( "failed to select table rows using XPath expr: " + jex.toString() ); _data = Collections.EMPTY_LIST; } _rowCount = _data.size(); T.debug( _rowCount + " row(s) selected" ); List colDefs = def.getColGroupDef().getColDefs(); int colCount = colDefs.size(); _columnName = new String[colCount]; _columnSelect = new XPath[colCount]; for( int i = 0; i < colCount; i++ ) { ColDef colDef = ( ColDef ) colDefs.get( i ); _columnName[i] = colDef.getHeading( "" + ( i + 1 ) ); _columnSelect[i] = colDef.getSelect( "*[" + ( i + 1 ) + "]" ); // add XPath Variable Context to allow cross-referencing _columnSelect[i].setVariableContext( this ); } } public void setValue( Object obj, int row, int col ) { } public int getColumnCount() { return _columnName.length; } public int getColumnIndex( String name ) { for( int i = 0; i < _columnName.length; i++ ) { if( _columnName[i].equalsIgnoreCase( name ) ) return i; } return -1; // not found } public String getColumnName( int i ) { return _columnName[i]; } public int getRowCount() { return _rowCount; } public Object getValueAt( int row, int col ) { // todo: check for out of bound exception _currentRow = row; // keep track of current row for XPath-VariableContext Object rowObj = _data.get( row ); T.debug( "row[" + ( row + 1 ) + "]:" + rowObj.getClass().getName() + "=" + rowObj.toString() ); Object colObj; try { colObj = _columnSelect[col].evaluate( rowObj ); T.debug( "col[" + ( col + 1 ) + "]:" + colObj.getClass().getName() + "=" + colObj.toString() ); if( colObj instanceof List ) { List nodes = ( List ) colObj; T.debug( "nodes.size()=" + nodes.size() ); if( nodes.size() == 0 ) colObj = ""; else { Object node = nodes.get( 0 ); String clazz = node.getClass().getName(); String value = node.toString(); T.debug( clazz + "[0]=" + value ); if( node instanceof Element ) { colObj = ( ( Element ) node ).getTextTrim(); } else colObj = node.toString(); } } } catch( JaxenException jex ) { Xul.error( "failed to select column " + ( col + 1 ) + " in row " + ( row + 1 ) + " using XPath expr: " + jex.toString() ); colObj = ""; } return colObj; } /** * XPath VariableContext provider (aka variable lookup/resolver) */ public Object getVariableValue( String namespaceURI, String prefix, String localName ) { int col = getColumnIndex( localName ); // todo: should i return empty string instead of null? if( col == -1 ) return null; else return getValueAt( _currentRow, col ); } public boolean isCellEditable( int row, int col ) { return false; } }
|
XmlXPathTableModel |
|