1 package prefuse.data.tuple; 2 3 import java.util.Iterator ; 4 import java.util.logging.Logger ; 5 6 import prefuse.data.Graph; 7 import prefuse.data.Table; 8 import prefuse.data.Tuple; 9 import prefuse.util.StringLib; 10 import prefuse.util.collections.IntIterator; 11 12 21 public class TupleManager { 22 23 protected Graph m_graph; 24 protected Table m_table; 25 protected Class m_tupleType; 26 27 private TableTuple[] m_tuples; 28 29 33 public TupleManager(Table t, Graph g, Class tupleType) { 34 init(t, g, tupleType); 35 } 36 37 41 public void init(Table t, Graph g, Class tupleType) { 42 if ( m_table != null ) { 43 throw new IllegalStateException ( 44 "This TupleManager has already been initialized"); 45 } 46 m_table = t; 47 m_graph = g; 48 m_tupleType = tupleType; 49 m_tuples = null; 50 } 51 52 56 public Class getTupleType() { 57 return m_tupleType; 58 } 59 60 63 private void ensureTupleArray() { 64 int nrows = m_table.getRowCount(); 65 if ( m_tuples == null ) { 66 m_tuples = new TableTuple[nrows]; 67 } else if ( m_tuples.length < nrows ) { 68 int capacity = Math.max((3*m_tuples.length)/2 + 1, nrows); 69 TableTuple[] tuples = new TableTuple[capacity]; 70 System.arraycopy(m_tuples, 0, tuples, 0, m_tuples.length); 71 m_tuples = tuples; 72 } 73 } 74 75 80 public Tuple getTuple(int row) { 81 if ( m_table.isValidRow(row) ) { 82 ensureTupleArray(); 83 if ( m_tuples[row] == null ) { 84 return (m_tuples[row] = newTuple(row)); 85 } else { 86 return m_tuples[row]; 87 } 88 } else { 89 throw new IllegalArgumentException ("Invalid row index: "+row); 91 } 92 } 93 94 99 protected TableTuple newTuple(int row) { 100 try { 101 TableTuple t = (TableTuple)m_tupleType.newInstance(); 102 t.init(m_table, m_graph, row); 103 return t; 104 } catch ( Exception e ) { 105 Logger.getLogger(getClass().getName()).warning( 106 e.getMessage()+"\n"+StringLib.getStackTrace(e)); 107 return null; 108 } 109 } 110 111 115 public void invalidate(int row) { 116 if ( m_tuples == null || row < 0 || row >= m_tuples.length ) { 117 return; 118 } else if ( m_tuples[row] != null ) { 119 m_tuples[row].invalidate(); 120 m_tuples[row] = null; 121 } 122 } 123 124 127 public void invalidateAll() { 128 if ( m_tuples == null ) return; 129 for ( int i=0; i<m_tuples.length; ++i ) 130 invalidate(i); 131 } 132 133 138 public Iterator iterator(IntIterator rows) { 139 return new TupleManagerIterator(this, rows); 140 } 141 142 145 148 public class TupleManagerIterator implements Iterator { 149 150 private TupleManager m_tuples; 151 private IntIterator m_rows; 152 153 158 public TupleManagerIterator(TupleManager tuples, IntIterator rows) { 159 m_tuples = tuples; 160 m_rows = rows; 161 } 162 163 166 public boolean hasNext() { 167 return m_rows.hasNext(); 168 } 169 170 173 public Object next() { 174 return m_tuples.getTuple(m_rows.nextInt()); 175 } 176 177 180 public void remove() { 181 m_rows.remove(); 183 } 184 185 } 187 } | Popular Tags |