EMPIREDB-271 Moved example to the examples folder and renamed it to empire-db-example-vue
Project: http://git-wip-us.apache.org/repos/asf/empire-db/repo Commit: http://git-wip-us.apache.org/repos/asf/empire-db/commit/caaec0de Tree: http://git-wip-us.apache.org/repos/asf/empire-db/tree/caaec0de Diff: http://git-wip-us.apache.org/repos/asf/empire-db/diff/caaec0de Branch: refs/heads/master Commit: caaec0de9a3bedcb41b32713884b07ba88fa10bd Parents: 8dbffdb Author: Rainer Döbele <[email protected]> Authored: Tue Jan 16 10:13:21 2018 +0100 Committer: Rainer Döbele <[email protected]> Committed: Tue Jan 16 10:13:21 2018 +0100 ---------------------------------------------------------------------- .../empire-db-example-vue/.gitignore | 7 + .../empire-db-example-vue/pom.xml | 142 +++++++++++ .../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 | 41 +++ .../src/main/webapp/components/einput/einput.js | 25 ++ .../src/main/webapp/index.html | 57 +++++ .../src/main/webapp/js/app.js | 42 ++++ empire-db-examples/pom.xml | 1 + 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 | 41 --- .../src/main/webapp/components/einput/einput.js | 25 -- .../src/main/webapp/index.html | 57 ----- empire-db-vue-example/src/main/webapp/js/app.js | 42 ---- 37 files changed, 1422 insertions(+), 1423 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/empire-db/blob/caaec0de/empire-db-examples/empire-db-example-vue/.gitignore ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/.gitignore b/empire-db-examples/empire-db-example-vue/.gitignore new file mode 100644 index 0000000..a76eba0 --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/.gitignore @@ -0,0 +1,7 @@ +target/ +.settings/ +.metadata/ +.classpath +.project +.tern-project +*.log http://git-wip-us.apache.org/repos/asf/empire-db/blob/caaec0de/empire-db-examples/empire-db-example-vue/pom.xml ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/pom.xml b/empire-db-examples/empire-db-example-vue/pom.xml new file mode 100644 index 0000000..a78c8f3 --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/pom.xml @@ -0,0 +1,142 @@ +<?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-examples</artifactId> + <groupId>org.apache.empire-db</groupId> + <version>2.4.7-SNAPSHOT</version> + </parent> + <artifactId>empire-db-example-vue</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.7</maven.compile.source> + <maven.compile.target>1.7</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>${maven.compile.source}</source> + <target>${maven.compile.target}</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/caaec0de/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/EmpireColumn.java ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/EmpireColumn.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/EmpireColumn.java new file mode 100644 index 0000000..5c62f80 --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/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/caaec0de/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/EmpireColumnMeta.java ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/EmpireColumnMeta.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/EmpireColumnMeta.java new file mode 100644 index 0000000..cd8f425 --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/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/caaec0de/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/EmployeeService.java ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/EmployeeService.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/EmployeeService.java new file mode 100644 index 0000000..8efcbe0 --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/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/caaec0de/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/Service.java ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/Service.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/Service.java new file mode 100644 index 0000000..f1a449d --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/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/caaec0de/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/filter/CORSFilter.java ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/filter/CORSFilter.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/filter/CORSFilter.java new file mode 100644 index 0000000..b36fe6a --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/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/caaec0de/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/filter/ServiceRequestFilter.java ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/filter/ServiceRequestFilter.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/filter/ServiceRequestFilter.java new file mode 100644 index 0000000..183595c --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/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/caaec0de/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/filter/ServiceResponseFilter.java ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/filter/ServiceResponseFilter.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/filter/ServiceResponseFilter.java new file mode 100644 index 0000000..b2dedb0 --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/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/caaec0de/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/listener/AppListener.java ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/listener/AppListener.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/listener/AppListener.java new file mode 100644 index 0000000..a3c1249 --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/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/caaec0de/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vuesample/model/EmpireServiceConsts.java ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vuesample/model/EmpireServiceConsts.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vuesample/model/EmpireServiceConsts.java new file mode 100644 index 0000000..833e968 --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/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/caaec0de/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vuesample/model/db/EmployeeBean.java ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vuesample/model/db/EmployeeBean.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vuesample/model/db/EmployeeBean.java new file mode 100644 index 0000000..622c02b --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/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/caaec0de/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vuesample/model/db/SampleDB.java ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vuesample/model/db/SampleDB.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vuesample/model/db/SampleDB.java new file mode 100644 index 0000000..735d323 --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/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/caaec0de/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vuesample/model/db/SampleTable.java ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vuesample/model/db/SampleTable.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vuesample/model/db/SampleTable.java new file mode 100644 index 0000000..353bf75 --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/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/caaec0de/empire-db-examples/empire-db-example-vue/src/main/webapp/WEB-INF/web.xml ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/src/main/webapp/WEB-INF/web.xml b/empire-db-examples/empire-db-example-vue/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..cfb49fe --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,41 @@ +<?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/caaec0de/empire-db-examples/empire-db-example-vue/src/main/webapp/components/einput/einput.js ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/src/main/webapp/components/einput/einput.js b/empire-db-examples/empire-db-example-vue/src/main/webapp/components/einput/einput.js new file mode 100644 index 0000000..85ca24d --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/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/caaec0de/empire-db-examples/empire-db-example-vue/src/main/webapp/index.html ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/src/main/webapp/index.html b/empire-db-examples/empire-db-example-vue/src/main/webapp/index.html new file mode 100644 index 0000000..ee9eb10 --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/src/main/webapp/index.html @@ -0,0 +1,57 @@ +<!-- + 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. + --> +<!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/caaec0de/empire-db-examples/empire-db-example-vue/src/main/webapp/js/app.js ---------------------------------------------------------------------- diff --git a/empire-db-examples/empire-db-example-vue/src/main/webapp/js/app.js b/empire-db-examples/empire-db-example-vue/src/main/webapp/js/app.js new file mode 100644 index 0000000..c516657 --- /dev/null +++ b/empire-db-examples/empire-db-example-vue/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 http://git-wip-us.apache.org/repos/asf/empire-db/blob/caaec0de/empire-db-examples/pom.xml ---------------------------------------------------------------------- diff --git a/empire-db-examples/pom.xml b/empire-db-examples/pom.xml index b826144..a2cca98 100644 --- a/empire-db-examples/pom.xml +++ b/empire-db-examples/pom.xml @@ -39,6 +39,7 @@ <module>empire-db-example-struts2</module> <module>empire-db-example-struts2-cxf</module> <module>empire-db-example-jsf2</module> + <module>empire-db-example-vue</module> <!-- <module>empire-db-example-codegen</module> --> </modules> <build> http://git-wip-us.apache.org/repos/asf/empire-db/blob/caaec0de/empire-db-vue-example/.gitignore ---------------------------------------------------------------------- diff --git a/empire-db-vue-example/.gitignore b/empire-db-vue-example/.gitignore deleted file mode 100644 index a76eba0..0000000 --- a/empire-db-vue-example/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -target/ -.settings/ -.metadata/ -.classpath -.project -.tern-project -*.log http://git-wip-us.apache.org/repos/asf/empire-db/blob/caaec0de/empire-db-vue-example/pom.xml ---------------------------------------------------------------------- diff --git a/empire-db-vue-example/pom.xml b/empire-db-vue-example/pom.xml deleted file mode 100644 index 7afcfa2..0000000 --- a/empire-db-vue-example/pom.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?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/caaec0de/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 deleted file mode 100644 index 3b0c9a6..0000000 --- a/empire-db-vue-example/src/main/java/org/apache/empire/rest/EmpireColumn.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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/caaec0de/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 deleted file mode 100644 index 3a30390..0000000 --- a/empire-db-vue-example/src/main/java/org/apache/empire/rest/EmpireColumnMeta.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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/caaec0de/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 deleted file mode 100644 index dcc72b4..0000000 --- a/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/EmployeeService.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * 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/caaec0de/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 deleted file mode 100644 index e3dc177..0000000 --- a/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/Service.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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/caaec0de/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 deleted file mode 100644 index df1ca36..0000000 --- a/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/filter/CORSFilter.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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/caaec0de/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 deleted file mode 100644 index 5a18d83..0000000 --- a/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/filter/ServiceRequestFilter.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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/caaec0de/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 deleted file mode 100644 index 42bf9c3..0000000 --- a/empire-db-vue-example/src/main/java/org/apache/empire/rest/service/filter/ServiceResponseFilter.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * 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); - } - - } - -}
