src.com.ibm.as400.util.servlet.RowData Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jt400-jdk8 Show documentation
Show all versions of jt400-jdk8 Show documentation
The Open Source version of the IBM Toolbox for Java
The newest version!
///////////////////////////////////////////////////////////////////////////////
//
// JTOpen (IBM Toolbox for Java - OSS version)
//
// Filename: RowData.java
//
// The source code contained herein is licensed under the IBM Public License
// Version 1.0, which has been approved by the Open Source Initiative.
// Copyright (C) 1997-2000 International Business Machines Corporation and
// others. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
package com.ibm.as400.util.servlet;
import com.ibm.as400.access.ExtendedIllegalArgumentException;
import com.ibm.as400.access.ExtendedIllegalStateException;
import com.ibm.as400.access.Trace;
import java.beans.PropertyChangeSupport;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeSupport;
import java.beans.VetoableChangeListener;
import java.io.Serializable;
import java.util.Vector;
/**
* The RowData class defines a representation for describing and accessing
* a list of data.
*
* The RowData object maintains a position in the list pointing to its current row
* of data. The initial position is before the first row in the list. Row indexes are
* numbered starting with 0.
*
*
The number, types, and properties of the list's columns are provided
* by the RowMetaData object
* returned by the getMetaData method.
*
*
Individual data objects in the current row can have properties, or a list of objects,
* that can be associated with the data. Properties can be set with the setObjectProperties
* method.
*
*
RowData objects generate the following events:
*
* - PropertyChangeEvent
* - VetoableChangeEvent
*
**/
public abstract class RowData implements Serializable
{
static final long serialVersionUID = -5356418530948608994L;
// @B3C
protected Vector rows_; // The row data.
protected Vector rowProperties_; // The row data properties, where each column in the row contains a Vector of properties. @B6C
transient int maxLoad_; // The maximum resource list items to load at 1 time (equals the max table size).
transient int position_; // The current position in the list.
transient PropertyChangeSupport changes_; // The list of property change listeners.
transient VetoableChangeSupport vetos_; // The list of vetoable change listeners.
/**
* Constructs a default RowData object.
**/
public RowData()
{
rows_ = new Vector();
rowProperties_ = new Vector();
// Initialize the transient data.
initializeTransient();
}
/**
* Sets the position to the specified rowIndex.
* Attempting to move beyond the first row will move to the position before the first row.
* Attempting to move beyond the last row will move to the position after the last row.
*
* @param rowIndex The row index (0-based). The rowIndex must be zero or a positive integer which
* is less than the number of rows.
* @return true if the requested position exists; false otherwise.
**/
public boolean absolute(int rowIndex)
{
if (length() == 0 || rowIndex < 0) // position before first row. //$B1C
{
position_ = -1;
return false;
} //$B1C
else if (rowIndex >= length())
{
position_ = length(); // position after last row. //$B1C
return false;
}
else
{
position_ = rowIndex; // valid new position.
return true;
}
}
/**
* Adds a PropertyChangeListener.
* The specified PropertyChangeListener's propertyChange
* method is called each time the value of any bound property is changed.
* @see #removePropertyChangeListener
* @param listener The PropertyChangeListener.
**/
public void addPropertyChangeListener(PropertyChangeListener listener)
{
if (listener == null)
throw new NullPointerException("listener");
if (changes_ == null) changes_ = new PropertyChangeSupport(this); //@CRS
changes_.addPropertyChangeListener(listener);
}
/**
* Adds the VetoableChangeListener.
* The specified VetoableChangeListener's vetoableChange
* method is called each time the value of any constrained property is changed.
* @see #removeVetoableChangeListener
* @param listener The VetoableChangeListener.
**/
public void addVetoableChangeListener(VetoableChangeListener listener)
{
if (listener == null)
throw new NullPointerException("listener");
if (vetos_ == null) vetos_ = new VetoableChangeSupport(this); //@CRS
vetos_.addVetoableChangeListener(listener);
}
/**
* Sets the position after the last row in the list.
* This is a valid position after the end of the list.
**/
public void afterLast()
{
// Validate the list is not empty.
//@B4D validateRowList("Attempting to set the position in the list");
position_ = length(); //$B1C
}
/**
* Sets the position before the first row in the list.
* This is a valid position before the beginning of the list.
**/
public void beforeFirst()
{
// Validate the list is not empty.
//@B4D validateRowList("Attempting to set the position in the list");
position_ = -1;
}
/**
* Sets the position to the first row in the list.
*
* @return true if the requested position exists; false if the list is empty.
**/
public boolean first()
{
if (length() != 0) //$B1C
{
position_ = 0;
return true;
}
else
return false;
}
/**
* Returns the current row position.
*
* @return The row position (0-based).
**/
public int getCurrentPosition()
{
return position_;
}
/**
* Returns the meta data.
*
* @return The meta data.
* @exception RowDataException If a row data error occurs.
**/
public abstract RowMetaData getMetaData() throws RowDataException;
/**
* Returns the current row's column data specified at columnIndex.
*
* @param columnIndex The column index (0-based).
* @return The column object.
* @exception RowDataException If a row data error occurs.
**/
public Object getObject(int columnIndex) throws RowDataException
{
// Validate that the list is not empty.
validateRowList("Attempting to get the column object");
// Get the current row.
validateListPosition("Attempting to get the current object");
Object[] row = (Object[])rows_.elementAt(position_);
// Validate the column parameter.
if ( columnIndex < 0 || columnIndex >= row.length )
throw new ExtendedIllegalArgumentException("columnIndex", ExtendedIllegalArgumentException.RANGE_NOT_VALID);
return row[columnIndex];
}
/**
* Returns the data object's property list at the specified columnIndex.
*
* @param columnIndex The column index (0-based).
* @return The property list for the column data object.
* @see com.ibm.as400.util.servlet.RowData#setObjectProperties
**/
public Vector getObjectProperties(int columnIndex)
{
// Validate that the list is not empty.
validateRowList("Attempting to get the column object's properties");
// Get the current row.
validateListPosition("Attempting to get the current object's properties");
Vector[] propertyList = (Vector[])rowProperties_.elementAt(position_);
// Validate the columnIndex parameter.
if ( columnIndex < 0 || columnIndex >= propertyList.length )
throw new ExtendedIllegalArgumentException("columnIndex", ExtendedIllegalArgumentException.RANGE_NOT_VALID);
return propertyList[columnIndex];
}
/**
* Returns the current row's property list.
* Each Vector in the properties list corresponds to the
* appropriate data object's list of properties.
* @return The property lists for each data object in the row.
**/
public Vector[] getRowProperties()
{
// Validate that the list is not empty.
validateRowList("Attempting to get the row's property list");
// Get the current row.
validateListPosition("Attempting to get the row's property list");
return(Vector[])rowProperties_.elementAt(position_);
}
/**
* Initializes the transient data.
**/
private void initializeTransient()
{
maxLoad_ = 0;
position_ = -1; // Set the initial position before the first row.
//@CRS changes_ = new PropertyChangeSupport(this);
//@CRS vetos_ = new VetoableChangeSupport(this);
}
/**
* Indicates whether the current position is after the last row in the list.
* This is a valid position after the end of the list.
* @return true if the position is after the last row; false otherwise.
**/
public boolean isAfterLast()
{
if (position_ == length()) //$B1C
return true;
else
return false;
}
/**
* Indicates whether the current position is before the first row in the list.
* This is a valid position before the beginning of the list.
* @return true if the position is before the first row and the list is not empty; false otherwise.
**/
public boolean isBeforeFirst()
{
if (length() != 0 && position_ == -1) //$B1C
return true;
else
return false;
}
/**
* Indicates whether the current position is the first row in the list.
*
* @return true if the position is the first row; false otherwise.
**/
public boolean isFirst()
{
if (position_ == 0)
return true;
else
return false;
}
/**
* Indicates whether the current position is the last row in the list.
*
* @return true if the position is the last row; false otherwise.
**/
public boolean isLast()
{
if (length() != 0 && position_ == (length() -1)) //$B1C
return true;
else
return false;
}
/**
* Sets the position to the last row in the list.
*
* @return true if the requested position exists; false if the list is empty.
**/
public boolean last()
{ //$B1C
if (length() != 0)
{
position_ = length() - 1; //$B1C
return true;
}
else
return false;
}
/**
* Returns the number of rows in the list.
*
* @return The number of rows.
**/
public int length()
{
return rows_.size();
}
/**
* Sets the position to the next row in the list.
* The list is initially positioned before its first row. The first call
* to next makes the first row the current row, the second call makes
* the second row the current row, etc. Moving beyond last row in the list will
* result in a position after the last row.
* @return true if the requested position exists in the list; false if there are no more rows.
**/
public boolean next()
{
if (length() == 0) //$B1C
return false;
else
{ //$B1C
if (position_ < length())
position_++; // update position if the current position is valid.
if (position_ == length()) //$B1C
return false; // new position is after last row.
else
return true;
}
}
/**
* Sets the position to the previous row in the list.
* Moving beyond the first row in the list will result in a position before the first row.
* @return true if the requested position exists in the list; false otherwise.
**/
public boolean previous()
{
if (position_- 1 >= -1) // current position must be valid. (i.e. empty list - invalid)
position_--;
if (position_ == -1) // new position is before first row.
return false;
else
return true;
}
/**
* Deserializes and initializes transient data.
**/
private void readObject(java.io.ObjectInputStream in)
throws java.io.IOException, ClassNotFoundException, RowDataException
{
in.defaultReadObject();
initializeTransient();
}
/**
* Sets the position a relative numberOfRows based on the current position.
* Moving beyond the first/last row in the list will result in a position
* before/after the first/last row.
*
* @param numberOfRows The number of rows to move, either positive or negative.
* @return true if the requested position exists; false otherwise.
**/
public boolean relative(int numberOfRows)
{
// Determine new position;
int temp = position_ + numberOfRows;
// Check if new position is valid.
if (length() == 0 || temp < 0) // position before first row. //$B1C
{
position_ = -1;
return false;
} //$B1C
else if (temp >= length()) // position after last row.
{
position_ = length(); //$B1C
return false;
}
else // Valid new position.
{
position_ = temp;
return true;
}
}
/**
* Removes the PropertyChangeListener from the internal list.
* If the PropertyChangeListener is not on the list, nothing is done.
* @see #addPropertyChangeListener
* @param listener The PropertyChangeListener.
**/
public void removePropertyChangeListener(PropertyChangeListener listener)
{
if (listener == null)
throw new NullPointerException("listener");
if (changes_ != null) changes_.removePropertyChangeListener(listener); //@CRS
}
/**
* Removes the VetoableChangeListener from the internal list.
* If the VetoableChangeListener is not on the list, nothing is done.
* @see #addVetoableChangeListener
* @param listener The VetoableChangeListener.
**/
public void removeVetoableChangeListener(VetoableChangeListener listener)
{
if (listener == null)
throw new NullPointerException("listener");
if (vetos_ != null) vetos_.removeVetoableChangeListener(listener); //@CRS
}
/**
* Sets the data object's properties at the specified columnIndex.
* Object properties are user defined objects that can be associated with
* the data in the row.
*
* @param properties The properties.
* @param columnIndex The column index (0-based).
* @see com.ibm.as400.util.servlet.RowData#getObjectProperties
**/
public void setObjectProperties(Vector properties, int columnIndex)
{
if (Trace.isTraceOn())
Trace.log(Trace.INFORMATION, "Setting the column object's properties.");
// Validate that the list is not empty.
validateRowList("Attempting to set a column object's properties");
// Validate the properties parameter.
if (properties == null)
throw new NullPointerException("properties");
// Validate the current row.
validateListPosition("Attempting to set a column object's properties");
// Get the column parameter list.
Vector[] propertyList = (Vector[])rowProperties_.elementAt(position_);
// Validate the columnIndex parameter.
if (columnIndex < 0 || columnIndex >= propertyList.length)
throw new ExtendedIllegalArgumentException("columnIndex", ExtendedIllegalArgumentException.RANGE_NOT_VALID);
// Set the properties.
propertyList[columnIndex] = properties;
rowProperties_.setElementAt(propertyList, position_);
}
/**
* Validates the position in the list.
* @param attemptedAction The attempted action on the list.
**/
void validateListPosition(String attemptedAction)
{
if (isBeforeFirst() || isAfterLast())
{
Trace.log(Trace.ERROR, attemptedAction + " when the position in the list is invalid.");
throw new ExtendedIllegalStateException("position", ExtendedIllegalStateException.PROPERTY_NOT_SET);
}
}
/**
* Validate the row list is not empty.
* @param attemptedAction The attempted action on the list.
**/
void validateRowList(String attemptedAction)
{
// Validate that the list is not empty.
if (length() == 0) //$B1C
{
Trace.log(Trace.ERROR, attemptedAction + " before adding a row to the list.");
throw new ExtendedIllegalStateException("rows", ExtendedIllegalStateException.PROPERTY_NOT_SET);
}
}
}