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
