This is an automated email from the ASF dual-hosted git repository.

doebele pushed a commit to branch version3
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/version3 by this push:
     new e8dfec9  EMPIREDB-362 Exception improvment
e8dfec9 is described below

commit e8dfec91f36dfa1217e4c1348f23ca8526c7477e
Author: Rainer Döbele <[email protected]>
AuthorDate: Mon Feb 7 16:30:04 2022 +0100

    EMPIREDB-362 Exception improvment
---
 .../apache/empire/samples/db/beans/Department.java |   6 +-
 .../apache/empire/samples/db/beans/Employee.java   |   6 +-
 .../apache/empire/samples/db/beans/Payment.java    |   6 +-
 .../main/java/org/apache/empire/data/Record.java   |   6 ++
 .../apache/empire/data/bean/BeanRecordProxy.java   |  29 +++---
 .../main/java/org/apache/empire/db/DBQuery.java    |   4 +-
 .../main/java/org/apache/empire/db/DBReader.java   |   6 +-
 .../main/java/org/apache/empire/db/DBRecord.java   |  41 +++++++--
 .../main/java/org/apache/empire/db/DBRowSet.java   |  10 +--
 .../main/java/org/apache/empire/db/DBTable.java    |   4 +-
 .../main/java/org/apache/empire/db/DBUtils.java    |  10 +--
 ...yException.java => FieldReadOnlyException.java} |   4 +-
 .../db/exceptions/RecordDeleteFailedException.java |   6 +-
 .../empire/db/exceptions/RecordException.java      | 100 +++++++++++++++++++++
 .../db/exceptions/RecordNotFoundException.java     |   6 +-
 ...Exception.java => RecordReadOnlyException.java} |  68 +++++++-------
 ...on.java => RecordUpdateAmbiguousException.java} |  10 +--
 .../db/exceptions/RecordUpdateFailedException.java |   8 +-
 .../empire/db/list/{Bean.java => DataBean.java}    |   4 +-
 19 files changed, 233 insertions(+), 101 deletions(-)

diff --git 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/beans/Department.java
 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/beans/Department.java
index 64402ef..5d25c2f 100644
--- 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/beans/Department.java
+++ 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/beans/Department.java
@@ -22,10 +22,10 @@ import java.util.List;
 
 import org.apache.empire.db.DBCommand;
 import org.apache.empire.db.DBContext;
-import org.apache.empire.db.list.Bean;
+import org.apache.empire.db.list.DataBean;
 import org.apache.empire.samples.db.SampleDB;
 
-public class Department implements Bean<SampleDB>
+public class Department implements DataBean<SampleDB>
 {
     private long   id;     // "ID" 
     private String name;   // "FIRSTNAME"
@@ -64,7 +64,7 @@ public class Department implements Bean<SampleDB>
     }
     
     @Override
-    public void onBeanLoaded(SampleDB db, DBContext context, int rownum, 
Object parent)
+    public void initialize(SampleDB db, DBContext context, int rownum, Object 
parent)
     {
         DBCommand cmd = db.createCommand();
         cmd.where(db.EMPLOYEES.DEPARTMENT_ID.is(this.id));
diff --git 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/beans/Employee.java
 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/beans/Employee.java
index da1b5f1..b8083de 100644
--- 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/beans/Employee.java
+++ 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/beans/Employee.java
@@ -26,7 +26,7 @@ import java.util.Locale;
 import org.apache.empire.commons.DateUtils;
 import org.apache.empire.db.DBCommand;
 import org.apache.empire.db.DBContext;
-import org.apache.empire.db.list.Bean;
+import org.apache.empire.db.list.DataBean;
 import org.apache.empire.samples.db.SampleDB;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -36,7 +36,7 @@ import org.slf4j.LoggerFactory;
  * @author doebele
  *
  */
-public class Employee implements Bean<SampleDB>
+public class Employee implements DataBean<SampleDB>
 {
     private static final Logger log = LoggerFactory.getLogger(Employee.class);
     
@@ -243,7 +243,7 @@ public class Employee implements Bean<SampleDB>
     }
 
     @Override
-    public void onBeanLoaded(SampleDB db, DBContext context, int rownum, 
Object parent)
+    public void initialize(SampleDB db, DBContext context, int rownum, Object 
parent)
     {
         this.rownum = rownum;
         
diff --git 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/beans/Payment.java
 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/beans/Payment.java
index 831fbe4..79653f4 100644
--- 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/beans/Payment.java
+++ 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/beans/Payment.java
@@ -21,10 +21,10 @@ package org.apache.empire.samples.db.beans;
 import java.math.BigDecimal;
 
 import org.apache.empire.db.DBContext;
-import org.apache.empire.db.list.Bean;
+import org.apache.empire.db.list.DataBean;
 import org.apache.empire.samples.db.SampleDB;
 
-public class Payment implements Bean<SampleDB>
+public class Payment implements DataBean<SampleDB>
 {
     private long        employeeId;
     private BigDecimal  year;
@@ -68,7 +68,7 @@ public class Payment implements Bean<SampleDB>
     }
 
     @Override
-    public void onBeanLoaded(SampleDB db, DBContext context, int rownum, 
Object parent)
+    public void initialize(SampleDB db, DBContext context, int rownum, Object 
parent)
     {
         if (parent instanceof Employee)
             this.employee = (Employee)parent;
diff --git a/empire-db/src/main/java/org/apache/empire/data/Record.java 
b/empire-db/src/main/java/org/apache/empire/data/Record.java
index ec8532b..afbd9a2 100644
--- a/empire-db/src/main/java/org/apache/empire/data/Record.java
+++ b/empire-db/src/main/java/org/apache/empire/data/Record.java
@@ -89,6 +89,12 @@ public interface Record extends RecordData
      * @return the key value array
      */
     Object[] getKey();    
+    
+    /**
+     * Returns the entity this Record belongs to 
+     * @return the entity
+     */
+    Entity getEntity();
 
     /**
      * returns true if the field is visible to the client.
diff --git 
a/empire-db/src/main/java/org/apache/empire/data/bean/BeanRecordProxy.java 
b/empire-db/src/main/java/org/apache/empire/data/bean/BeanRecordProxy.java
index 1cd589f..b37b4eb 100644
--- a/empire-db/src/main/java/org/apache/empire/data/bean/BeanRecordProxy.java
+++ b/empire-db/src/main/java/org/apache/empire/data/bean/BeanRecordProxy.java
@@ -30,6 +30,7 @@ import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.commons.Options;
 import org.apache.empire.data.Column;
 import org.apache.empire.data.ColumnExpr;
+import org.apache.empire.data.Entity;
 import org.apache.empire.data.Record;
 import org.apache.empire.exceptions.BeanPropertyGetException;
 import org.apache.empire.exceptions.BeanPropertySetException;
@@ -39,7 +40,6 @@ import org.apache.empire.exceptions.ObjectNotValidException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-
 /**
  * BeanRecordProxy
  * This class defines proxy that allows any POJO to behave like a record 
object.
@@ -52,36 +52,37 @@ public class BeanRecordProxy<T> implements Record
 {
     protected static final Logger log = 
LoggerFactory.getLogger(BeanRecordProxy.class);
     
-    protected List<Column> columns;
-    protected Column[] keyColumns;
-    protected boolean[] modified;
+    protected final Entity entity;
+    protected final List<Column> columns;
+    protected final Column[] keyColumns;
 
     protected T data;
+    protected boolean[] modified;
 
-    public BeanRecordProxy(T data, List<Column> columns, Column[] keyColumns)
+    public BeanRecordProxy(T data, List<Column> columns, Column[] keyColumns, 
Entity entity)
     {
         this.data = data;
         this.columns = columns;
         this.keyColumns = keyColumns;
+        this.entity = entity;
     }
 
-    public BeanRecordProxy(List<Column> columns, Column[] keyColumns)
+    public BeanRecordProxy(List<Column> columns, Column[] keyColumns, Entity 
entity)
     {
-        this(null, columns, keyColumns);
+        this(null, columns, keyColumns, entity);
     }
 
     public BeanRecordProxy(T data, BeanClass beanClass)
     {
         this(data, 
              ObjectUtils.convert(Column.class, beanClass.getProperties()), 
-             beanClass.getKeyColumns());
+             beanClass.getKeyColumns(),
+             beanClass);
     }
 
     public BeanRecordProxy(BeanClass beanClass)
     {
-        this(null, 
-             ObjectUtils.convert(Column.class, beanClass.getProperties()), 
-             beanClass.getKeyColumns());
+        this(null, beanClass);
     }
     
     public T getBean()
@@ -211,6 +212,12 @@ public class BeanRecordProxy<T> implements Record
         // Not new
         return false;
     }
+    
+    @Override
+    public Entity getEntity()
+    {
+        return this.entity;
+    }
 
     @Override
     public boolean isValid()
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBQuery.java 
b/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
index 4107318..e63af44 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
@@ -31,8 +31,8 @@ import org.apache.empire.db.exceptions.InvalidKeyException;
 import org.apache.empire.db.exceptions.NoPrimaryKeyException;
 import org.apache.empire.db.exceptions.QueryNoResultException;
 import org.apache.empire.db.exceptions.RecordNotFoundException;
+import org.apache.empire.db.exceptions.RecordUpdateAmbiguousException;
 import org.apache.empire.db.exceptions.RecordUpdateFailedException;
-import org.apache.empire.db.exceptions.RecordUpdateInvalidException;
 import org.apache.empire.db.expr.column.DBAliasExpr;
 import org.apache.empire.db.expr.compare.DBCompareColExpr;
 import org.apache.empire.db.expr.compare.DBCompareExpr;
@@ -570,7 +570,7 @@ public class DBQuery extends DBRowSet
             } 
             else if (affected > 1)
             { // More than one record
-                throw new RecordUpdateInvalidException(this, key);
+                throw new RecordUpdateAmbiguousException(this, key);
             } 
             else
             { // success
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBReader.java 
b/empire-db/src/main/java/org/apache/empire/db/DBReader.java
index bb1fa41..7c8d098 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBReader.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBReader.java
@@ -38,7 +38,7 @@ import org.apache.empire.data.DataType;
 import org.apache.empire.db.exceptions.EmpireSQLException;
 import org.apache.empire.db.exceptions.QueryNoResultException;
 import org.apache.empire.db.expr.join.DBJoinExpr;
-import org.apache.empire.db.list.Bean;
+import org.apache.empire.db.list.DataBean;
 import org.apache.empire.exceptions.BeanInstantiationException;
 import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.exceptions.ObjectNotValidException;
@@ -704,8 +704,8 @@ public class DBReader extends DBRecordData implements 
Closeable
                 list.add(bean);
                 rownum++;
                 // post processing
-                if (bean instanceof Bean<?>)
-                    ((Bean<?>)bean).onBeanLoaded(getDatabase(), context, 
rownum, parent);
+                if (bean instanceof DataBean<?>)
+                    ((DataBean<?>)bean).initialize(getDatabase(), context, 
rownum, parent);
                 // Decrease count
                 if (maxCount > 0)
                     maxCount--;
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBRecord.java 
b/empire-db/src/main/java/org/apache/empire/db/DBRecord.java
index 708dce8..135ff9c 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBRecord.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBRecord.java
@@ -35,12 +35,14 @@ import org.apache.empire.commons.Options;
 import org.apache.empire.commons.StringUtils;
 import org.apache.empire.data.Column;
 import org.apache.empire.data.ColumnExpr;
+import org.apache.empire.data.Entity;
 import org.apache.empire.data.Record;
 import org.apache.empire.db.DBRowSet.PartialMode;
 import org.apache.empire.db.context.DBRollbackHandler;
-import org.apache.empire.db.exceptions.FieldIsReadOnlyException;
+import org.apache.empire.db.exceptions.FieldReadOnlyException;
 import org.apache.empire.db.exceptions.FieldValueNotFetchedException;
 import org.apache.empire.db.exceptions.NoPrimaryKeyException;
+import org.apache.empire.db.exceptions.RecordReadOnlyException;
 import org.apache.empire.db.expr.compare.DBCompareExpr;
 import org.apache.empire.exceptions.BeanPropertyGetException;
 import org.apache.empire.exceptions.InvalidArgumentException;
@@ -402,6 +404,16 @@ public class DBRecord extends DBRecordData implements 
Record, Cloneable, Seriali
     }
 
     /**
+     * returns true if this record is a new record.
+     * @return true if this record is a new record
+     */
+    @Override
+    public Entity getEntity()
+    {
+        return getRowSet();
+    }
+
+    /**
      * Returns the current DBDatabase object.
      * 
      * @return the current DBDatabase object
@@ -735,10 +747,12 @@ public class DBRecord extends DBRecordData implements 
Record, Cloneable, Seriali
     @Override
     public void setValue(int index, Object value)
     {
-        if (state == State.Invalid)
+        if (!isValid())
             throw new ObjectNotValidException(this);
         if (index < 0 || index >= fields.length)
             throw new InvalidArgumentException("index", index);
+        // check updatable
+        checkUpdateable();
         // Strings special
         if ((value instanceof String) && ((String)value).length()==0)
             value = null;
@@ -763,7 +777,7 @@ public class DBRecord extends DBRecordData implements 
Record, Cloneable, Seriali
         // Check whether we can change this field
         if (!allowFieldChange(column))
         {   // Read Only column may be set
-            throw new FieldIsReadOnlyException(column);
+            throw new FieldReadOnlyException(column);
         }
         // Is Value valid?
         if (this.validateFieldValues)
@@ -791,10 +805,7 @@ public class DBRecord extends DBRecordData implements 
Record, Cloneable, Seriali
      */
     @Override
     public final void setValue(Column column, Object value)
-    {
-        if (!isValid())
-            throw new ObjectNotValidException(this);
-        // Get Column Index
+    {   
         setValue(getFieldIndex(column), value);
     }
 
@@ -976,6 +987,10 @@ public class DBRecord extends DBRecordData implements 
Record, Cloneable, Seriali
             throw new ObjectNotValidException(this);
         if (!isModified())
             return; /* Not modified. Nothing to do! */
+        if (isReadOnly())
+            throw new RecordReadOnlyException(this);
+        // check updatable
+        checkUpdateable();
         // allow rollback
         if (enableRollbackHandling)
             getContext().appendRollbackHandler(createRollbackHandler());
@@ -997,6 +1012,8 @@ public class DBRecord extends DBRecordData implements 
Record, Cloneable, Seriali
     {
         if (isValid()==false)
             throw new ObjectNotValidException(this);
+        // check updatable
+        checkUpdateable();
         // allow rollback
         if (enableRollbackHandling)
             getContext().appendRollbackHandler(createRollbackHandler());
@@ -1238,6 +1255,16 @@ public class DBRecord extends DBRecordData implements 
Record, Cloneable, Seriali
     }
     
     /**
+     * Checks whether the record is updateable  
+     * If its read-only a RecordReadOnlyException is thrown 
+     */
+    protected void checkUpdateable()
+    {
+        if (this.isReadOnly())
+            throw new RecordReadOnlyException(this);
+    }
+    
+    /**
      * 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
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java 
b/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
index 3fac2fa..201123c 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
@@ -36,14 +36,14 @@ import org.apache.empire.data.DataType;
 import org.apache.empire.data.Entity;
 import org.apache.empire.db.DBRelation.DBCascadeAction;
 import org.apache.empire.db.DBRelation.DBReference;
-import org.apache.empire.db.exceptions.FieldIsReadOnlyException;
+import org.apache.empire.db.exceptions.FieldReadOnlyException;
 import org.apache.empire.db.exceptions.FieldNotNullException;
 import org.apache.empire.db.exceptions.InvalidKeyException;
 import org.apache.empire.db.exceptions.NoPrimaryKeyException;
 import org.apache.empire.db.exceptions.QueryNoResultException;
 import org.apache.empire.db.exceptions.RecordNotFoundException;
+import org.apache.empire.db.exceptions.RecordUpdateAmbiguousException;
 import org.apache.empire.db.exceptions.RecordUpdateFailedException;
-import org.apache.empire.db.exceptions.RecordUpdateInvalidException;
 import org.apache.empire.db.expr.column.DBCountExpr;
 import org.apache.empire.db.expr.compare.DBCompareColExpr;
 import org.apache.empire.db.expr.compare.DBCompareExpr;
@@ -597,7 +597,7 @@ public abstract class DBRowSet extends DBExpr implements 
Entity
             {   // check
                 DBColumn keyColumn = keyColumns[i]; 
                 if (newRecord && keyColumn.isAutoGenerated())
-                    throw new FieldIsReadOnlyException(keyColumn);
+                    throw new FieldReadOnlyException(keyColumn);
                 // Ignore Validity Checks
                 int field = getColumnIndex(keyColumn);
                 fields[field] = key[i];
@@ -1052,11 +1052,11 @@ public abstract class DBRowSet extends DBExpr 
implements Entity
         } 
         else if (affected == 0)
         { // Record not found
-            throw new RecordUpdateInvalidException(this, record.getKey());
+            throw new RecordUpdateFailedException(this, record.getKey());
         } 
         else if (affected > 1)
         { // Multiple Records affected
-            throw new RecordUpdateFailedException(this, record.getKey());
+            throw new RecordUpdateAmbiguousException(this, record.getKey());
         }
         // Correct Timestamp
         if (timestampColumn!=null && timestamp!=null)
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBTable.java 
b/empire-db/src/main/java/org/apache/empire/db/DBTable.java
index da73c36..7c67770 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBTable.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBTable.java
@@ -34,7 +34,7 @@ import org.apache.empire.db.DBIndex.DBIndexType;
 import org.apache.empire.db.DBRelation.DBCascadeAction;
 import org.apache.empire.db.exceptions.NoPrimaryKeyException;
 import org.apache.empire.db.exceptions.RecordDeleteFailedException;
-import org.apache.empire.db.exceptions.RecordUpdateInvalidException;
+import org.apache.empire.db.exceptions.RecordUpdateFailedException;
 import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.exceptions.ItemExistsException;
 import org.apache.empire.exceptions.UnexpectedReturnValueException;
@@ -686,7 +686,7 @@ public class DBTable extends DBRowSet implements Cloneable
         } 
         else if (affected > 1)
         { // Multiple Records affected
-            throw new RecordUpdateInvalidException(this, key);
+            throw new RecordUpdateFailedException(this, key);
         }
     }
     
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBUtils.java 
b/empire-db/src/main/java/org/apache/empire/db/DBUtils.java
index 077e580..6220893 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBUtils.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBUtils.java
@@ -24,7 +24,7 @@ import org.apache.empire.db.exceptions.QueryNoResultException;
 import org.apache.empire.db.exceptions.StatementFailedException;
 import org.apache.empire.db.exceptions.UnknownBeanTypeException;
 import org.apache.empire.db.expr.compare.DBCompareExpr;
-import org.apache.empire.db.list.Bean;
+import org.apache.empire.db.list.DataBean;
 import org.apache.empire.db.list.DBBeanFactoryCache;
 import org.apache.empire.db.list.DBBeanListFactory;
 import org.apache.empire.db.list.DBBeanListFactoryImpl;
@@ -1024,8 +1024,8 @@ public class DBUtils implements DBContextAware
                 // add entry
                 list.add(item);
                 // post processing
-                if (item instanceof Bean<?>)
-                    ((Bean<?>)item).onBeanLoaded(r.getDatabase(), context, 
rownum, parent);
+                if (item instanceof DataBean<?>)
+                    ((DataBean<?>)item).initialize(r.getDatabase(), context, 
rownum, parent);
                 // next
                 rownum++;
                 // Decrease count
@@ -1101,8 +1101,8 @@ public class DBUtils implements DBContextAware
             // add data
             T item = factory.newItem(-1, r);
             // post processing
-            if (item instanceof Bean<?>)
-                ((Bean<?>)item).onBeanLoaded(r.getDatabase(), context, -1, 
null);
+            if (item instanceof DataBean<?>)
+                ((DataBean<?>)item).initialize(r.getDatabase(), context, -1, 
null);
             // done
             return item;
         }
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/exceptions/FieldIsReadOnlyException.java
 
b/empire-db/src/main/java/org/apache/empire/db/exceptions/FieldReadOnlyException.java
similarity index 89%
copy from 
empire-db/src/main/java/org/apache/empire/db/exceptions/FieldIsReadOnlyException.java
copy to 
empire-db/src/main/java/org/apache/empire/db/exceptions/FieldReadOnlyException.java
index 5cf09f7..0d421aa 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/exceptions/FieldIsReadOnlyException.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/exceptions/FieldReadOnlyException.java
@@ -21,13 +21,13 @@ package org.apache.empire.db.exceptions;
 import org.apache.empire.commons.ErrorType;
 import org.apache.empire.data.Column;
 
-public class FieldIsReadOnlyException extends FieldValueException
+public class FieldReadOnlyException extends FieldValueException
 {
     private static final long serialVersionUID = 1L;
     
     public static final ErrorType errorType = new 
ErrorType("error.db.fieldIsReadOnly",    "The field {0} is read only.");
     
-    public FieldIsReadOnlyException(Column col)
+    public FieldReadOnlyException(Column col)
     {
         super(col, errorType, new String[] { getColumnTitle(col) });
     }
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordDeleteFailedException.java
 
b/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordDeleteFailedException.java
index d8141c3..1aa9bbf 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordDeleteFailedException.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordDeleteFailedException.java
@@ -19,11 +19,9 @@
 package org.apache.empire.db.exceptions;
 
 import org.apache.empire.commons.ErrorType;
-import org.apache.empire.commons.StringUtils;
 import org.apache.empire.db.DBRowSet;
-import org.apache.empire.exceptions.EmpireException;
 
-public class RecordDeleteFailedException extends EmpireException
+public class RecordDeleteFailedException extends RecordException
 {
     private static final long serialVersionUID = 1L;
     
@@ -31,6 +29,6 @@ public class RecordDeleteFailedException extends 
EmpireException
     
     public RecordDeleteFailedException(DBRowSet rowset, Object[] key)
     {
-        super(errorType, new String[] { StringUtils.toString(key), 
StringUtils.coalesce(rowset.getName(), rowset.getAlias()) });
+        super(rowset, key, errorType, new String[] { keyToString(key), 
rowsetName(rowset) });
     }
 }
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordException.java 
b/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordException.java
new file mode 100644
index 0000000..b9fc2c9
--- /dev/null
+++ 
b/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordException.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.empire.db.exceptions;
+
+import org.apache.empire.commons.ErrorType;
+import org.apache.empire.commons.ObjectUtils;
+import org.apache.empire.commons.StringUtils;
+import org.apache.empire.data.Entity;
+import org.apache.empire.data.Record;
+import org.apache.empire.db.DBRowSet;
+import org.apache.empire.exceptions.EmpireException;
+
+public abstract class RecordException extends EmpireException
+{
+    private static final long serialVersionUID = 1L;
+    
+    private static final Object[] NO_KEY = new Object[0];
+    
+    protected static Object[] getKey(Record rec)
+    {
+        try {
+            if (!rec.isValid() || ObjectUtils.isEmpty(rec.getKeyColumns()))
+                return NO_KEY;
+            return rec.getKey();
+        } catch(Exception e) {
+            return NO_KEY;
+        }
+    }
+    
+    protected static Entity getEntity(Record record)
+    {
+        try {
+            return record.getEntity();
+        } catch(Exception e) {
+            return null;
+        }
+    }
+    
+    protected static String keyToString(Object[] key)
+    {
+        return (key==null ? "["+StringUtils.arrayToString(key, "|")+"]" : 
"[]");
+    }
+    
+    protected static String entityName(Entity entity)
+    {
+        return (entity!=null ? entity.getName() : "{Null}"); 
+    }
+    
+    protected static String rowsetName(DBRowSet rowset)
+    {
+        return (rowset!=null ? StringUtils.coalesce(rowset.getName(), 
rowset.getAlias()) : "{Null}");        
+    }
+    
+    private transient final Entity entity;
+    private transient final Object[] key;
+    
+    public RecordException(Entity entity, Object[] key, final ErrorType 
errType, final String[] params, final Throwable cause)
+    {
+        super(errType, params, cause);
+        // save type and params for custom message formatting
+        this.entity = entity;
+        this.key = key;
+    }
+
+    public RecordException(Entity entity, Object[] key, final ErrorType 
errType, final String[] params)
+    {
+        this(entity, key, errType, params, null);
+    }
+    
+    public RecordException(final Record record, final ErrorType errType, final 
String[] params)
+    {
+        this(getEntity(record), getKey(record), errType, params, null);
+    }
+
+    public Entity getRecord()
+    {
+        return entity;
+    }
+
+    public Object[] getKey()
+    {
+        return key;
+    }
+}
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordNotFoundException.java
 
b/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordNotFoundException.java
index a25e6e3..456d5fa 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordNotFoundException.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordNotFoundException.java
@@ -19,11 +19,9 @@
 package org.apache.empire.db.exceptions;
 
 import org.apache.empire.commons.ErrorType;
-import org.apache.empire.commons.StringUtils;
 import org.apache.empire.db.DBRowSet;
-import org.apache.empire.exceptions.EmpireException;
 
-public class RecordNotFoundException extends EmpireException
+public class RecordNotFoundException extends RecordException
 {
     private static final long serialVersionUID = 1L;
     
@@ -31,6 +29,6 @@ public class RecordNotFoundException extends EmpireException
     
     public RecordNotFoundException(DBRowSet rowset, Object[] key)
     {
-        super(errorType, new String[] { StringUtils.toString(key), 
StringUtils.coalesce(rowset.getName(), rowset.getAlias()) });
+        super(rowset, key, errorType, new String[] { keyToString(key), 
rowsetName(rowset) });
     }
 }
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/exceptions/FieldIsReadOnlyException.java
 
b/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordReadOnlyException.java
similarity index 75%
rename from 
empire-db/src/main/java/org/apache/empire/db/exceptions/FieldIsReadOnlyException.java
rename to 
empire-db/src/main/java/org/apache/empire/db/exceptions/RecordReadOnlyException.java
index 5cf09f7..49046a6 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/exceptions/FieldIsReadOnlyException.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordReadOnlyException.java
@@ -1,34 +1,34 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.empire.db.exceptions;
-
-import org.apache.empire.commons.ErrorType;
-import org.apache.empire.data.Column;
-
-public class FieldIsReadOnlyException extends FieldValueException
-{
-    private static final long serialVersionUID = 1L;
-    
-    public static final ErrorType errorType = new 
ErrorType("error.db.fieldIsReadOnly",    "The field {0} is read only.");
-    
-    public FieldIsReadOnlyException(Column col)
-    {
-        super(col, errorType, new String[] { getColumnTitle(col) });
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.empire.db.exceptions;
+
+import org.apache.empire.commons.ErrorType;
+import org.apache.empire.db.DBRecord;
+
+public class RecordReadOnlyException extends RecordException
+{
+    private static final long serialVersionUID = 1L;
+    
+    public static final ErrorType errorType = new 
ErrorType("error.db.recordIsReadOnly",    "The record {0} of {1} is read 
only.");
+    
+    public RecordReadOnlyException(DBRecord record)
+    {
+        super(record, errorType, new String[] { keyToString(getKey(record)), 
entityName(getEntity(record)) });
+    }
+}
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordUpdateInvalidException.java
 
b/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordUpdateAmbiguousException.java
similarity index 67%
rename from 
empire-db/src/main/java/org/apache/empire/db/exceptions/RecordUpdateInvalidException.java
rename to 
empire-db/src/main/java/org/apache/empire/db/exceptions/RecordUpdateAmbiguousException.java
index bda4c73..f9f81ba 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordUpdateInvalidException.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordUpdateAmbiguousException.java
@@ -19,18 +19,16 @@
 package org.apache.empire.db.exceptions;
 
 import org.apache.empire.commons.ErrorType;
-import org.apache.empire.commons.StringUtils;
 import org.apache.empire.db.DBRowSet;
-import org.apache.empire.exceptions.EmpireException;
 
-public class RecordUpdateInvalidException extends EmpireException
+public class RecordUpdateAmbiguousException extends RecordException
 {
     private static final long serialVersionUID = 1L;
     
-    public static final ErrorType errorType = new 
ErrorType("error.db.recordUpateFailed",  "Updating the record {0} in {1} 
failed. It might have been changed or deleted by another user.");
+    public static final ErrorType errorType = new 
ErrorType("error.db.recordUpateAmbiguous", "Updating the record {0} in {1} 
failed. The given record key is ambiguous.");
     
-    public RecordUpdateInvalidException(DBRowSet rowset, Object[] key)
+    public RecordUpdateAmbiguousException(DBRowSet rowset, Object[] key)
     {
-        super(errorType, new String[] { StringUtils.toString(key), 
StringUtils.coalesce(rowset.getName(), rowset.getAlias()) });
+        super(rowset, key, errorType, new String[] { keyToString(key), 
rowsetName(rowset) });
     }
 }
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordUpdateFailedException.java
 
b/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordUpdateFailedException.java
index 6783556..09b68c3 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordUpdateFailedException.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/exceptions/RecordUpdateFailedException.java
@@ -19,18 +19,16 @@
 package org.apache.empire.db.exceptions;
 
 import org.apache.empire.commons.ErrorType;
-import org.apache.empire.commons.StringUtils;
 import org.apache.empire.db.DBRowSet;
-import org.apache.empire.exceptions.EmpireException;
 
-public class RecordUpdateFailedException extends EmpireException
+public class RecordUpdateFailedException extends RecordException
 {
     private static final long serialVersionUID = 1L;
     
-    public static final ErrorType errorType = new 
ErrorType("error.db.recordUpateInvalid", "Updating the record {0} in {1} 
failed. The given record key is ambiguous.");
+    public static final ErrorType errorType = new 
ErrorType("error.db.recordUpateFailed",  "Updating the record {0} in {1} 
failed. It might have been changed or deleted by another user.");
     
     public RecordUpdateFailedException(DBRowSet rowset, Object[] key)
     {
-        super(errorType, new String[] { StringUtils.toString(key), 
StringUtils.coalesce(rowset.getName(), rowset.getAlias()) });
+        super(rowset, key, errorType, new String[] { keyToString(key), 
rowsetName(rowset) });
     }
 }
diff --git a/empire-db/src/main/java/org/apache/empire/db/list/Bean.java 
b/empire-db/src/main/java/org/apache/empire/db/list/DataBean.java
similarity index 88%
rename from empire-db/src/main/java/org/apache/empire/db/list/Bean.java
rename to empire-db/src/main/java/org/apache/empire/db/list/DataBean.java
index 0cc939f..44a1844 100644
--- a/empire-db/src/main/java/org/apache/empire/db/list/Bean.java
+++ b/empire-db/src/main/java/org/apache/empire/db/list/DataBean.java
@@ -21,7 +21,7 @@ package org.apache.empire.db.list;
 import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDatabase;
 
-public interface Bean<DB extends DBDatabase>
+public interface DataBean<DB extends DBDatabase>
 {
-    void onBeanLoaded(DB db, DBContext context, int rownum, Object parent);
+    void initialize(DB db, DBContext context, int rownum, Object parent);
 }

Reply via email to