View Javadoc

1   /*
2    * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
3    *
4    * This software is open source.
5    * See the bottom of this file for the licence.
6    */
7   
8   package org.dom4j.swing;
9   
10  import java.util.List;
11  
12  import javax.swing.table.AbstractTableModel;
13  
14  import org.dom4j.Document;
15  import org.dom4j.Element;
16  import org.dom4j.XPath;
17  
18  /***
19   * <p>
20   * <code>XMLTableDefinition</code> repro.
21   * </p>
22   * 
23   * @author <a href="mailto:jstrachan@apache.org">James Strachan </a>
24   * @version $Revision: 1.8 $
25   */
26  public class XMLTableModel extends AbstractTableModel {
27      /*** Holds value of property definition. */
28      private XMLTableDefinition definition;
29  
30      /*** Holds value of property source. */
31      private Object source;
32  
33      /*** The rows evaluated from the row XPath expression */
34      private List rows;
35  
36      /***
37       * Creates a TableModel from an XML table definition document and an XML
38       * source
39       * 
40       * @param tableDefinition
41       *            DOCUMENT ME!
42       * @param source
43       *            DOCUMENT ME!
44       */
45      public XMLTableModel(Element tableDefinition, Object source) {
46          this(XMLTableDefinition.load(tableDefinition), source);
47      }
48  
49      /***
50       * Creates a TableModel from an XML table definition document and an XML
51       * source
52       * 
53       * @param tableDefinition
54       *            DOCUMENT ME!
55       * @param source
56       *            DOCUMENT ME!
57       */
58      public XMLTableModel(Document tableDefinition, Object source) {
59          this(XMLTableDefinition.load(tableDefinition), source);
60      }
61  
62      public XMLTableModel(XMLTableDefinition definition, Object source) {
63          this.definition = definition;
64          this.source = source;
65      }
66  
67      public Object getRowValue(int rowIndex) {
68          return getRows().get(rowIndex);
69      }
70  
71      public List getRows() {
72          if (rows == null) {
73              rows = definition.getRowXPath().selectNodes(source);
74          }
75  
76          return rows;
77      }
78  
79      // TableModel interface
80      // -------------------------------------------------------------------------
81      public Class getColumnClass(int columnIndex) {
82          return definition.getColumnClass(columnIndex);
83      }
84  
85      public int getColumnCount() {
86          return definition.getColumnCount();
87      }
88  
89      public String getColumnName(int columnIndex) {
90          XPath xpath = definition.getColumnNameXPath(columnIndex);
91  
92          if (xpath != null) {
93              System.out.println("Evaluating column xpath: " + xpath + " value: "
94                      + xpath.valueOf(source));
95  
96              return xpath.valueOf(source);
97          }
98  
99          return definition.getColumnName(columnIndex);
100     }
101 
102     public Object getValueAt(int rowIndex, int columnIndex) {
103         try {
104             Object row = getRowValue(rowIndex);
105 
106             return definition.getValueAt(row, columnIndex);
107         } catch (Exception e) {
108             handleException(e);
109 
110             return null;
111         }
112     }
113 
114     public int getRowCount() {
115         return getRows().size();
116     }
117 
118     // Properties
119     // -------------------------------------------------------------------------
120 
121     /***
122      * Getter for property definition.
123      * 
124      * @return Value of property definition.
125      */
126     public XMLTableDefinition getDefinition() {
127         return definition;
128     }
129 
130     /***
131      * Setter for property definition.
132      * 
133      * @param definition
134      *            New value of property definition.
135      */
136     public void setDefinition(XMLTableDefinition definition) {
137         this.definition = definition;
138     }
139 
140     /***
141      * Getter for the XML source, which is usually a Node or List of nodes.
142      * 
143      * @return Value of property source.
144      */
145     public Object getSource() {
146         return source;
147     }
148 
149     /***
150      * Setter for the XML source, which is usually a Node or List of nodes.
151      * 
152      * @param source
153      *            New value of property source.
154      */
155     public void setSource(Object source) {
156         this.source = source;
157         this.rows = null;
158     }
159 
160     // Implementation methods
161     // -------------------------------------------------------------------------
162     protected void handleException(Exception e) {
163         // #### should use jakarta commons-logging
164         System.out.println("Caught: " + e);
165     }
166 }
167 
168 /*
169  * Redistribution and use of this software and associated documentation
170  * ("Software"), with or without modification, are permitted provided that the
171  * following conditions are met:
172  * 
173  * 1. Redistributions of source code must retain copyright statements and
174  * notices. Redistributions must also contain a copy of this document.
175  * 
176  * 2. Redistributions in binary form must reproduce the above copyright notice,
177  * this list of conditions and the following disclaimer in the documentation
178  * and/or other materials provided with the distribution.
179  * 
180  * 3. The name "DOM4J" must not be used to endorse or promote products derived
181  * from this Software without prior written permission of MetaStuff, Ltd. For
182  * written permission, please contact dom4j-info@metastuff.com.
183  * 
184  * 4. Products derived from this Software may not be called "DOM4J" nor may
185  * "DOM4J" appear in their names without prior written permission of MetaStuff,
186  * Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
187  * 
188  * 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
189  * 
190  * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND
191  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
192  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
193  * ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE
194  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
195  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
196  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
197  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
198  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
199  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
200  * POSSIBILITY OF SUCH DAMAGE.
201  * 
202  * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
203  */