X-Git-Url: http://git.phpeclipse.com 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 index 0000000..65716d0 --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/sql/SQLResultSetResults.java @@ -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; + } +}