raimund@637: /* Copyright (C) 2013 by Bundesamt fuer Strahlenschutz
raimund@637: * Software engineering by Intevation GmbH
raimund@637: *
raimund@637: * This file is Free Software under the GNU GPL (v>=3)
raimund@637: * and comes with ABSOLUTELY NO WARRANTY! Check out
raimund@637: * the documentation coming with IMIS-Labordaten-Application for details.
raimund@637: */
raimund@637: package de.intevation.lada.rest;
raimund@637:
raimund@637: import java.io.StringReader;
raimund@637: import java.sql.Timestamp;
raimund@637: import java.util.ArrayList;
raimund@637: import java.util.Date;
raimund@637: import java.util.List;
raimund@637: import java.util.Map;
raimund@637:
raimund@637: import javax.enterprise.context.RequestScoped;
raimund@637: import javax.inject.Inject;
raimund@637: import javax.json.Json;
raimund@637: import javax.json.JsonArray;
raimund@637: import javax.json.JsonException;
raimund@637: import javax.json.JsonObject;
raimund@637: import javax.json.JsonReader;
raimund@637: import javax.persistence.Query;
raimund@637: import javax.servlet.http.HttpServletRequest;
raimund@637: import javax.ws.rs.DELETE;
raimund@637: import javax.ws.rs.GET;
raimund@637: import javax.ws.rs.POST;
raimund@637: import javax.ws.rs.PUT;
raimund@637: import javax.ws.rs.Path;
raimund@637: import javax.ws.rs.PathParam;
raimund@637: import javax.ws.rs.Produces;
raimund@637: import javax.ws.rs.core.Context;
raimund@637: import javax.ws.rs.core.MediaType;
raimund@637: import javax.ws.rs.core.MultivaluedMap;
raimund@637: import javax.ws.rs.core.UriInfo;
raimund@637:
raimund@697: import de.intevation.lada.factory.ProbeFactory;
raimund@637: import de.intevation.lada.model.land.Messprogramm;
raimund@637: import de.intevation.lada.query.QueryTools;
raimund@637: import de.intevation.lada.util.annotation.AuthorizationConfig;
raimund@637: import de.intevation.lada.util.annotation.RepositoryConfig;
raimund@637: import de.intevation.lada.util.auth.Authorization;
raimund@637: import de.intevation.lada.util.auth.AuthorizationType;
raimund@637: import de.intevation.lada.util.data.Repository;
raimund@637: import de.intevation.lada.util.data.RepositoryType;
raimund@637: import de.intevation.lada.util.rest.RequestMethod;
raimund@637: import de.intevation.lada.util.rest.Response;
raimund@637:
raimund@637: /**
raimund@637: * REST service for Messprogramm objects.
raimund@637: *
raimund@637: * The services produce data in the application/json media type.
raimund@637: * All HTTP methods use the authorization module to determine if the user is
raimund@637: * allowed to perform the requested action.
raimund@637: * A typical response holds information about the action performed and the data.
raimund@637: *
raimund@637: *
raimund@637: * {
raimund@637: * "success": [boolean];
raimund@637: * "message": [string],
raimund@637: * "data":[{
raimund@711: * "id": [number],
raimund@711: * "baId": [string],
raimund@711: * "datenbasisId": [number],
raimund@711: * "gemId": [string],
raimund@711: * "gueltigBis": [date],
raimund@711: * "gueltigVon": [date],
raimund@711: * "intervallOffset": [number],
raimund@711: * "letzteAenderung": [timestamp],
raimund@711: * "mediaDesk": [string],
raimund@711: * "mstId": [string],
raimund@711: * "name": [string],
raimund@711: * "netzbetreiberId": [string],
raimund@711: * "ortId": [string],
raimund@711: * "probeKommentar": [string],
raimund@711: * "probeNehmerId": [number],
raimund@711: * "probenartId": [number],
raimund@711: * "probenintervall": [string],
raimund@711: * "teilintervallBis": [number],
raimund@711: * "teilintervallVon": [number],
raimund@711: * "test": [boolean],
raimund@711: * "umwId": [string]
raimund@637: * }],
raimund@637: * "errors": [object],
raimund@637: * "warnings": [object],
raimund@637: * "readonly": [boolean],
raimund@637: * "totalCount": [number]
raimund@637: * }
raimund@637: *
raimund@637: *
raimund@637: *
raimund@637: * @author Raimund Renkert
raimund@637: */
raimund@827: @Path("rest/messprogramm")
raimund@637: @RequestScoped
raimund@637: public class MessprogrammService {
raimund@637:
raimund@637: /**
raimund@637: * The data repository granting read/write access.
raimund@637: */
raimund@637: @Inject
raimund@637: @RepositoryConfig(type=RepositoryType.RW)
raimund@637: private Repository defaultRepo;
raimund@637:
raimund@637: /**
raimund@637: * The authorization module.
raimund@637: */
raimund@637: @Inject
raimund@722: @AuthorizationConfig(type=AuthorizationType.HEADER)
raimund@637: private Authorization authorization;
raimund@637:
raimund@697: @Inject
raimund@697: private ProbeFactory factory;
raimund@697:
raimund@637: /**
raimund@637: * Get all Messprogramm objects.
raimund@637: *
raimund@637: * The requested objects can be filtered using the following URL
raimund@637: * parameters:
raimund@637: * * qid: The id of the query.
raimund@637: * * page: The page to display in a paginated result grid.
raimund@637: * * start: The first Probe item.
raimund@637: * * limit: The count of Probe items.
raimund@637: * * sort: Sort the result ascending(ASC) or descenting (DESC).
raimund@637: *
raimund@660: * The response data contains a stripped set of Messprogramm objects. The returned fields
raimund@637: * are defined in the query used in the request.
raimund@637: *
raimund@637: * Example:
raimund@660: * http://example.com/messprogramm?qid=[ID]&page=[PAGE]&start=[START]&limit=[LIMIT]&sort=[{"property":"messprogrammId","direction":"ASC"}]
raimund@637: *
raimund@637: * @return Response object containing all Messprogramm objects.
raimund@637: */
raimund@637: @GET
raimund@637: @Path("/")
raimund@637: @Produces(MediaType.APPLICATION_JSON)
raimund@637: public Response get(
raimund@637: @Context UriInfo info,
raimund@637: @Context HttpServletRequest request
raimund@637: ) {
raimund@637: MultivaluedMap params = info.getQueryParameters();
raimund@637: if (params.isEmpty() || !params.containsKey("qid")) {
raimund@637: return defaultRepo.getAll(Messprogramm.class, "land");
raimund@637: }
raimund@637: String qid = params.getFirst("qid");
raimund@637: JsonObject jsonQuery = QueryTools.getMpQueryById(qid);
raimund@637: String sql = "";
raimund@637: List filters = new ArrayList();
raimund@637: List results = new ArrayList();
raimund@637: try {
raimund@637: sql = jsonQuery.getString("sql");
raimund@637: if (params.containsKey("sort")) {
raimund@637: String sort = params.getFirst("sort");
raimund@637: JsonReader reader = Json.createReader(new StringReader(sort));
raimund@637: JsonObject sortProperties = reader.readArray().getJsonObject(0);
raimund@637: sql += " ORDER BY ";
raimund@637: sql += sortProperties.getJsonString("property").getString() + " ";
raimund@637: sql += sortProperties.getJsonString("direction").getString();
raimund@637: }
raimund@637: JsonArray jsonFilters = jsonQuery.getJsonArray("filters");
raimund@637: JsonArray jsonResults = jsonQuery.getJsonArray("result");
raimund@637: for (int i = 0; i < jsonFilters.size(); i++) {
raimund@637: filters.add(
raimund@637: jsonFilters.getJsonObject(i).getString("dataIndex"));
raimund@637: }
raimund@637: results.add("id");
raimund@637: for (int i = 0; i < jsonResults.size(); i++) {
raimund@637: results.add(
raimund@637: jsonResults.getJsonObject(i).getString("dataIndex"));
raimund@637: }
raimund@637: }
raimund@637: catch (JsonException je) {
raimund@637: return new Response(false, 603, new ArrayList());
raimund@637: }
raimund@637: Query query = QueryTools.prepareQuery(
raimund@637: sql,
raimund@637: filters,
raimund@637: params,
raimund@637: defaultRepo.entityManager("land"));
raimund@637: @SuppressWarnings("unchecked")
raimund@637: List> result =
raimund@637: QueryTools.prepareResult(query.getResultList(), results);
raimund@637: if (params.containsKey("start") && params.containsKey("limit")) {
raimund@637: int start = Integer.valueOf(params.getFirst("start"));
raimund@637: int limit = Integer.valueOf(params.getFirst("limit"));
raimund@637: int end = limit + start;
raimund@637: if (start + limit > result.size()) {
raimund@637: end = result.size();
raimund@637: }
raimund@637: List> subList = result.subList(start, end);
raimund@637: return new Response(true, 200, subList, result.size());
raimund@637: }
raimund@637: return new Response(true, 200, result, result.size());
raimund@637: }
raimund@637:
raimund@637: /**
raimund@637: * Get a Messprogramm object by id.
raimund@637: *
raimund@637: * The id is appended to the URL as a path parameter.
raimund@637: *
raimund@637: * Example: http://example.com/messprogramm/{id}
raimund@637: *
raimund@637: * @return Response object containing a single Messprogramm.
raimund@637: */
raimund@637: @GET
raimund@637: @Path("/{id}")
raimund@637: @Produces(MediaType.APPLICATION_JSON)
raimund@637: public Response getById(
raimund@637: @Context HttpServletRequest request,
raimund@637: @PathParam("id") String id
raimund@637: ) {
raimund@637: return authorization.filter(
raimund@637: request,
raimund@637: defaultRepo.getById(Messprogramm.class, Integer.valueOf(id), "land"),
raimund@637: Messprogramm.class);
raimund@637: }
raimund@637:
raimund@637: /**
raimund@637: * Create a Messprogramm object.
raimund@637: *
raimund@637: * The new object is embedded in the post data as JSON formatted string.
raimund@637: *
raimund@637: *
raimund@637: *
raimund@637: * {
raimund@711: * "test": [boolean],
raimund@711: * "netzbetreiberId": [string],
raimund@711: * "mstId": [string],
raimund@711: * "name": [string],
raimund@711: * "datenbasisId": [number],
raimund@711: * "baId": [string],
raimund@711: * "gemId": [string],
raimund@711: * "ortId": [string],
raimund@711: * "mediaDesk": [string],
raimund@711: * "umwId": [string],
raimund@711: * "probenartId": [number],
raimund@711: * "probenintervall": [string],
raimund@711: * "teilintervallVon": [number],
raimund@711: * "teilintervallBis": [number],
raimund@711: * "intervallOffset": [string],
raimund@711: * "probeNehmerId": [number],
raimund@711: * "probeKommentar": [string],
raimund@711: * "letzteAenderung": [date]
raimund@637: * }
raimund@637: *
raimund@637: *
raimund@637: *
raimund@637: * @return A response object containing the created Messprogramm.
raimund@637: */
raimund@637: @POST
raimund@637: @Path("/")
raimund@637: @Produces(MediaType.APPLICATION_JSON)
raimund@637: public Response create(
raimund@637: @Context HttpServletRequest request,
raimund@637: Messprogramm messprogramm
raimund@637: ) {
raimund@637: if (!authorization.isAuthorized(
raimund@637: request,
raimund@637: messprogramm,
raimund@637: RequestMethod.POST,
raimund@637: Messprogramm.class)
raimund@637: ) {
raimund@637: return new Response(false, 699, null);
raimund@637: }
raimund@637:
raimund@697: if (messprogramm.getUmwId() == null || messprogramm.getUmwId().length() == 0) {
raimund@697: messprogramm = factory.findUmweltId(messprogramm);
raimund@697: }
raimund@637: /* Persist the new messprogramm object*/
raimund@637: Response response = defaultRepo.create(messprogramm, "land");
raimund@637: Messprogramm ret = (Messprogramm)response.getData();
raimund@637: Response created =
raimund@637: defaultRepo.getById(Messprogramm.class, ret.getId(), "land");
raimund@637: return authorization.filter(
raimund@637: request,
raimund@637: new Response(true, 200, created.getData()),
raimund@637: Messprogramm.class);
raimund@637: }
raimund@637:
raimund@637: /**
raimund@637: * Update an existing Messprogramm object.
raimund@637: *
raimund@637: * The object to update should come as JSON formatted string.
raimund@637: *
raimund@637: *
raimund@637: * {
raimund@711: * "id": [number],
raimund@711: * "test": [boolean],
raimund@711: * "netzbetreiberId": [string],
raimund@711: * "mstId": [string],
raimund@711: * "name": [string],
raimund@711: * "datenbasisId": [number],
raimund@711: * "baId": [string],
raimund@711: * "gemId": [string],
raimund@711: * "ortId": [string],
raimund@711: * "mediaDesk": [string],
raimund@711: * "umwId": [string],
raimund@711: * "probenartId": [number],
raimund@711: * "probenintervall": [string],
raimund@711: * "teilintervallVon": [number],
raimund@711: * "teilintervallBis": [number],
raimund@711: * "intervallOffset": [string],
raimund@711: * "probeNehmerId": [number],
raimund@711: * "probeKommentar": [string],
raimund@711: * "letzteAenderung": [date]
raimund@637: * }
raimund@637: *
raimund@637: *
raimund@637: *
raimund@637: * @return Response object containing the updated Messprogramm object.
raimund@637: */
raimund@637: @PUT
raimund@637: @Path("/{id}")
raimund@637: @Produces(MediaType.APPLICATION_JSON)
raimund@637: public Response update(
raimund@637: @Context HttpServletRequest request,
raimund@637: Messprogramm messprogramm
raimund@637: ) {
raimund@637: if (!authorization.isAuthorized(
raimund@637: request,
raimund@637: messprogramm,
raimund@637: RequestMethod.PUT,
raimund@637: Messprogramm.class)
raimund@637: ) {
raimund@637: return new Response(false, 699, null);
raimund@637: }
raimund@637: messprogramm.setLetzteAenderung(new Timestamp(new Date().getTime()));
raimund@840: if (messprogramm.getUmwId() == null || messprogramm.getUmwId().equals("")) {
raimund@840: messprogramm = factory.findUmweltId(messprogramm);
raimund@840: }
raimund@637: Response response = defaultRepo.update(messprogramm, "land");
raimund@637: Response updated = defaultRepo.getById(
raimund@637: Messprogramm.class,
raimund@637: ((Messprogramm)response.getData()).getId(), "land");
raimund@637: return authorization.filter(
raimund@637: request,
raimund@637: updated,
raimund@637: Messprogramm.class);
raimund@637: }
raimund@637:
raimund@637: /**
raimund@637: * Delete an existing Messprogramm object by id.
raimund@637: *
raimund@637: * The id is appended to the URL as a path parameter.
raimund@637: *
raimund@637: * Example: http://example.com/messprogamm/{id}
raimund@637: *
raimund@637: * @return Response object.
raimund@637: */
raimund@637: @DELETE
raimund@637: @Path("/{id}")
raimund@637: @Produces(MediaType.APPLICATION_JSON)
raimund@637: public Response delete(
raimund@637: @Context HttpServletRequest request,
raimund@637: @PathParam("id") String id
raimund@637: ) {
raimund@637: /* Get the messung object by id*/
raimund@637: Response messprogramm =
raimund@637: defaultRepo.getById(Messprogramm.class, Integer.valueOf(id), "land");
raimund@637: Messprogramm messprogrammObj = (Messprogramm)messprogramm.getData();
raimund@637: if (!authorization.isAuthorized(
raimund@637: request,
raimund@637: messprogrammObj,
raimund@637: RequestMethod.DELETE,
raimund@637: Messprogramm.class)
raimund@637: ) {
raimund@637: return new Response(false, 699, null);
raimund@637: }
raimund@637: /* Delete the messprogramm object*/
raimund@637: Response response = defaultRepo.delete(messprogrammObj, "land");
raimund@637: return response;
raimund@637: }
raimund@637: }