This is an automated email from the ASF dual-hosted git repository.
doebele pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git
The following commit(s) were added to refs/heads/master by this push:
new bee7f30 EMPIREDB-362 JSF and VUE Examples updated
bee7f30 is described below
commit bee7f303c8237ec37825cdcf6f472562a73811b8
Author: Rainer Döbele <[email protected]>
AuthorDate: Sat Feb 19 22:58:36 2022 +0100
EMPIREDB-362 JSF and VUE Examples updated
---
.../org/apache/empire/samples/db/SampleDB.java | 23 +-
empire-db-examples/empire-db-example-jsf2/pom.xml | 49 +++-
.../apache/empire/jsf2/websample/db/SampleDB.java | 270 ++++++++++++++------
.../empire/jsf2/websample/db/SampleDBwithMeta.java | 64 +++++
.../websample/db/records/DepartmentRecord.java | 2 +-
.../jsf2/websample/db/records/EmployeeRecord.java | 8 +-
.../jsf2/websample/web/SampleApplication.java | 248 +++++++++----------
.../empire/jsf2/websample/web/SampleConfig.java | 31 +--
.../web/objects/EmployeeSearchFilter.java | 9 +
.../websample/web/pages/EmployeeDetailPage.java | 35 ++-
.../jsf2/websample/web/pages/EmployeeListPage.java | 20 +-
.../src/main/resources/lang/messages_de.properties | 10 +-
.../src/main/resources/lang/messages_en.properties | 10 +-
.../src/main/webapp/WEB-INF/config.xml | 83 ++++++-
.../src/main/webapp/css/content.css | 6 +-
.../src/main/webapp/pages/employeeDetailPage.xhtml | 24 ++
empire-db-examples/empire-db-example-vue/pom.xml | 57 ++++-
.../empire-db-example-vue/readme.txt | 30 +++
.../org/apache/empire/rest/app}/SampleConfig.java | 31 +--
.../apache/empire/rest/app/SampleServiceApp.java | 147 ++++++-----
.../empire/rest/service/EmployeeService.java | 19 +-
.../org/apache/empire/vue/sample/db/SampleDB.java | 271 +++++++++++++++------
.../vue/sample/db/records/DepartmentRecord.java | 2 +-
.../vue/sample/db/records/EmployeeRecord.java | 8 +-
.../src/main/resources/lang/messages_de.properties | 4 +-
.../src/main/resources/lang/messages_en.properties | 4 +-
.../src/main/vue/_eslintrc.js.bak | 28 +++
.../src/main/vue/src/pages/employeeDetail.vue | 2 +-
.../src/main/webapp/WEB-INF/config.xml | 83 ++++++-
.../main/java/org/apache/empire/db/DBRowSet.java | 8 +-
pom.xml | 2 +
31 files changed, 1130 insertions(+), 458 deletions(-)
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 8e3b948..96afcae 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
@@ -39,14 +39,14 @@ import org.slf4j.LoggerFactory;
/**
* <PRE>
* This file contains the definition of the data model in Java.
- * The SampleDB data model consists of three tables and a foreign key relation.
+ * The SampleDB data model consists of three tables and two foreign key
relations.
* The tables are defined as nested classes here, but you may put them in
separate files if you want to.
+ *
+ * The class also provided methods to create the database (if it doesn't
exist)
+ * and to check the datamodel i.e. to compare this definition to the database
in the DBMS
*
* PLEASE NOTE THE NAMING CONVENTION:
- * Since all tables, views and columns are declared as "final" constants they
are all in upper case.
- * We recommend using a prefix of T_ for tables and C_ for columns in order to
keep them together
- * when listed in your IDE's code completion.
- * There is no need to stick to this convention but it makes life just another
little bit easier.
+ * Since all tables, views and columns are declared as "final" constants we
have all put them in upper case.
*
* You may declare other database tables or views in the same way.
* </PRE>
@@ -98,8 +98,9 @@ public class SampleDB extends DBDatabase
BUSINESS_UNIT = addColumn ("BUSINESS_UNIT",
DataType.VARCHAR, 4, true, "ITTK");
UPDATE_TIMESTAMP= addTimestamp("UPDATE_TIMESTAMP");
- // Primary Key (automatically set due to AUTOINC column)
- // setPrimaryKey(DEPARTMENT_ID);
+ // Primary Key (automatically set due to addIdentity()) otherwise
use
+ // setPrimaryKey(...);
+
// Set other Indexes
addIndex("DEPARTMENT_NAME_IDX", true, new DBColumn[] { NAME });
@@ -144,8 +145,9 @@ public class SampleDB extends DBDatabase
RETIRED = addColumn ("RETIRED", DataType.BOOL,
0, true, false);
UPDATE_TIMESTAMP= addTimestamp ("UPDATE_TIMESTAMP");
- // Primary Key (automatically set due to AUTOINC column)
- // setPrimaryKey(EMPLOYEE_ID);
+ // Primary Key (automatically set due to addIdentity()) otherwise
use
+ // setPrimaryKey(...);
+
// Set other Indexes
addIndex("EMPLOYEE_NAME_IDX", true, new DBColumn[] { FIRST_NAME,
LAST_NAME, DATE_OF_BIRTH });
@@ -174,9 +176,8 @@ public class SampleDB extends DBDatabase
MONTH = addColumn("MONTH", DataType.DECIMAL,
2.0, true);
AMOUNT = addColumn("AMOUNT", DataType.DECIMAL,
8.2, true);
- // Primary Key (automatically set due to AUTOINC column)
+ // Primary Key
setPrimaryKey(EMPLOYEE_ID, YEAR, MONTH);
- // Set other Indexes
// Set beanType (optional)
setBeanType(Payment.class);
diff --git a/empire-db-examples/empire-db-example-jsf2/pom.xml
b/empire-db-examples/empire-db-example-jsf2/pom.xml
index d1c0f11..7123812 100644
--- a/empire-db-examples/empire-db-example-jsf2/pom.xml
+++ b/empire-db-examples/empire-db-example-jsf2/pom.xml
@@ -77,15 +77,54 @@
<scope>provided</scope>
</dependency>
- <!-- use log4j for logging -->
+ <!-- All Databases (scope: runtime) -->
+ <!-- hsqldb -->
<dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
+ <groupId>org.hsqldb</groupId>
+ <artifactId>hsqldb</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <!-- dh2 -->
+ <dependency>
+ <groupId>com.h2database</groupId>
+ <artifactId>h2</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <!-- derby -->
+ <dependency>
+ <groupId>org.apache.derby</groupId>
+ <artifactId>derby</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <!-- mysql -->
+ <dependency>
+ <groupId>mysql</groupId>
+ <artifactId>mysql-connector-java</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <!-- postgresql -->
+ <dependency>
+ <groupId>org.postgresql</groupId>
+ <artifactId>postgresql</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <!-- msssql -->
+ <dependency>
+ <groupId>com.microsoft.sqlserver</groupId>
+ <artifactId>mssql-jdbc</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <!-- oracle -->
+ <dependency>
+ <groupId>com.oracle.database.jdbc</groupId>
+ <artifactId>ojdbc8</artifactId>
+ <scope>runtime</scope>
</dependency>
+ <!-- use log4j for logging -->
<dependency>
- <groupId>org.hsqldb</groupId>
- <artifactId>hsqldb</artifactId>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
</dependency>
</dependencies>
diff --git
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/SampleDB.java
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/SampleDB.java
index 098ab66..7bce95a 100644
---
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/SampleDB.java
+++
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/SampleDB.java
@@ -18,78 +18,100 @@
*/
package org.apache.empire.jsf2.websample.db;
-import org.apache.empire.commons.Options;
+import java.sql.SQLException;
+
import org.apache.empire.data.DataType;
import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBContext;
import org.apache.empire.db.DBDatabase;
+import org.apache.empire.db.DBSQLScript;
import org.apache.empire.db.DBTableColumn;
+import org.apache.empire.db.validation.DBModelChecker;
+import org.apache.empire.db.validation.DBModelErrorLogger;
+import org.apache.empire.dbms.postgresql.DBMSHandlerPostgreSQL;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+/**
+ * <PRE>
+ * This file contains the definition of the data model in Java.
+ * The SampleDB data model consists of three tables and two foreign key
relations.
+ * The tables are defined as nested classes here, but you may put them in
separate files if you want to.
+ *
+ * The class also provided methods to create the database (if it doesn't
exist)
+ * and to check the datamodel i.e. to compare this definition to the database
in the DBMS
+ *
+ * PLEASE NOTE THE NAMING CONVENTION:
+ * Since all tables, views and columns are declared as "final" constants we
have all put them in upper case.
+ *
+ * You may declare other database tables or views in the same way.
+ * </PRE>
+ */
public class SampleDB extends DBDatabase
{
- // *Deprecated* private static final long serialVersionUID = 1L;
-
- // Declare all Tables
- public final TDepartments T_DEPARTMENTS = new TDepartments(this);
- public final TEmployees T_EMPLOYEES = new TEmployees(this);
-
+ // Logger
+ private static final Logger log = LoggerFactory.getLogger(SampleDB.class);
+
/**
- * Constructor SampleDB
+ * Gender enum
*/
- public SampleDB()
+ public enum Gender
{
- // Define Foreign-Key Relations
- addRelation(T_EMPLOYEES.DEPARTMENT_ID.referenceOn(T_DEPARTMENTS.ID));
- }
-
- // Needed for the DBELResolver
- @Override
- protected void register(String id)
- {
- super.register("db");
+ M("Male"),
+ F("Female"),
+ U("Unknown");
+
+ private final String title;
+ private Gender(String title)
+ {
+ this.title = title;
+ }
+ @Override
+ public String toString()
+ {
+ return title;
+ }
}
/**
- * This class represents the definition of the Departments table.
+ * This class represents the Departments table.
*/
public static class TDepartments extends SampleTable
{
- // *Deprecated* private static final long serialVersionUID = 1L;
-
public final DBTableColumn ID;
public final DBTableColumn NAME;
public final DBTableColumn HEAD;
public final DBTableColumn BUSINESS_UNIT;
public final DBTableColumn UPDATE_TIMESTAMP;
- public TDepartments(DBDatabase db)
+ public TDepartments(SampleDB db)
{
super("DEPARTMENTS", db);
// ID
- ID = addColumn("ID", DataType.AUTOINC,
0, true, "DEP_ID_SEQUENCE"); // Optional 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");
- UPDATE_TIMESTAMP= addColumn("UPDATE_TIMESTAMP",
DataType.TIMESTAMP, 0, true);
-
- // Primary Key (automatically set due to AUTOINC column)
- // setPrimaryKey(DEPARTMENT_ID);
+ ID = addIdentity ("ID",
"DEP_ID_SEQUENCE"); // Optional 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");
+ UPDATE_TIMESTAMP= addTimestamp("UPDATE_TIMESTAMP");
+
+ // Primary Key (automatically set due to addIdentity()) otherwise
use
+ // setPrimaryKey(...);
+
// Set other Indexes
- addIndex("DEARTMENT_NAME_IDX", true, new DBColumn[] { NAME });
+ addIndex("DEPARTMENT_NAME_IDX", true, new DBColumn[] { NAME });
+
+ // optional: set entity name for selectQualified() to singular
since table is plural
+ setEntityName("DEPARTMENT");
}
}
-
-
/**
- * This class represents the definition of the Employees table.
+ * This class represents the Employees table.
*/
public static class TEmployees extends SampleTable
{
- // *Deprecated* private static final long serialVersionUID = 1L;
-
public final DBTableColumn ID;
public final DBTableColumn SALUTATION;
-// public final DBTableColumn PICTURE;
public final DBTableColumn FIRST_NAME;
public final DBTableColumn LAST_NAME;
public final DBTableColumn DATE_OF_BIRTH;
@@ -97,53 +119,151 @@ public class SampleDB extends DBDatabase
public final DBTableColumn GENDER;
public final DBTableColumn PHONE_NUMBER;
public final DBTableColumn EMAIL;
+ public final DBTableColumn SALARY;
public final DBTableColumn RETIRED;
public final DBTableColumn UPDATE_TIMESTAMP;
- public TEmployees(DBDatabase db)
+
+ public TEmployees(SampleDB db)
{
super("EMPLOYEES", db);
- // ID
- ID = addColumn("ID", DataType.AUTOINC,
0, true, "EMPLOYEE_ID_SEQUENCE"); // Optional Sequence name for some DBMS
(e.g. Oracle)
- SALUTATION = addColumn("SALUTATION",
DataType.VARCHAR, 5, false);
- FIRST_NAME = addColumn("FIRST_NAME",
DataType.VARCHAR, 40, true);
- LAST_NAME = addColumn("LAST_NAME",
DataType.VARCHAR, 40, true);
- DATE_OF_BIRTH = addColumn("DATE_OF_BIRTH", DataType.DATE,
0, false);
- DEPARTMENT_ID = addColumn("DEPARTMENT_ID",
DataType.INTEGER, 0, true);
- GENDER = addColumn("GENDER",
DataType.VARCHAR, 1, false);
- PHONE_NUMBER = addColumn("PHONE_NUMBER",
DataType.VARCHAR, 40, false);
- EMAIL = addColumn("EMAIL",
DataType.VARCHAR, 80, false);
- RETIRED = addColumn("RETIRED",
DataType.BOOL, 0, true, false);
- // PICTURE = addColumn("PICTURE",
DataType.BLOB, 0, false);
- UPDATE_TIMESTAMP= addColumn("UPDATE_TIMESTAMP",
DataType.TIMESTAMP, 0, true);
-
- // Primary Key (automatically set due to AUTOINC column)
- // setPrimaryKey(EMPLOYEE_ID);
- // Set other Indexes
- addIndex("PERSON_NAME_IDX", true, new DBColumn[] { FIRST_NAME,
LAST_NAME, DATE_OF_BIRTH });
-
- // Create Options for GENDER column
- Options genders = new Options();
- genders.set("M", "!option.employee.gender.male");
- genders.set("F", "!option.employee.gender.female");
- GENDER.setOptions(genders);
- GENDER.setControlType("select");
-
- Options retired = new Options();
- retired.set(false, "!option.employee.active");
- retired.set(true, "!option.employee.retired");
- RETIRED.setOptions(retired);
- RETIRED.setControlType("checkbox");
- // Set special control types
- DEPARTMENT_ID.setControlType("select");
- PHONE_NUMBER .setControlType("phone");
+ // ID
+ ID = addIdentity ("ID",
"EMPLOYEE_ID_SEQUENCE"); // Optional Sequence name for some DBMS (e.g. Oracle)
+ SALUTATION = addColumn ("SALUTATION",
DataType.VARCHAR, 5, false);
+ FIRST_NAME = addColumn ("FIRST_NAME",
DataType.VARCHAR, 40, true);
+ LAST_NAME = addColumn ("LAST_NAME",
DataType.VARCHAR, 40, true);
+ DATE_OF_BIRTH = addColumn ("DATE_OF_BIRTH", DataType.DATE,
0, false);
+ DEPARTMENT_ID = addForeignKey("DEPARTMENT_ID",
db.DEPARTMENTS, true);
+ GENDER = addColumn ("GENDER",
DataType.VARCHAR, 1, true, Gender.class);
+ PHONE_NUMBER = addColumn ("PHONE_NUMBER",
DataType.VARCHAR, 40, false, "0815-");
+ EMAIL = addColumn ("EMAIL",
DataType.VARCHAR, 80, false);
+ SALARY = addColumn ("SALARY",
DataType.DECIMAL, 10.2, false);
+ RETIRED = addColumn ("RETIRED", DataType.BOOL,
0, true, false);
+ UPDATE_TIMESTAMP= addTimestamp ("UPDATE_TIMESTAMP");
- // Set optional formatting attributes
- DATE_OF_BIRTH.setAttribute("format:date", "yyyy-MM-dd");
+ // Primary Key (automatically set due to addIdentity()) otherwise
use
+ // setPrimaryKey(...);
+
+ // Set other Indexes
+ addIndex("EMPLOYEE_NAME_IDX", true, new DBColumn[] { FIRST_NAME,
LAST_NAME, DATE_OF_BIRTH });
+
+ // optional: set entity name for selectQualified() to singular
since table is plural
+ setEntityName("EMPLOYEE");
+ }
+ }
+
+ /**
+ * This class represents the Payments table.
+ */
+ public static class TPayments extends SampleTable
+ {
+ public final DBTableColumn EMPLOYEE_ID;
+ public final DBTableColumn YEAR;
+ public final DBTableColumn MONTH;
+ public final DBTableColumn AMOUNT;
+
+ public TPayments(SampleDB db)
+ {
+ super("PAYMENTS", db);
- // PICTURE.setControlType("blob");
+ // ID
+ EMPLOYEE_ID = addForeignKey("EMPLOYEE_ID", db.EMPLOYEES,
true);
+ YEAR = addColumn("YEAR", DataType.DECIMAL,
4.0, true);
+ MONTH = addColumn("MONTH", DataType.DECIMAL,
2.0, true);
+ AMOUNT = addColumn("AMOUNT", DataType.DECIMAL,
8.2, true);
+
+ // Primary Key
+ setPrimaryKey(EMPLOYEE_ID, YEAR, MONTH);
+
+ // optional: set entity name for selectQualified() to singular
since table is plural
+ setEntityName("PAYMENT");
+ }
+ }
+
+ // Declare all Tables and Views here
+ public final TDepartments DEPARTMENTS = new TDepartments(this);
+ public final TEmployees EMPLOYEES = new TEmployees(this);
+ public final TPayments PAYMENTS = new TPayments(this);
+
+ /**
+ * Constructor of the SampleDB data model
+ *
+ * Put all foreign key relations here.
+ */
+ public SampleDB()
+ {
+ // Define additional Foreign-Key Relations here
+ // which have not already been defined by addForeignKey()
+ // addRelation( {Source Column}.referenceOn( {Target Column} ));
+ log.info("SampleDB has been created with {} Tables and {} Relations",
getTables().size(), getRelations().size());
+ }
+ // Needed for the DBELResolver
+ @Override
+ protected void register(String id)
+ {
+ super.register("db");
+ }
+
+ @Override
+ public void open(DBContext context)
+ {
+ // Enable prepared statements
+ // setPreparedStatementsEnabled(true);
+ // Check exists
+ if (checkExists(context))
+ { // attach to driver
+ super.open(context);
+ // yes, it exists, then check the model
+ checkDataModel(context);
+ }
+ else
+ { // PostgreSQL does not support DDL in transaction
+ if(getDbms() instanceof DBMSHandlerPostgreSQL)
+ setAutoCommit(context, true);
+ // create the database
+ createDatabase(context);
+ // PostgreSQL does not support DDL in transaction
+ if(getDbms() instanceof DBMSHandlerPostgreSQL)
+ setAutoCommit(context, false);
+ // attach to driver
+ super.open(context);
}
}
+ private void createDatabase(DBContext context)
+ {
+ // create DDL for Database Definition
+ DBSQLScript script = new DBSQLScript(context);
+ getCreateDDLScript(script);
+ // Show DDL Statement
+ log.info(script.toString());
+ // Execute Script
+ script.executeAll(false);
+ // Commit
+ context.commit();
+ }
+
+ private void checkDataModel(DBContext context)
+ { try {
+ DBModelChecker modelChecker =
context.getDbms().createModelChecker(this);
+ // Check data model
+ log.info("Checking DataModel for {} using {}",
getClass().getSimpleName(), modelChecker.getClass().getSimpleName());
+ // dbo schema
+ DBModelErrorLogger logger = new DBModelErrorLogger();
+ modelChecker.checkModel(this, context.getConnection(), logger);
+ // show result
+ log.info("Data model check done. Found {} errors and {}
warnings.", logger.getErrorCount(), logger.getWarnCount());
+ } catch(Exception e) {
+ log.error("FATAL error when checking data model. Probably not
properly implemented by DBMSHandler!");
+ }
+ }
+
+ private void setAutoCommit(DBContext context, boolean enable)
+ { try {
+ context.getConnection().setAutoCommit(enable);
+ } catch (SQLException e) {
+ log.error("Unable to set AutoCommit on Connection", e);
+ }
+ }
}
diff --git
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/SampleDBwithMeta.java
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/SampleDBwithMeta.java
new file mode 100644
index 0000000..c1dd3f2
--- /dev/null
+++
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/SampleDBwithMeta.java
@@ -0,0 +1,64 @@
+/*
+ * 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.jsf2.websample.db;
+
+import org.apache.empire.commons.Options;
+import org.apache.empire.db.DBContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SampleDBwithMeta extends SampleDB
+{
+ // Logger
+ private static final Logger log =
LoggerFactory.getLogger(SampleDBwithMeta.class);
+
+ @Override
+ public void open(DBContext context)
+ {
+ super.open(context);
+ // add JSF Metatada
+ addMeta(EMPLOYEES);
+ }
+
+ private void addMeta(SampleDB.TEmployees T)
+ {
+ log.info("Adding additional Metadata for {}", T.getName());
+
+ // Create Options for GENDER column
+ // add the message-keys instead of the enum string value
+ Options genders = new Options();
+ genders.set(Gender.M, "!option.employee.gender.male");
+ genders.set(Gender.F, "!option.employee.gender.female");
+ T.GENDER.setOptions(genders);
+ T.GENDER.setControlType("select");
+
+ Options retired = new Options();
+ retired.set(false, "!option.employee.active");
+ retired.set(true, "!option.employee.retired");
+ T.RETIRED.setOptions(retired);
+ T.RETIRED.setControlType("checkbox");
+
+ // Set special control types
+ T.DEPARTMENT_ID.setControlType("select");
+ T.PHONE_NUMBER .setControlType("phone");
+
+ // Set optional formatting attributes
+ T.DATE_OF_BIRTH.setAttribute("format:date", "yyyy-MM-dd");
+ }
+}
diff --git
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/DepartmentRecord.java
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/DepartmentRecord.java
index 03bff52..3296cf1 100644
---
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/DepartmentRecord.java
+++
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/DepartmentRecord.java
@@ -27,7 +27,7 @@ public class DepartmentRecord extends
SampleRecord<TDepartments>
public DepartmentRecord(SampleContext context)
{
- super(context, context.getDatabase().T_DEPARTMENTS);
+ super(context, context.getDatabase().DEPARTMENTS);
}
}
diff --git
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/EmployeeRecord.java
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/EmployeeRecord.java
index 0b03e32..5e7f661 100644
---
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/EmployeeRecord.java
+++
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/EmployeeRecord.java
@@ -32,7 +32,7 @@ public class EmployeeRecord extends SampleRecord<TEmployees>
public EmployeeRecord(SampleContext context)
{
- super(context, context.getDatabase().T_EMPLOYEES);
+ super(context, context.getDatabase().EMPLOYEES);
}
/*
@@ -56,9 +56,9 @@ public class EmployeeRecord extends SampleRecord<TEmployees>
{
SampleDB db = (SampleDB) getDatabase();
DBCommand cmd = context.createCommand();
- cmd.select(db.T_DEPARTMENTS.ID);
- cmd.select(db.T_DEPARTMENTS.NAME);
- cmd.orderBy(db.T_DEPARTMENTS.NAME);
+ cmd.select(db.DEPARTMENTS.ID);
+ cmd.select(db.DEPARTMENTS.NAME);
+ cmd.orderBy(db.DEPARTMENTS.NAME);
return context.getUtils().queryOptionList(cmd);
}
// base class implementation
diff --git
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
index b701a8c..271fa94 100644
---
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
+++
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
@@ -18,9 +18,12 @@
*/
package org.apache.empire.jsf2.websample.web;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
+import java.time.LocalDate;
import java.util.Locale;
import javax.servlet.ServletContext;
@@ -31,20 +34,15 @@ import org.apache.empire.db.DBCommand;
import org.apache.empire.db.DBContext;
import org.apache.empire.db.DBDatabase;
import org.apache.empire.db.DBRecord;
-import org.apache.empire.db.DBSQLScript;
import org.apache.empire.db.context.DBContextStatic;
import org.apache.empire.db.context.DBRollbackManager;
import org.apache.empire.db.context.DBRollbackManager.ReleaseAction;
-import org.apache.empire.db.exceptions.QueryFailedException;
import org.apache.empire.dbms.DBMSHandler;
-import org.apache.empire.dbms.hsql.DBMSHandlerHSql;
-import org.apache.empire.dbms.mysql.DBMSHandlerMySQL;
-import org.apache.empire.dbms.oracle.DBMSHandlerOracle;
-import org.apache.empire.dbms.sqlserver.DBMSHandlerMSSQL;
import org.apache.empire.jsf2.app.WebApplication;
import org.apache.empire.jsf2.controls.InputControlManager;
import org.apache.empire.jsf2.custom.controls.FileInputControl;
import org.apache.empire.jsf2.websample.db.SampleDB;
+import org.apache.empire.jsf2.websample.db.SampleDBwithMeta;
import org.apache.empire.jsf2.websample.web.pages.SamplePages;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -98,44 +96,44 @@ public class SampleApplication extends WebApplication {
// Done
}
- /*
- * getJDBCConnection
- */
- private Connection getJDBCConnection(ServletContext appContext) {
- // Establish a new database connection
- Connection conn = null;
- String jdbcURL = config.getJdbcURL();
- if (jdbcURL.indexOf("file:") > 0)
- jdbcURL = StringUtils.replace(jdbcURL, "file:", "file:"
- + appContext.getRealPath("/"));
- // Connect
- log.info("Connecting to Database'" + jdbcURL + "' / User="
- + config.getJdbcUser());
- try { // Connect to the databse
- Class.forName(config.getJdbcClass()).newInstance();
- conn = DriverManager.getConnection(jdbcURL,
config.getJdbcUser(),
- config.getJdbcPwd());
- log.info("Connected successfully");
- // set the AutoCommit to false this session. You must
commit
- // explicitly now
- conn.setAutoCommit(false);
- log.info("AutoCommit is " + conn.getAutoCommit());
-
- } catch (Exception e) {
- log.error("Failed to connect directly to '" +
config.getJdbcURL()
- + "' / User=" + config.getJdbcUser());
- log.error(e.toString());
- throw new RuntimeException(e);
- }
- return conn;
- }
+ /*
+ * getJDBCConnection
+ */
+ private Connection getJDBCConnection(ServletContext appContext)
+ {
+ // Establish a new database connection
+ Connection conn = null;
+ String jdbcURL = config.getJdbcURL();
+ if (jdbcURL.indexOf("file:") > 0)
+ jdbcURL = StringUtils.replace(jdbcURL, "file:", "file:" +
appContext.getRealPath("/"));
+ // Connect
+ log.info("Connecting to Database'" + jdbcURL + "' / User=" +
config.getJdbcUser());
+ try
+ { // Connect to the database
+ Class.forName(config.getJdbcClass()).newInstance();
+ conn = DriverManager.getConnection(jdbcURL, config.getJdbcUser(),
config.getJdbcPwd());
+ log.info("Connected successfully");
+ // set the AutoCommit to false this session. You must commit
+ // explicitly now
+ conn.setAutoCommit(false);
+ log.info("AutoCommit is " + conn.getAutoCommit());
+
+ }
+ catch (Exception e)
+ {
+ log.error("Failed to connect directly to '" + config.getJdbcURL()
+ "' / User=" + config.getJdbcUser());
+ log.error(e.toString());
+ throw new RuntimeException(e);
+ }
+ return conn;
+ }
private void initDatabase() {
- sampleDB = new SampleDB();
+ // Create Database with Metadata!
+ sampleDB = new SampleDBwithMeta();
// Open Database (and create if not existing)
- String driverProvider = config.getDatabaseProvider();
- DBMSHandler dbmsHandler = getDBMSHandler(driverProvider);
+ DBMSHandler dbmsHandler = getDBMSHandler(config.getDatabaseProvider(),
conn);
log.info("Opening database '{}' using '{}'",
sampleDB.getClass().getSimpleName(), dbmsHandler.getClass().getSimpleName());
Connection conn = null;
DBContext context = null;
@@ -143,43 +141,45 @@ public class SampleApplication extends WebApplication {
conn = getConnection(sampleDB);
context = new DBContextStatic(dbmsHandler, conn);
sampleDB.open(context);
- if (!databaseExists(context)) {
- // STEP 4: Create Database
- log.info("Creating database {}",
sampleDB.getClass().getSimpleName());
- createSampleDatabase(context);
- }
+ // check if database was just created
+ DBCommand cmd = context.createCommand();
+ cmd.select(sampleDB.EMPLOYEES.count());
+ if (context.getUtils().querySingleInt(cmd)==0)
+ { // Populate Database
+ populateDatabase(context);
+ }
} finally {
context.discard();
releaseConnection(conn, true, null);
}
}
- /*
- * getDatabaseDriver
- */
- private DBMSHandler getDBMSHandler(String provider) {
- if (provider.equalsIgnoreCase("mysql")) {
- DBMSHandlerMySQL dbms = new DBMSHandlerMySQL();
- // Set Driver specific properties (if any)
- dbms.setDatabaseName(config.getSchemaName());
- return dbms;
- } else if (provider.equalsIgnoreCase("oracle")) {
- DBMSHandlerOracle dbms = new DBMSHandlerOracle();
- // Set Driver specific properties (if any)
- return dbms;
- } else if (provider.equalsIgnoreCase("sqlserver")) {
- DBMSHandlerMSSQL dbms = new DBMSHandlerMSSQL();
- // Set Driver specific properties (if any)
- dbms.setDatabaseName(config.getSchemaName());
- return dbms;
- } else if (provider.equalsIgnoreCase("hsqldb")) {
- DBMSHandlerHSql dbms = new DBMSHandlerHSql();
- // Set Driver specific properties (if any)
- return dbms;
- } else { // Unknown Provider
- throw new RuntimeException("Unknown Database Provider "
+ provider);
- }
- }
+ /**
+ * Creates an Empire-db DatabaseDriver for the given provider and applies
dbms specific configuration
+ */
+ private DBMSHandler getDBMSHandler(String provider, Connection conn)
+ {
+ try
+ { // Get Driver Class Name
+ String dbmsHandlerClass = config.getDbmsHandlerClass();
+ if (StringUtils.isEmpty(dbmsHandlerClass))
+ throw new RuntimeException("Configuration error: Element
'dbmsHandlerClass' not found in node 'properties-"+provider+"'");
+
+ // Create dbms
+ DBMSHandler dbms = (DBMSHandler)
Class.forName(dbmsHandlerClass).newInstance();
+
+ // Configure dbms
+ config.readProperties(dbms, "properties-"+provider,
"dbmsHandlerProperites");
+
+ // done
+ return dbms;
+
+ } catch (Exception e)
+ { // catch any checked exception and forward it
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ }
private void initPages(ServletContext sc) {
// register Page Beans
@@ -190,44 +190,21 @@ public class SampleApplication extends WebApplication {
return sampleDB;
}
- private boolean databaseExists(DBContext context) {
- // Check wether DB exists
- DBCommand cmd = context.createCommand();
- cmd.select(sampleDB.T_DEPARTMENTS.count());
- try {
- return (context.getUtils().querySingleInt(cmd, -1) >=
0);
- } catch (QueryFailedException e) {
- return false;
- }
- }
-
/*
* creates a DDL Script for the entire SampleDB Database then checks if
the
* department table exists by running "select count(*) from
DEPARTMENTS" if
* the department tables does not exist, the entire dll-script is
executed
* line by line
*/
- private void createSampleDatabase(DBContext context) {
- // create DLL for Database Definition
- DBSQLScript script = new DBSQLScript(context);
- sampleDB.getCreateDDLScript(script);
- // Show DLL Statements
- System.out.println(script.toString());
- // Execute Script
- script.executeAll(false);
- context.commit();
- // Open again
- if (!sampleDB.isOpen()) {
- sampleDB.open(context);
- }
+ private void populateDatabase(DBContext context) {
// Insert Sample Departments
insertDepartmentSampleRecord(context, "Procurement", "ITTK");
int idDevDep = insertDepartmentSampleRecord(context,
"Development", "ITTK");
int idSalDep = insertDepartmentSampleRecord(context, "Sales",
"ITTK");
// Insert Sample Employees
- insertEmployeeSampleRecord(context, "Mr.", "Eugen", "Miller",
"M", idDevDep);
- insertEmployeeSampleRecord(context, "Mr.", "Max", "Mc.
Callahan", "M", idDevDep);
- insertEmployeeSampleRecord(context, "Mrs.", "Anna", "Smith",
"F", idSalDep);
+ insertEmployeeSampleRecord(context, "Mr.", "Eugen", "Miller",
"M", 30000, idDevDep);
+ insertEmployeeSampleRecord(context, "Mr.", "Max", "Mc.
Callahan", "M", 22500, idDevDep);
+ insertEmployeeSampleRecord(context, "Mrs.", "Anna", "Smith",
"F", 44250, idSalDep);
// Commit
context.commit();
}
@@ -237,42 +214,65 @@ public class SampleApplication extends WebApplication {
*/
private int insertDepartmentSampleRecord(DBContext context, String
department_name, String businessUnit) {
// Insert a Department
- DBRecord rec = new DBRecord(context, sampleDB.T_DEPARTMENTS);
- rec.create();
- rec.set(sampleDB.T_DEPARTMENTS.NAME, department_name);
- rec.set(sampleDB.T_DEPARTMENTS.BUSINESS_UNIT, businessUnit);
- try {
- rec.update();
- } catch (Exception e) {
- log.error(e.getLocalizedMessage());
- return 0;
- }
+ DBRecord rec = new DBRecord(context, sampleDB.DEPARTMENTS);
+ rec.create()
+ .set(sampleDB.DEPARTMENTS.NAME, department_name)
+ .set(sampleDB.DEPARTMENTS.BUSINESS_UNIT, businessUnit)
+ .update();
// Return Department ID
- return rec.getInt(sampleDB.T_DEPARTMENTS.ID);
+ return rec.getInt(sampleDB.DEPARTMENTS.ID);
}
/*
* Insert a person
*/
- private int insertEmployeeSampleRecord(DBContext context, String
salutation, String firstName, String lastName, String gender, int depID) {
+ private int insertEmployeeSampleRecord(DBContext context, String
salutation, String firstName, String lastName, String gender, int salary, int
depID) {
// Insert an Employee
- DBRecord rec = new DBRecord(context, sampleDB.T_EMPLOYEES);
- rec.create();
- rec.set(sampleDB.T_EMPLOYEES.SALUTATION, salutation);
- rec.set(sampleDB.T_EMPLOYEES.FIRST_NAME, firstName);
- rec.set(sampleDB.T_EMPLOYEES.LAST_NAME, lastName);
- rec.set(sampleDB.T_EMPLOYEES.GENDER, gender);
- rec.set(sampleDB.T_EMPLOYEES.DEPARTMENT_ID, depID);
- try {
- rec.update();
- } catch (Exception e) {
- log.error(e.getLocalizedMessage());
- return 0;
- }
+ SampleDB.TEmployees EMP = sampleDB.EMPLOYEES;
+ DBRecord rec = new DBRecord(context, sampleDB.EMPLOYEES);
+ rec.create()
+ .set(EMP.SALUTATION, salutation)
+ .set(EMP.FIRST_NAME, firstName)
+ .set(EMP.LAST_NAME, lastName)
+ .set(EMP.GENDER, gender)
+ .set(EMP.DEPARTMENT_ID, depID)
+ .set(EMP.SALARY, salary)
+ .update();
+ // insert Payments
+ insertPayments(rec);
// Return Employee ID
- return rec.getInt(sampleDB.T_EMPLOYEES.ID);
+ return rec.getInt(sampleDB.EMPLOYEES.ID);
}
+ /**
+ * <PRE>
+ * Inserts an Payments for a particular Employee
+ * </PRE>
+ */
+ private void insertPayments(DBRecord employee)
+ {
+ if (employee.isNull(sampleDB.EMPLOYEES.SALARY))
+ return; // No salary
+ // monthlySalary
+ BigDecimal monthlySalary =
employee.getDecimal(sampleDB.EMPLOYEES.SALARY).divide(new BigDecimal(12), 2,
RoundingMode.HALF_UP);
+ // Insert an Employee
+ LocalDate date = LocalDate.now();
+ date = date.minusDays(date.getDayOfMonth()-1); // first day of this
month
+ // Add Payment for each month
+ SampleDB.TPayments PAY = sampleDB.PAYMENTS;
+ DBRecord rec = new DBRecord(employee.getContext(), PAY);
+ int months = (int)(Math.random()*6)+11;
+ for (LocalDate month=date.minusMonths(months); !month.isAfter(date);
month=month.plusMonths(1))
+ {
+ BigDecimal variation = new BigDecimal((Math.random()*200) - 100.0);
+ variation = variation.setScale(2, RoundingMode.HALF_UP);
+ // insert
+ rec.create(DBRecord.key(employee.getIdentity(), month.getYear(),
month.getMonth()));
+ rec.set(PAY.AMOUNT, monthlySalary.add(variation));
+ rec.update();
+ }
+ }
+
@Override
/**
* returns null as connection pooling is not used
diff --git
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleConfig.java
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleConfig.java
index 3ace407..197dcf0 100644
---
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleConfig.java
+++
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleConfig.java
@@ -28,25 +28,26 @@ import org.w3c.dom.Element;
public class SampleConfig extends XMLConfiguration
{
// Logger
- private static final Logger log =
LoggerFactory.getLogger(SampleConfig.class);
- private String loggingNodeName = "log4j:configuration";
+ private static final Logger log =
LoggerFactory.getLogger(SampleConfig.class);
+
+ private String loggingNodeName = "log4j:configuration";
- private String jndiContext = "";
+ private String jndiContext = "";
- private String databaseProvider = "oracle";
+ private String databaseProvider = "oracle";
- private String jdbcClass =
"oracle.jdbc.driver.OracleDriver";
+ private String jdbcClass = "oracle.jdbc.driver.OracleDriver";
- private String jdbcURL =
"jdbc:oracle:thin:@192.168.0.2:1521:ora10";
+ private String jdbcURL =
"jdbc:oracle:thin:@192.168.0.2:1521:ora10";
- private String dataSource =
"java:comp/env/jdbc/sampleDataSource";
+ private String dataSource = "java:comp/env/jdbc/sampleDataSource";
- private String jdbcUser = "DBSAMPLE";
+ private String jdbcUser = "DBSAMPLE";
- private String jdbcPwd = "DBSAMPLE";
-
- private String schemaName = "DBSAMPLE";
+ private String jdbcPwd = "DBSAMPLE";
+ private String dbmsHandlerClass = "";
+
/**
* Initialize the configuration
*
@@ -106,9 +107,9 @@ public class SampleConfig extends XMLConfiguration
return jdbcURL;
}
- public String getSchemaName()
+ public String getDbmsHandlerClass()
{
- return schemaName;
+ return dbmsHandlerClass;
}
// ------- Setters -------
@@ -133,9 +134,9 @@ public class SampleConfig extends XMLConfiguration
this.jdbcUser = jdbcUser;
}
- public void setSchemaName(String schemaName)
+ public void setDbmsHandlerClass(String dbmsHandlerClass)
{
- this.schemaName = schemaName;
+ this.dbmsHandlerClass = dbmsHandlerClass;
}
/**
diff --git
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/objects/EmployeeSearchFilter.java
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/objects/EmployeeSearchFilter.java
index 3fdad76..422a70a 100644
---
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/objects/EmployeeSearchFilter.java
+++
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/objects/EmployeeSearchFilter.java
@@ -43,6 +43,15 @@ public class EmployeeSearchFilter // *Deprecated* implements
Serializable
gender = "";
}
+ /**
+ * Additional getter for addSearchConstraint(queryCmd, EMP.ID, filter);
+ * @return the employeeId
+ */
+ public String getId()
+ {
+ return employeeId;
+ }
+
public String getEmployeeId()
{
return employeeId;
diff --git
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeDetailPage.java
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeDetailPage.java
index 1c4af78..978b457 100644
---
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeDetailPage.java
+++
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeDetailPage.java
@@ -18,12 +18,18 @@
*/
package org.apache.empire.jsf2.websample.web.pages;
+import java.util.List;
+
import javax.faces.event.ActionEvent;
import org.apache.empire.commons.ClassUtils;
+import org.apache.empire.data.list.DataListEntry;
+import org.apache.empire.db.DBCommand;
import org.apache.empire.jsf2.pageelements.RecordPageElement;
import org.apache.empire.jsf2.pages.PageOutcome;
+import org.apache.empire.jsf2.websample.db.SampleDB;
import org.apache.empire.jsf2.websample.db.records.EmployeeRecord;
+import org.apache.empire.jsf2.websample.web.SampleContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -39,6 +45,8 @@ public class EmployeeDetailPage extends SamplePage
private int activeTab = 0;
+ private List<DataListEntry> payments;
+
public EmployeeDetailPage()
{
log.trace("EmployeeDetailPage created");
@@ -68,6 +76,11 @@ public class EmployeeDetailPage extends SamplePage
return employee.getRecord();
}
+ public List<DataListEntry> getPayments()
+ {
+ return payments;
+ }
+
public int getActiveTab()
{
return activeTab;
@@ -84,6 +97,8 @@ public class EmployeeDetailPage extends SamplePage
if (!employee.getRecord().isValid())
{
employee.reloadRecord();
+ // Load payment data
+ loadPaymentData();
}
}
@@ -92,11 +107,14 @@ public class EmployeeDetailPage extends SamplePage
log.info("EmployeeDetailPage Loading entryId {}.", this.idParam);
// load the record
this.employee.loadRecord(this.idParam);
+ // Load payment data
+ loadPaymentData();
}
public void doCreate()
{
- getEmployeeRecord().create();
+ // use create(null) to defer primaryKey generation
+ getEmployeeRecord().create(null);
doRefresh();
}
@@ -143,4 +161,19 @@ public class EmployeeDetailPage extends SamplePage
log.debug("onTabChanged " + newPage);
}
+ private void loadPaymentData()
+ {
+ SampleContext context = getSampleContext();
+ SampleDB db = this.getDatabase();
+ SampleDB.TPayments PAY = db.PAYMENTS;
+
+ DBCommand cmd = context.createCommand();
+ cmd.select(PAY.YEAR, PAY.MONTH, PAY.AMOUNT);
+ cmd.where(PAY.EMPLOYEE_ID.is(employee.getRecord().getIdentity()));
+ cmd.orderBy(PAY.YEAR.desc(), PAY.MONTH.desc());
+
+ this.payments = context.getUtils().queryDataList(cmd);
+ log.info("{} payments have been loaded", this.payments.size());
+ }
+
}
diff --git
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeListPage.java
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeListPage.java
index fa14c58..5d04b78 100644
---
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeListPage.java
+++
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeListPage.java
@@ -52,7 +52,7 @@ public class EmployeeListPage extends SamplePage
{
// *Deprecated* private static final long serialVersionUID = 1L;
- private int employeeId;
+ private int id; // employeeId;
private String name;
private String gender;
private Date dateOfBirth;
@@ -80,14 +80,14 @@ public class EmployeeListPage extends SamplePage
this.idParam = idParam;
}
- 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 getName()
@@ -143,7 +143,7 @@ public class EmployeeListPage extends SamplePage
public EmployeeListPage()
{
EmployeeListPage.log.trace("EmployeeListPage created");
- TEmployees EMP = getDatabase().T_EMPLOYEES;
+ TEmployees EMP = getDatabase().EMPLOYEES;
// create the Employees List page element
employees = new BeanListPageElement<EmployeeListEntry>(this,
EmployeeListEntry.class, EMP.ID);
@@ -176,8 +176,8 @@ public class EmployeeListPage extends SamplePage
public void doSearch()
{
- TDepartments DEP = getDatabase().T_DEPARTMENTS;
- TEmployees EMP = getDatabase().T_EMPLOYEES;
+ TDepartments DEP = getDatabase().DEPARTMENTS;
+ TEmployees EMP = getDatabase().EMPLOYEES;
DBColumnExpr FULL_NAME = EMP.LAST_NAME.append(",
").append(EMP.FIRST_NAME).as("NAME");
DBColumnExpr DEPARTMENT = DEP.NAME.as("DEPARTMENT");
@@ -200,7 +200,7 @@ public class EmployeeListPage extends SamplePage
public Options getDepartmentOptions()
{
- TDepartments DEP = getDatabase().T_DEPARTMENTS;
+ TDepartments DEP = getDatabase().DEPARTMENTS;
DBCommand queryCmd = createQueryCommand();
queryCmd.select(DEP.ID, DEP.NAME);
@@ -211,7 +211,7 @@ public class EmployeeListPage extends SamplePage
protected void addAllConstraints(DBCommand queryCmd)
{
- TEmployees EMP = getDatabase().T_EMPLOYEES;
+ TEmployees EMP = getDatabase().EMPLOYEES;
EmployeeSearchFilter filter = getSearchFilter();
addSearchConstraint(queryCmd, EMP.ID, filter);
diff --git
a/empire-db-examples/empire-db-example-jsf2/src/main/resources/lang/messages_de.properties
b/empire-db-examples/empire-db-example-jsf2/src/main/resources/lang/messages_de.properties
index fb93c93..756b3b1 100644
---
a/empire-db-examples/empire-db-example-jsf2/src/main/resources/lang/messages_de.properties
+++
b/empire-db-examples/empire-db-example-jsf2/src/main/resources/lang/messages_de.properties
@@ -16,7 +16,7 @@
# under the License.
#fields
-field.title.employees.employeeId=Mitarbeiter Nr.
+field.title.employees.id=Mitarbeiter Nr.
field.title.employees.salutation=Anrede
field.title.employees.firstName=Vorname
field.title.employees.lastName=Nachname
@@ -25,11 +25,18 @@ field.title.employees.departmentId=Abteilung
field.title.employees.gender=Geschlecht
field.title.employees.phoneNumber=Telefonnummer
field.title.employees.email=E-Mail
+field.title.employees.salary=Jahresgehalt
field.title.employees.retired=Ausgeschieden
field.title.employees.updateTimestamp=Zuletzt ge�ndert am
+
+field.title.departments.id=Abteilungsnr
field.title.departments.name=Abteilungsname
field.title.departments.head=Abteilugnsleiter
+field.title.payments.year=Jahr
+field.title.payments.month=Monat
+field.title.payments.amount=Betrag
+
#options
option.employee.gender.male=M�nnlich
option.employee.gender.female=Weiblich
@@ -84,6 +91,7 @@ employeeDetail_back = Zur
employeeDetail_delete = L�schen
employeeDetail_test = Test
employeeDetail_testMessage = Serialization erfolgreich durchgef�hrt
+employeeDetail_payments = Zahlungen
## Old stuff
diff --git
a/empire-db-examples/empire-db-example-jsf2/src/main/resources/lang/messages_en.properties
b/empire-db-examples/empire-db-example-jsf2/src/main/resources/lang/messages_en.properties
index b8a4107..d87d739 100644
---
a/empire-db-examples/empire-db-example-jsf2/src/main/resources/lang/messages_en.properties
+++
b/empire-db-examples/empire-db-example-jsf2/src/main/resources/lang/messages_en.properties
@@ -16,7 +16,7 @@
# under the License.
#fields
-field.title.employees.employeeId=Employee ID
+field.title.employees.id=Employee ID
field.title.employees.salutation=Salutation
field.title.employees.firstName=Firstname
field.title.employees.lastName=Lastname
@@ -25,11 +25,18 @@ field.title.employees.departmentId=Department
field.title.employees.gender=Gender
field.title.employees.phoneNumber=Phone
field.title.employees.email=E-Mail
+field.title.employees.salary=Salary (Year)
field.title.employees.retired=Retired
field.title.employees.updateTimestamp=Last change
+
+field.title.departments.id=Department ID
field.title.departments.name=Department
field.title.departments.head=Head of Dept.
+field.title.payments.year=Year
+field.title.payments.month=Month
+field.title.payments.amount=Amount
+
#options
option.employee.gender.male=Male
option.employee.gender.female=Female
@@ -83,6 +90,7 @@ employeeDetail_back = Back
employeeDetail_delete = Delete
employeeDetail_test = Test
employeeDetail_testMessage = Serialization successful
+employeeDetail_payments = Payments
# Old stuff
diff --git
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/config.xml
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/config.xml
index 195898d..0170ab3 100644
---
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/config.xml
+++
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/config.xml
@@ -12,8 +12,7 @@
<config>
<properties>
- <!-- provider name must match the property-section containing
the connection
- data -->
+ <!-- provider name must match the property-section containing
the connection data -->
<databaseProvider>hsqldb</databaseProvider>
</properties>
@@ -24,7 +23,11 @@
<jdbcURL>jdbc:hsqldb:file:hsqldb/sample;shutdown=true</jdbcURL>
<jdbcUser>sa</jdbcUser>
<jdbcPwd></jdbcPwd>
- <schemaName>DBSAMPLE</schemaName>
+ <!-- Empire-db driver configuration -->
+
<dbmsHandlerClass>org.apache.empire.dbms.hsql.DBMSHandlerHSql</dbmsHandlerClass>
+ <dbmsHandlerProperites>
+ <!-- no properties -->
+ </dbmsHandlerProperites>
</properties-hsqldb>
<properties-mysql>
@@ -33,28 +36,84 @@
<jdbcClass>com.mysql.jdbc.Driver</jdbcClass>
<jdbcURL>jdbc:mysql://localhost</jdbcURL>
<jdbcUser>root</jdbcUser>
- <jdbcPwd>empire-db</jdbcPwd>
- <schemaName>DBSAMPLE</schemaName>
+ <jdbcPwd>esteam</jdbcPwd>
+ <!-- Empire-db driver configuration -->
+
<dbmsHandlerClass>org.apache.empire.dbms.mysql.DBMSHandlerMySQL</dbmsHandlerClass>
+ <dbmsHandlerProperites>
+ <databaseName>DBSAMPLE</databaseName>
+ </dbmsHandlerProperites>
</properties-mysql>
+
+ <properties-postgresql>
+ <!-- JDBC properties for a PostreSQL Database connection -->
+ <!-- Required jar file: postgresql-8.3-603.jdbc4.jar -->
+ <jdbcClass>org.postgresql.Driver</jdbcClass>
+ <jdbcURL>jdbc:postgresql://localhost</jdbcURL>
+ <jdbcUser>postgres</jdbcUser>
+ <jdbcPwd>postgres</jdbcPwd>
+ <!-- Empire-db driver configuration -->
+
<dbmsHandlerClass>org.apache.empire.dbms.postgresql.DBMSHandlerPostgreSQL</dbmsHandlerClass>
+ <dbmsHandlerProperites>
+ <databaseName>DBSAMPLE</databaseName>
+ </dbmsHandlerProperites>
+ </properties-postgresql>
+
+ <properties-h2>
+ <!-- JDBC properties for a H2 Database connection -->
+ <!-- Required jar file: h2-1.1.107.jar -->
+ <jdbcClass>org.h2.Driver</jdbcClass>
+ <jdbcURL>jdbc:h2:h2/DBSAMPLE</jdbcURL>
+ <jdbcUser>sa</jdbcUser>
+ <jdbcPwd></jdbcPwd>
+ <!-- Empire-db driver configuration -->
+
<dbmsHandlerClass>org.apache.empire.dbms.h2.DBMSHandlerH2</dbmsHandlerClass>
+ <dbmsHandlerProperites>
+ <databaseName>DBSAMPLE</databaseName>
+ </dbmsHandlerProperites>
+ </properties-h2>
+
+ <properties-derby>
+ <!-- JDBC properties for a Derby Database connection -->
+ <!-- Required jar file: derby-10.4.2.0.jar -->
+ <jdbcClass>org.apache.derby.jdbc.EmbeddedDriver</jdbcClass>
+ <jdbcURL>jdbc:derby:derby/DBSAMPLE;create=true</jdbcURL>
+ <jdbcUser></jdbcUser>
+ <jdbcPwd></jdbcPwd>
+ <!-- Empire-db driver configuration -->
+
<dbmsHandlerClass>org.apache.empire.dbms.derby.DBMSHandlerDerby</dbmsHandlerClass>
+ <dbmsHandlerProperites>
+ <databaseName>DBSAMPLE</databaseName>
+ </dbmsHandlerProperites>
+ </properties-derby>
<properties-oracle>
<!-- JDBC properties for an Oracle Database connection -->
<!-- Required jar file: ojdbc14.jar -->
<jdbcClass>oracle.jdbc.driver.OracleDriver</jdbcClass>
- <jdbcURL>jdbc:oracle:thin:@esteams2:1521:ora10</jdbcURL>
+ <jdbcURL>jdbc:oracle:thin:@esteams12:1521:ora12</jdbcURL>
<jdbcUser>DBSAMPLE</jdbcUser>
<jdbcPwd>DBSAMPLE</jdbcPwd>
- <schemaName>DBSAMPLE</schemaName>
+ <!-- Empire-db driver configuration -->
+
<dbmsHandlerClass>org.apache.empire.dbms.oracle.DBMSHandlerOracle</dbmsHandlerClass>
+ <dbmsHandlerProperites>
+ <!-- no properties -->
+ </dbmsHandlerProperites>
</properties-oracle>
<properties-sqlserver>
<!-- JDBC properties for a Microsoft SQL-Server Database
connection -->
- <!-- Required jar file: sqljdbc.jar -->
<jdbcClass>com.microsoft.sqlserver.jdbc.SQLServerDriver</jdbcClass>
- <jdbcURL>jdbc:sqlserver://192.168.0.2:1433</jdbcURL>
- <jdbcUser>sa</jdbcUser>
- <jdbcPwd>empire-db</jdbcPwd>
- <schemaName>DBSAMPLE</schemaName>
+ <jdbcURL>jdbc:sqlserver://esteams12\sql17</jdbcURL>
+ <jdbcUser>jdbcUser</jdbcUser>
+ <jdbcPwd>jdbcPwd</jdbcPwd>
+ <!-- Empire-db driver configuration -->
+
<dbmsHandlerClass>org.apache.empire.dbms.sqlserver.DBMSHandlerMSSQL</dbmsHandlerClass>
+ <dbmsHandlerProperites>
+ <databaseName>DBSAMPLE</databaseName>
+ <useSequenceTable>false</useSequenceTable>
+ <!-- useDateTime2: set to false for databases using
DATETIME for timestamps instead of DATETIME2 -->
+ <useDateTime2>true</useDateTime2>
+ </dbmsHandlerProperites>
</properties-sqlserver>
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
diff --git
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/css/content.css
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/css/content.css
index c42ec33..e7123df 100644
--- a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/css/content.css
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/css/content.css
@@ -166,6 +166,7 @@ table.eTabPanel {
table.eTabPanel tr td.eTabPage {
padding: 8px;
background-color: #F8F8F8;
+ vertical-align: top;
}
table.eTabPanel tr td.eTabPage div.formPanel {
border: 0;
@@ -173,4 +174,7 @@ table.eTabPanel tr td.eTabPage div.formPanel {
div.info-msg {
padding: 12px;
background-color: #FFFFCA;
-}
\ No newline at end of file
+}
+.paymentData {
+ border: 2px gray solid;
+}
diff --git
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/pages/employeeDetailPage.xhtml
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/pages/employeeDetailPage.xhtml
index 8dd3d09..5b85e04 100644
---
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/pages/employeeDetailPage.xhtml
+++
b/empire-db-examples/empire-db-example-jsf2/src/main/webapp/pages/employeeDetailPage.xhtml
@@ -51,13 +51,37 @@
<tr><e:control
column="#{db.EMPLOYEES.GENDER}" /> </tr>
<tr><e:control
column="#{db.EMPLOYEES.PHONE_NUMBER}" /></tr>
<tr><e:control
column="#{db.EMPLOYEES.EMAIL}" /></tr>
+ <tr><e:control
column="#{db.EMPLOYEES.SALARY}" /></tr>
<tr><e:control
column="#{db.EMPLOYEES.RETIRED}" /></tr>
<tr><e:control
column="#{db.EMPLOYEES.UPDATE_TIMESTAMP}" format="date-format:full"
readonly="true" rendered="#{page.idParam != null}" /></tr>
</sample:formPanel>
</e:record>
</e:tabPage>
+
<e:tabPage title="#{msg.employeeDetail_tab_extended}"
id="tabExtended" disabled="#{not page.employeeRecord.exists}">
+ <h3><h:outputText
value="#{msg.employeeDetail_payments}"/></h3>
+ <!-- Payment data -->
+ <h:dataTable id="paymentData"
value="#{page.payments}" var="item" rowClasses="odd,even">
+ <h:column>
+ <f:facet name="header">
+ <e:title
column="#{db.PAYMENTS.YEAR}" />
+ </f:facet>
+ <e:value record="#{item}"
column="#{db.PAYMENTS.YEAR}"/>
+ </h:column>
+ <h:column>
+ <f:facet name="header">
+ <e:title
column="#{db.PAYMENTS.MONTH}" />
+ </f:facet>
+ <e:value record="#{item}"
column="#{db.PAYMENTS.MONTH}"/>
+ </h:column>
+ <h:column>
+ <f:facet name="header">
+ <e:title
column="#{db.PAYMENTS.AMOUNT}" />
+ </f:facet>
+ <e:value record="#{item}"
column="#{db.PAYMENTS.AMOUNT}"/>
+ </h:column>
+ </h:dataTable>
<h:panelGroup layout="block"
styleClass="info-msg">
<h:outputText
value="#{msg.employeeDetail_msg_extended}"/>
</h:panelGroup>
diff --git a/empire-db-examples/empire-db-example-vue/pom.xml
b/empire-db-examples/empire-db-example-vue/pom.xml
index 5015784..c395f31 100644
--- a/empire-db-examples/empire-db-example-vue/pom.xml
+++ b/empire-db-examples/empire-db-example-vue/pom.xml
@@ -42,13 +42,14 @@
<artifactId>hsqldb</artifactId>
</dependency>
- <!-- Tomcat JDBC Connection Pool -->
+ <!-- Tomcat JDBC Connection Pool
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-dbcp</artifactId>
<version>8.0.39</version>
<scope>provided</scope>
</dependency>
+ -->
<!-- Empire-db -->
<dependency>
@@ -60,19 +61,19 @@
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
- <version>2.0</version>
+ <version>2.1.1</version>
</dependency>
<!-- JSON -->
<dependency>
<groupId>javax.json</groupId>
<artifactId>javax.json-api</artifactId>
- <version>1.0</version>
+ <version>1.1.4</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
- <version>1.0.4</version>
+ <version>1.1.4</version>
</dependency>
<!-- Jersey -->
@@ -81,13 +82,56 @@
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.25.1</version>
</dependency>
-
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.25.1</version>
</dependency>
+ <!-- All Databases (scope: runtime) -->
+ <!-- hsqldb -->
+ <dependency>
+ <groupId>org.hsqldb</groupId>
+ <artifactId>hsqldb</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <!-- dh2 -->
+ <dependency>
+ <groupId>com.h2database</groupId>
+ <artifactId>h2</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <!-- derby -->
+ <dependency>
+ <groupId>org.apache.derby</groupId>
+ <artifactId>derby</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <!-- mysql -->
+ <dependency>
+ <groupId>mysql</groupId>
+ <artifactId>mysql-connector-java</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <!-- postgresql -->
+ <dependency>
+ <groupId>org.postgresql</groupId>
+ <artifactId>postgresql</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <!-- msssql -->
+ <dependency>
+ <groupId>com.microsoft.sqlserver</groupId>
+ <artifactId>mssql-jdbc</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ <!-- oracle -->
+ <dependency>
+ <groupId>com.oracle.database.jdbc</groupId>
+ <artifactId>ojdbc8</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+
<!-- common io -->
<dependency>
<groupId>commons-io</groupId>
@@ -100,9 +144,6 @@
<artifactId>slf4j-log4j12</artifactId>
</dependency>
- <!-- Test <dependency> <groupId>junit</groupId>
<artifactId>junit</artifactId>
- <version>4.12</version> </dependency> -->
-
</dependencies>
<build>
diff --git a/empire-db-examples/empire-db-example-vue/readme.txt
b/empire-db-examples/empire-db-example-vue/readme.txt
new file mode 100644
index 0000000..c5fc675
--- /dev/null
+++ b/empire-db-examples/empire-db-example-vue/readme.txt
@@ -0,0 +1,30 @@
+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.
+
+In order to run the vue example please do the following:
+
+1. Start the REST-Service via "Debug on Server" using Tomcat
+
+2. Go to the directory "src/main/vue" (or open in WebStorm)
+
+3. Rename file "_eslintrc.js.bak" to ".eslintrc.js" (must start with .)
+
+4. Run the command: npm install
+
+5. Run the command: npm run dev
+
+6. Open Url: http://localhost:8088/
diff --git
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleConfig.java
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleConfig.java
similarity index 81%
copy from
empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleConfig.java
copy to
empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleConfig.java
index 3ace407..fc4566e 100644
---
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleConfig.java
+++
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleConfig.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.empire.jsf2.websample.web;
+package org.apache.empire.rest.app;
import org.apache.empire.xml.XMLConfiguration;
import org.apache.empire.xml.XMLUtil;
@@ -28,24 +28,25 @@ import org.w3c.dom.Element;
public class SampleConfig extends XMLConfiguration
{
// Logger
- private static final Logger log =
LoggerFactory.getLogger(SampleConfig.class);
- private String loggingNodeName = "log4j:configuration";
+ private static final Logger log =
LoggerFactory.getLogger(SampleConfig.class);
+
+ private String loggingNodeName = "log4j:configuration";
- private String jndiContext = "";
+ private String jndiContext = "";
- private String databaseProvider = "oracle";
+ private String databaseProvider = "oracle";
- private String jdbcClass =
"oracle.jdbc.driver.OracleDriver";
+ private String jdbcClass = "oracle.jdbc.driver.OracleDriver";
- private String jdbcURL =
"jdbc:oracle:thin:@192.168.0.2:1521:ora10";
+ private String jdbcURL =
"jdbc:oracle:thin:@192.168.0.2:1521:ora10";
- private String dataSource =
"java:comp/env/jdbc/sampleDataSource";
+ private String dataSource = "java:comp/env/jdbc/sampleDataSource";
- private String jdbcUser = "DBSAMPLE";
+ private String jdbcUser = "DBSAMPLE";
- private String jdbcPwd = "DBSAMPLE";
+ private String jdbcPwd = "DBSAMPLE";
- private String schemaName = "DBSAMPLE";
+ private String dbmsHandlerClass = "";
/**
* Initialize the configuration
@@ -106,9 +107,9 @@ public class SampleConfig extends XMLConfiguration
return jdbcURL;
}
- public String getSchemaName()
+ public String getDbmsHandlerClass()
{
- return schemaName;
+ return dbmsHandlerClass;
}
// ------- Setters -------
@@ -133,9 +134,9 @@ public class SampleConfig extends XMLConfiguration
this.jdbcUser = jdbcUser;
}
- public void setSchemaName(String schemaName)
+ public void setDbmsHandlerClass(String dbmsHandlerClass)
{
- this.schemaName = schemaName;
+ this.dbmsHandlerClass = dbmsHandlerClass;
}
/**
diff --git
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleServiceApp.java
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleServiceApp.java
index e77ac51..b4e078c 100644
---
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleServiceApp.java
+++
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleServiceApp.java
@@ -21,8 +21,10 @@ import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
+import java.util.LinkedList;
import java.util.Locale;
import java.util.Map;
+import java.util.Queue;
import java.util.ResourceBundle;
import javax.servlet.ServletContext;
@@ -33,16 +35,10 @@ import org.apache.empire.commons.StringUtils;
import org.apache.empire.db.DBCommand;
import org.apache.empire.db.DBContext;
import org.apache.empire.db.DBRecord;
-import org.apache.empire.db.DBSQLScript;
import org.apache.empire.db.context.DBContextStatic;
-import org.apache.empire.db.exceptions.QueryFailedException;
import org.apache.empire.dbms.DBMSHandler;
-import org.apache.empire.dbms.hsql.DBMSHandlerHSql;
import org.apache.empire.rest.service.Service;
import org.apache.empire.vue.sample.db.SampleDB;
-import org.apache.log4j.ConsoleAppender;
-import org.apache.log4j.Level;
-import org.apache.log4j.PatternLayout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -75,7 +71,7 @@ public class SampleServiceApp
System.out.println("ServletContextListener:contextDestroyed");
}
}
-
+
private static SampleServiceApp app;
public static SampleServiceApp instance()
@@ -83,12 +79,14 @@ public class SampleServiceApp
return app;
}
+ private SampleConfig config = new SampleConfig();
+
private Map<Locale, ResourceTextResolver> textResolverMap = new
HashMap<Locale, ResourceTextResolver>();
protected SampleServiceApp(ServletContext ctx)
{
// Logging
- initLogging();
+ config.init(ctx.getRealPath("WEB-INF/config.xml"));
String messageBundle ="lang.messages";
textResolverMap.put(Locale.ENGLISH, new
ResourceTextResolver(ResourceBundle.getBundle(messageBundle, Locale.ENGLISH)));
@@ -98,7 +96,7 @@ public class SampleServiceApp
Connection conn = getJDBCConnection(ctx);
try {
// DB
- DBMSHandler dbms = new DBMSHandlerHSql();
+ DBMSHandler dbms = getDBMSHandler(config.getDatabaseProvider(),
conn);
DBContext context = new DBContextStatic(dbms, conn);
SampleDB db = initDatabase(ctx, context);
// Add to context
@@ -115,34 +113,70 @@ public class SampleServiceApp
return (tr!=null ? tr : textResolverMap.get(Locale.ENGLISH));
}
- public Connection getJDBCConnection(ServletContext appContext) {
- // Establish a new database connection
- Connection conn = null;
+ /**
+ * Creates an Empire-db DatabaseDriver for the given provider and applies
dbms specific configuration
+ */
+ private DBMSHandler getDBMSHandler(String provider, Connection conn)
+ {
+ try
+ { // Get Driver Class Name
+ String dbmsHandlerClass = config.getDbmsHandlerClass();
+ if (StringUtils.isEmpty(dbmsHandlerClass))
+ throw new RuntimeException("Configuration error: Element
'dbmsHandlerClass' not found in node 'properties-"+provider+"'");
- String jdbcURL = "jdbc:hsqldb:file:hsqldb/sample;shutdown=true";
- String jdbcUser = "sa";
- String jdbcPwd = "";
+ // Create dbms
+ DBMSHandler dbms = (DBMSHandler)
Class.forName(dbmsHandlerClass).newInstance();
- if (jdbcURL.indexOf("file:") > 0) {
- jdbcURL = StringUtils.replace(jdbcURL, "file:", "file:" +
appContext.getRealPath("/"));
+ // Configure dbms
+ config.readProperties(dbms, "properties-"+provider,
"dbmsHandlerProperites");
+
+ // done
+ return dbms;
+
+ } catch (Exception e)
+ { // catch any checked exception and forward it
+ e.printStackTrace();
+ throw new RuntimeException(e);
}
+ }
+
+ /*
+ * Our own simple Connection pool
+ */
+ private final Queue<Connection> connPool = new LinkedList<Connection>();
+
+ /*
+ * getJDBCConnection
+ */
+ public Connection getJDBCConnection(ServletContext appContext)
+ {
+ Connection conn = connPool.poll();
+ if (conn!=null)
+ return conn;
+
+ // Establish a new database connection
+ String jdbcURL = config.getJdbcURL();
+ if (jdbcURL.indexOf("file:") > 0)
+ jdbcURL = StringUtils.replace(jdbcURL, "file:", "file:" +
appContext.getRealPath("/"));
// Connect
- log.info("Connecting to Database'" + jdbcURL + "' / User=" + jdbcUser);
- try { // Connect to the databse
- Class.forName("org.hsqldb.jdbcDriver").newInstance();
- conn = DriverManager.getConnection(jdbcURL, jdbcUser, jdbcPwd);
+ log.info("Connecting to Database'" + jdbcURL + "' / User=" +
config.getJdbcUser());
+ try
+ { // Connect to the database
+ Class.forName(config.getJdbcClass()).newInstance();
+ conn = DriverManager.getConnection(jdbcURL, config.getJdbcUser(),
config.getJdbcPwd());
log.info("Connected successfully");
// set the AutoCommit to false this session. You must commit
// explicitly now
conn.setAutoCommit(false);
log.info("AutoCommit is " + conn.getAutoCommit());
-
- } catch (Exception e) {
- log.error("Failed to connect directly to '" + jdbcURL + "' /
User=" + jdbcUser);
+ return conn;
+ }
+ catch (Exception e)
+ {
+ log.error("Failed to connect directly to '" + config.getJdbcURL()
+ "' / User=" + config.getJdbcUser());
log.error(e.toString());
throw new RuntimeException(e);
}
- return conn;
}
public void releaseConnection(Connection conn, boolean commit) {
@@ -165,7 +199,8 @@ public class SampleServiceApp
log.debug("REQUEST rolled back.");
}
// close connection / return to pool
- conn.close();
+ // conn.close();
+ connPool.add(conn);
}
catch (SQLException e)
{
@@ -183,38 +218,17 @@ public class SampleServiceApp
DBMSHandler dbms = context.getDbms();
log.info("Opening database '{}' using handler '{}'",
db.getClass().getSimpleName(), dbms.getClass().getSimpleName());
db.open(context);
- if (!databaseExists(db, context)) {
- // STEP 4: Create Database
- log.info("Creating database {}", db.getClass().getSimpleName());
- createSampleDatabase(db, context);
- }
- return db;
- }
-
- private static boolean databaseExists(SampleDB db, DBContext context) {
- // Check wether DB exists
+ // check if database was just created
DBCommand cmd = context.createCommand();
- cmd.select(db.T_DEPARTMENTS.count());
- try {
- return (context.getUtils().querySingleInt(cmd, -1) >= 0);
- } catch (QueryFailedException e) {
- return false;
+ cmd.select(db.EMPLOYEES.count());
+ if (context.getUtils().querySingleInt(cmd)==0)
+ { // Populate Database
+ populateDatabase(db, context);
}
+ return db;
}
- private static void createSampleDatabase(SampleDB db, DBContext context) {
- // create DLL for Database Definition
- DBSQLScript script = new DBSQLScript(context);
- db.getCreateDDLScript(script);
- // Show DLL Statements
- System.out.println(script.toString());
- // Execute Script
- script.executeAll(false);
- context.commit();
- // Open again
- if (!db.isOpen()) {
- db.open(context);
- }
+ private static void populateDatabase(SampleDB db, DBContext context) {
// Insert Sample Departments
insertDepartmentSampleRecord(db, context, "Procurement", "ITTK");
int idDevDep = insertDepartmentSampleRecord(db, context,
"Development", "ITTK");
@@ -229,10 +243,10 @@ public class SampleServiceApp
private static int insertDepartmentSampleRecord(SampleDB db, DBContext
context, String department_name, String businessUnit) {
// Insert a Department
- DBRecord rec = new DBRecord(context, db.T_DEPARTMENTS);
+ DBRecord rec = new DBRecord(context, db.DEPARTMENTS);
rec.create();
- rec.set(db.T_DEPARTMENTS.NAME, department_name);
- rec.set(db.T_DEPARTMENTS.BUSINESS_UNIT, businessUnit);
+ rec.set(db.DEPARTMENTS.NAME, department_name);
+ rec.set(db.DEPARTMENTS.BUSINESS_UNIT, businessUnit);
try {
rec.update();
} catch (Exception e) {
@@ -240,7 +254,7 @@ public class SampleServiceApp
return 0;
}
// Return Department ID
- return rec.getInt(db.T_DEPARTMENTS.ID);
+ return rec.getInt(db.DEPARTMENTS.ID);
}
/*
@@ -248,13 +262,13 @@ public class SampleServiceApp
*/
private static int insertEmployeeSampleRecord(SampleDB db, DBContext
context, String salutation, String firstName, String lastName, String gender,
int depID) {
// Insert an Employee
- DBRecord rec = new DBRecord(context, db.T_EMPLOYEES);
+ DBRecord rec = new DBRecord(context, db.EMPLOYEES);
rec.create();
- rec.set(db.T_EMPLOYEES.SALUTATION, salutation);
- rec.set(db.T_EMPLOYEES.FIRST_NAME, firstName);
- rec.set(db.T_EMPLOYEES.LAST_NAME, lastName);
- rec.set(db.T_EMPLOYEES.GENDER, gender);
- rec.set(db.T_EMPLOYEES.DEPARTMENT_ID, depID);
+ rec.set(db.EMPLOYEES.SALUTATION, salutation);
+ rec.set(db.EMPLOYEES.FIRST_NAME, firstName);
+ rec.set(db.EMPLOYEES.LAST_NAME, lastName);
+ rec.set(db.EMPLOYEES.GENDER, gender);
+ rec.set(db.EMPLOYEES.DEPARTMENT_ID, depID);
try {
rec.update();
} catch (Exception e) {
@@ -262,9 +276,10 @@ public class SampleServiceApp
return 0;
}
// Return Employee ID
- return rec.getInt(db.T_EMPLOYEES.ID);
+ return rec.getInt(db.EMPLOYEES.ID);
}
+ /*
private void initLogging() {
// Init Logging
@@ -289,7 +304,7 @@ public class SampleServiceApp
// Vue.js Sample
org.apache.log4j.Logger miLog =
org.apache.log4j.Logger.getLogger("org.apache.empire.rest");
miLog.setLevel(loglevel);
-
}
+ */
}
diff --git
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/EmployeeService.java
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/EmployeeService.java
index cdb6505..71719a2 100644
---
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/EmployeeService.java
+++
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/EmployeeService.java
@@ -67,14 +67,14 @@ public class EmployeeService extends Service {
// Query Department options
SampleDB db = getDatabase();
DBCommand cmd = context.createCommand();
- cmd.select(db.T_DEPARTMENTS.ID, db.T_DEPARTMENTS.NAME);
- cmd.join (db.T_DEPARTMENTS.ID, db.T_EMPLOYEES.DEPARTMENT_ID);
+ cmd.select(db.DEPARTMENTS.ID, db.DEPARTMENTS.NAME);
+ cmd.join (db.DEPARTMENTS.ID, db.EMPLOYEES.DEPARTMENT_ID);
cmd.groupBy(cmd.getSelectExpressions());
- cmd.orderBy(db.T_DEPARTMENTS.NAME);
+ cmd.orderBy(db.DEPARTMENTS.NAME);
Options departmentOptions = context.getUtils().queryOptionList(cmd);
// Create Metadata
- TEmployees TE = db.T_EMPLOYEES;
+ TEmployees TE = db.EMPLOYEES;
JsoColumnMeta[] meta = new JsoColumnMeta[] {
new JsoColumnMeta(TE.ID, textResolver),
new JsoColumnMeta(TE.FIRST_NAME, textResolver),
@@ -95,8 +95,8 @@ public class EmployeeService extends Service {
SampleDB db = getDatabase();
- TEmployees TE = db.T_EMPLOYEES;
- TDepartments TD = db.T_DEPARTMENTS;
+ TEmployees TE = db.EMPLOYEES;
+ TDepartments TD = db.DEPARTMENTS;
DBColumnExpr FULL_NAME = TE.LAST_NAME.append(",
").append(TE.FIRST_NAME).as("NAME");
DBColumnExpr DEPARTMENT = TD.NAME.as("DEPARTMENT");
FULL_NAME.setTitle("!field.title.employees.fullname");
@@ -105,7 +105,8 @@ public class EmployeeService extends Service {
RecordContext context = getRecordContext();
DBCommand cmd = context.createCommand();
- cmd.select(TE.ID, FULL_NAME, DEPARTMENT, TE.GENDER, TE.DATE_OF_BIRTH,
TE.RETIRED);
+ cmd.select(TE.ID.as("EMPLOYEE_ID"));
+ cmd.select(FULL_NAME, DEPARTMENT, TE.GENDER, TE.DATE_OF_BIRTH,
TE.RETIRED);
cmd.join (TE.DEPARTMENT_ID, TD.ID, DBJoinType.LEFT);
// apply all filters
@@ -169,7 +170,7 @@ public class EmployeeService extends Service {
try {
// return a record
EmployeeRecord rec = new EmployeeRecord(ctx);
- rec.create();
+ rec.create(null);
JsoRecordData emp = new JsoRecordData(rec);
return Response.ok(new JsoResultWithMeta(emp,
rec.getMeta())).build();
@@ -212,7 +213,7 @@ public class EmployeeService extends Service {
try {
// return a record
SampleDB db = getDatabase();
- db.T_EMPLOYEES.deleteRecord(employeeId, ctx);
+ db.EMPLOYEES.deleteRecord(employeeId, ctx);
return Response.ok().build();
} catch(EmpireException e) {
diff --git
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/SampleDB.java
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/SampleDB.java
index fabf12c..c22c195 100644
---
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/SampleDB.java
+++
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/SampleDB.java
@@ -18,79 +18,100 @@
*/
package org.apache.empire.vue.sample.db;
-import org.apache.empire.commons.Options;
+import java.sql.SQLException;
+
import org.apache.empire.data.DataType;
import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBContext;
import org.apache.empire.db.DBDatabase;
+import org.apache.empire.db.DBSQLScript;
import org.apache.empire.db.DBTableColumn;
+import org.apache.empire.db.validation.DBModelChecker;
+import org.apache.empire.db.validation.DBModelErrorLogger;
+import org.apache.empire.dbms.postgresql.DBMSHandlerPostgreSQL;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+/**
+ * <PRE>
+ * This file contains the definition of the data model in Java.
+ * The SampleDB data model consists of three tables and two foreign key
relations.
+ * The tables are defined as nested classes here, but you may put them in
separate files if you want to.
+ *
+ * The class also provided methods to create the database (if it doesn't
exist)
+ * and to check the datamodel i.e. to compare this definition to the database
in the DBMS
+ *
+ * PLEASE NOTE THE NAMING CONVENTION:
+ * Since all tables, views and columns are declared as "final" constants we
have all put them in upper case.
+ *
+ * You may declare other database tables or views in the same way.
+ * </PRE>
+ */
public class SampleDB extends DBDatabase
{
- // *Deprecated* private static final long serialVersionUID = 1L;
-
- // Declare all Tables
- public final TDepartments T_DEPARTMENTS = new TDepartments(this);
- public final TEmployees T_EMPLOYEES = new TEmployees(this);
-
+ // Logger
+ private static final Logger log = LoggerFactory.getLogger(SampleDB.class);
+
/**
- * Constructor SampleDB
+ * Gender enum
*/
- public SampleDB()
+ public enum Gender
{
- // Define Foreign-Key Relations
- addRelation(T_EMPLOYEES.DEPARTMENT_ID.referenceOn(T_DEPARTMENTS.ID));
- }
-
- // Needed for the DBELResolver
- @Override
- protected void register(String id)
- {
- super.register("db");
+ M("Male"),
+ F("Female"),
+ U("Unknown");
+
+ private final String title;
+ private Gender(String title)
+ {
+ this.title = title;
+ }
+ @Override
+ public String toString()
+ {
+ return title;
+ }
}
/**
- * This class represents the definition of the Departments table.
+ * This class represents the Departments table.
*/
public static class TDepartments extends SampleTable
{
- // *Deprecated* private static final long serialVersionUID = 1L;
-
public final DBTableColumn ID;
public final DBTableColumn NAME;
public final DBTableColumn HEAD;
public final DBTableColumn BUSINESS_UNIT;
public final DBTableColumn UPDATE_TIMESTAMP;
- public TDepartments(DBDatabase db)
+ public TDepartments(SampleDB db)
{
super("DEPARTMENTS", db);
// ID
- ID = addColumn("ID", DataType.AUTOINC,
0, true, "DEP_ID_SEQUENCE"); // Optional 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");
- UPDATE_TIMESTAMP= addColumn("UPDATE_TIMESTAMP",
DataType.TIMESTAMP, 0, true);
-
- // Primary Key (automatically set due to AUTOINC column)
- // setPrimaryKey(DEPARTMENT_ID);
- // Set other Indexes
- addIndex("DEARTMENT_NAME_IDX", true, new DBColumn[] { NAME });
+ ID = addIdentity ("ID",
"DEP_ID_SEQUENCE"); // Optional 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");
+ UPDATE_TIMESTAMP= addTimestamp("UPDATE_TIMESTAMP");
+
+ // Primary Key (automatically set due to addIdentity()) otherwise
use
+ // setPrimaryKey(...);
+ // Set other Indexes
+ addIndex("DEPARTMENT_NAME_IDX", true, new DBColumn[] { NAME });
+
+ // optional: set entity name for selectQualified() to singular
since table is plural
+ setEntityName("DEPARTMENT");
}
}
-
-
/**
- * This class represents the definition of the Employees table.
+ * This class represents the Employees table.
*/
public static class TEmployees extends SampleTable
{
- // *Deprecated* private static final long serialVersionUID = 1L;
-
public final DBTableColumn ID;
public final DBTableColumn SALUTATION;
-// public final DBTableColumn PICTURE;
public final DBTableColumn FIRST_NAME;
public final DBTableColumn LAST_NAME;
public final DBTableColumn DATE_OF_BIRTH;
@@ -98,53 +119,151 @@ public class SampleDB extends DBDatabase
public final DBTableColumn GENDER;
public final DBTableColumn PHONE_NUMBER;
public final DBTableColumn EMAIL;
+ public final DBTableColumn SALARY;
public final DBTableColumn RETIRED;
public final DBTableColumn UPDATE_TIMESTAMP;
- public TEmployees(DBDatabase db)
+
+ public TEmployees(SampleDB db)
{
super("EMPLOYEES", db);
- // ID
- ID = addColumn("ID", DataType.AUTOINC,
0, true, "EMPLOYEE_ID_SEQUENCE"); // Optional Sequence name for some DBMS
(e.g. Oracle)
- SALUTATION = addColumn("SALUTATION",
DataType.VARCHAR, 5, false);
- FIRST_NAME = addColumn("FIRST_NAME",
DataType.VARCHAR, 40, true);
- LAST_NAME = addColumn("LAST_NAME",
DataType.VARCHAR, 40, true);
- DATE_OF_BIRTH = addColumn("DATE_OF_BIRTH", DataType.DATE,
0, false);
- DEPARTMENT_ID = addColumn("DEPARTMENT_ID",
DataType.INTEGER, 0, true);
- GENDER = addColumn("GENDER",
DataType.VARCHAR, 1, false);
- PHONE_NUMBER = addColumn("PHONE_NUMBER",
DataType.VARCHAR, 40, false);
- EMAIL = addColumn("EMAIL",
DataType.VARCHAR, 80, false);
- RETIRED = addColumn("RETIRED",
DataType.BOOL, 0, true, false);
- // PICTURE = addColumn("PICTURE",
DataType.BLOB, 0, false);
- UPDATE_TIMESTAMP= addColumn("UPDATE_TIMESTAMP",
DataType.TIMESTAMP, 0, true);
-
- // Primary Key (automatically set due to AUTOINC column)
- // setPrimaryKey(EMPLOYEE_ID);
- // Set other Indexes
- addIndex("PERSON_NAME_IDX", true, new DBColumn[] { FIRST_NAME,
LAST_NAME, DATE_OF_BIRTH });
-
- // Create Options for GENDER column
- Options genders = new Options();
- genders.set("M", "!option.employee.gender.male");
- genders.set("F", "!option.employee.gender.female");
- GENDER.setOptions(genders);
- GENDER.setControlType("select");
-
- Options retired = new Options();
- retired.set(false, "!option.employee.active");
- retired.set(true, "!option.employee.retired");
- RETIRED.setOptions(retired);
- RETIRED.setControlType("checkbox");
- // Set special control types
- DEPARTMENT_ID.setControlType("select");
- PHONE_NUMBER .setControlType("phone");
+ // ID
+ ID = addIdentity ("ID",
"EMPLOYEE_ID_SEQUENCE"); // Optional Sequence name for some DBMS (e.g. Oracle)
+ SALUTATION = addColumn ("SALUTATION",
DataType.VARCHAR, 5, false);
+ FIRST_NAME = addColumn ("FIRST_NAME",
DataType.VARCHAR, 40, true);
+ LAST_NAME = addColumn ("LAST_NAME",
DataType.VARCHAR, 40, true);
+ DATE_OF_BIRTH = addColumn ("DATE_OF_BIRTH", DataType.DATE,
0, false);
+ DEPARTMENT_ID = addForeignKey("DEPARTMENT_ID",
db.DEPARTMENTS, true);
+ GENDER = addColumn ("GENDER",
DataType.VARCHAR, 1, true, Gender.class);
+ PHONE_NUMBER = addColumn ("PHONE_NUMBER",
DataType.VARCHAR, 40, false, "0815-");
+ EMAIL = addColumn ("EMAIL",
DataType.VARCHAR, 80, false);
+ SALARY = addColumn ("SALARY",
DataType.DECIMAL, 10.2, false);
+ RETIRED = addColumn ("RETIRED", DataType.BOOL,
0, true, false);
+ UPDATE_TIMESTAMP= addTimestamp ("UPDATE_TIMESTAMP");
- // Set optional formatting attributes
- DATE_OF_BIRTH.setAttribute("format:date", "yyyy-MM-dd");
+ // Primary Key (automatically set due to addIdentity()) otherwise
use
+ // setPrimaryKey(...);
+
+ // Set other Indexes
+ addIndex("EMPLOYEE_NAME_IDX", true, new DBColumn[] { FIRST_NAME,
LAST_NAME, DATE_OF_BIRTH });
+
+ // optional: set entity name for selectQualified() to singular
since table is plural
+ setEntityName("EMPLOYEE");
+ }
+ }
+
+ /**
+ * This class represents the Payments table.
+ */
+ public static class TPayments extends SampleTable
+ {
+ public final DBTableColumn EMPLOYEE_ID;
+ public final DBTableColumn YEAR;
+ public final DBTableColumn MONTH;
+ public final DBTableColumn AMOUNT;
+
+ public TPayments(SampleDB db)
+ {
+ super("PAYMENTS", db);
- // PICTURE.setControlType("blob");
+ // ID
+ EMPLOYEE_ID = addForeignKey("EMPLOYEE_ID", db.EMPLOYEES,
true);
+ YEAR = addColumn("YEAR", DataType.DECIMAL,
4.0, true);
+ MONTH = addColumn("MONTH", DataType.DECIMAL,
2.0, true);
+ AMOUNT = addColumn("AMOUNT", DataType.DECIMAL,
8.2, true);
+
+ // Primary Key
+ setPrimaryKey(EMPLOYEE_ID, YEAR, MONTH);
+ // optional: set entity name for selectQualified() to singular
since table is plural
+ setEntityName("PAYMENT");
}
}
+
+ // Declare all Tables and Views here
+ public final TDepartments DEPARTMENTS = new TDepartments(this);
+ public final TEmployees EMPLOYEES = new TEmployees(this);
+ public final TPayments PAYMENTS = new TPayments(this);
+ /**
+ * Constructor of the SampleDB data model
+ *
+ * Put all foreign key relations here.
+ */
+ public SampleDB()
+ {
+ // Define additional Foreign-Key Relations here
+ // which have not already been defined by addForeignKey()
+ // addRelation( {Source Column}.referenceOn( {Target Column} ));
+ log.info("SampleDB has been created with {} Tables and {} Relations",
getTables().size(), getRelations().size());
+ }
+
+ // Needed for the DBELResolver
+ @Override
+ protected void register(String id)
+ {
+ super.register("db");
+ }
+
+ @Override
+ public void open(DBContext context)
+ {
+ // Enable prepared statements
+ // setPreparedStatementsEnabled(true);
+ // Check exists
+ if (checkExists(context))
+ { // attach to driver
+ super.open(context);
+ // yes, it exists, then check the model
+ checkDataModel(context);
+ }
+ else
+ { // PostgreSQL does not support DDL in transaction
+ if(getDbms() instanceof DBMSHandlerPostgreSQL)
+ setAutoCommit(context, true);
+ // create the database
+ createDatabase(context);
+ // PostgreSQL does not support DDL in transaction
+ if(getDbms() instanceof DBMSHandlerPostgreSQL)
+ setAutoCommit(context, false);
+ // attach to driver
+ super.open(context);
+ }
+ }
+
+ private void createDatabase(DBContext context)
+ {
+ // create DDL for Database Definition
+ DBSQLScript script = new DBSQLScript(context);
+ getCreateDDLScript(script);
+ // Show DDL Statement
+ log.info(script.toString());
+ // Execute Script
+ script.executeAll(false);
+ // Commit
+ context.commit();
+ }
+
+ private void checkDataModel(DBContext context)
+ { try {
+ DBModelChecker modelChecker =
context.getDbms().createModelChecker(this);
+ // Check data model
+ log.info("Checking DataModel for {} using {}",
getClass().getSimpleName(), modelChecker.getClass().getSimpleName());
+ // dbo schema
+ DBModelErrorLogger logger = new DBModelErrorLogger();
+ modelChecker.checkModel(this, context.getConnection(), logger);
+ // show result
+ log.info("Data model check done. Found {} errors and {}
warnings.", logger.getErrorCount(), logger.getWarnCount());
+ } catch(Exception e) {
+ log.error("FATAL error when checking data model. Probably not
properly implemented by DBMSHandler!");
+ }
+ }
+
+ private void setAutoCommit(DBContext context, boolean enable)
+ { try {
+ context.getConnection().setAutoCommit(enable);
+ } catch (SQLException e) {
+ log.error("Unable to set AutoCommit on Connection", e);
+ }
+ }
}
diff --git
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/DepartmentRecord.java
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/DepartmentRecord.java
index c0320ff..d8c0bfb 100644
---
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/DepartmentRecord.java
+++
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/DepartmentRecord.java
@@ -27,7 +27,7 @@ public class DepartmentRecord extends
SampleRecord<TDepartments>
public DepartmentRecord(RecordContext recordContext)
{
- super(recordContext.getDb().T_DEPARTMENTS, recordContext);
+ super(recordContext.getDb().DEPARTMENTS, recordContext);
}
}
diff --git
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/EmployeeRecord.java
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/EmployeeRecord.java
index 9ac5037..3dcc3c1 100644
---
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/EmployeeRecord.java
+++
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/EmployeeRecord.java
@@ -32,7 +32,7 @@ public class EmployeeRecord extends SampleRecord<TEmployees>
public EmployeeRecord(RecordContext recordContext)
{
- super(recordContext.getDb().T_EMPLOYEES, recordContext);
+ super(recordContext.getDb().EMPLOYEES, recordContext);
}
/*
@@ -56,9 +56,9 @@ public class EmployeeRecord extends SampleRecord<TEmployees>
{
SampleDB db = (SampleDB) getDatabase();
DBCommand cmd = context.createCommand();
- cmd.select(db.T_DEPARTMENTS.ID);
- cmd.select(db.T_DEPARTMENTS.NAME);
- cmd.orderBy(db.T_DEPARTMENTS.NAME);
+ cmd.select(db.DEPARTMENTS.ID);
+ cmd.select(db.DEPARTMENTS.NAME);
+ cmd.orderBy(db.DEPARTMENTS.NAME);
return recordContext.getUtils().queryOptionList(cmd);
}
// base class implementation
diff --git
a/empire-db-examples/empire-db-example-vue/src/main/resources/lang/messages_de.properties
b/empire-db-examples/empire-db-example-vue/src/main/resources/lang/messages_de.properties
index 716fd01..9237547 100644
---
a/empire-db-examples/empire-db-example-vue/src/main/resources/lang/messages_de.properties
+++
b/empire-db-examples/empire-db-example-vue/src/main/resources/lang/messages_de.properties
@@ -16,7 +16,7 @@
# under the License.
#fields
-field.title.employees.employeeId=Mitarbeiter Nr.
+field.title.employees.id=Mitarbeiter Nr.
field.title.employees.salutation=Anrede
field.title.employees.firstname=Vorname
field.title.employees.lastname=Nachname
@@ -28,6 +28,8 @@ field.title.employees.phoneNumber=Telefonnummer
field.title.employees.email=E-Mail
field.title.employees.retired=Ausgeschieden
field.title.employees.updateTimestamp=Zuletzt ge�ndert am
+
+field.title.departments.id=Abteilungsnr
field.title.departments.name=Abteilungsname
field.title.departments.head=Abteilugnsleiter
diff --git
a/empire-db-examples/empire-db-example-vue/src/main/resources/lang/messages_en.properties
b/empire-db-examples/empire-db-example-vue/src/main/resources/lang/messages_en.properties
index 9693150..a3adc1d 100644
---
a/empire-db-examples/empire-db-example-vue/src/main/resources/lang/messages_en.properties
+++
b/empire-db-examples/empire-db-example-vue/src/main/resources/lang/messages_en.properties
@@ -16,7 +16,7 @@
# under the License.
#fields
-field.title.employees.employeeId=Employee ID
+field.title.employees.id=Employee ID
field.title.employees.salutation=Salutation
field.title.employees.firstName=Firstname
field.title.employees.lastName=Lastname
@@ -28,6 +28,8 @@ field.title.employees.phoneNumber=Phone
field.title.employees.email=E-Mail
field.title.employees.retired=Retired
field.title.employees.updateTimestamp=Last change
+
+field.title.departments.id=Department ID
field.title.departments.name=Department
field.title.departments.head=Head of Dept.
diff --git
a/empire-db-examples/empire-db-example-vue/src/main/vue/_eslintrc.js.bak
b/empire-db-examples/empire-db-example-vue/src/main/vue/_eslintrc.js.bak
new file mode 100644
index 0000000..4d9a3da
--- /dev/null
+++ b/empire-db-examples/empire-db-example-vue/src/main/vue/_eslintrc.js.bak
@@ -0,0 +1,28 @@
+// http://eslint.org/docs/user-guide/configuring
+
+module.exports = {
+ root: true,
+ parser: 'babel-eslint',
+ parserOptions: {
+ sourceType: 'module'
+ },
+ env: {
+ browser: true,
+ jquery: true
+ },
+ //
https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style
+ extends: 'standard',
+ // required to lint *.vue files
+ plugins: [
+ 'html'
+ ],
+ // add your custom rules here
+ 'rules': {
+ // allow paren-less arrow functions
+ 'arrow-parens': 0,
+ // allow async-await
+ 'generator-star-spacing': 0,
+ // allow debugger during development
+ 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0
+ }
+}
diff --git
a/empire-db-examples/empire-db-example-vue/src/main/vue/src/pages/employeeDetail.vue
b/empire-db-examples/empire-db-example-vue/src/main/vue/src/pages/employeeDetail.vue
index f550c5b..bfca8d0 100644
---
a/empire-db-examples/empire-db-example-vue/src/main/vue/src/pages/employeeDetail.vue
+++
b/empire-db-examples/empire-db-example-vue/src/main/vue/src/pages/employeeDetail.vue
@@ -16,7 +16,7 @@
<template>
<div class="page-content">
- <h1>Employee-Details</h1>
+ <h1>Employee-Details ({{employeeId}})</h1>
<e-record styleClass="formPanel" :record="employeeRecord">
<table class="inputForm" style="width:400px">
diff --git
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/config.xml
b/empire-db-examples/empire-db-example-vue/src/main/webapp/WEB-INF/config.xml
similarity index 53%
copy from
empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/config.xml
copy to
empire-db-examples/empire-db-example-vue/src/main/webapp/WEB-INF/config.xml
index 195898d..0170ab3 100644
---
a/empire-db-examples/empire-db-example-jsf2/src/main/webapp/WEB-INF/config.xml
+++
b/empire-db-examples/empire-db-example-vue/src/main/webapp/WEB-INF/config.xml
@@ -12,8 +12,7 @@
<config>
<properties>
- <!-- provider name must match the property-section containing
the connection
- data -->
+ <!-- provider name must match the property-section containing
the connection data -->
<databaseProvider>hsqldb</databaseProvider>
</properties>
@@ -24,7 +23,11 @@
<jdbcURL>jdbc:hsqldb:file:hsqldb/sample;shutdown=true</jdbcURL>
<jdbcUser>sa</jdbcUser>
<jdbcPwd></jdbcPwd>
- <schemaName>DBSAMPLE</schemaName>
+ <!-- Empire-db driver configuration -->
+
<dbmsHandlerClass>org.apache.empire.dbms.hsql.DBMSHandlerHSql</dbmsHandlerClass>
+ <dbmsHandlerProperites>
+ <!-- no properties -->
+ </dbmsHandlerProperites>
</properties-hsqldb>
<properties-mysql>
@@ -33,28 +36,84 @@
<jdbcClass>com.mysql.jdbc.Driver</jdbcClass>
<jdbcURL>jdbc:mysql://localhost</jdbcURL>
<jdbcUser>root</jdbcUser>
- <jdbcPwd>empire-db</jdbcPwd>
- <schemaName>DBSAMPLE</schemaName>
+ <jdbcPwd>esteam</jdbcPwd>
+ <!-- Empire-db driver configuration -->
+
<dbmsHandlerClass>org.apache.empire.dbms.mysql.DBMSHandlerMySQL</dbmsHandlerClass>
+ <dbmsHandlerProperites>
+ <databaseName>DBSAMPLE</databaseName>
+ </dbmsHandlerProperites>
</properties-mysql>
+
+ <properties-postgresql>
+ <!-- JDBC properties for a PostreSQL Database connection -->
+ <!-- Required jar file: postgresql-8.3-603.jdbc4.jar -->
+ <jdbcClass>org.postgresql.Driver</jdbcClass>
+ <jdbcURL>jdbc:postgresql://localhost</jdbcURL>
+ <jdbcUser>postgres</jdbcUser>
+ <jdbcPwd>postgres</jdbcPwd>
+ <!-- Empire-db driver configuration -->
+
<dbmsHandlerClass>org.apache.empire.dbms.postgresql.DBMSHandlerPostgreSQL</dbmsHandlerClass>
+ <dbmsHandlerProperites>
+ <databaseName>DBSAMPLE</databaseName>
+ </dbmsHandlerProperites>
+ </properties-postgresql>
+
+ <properties-h2>
+ <!-- JDBC properties for a H2 Database connection -->
+ <!-- Required jar file: h2-1.1.107.jar -->
+ <jdbcClass>org.h2.Driver</jdbcClass>
+ <jdbcURL>jdbc:h2:h2/DBSAMPLE</jdbcURL>
+ <jdbcUser>sa</jdbcUser>
+ <jdbcPwd></jdbcPwd>
+ <!-- Empire-db driver configuration -->
+
<dbmsHandlerClass>org.apache.empire.dbms.h2.DBMSHandlerH2</dbmsHandlerClass>
+ <dbmsHandlerProperites>
+ <databaseName>DBSAMPLE</databaseName>
+ </dbmsHandlerProperites>
+ </properties-h2>
+
+ <properties-derby>
+ <!-- JDBC properties for a Derby Database connection -->
+ <!-- Required jar file: derby-10.4.2.0.jar -->
+ <jdbcClass>org.apache.derby.jdbc.EmbeddedDriver</jdbcClass>
+ <jdbcURL>jdbc:derby:derby/DBSAMPLE;create=true</jdbcURL>
+ <jdbcUser></jdbcUser>
+ <jdbcPwd></jdbcPwd>
+ <!-- Empire-db driver configuration -->
+
<dbmsHandlerClass>org.apache.empire.dbms.derby.DBMSHandlerDerby</dbmsHandlerClass>
+ <dbmsHandlerProperites>
+ <databaseName>DBSAMPLE</databaseName>
+ </dbmsHandlerProperites>
+ </properties-derby>
<properties-oracle>
<!-- JDBC properties for an Oracle Database connection -->
<!-- Required jar file: ojdbc14.jar -->
<jdbcClass>oracle.jdbc.driver.OracleDriver</jdbcClass>
- <jdbcURL>jdbc:oracle:thin:@esteams2:1521:ora10</jdbcURL>
+ <jdbcURL>jdbc:oracle:thin:@esteams12:1521:ora12</jdbcURL>
<jdbcUser>DBSAMPLE</jdbcUser>
<jdbcPwd>DBSAMPLE</jdbcPwd>
- <schemaName>DBSAMPLE</schemaName>
+ <!-- Empire-db driver configuration -->
+
<dbmsHandlerClass>org.apache.empire.dbms.oracle.DBMSHandlerOracle</dbmsHandlerClass>
+ <dbmsHandlerProperites>
+ <!-- no properties -->
+ </dbmsHandlerProperites>
</properties-oracle>
<properties-sqlserver>
<!-- JDBC properties for a Microsoft SQL-Server Database
connection -->
- <!-- Required jar file: sqljdbc.jar -->
<jdbcClass>com.microsoft.sqlserver.jdbc.SQLServerDriver</jdbcClass>
- <jdbcURL>jdbc:sqlserver://192.168.0.2:1433</jdbcURL>
- <jdbcUser>sa</jdbcUser>
- <jdbcPwd>empire-db</jdbcPwd>
- <schemaName>DBSAMPLE</schemaName>
+ <jdbcURL>jdbc:sqlserver://esteams12\sql17</jdbcURL>
+ <jdbcUser>jdbcUser</jdbcUser>
+ <jdbcPwd>jdbcPwd</jdbcPwd>
+ <!-- Empire-db driver configuration -->
+
<dbmsHandlerClass>org.apache.empire.dbms.sqlserver.DBMSHandlerMSSQL</dbmsHandlerClass>
+ <dbmsHandlerProperites>
+ <databaseName>DBSAMPLE</databaseName>
+ <useSequenceTable>false</useSequenceTable>
+ <!-- useDateTime2: set to false for databases using
DATETIME for timestamps instead of DATETIME2 -->
+ <useDateTime2>true</useDateTime2>
+ </dbmsHandlerProperites>
</properties-sqlserver>
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
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 33d9b86..49af182 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
@@ -618,8 +618,7 @@ public abstract class DBRowSet extends DBExpr implements
EntityType
// Initialize all Fields
Object[] fields = record.getFields();
/*
- * DO NOT fill with ObjectUtils.NO_VALUE
- * ![fields[i] <> ObjectUtils.NO_VALUE];
+ * DO NOT fill with ObjectUtils.NO_VALUE!
*/
// Init Key Values
if (key != null)
@@ -630,7 +629,10 @@ public abstract class DBRowSet extends DBExpr implements
EntityType
if (key.length!=keyColumns.length)
throw new InvalidArgumentException("key", key);
for (int i = 0; i < keyColumns.length; i++)
- { // check
+ { // ignore null (important!)
+ if (key[i]==null)
+ continue;
+ // check key column
DBColumn keyColumn = keyColumns[i];
if (newRecord && keyColumn.isAutoGenerated())
throw new FieldReadOnlyException(keyColumn);
diff --git a/pom.xml b/pom.xml
index a8547ff..dd48146 100644
--- a/pom.xml
+++ b/pom.xml
@@ -477,6 +477,7 @@
<exclude>**/.classpath</exclude>
<exclude>**/.tomcatplugin</exclude>
<exclude>**/empire-db-example-vue/src/main/vue/.*</exclude>
+
<exclude>**/_eslintrc.js.bak</exclude>
<exclude>release.properties</exclude>
<!-- should the sample
databases be created in target? -->
<exclude>**/hsqldb/sample.*</exclude>
@@ -553,6 +554,7 @@
<exclude>**/.idea/**</exclude>
<exclude>**/*.json</exclude>
<exclude>**/*.vue</exclude>
+
<exclude>**/_eslintrc.js.bak</exclude>
<exclude>**/static/js/*.js</exclude>
<exclude>**/app.*.css</exclude>
<exclude>**/readme.txt</exclude>