Repository: empire-db
Updated Branches:
  refs/heads/master 35a2ccd3f -> 0beb75c72


Added empire-db-vue-example


Project: http://git-wip-us.apache.org/repos/asf/empire-db/repo
Commit: http://git-wip-us.apache.org/repos/asf/empire-db/commit/0beb75c7
Tree: http://git-wip-us.apache.org/repos/asf/empire-db/tree/0beb75c7
Diff: http://git-wip-us.apache.org/repos/asf/empire-db/diff/0beb75c7

Branch: refs/heads/master
Commit: 0beb75c72d2155e01f61d486b23fa2a457815a52
Parents: 35a2ccd
Author: Jan Glaubitz <[email protected]>
Authored: Wed Jan 10 17:17:31 2018 +0100
Committer: Jan Glaubitz <[email protected]>
Committed: Wed Jan 10 17:17:31 2018 +0100

----------------------------------------------------------------------
 empire-db-vue-example/.gitignore                |   7 +
 empire-db-vue-example/pom.xml                   | 144 +++++++++++
 .../org/apache/empire/rest/EmpireColumn.java    |  45 ++++
 .../apache/empire/rest/EmpireColumnMeta.java    |  63 +++++
 .../empire/rest/service/EmployeeService.java    | 179 +++++++++++++
 .../org/apache/empire/rest/service/Service.java |  62 +++++
 .../empire/rest/service/filter/CORSFilter.java  |  40 +++
 .../service/filter/ServiceRequestFilter.java    |  59 +++++
 .../service/filter/ServiceResponseFilter.java   |  78 ++++++
 .../rest/service/listener/AppListener.java      | 248 +++++++++++++++++++
 .../vuesample/model/EmpireServiceConsts.java    |  31 +++
 .../empire/vuesample/model/db/EmployeeBean.java |  65 +++++
 .../empire/vuesample/model/db/SampleDB.java     | 156 ++++++++++++
 .../empire/vuesample/model/db/SampleTable.java  |  81 ++++++
 .../src/main/webapp/WEB-INF/web.xml             |  43 ++++
 .../src/main/webapp/components/einput/einput.js |  25 ++
 .../src/main/webapp/index.html                  |  39 +++
 empire-db-vue-example/src/main/webapp/js/app.js |  42 ++++
 18 files changed, 1407 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/.gitignore
----------------------------------------------------------------------
diff --git a/empire-db-vue-example/.gitignore b/empire-db-vue-example/.gitignore
new file mode 100644
index 0000000..a76eba0
--- /dev/null
+++ b/empire-db-vue-example/.gitignore
@@ -0,0 +1,7 @@
+target/
+.settings/
+.metadata/
+.classpath
+.project
+.tern-project
+*.log

http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/pom.xml
----------------------------------------------------------------------
diff --git a/empire-db-vue-example/pom.xml b/empire-db-vue-example/pom.xml
new file mode 100644
index 0000000..7afcfa2
--- /dev/null
+++ b/empire-db-vue-example/pom.xml
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- 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. -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
+       <modelVersion>4.0.0</modelVersion>
+
+       <parent>
+               <artifactId>empire-db-parent</artifactId>
+               <groupId>org.apache.empire-db</groupId>
+               <version>2.4.7-SNAPSHOT</version>
+       </parent>
+       
+       <artifactId>empire-db-vue-example</artifactId>
+       <packaging>war</packaging>
+       <name>Empire-db Vue.js Example</name>
+
+       <properties>
+               
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+               
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+               <maven.compile.source>1.6</maven.compile.source>
+               <maven.compile.target>1.6</maven.compile.target>
+       </properties>
+
+       <dependencies>
+
+               <!-- Servlet API -->
+               <dependency>
+                       <groupId>javax.servlet</groupId>
+                       <artifactId>servlet-api</artifactId>
+                       <scope>provided</scope>
+               </dependency>
+
+               <!-- hsql -->
+               <dependency>
+                       <groupId>hsqldb</groupId>
+                       <artifactId>hsqldb</artifactId>
+               </dependency>
+
+               <!-- 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>
+                       <groupId>org.apache.empire-db</groupId>
+                       <artifactId>empire-db</artifactId>
+               </dependency>
+
+               <!-- RS API -->
+               <dependency>
+                       <groupId>javax.ws.rs</groupId>
+                       <artifactId>javax.ws.rs-api</artifactId>
+                       <version>2.0</version>
+               </dependency>
+
+               <!-- Jersey -->
+               <dependency>
+                       <groupId>org.glassfish.jersey.containers</groupId>
+                       <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>
+
+               <!-- common io -->
+               <dependency>
+                       <groupId>commons-io</groupId>
+                       <artifactId>commons-io</artifactId>
+                       <version>2.5</version>
+               </dependency>
+
+               <!-- Logging -->
+               <dependency>
+                       <groupId>org.slf4j</groupId>
+                       <artifactId>slf4j-log4j12</artifactId>
+               </dependency>
+
+               <!-- Test <dependency> <groupId>junit</groupId> 
<artifactId>junit</artifactId> 
+                       <version>4.12</version> </dependency> -->
+
+       </dependencies>
+
+       <build>
+
+               <finalName>evue</finalName>
+
+               <plugins>
+                       <!-- Eclipse Web Tools Platform -->
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-eclipse-plugin</artifactId>
+                               <configuration>
+                                       <m2eclipse>true</m2eclipse>
+                                       <downloadSources>true</downloadSources>
+                                       <wtpversion>1.5</wtpversion>
+                               </configuration>
+                       </plugin>
+
+                       <!-- Maven Compiler Plugin -->
+                       <plugin>
+                               <artifactId>maven-compiler-plugin</artifactId>
+                               <configuration>
+                                       <source>1.8</source>
+                                       <target>1.8</target>
+                               </configuration>
+                       </plugin>
+
+                       <!-- Maven WAR Plugin -->
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-war-plugin</artifactId>
+                               <configuration>
+                                       <webResources>
+                                               <resource>
+                                                       
<directory>src/main/webapp</directory>
+                                                       
<filtering>true</filtering>
+                                               </resource>
+                                       </webResources>
+                               </configuration>
+                       </plugin>
+
+               </plugins>
+       </build>
+
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/src/main/java/org/apache/empire/rest/EmpireColumn.java
----------------------------------------------------------------------
diff --git 
a/empire-db-vue-example/src/main/java/org/apache/empire/rest/EmpireColumn.java 
b/empire-db-vue-example/src/main/java/org/apache/empire/rest/EmpireColumn.java
new file mode 100644
index 0000000..3b0c9a6
--- /dev/null
+++ 
b/empire-db-vue-example/src/main/java/org/apache/empire/rest/EmpireColumn.java
@@ -0,0 +1,45 @@
+/*
+ * 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.rest;
+
+import org.apache.empire.rest.EmpireColumnMeta;
+
+public class EmpireColumn {
+
+       private Object                          value;
+
+       private EmpireColumnMeta        meta;
+
+       public Object getValue() {
+               return this.value;
+       }
+
+       public void setValue(Object value) {
+               this.value = value;
+       }
+
+       public EmpireColumnMeta getMeta() {
+               return this.meta;
+       }
+
+       public void setMeta(EmpireColumnMeta meta) {
+               this.meta = meta;
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/src/main/java/org/apache/empire/rest/EmpireColumnMeta.java
----------------------------------------------------------------------
diff --git 
a/empire-db-vue-example/src/main/java/org/apache/empire/rest/EmpireColumnMeta.java
 
b/empire-db-vue-example/src/main/java/org/apache/empire/rest/EmpireColumnMeta.java
new file mode 100644
index 0000000..3a30390
--- /dev/null
+++ 
b/empire-db-vue-example/src/main/java/org/apache/empire/rest/EmpireColumnMeta.java
@@ -0,0 +1,63 @@
+/*
+ * 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.rest;
+
+public class EmpireColumnMeta {
+
+       private Double  size;
+
+       private String  type;
+
+       private boolean required;
+
+       private boolean readonly;
+
+       public Double getSize() {
+               return this.size;
+       }
+
+       public void setSize(Double size) {
+               this.size = size;
+       }
+
+       public String getType() {
+               return this.type;
+       }
+
+       public void setType(String type) {
+               this.type = type;
+       }
+
+       public boolean isRequired() {
+               return this.required;
+       }
+
+       public void setRequired(boolean required) {
+               this.required = required;
+       }
+
+       public boolean isReadonly() {
+               return this.readonly;
+       }
+
+       public void setReadonly(boolean readonly) {
+               this.readonly = readonly;
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/EmployeeService.java
----------------------------------------------------------------------
diff --git 
a/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/EmployeeService.java
 
b/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/EmployeeService.java
new file mode 100644
index 0000000..dcc72b4
--- /dev/null
+++ 
b/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/EmployeeService.java
@@ -0,0 +1,179 @@
+/*
+ * 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.rest.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBCommand;
+import org.apache.empire.db.DBReader;
+import org.apache.empire.rest.EmpireColumn;
+import org.apache.empire.rest.EmpireColumnMeta;
+import org.apache.empire.vuesample.model.db.EmployeeBean;
+import org.apache.empire.vuesample.model.db.SampleDB;
+import org.apache.empire.vuesample.model.db.SampleDB.TEmployees;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Path("/employee")
+public class EmployeeService extends Service {
+
+       private static final Logger log = 
LoggerFactory.getLogger(EmployeeService.class);
+
+       @POST
+       @Path("/{employeeId}")
+       @Consumes(MediaType.APPLICATION_JSON)
+       public Response updateEmployee(@PathParam("employeeId") int employeeId, 
EmployeeBean employee) {
+
+               SampleDB db = getDatabase();
+               TEmployees TE = db.T_EMPLOYEES;
+
+               DBCommand cmd = db.createCommand();
+
+               // First name
+               
cmd.set(TE.FIRST_NAME.to(TE.FIRST_NAME.validate(getValue(employee.getFirstName()))));
+
+               // Last name
+               
cmd.set(TE.LAST_NAME.to(TE.LAST_NAME.validate(getValue(employee.getLastName()))));
+
+               // Date of Birth
+               
cmd.set(TE.DATE_OF_BIRTH.to(TE.DATE_OF_BIRTH.validate(getValue(employee.getDateOfBirth()))));
+
+               cmd.where(TE.EMPLOYEE_ID.is(employeeId));
+
+               int executeUpdate = db.executeUpdate(cmd, getConnection());
+
+               if (executeUpdate == 0) {
+                       return Response.status(Status.NOT_FOUND).build();
+               } else {
+                       return Response.ok().build();
+               }
+
+       }
+
+       @GET
+       @Path("/{employeeId}")
+       @Produces(MediaType.APPLICATION_JSON)
+       public Response getEmployee(@PathParam("employeeId") int employeeId) {
+
+               SampleDB db = getDatabase();
+
+               TEmployees TE = db.T_EMPLOYEES;
+
+               DBCommand cmd = db.createCommand();
+               cmd.select(TE.EMPLOYEE_ID, TE.LAST_NAME, TE.FIRST_NAME, 
TE.DATE_OF_BIRTH);
+               cmd.where(TE.EMPLOYEE_ID.is(employeeId));
+
+               DBReader reader = new DBReader();
+               EmployeeBean eb = new EmployeeBean();
+
+               try {
+                       reader.open(cmd, getConnection());
+
+                       if (!reader.moveNext()) {
+                               // Employee not found
+                               return 
Response.status(Status.NOT_FOUND).build();
+                       }
+
+                       eb = createEmployee(reader);
+
+               } finally {
+                       reader.close();
+               }
+
+               return Response.ok(eb).build();
+       }
+
+       @GET
+       @Path("/list/")
+       @Produces(MediaType.APPLICATION_JSON)
+       public Response getEmployeeList() {
+
+               SampleDB db = getDatabase();
+
+               TEmployees TE = db.T_EMPLOYEES;
+
+               DBCommand cmd = db.createCommand();
+               cmd.select(TE.EMPLOYEE_ID, TE.LAST_NAME, TE.FIRST_NAME, 
TE.DATE_OF_BIRTH);
+
+               DBReader reader = new DBReader();
+               List<EmployeeBean> list = new ArrayList<>();
+
+               try {
+                       reader.open(cmd, getConnection());
+                       while (reader.moveNext()) {
+                               list.add(createEmployee(reader));
+                       }
+
+               } finally {
+                       reader.close();
+               }
+
+               return Response.ok(list).build();
+
+       }
+
+       private EmployeeBean createEmployee(DBReader reader) {
+
+               TEmployees TE = getDatabase().T_EMPLOYEES;
+
+               EmployeeBean eb = new EmployeeBean();
+               eb.setEmployeeId(createEmpireColumn(reader, TE.EMPLOYEE_ID));
+               eb.setLastName(createEmpireColumn(reader, TE.LAST_NAME));
+               eb.setFirstName(createEmpireColumn(reader, TE.FIRST_NAME));
+               eb.setDateOfBirth(createEmpireColumn(reader, TE.DATE_OF_BIRTH));
+
+               return eb;
+       }
+
+       private EmpireColumn createEmpireColumn(DBReader reader, DBColumn col) {
+
+               EmpireColumn ec = new EmpireColumn();
+               // Value
+               ec.setValue(reader.getValue(col));
+               // Meta
+               EmpireColumnMeta meta = new EmpireColumnMeta();
+               meta.setSize(col.getSize());
+               meta.setType(col.getDataType().name());
+               meta.setRequired(col.isRequired());
+               meta.setReadonly(col.isReadOnly());
+               ec.setMeta(meta);
+
+               return ec;
+       }
+
+       private Object getValue(EmpireColumn ec) {
+               if (ec == null) {
+                       return null;
+               }
+               return ec.getValue();
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/Service.java
----------------------------------------------------------------------
diff --git 
a/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/Service.java
 
b/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/Service.java
new file mode 100644
index 0000000..e3dc177
--- /dev/null
+++ 
b/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/Service.java
@@ -0,0 +1,62 @@
+/*
+ * 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.rest.service;
+
+import java.sql.Connection;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.core.Context;
+
+import org.apache.empire.vuesample.model.EmpireServiceConsts;
+import org.apache.empire.vuesample.model.db.SampleDB;
+import org.glassfish.jersey.server.ContainerRequest;
+
+public abstract class Service {
+
+       @Context
+       private ServletContext                  context;
+
+       @Context
+       private ContainerRequestContext containerRequestContext;
+
+       @Context
+       private HttpServletRequest              req;
+
+       public SampleDB getDatabase() {
+               return (SampleDB) 
this.context.getAttribute(EmpireServiceConsts.ATTRIBUTE_DB);
+       }
+
+       public Connection getConnection() {
+               ContainerRequest containerRequest = (ContainerRequest) 
this.containerRequestContext;
+               return (Connection) 
containerRequest.getProperty(EmpireServiceConsts.ATTRIBUTE_CONNECTION);
+       }
+
+       public ServletRequest getServletRequest() {
+               return this.req;
+       }
+
+       public String getRemoteAddr() {
+               // TODO check X-Real-IP / X-Forwarded-For
+               return this.req.getRemoteAddr();
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/filter/CORSFilter.java
----------------------------------------------------------------------
diff --git 
a/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/filter/CORSFilter.java
 
b/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/filter/CORSFilter.java
new file mode 100644
index 0000000..df1ca36
--- /dev/null
+++ 
b/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/filter/CORSFilter.java
@@ -0,0 +1,40 @@
+/*
+ * 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.rest.service.filter;
+
+import java.io.IOException;
+
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.container.ContainerResponseFilter;
+import javax.ws.rs.ext.Provider;
+
+@Provider
+public class CORSFilter implements ContainerResponseFilter {
+
+       @Override
+       public void filter(final ContainerRequestContext requestContext, final 
ContainerResponseContext cres) throws IOException {
+               // cres.getHeaders().add("Access-Control-Allow-Origin", "*");
+               // cres.getHeaders().add("Access-Control-Allow-Headers", 
"origin, content-type, accept, authorization");
+               // cres.getHeaders().add("Access-Control-Allow-Credentials", 
"true");
+               // cres.getHeaders().add("Access-Control-Allow-Methods", "GET, 
POST, PUT, DELETE, OPTIONS, HEAD");
+               // cres.getHeaders().add("Access-Control-Max-Age", "1209600");
+       }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/filter/ServiceRequestFilter.java
----------------------------------------------------------------------
diff --git 
a/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/filter/ServiceRequestFilter.java
 
b/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/filter/ServiceRequestFilter.java
new file mode 100644
index 0000000..5a18d83
--- /dev/null
+++ 
b/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/filter/ServiceRequestFilter.java
@@ -0,0 +1,59 @@
+/*
+ * 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.rest.service.filter;
+
+import java.io.IOException;
+import java.sql.Connection;
+
+import javax.annotation.Priority;
+import javax.servlet.ServletContext;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerRequestFilter;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.ext.Provider;
+
+import org.apache.empire.rest.service.listener.AppListener;
+import org.apache.empire.vuesample.model.EmpireServiceConsts;
+import org.glassfish.jersey.server.ContainerRequest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Provider
+@Priority(0)
+public class ServiceRequestFilter implements ContainerRequestFilter {
+
+       private static final Logger     log     = 
LoggerFactory.getLogger(ServiceRequestFilter.class);
+
+       @Context
+       private ServletContext          servletContext;
+
+       @Override
+       public void filter(ContainerRequestContext requestContext) throws 
IOException {
+
+               ContainerRequest containerRequest = (ContainerRequest) 
requestContext;
+
+               // get Connection from pool
+               Connection conn = 
AppListener.getJDBCConnection(this.servletContext);
+
+               // Add to context
+               
containerRequest.setProperty(EmpireServiceConsts.ATTRIBUTE_CONNECTION, conn);
+
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/filter/ServiceResponseFilter.java
----------------------------------------------------------------------
diff --git 
a/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/filter/ServiceResponseFilter.java
 
b/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/filter/ServiceResponseFilter.java
new file mode 100644
index 0000000..42bf9c3
--- /dev/null
+++ 
b/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/filter/ServiceResponseFilter.java
@@ -0,0 +1,78 @@
+/*
+ * 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.rest.service.filter;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import javax.annotation.Priority;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.container.ContainerResponseFilter;
+import javax.ws.rs.core.Response.Status.Family;
+import javax.ws.rs.ext.Provider;
+
+import org.apache.empire.vuesample.model.EmpireServiceConsts;
+import org.glassfish.jersey.server.ContainerRequest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Provider
+@Priority(99999)
+public class ServiceResponseFilter implements ContainerResponseFilter {
+
+       private static final Logger log = 
LoggerFactory.getLogger(ServiceResponseFilter.class);
+
+       @Override
+       public void filter(ContainerRequestContext requestContext, 
ContainerResponseContext responseContext) throws IOException {
+
+               // responseContext.getHeaders().putSingle(key, value);
+
+               ContainerRequest containerRequest = (ContainerRequest) 
requestContext;
+               Connection conn = (Connection) 
containerRequest.getProperty(EmpireServiceConsts.ATTRIBUTE_CONNECTION);
+
+               boolean success = responseContext.getStatusInfo().getFamily() 
== Family.SUCCESSFUL;
+
+               try {
+
+                       if (conn == null || conn.isClosed()) {
+                               // Connection not found or already closed
+                               return;
+                       }
+
+                       if (success) {
+                               // commit
+                               conn.commit();
+                       } else {
+                               // rollback
+                               conn.rollback();
+                       }
+
+                       // close connection / return to pool
+                       conn.close();
+
+               } catch (SQLException e) {
+                       log.error("Error releasing connection", e);
+                       responseContext.setStatus(500);
+               }
+
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/listener/AppListener.java
----------------------------------------------------------------------
diff --git 
a/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/listener/AppListener.java
 
b/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/listener/AppListener.java
new file mode 100644
index 0000000..8cee6ed
--- /dev/null
+++ 
b/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/listener/AppListener.java
@@ -0,0 +1,248 @@
+/*
+ * 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.rest.service.listener;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+import org.apache.empire.commons.StringUtils;
+import org.apache.empire.db.DBCommand;
+import org.apache.empire.db.DBDatabase;
+import org.apache.empire.db.DBDatabaseDriver;
+import org.apache.empire.db.DBRecord;
+import org.apache.empire.db.DBSQLScript;
+import org.apache.empire.db.exceptions.QueryFailedException;
+import org.apache.empire.db.hsql.DBDatabaseDriverHSql;
+import org.apache.empire.db.mysql.DBDatabaseDriverMySQL;
+import org.apache.empire.vuesample.model.EmpireServiceConsts;
+import org.apache.empire.vuesample.model.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;
+
+public class AppListener implements ServletContextListener {
+
+       private static final Logger log = 
LoggerFactory.getLogger(AppListener.class);
+
+       @Override
+       public void contextInitialized(ServletContextEvent sce) {
+
+               log.debug("contextInitialized");
+
+               // Logging
+               initLogging();
+
+               //
+               Connection conn = getJDBCConnection(sce.getServletContext());
+
+               // DB
+               SampleDB db = initDatabase(sce.getServletContext());
+               DBDatabaseDriver driver = new DBDatabaseDriverMySQL();
+               db.open(driver, conn);
+
+               // Add to context
+               
sce.getServletContext().setAttribute(EmpireServiceConsts.ATTRIBUTE_DB, db);
+               // 
sce.getServletContext().setAttribute(MobileImportServiceConsts.ATTRIBUTE_DATASOURCE,
 ds);
+               // 
sce.getServletContext().setAttribute(MobileImportServiceConsts.ATTRIBUTE_CONFIG,
 config);
+
+               log.debug("contextInitialized done");
+
+       }
+
+       @Override
+       public void contextDestroyed(ServletContextEvent sce) {
+               log.debug("contextDestroyed");
+               log.debug("contextDestroyed done");
+       }
+
+       private SampleDB initDatabase(ServletContext ctx) {
+               SampleDB db = new SampleDB();
+
+               // Open Database (and create if not existing)
+               DBDatabaseDriver driver = new DBDatabaseDriverHSql();
+               log.info("Opening database '{}' using driver '{}'", 
db.getClass().getSimpleName(), driver.getClass().getSimpleName());
+               Connection conn = null;
+               try {
+                       conn = getJDBCConnection(ctx);
+                       db.open(driver, conn);
+                       if (!databaseExists(db, conn)) {
+                               // STEP 4: Create Database
+                               log.info("Creating database {}", 
db.getClass().getSimpleName());
+                               createSampleDatabase(db, driver, conn);
+                       }
+               } finally {
+                       releaseConnection(db, conn, true);
+               }
+
+               return db;
+       }
+
+       private static boolean databaseExists(SampleDB db, Connection conn) {
+               // Check wether DB exists
+               DBCommand cmd = db.createCommand();
+               cmd.select(db.T_DEPARTMENTS.count());
+               try {
+                       return (db.querySingleInt(cmd, -1, conn) >= 0);
+               } catch (QueryFailedException e) {
+                       return false;
+               }
+       }
+
+       private static void createSampleDatabase(SampleDB db, DBDatabaseDriver 
driver, Connection conn) {
+               // create DLL for Database Definition
+               DBSQLScript script = new DBSQLScript();
+               db.getCreateDDLScript(driver, script);
+               // Show DLL Statements
+               System.out.println(script.toString());
+               // Execute Script
+               script.executeAll(driver, conn, false);
+               db.commit(conn);
+               // Open again
+               if (!db.isOpen()) {
+                       db.open(driver, conn);
+               }
+               // Insert Sample Departments
+               insertDepartmentSampleRecord(db, conn, "Procurement", "ITTK");
+               int idDevDep = insertDepartmentSampleRecord(db, conn, 
"Development", "ITTK");
+               int idSalDep = insertDepartmentSampleRecord(db, conn, "Sales", 
"ITTK");
+               // Insert Sample Employees
+               insertEmployeeSampleRecord(db, conn, "Mr.", "Eugen", "Miller", 
"M", idDevDep);
+               insertEmployeeSampleRecord(db, conn, "Mr.", "Max", "Mc. 
Callahan", "M", idDevDep);
+               insertEmployeeSampleRecord(db, conn, "Mrs.", "Anna", "Smith", 
"F", idSalDep);
+               // Commit
+               db.commit(conn);
+       }
+
+       private static int insertDepartmentSampleRecord(SampleDB db, Connection 
conn, String department_name, String businessUnit) {
+               // Insert a Department
+               DBRecord rec = new DBRecord();
+               rec.create(db.T_DEPARTMENTS);
+               rec.setValue(db.T_DEPARTMENTS.NAME, department_name);
+               rec.setValue(db.T_DEPARTMENTS.BUSINESS_UNIT, businessUnit);
+               try {
+                       rec.update(conn);
+               } catch (Exception e) {
+                       log.error(e.getLocalizedMessage());
+                       return 0;
+               }
+               // Return Department ID
+               return rec.getInt(db.T_DEPARTMENTS.DEPARTMENT_ID);
+       }
+
+       /*
+        * Insert a person
+        */
+       private static int insertEmployeeSampleRecord(SampleDB db, Connection 
conn, String salutation, String firstName, String lastName, String gender, int 
depID) {
+               // Insert an Employee
+               DBRecord rec = new DBRecord();
+               rec.create(db.T_EMPLOYEES);
+               rec.setValue(db.T_EMPLOYEES.SALUTATION, salutation);
+               rec.setValue(db.T_EMPLOYEES.FIRST_NAME, firstName);
+               rec.setValue(db.T_EMPLOYEES.LAST_NAME, lastName);
+               rec.setValue(db.T_EMPLOYEES.GENDER, gender);
+               rec.setValue(db.T_EMPLOYEES.DEPARTMENT_ID, depID);
+               try {
+                       rec.update(conn);
+               } catch (Exception e) {
+                       log.error(e.getLocalizedMessage());
+                       return 0;
+               }
+               // Return Employee ID
+               return rec.getInt(db.T_EMPLOYEES.EMPLOYEE_ID);
+       }
+
+       public static Connection getJDBCConnection(ServletContext appContext) {
+               // Establish a new database connection
+               Connection conn = null;
+
+               String jdbcURL = "jdbc:hsqldb:file:hsqldb/sample;shutdown=true";
+               String jdbcUser = "sa";
+               String jdbcPwd = "";
+
+               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("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);
+                       log.error(e.toString());
+                       throw new RuntimeException(e);
+               }
+               return conn;
+       }
+
+       protected void releaseConnection(DBDatabase db, Connection conn, 
boolean commit) {
+               // release connection
+               if (conn == null) {
+                       return;
+               }
+               // Commit or rollback connection depending on the exit code
+               if (commit) { // success: commit all changes
+                       db.commit(conn);
+                       log.debug("REQUEST {}: commited.");
+               } else { // failure: rollback all changes
+                       db.rollback(conn);
+                       log.debug("REQUEST {}: rolled back.");
+               }
+       }
+
+       private void initLogging() {
+
+               // Init Logging
+               ConsoleAppender consoleAppender = new ConsoleAppender();
+               String pattern = "%-5p [%d{yyyy/MM/dd HH:mm}]: %m at %l %n";
+               consoleAppender.setLayout(new PatternLayout(pattern));
+               consoleAppender.activateOptions();
+
+               
org.apache.log4j.Logger.getRootLogger().addAppender(consoleAppender);
+               org.apache.log4j.Logger.getRootLogger().setLevel(Level.ALL);
+
+               Level loglevel = Level.DEBUG;
+               log.info("Setting LogLevel to {}", loglevel);
+
+               // RootLogger
+               org.apache.log4j.Logger.getRootLogger().setLevel(Level.INFO);
+
+               // Empire-db Logs
+               org.apache.log4j.Logger empireLog = 
org.apache.log4j.Logger.getLogger("org.apache.empire.db.DBDatabase");
+               empireLog.setLevel(loglevel);
+
+               // Vue.js Sample
+               org.apache.log4j.Logger miLog = 
org.apache.log4j.Logger.getLogger("org.apache.empire.rest");
+               miLog.setLevel(loglevel);
+
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/src/main/java/org/apache/empire/vuesample/model/EmpireServiceConsts.java
----------------------------------------------------------------------
diff --git 
a/empire-db-vue-example/src/main/java/org/apache/empire/vuesample/model/EmpireServiceConsts.java
 
b/empire-db-vue-example/src/main/java/org/apache/empire/vuesample/model/EmpireServiceConsts.java
new file mode 100644
index 0000000..f95dc4c
--- /dev/null
+++ 
b/empire-db-vue-example/src/main/java/org/apache/empire/vuesample/model/EmpireServiceConsts.java
@@ -0,0 +1,31 @@
+/*
+ * 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.vuesample.model;
+
+public class EmpireServiceConsts {
+
+       public static final String      ATTRIBUTE_DB                    = "db";
+
+       public static final String      ATTRIBUTE_CONNECTION    = "connection";
+
+       public static final String      ATTRIBUTE_DATASOURCE    = "ds";
+
+       public static final String      ATTRIBUTE_CONFIG                = 
"config";
+
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/src/main/java/org/apache/empire/vuesample/model/db/EmployeeBean.java
----------------------------------------------------------------------
diff --git 
a/empire-db-vue-example/src/main/java/org/apache/empire/vuesample/model/db/EmployeeBean.java
 
b/empire-db-vue-example/src/main/java/org/apache/empire/vuesample/model/db/EmployeeBean.java
new file mode 100644
index 0000000..048c793
--- /dev/null
+++ 
b/empire-db-vue-example/src/main/java/org/apache/empire/vuesample/model/db/EmployeeBean.java
@@ -0,0 +1,65 @@
+/*
+ * 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.vuesample.model.db;
+
+import org.apache.empire.rest.EmpireColumn;
+
+public class EmployeeBean {
+
+       private EmpireColumn    employeeId;
+
+       private EmpireColumn    firstName;
+
+       private EmpireColumn    lastName;
+
+       private EmpireColumn    dateOfBirth;
+
+       public EmpireColumn getEmployeeId() {
+               return this.employeeId;
+       }
+
+       public void setEmployeeId(EmpireColumn employeeId) {
+               this.employeeId = employeeId;
+       }
+
+       public EmpireColumn getFirstName() {
+               return this.firstName;
+       }
+
+       public void setFirstName(EmpireColumn firstName) {
+               this.firstName = firstName;
+       }
+
+       public EmpireColumn getLastName() {
+               return this.lastName;
+       }
+
+       public void setLastName(EmpireColumn lastName) {
+               this.lastName = lastName;
+       }
+
+       public EmpireColumn getDateOfBirth() {
+               return this.dateOfBirth;
+       }
+
+       public void setDateOfBirth(EmpireColumn dateOfBirth) {
+               this.dateOfBirth = dateOfBirth;
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/src/main/java/org/apache/empire/vuesample/model/db/SampleDB.java
----------------------------------------------------------------------
diff --git 
a/empire-db-vue-example/src/main/java/org/apache/empire/vuesample/model/db/SampleDB.java
 
b/empire-db-vue-example/src/main/java/org/apache/empire/vuesample/model/db/SampleDB.java
new file mode 100644
index 0000000..735d323
--- /dev/null
+++ 
b/empire-db-vue-example/src/main/java/org/apache/empire/vuesample/model/db/SampleDB.java
@@ -0,0 +1,156 @@
+/*
+ * 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.vuesample.model.db;
+
+import org.apache.empire.commons.Options;
+import org.apache.empire.data.DataMode;
+import org.apache.empire.data.DataType;
+import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBDatabase;
+import org.apache.empire.db.DBTableColumn;
+
+public class SampleDB extends DBDatabase
+{
+    private final static long       serialVersionUID = 1L;
+
+    // Declare all Tables
+    public final TDepartments       T_DEPARTMENTS    = new TDepartments(this);
+    public final TEmployees         T_EMPLOYEES      = new TEmployees(this);
+
+    /**
+     * Constructor SampleDB
+     */
+    public SampleDB()
+    {
+        // Define Foreign-Key Relations
+        
addRelation(T_EMPLOYEES.DEPARTMENT_ID.referenceOn(T_DEPARTMENTS.DEPARTMENT_ID));
+    }
+
+    // Needed for the DBELResolver
+    @Override
+    protected void register(String id)
+    {
+        super.register("db");
+    }
+
+    /**
+     * This class represents the definition of the Departments table.
+     */
+    public static class TDepartments extends SampleTable
+    {
+        private static final long  serialVersionUID = 1L;
+
+        public final DBTableColumn DEPARTMENT_ID;
+        public final DBTableColumn NAME;
+        public final DBTableColumn HEAD;
+        public final DBTableColumn BUSINESS_UNIT;
+        public final DBTableColumn UPDATE_TIMESTAMP;
+
+        public TDepartments(DBDatabase db)
+        {
+            super("DEPARTMENTS", db);
+            // ID
+            DEPARTMENT_ID      = addColumn("DEPARTMENT_ID",    
DataType.AUTOINC,        0, DataMode.NotNull, "DEP_ID_SEQUENCE");
+            NAME                       = addColumn("NAME",                     
DataType.TEXT,          80, DataMode.NotNull);
+            HEAD                       = addColumn("HEAD",                     
DataType.TEXT,          80, DataMode.Nullable);
+            BUSINESS_UNIT      = addColumn("BUSINESS_UNIT",    DataType.TEXT,  
         4, DataMode.NotNull, "ITTK");
+            UPDATE_TIMESTAMP= addColumn("UPDATE_TIMESTAMP", DataType.DATETIME, 
 0, DataMode.NotNull);
+
+            // Primary Key
+            setPrimaryKey(DEPARTMENT_ID);
+            // Set other Indexes
+            addIndex("DEARTMENT_NAME_IDX", true, new DBColumn[] { NAME });
+            // Set timestamp column for save updates
+            setTimestampColumn(UPDATE_TIMESTAMP);
+
+        }
+    }
+
+  
+
+    /**
+     * This class represents the definition of the Employees table.
+     */
+    public static class TEmployees extends SampleTable
+    {
+        private static final long  serialVersionUID = 1L;
+
+        public final DBTableColumn EMPLOYEE_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;
+        public final DBTableColumn DEPARTMENT_ID;
+        public final DBTableColumn GENDER;
+        public final DBTableColumn PHONE_NUMBER;
+        public final DBTableColumn EMAIL;
+        public final DBTableColumn RETIRED;
+        public final DBTableColumn UPDATE_TIMESTAMP;
+        public TEmployees(DBDatabase db)
+        {
+            super("EMPLOYEES", db);
+            // ID
+            EMPLOYEE_ID        = addColumn("EMPLOYEE_ID",              
DataType.AUTOINC,        0, DataMode.NotNull, "EMPLOYEE_ID_SEQUENCE");
+            SALUTATION                 = addColumn("SALUTATION",               
DataType.TEXT,           5, DataMode.Nullable);
+            FIRST_NAME                 = addColumn("FIRST_NAME",               
DataType.TEXT,          40, DataMode.NotNull);
+            LAST_NAME          = addColumn("LAST_NAME",                
DataType.TEXT,          40, DataMode.NotNull);
+            DATE_OF_BIRTH      = addColumn("DATE_OF_BIRTH",    DataType.DATE,  
         0, DataMode.Nullable);
+            DEPARTMENT_ID      = addColumn("DEPARTMENT_ID",    
DataType.INTEGER,        0, DataMode.NotNull);
+            GENDER                     = addColumn("GENDER",                   
DataType.TEXT,           1, DataMode.Nullable);
+            PHONE_NUMBER       = addColumn("PHONE_NUMBER",     DataType.TEXT,  
        40, DataMode.Nullable);
+            EMAIL                      = addColumn("EMAIL",                    
DataType.TEXT,          80, DataMode.Nullable);
+            RETIRED                    = addColumn("RETIRED",                  
DataType.BOOL,           0, DataMode.NotNull, false);
+            // PICTURE                 = addColumn("PICTURE",                  
DataType.BLOB,           0, DataMode.Nullable);
+            UPDATE_TIMESTAMP= addColumn("UPDATE_TIMESTAMP", DataType.DATETIME, 
 0, DataMode.NotNull);
+
+            // Primary Key
+            setPrimaryKey(EMPLOYEE_ID);
+            // Set other Indexes
+            addIndex("PERSON_NAME_IDX", true, new DBColumn[] { FIRST_NAME, 
LAST_NAME, DATE_OF_BIRTH });
+
+            // Set timestamp column for save updates
+            setTimestampColumn(UPDATE_TIMESTAMP);
+
+            // 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");
+            
+            // Set optional formatting attributes
+            DATE_OF_BIRTH.setAttribute("format:date", "yyyy-MM-dd");
+            
+            // PICTURE.setControlType("blob");
+
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/src/main/java/org/apache/empire/vuesample/model/db/SampleTable.java
----------------------------------------------------------------------
diff --git 
a/empire-db-vue-example/src/main/java/org/apache/empire/vuesample/model/db/SampleTable.java
 
b/empire-db-vue-example/src/main/java/org/apache/empire/vuesample/model/db/SampleTable.java
new file mode 100644
index 0000000..353bf75
--- /dev/null
+++ 
b/empire-db-vue-example/src/main/java/org/apache/empire/vuesample/model/db/SampleTable.java
@@ -0,0 +1,81 @@
+/*
+ * 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.vuesample.model.db;
+
+import java.util.Locale;
+
+import org.apache.empire.data.DataType;
+import org.apache.empire.db.DBDatabase;
+import org.apache.empire.db.DBTable;
+import org.apache.empire.db.DBTableColumn;
+
+/**
+ * Base class definition for all database tables Automatically generates a 
message-key for the field title e.g. for the column
+ * EMPLOYEES.DATE_OF_BIRTH it generates the key 
"!field.title.employees.dateOfBirth";
+ */
+public class SampleTable extends DBTable
+{
+    private final static long serialVersionUID   = 1L;
+    public final String       MESSAGE_KEY_PREFIX = "!field.title.";
+
+    public SampleTable(String name, DBDatabase db)
+    {
+        super(name, db);
+    }
+
+    @Override
+    protected void addColumn(DBTableColumn column)
+    {
+        // Set Translation Title
+        String col = column.getBeanPropertyName();
+        String tbl = getName().toLowerCase();
+        String key = MESSAGE_KEY_PREFIX + tbl + "." + col;
+        column.setTitle(key);
+
+        // Set Default Control Type
+        DataType type = column.getDataType();
+        column.setControlType((type == DataType.BOOL) ? "checkbox" : "text");
+
+        // Add Column
+        super.addColumn(column);
+    }
+
+    public enum LanguageIndex {
+        DE(Locale.GERMAN),
+
+        EN(Locale.ENGLISH);
+
+        private final Locale locale;
+
+        private LanguageIndex(Locale locale)
+        {
+            this.locale = locale;
+        }
+
+        public Locale getLocale()
+        {
+            return this.locale;
+        }
+
+        public String getDBLangKey()
+        {
+            return this.name().toUpperCase();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/empire-db-vue-example/src/main/webapp/WEB-INF/web.xml 
b/empire-db-vue-example/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..ce58f76
--- /dev/null
+++ b/empire-db-vue-example/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- 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. -->
+
+<web-app id="vue-example" version="3.0"
+       xmlns="http://java.sun.com/xml/ns/javaee";
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd";
+       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd";>
+       
+       <servlet>
+               <servlet-name>Jersey Web Application</servlet-name>
+               
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
+               <init-param>
+                       
<param-name>jersey.config.server.provider.packages</param-name>
+                       
<param-value>org.apache.empire.rest.service</param-value>
+               </init-param>
+               <load-on-startup>1</load-on-startup>
+       </servlet>
+       
+       <servlet-mapping>
+               <servlet-name>Jersey Web Application</servlet-name>
+               <url-pattern>/ws/*</url-pattern>
+       </servlet-mapping>
+
+       <welcome-file-list>
+               <welcome-file>index.html</welcome-file>
+       </welcome-file-list>
+       
+       <listener>
+               
<listener-class>org.apache.empire.rest.service.listener.AppListener</listener-class>
+       </listener>
+
+</web-app>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/src/main/webapp/components/einput/einput.js
----------------------------------------------------------------------
diff --git a/empire-db-vue-example/src/main/webapp/components/einput/einput.js 
b/empire-db-vue-example/src/main/webapp/components/einput/einput.js
new file mode 100644
index 0000000..e84c400
--- /dev/null
+++ b/empire-db-vue-example/src/main/webapp/components/einput/einput.js
@@ -0,0 +1,25 @@
+/*
+ * 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.
+ */
+Vue.component('einput', {
+       
+       props: ['col'],
+       
+       template: '<input v-bind:value="col.value" v-bind:type="col.meta.type" 
v-bind:required="col.meta.required" v-bind:readonly="col.meta.readonly" 
v-bind:maxlength="col.meta.size"></input>'
+       
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/src/main/webapp/index.html
----------------------------------------------------------------------
diff --git a/empire-db-vue-example/src/main/webapp/index.html 
b/empire-db-vue-example/src/main/webapp/index.html
new file mode 100644
index 0000000..2cc67fe
--- /dev/null
+++ b/empire-db-vue-example/src/main/webapp/index.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <title></title>
+  <!-- <script src="js/jquery-3.2.1.min.js"></script> -->
+  <!-- <script src="https://unpkg.com/vue";></script>  -->
+  <script src="components/einput/einput.js"></script>
+</head>
+<body>
+
+  <div id="app">
+
+       <table>
+       
+               <tr>
+                       <td>ID</td>
+                       <td><einput 
v-bind:col="employee.employeeId"></einput></td>
+               </tr>
+               <tr>
+                       <td>Last Name</td>
+                       <td><einput 
v-bind:col="employee.lastName"></einput></td>
+               </tr>
+               <tr>
+                       <td>First name</td>
+                       <td><einput 
v-bind:col="employee.firstName"></einput></td>
+               </tr>
+               <tr>
+                       <td>Date of Birth</td>
+                       <td><einput 
v-bind:col="employee.dateOfBirth"></einput></td>
+               </tr>
+       
+       </table>
+       
+  </div>
+
+  <script src="js/app.js"></script>
+
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/empire-db/blob/0beb75c7/empire-db-vue-example/src/main/webapp/js/app.js
----------------------------------------------------------------------
diff --git a/empire-db-vue-example/src/main/webapp/js/app.js 
b/empire-db-vue-example/src/main/webapp/js/app.js
new file mode 100644
index 0000000..eeed1c5
--- /dev/null
+++ b/empire-db-vue-example/src/main/webapp/js/app.js
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+var vm = new Vue({
+
+       el: '#app',
+
+    created: function () {
+        this.loadEmployee(1);
+    },
+       
+       data: {
+               employee: {}
+       },
+       
+       methods: {
+               
+               loadEmployee: function (id) {
+                       var self = this;
+                       $.getJSON("ws/employee/" + id, function(data) {
+                               self.employee = data;
+                       });
+               }
+       
+       }
+
+});
\ No newline at end of file

Reply via email to