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/09/19 12:54:57 UTC
svn commit: r1387521 - in /empire-db/trunk:
empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/
empire-db/src/main/java/org/apache/empire/data/
empire-db/src/main/java/org/apache/empire/data/bean/
empire-db/src/main/java/org/apache/empire/db/ em...
Author: doebele
Date: Wed Sep 19 10:54:57 2012
New Revision: 1387521
URL: http://svn.apache.org/viewvc?rev=1387521&view=rev
Log:
EMPIREDB-157
core: extend column validation capabilities
Modified:
empire-db/trunk/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/Column.java
empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/Record.java
empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/bean/BeanProperty.java
empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/bean/BeanRecordProxy.java
empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBColumn.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/DBTable.java
empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBTableColumn.java
empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBView.java
empire-db/trunk/empire-db/src/test/java/org/apache/empire/db/DBCommandTest.java
Modified: empire-db/trunk/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java?rev=1387521&r1=1387520&r2=1387521&view=diff
==============================================================================
--- empire-db/trunk/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java (original)
+++ empire-db/trunk/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java Wed Sep 19 10:54:57 2012
@@ -166,8 +166,10 @@ public class TagEncodingHelper implement
}
@Override
- public void validate(Object value)
+ public Object validate(Object value)
{
+ log.warn("validate not supported for {}", expr.getName());
+ return value;
}
}
@@ -285,8 +287,11 @@ public class TagEncodingHelper implement
throw new FieldNotNullException(column);
return; // not required
}
- // validate through column
- column.validate(value);
+ // validate through record (if any)
+ if ((getRecord() instanceof Record))
+ ((Record)getRecord()).validateValue(column, value);
+ else
+ column.validate(value);
}
@Override
Modified: empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/Column.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/Column.java?rev=1387521&r1=1387520&r2=1387521&view=diff
==============================================================================
--- empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/Column.java (original)
+++ empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/Column.java Wed Sep 19 10:54:57 2012
@@ -62,7 +62,8 @@ public interface Column extends ColumnEx
/**
* Checks if the given value is a valid value for this column
* If not, an exception is thrown
+ * @return the value the validated and possibly converted value
*/
- void validate(Object value);
+ Object validate(Object value);
}
Modified: empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/Record.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/Record.java?rev=1387521&r1=1387520&r2=1387521&view=diff
==============================================================================
--- empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/Record.java (original)
+++ empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/Record.java Wed Sep 19 10:54:57 2012
@@ -117,6 +117,15 @@ public interface Record extends RecordDa
void setValue(Column column, Object value);
/**
+ * Validates a value before it is set in the record.
+ * By default, this method simply calls column.validate()
+ * @param column the column
+ * @param value the value to validate
+ * @return the value
+ */
+ Object validateValue(Column column, Object value);
+
+ /**
* checks whether or not the field for the given column has been modified since it has been loaded.
* @param column the requested column
* @return Returns true if a column has been modified
Modified: empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/bean/BeanProperty.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/bean/BeanProperty.java?rev=1387521&r1=1387520&r2=1387521&view=diff
==============================================================================
--- empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/bean/BeanProperty.java (original)
+++ empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/bean/BeanProperty.java Wed Sep 19 10:54:57 2012
@@ -198,10 +198,11 @@ public class BeanProperty implements Col
return (dataMode==DataMode.NotNull);
}
- public void validate(Object value)
+ public Object validate(Object value)
{
if (ObjectUtils.isEmpty(value) && isRequired())
throw new FieldNotNullException(this);
+ return value;
}
// --- others ---
Modified: empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/bean/BeanRecordProxy.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/bean/BeanRecordProxy.java?rev=1387521&r1=1387520&r2=1387521&view=diff
==============================================================================
--- empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/bean/BeanRecordProxy.java (original)
+++ empire-db/trunk/empire-db/src/main/java/org/apache/empire/data/bean/BeanRecordProxy.java Wed Sep 19 10:54:57 2012
@@ -233,6 +233,14 @@ public class BeanRecordProxy<T> implemen
}
/**
+ * Validates a value before it is set in the record.
+ */
+ public Object validateValue(Column column, Object value)
+ {
+ return column.validate(value);
+ }
+
+ /**
* sets the value of a field.
*/
public void setValue(Column column, Object value)
@@ -246,6 +254,8 @@ public class BeanRecordProxy<T> implemen
modified = new boolean[columns.size()];
modified[getFieldIndex(column)] = true;
}
+ // validate
+ value = validateValue(column, value);
// Set Value
setBeanPropertyValue(data, column, value);
}
@@ -253,7 +263,7 @@ public class BeanRecordProxy<T> implemen
/**
* sets the value of a field.
*/
- public void setValue(int i, Object value)
+ public final void setValue(int i, Object value)
{
setValue(getColumn(i), value);
}
Modified: empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBColumn.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBColumn.java?rev=1387521&r1=1387520&r2=1387521&view=diff
==============================================================================
--- empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBColumn.java (original)
+++ empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBColumn.java Wed Sep 19 10:54:57 2012
@@ -79,6 +79,11 @@ public abstract class DBColumn extends D
public static final String DBCOLATTR_MAXVALUE = "maxValue";
/**
+ * Maximum value (Integer)
+ */
+ public static final String DBCOLATTR_DATETIMEPATTERN = "dateTimePattern"; // default is "yyyy-MM-dd HH:mm:ss"
+
+ /**
* Read only column (Boolean)
*/
public static final String DBCOLATTR_SINGLEBYTECHARS = "singleByteChars";
@@ -234,7 +239,7 @@ public abstract class DBColumn extends D
* Checks if the given value is a valid value for this column
* If not, an exception is thrown
*/
- public abstract void validate(Object value);
+ public abstract Object validate(Object value);
/**
* @deprecated use validate() instead
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=1387521&r1=1387520&r2=1387521&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 Wed Sep 19 10:54:57 2012
@@ -282,12 +282,12 @@ public abstract class DBCommandExpr exte
}
/**
- * Not applicable - always returns true.
+ * Not applicable - always return the value.
*/
@Override
- public void validate(Object value)
- {
- // Nothing to check.
+ public Object validate(Object value)
+ { // Nothing to check.
+ return value;
}
/**
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=1387521&r1=1387520&r2=1387521&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 Wed Sep 19 10:54:57 2012
@@ -121,12 +121,12 @@ public class DBQuery extends DBRowSet
}
@Override
- public void validate(Object value)
+ public Object validate(Object value)
{
DBColumn column = expr.getUpdateColumn();
if (column==null)
- return;
- column.validate(value);
+ return value;
+ return column.validate(value);
}
@Override
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=1387521&r1=1387520&r2=1387521&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 Wed Sep 19 10:54:57 2012
@@ -516,7 +516,7 @@ public class DBRecord extends DBRecordDa
* @param i index of the column
* @param value the column value
*/
- protected void modifyValue(int i, Object value)
+ protected void modifyValue(int i, Object value, boolean fireChangeEvent)
{ // Check valid
if (state == State.Invalid)
throw new ObjectNotValidException(this);
@@ -536,7 +536,8 @@ public class DBRecord extends DBRecordDa
if (state.isLess(State.Modified))
changeState(State.Modified);
// field changed
- onFieldChanged(i);
+ if (fireChangeEvent)
+ onFieldChanged(i);
}
/**
@@ -568,9 +569,9 @@ public class DBRecord extends DBRecordDa
}
// Is Value valid
if (validateFieldValues)
- validateValue(column, value);
+ value = validateValue(column, value);
// Init original values
- modifyValue(index, value);
+ modifyValue(index, value, true);
}
/**
@@ -609,14 +610,13 @@ public class DBRecord extends DBRecordDa
/**
* 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)
+ public Object validateValue(Column column, Object value)
{
- column.validate(value);
+ return column.validate(value);
}
/**
@@ -959,7 +959,7 @@ public class DBRecord extends DBRecordDa
if (value==null)
continue;
// Modify value
- modifyValue(i, value);
+ modifyValue(i, value, true);
count++;
}
}
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=1387521&r1=1387520&r2=1387521&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 Wed Sep 19 10:54:57 2012
@@ -435,7 +435,7 @@ public class DBTable extends DBRowSet im
DBTableColumn column = (DBTableColumn)columns.get(i);
Object value = column.getRecordDefaultValue(conn);
if (value!=null)
- rec.modifyValue(i, value);
+ rec.modifyValue(i, value, true);
}
// Init
completeInitRecord(rec);
Modified: empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBTableColumn.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBTableColumn.java?rev=1387521&r1=1387520&r2=1387521&view=diff
==============================================================================
--- empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBTableColumn.java (original)
+++ empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBTableColumn.java Wed Sep 19 10:54:57 2012
@@ -26,6 +26,7 @@ import java.util.Date;
import org.apache.empire.commons.Attributes;
import org.apache.empire.commons.ObjectUtils;
+import org.apache.empire.commons.StringUtils;
import org.apache.empire.data.DataMode;
import org.apache.empire.data.DataType;
import org.apache.empire.db.exceptions.FieldIllegalValueException;
@@ -314,10 +315,10 @@ public class DBTableColumn extends DBCol
* @return true if the value is valid or false otherwise.
*/
@Override
- public void validate(Object value)
+ public Object validate(Object value)
{
// Check for NULL
- if (isRequired() && (value == null || value.toString().length() < 1))
+ if (isRequired() && ObjectUtils.isEmpty(value))
throw new FieldNotNullException(this);
// Is value valid
switch (type)
@@ -325,21 +326,24 @@ public class DBTableColumn extends DBCol
case DATE:
case DATETIME:
// Check whether value is a valid date/time value!
- if (value!=null && (value instanceof Date)==false && value.equals(DBDatabase.SYSDATE)==false)
- { try
- {
- String val = value.toString();
- if (val.length() > 0)
- {
- // Parse date time value
- SimpleDateFormat sdFormat = new SimpleDateFormat("dd-MM-yyyy");
- sdFormat.setLenient(true);
- sdFormat.parse(value.toString());
- }
+ if (value!=null && !(value instanceof Date) && !DBDatabase.SYSDATE.equals(value))
+ { // Parse String
+ String dateValue = value.toString();
+ if (dateValue.length()==0)
+ return null;
+ // Convert through SimpleDateFormat
+ String datePattern = StringUtils.coalesce(StringUtils.toString(getAttribute(DBCOLATTR_DATETIMEPATTERN)), "yyyy-MM-dd HH:mm:ss");
+ if ((type==DataType.DATE || dateValue.length()<=12) && datePattern.indexOf(' ')>0)
+ datePattern = datePattern.substring(0, datePattern.indexOf(' ')); // Strip off time
+ try
+ { // Parse date time value
+ SimpleDateFormat sdFormat = new SimpleDateFormat(datePattern);
+ sdFormat.setLenient(true);
+ value = sdFormat.parse(dateValue);
// OK
} catch (ParseException e)
{ // Error
- log.info("checkValue failed: " + e.toString() + " column=" + getName() + " value=" + value);
+ log.info("Parsing '{}' to Date ("+datePattern+") failed for column {}. Message is "+e.toString(), value, getName());
throw new FieldIllegalValueException(this, String.valueOf(value), e);
}
}
@@ -355,7 +359,7 @@ public class DBTableColumn extends DBCol
// throws NumberFormatException if not a number!
} catch (NumberFormatException e)
{
- log.info("checkValue failed: " + e.toString() + " column=" + getName() + " value=" + value);
+ log.info("Parsing '{}' to Decimal failed for column {}. Message is "+e.toString(), value, getName());
throw new FieldIllegalValueException(this, String.valueOf(value), e);
}
}
@@ -373,7 +377,7 @@ public class DBTableColumn extends DBCol
// throws NumberFormatException if not a number!
} catch (NumberFormatException e)
{
- log.info("checkValue failed: " + e.toString() + " column=" + getName() + " value=" + value);
+ log.info("Parsing '{}' to Double failed for column {}. Message is "+e.toString(), value, getName());
throw new FieldIllegalValueException(this, String.valueOf(value), e);
}
}
@@ -391,7 +395,7 @@ public class DBTableColumn extends DBCol
// throws NumberFormatException if not an integer!
} catch (NumberFormatException e)
{
- log.info("checkValue failed: " + e.toString() + " column=" + getName() + " value=" + String.valueOf(value));
+ log.info("Parsing '{}' to Integer failed for column {}. Message is "+e.toString(), value, getName());
throw new FieldIllegalValueException(this, String.valueOf(value), e);
}
}
@@ -411,22 +415,11 @@ public class DBTableColumn extends DBCol
break;
}
+ return value;
}
protected void validateNumber(DataType type, Number n)
{
- if (type==DataType.DECIMAL)
- { // Convert to Decimal
- BigDecimal dv = ObjectUtils.toDecimal(n);
- int prec = dv.precision();
- int scale = dv.scale();
- // check precision and scale
- double size = getSize();
- int reqPrec = (int)size;
- int reqScale =((int)(size*10)-(reqPrec*10));
- if ((prec-scale)>(reqPrec-reqScale) || scale>reqScale)
- throw new FieldValueOutOfRangeException(this);
- }
// Check Range
Object min = getAttribute(DBColumn.DBCOLATTR_MINVALUE);
Object max = getAttribute(DBColumn.DBCOLATTR_MAXVALUE);
@@ -455,7 +448,19 @@ public class DBTableColumn extends DBCol
throw new FieldValueOutOfRangeException(this, maxVal, true);
}
}
-
+ // Check overall
+ if (type==DataType.DECIMAL)
+ { // Convert to Decimal
+ BigDecimal dv = ObjectUtils.toDecimal(n);
+ int prec = dv.precision();
+ int scale = dv.scale();
+ // check precision and scale
+ double size = getSize();
+ int reqPrec = (int)size;
+ int reqScale =((int)(size*10)-(reqPrec*10));
+ if ((prec-scale)>(reqPrec-reqScale) || scale>reqScale)
+ throw new FieldValueOutOfRangeException(this);
+ }
}
/**
Modified: empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBView.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBView.java?rev=1387521&r1=1387520&r2=1387521&view=diff
==============================================================================
--- empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBView.java (original)
+++ empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBView.java Wed Sep 19 10:54:57 2012
@@ -122,11 +122,11 @@ public abstract class DBView extends DBR
}
@Override
- public void validate(Object value)
+ public Object validate(Object value)
{
if (updateColumn==null)
- return;
- updateColumn.validate(value);
+ return value;
+ return updateColumn.validate(value);
}
@Override
Modified: empire-db/trunk/empire-db/src/test/java/org/apache/empire/db/DBCommandTest.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db/src/test/java/org/apache/empire/db/DBCommandTest.java?rev=1387521&r1=1387520&r2=1387521&view=diff
==============================================================================
--- empire-db/trunk/empire-db/src/test/java/org/apache/empire/db/DBCommandTest.java (original)
+++ empire-db/trunk/empire-db/src/test/java/org/apache/empire/db/DBCommandTest.java Wed Sep 19 10:54:57 2012
@@ -85,9 +85,9 @@ public class DBCommandTest
}
@Override
- public void validate(Object value)
+ public Object validate(Object value)
{
- return;
+ return value;
}
@Override