You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by de...@apache.org on 2018/01/10 16:24:01 UTC

empire-db git commit: Added empire-db-vue-example

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 <ja...@glaubitz.org>
Authored: Wed Jan 10 17:17:31 2018 +0100
Committer: Jan Glaubitz <ja...@glaubitz.org>
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