Quantum version 2.4.1
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.quantum.sql / src / com / quantum / sql / SQLResultSetResults.java
diff --git a/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/sql/SQLResultSetResults.java b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/sql/SQLResultSetResults.java
new file mode 100644 (file)
index 0000000..65716d0
--- /dev/null
@@ -0,0 +1,271 @@
+package com.quantum.sql;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+
+import com.quantum.model.Bookmark;
+import com.quantum.model.Entity;
+
+/**
+ * @author Tom Schneider
+ * @author BC Holmes
+ */
+public abstract class SQLResultSetResults extends SQLResults {
+       
+       
+       class ColumnArrayComparator implements Comparator {
+
+               public int compare(Object arg0, Object arg1) {
+                       return compare((Column[]) arg0, (Column[]) arg1);
+               }
+               public int compare(Column[] columns0, Column[] columns1) {
+                       
+                       if (columns0 == null && columns1 == null) {
+                               return 0;
+                       } else if (columns0 == null) {
+                               return -1;
+                       } else if (columns1 == null) {
+                               return 1;
+                       } else if (columns0.length < columns1.length) {
+                               return -1;
+                       } else if (columns0.length > columns1.length) {
+                               return 1;
+                       } else {
+                               int result = 0;
+                               for (int i = 0, length = columns1 == null ? 0 : columns1.length; 
+                                               result == 0 && i < length; i++) {
+                                       result = compare(columns0[i], columns1[i]);
+                               }
+                               return result;
+                       }
+               }
+               /**
+                * @param columns0
+                * @param columns1
+                * @param result
+                * @param i
+                * @return
+                */
+               private int compare(Column column0, Column column1) {
+
+                       if (column0 == null && column1 == null) {
+                               return 0;
+                       } else if (column0 == null) {
+                               return -1;
+                       } else if (column1 == null) {
+                               return 1;
+                       } else if (column0.getName() == null) {
+                               return -1;
+                       } else if (column1.getName() == null) {
+                               return 1;
+                       } else if (column0.getName() != null && column1.getName() != null
+                                       && column0.getName().compareTo(column1.getName()) != 0) {
+                               return column0.getName().compareTo(column1.getName());
+                       } else if (column0.getType() == null) {
+                               return -1;
+                       } else if (column1.getType() == null) {
+                               return 1;
+                       } else if (column0.getType() != null && column1.getType() != null
+                                       && column0.getType().compareTo(column1.getType()) != 0) {
+                               return column0.getType().compareTo(column1.getType());
+                       } else {
+                               return column0.getSize() - column1.getSize();
+                       }
+               }
+       }
+       
+       public class Row {
+               private final List elements;
+
+               Row(List elements) {
+                       this.elements = elements;
+               }
+               
+               public Object get(int columnNumber) {
+                       return (columnNumber > this.elements.size() || columnNumber <= 0) 
+                                       ? null 
+                                       : this.elements.get(columnNumber - 1);
+               }
+               
+               public SQLResultSetResults getResultSet() {
+                       return SQLResultSetResults.this;
+               }
+       }
+       
+       public class Column {
+               private final String name;
+               private final String type;
+               private final int size;
+
+               Column(String name, String type, int size) {
+                       this.name = name;
+                       this.type = type;
+                       this.size = size;
+               }
+               public String getName() {
+                       return this.name;
+               }
+               public int getSize() {
+                       return this.size;
+               }
+               public String getType() {
+                       return this.type;
+               }
+       }
+       
+       private List rows = Collections.synchronizedList(new ArrayList());
+       private List columns = Collections.synchronizedList(new ArrayList());
+       private String query;
+       private Bookmark bookmark;
+       private final Entity entity;
+       private String encoding = "";
+       
+       private FilterSort filterSort = null;
+       
+       /**
+        * @param entity
+        * @param query2
+        */
+       public SQLResultSetResults(String query, Bookmark bookmark, Entity entity) {
+               this.query = query;
+               this.bookmark = bookmark;
+               this.entity = entity;
+       }
+       public String getColumnName(int columnNumber) {
+               Column column = getColumn(columnNumber);
+               return column == null ? "" : column.getName();
+                       
+       }
+       /**
+        * @param columnNumber
+        * @return
+        */
+       protected Column getColumn(int columnNumber) {
+               return columnNumber <= this.columns.size() 
+                                       ? (Column) this.columns.get(columnNumber-1)
+                                       : null;
+       }
+       public Column[] getColumns() {
+               return (Column[]) this.columns.toArray(new Column[this.columns.size()]);
+       }
+       protected void setColumns(Column[] columns) {
+               Column[] original = getColumns();
+               if (new ColumnArrayComparator().compare(original, columns) != 0) {
+                       this.columns.clear();
+                       this.columns.addAll(Arrays.asList(columns));
+                       this.propertyChangeSupport.firePropertyChange("columns", original, columns);
+               }
+       }
+       public Object getElement(int column, int row) {
+               return ((Row) rows.get(row - 1)).get(column);
+       }
+       public int getColumnCount() {
+               if (columns.size() > 0) {
+                       return columns.size();
+               }
+               return 0;
+       }
+       public int getRowCount() {
+               return rows.size();
+       }
+       public String[] getColumnNames() {
+               List names = new ArrayList();
+               for (Iterator i = this.columns.iterator(); i.hasNext();) {
+                       Column column = (Column) i.next();
+                       names.add(column.getName());
+               }
+               return (String[]) names.toArray(new String[names.size()]);
+       }
+       /**
+        * Returns the resultSet.
+        * @return boolean
+        */
+       public boolean isResultSet() {
+               return true;
+       }
+       public Row[] getRows() {
+               return (Row[]) rows.toArray(new Row[this.rows.size()]);
+       }
+       /**
+        * Returns the query.
+        * @return String
+        */
+       public String getQuery() {
+               return this.query;
+       }
+       public String getFilteredQuery() {
+               if (this.filterSort == null) {
+                       return this.query;
+               } else {
+                       return this.query + this.filterSort.toString();
+               }
+       }
+       public Bookmark getBookmark() {
+               return this.bookmark;
+       }
+
+       public Entity getEntity() {
+               return this.entity;
+       }
+       /**
+        * Returns the resultSet.
+        * @return boolean
+        */
+       public boolean isMetaData() {
+               return false;
+       }
+       private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
+
+       public void addPropertyChangeListener(PropertyChangeListener listener) {
+               this.propertyChangeSupport.addPropertyChangeListener(listener);
+       }
+       public void removePropertyChangeListener(PropertyChangeListener listener) {
+               this.propertyChangeSupport.removePropertyChangeListener(listener);
+       }
+       protected abstract void parseResultSet(ResultSet set) throws SQLException;
+       
+       public void refresh(Connection connection) throws SQLException {
+               Statement statement = connection.createStatement();
+               try {
+                       ResultSet resultSet = statement.executeQuery(getFilteredQuery());
+                       try {
+                               parseResultSet(resultSet);
+                       } finally {
+                               resultSet.close();
+                       }
+               } finally {
+                       statement.close();
+               }
+       }
+       
+       protected void setRows(Row[] rows) {
+               Row[] original = getRows();
+               this.rows.clear();
+               if (rows != null) {
+                       this.rows.addAll(Arrays.asList(rows));
+               }
+               this.propertyChangeSupport.firePropertyChange("rows", original, getRows());
+       }
+       public String getEncoding() {
+               return this.encoding;
+       }
+       public void setEncoding(String encoding) {
+               this.encoding = encoding;
+       }
+       public FilterSort getFilterSort() {
+               return this.filterSort;
+       }
+       public void setFilterSort(FilterSort filterSort) {
+               this.filterSort = filterSort;
+       }
+}