|
What this is
Other links
The source code
// $Header: /home/cvs/jakarta-jmeter/src/jorphan/org/apache/jorphan/collections/Data.java,v 1.9 2004/03/24 15:23:37 mstover1 Exp $
/*
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.jorphan.collections;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.jorphan.util.JOrphanUtils;
import org.apache.log.Logger;
/**
* Use this class to store database-like data. This class uses rows and
* columns to organize its data. It has some convenience methods that allow
* fast loading and retrieval of the data into and out of string arrays. It
* is also handy for reading CSV files.
*
* @author Michael Stover (mstover1 at apache.org)
* @version $Revision: 1.9 $
*/
public class Data implements Serializable
{
private static Logger log = LoggingManager.getLoggerForClass();
Map data;
//Map iterators = new HashMap();
// Hashtable dataLine;
ArrayList header;
// saves current position in data Vector
int currentPos, size;
/**
* Constructor - takes no arguments.
*/
public Data()
{
header = new ArrayList();
data = new HashMap();
currentPos = -1;
size = currentPos + 1;
}
/**
* Replaces the given header name with a new header name.
* @param oldHeader Old header name.
* @param newHeader New header name.
*/
public void replaceHeader(String oldHeader, String newHeader)
{
List tempList;
int index = header.indexOf(oldHeader);
header.set(index, newHeader);
tempList = (List) data.remove(oldHeader);
data.put(newHeader, tempList);
}
/**
* Adds the rows of the given Data object to this Data object.
* @param d data object to be appended to this one
*/
public void append(Data d)
{
boolean valid = true;
String[] headers = getHeaders();
String[] dHeaders = d.getHeaders();
if (headers.length != dHeaders.length)
{
valid = false;
}
else
{
for (int count = 0; count < dHeaders.length; count++)
{
if (!header.contains(dHeaders[count]))
{
valid = false;
}
}
}
if (valid)
{
currentPos = size;
d.reset();
while (d.next())
{
for (int count = 0; count < headers.length; count++)
{
addColumnValue(
headers[count],
d.getColumnValue(headers[count]));
}
}
}
}
/**
* Get the number of the current row.
* @return integer representing the current row
*/
public int getCurrentPos()
{
return currentPos;
}
/**
* Removes the current row.
*/
public void removeRow()
{
List tempList;
Iterator it = data.keySet().iterator();
log.debug("removing row, size = " + size);
if (currentPos > -1 && currentPos < size)
{
log.debug("got to here");
while (it.hasNext())
{
tempList = (List) data.get(it.next());
tempList.remove(currentPos);
}
if (currentPos > 0)
{
currentPos--;
}
size--;
}
}
public void removeRow(int index)
{
log.debug("Removing row: " + index);
if (index < size)
{
setCurrentPos(index);
log.debug("Setting currentpos to " + index);
removeRow();
}
}
public void addRow()
{
String[] headers = getHeaders();
List tempList = new ArrayList();
for (int i = 0; i < headers.length; i++)
{
if ((tempList = (ArrayList) data.get(header.get(i))) == null)
{
tempList = new ArrayList();
data.put(headers[i], tempList);
}
tempList.add("");
}
size = tempList.size();
setCurrentPos(size - 1);
}
/**
* Sets the current pos. If value sent to method is not a valid number,
* the current position is set to one higher than the maximum.
* @param r position to set to.
*/
public void setCurrentPos(int r)
{
currentPos = r;
}
/**
* Sorts the data using a given row as the sorting criteria. A boolean
* value indicates whether to sort ascending or descending.
*
* @param column name of column to use as sorting criteria.
* @param asc boolean value indicating whether to sort ascending or
* descending. True for asc, false for desc. Currently this
* feature is not enabled and all sorts are asc.
*/
public void sort(String column, boolean asc)
{
sortData(column, 0, size);
}
private void swapRows(int row1, int row2)
{
List temp;
Object o;
Iterator it = data.keySet().iterator();
while (it.hasNext())
{
temp = (List) data.get(it.next());
o = temp.get(row1);
temp.set(row1, temp.get(row2));
temp.set(row2, o);
}
}
/**
* Private method that implements the quicksort algorithm to sort the rows
* of the Data object.
*
* @param column name of column to use as sorting criteria.
* @param start starting index (for quicksort algorithm).
* @param end ending index (for quicksort algorithm).
*/
private void sortData(String column, int start, int end)
{
int x = start, y = end - 1;
String basis =
((List) data.get(column)).get((int) ((x + y) / 2)).toString();
if (x == y)
{
return;
}
while (x <= y)
{
while (x < end
&& ((List) data.get(column)).get(x).toString().compareTo(basis)
< 0)
{
x++;
}
while (y >= (start - 1)
&& ((List) data.get(column)).get(y).toString().compareTo(basis)
> 0)
{
y--;
}
if (x <= y)
{
swapRows(x, y);
x++;
y--;
}
}
if (x == y)
{
x++;
}
y = end - x;
if (x > 0)
{
sortData(column, start, x);
}
if (y > 0)
{
sortData(column, x, end);
}
}
/**
* Gets the number of rows in the Data object.
* @return number of rows in Data object.
*/
public int size()
{
return size;
} // end method
/**
* Adds a value into the Data set at the current row, using a column name
* to find the column in which to insert the new value.
* @param column the name of the column to set.
* @param value value to set into column.
*/
public void addColumnValue(String column, Object value)
{
ArrayList tempList;
if ((tempList = (ArrayList) data.get(column)) == null)
{
tempList = new ArrayList();
data.put(column, tempList);
}
int s = tempList.size();
if (currentPos == -1)
{
currentPos = size;
}
if (currentPos >= size)
{
size = currentPos + 1;
}
while (currentPos > s)
{
s++;
tempList.add(null);
}
if (currentPos == s)
{
tempList.add(value);
}
else
{
tempList.set(currentPos, value);
}
}
/**
* Returns the row number where a certain value is.
*
* @param column column to be searched for value.
* @param value object in Search of.
* @return row # where value exists.
*/
public int findValue(String column, Object value)
{
List list = (List) data.get(column);
int ret = -1;
ret = list.indexOf(value);
return ret;
}
/**
* Sets the value in the Data set at the current row, using a column name
* to find the column in which to insert the new value.
*
* @param column the name of the column to set.
* @param value value to set into column.
*/
public void setColumnValue(String column, Object value)
{
List tempList;
if ((tempList = (List) data.get(column)) == null)
{
tempList = new ArrayList();
data.put(column, tempList);
}
if (currentPos == -1)
{
currentPos = 0;
}
if (currentPos >= size)
{
size++;
tempList.add(value);
}
else if (currentPos >= tempList.size())
{
tempList.add(value);
}
else
{
tempList.set(currentPos, value);
}
}
/**
* Checks to see if a column exists in the Data object.
* @param column Name of column header to check for.
* @return True or False depending on whether the column exists.
*/
public boolean hasHeader(String column)
{
return data.containsKey(column);
}
/**
* Sets the current position of the Data set to the next row.
* @return True if there is another row. False if there are no more rows.
*/
public boolean next()
{
return (++currentPos < size);
}
/**
* Gets a Data object from a ResultSet.
*
* @param rs ResultSet passed in from a database query
* @return a Data object
* @throws java.sql.SQLException
*/
public static Data getDataFromResultSet(ResultSet rs) throws SQLException
{
ResultSetMetaData meta = rs.getMetaData();
Data data = new Data();
int numColumns = meta.getColumnCount();
String[] dbCols = new String[numColumns];
for (int i = 0; i < numColumns; i++)
{
dbCols[i] = meta.getColumnName(i + 1);
data.addHeader(dbCols[i]);
}
while (rs.next())
{
data.next();
for (int i = 0; i < numColumns; i++)
{
Object o = rs.getObject(i + 1);
if (o instanceof byte[])
{
o = new String((byte[]) o);
}
data.addColumnValue(dbCols[i], o);
}
}
return data;
}
/**
* Sets the current position of the Data set to the previous row.
* @return True if there is another row. False if there are no more rows.
*/
public boolean previous()
{
return (--currentPos >= 0);
}
/**
* Resets the current position of the data set to just before the first
* element.
*/
public void reset()
{
currentPos = -1;
}
/**
* Gets the value in the current row of the given column.
* @param column name of the column.
* @return an Object which holds the value of the column.
*/
public Object getColumnValue(String column)
{
try
{
if (currentPos < size)
{
return ((List) data.get(column)).get(currentPos);
}
else
{
return null;
}
}
catch (Exception e)
{
return null;
}
}
/**
* Gets the value in the current row of the given column.
* @param column index of the column (starts at 0).
* @return an Object which holds the value of the column.
*/
public Object getColumnValue(int column)
{
String columnName = (String) header.get(column);
try
{
if (currentPos < size)
{
return ((List) data.get(columnName)).get(currentPos);
}
else
{
return null;
}
}
catch (Exception e)
{
return null;
}
}
public Object getColumnValue(int column, int row)
{
setCurrentPos(row);
return getColumnValue(column);
}
public void removeColumn(int col)
{
String columnName = (String) header.get(col);
data.remove(columnName);
header.remove(columnName);
}
/**
* Sets the headers for the data set. Each header represents a column
* of data. Each row's data can be gotten with the column header name,
* which will always be a string.
*
* @param h array of strings representing the column headers.
*/
public void setHeaders(String[] h)
{
int x = 0;
header = new ArrayList(h.length);
for (x = 0; x < h.length; x++)
{
header.add(h[x]);
data.put(h[x], new ArrayList());
}
}
/**
* Returns a String array of the column headers.
* @return array of strings of the column headers.
*/
public String[] getHeaders()
{
String[] r = new String[header.size()];
if (r.length > 0)
{
r = (String[]) header.toArray(r);
}
return r;
}
/**
* This method will retrieve every entry in a certain column. It returns
* an array of Objects from the column.
*
* @param columnName name of the column.
* @return array of Objects representing the data.
*/
public List getColumnAsObjectArray(String columnName)
{
return (List) data.get(columnName);
}
/**
* This method will retrieve every entry in a certain column. It returns
* an array of strings from the column. Even if the data are not strings,
* they will be returned as strings in this method.
*
* @param columnName name of the column.
* @return array of Strings representing the data.
*/
public String[] getColumn(String columnName)
{
String[] returnValue;
Object o;
List temp = (List) data.get(columnName);
if (temp != null)
{
returnValue = new String[temp.size()];
Iterator it = temp.iterator();
int index = 0;
while (it.hasNext())
{
o = it.next();
if (o != null)
{
if (o instanceof String)
{
returnValue[index++] = (String) o;
}
else
{
returnValue[index++] = o.toString();
}
}
}
}
else
{
returnValue = new String[0];
}
return returnValue;
}
/**
* Use this method to set the entire data set. It takes an array of
* strings. It uses the first row as the headers, and the next rows
* as the data elements. Delimiter represents the delimiting character(s)
* that separate each item in a data row.
*
* @param contents array of strings, the first element is a list of the
* column headers, the next elements each represent a
* single row of data.
* @param delimiter the delimiter character that separates columns within
* the string array.
*/
public void setData(String[] contents, String delimiter)
{
setHeaders(JOrphanUtils.split(contents[0], delimiter));
int x = 1;
while (x < contents.length)
{
setLine(JOrphanUtils.split(contents[x++], delimiter));
}
}
/*
Deletes a header from the Data object.
Takes the column name as input. It will delete the entire
column.
public void deleteHeader(String s)
{
}*/
/**
* Sets the data for every row in the column.
*/
public void setColumnData(String colName, Object value)
{
List list = this.getColumnAsObjectArray(colName);
while (list.size() < size())
{
list.add(value);
}
}
public void setColumnData(int col, List data)
{
reset();
Iterator iter = data.iterator();
String columnName = (String) header.get(col);
while (iter.hasNext())
{
next();
setColumnValue(columnName, iter.next());
}
}
/**
* Adds a header name to the Data object.
* @param s name of header.
*/
public void addHeader(String s)
{
header.add(s);
data.put(s, new ArrayList(size()));
}
/**
* Sets a row of data using an array of strings as input. Each value in
* the array represents a column's value in that row. Assumes the order
* will be the same order in which the headers were added to the data set.
*
* @param line array of strings representing column values.
*/
public void setLine(String[] line)
{
List tempList;
String[] h = getHeaders();
for (int count = 0; count < h.length; count++)
{
tempList = (List) data.get(h[count]);
if (count < line.length && line[count].length() > 0)
{
tempList.add(line[count]);
}
else
{
tempList.add("N/A");
}
}
size++;
}
/**
* Sets a row of data using an array of strings as input. Each value in
* the array represents a column's value in that row. Assumes the order
* will be the same order in which the headers were added to the data set.
*
* @param line array of strings representing column values.
* @param deflt default value to be placed in data if line is not as long
* as headers.
*/
public void setLine(String[] line, String deflt)
{
List tempList;
String[] h = getHeaders();
for (int count = 0; count < h.length; count++)
{
tempList = (List) data.get(h[count]);
if (count < line.length && line[count].length() > 0)
{
tempList.add(line[count]);
}
else
{
tempList.add(deflt);
}
}
size++;
}
/**
* Returns all the data in the Data set as an array of strings. Each
* array gives a row of data, each column separated by tabs.
*
* @return array of strings.
*/
public String[] getDataAsText()
{
StringBuffer temp = new StringBuffer("");
String[] line = new String[size + 1];
String[] elements = getHeaders();
for (int count = 0; count < elements.length; count++)
{
temp.append(elements[count]);
if (count + 1 < elements.length)
{
temp.append("\t");
}
}
line[0] = temp.toString();
reset();
int index = 1;
while (next())
{
temp = new StringBuffer("");
for (int count = 0; count < elements.length; count++)
{
temp.append(getColumnValue(count));
if (count + 1 < elements.length)
{
temp.append("\t");
}
}
line[index++] = temp.toString();
}
return line;
}
public String toString()
{
String[] contents = getDataAsText();
StringBuffer sb = new StringBuffer();
boolean first = true;
for (int x = 0; x < contents.length; x++)
{
if (!first)
{
sb.append("\n");
}
else
{
first = false;
}
sb.append(contents[x]);
}
return sb.toString();
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.