You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by do...@apache.org on 2012/08/31 11:28:27 UTC
svn commit: r1379382 - in /empire-db/trunk:
empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/
empire-db-struts2/src/main/java/org/apache/empire/struts2/actionsupport/
empire-db/src/main/java/org/apache...
Author: doebele
Date: Fri Aug 31 09:28:27 2012
New Revision: 1379382
URL: http://svn.apache.org/viewvc?rev=1379382&view=rev
Log:
EMPIREDB-167
Optimize state changes and provide new overrideables for DBRecord
Modified:
empire-db/trunk/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/SampleRecord.java
empire-db/trunk/empire-db-struts2/src/main/java/org/apache/empire/struts2/actionsupport/RecordActionSupport.java
empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java
empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBRecord.java
empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBTable.java
empire-db/trunk/empire-db/src/test/java/org/apache/empire/db/SerializeTest.java
Modified: empire-db/trunk/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/SampleRecord.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/SampleRecord.java?rev=1379382&r1=1379381&r2=1379382&view=diff
==============================================================================
--- empire-db/trunk/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/SampleRecord.java (original)
+++ empire-db/trunk/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/SampleRecord.java Fri Aug 31 09:28:27 2012
@@ -31,7 +31,7 @@ public abstract class SampleRecord<T ext
protected T T; // The table
public SampleRecord(T table) {
- super.init(table, DBRecord.State.Invalid, null);
+ super(table);
this.T = table;
}
Modified: empire-db/trunk/empire-db-struts2/src/main/java/org/apache/empire/struts2/actionsupport/RecordActionSupport.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db-struts2/src/main/java/org/apache/empire/struts2/actionsupport/RecordActionSupport.java?rev=1379382&r1=1379381&r2=1379382&view=diff
==============================================================================
--- empire-db/trunk/empire-db-struts2/src/main/java/org/apache/empire/struts2/actionsupport/RecordActionSupport.java (original)
+++ empire-db/trunk/empire-db-struts2/src/main/java/org/apache/empire/struts2/actionsupport/RecordActionSupport.java Fri Aug 31 09:28:27 2012
@@ -554,7 +554,13 @@ public class RecordActionSupport extends
}
else
{ // No Checking
- record.modifyValue(i, value);
+ boolean validate = record.isValidateFieldValues();
+ try {
+ record.setValidateFieldValues(false);
+ record.setValue(i, value);
+ } finally {
+ record.setValidateFieldValues(validate);
+ }
return true;
}
}
Modified: empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java?rev=1379382&r1=1379381&r2=1379382&view=diff
==============================================================================
--- empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java (original)
+++ empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java Fri Aug 31 09:28:27 2012
@@ -135,7 +135,7 @@ public abstract class DBCommandExpr exte
/** Returns the error message: ERR_NOTSUPPORTED */
@Override
- public void initRecord(DBRecord rec, DBRecord.State initialState, Object[] keyValues)
+ public void initRecord(DBRecord rec, Object[] keyValues, boolean insert)
{
throw new NotSupportedException(this, "initRecord");
}
Modified: empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBQuery.java?rev=1379382&r1=1379381&r2=1379382&view=diff
==============================================================================
--- empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBQuery.java (original)
+++ empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBQuery.java Fri Aug 31 09:28:27 2012
@@ -343,10 +343,10 @@ public class DBQuery extends DBRowSet
* @param keyValues an array of the primary key columns
*/
@Override
- public void initRecord(DBRecord rec, DBRecord.State initialState, Object[] keyValues)
+ public void initRecord(DBRecord rec, Object[] keyValues, boolean insert)
{
// Prepare
- prepareInitRecord(rec, initialState, keyValues);
+ prepareInitRecord(rec, keyValues, insert);
// Initialize all Fields
Object[] fields = rec.getFields();
for (int i = 0; i < fields.length; i++)
@@ -405,7 +405,7 @@ public class DBQuery extends DBRowSet
// Read Record
readRecord(rec, cmd, conn);
// Set RowSetData
- rec.changeState(DBRecord.State.Valid, key.clone());
+ rec.updateComplete(key.clone());
} catch (QueryNoResultException e) {
// Record not found
throw new RecordNotFoundException(this, key);
@@ -584,7 +584,7 @@ public class DBQuery extends DBRowSet
}
}
// success
- rec.changeState(DBRecord.State.Valid, keys);
+ rec.updateComplete(keys);
}
/**
Modified: empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBRecord.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBRecord.java?rev=1379382&r1=1379381&r2=1379382&view=diff
==============================================================================
--- empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBRecord.java (original)
+++ empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBRecord.java Fri Aug 31 09:28:27 2012
@@ -77,6 +77,7 @@ public class DBRecord extends DBRecordDa
private DBRowSet rowset;
private Object[] fields;
private boolean[] modified;
+ private boolean validateFieldValues;
// Special Rowset Data (usually null)
private Object rowsetData;
@@ -93,6 +94,14 @@ public class DBRecord extends DBRecordDa
fields = null;
modified = null;
rowsetData = null;
+ validateFieldValues = true;
+ }
+
+ public DBRecord(DBRowSet initialRowset)
+ {
+ this();
+ // allow initial rowset
+ rowset = initialRowset;
}
/**
@@ -101,25 +110,39 @@ public class DBRecord extends DBRecordDa
* @param state the state of the record
* @param rowSetData any further RowSet specific data
*/
- protected void init(DBRowSet rowset, State state, Object rowSetData)
+ protected void init(DBRowSet rowset, Object rowSetData, boolean newRecord)
{
// Init
- if (this.rowset != rowset)
+ boolean rowsetChanged = (this.rowset != rowset);
+ if (rowsetChanged)
{ // Set Rowset
this.rowset = rowset;
if (rowset!=null)
fields = new Object[rowset.getColumns().size()];
else
fields = null;
- onRowSetChanged();
}
else if (fields!=null)
{ // clear fields
for (int i=0; i<fields.length; i++)
- fields[i]=null;
+ fields[i]=null; // ObjectUtils.NO_VALUE -> works too (difference?);
}
// Set State
- changeState(state, rowSetData);
+ this.rowsetData = rowSetData;
+ this.modified = null;
+ changeState((rowset==null ? State.Invalid : (newRecord ? State.New : State.Valid)));
+ // notify
+ if (rowsetChanged)
+ onRowSetChanged();
+ }
+
+ /**
+ * changes the state of the record
+ * @param newState
+ */
+ protected void changeState(State newState)
+ {
+ this.state = newState;
}
/**
@@ -131,18 +154,6 @@ public class DBRecord extends DBRecordDa
{
return fields;
}
-
- /**
- * This method is used internally be the RowSet to change the record's state<BR>
- * @param state
- * @param rowSetData
- */
- protected void changeState(State state, Object rowSetData)
- {
- this.state = state;
- this.rowsetData = rowSetData;
- this.modified = null;
- }
/**
* Closes the record by releasing all resources and resetting the record's state to invalid.
@@ -150,7 +161,7 @@ public class DBRecord extends DBRecordDa
@Override
public void close()
{
- init(null, State.Invalid, null);
+ init(null, null, false);
}
/** {@inheritDoc} */
@@ -160,13 +171,14 @@ public class DBRecord extends DBRecordDa
try
{
DBRecord rec = (DBRecord)super.clone();
- rec.rowset = rowset;
- rec.state = state;
+ rec.rowset = this.rowset;
+ rec.state = this.state;
if (rec.fields == fields && fields!=null)
rec.fields = fields.clone();
if (rec.modified == modified && modified!=null)
rec.modified = modified.clone();
- rec.rowsetData = rowsetData;
+ rec.rowsetData = this.rowsetData;
+ rec.validateFieldValues = this.validateFieldValues;
return rec;
} catch (CloneNotSupportedException e)
@@ -389,7 +401,7 @@ public class DBRecord extends DBRecordDa
modified[index] = isModified;
// Set State to modified, if not already at least modified and isModified is set to true
if (state.isLess(State.Modified) && isModified)
- state = State.Modified;
+ changeState(State.Modified);
// Reset state to unmodified, if currently modified and not modified anymore after the change
if (state == State.Modified && !isModified)
{
@@ -403,12 +415,12 @@ public class DBRecord extends DBRecordDa
}
if (recordNotModified)
{
- state = State.Valid;
+ changeState(State.Valid);
}
}
}
-
- /**
+
+ /**
* returns an array of key columns which uniquely identify the record.
* @return the array of key columns if any
*/
@@ -496,7 +508,7 @@ public class DBRecord extends DBRecordDa
* @param i index of the column
* @param value the column value
*/
- public void modifyValue(int i, Object value)
+ protected void modifyValue(int i, Object value)
{ // Check valid
if (state == State.Invalid)
throw new ObjectNotValidException(this);
@@ -514,7 +526,7 @@ public class DBRecord extends DBRecordDa
fields[i] = value;
// Set State
if (state.isLess(State.Modified))
- state = State.Modified;
+ changeState(State.Modified);
// field changed
onFieldChanged(i);
}
@@ -541,16 +553,14 @@ public class DBRecord extends DBRecordDa
return; // no change
// Field has changed
DBColumn column = rowset.getColumn(index);
- if (column.isAutoGenerated())
+ // Check whether we can change this field
+ if (!allowFieldChange(column))
{ // Read Only column may be set
throw new FieldIsReadOnlyException(column);
}
- if (state!=State.New && rowset.isKeyColumn(column))
- { // Key columns cannot be changed
- throw new FieldIsReadOnlyException(column);
- }
// Is Value valid
- column.validate(value);
+ if (validateFieldValues)
+ validateValue(column, value);
// Init original values
modifyValue(index, value);
}
@@ -572,6 +582,53 @@ public class DBRecord extends DBRecordDa
}
/**
+ * Checks whether or not this field can be changed at all.
+ * Note: This is not equivalent to isFieldReadOnly()
+ * @param column the column that needs to be changed
+ * @return true if it is possible to change this field for this record context
+ */
+ protected boolean allowFieldChange(DBColumn column)
+ {
+ if (column.isAutoGenerated())
+ return false;
+ if (state!=State.New && rowset.isKeyColumn(column))
+ return false;
+ return true;
+ }
+
+ /**
+ * Validates a value before it is set in the record.
+ * if the value is invalid, the function should call an exception that is derived from FieldValueException
+ * By default, this method simply calls column.validate()
+ * @param column the column that needs to be changed
+ * @param value the new value
+ */
+ protected void validateValue(DBColumn column, Object value)
+ {
+ column.validate(value);
+ }
+
+ /**
+ * Returns whether or not values are checked for validity when calling setValue().
+ * If set to true validateValue() is called to check validity
+ * @return true if the validity of values is checked or false otherwise
+ */
+ public boolean isValidateFieldValues()
+ {
+ return validateFieldValues;
+ }
+
+ /**
+ * Set whether or not values are checked for validity when calling setValue().
+ * If set to true validateValue() is called to check validity, otherwise not.
+ * @param validateFieldValues flag whether to check validity
+ */
+ public void setValidateFieldValues(boolean validateFieldValues)
+ {
+ this.validateFieldValues = validateFieldValues;
+ }
+
+ /**
* returns whether a field is visible to the client or not
* <P>
* May be overridden to implement context specific logic.
@@ -632,9 +689,8 @@ public class DBRecord extends DBRecordDa
*/
public void init(DBRowSet table, Object[] keyValues, boolean insert)
- { // Init with keys
- State initialState = (insert ? State.New : State.Valid);
- table.initRecord(this, initialState, keyValues);
+ { // Init with keys
+ table.initRecord(this, keyValues, insert);
}
/**
@@ -708,11 +764,25 @@ public class DBRecord extends DBRecordDa
*/
public void update(Connection conn)
{
- if (rowset == null)
+ if (!isValid())
throw new ObjectNotValidException(this);
+ if (!isModified())
+ return; /* Not modified. Nothing to do! */
// update
rowset.updateRecord(this, conn);
}
+
+ /**
+ * This method is used internally to indicate that the record update has completed<BR>
+ * This will set change the record's state to Valid
+ * @param rowSetData additional data held by the rowset for this record (optional)
+ */
+ protected void updateComplete(Object rowSetData)
+ {
+ this.rowsetData = rowSetData;
+ this.modified = null;
+ changeState(State.Valid);
+ }
/**
* This helper function calls the DBRowset.deleteRecord method
Modified: empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java?rev=1379382&r1=1379381&r2=1379382&view=diff
==============================================================================
--- empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java (original)
+++ empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java Fri Aug 31 09:28:27 2012
@@ -468,14 +468,14 @@ public abstract class DBRowSet extends D
* @param rec the DBRecord object to initialize this DBRowSet object
* @param state the state of this DBRowSet object
*/
- protected void prepareInitRecord(DBRecord rec, DBRecord.State state, Object rowSetData)
+ protected void prepareInitRecord(DBRecord rec, Object rowSetData, boolean insert)
{
if (rec==null)
throw new InvalidArgumentException("rec", rec);
if (columns.size() < 1)
throw new ObjectNotValidException(this);
// Init
- rec.init(this, state, rowSetData);
+ rec.init(this, rowSetData, insert);
}
/**
@@ -485,10 +485,10 @@ public abstract class DBRowSet extends D
* @param rec the Record object
* @param keyValues an array of the primary key columns
*/
- public void initRecord(DBRecord rec, DBRecord.State initialState, Object[] keyValues)
+ public void initRecord(DBRecord rec, Object[] keyValues, boolean insert)
{
// Prepare
- prepareInitRecord(rec, initialState, null);
+ prepareInitRecord(rec, null, insert);
// Initialize all Fields
Object[] fields = rec.getFields();
for (int i = 0; i < fields.length; i++)
@@ -521,7 +521,7 @@ public abstract class DBRowSet extends D
public void initRecord(DBRecord rec, DBRecordData recData)
{
// Initialize the record
- prepareInitRecord(rec, DBRecord.State.Valid, null);
+ prepareInitRecord(rec, null, false);
// Get Record Field Values
Object[] fields = rec.getFields();
for (int i = 0; i < fields.length; i++)
@@ -767,7 +767,7 @@ public abstract class DBRowSet extends D
boolean empty = ObjectUtils.isEmpty(value);
DBTableColumn col = (DBTableColumn) columns.get(i);
if (primaryKey.contains(col))
- { // Check for Modification
+ { // Check for Modification
if (modified == true)
{ // Requires a primary key
log.warn("updateRecord: " + name + " primary has been modified!");
@@ -791,7 +791,7 @@ public abstract class DBRowSet extends D
cmd.set(col.to(timestamp));
}
else if (modified && value!=ObjectUtils.NO_VALUE)
- { // Update a field
+ { // Update a field
if (col.isReadOnly())
log.warn("updateRecord: Read-only column '" + col.getName() + " has been modified!");
// Check the value
@@ -836,7 +836,7 @@ public abstract class DBRowSet extends D
fields[i] = timestamp;
}
// Change State
- rec.changeState(DBRecord.State.Valid, null);
+ rec.updateComplete(rec.getRowSetData());
}
/**
Modified: empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBTable.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBTable.java?rev=1379382&r1=1379381&r2=1379382&view=diff
==============================================================================
--- empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBTable.java (original)
+++ empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBTable.java Fri Aug 31 09:28:27 2012
@@ -427,7 +427,7 @@ public class DBTable extends DBRowSet im
public void createRecord(DBRecord rec, Connection conn)
{
// Prepare
- prepareInitRecord(rec, DBRecord.State.New, null);
+ prepareInitRecord(rec, null, true);
// Set Defaults
int count = columns.size();
for (int i = 0; i < count; i++)
Modified: empire-db/trunk/empire-db/src/test/java/org/apache/empire/db/SerializeTest.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db/src/test/java/org/apache/empire/db/SerializeTest.java?rev=1379382&r1=1379381&r2=1379382&view=diff
==============================================================================
--- empire-db/trunk/empire-db/src/test/java/org/apache/empire/db/SerializeTest.java (original)
+++ empire-db/trunk/empire-db/src/test/java/org/apache/empire/db/SerializeTest.java Fri Aug 31 09:28:27 2012
@@ -57,7 +57,7 @@ public class SerializeTest {
public DBObject[] getObjectsToSerialize() {
final TestDatabase db = new TestDatabase();
DBRecord rec = new DBRecord();
- rec.init(db.T_TEST, DBRecord.State.New, null);
+ rec.init(db.T_TEST, null, true);
db.open(new MockDriver(), null);
return new DBObject[] {
db,