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: }