1 19 20 package org.netbeans.modules.dbschema.nodes; 21 22 import java.beans.PropertyChangeListener ; 23 import java.beans.PropertyChangeEvent ; 24 import java.util.*; 25 26 import org.openide.nodes.Children; 27 import org.openide.nodes.Node; 28 import org.openide.util.WeakListeners; 29 30 import org.netbeans.modules.dbschema.*; 31 32 34 public class TableChildren extends Children.Keys { 35 36 protected static HashMap propToFilter; 37 38 39 protected DBElement element; 40 41 protected TableElementFilter filter; 42 43 protected DBElementNodeFactory factory; 44 45 private PropertyChangeListener wPropL; 46 48 private DBElementListener propL; 49 50 protected Collection[] cpl; 51 52 private boolean nodesInited = false; 53 54 55 private static Comparator comparator = new Comparator () { 56 public int compare (Object o1, Object o2) { 57 if (o1 instanceof DBMemberElement) 58 if (o2 instanceof DBMemberElement) 59 return ((DBMemberElement)o1).getName().getName().compareToIgnoreCase(((DBMemberElement) o2).getName().getName()); 60 else 61 return -1; 62 else 63 if (o2 instanceof DBMemberElement) 64 return 1; 65 else 66 return 0; 67 } 68 }; 69 70 static { 71 propToFilter = new HashMap (); 72 propToFilter.put (DBElementProperties.PROP_TABLES, new Integer (TableElementFilter.TABLE | TableElementFilter.VIEW)); 73 propToFilter.put (DBElementProperties.PROP_COLUMNS, new Integer (TableElementFilter.COLUMN)); 74 propToFilter.put (DBElementProperties.PROP_COLUMN_PAIRS, new Integer (TableElementFilter.COLUMN_PAIR)); 75 propToFilter.put (DBElementProperties.PROP_INDEXES, new Integer (TableElementFilter.INDEX)); 76 propToFilter.put (DBElementProperties.PROP_KEYS, new Integer (TableElementFilter.FK)); 77 } 78 79 83 public TableChildren (final DBElement element) { 84 this(DefaultDBFactory.READ_ONLY, element); 85 } 86 87 92 public TableChildren (final DBElementNodeFactory factory, final DBElement element) { 93 super(); 94 this.element = element; 95 this.factory = factory; 96 this.filter = null; 97 } 98 99 100 101 104 public Class getFilterClass () { 105 return TableElementFilter.class; 106 } 107 108 110 public Object getFilter () { 111 return filter; 112 } 113 114 117 public void setFilter (final Object filter) { 118 if (!(filter instanceof TableElementFilter)) 119 throw new IllegalArgumentException (); 120 121 this.filter = (TableElementFilter)filter; 122 if (nodesInited) 124 refreshAllKeys (); 125 } 126 127 129 132 protected void addNotify () { 133 refreshAllKeys (); 134 if (wPropL == null) { 136 propL = new DBElementListener(); 137 wPropL = WeakListeners.propertyChange (propL, element); 138 } 139 140 element.addPropertyChangeListener (wPropL); 141 nodesInited = true; 142 } 143 144 protected void removeNotify () { 145 setKeys (java.util.Collections.EMPTY_SET); 146 nodesInited = false; 147 } 148 149 152 protected Node[] createNodes (final Object key) { 153 if (key instanceof ColumnElement) 154 return new Node[] {factory.createColumnNode((ColumnElement) key)}; 155 156 if (key instanceof ColumnPairElement) 157 return new Node[] {factory.createColumnPairNode((ColumnPairElement) key)}; 158 159 if (element instanceof TableElement) { 160 boolean viewSupport = isViewSupport((TableElement) element); 161 if (((TableElement) element).isTableOrView() || viewSupport) { 162 if (key instanceof IndexElement) 164 return new Node[] { factory.createIndexNode((IndexElement)key) }; 165 if (key instanceof ForeignKeyElement) 166 return new Node[] { factory.createForeignKeyNode((ForeignKeyElement)key) }; 167 } 168 } 169 170 return new Node[0]; 172 } 173 174 175 176 177 180 protected void refreshAllKeys () { 181 cpl = new Collection [getOrder ().length]; 182 refreshKeys (TableElementFilter.ALL); 183 } 184 185 187 protected void refreshKeys (int filter) { 188 int[] order = getOrder (); 189 LinkedList keys = new LinkedList(); 190 191 for (int i = 0; i < order.length; i++) 193 if (((order[i] & filter) != 0) || (cpl [i] == null)) 194 keys.addAll(cpl [i] = getKeysOfType(order[i])); 195 else 196 keys.addAll(cpl [i]); 197 198 setKeys(keys); 200 } 201 202 204 protected Collection getKeysOfType (final int elementType) { 205 LinkedList keys = new LinkedList(); 206 207 ColumnElement[] columns = null; 208 ColumnPairElement[] pairs = null; 209 if (element instanceof TableElement) 210 columns = ((TableElement) element).getColumns(); 211 if (element instanceof IndexElement) 212 columns = ((IndexElement) element).getColumns(); 213 if (element instanceof ForeignKeyElement) 214 pairs = ((ForeignKeyElement) element).getColumnPairs(); 215 216 if ((elementType & TableElementFilter.COLUMN) != 0) 217 if (columns != null) 218 filterModifiers(columns, keys); 219 else 220 if (pairs != null) 221 filterModifiers(pairs, keys); 222 223 if (element instanceof TableElement) { 224 225 boolean viewSupport = isViewSupport (((TableElement) element)); 226 227 228 if (((TableElement) element).isTableOrView() || viewSupport) { 229 if ((elementType & TableElementFilter.INDEX) != 0) 231 filterModifiers(((TableElement) element).getIndexes(), keys); 232 if ((elementType & TableElementFilter.FK) != 0) 233 filterModifiers(((TableElement) element).getKeys(), keys); 234 } 235 } 236 237 if ((filter == null) || filter.isSorted ()) 238 Collections.sort(keys, comparator); 239 240 return keys; 241 } 242 243 246 private boolean isViewSupport( TableElement element){ 247 String db = element.getDeclaringSchema().getDatabaseProductName(); 248 boolean viewSupport =false; 249 if (db!=null){ 250 db = db.toLowerCase(); 251 viewSupport = (db.indexOf("oracle") != -1 || db.indexOf("microsoft sql server") != -1) ? true : false; 252 } 253 return viewSupport; 254 } 255 256 258 private void filterModifiers (DBMemberElement[] elements, Collection keys) { 259 int i, k = elements.length; 260 for (i = 0; i < k; i ++) 261 keys.add (elements [i]); 262 } 263 264 266 protected int[] getOrder () { 267 return (filter == null || (filter.getOrder() == null)) ? TableElementFilter.DEFAULT_ORDER : filter.getOrder(); 268 } 269 270 272 274 private final class DBElementListener implements PropertyChangeListener { 275 public DBElementListener () {} 276 277 282 public void propertyChange (PropertyChangeEvent evt) { 283 Integer i = (Integer ) propToFilter.get (evt.getPropertyName ()); 284 if (i != null) 285 refreshKeys(i.intValue()); 286 } 287 } } 289 | Popular Tags |