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);
}