| /* |
| * 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 java.util.Locale; |
| |
| 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 org.apache.empire.commons.Options; |
| import org.apache.empire.db.DBColumnExpr; |
| import org.apache.empire.db.DBCommand; |
| import org.apache.empire.db.DBJoinType; |
| import org.apache.empire.db.DBReader; |
| import org.apache.empire.exceptions.EmpireException; |
| import org.apache.empire.rest.app.RecordInitException; |
| import org.apache.empire.rest.app.SampleServiceApp; |
| import org.apache.empire.rest.app.TextResolver; |
| import org.apache.empire.rest.json.JsoColumnMeta; |
| import org.apache.empire.rest.json.JsoRecordData; |
| import org.apache.empire.rest.json.JsoResultWithMeta; |
| import org.apache.empire.vue.sample.db.RecordContext; |
| import org.apache.empire.vue.sample.db.SampleDB; |
| import org.apache.empire.vue.sample.db.SampleDB.TDepartments; |
| import org.apache.empire.vue.sample.db.SampleDB.TEmployees; |
| import org.apache.empire.vue.sample.db.records.EmployeeRecord; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| @Path("/employee") |
| public class EmployeeService extends Service { |
| |
| private static final Logger log = LoggerFactory.getLogger(EmployeeService.class); |
| |
| @GET |
| @Path("/filter") |
| @Produces(MediaType.APPLICATION_JSON) |
| public Response getEmployeeFilter() { |
| |
| RecordContext ctx = this.getRecordContext(); |
| TextResolver textResolver = ctx.getTextResolver(); |
| |
| // Query Department options |
| SampleDB db = getDatabase(); |
| DBCommand cmd = db.createCommand(); |
| cmd.select(db.T_DEPARTMENTS.DEPARTMENT_ID, db.T_DEPARTMENTS.NAME); |
| cmd.join (db.T_DEPARTMENTS.DEPARTMENT_ID, db.T_EMPLOYEES.DEPARTMENT_ID); |
| cmd.groupBy(cmd.getSelectExprList()); |
| cmd.orderBy(db.T_DEPARTMENTS.NAME); |
| Options departmentOptions = db.queryOptionList(cmd, ctx.getConnection()); |
| |
| // Create Metadata |
| TEmployees TE = db.T_EMPLOYEES; |
| JsoColumnMeta[] meta = new JsoColumnMeta[] { |
| new JsoColumnMeta(TE.EMPLOYEE_ID, textResolver), |
| new JsoColumnMeta(TE.FIRST_NAME, textResolver), |
| new JsoColumnMeta(TE.LAST_NAME, textResolver), |
| new JsoColumnMeta(TE.DEPARTMENT_ID, textResolver, departmentOptions, false, false, false), |
| new JsoColumnMeta(TE.GENDER, textResolver), |
| }; |
| |
| JsoRecordData filter = new JsoRecordData(meta); |
| return Response.ok(new JsoResultWithMeta(filter, meta)).build(); |
| } |
| |
| @POST |
| @Path("/list/") |
| @Consumes(MediaType.APPLICATION_JSON) |
| @Produces(MediaType.APPLICATION_JSON) |
| public Response getEmployeeList(JsoRecordData filter) { |
| |
| SampleDB db = getDatabase(); |
| |
| TEmployees TE = db.T_EMPLOYEES; |
| TDepartments TD = db.T_DEPARTMENTS; |
| DBColumnExpr FULL_NAME = TE.LAST_NAME.append(", ").append(TE.FIRST_NAME).as("NAME"); |
| DBColumnExpr DEPARTMENT = TD.NAME.as("DEPARTMENT"); |
| FULL_NAME.setTitle("!field.title.employees.fullname"); |
| |
| log.info("Providing employee list..."); |
| |
| DBCommand cmd = db.createCommand(); |
| cmd.select(TE.EMPLOYEE_ID, FULL_NAME, DEPARTMENT, TE.GENDER, TE.DATE_OF_BIRTH, TE.RETIRED); |
| cmd.join (TE.DEPARTMENT_ID, TD.DEPARTMENT_ID, DBJoinType.LEFT); |
| |
| // apply all filters |
| if (filter.hasNonNullValue(TE.FIRST_NAME)) |
| cmd.where(TE.FIRST_NAME.like(filter.getString(TE.FIRST_NAME) + "%")); |
| if (filter.hasNonNullValue(TE.LAST_NAME)) |
| cmd.where(TE.LAST_NAME.like(filter.getString(TE.FIRST_NAME) + "%")); |
| if (filter.hasNonNullValue(TE.GENDER)) |
| cmd.where(TE.GENDER.is(filter.getValue(TE.GENDER))); |
| if (filter.hasNonNullValue(TE.DEPARTMENT_ID)) |
| cmd.where(TE.DEPARTMENT_ID.is(filter.getValue(TE.DEPARTMENT_ID))); |
| |
| |
| DBColumnExpr[] cols = cmd.getSelectExprList(); |
| JsoColumnMeta[] meta = new JsoColumnMeta[cols.length]; |
| TextResolver txtres = SampleServiceApp.instance().getTextResolver(Locale.ENGLISH); |
| for (int i=0; i<meta.length; i++) |
| { |
| meta[i] = new JsoColumnMeta(cols[i], txtres); |
| } |
| |
| DBReader reader = new DBReader(); |
| List<JsoRecordData> list = new ArrayList<>(); |
| try { |
| reader.open(cmd, getConnection()); |
| while (reader.moveNext()) { |
| list.add(new JsoRecordData(reader)); |
| } |
| } finally { |
| reader.close(); |
| } |
| // done |
| return Response.ok(new JsoResultWithMeta(list, meta)).build(); |
| } |
| |
| @GET |
| @Path("/get/{employeeId}") |
| @Produces(MediaType.APPLICATION_JSON) |
| public Response getEmployee(@PathParam("employeeId") int employeeId) { |
| |
| RecordContext ctx = this.getRecordContext(); |
| try { |
| // return a record |
| EmployeeRecord rec = new EmployeeRecord(getDatabase(), ctx); |
| rec.read(employeeId); |
| JsoRecordData emp = new JsoRecordData(rec); |
| return Response.ok(new JsoResultWithMeta(emp, rec.getMeta())).build(); |
| |
| } catch(EmpireException e) { |
| log.error("Unable to load employee with id {}", employeeId); |
| return getErrorResponse(e, ctx); |
| } |
| } |
| |
| @GET |
| @Path("/add") |
| @Produces(MediaType.APPLICATION_JSON) |
| public Response addEmployee() { |
| |
| RecordContext ctx = this.getRecordContext(); |
| try { |
| // return a record |
| EmployeeRecord rec = new EmployeeRecord(getDatabase(), ctx); |
| rec.create(); |
| JsoRecordData emp = new JsoRecordData(rec); |
| return Response.ok(new JsoResultWithMeta(emp, rec.getMeta())).build(); |
| |
| } catch(EmpireException e) { |
| log.error("Unable to create an employee record"); |
| return getErrorResponse(e, ctx); |
| } |
| } |
| |
| @POST |
| @Path("/update") |
| @Consumes(MediaType.APPLICATION_JSON) |
| @Produces(MediaType.APPLICATION_JSON) |
| public Response updateEmployee(JsoRecordData employeeData) { |
| |
| RecordContext ctx = this.getRecordContext(); |
| try { |
| // return a record |
| EmployeeRecord rec = new EmployeeRecord(getDatabase(), ctx); |
| rec.init(employeeData, employeeData.isNewRecord()); |
| rec.update(); |
| return Response.ok().build(); |
| |
| } catch(RecordInitException e) { |
| log.error("Record initialization failed due to {}", e.getMessage()); |
| return getErrorResponse(e.getFieldExeptions(), ctx); |
| |
| } catch(EmpireException e) { |
| log.error("Unable to update employee with id {}", employeeData.get("employeeId")); |
| return getErrorResponse(e, ctx); |
| } |
| } |
| |
| @GET |
| @Path("/delete/{employeeId}") |
| @Produces(MediaType.APPLICATION_JSON) |
| public Response deleteEmployee(@PathParam("employeeId") int employeeId) { |
| |
| RecordContext ctx = this.getRecordContext(); |
| try { |
| // return a record |
| SampleDB db = getDatabase(); |
| db.T_EMPLOYEES.deleteRecord(employeeId, ctx.getConnection()); |
| return Response.ok().build(); |
| |
| } catch(EmpireException e) { |
| log.error("Unable to delete employee with id {}", employeeId); |
| return getErrorResponse(e, ctx); |
| } |
| } |
| |
| } |