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

Reply via email to