// Modified or written by Object Mentor, Inc. for inclusion with FitNesse. // Copyright (c) 2002 Cunningham & Cunningham, Inc. // Released under the terms of the GNU General Public License version 2 or later. package fit; // Copyright (c) 2002 Cunningham & Cunningham, Inc. // Released under the terms of the GNU General Public License version 2 or later. public class ColumnFixture extends Fixture { protected Binding columnBindings[]; protected boolean hasExecuted = false; // Traversal //////////////////////////////// public void doRows(Parse rows) { bind(rows.parts); super.doRows(rows.more); } public void doRow(Parse row) { hasExecuted = false; try { reset(); super.doRow(row); if (!hasExecuted) { execute(); } } catch (Exception e) { exception(row.leaf(), e); } } public void doCell(Parse cell, int column) { try { columnBindings[column].doCell(this, cell); } catch (Throwable e) { exception(cell, e); } } public void check(Parse cell, TypeAdapter a) { try { executeIfNeeded(); } catch (Exception e) { exception(cell, e); } super.check(cell, a); } protected void executeIfNeeded() throws Exception { if (!hasExecuted) { hasExecuted = true; execute(); } } public void reset() throws Exception { // about to process first cell of row } public void execute() throws Exception { // about to process first method call of row } // Utility ////////////////////////////////// protected void bind(Parse heads) { try { columnBindings = new Binding[heads.size()]; for (int i = 0; heads != null; i++, heads = heads.more) { columnBindings[i] = createBinding(i, heads); } } catch (Throwable throwable) { exception(heads, throwable); } } protected Binding createBinding(int column, Parse heads) throws Throwable { return Binding.create(this, heads.text()); } }