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 f86df70 EMPIREDB-367 SampleApp example
f86df70 is described below
commit f86df708d17e39f4a7b2909c09cdf1365a9a5708
Author: Rainer Döbele <[email protected]>
AuthorDate: Wed Jan 26 19:40:04 2022 +0100
EMPIREDB-367 SampleApp example
---
.../org/apache/empire/samples/db/SampleApp.java | 236 ++++++++++++++-------
.../org/apache/empire/samples/db/SampleBean.java | 16 +-
.../org/apache/empire/samples/db/SampleDB.java | 4 +-
.../org/apache/empire/commons/StringUtils.java | 12 ++
.../org/apache/empire/data/list/DataListHead.java | 2 +-
.../java/org/apache/empire/db/DBRecordData.java | 13 +-
.../java/org/apache/empire/db/DBTableColumn.java | 27 ---
.../main/java/org/apache/empire/db/DBUtils.java | 5 +-
.../empire/db/list/DBRecordListFactoryImpl.java | 65 ++----
.../org/apache/empire/dbms/DBMSHandlerBase.java | 26 ++-
.../apache/empire/dbms/hsql/HSqlDDLGenerator.java | 12 +-
.../empire/dbms/oracle/OracleDDLGenerator.java | 9 +-
.../dbms/postgresql/PostgreDDLGenerator.java | 8 +-
13 files changed, 265 insertions(+), 170 deletions(-)
diff --git
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
index 6ddf503..13eb058 100644
---
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
+++
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
@@ -85,20 +85,21 @@ public class SampleApp
log.info("Running DB Sample...");
- // STEP 1: Get a JDBC Connection
+ // SECTION 1: Get a JDBC Connection
log.info("Step 1: getJDBCConnection()");
Connection conn = getJDBCConnection();
- // STEP 2: Choose a DBMSHandler
+ // SECTION 2: Choose a DBMSHandler
log.info("Step 2: getDatabaseProvider()");
DBMSHandler dbms =
getDBMSHandler(config.getDatabaseProvider(), conn);
- // STEP 2.2: Create a Context
+ // SECTION 2.2: Create a Context
context = new DBContextStatic(dbms, conn, false, true);
- // STEP 3: Open Database (and create if not existing)
+ // SECTION 3: Open Database (and create if not existing)
log.info("Step 3: openDatabase()");
+ boolean clearExistingData = true;
try {
// Open the database
db.open(context);
@@ -108,7 +109,7 @@ public class SampleApp
checkDataModel();
} catch(Exception e) {
- // STEP 4: Create Database
+ // SECTION 4: Create Database
log.info("Step 4: createDDL()");
// postgre does not support DDL in transaction
if(db.getDbms() instanceof DBMSHandlerPostgreSQL)
@@ -123,66 +124,50 @@ public class SampleApp
// Open again
if (db.isOpen()==false)
db.open(context);
+ // initial load
+ clearExistingData = false;
}
- // STEP 5: Clear Database (Delete all records)
- log.info("Step 5: clearDatabase()");
- clearDatabase();
-
- // STEP 6: Insert Departments
- log.info("Step 6: insertDepartment() &
insertEmployee()");
- int idDevDep = insertDepartment("Development", "ITTK");
- int idSalDep = insertDepartment("Sales", "ITTK");
- // Insert Employees
- int idEmp1 = insertEmployee("Peter", "Sharp", Gender.M,
idDevDep);
- int idEmp2 = insertEmployee("Fred", "Bloggs", Gender.M,
idDevDep);
- int idEmp3 = insertEmployee("Emma", "White", Gender.F,
idSalDep);
- // Insert Payments
- insertPayments(idEmp1, new BigDecimal(2000));
- insertPayments(idEmp3, new BigDecimal(2500));
-
- // commit
- context.commit();
-
- /*
+ // SECTION 5 AND 6: Populate Database and modify Data
+ populateAndModify(clearExistingData);
+
+ /*
int idEmp = testTransactionCreate(idDevDep);
testTransactionUpdate(idEmp);
testTransactionDelete(idEmp);
*/
- // STEP 7: Update Records (by setting the phone Number)
- log.info("Step 7: updateEmployee()");
- updateEmployee(idEmp1, "+49-7531-457160");
- updateEmployee(idEmp2, "+49-5555-505050");
- // Partial Record
- updatePartialRecord(idEmp3, "+49-040-125486");
- // Update Joined Records (Make Fred Bloggs head of
department and set salary)
- updateJoinedRecords(idEmp2, 100000);
-
- // commit
- context.commit();
+ // SECTION 7: Option 1: Query Records and print tab-separated
+ log.info("Step 8 Option 1: queryRecords() / Tab-Output");
+ queryRecords(QueryType.Reader); // Tab-Output
- // STEP 8: Option 1: Query Records and print
tab-separated
- log.info("Step 8 Option 1: queryRecords() /
Tab-Output");
- queryRecords(QueryType.Reader); // Tab-Output
-
- // STEP 8: Option 2: Query Records as a list of java beans
+ // SECTION 7: Option 2: Query Records as a list of java beans
log.info("Step 8 Option 2: queryRecords() / Bean-List-Output");
queryRecords(QueryType.BeanList); // Bean-List-Output
- // STEP 8: Option 3: Query Records as XML
- log.info("Step 8 Option 3: queryRecords() /
XML-Output");
- queryRecords(QueryType.XmlDocument); // XML-Output
+ // SECTION 7: Option 3: Query Records as XML
+ log.info("Step 8 Option 3: queryRecords() / XML-Output");
+ queryRecords(QueryType.XmlDocument); // XML-Output
+
+ // SECTION 8: Use DataList query
+ queryDataList();
- // STEP 9: Use Bean Result to query beans
- queryBeans(conn);
+ // SECTION 9: Use RecordList query
+ queryRecordList();
+
+ // SECTION 10: Use Bean Result to query beans
+ queryBeans();
+ // Finally, commit any changes
+ context.commit();
+
// Done
log.info("DB Sample finished successfully.");
} catch (Exception e)
{ // Error
log.error("Running SampleApp failed with Exception" +
e.toString(), e);
+ context.rollback();
} finally {
context.discard();
@@ -306,7 +291,40 @@ public class SampleApp
log.error("FATAL error when checking data model. Probably not
properly implemented by DBMSHandler!");
}
}
-
+
+ private static void populateAndModify(boolean clearExisting)
+ {
+ if (clearExisting)
+ clearDatabase();
+
+ log.info("Step 5: insertDepartment() & insertEmployee()");
+ int idDevDep = insertDepartment("Development", "ITTK");
+ int idSalDep = insertDepartment("Sales", "ITTK");
+ // Insert Employees
+ int idEmp1 = insertEmployee("Peter", "Sharp", Gender.M, idDevDep);
+ int idEmp2 = insertEmployee("Fred", "Bloggs", Gender.M, idDevDep);
+ int idEmp3 = insertEmployee("Emma", "White", Gender.F, idSalDep);
+ int idEmp4 = insertEmployee("John", "Doe", Gender.M, idSalDep);
+ int idEmp5 = insertEmployee("Sarah", "Smith", Gender.F, idDevDep);
+ // Insert Payments
+ insertPayments(idEmp1, new BigDecimal(2000));
+ insertPayments(idEmp3, new BigDecimal(2500));
+ insertPayments(idEmp4, new BigDecimal(2200));
+ insertPayments(idEmp5, new BigDecimal(1500));
+
+ // commit
+ context.commit();
+
+ // SECTION 6: Modify some data
+ log.info("Step 6: updateEmployee()");
+ updateEmployee(idEmp1, "+49-7531-457160");
+ updateEmployee(idEmp2, "+49-5555-505050");
+ // Partial Record
+ updatePartialRecord(idEmp3, "+49-040-125486");
+ // Update Joined Records (Make Fred Bloggs head of department and set
salary)
+ updateJoinedRecords(idEmp2, 100000);
+ }
+
/**
* <PRE>
* Empties all Tables.
@@ -626,30 +644,6 @@ public class SampleApp
cmd.where(EMP.LASTNAME.length().isGreaterThan(0));
// Order by
cmd.orderBy(EMPLOYEE_FULLNAME);
-
- /*
- * Test DataList
- *
- List<DataListEntry> list = context.getUtils().queryDataList(cmd);
- for (DataListEntry dle : list)
- {
- int empId = dle.getId(EMP);
- int empId2 = dle.getInt(EMP.ID);
- boolean test = dle.hasField(EMP.FIRSTNAME);
- System.out.println(dle.toString());
- }
- */
-
- /*
- * Test RecordList
- */
- List<DBRecord> list = context.getUtils().queryRecordList(cmd, new
DBQuery(cmd, EMP.ID));
- for (DBRecord record : list)
- {
- Object[] key = record.getKey();
- boolean exists = record.isExists();
- System.out.println(StringUtils.arrayToString(key, "|"));
- }
/*
* Example for limitRows() and skipRows()
@@ -711,7 +705,7 @@ public class SampleApp
}
}
- private static void queryBeans(Connection conn)
+ private static void queryBeans()
{
SampleDB.Employees EMP = db.EMPLOYEES;
// Query all males
@@ -728,4 +722,102 @@ public class SampleApp
log.info("Number of female employees is: "+result.size());
}
+ private static void queryDataList()
+ {
+ int lastYear = LocalDate.now().getYear()-1;
+
+ // Define shortcuts for tables used - not necessary but convenient
+ SampleDB.Employees EMP = db.EMPLOYEES;
+ SampleDB.Departments DEP = db.DEPARTMENTS;
+ SampleDB.Payments PAY = db.PAYMENTS;
+
+ // Employee total query
+ DBColumnExpr EMP_TOTAL = PAY.AMOUNT.sum().as("EMP_TOTAL");
+ DBCommand cmdEmpTotal = db.createCommand();
+ cmdEmpTotal.select(PAY.EMPLOYEE_ID, EMP_TOTAL);
+ cmdEmpTotal.where (PAY.YEAR.is(lastYear));
+ cmdEmpTotal.groupBy(PAY.EMPLOYEE_ID);
+ DBQuery qryEmpTotal = new DBQuery(cmdEmpTotal, "qet");
+
+ // Department total query
+ DBColumnExpr DEP_TOTAL = PAY.AMOUNT.sum().as("DEP_TOTAL");
+ DBCommand cmdDepTotal = db.createCommand();
+ cmdDepTotal.select(EMP.DEPARTMENT_ID, DEP_TOTAL);
+ cmdDepTotal.join (PAY.EMPLOYEE_ID, EMP.ID);
+ cmdDepTotal.where (PAY.YEAR.is(lastYear));
+ cmdDepTotal.groupBy(EMP.DEPARTMENT_ID);
+ DBQuery qryDepTotal = new DBQuery(cmdDepTotal, "qdt");
+
+ DBColumnExpr PCT_OF_DEPARTMENT_COST =
qryEmpTotal.column(EMP_TOTAL).multiplyWith(100).divideBy(qryDepTotal.column(DEP_TOTAL));
+ // Create the employee query
+ DBCommand cmd = db.createCommand();
+ cmd.select(EMP.ID, EMP.FIRSTNAME, EMP.LASTNAME);
+ cmd.select(DEP.ID, DEP.NAME.as("DEPARTMENT"));
+ cmd.select(qryEmpTotal.column(EMP_TOTAL));
+ cmd.select(PCT_OF_DEPARTMENT_COST.as("PCT_OF_DEPARTMENT_COST"));
+ // join Employee with Department
+ cmd.join (EMP.DEPARTMENT_ID, DEP.ID);
+ // Join with Subqueries
+ cmd.joinLeft(EMP.ID, qryEmpTotal.column(PAY.EMPLOYEE_ID));
+ cmd.joinLeft(DEP.ID, qryDepTotal.column(EMP.DEPARTMENT_ID));
+ // Order by
+ cmd.orderBy(DEP.NAME.desc());
+ cmd.orderBy(EMP.LASTNAME);
+
+ List<DataListEntry> list = context.getUtils().queryDataList(cmd);
+ /* uncomment this to print full list
+ for (DataListEntry dle : list)
+ System.out.println(dle.toString());
+ */
+ for (DataListEntry dle : list)
+ {
+ int empId = dle.getId(EMP);
+ // int depId = dle.getId(DEP);
+ String empName = StringUtils.concat(", ",
dle.getString(EMP.LASTNAME), dle.getString(EMP.FIRSTNAME));
+ String depName = dle.getString(DEP.NAME);
+ boolean hasPayments =!dle.isNull(qryEmpTotal.column(EMP_TOTAL));
+ if (hasPayments)
+ { // report
+ BigDecimal empTotal =
dle.getDecimal(qryEmpTotal.column(EMP_TOTAL));
+ BigDecimal pctOfDep =
dle.getDecimal(PCT_OF_DEPARTMENT_COST).setScale(1, RoundingMode.HALF_UP);
+ log.info("Eployee[{}]: {}\tDepartment: {}\tPayments: {} ({}%
of Department)", empId, empName, depName, empTotal, pctOfDep);
+ }
+ else
+ log.info("Eployee[{}]: {}\tDepartment: {}\tPayments: [No data
avaiable]", empId, empName, depName);
+ }
+ }
+
+ private static void queryRecordList()
+ {
+ SampleDB.Departments DEP = db.DEPARTMENTS;
+ SampleDB.Employees EMP = db.EMPLOYEES;
+ /*
+ * Test RecordList
+ */
+ DBCommand cmd = db.createCommand();
+ cmd.join(EMP.DEPARTMENT_ID, DEP.ID);
+ cmd.where(DEP.NAME.is("Development"));
+ // query now
+ List<DBRecord> list = context.getUtils().queryRecordList(cmd, EMP);
+ log.info("RecordList query found {} employees in Development
department", list.size());
+ for (DBRecord record : list)
+ {
+ Object[] key = record.getKey();
+ // print info
+ String empName = StringUtils.concat(", ",
record.getString(EMP.LASTNAME), record.getString(EMP.FIRSTNAME));
+ String phone = record.getString(EMP.PHONE_NUMBER);
+ BigDecimal salary = record.getDecimal(EMP.SALARY);
+ log.info("Eployee[{}]: {}\tPhone: {}\tSalary: {}",
StringUtils.toString(key), empName, phone, salary);
+ // modify salary
+ BigDecimal newSalary = new BigDecimal(2000 + ((Math.random()*200)
- 100.0));
+ record.setValue(EMP.SALARY, newSalary);
+ // check
+ if (record.wasModified(EMP.SALARY))
+ { // Salary was modified
+ log.info("Salary was modified for {}. New salary is {}",
empName, record.getDecimal(EMP.SALARY));
+ }
+ // udpate the record
+ record.update();
+ }
+ }
}
diff --git
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleBean.java
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleBean.java
index 9db7ee8..aa5922e 100644
---
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleBean.java
+++
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleBean.java
@@ -26,7 +26,7 @@ import java.math.BigDecimal;
*/
public class SampleBean
{
- private int employeeId;
+ private int id;
private String fullName;
private String gender;
private String phoneNumber;
@@ -49,17 +49,17 @@ public class SampleBean
this.paymentsLastYear = paymentsLastYear;
}
*/
-
- public int getEmployeeId()
+
+ public int getId()
{
- return employeeId;
+ return id;
}
- public void setEmployeeId(int employeeId)
+ public void setId(int id)
{
- this.employeeId = employeeId;
+ this.id = id;
}
-
+
public String getFullName()
{
return fullName;
@@ -124,7 +124,7 @@ public class SampleBean
public String toString()
{
StringBuffer buf = new StringBuffer();
- buf.append(employeeId);
+ buf.append(id);
buf.append("\t");
buf.append(fullName);
buf.append("\t");
diff --git
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleDB.java
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleDB.java
index 091272d..b1f3e2a 100644
---
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleDB.java
+++
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleDB.java
@@ -77,7 +77,7 @@ public class SampleDB extends DBDatabase
{
super("DEPARTMENTS", db);
// ID
- ID = addColumn("DEPARTMENT_ID", DataType.AUTOINC,
0, true, "DEP_ID_SEQUENCE"); // Sequence name only required for some DBMS
(e.g. Oracle)
+ ID = addColumn("ID", DataType.AUTOINC,
0, true); // Optional Sequence name ("DEP_ID_SEQUENCE") for some DBMS
(e.g. Oracle)
NAME = addColumn("NAME", DataType.VARCHAR,
80, true);
HEAD = addColumn("HEAD", DataType.VARCHAR,
80, false);
BUSINESS_UNIT = addColumn("BUSINESS_UNIT", DataType.VARCHAR,
4, true, "ITTK");
@@ -114,7 +114,7 @@ public class SampleDB extends DBDatabase
super("EMPLOYEES", db);
// ID
- ID = addColumn("EMPLOYEE_ID", DataType.AUTOINC,
0, true, "EMPLOYEE_ID_SEQUENCE"); // Sequence name only required for some
DBMS (e.g. Oracle)
+ ID = addColumn("ID", DataType.AUTOINC,
0, true); // Optional Sequence name ("EMPLOYEE_ID_SEQUENCE") for some DBMS
(e.g. Oracle)
SALUTATION = addColumn("SALUTATION", DataType.VARCHAR,
20, false);
FIRSTNAME = addColumn("FIRSTNAME", DataType.VARCHAR,
40, true);
LASTNAME = addColumn("LASTNAME", DataType.VARCHAR,
40, true);
diff --git a/empire-db/src/main/java/org/apache/empire/commons/StringUtils.java
b/empire-db/src/main/java/org/apache/empire/commons/StringUtils.java
index edd9cde..b746c91 100644
--- a/empire-db/src/main/java/org/apache/empire/commons/StringUtils.java
+++ b/empire-db/src/main/java/org/apache/empire/commons/StringUtils.java
@@ -192,6 +192,18 @@ public class StringUtils
// Only one member
return String.valueOf(array[0]);
}
+
+ /**
+ * Converts an array of objects to a string.
+ *
+ * @param array array of objects
+ * @param separator the separator to put between the object strings
+ * @return returns a String
+ */
+ public static String concat(String separator, Object... params)
+ {
+ return arrayToString(params, separator);
+ }
/**
* Checks if a string is empty
diff --git
a/empire-db/src/main/java/org/apache/empire/data/list/DataListHead.java
b/empire-db/src/main/java/org/apache/empire/data/list/DataListHead.java
index 3bfefef..3844794 100644
--- a/empire-db/src/main/java/org/apache/empire/data/list/DataListHead.java
+++ b/empire-db/src/main/java/org/apache/empire/data/list/DataListHead.java
@@ -121,7 +121,7 @@ public class DataListHead<T extends DataListEntry>
implements Serializable
public int getColumnIndex(ColumnExpr column)
{
for (int i=0; i<columns.length; i++)
- if (columns[i]==column)
+ if (columns[i]==column || columns[i].unwrap()==column)
return i;
// Not found, try by name
return getColumnIndex(column.getName());
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBRecordData.java
b/empire-db/src/main/java/org/apache/empire/db/DBRecordData.java
index 0e29bef..7ee7915 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBRecordData.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBRecordData.java
@@ -17,8 +17,10 @@
* under the License.
*/
package org.apache.empire.db;
+import java.beans.PropertyDescriptor;
// XML
import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
@@ -36,6 +38,7 @@ import
org.apache.empire.db.exceptions.FieldIllegalValueException;
import org.apache.empire.exceptions.BeanPropertySetException;
import org.apache.empire.exceptions.InvalidArgumentException;
import org.apache.empire.exceptions.ItemNotFoundException;
+import org.apache.empire.exceptions.PropertyReadOnlyException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
@@ -478,7 +481,15 @@ public abstract class DBRecordData extends DBObject
}
else
{ // Don't convert, just set
- PropertyUtils.setProperty(bean, property, null);
+ PropertyDescriptor pd =
PropertyUtils.getPropertyDescriptor(bean, property);
+ if (pd==null)
+ return; // No such property
+ // get the write method
+ final Method method = PropertyUtils.getWriteMethod(pd);
+ if (method == null)
+ throw new PropertyReadOnlyException(property);
+ // invoke
+ method.invoke(bean, value);
}
// IllegalAccessException
} catch (IllegalAccessException e)
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBTableColumn.java
b/empire-db/src/main/java/org/apache/empire/db/DBTableColumn.java
index 6e7c0c5..84f7ffd 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBTableColumn.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBTableColumn.java
@@ -395,31 +395,4 @@ public class DBTableColumn extends DBColumn
// done
return elem;
}
-
- /**
- * Gets the sequence name for this table's sequence (if it has one)
- * This is derived form the default value or auto generated if no default
value is set
- * @return the sequence name
- */
- public String getSequenceName()
- {
- String seqName;
- Object defValue = getDefaultValue();
- if(defValue != null)
- {
- seqName = defValue.toString();
- }
- else
- {
- if (rowset != null)
- {
- seqName = rowset.getName() + "." + name;
- }
- else
- {
- seqName = name;
- }
- }
- return seqName;
- }
}
\ No newline at end of file
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 76a6fc7..1c2fc3d 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
@@ -828,7 +828,10 @@ public class DBUtils implements DBContextAware
if (entry==null)
continue;
// add entry
- list.add(entry);
+ if (entry.isValid())
+ list.add(entry);
+ else
+ log.warn("Record {} is not valid thus it will not be added
to the RecordListQuery.", rownum);
// Decrease count
if (maxCount > 0)
maxCount--;
diff --git
a/empire-db/src/main/java/org/apache/empire/db/list/DBRecordListFactoryImpl.java
b/empire-db/src/main/java/org/apache/empire/db/list/DBRecordListFactoryImpl.java
index b76befd..b445886 100644
---
a/empire-db/src/main/java/org/apache/empire/db/list/DBRecordListFactoryImpl.java
+++
b/empire-db/src/main/java/org/apache/empire/db/list/DBRecordListFactoryImpl.java
@@ -14,8 +14,6 @@ import org.apache.empire.db.DBRecord;
import org.apache.empire.db.DBRecordData;
import org.apache.empire.db.DBRowSet;
import org.apache.empire.exceptions.InternalException;
-import org.apache.empire.exceptions.InvalidArgumentException;
-import org.apache.empire.exceptions.NotSupportedException;
import org.apache.empire.exceptions.UnsupportedTypeException;
/**
@@ -30,37 +28,30 @@ public class DBRecordListFactoryImpl<T extends DBRecord>
implements DBRecordList
* @param listHeadClass
* @return the constructor
*/
- @SuppressWarnings("unchecked")
- protected static <T extends DBRecord> Constructor<T>
findEntryConstructor(Class<?> recordClass, Class<? extends DBContext>
contextClass, Class<? extends DBRowSet> rowsetClass)
- {
- /*
- Constructor<?> constructor =
ClassUtils.findMatchingAccessibleConstructor(recordClass, new Class<?>[] {
listHeadClass, int.class, Object[].class });
- if (constructor==null)
- throw new UnsupportedTypeException(recordClass);
- return constructor;
- */
- try
- { // Find the constructor
- return
(Constructor<T>)recordClass.getDeclaredConstructor(contextClass, rowsetClass);
- }
- catch (NoSuchMethodException e)
- {
- throw new UnsupportedTypeException(recordClass);
+ protected static <T extends DBRecord> Constructor<T>
findRecordConstructor(Class<T> recordClass, Class<? extends DBContext>
contextClass, Class<? extends DBRowSet> rowsetClass)
+ { try
+ { // find the constructor
+ // Alternatively use
ClassUtils.findMatchingAccessibleConstructor()
+ return recordClass.getDeclaredConstructor(contextClass,
rowsetClass);
}
- catch (SecurityException e)
+ catch (NoSuchMethodException | SecurityException e)
{
throw new UnsupportedTypeException(recordClass);
}
}
+ /*
+ * Members
+ */
protected final Constructor<T> constructor;
protected final DBContext context;
protected final DBRowSet rowset;
/**
- * Constructs a DataListHead based on an DataListEntry constructor
- * @param constructor the DataListEntry constructor
- * @param columns the list entry columns
+ * Constructs a DBRecordListFactoryImpl based on an DBRecord constructor
+ * @param constructor the DBRecord constructor
+ * @param context the database context
+ * @param rowset the rowset for the created records
*/
public DBRecordListFactoryImpl(Constructor<T> constructor, DBContext
context, DBRowSet rowset)
{
@@ -69,9 +60,15 @@ public class DBRecordListFactoryImpl<T extends DBRecord>
implements DBRecordList
this.rowset = rowset;
}
+ /**
+ * Constructs a DBRecordListFactoryImpl based on an DBRecord constructor
+ * @param recordClass the record Class to be created for this list
+ * @param context the database context
+ * @param rowset the rowset for the created records
+ */
public DBRecordListFactoryImpl(Class<T> recordClass, DBContext context,
DBRowSet rowset)
{
- this(findEntryConstructor(recordClass, DBContext.class,
DBRowSet.class), context, rowset);
+ this(findRecordConstructor(recordClass, DBContext.class,
DBRowSet.class), context, rowset);
}
@Override
@@ -95,30 +92,12 @@ public class DBRecordListFactoryImpl<T extends DBRecord>
implements DBRecordList
@Override
public T newRecord(int rownum, DBRecordData dataRow)
{ try
- { // check
- if (dataRow==null)
- throw new InvalidArgumentException("data", dataRow);
- // must override newEntry if no recordClass is provided
- if (constructor==null)
- throw new NotSupportedException(this, "newEntry");
- // create item
+ { // create item
T record = constructor.newInstance(context, rowset);
rowset.initRecord(record, dataRow);
return record;
}
- catch (InstantiationException e)
- {
- throw new InternalException(e);
- }
- catch (IllegalAccessException e)
- {
- throw new InternalException(e);
- }
- catch (IllegalArgumentException e)
- {
- throw new InternalException(e);
- }
- catch (InvocationTargetException e)
+ catch (InstantiationException | IllegalAccessException |
IllegalArgumentException | InvocationTargetException e)
{
throw new InternalException(e);
}
diff --git
a/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java
b/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java
index 79b5d2d..90fc86e 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java
@@ -340,6 +340,30 @@ public abstract class DBMSHandlerBase implements
DBMSHandler
* @return an expression for the next sequence value
*/
public abstract DBColumnExpr getNextSequenceValueExpr(DBTableColumn
column);
+
+ /**
+ * Returns the sequence name of for a column of type AUTOINC
+ * The sequence name is usually provided as the default value
+ * If no Default value is provided the sequence name is generated from the
table and the column name
+ */
+ public String getColumnSequenceName(DBTableColumn column)
+ {
+ if (column.getDataType()!=DataType.AUTOINC)
+ throw new InvalidArgumentException("column", column);
+ // return the sequence name
+ Object seqName = column.getDefaultValue();
+ if (seqName!=null)
+ return seqName.toString();
+ // Auto-generate the sequence name
+ StringBuilder b = new StringBuilder(column.getRowSet().getName());
+ b.append("_");
+ b.append(column.getName());
+ b.append("_SEQ");
+ seqName = b.toString();
+ // Store as default for later use
+ column.setDefaultValue(seqName);
+ return (String)seqName;
+ }
/**
* Returns an auto-generated value for a particular column
@@ -358,7 +382,7 @@ public abstract class DBMSHandlerBase implements DBMSHandler
{ // Use a numeric sequence
if (isSupported(DBMSFeature.SEQUENCES)==false)
return null; // Create Later
- String sequenceName = column.getSequenceName();
+ String sequenceName = getColumnSequenceName(column);
return getNextSequenceValue(db, sequenceName, 1, conn);
}
else if (type== DataType.UNIQUEID)
diff --git
a/empire-db/src/main/java/org/apache/empire/dbms/hsql/HSqlDDLGenerator.java
b/empire-db/src/main/java/org/apache/empire/dbms/hsql/HSqlDDLGenerator.java
index d6ed2e4..a87387e 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/hsql/HSqlDDLGenerator.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/hsql/HSqlDDLGenerator.java
@@ -91,7 +91,8 @@ public class HSqlDDLGenerator extends
DBDDLGenerator<DBMSHandlerHSql>
if (c.getDataType() == DataType.AUTOINC && (c instanceof
DBTableColumn))
{ // SEQUENCE column
DBTableColumn column = (DBTableColumn) c;
- script.addStmt("DROP SEQUENCE " +
column.getSequenceName());
+ String seqName = dbms.getColumnSequenceName(column);
+ script.addStmt("DROP SEQUENCE " + seqName);
}
}
}
@@ -100,17 +101,16 @@ public class HSqlDDLGenerator extends
DBDDLGenerator<DBMSHandlerHSql>
/**
* Appends the DDL-Script for creating a sequence to an SQL-Script<br>
* @param db the database to create
- * @param c the column for which to create the sequence
+ * @param column the column for which to create the sequence
* @param script the sql script to which to append the dll command(s)
*/
- protected void createSequence(DBDatabase db, DBTableColumn c, DBSQLScript
script)
+ protected void createSequence(DBDatabase db, DBTableColumn column,
DBSQLScript script)
{
- Object defValue = c.getDefaultValue();
- String seqName = (defValue != null) ? defValue.toString() :
c.toString();
+ String seqName = dbms.getColumnSequenceName(column);
// createSQL
StringBuilder sql = new StringBuilder();
sql.append("-- creating sequence for column ");
- sql.append(c.toString());
+ sql.append(column.toString());
sql.append(" --\r\n");
sql.append("CREATE SEQUENCE ");
db.appendQualifiedName(sql, seqName, null);
diff --git
a/empire-db/src/main/java/org/apache/empire/dbms/oracle/OracleDDLGenerator.java
b/empire-db/src/main/java/org/apache/empire/dbms/oracle/OracleDDLGenerator.java
index 69be590..8b03805 100644
---
a/empire-db/src/main/java/org/apache/empire/dbms/oracle/OracleDDLGenerator.java
+++
b/empire-db/src/main/java/org/apache/empire/dbms/oracle/OracleDDLGenerator.java
@@ -126,7 +126,8 @@ public class OracleDDLGenerator extends
DBDDLGenerator<DBMSHandlerOracle>
if (c.getDataType() == DataType.AUTOINC && (c instanceof
DBTableColumn))
{ // SEQUENCE column
DBTableColumn column = (DBTableColumn) c;
- script.addStmt("DROP SEQUENCE " +
column.getSequenceName());
+ String seqName = dbms.getColumnSequenceName(column);
+ script.addStmt("DROP SEQUENCE " + seqName);
}
}
}
@@ -135,13 +136,13 @@ public class OracleDDLGenerator extends
DBDDLGenerator<DBMSHandlerOracle>
/**
* Returns true if the sequence has been created successfully.
*/
- protected void createSequence(DBDatabase db, DBTableColumn c, DBSQLScript
script)
+ protected void createSequence(DBDatabase db, DBTableColumn column,
DBSQLScript script)
{
- String seqName = c.getSequenceName();
+ String seqName = dbms.getColumnSequenceName(column);
// createSQL
StringBuilder sql = new StringBuilder();
sql.append("-- creating sequence for column ");
- sql.append(c.getFullName());
+ sql.append(column.getFullName());
sql.append(" --\r\n");
sql.append("CREATE SEQUENCE ");
db.appendQualifiedName(sql, seqName, null);
diff --git
a/empire-db/src/main/java/org/apache/empire/dbms/postgresql/PostgreDDLGenerator.java
b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/PostgreDDLGenerator.java
index 8777ef8..9fce87a 100644
---
a/empire-db/src/main/java/org/apache/empire/dbms/postgresql/PostgreDDLGenerator.java
+++
b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/PostgreDDLGenerator.java
@@ -98,16 +98,16 @@ public class PostgreDDLGenerator extends
DBDDLGenerator<DBMSHandlerPostgreSQL>
/**
* Appends the DDL-Script for creating a sequence to an SQL-Script<br>
* @param db the database to create
- * @param c the column for which to create the sequence
+ * @param column the column for which to create the sequence
* @param script the sql script to which to append the dll command(s)
*/
- protected void createSequence(DBDatabase db, DBTableColumn c, DBSQLScript
script)
+ protected void createSequence(DBDatabase db, DBTableColumn column,
DBSQLScript script)
{
- String seqName = c.getSequenceName();
+ String seqName = dbms.getColumnSequenceName(column);
// createSQL
StringBuilder sql = new StringBuilder();
sql.append("-- creating sequence for column ");
- sql.append(c.getFullName());
+ sql.append(column.getFullName());
sql.append(" --\r\n");
sql.append("CREATE SEQUENCE ");
db.appendQualifiedName(sql, seqName, null);