/*
* (C) Copyright IBM Corp. 2009
*
* LICENSE: Eclipse Public License v1.0
* http://www.eclipse.org/legal/epl-v10.html
*/
package com.ibm.gaiandb.plugins.wpml.schema;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
//import org.apache.derby.iapi.error.StandardException;
import org.apache.derby.iapi.types.DataValueDescriptor;
/**
* The anchor class for the Row, that will be passed for evaluation to the ObjectPEP.
* Provides functions for referencing columns of a row by name, as well as setting
* the cell data upon each call of {@link #setRowData(DataValueDescriptor[])} by
* {@link com.ibm.gaiandb.plugins.wpml.PolicyEnabledFilter#filterRow(DataValueDescriptor[])}
*
* @author pzerfos@us.ibm.com
*
*/
public class Row implements IRow {
// Use PROPRIETARY notice if class contains a main() method, otherwise use COPYRIGHT notice.
public static final String COPYRIGHT_NOTICE = "(c) Copyright IBM Corp. 2009";
/**
* Map between the column name and {@link Column} objects
*/
private HashMap<String, Column> columnsMap = null;
/**
* Map between column number that is queried and the column name
*/
private HashMap<Integer, String> columnsNumberMap = null;
/**
* an array with a map of the columns that are queried
*/
private int[] queriedColumns;
private int rowIndex;
public void setRowIndex( int idx ) {
rowIndex = idx;
}
/**
* Construct the {@link Row} object for policy evaluation using only
* columns that have been queried. It instantiates and populates the
* maps for finding the queries columns of the row
* @param logicalTableRSMD a {@link ResultSetMetaData} object with meta data information on the columns
* @param queriedColumns an array with columns that are actually queried
*/
public Row(ResultSetMetaData logicalTableRSMD, int[] queriedColumns) {
if (logicalTableRSMD == null) {
System.err.println("ERROR: PFG: cannot obtain meta data information on columns");
return;
}
// Create the mapping between column names and column objects
columnsMap = new HashMap<String, Column>();
columnsNumberMap = new HashMap<Integer, String>();
// Store in the Row only the columns that are queried
for (int i = 0; i < queriedColumns.length; i++) {
int columnNumber = queriedColumns[i];
String colName;
try {
colName = logicalTableRSMD.getColumnName(columnNumber);
Column col = new Column(colName, columnNumber);
columnsMap.put(colName, col);
columnsNumberMap.put(columnNumber, colName);
} catch (SQLException e) {
System.err.println("ERROR: PFG: could not retrieve column name for column " + columnNumber + " : " +
e.getMessage());
System.exit(1);
}
}
this.queriedColumns = queriedColumns;
}
/* (non-Javadoc)
* @see com.ibm.watson.pml.pfg.schema.IRow#getColumn(java.lang.String)
*/
public IColumn getColumnByName(String name) {
IColumn c = null;
// System.out.println("getColumnByName " + name);
/*
* If no column name has been specified, return an empty IColumn object
*/
if (name == null)
return new Column("", -1);
if (columnsMap.containsKey(name))
c = columnsMap.get(name);
if (c == null) {
System.out.println("getColumnByName() null");
return new Column("", -1);
}
return c;
}
/* (non-Javadoc)
* @see com.ibm.watson.pml.pfg.schema.IRow#getColumns()
*/
public ArrayList<IColumn> getColumns() {
ArrayList<IColumn> arrayListCols = new ArrayList<IColumn>(columnsMap.values());
return arrayListCols;
}
/**
* Set the DataValueDescriptors <i>only</i> for those columns in the record template
* that have been queried and are thus populated with data from the result set
*
* @param record the array of DataValueDescriptors, one for each column of the row
*/
public void setRowData(DataValueDescriptor[] record) {
/*
* Return if there was an error with the data in the record
*/
if (record == null)
return;
for (int i = 0; i < queriedColumns.length; i++) {
int columnNumber = queriedColumns[i];
String colName = columnsNumberMap.get(columnNumber);
columnsMap.get(colName).setColumnCellData(record[columnNumber - 1]);
}
}
/*
* (non-Javadoc)
* @see com.ibm.watson.pml.pfg.schema.IRow#hasColumn(java.lang.String)
*/
public boolean hasColumn(String columnName) {
// System.out.println("HasColumn " + columnName + " : " + columnsMap.get(columnName) + " :: " + columnsMap.containsKey(columnName));
return columnsMap.containsKey(columnName);
//
// IColumn column = null;
//
// column = columnsMap.get(columnName);
// if (column == null)
// return false;
// else
// return true;
}
/*
* (non-Javadoc)
* @see com.ibm.watson.pml.pfg.schema.IRow#getTypeColumn()
*/
public IColumn getTypeColumn() {
return getColumnByName("TYPE");
}
public int getIndex() {
return rowIndex;
}
// private String user = null;
// public void setUser( String uid ) {
// user = uid;
// }
//
// public boolean isIdentifiedAs(String uid) {
// return null == user ? false : user.equals(uid);
// }
}