raimund@836: /* Copyright (C) 2013 by Bundesamt fuer Strahlenschutz raimund@836: * Software engineering by Intevation GmbH raimund@836: * raimund@836: * This file is Free Software under the GNU GPL (v>=3) raimund@836: * and comes with ABSOLUTELY NO WARRANTY! Check out raimund@836: * the documentation coming with IMIS-Labordaten-Application for details. raimund@836: */ raimund@836: package de.intevation.lada.rest.stamm; raimund@836: raimund@843: import java.util.List; raimund@843: raimund@836: import javax.enterprise.context.RequestScoped; raimund@836: import javax.inject.Inject; raimund@836: import javax.servlet.http.HttpServletRequest; raimund@836: import javax.ws.rs.DELETE; raimund@836: import javax.ws.rs.GET; raimund@836: import javax.ws.rs.POST; raimund@836: import javax.ws.rs.PUT; raimund@836: import javax.ws.rs.Path; raimund@836: import javax.ws.rs.PathParam; raimund@836: import javax.ws.rs.Produces; raimund@836: import javax.ws.rs.core.Context; raimund@836: import javax.ws.rs.core.HttpHeaders; raimund@836: import javax.ws.rs.core.MediaType; raimund@843: import javax.ws.rs.core.MultivaluedMap; raimund@836: import javax.ws.rs.core.UriInfo; raimund@836: tom@1097: import de.intevation.lada.model.stammdaten.Filter; tom@1097: import de.intevation.lada.model.stammdaten.MessprogrammKategorie; raimund@836: import de.intevation.lada.util.annotation.AuthorizationConfig; raimund@836: import de.intevation.lada.util.annotation.RepositoryConfig; raimund@836: import de.intevation.lada.util.auth.Authorization; raimund@836: import de.intevation.lada.util.auth.AuthorizationType; raimund@848: import de.intevation.lada.util.data.QueryBuilder; raimund@836: import de.intevation.lada.util.data.Repository; raimund@836: import de.intevation.lada.util.data.RepositoryType; raimund@836: import de.intevation.lada.util.rest.RequestMethod; raimund@836: import de.intevation.lada.util.rest.Response; raimund@836: raimund@836: /** raimund@836: * REST service for DatensatzErzeuger objects. raimund@836: *

raimund@836: * The services produce data in the application/json media type. raimund@836: * A typical response holds information about the action performed and the data. raimund@836: *

raimund@836:  * 
raimund@836:  * {
raimund@836:  *  "success": [boolean];
raimund@836:  *  "message": [string],
raimund@836:  *  "data":[{
raimund@836:  *      "id": [number],
raimund@836:  *      "bezeichnung": [string],
raimund@836:  *      "daErzeugerId": [string],
raimund@836:  *      "letzteAenderung": [timestamp],
raimund@836:  *      "mstId": [string],
raimund@836:  *      "netzbetreiberId": [string]
raimund@836:  *  }],
raimund@836:  *  "errors": [object],
raimund@836:  *  "warnings": [object],
raimund@836:  *  "readonly": [boolean],
raimund@836:  *  "totalCount": [number]
raimund@836:  * }
raimund@836:  * 
raimund@836:  * 
raimund@836: * raimund@836: * @author Raimund Renkert raimund@836: */ raimund@836: @Path("rest/messprogrammkategorie") raimund@836: @RequestScoped raimund@836: public class MessprogrammKategorieService { raimund@836: raimund@836: /** raimund@836: * The data repository granting read access. raimund@836: */ raimund@836: @Inject raimund@836: @RepositoryConfig(type=RepositoryType.RW) raimund@836: private Repository repository; raimund@836: raimund@836: @Inject raimund@836: @AuthorizationConfig(type=AuthorizationType.HEADER) raimund@836: private Authorization authorization; raimund@836: raimund@836: /** raimund@836: * Get all Datenbasis objects. raimund@836: *

raimund@836: * Example: http://example.com/messprogrammkategorie raimund@836: * raimund@836: * @return Response object containing all objects. raimund@836: */ raimund@836: @GET raimund@836: @Path("/") raimund@836: @Produces(MediaType.APPLICATION_JSON) raimund@836: public Response get( raimund@843: @Context HttpServletRequest request, raimund@836: @Context UriInfo info raimund@836: ) { raimund@843: MultivaluedMap params = info.getQueryParameters(); raimund@848: List kategorie; raimund@848: if (params.containsKey("qid")) { raimund@848: Integer id = null; raimund@848: try { raimund@848: id = Integer.valueOf(params.getFirst("qid")); raimund@848: } raimund@848: catch (NumberFormatException e) { raimund@848: return new Response(false, 603, "Not a valid filter id"); raimund@848: } raimund@848: QueryBuilder fBuilder = new QueryBuilder( raimund@848: repository.entityManager("stamm"), raimund@848: Filter.class raimund@848: ); raimund@848: fBuilder.and("query", id); raimund@848: List filters = repository.filterPlain(fBuilder.getQuery(), "stamm"); raimund@848: QueryBuilder mBuilder = raimund@848: new QueryBuilder( raimund@848: repository.entityManager("stamm"), raimund@848: MessprogrammKategorie.class raimund@848: ); raimund@848: for (Filter filter: filters) { raimund@848: String param = params.get(filter.getDataIndex()).get(0); raimund@848: if (param == null || param.isEmpty()) { raimund@848: continue; raimund@848: } raimund@919: if (filter.getMultiselect()) { raimund@919: param = param.trim(); raimund@919: String[] parts = param.split(","); raimund@919: for (String part: parts) { raimund@919: mBuilder.or(filter.getDataIndex(), part); raimund@919: } raimund@919: } raimund@919: else { raimund@919: mBuilder.or(filter.getDataIndex(), param); raimund@919: } raimund@848: } raimund@848: raimund@848: kategorie = repository.filterPlain(mBuilder.getQuery(), "stamm"); raimund@848: } raimund@848: else { raimund@848: kategorie = repository.getAllPlain(MessprogrammKategorie.class, "stamm"); raimund@848: } raimund@843: int size = kategorie.size(); ehuber@1312: if (params.containsKey("qid")) { ehuber@1312: if (params.containsKey("start") && params.containsKey("limit")) { ehuber@1312: int start = Integer.valueOf(params.getFirst("start")); ehuber@1312: int limit = Integer.valueOf(params.getFirst("limit")); ehuber@1312: int end = limit + start; ehuber@1312: if (start + limit > kategorie.size()) { ehuber@1312: end = kategorie.size(); ehuber@1312: } ehuber@1312: kategorie = kategorie.subList(start, end); raimund@843: } raimund@843: } raimund@843: raimund@843: for (MessprogrammKategorie mk : kategorie) { raimund@843: mk.setReadonly( raimund@843: !authorization.isAuthorized( raimund@843: request, raimund@843: mk, raimund@843: RequestMethod.POST, raimund@843: MessprogrammKategorie.class)); raimund@843: } raimund@843: return new Response(true, 200, kategorie, size); raimund@836: } raimund@836: raimund@836: /** raimund@836: * Get a single object by id. raimund@836: *

raimund@836: * The id is appended to the URL as a path parameter. raimund@836: *

raimund@836: * Example: http://example.com/messprogrammkategorie/{id} raimund@836: * raimund@836: * @return Response object containing a single object. raimund@836: */ raimund@836: @GET raimund@836: @Path("/{id}") raimund@836: @Produces(MediaType.APPLICATION_JSON) raimund@836: public Response getById( raimund@836: @Context HttpHeaders headers, raimund@836: @PathParam("id") String id raimund@836: ) { raimund@836: return repository.getById( raimund@836: MessprogrammKategorie.class, raimund@836: Integer.valueOf(id), raimund@836: "stamm"); raimund@836: } raimund@836: raimund@836: @POST raimund@836: @Path("/") raimund@836: @Produces(MediaType.APPLICATION_JSON) raimund@836: public Response create( raimund@836: @Context HttpServletRequest request, raimund@836: MessprogrammKategorie kategorie raimund@836: ) { raimund@836: if (!authorization.isAuthorized( raimund@836: request, raimund@836: kategorie, raimund@836: RequestMethod.POST, raimund@836: MessprogrammKategorie.class) raimund@836: ) { raimund@836: return new Response(false, 699, kategorie); raimund@836: } raimund@919: QueryBuilder builder = raimund@919: new QueryBuilder( raimund@919: repository.entityManager("stamm"), raimund@919: MessprogrammKategorie.class raimund@919: ); tom@1097: builder.and("code", kategorie.getCode()); raimund@919: builder.and("netzbetreiberId", kategorie.getNetzbetreiberId()); raimund@836: raimund@919: List kategorien = raimund@919: repository.filterPlain(builder.getQuery(), "stamm"); raimund@919: if (kategorien.isEmpty() || raimund@919: kategorien.get(0).getId() == kategorie.getId()) { raimund@919: return repository.create(kategorie, "stamm"); raimund@919: } raimund@919: return new Response(false, 672, null); raimund@836: } raimund@836: raimund@836: @PUT raimund@836: @Path("/{id}") raimund@836: @Produces(MediaType.APPLICATION_JSON) raimund@836: public Response update( raimund@836: @Context HttpServletRequest request, tom@1097: @PathParam("id") String id, raimund@836: MessprogrammKategorie kategorie raimund@836: ) { raimund@836: if (!authorization.isAuthorized( raimund@836: request, raimund@836: kategorie, raimund@836: RequestMethod.PUT, raimund@836: MessprogrammKategorie.class) raimund@836: ) { raimund@836: return new Response(false, 699, kategorie); raimund@836: } raimund@939: return repository.update(kategorie, "stamm"); raimund@836: } raimund@836: raimund@836: @DELETE raimund@836: @Path("/{id}") raimund@836: @Produces(MediaType.APPLICATION_JSON) raimund@836: public Response delete( raimund@836: @Context HttpServletRequest request, raimund@836: @PathParam("id") String id raimund@836: ) { raimund@836: MessprogrammKategorie kategorie = repository.getByIdPlain( raimund@836: MessprogrammKategorie.class, Integer.valueOf(id), "stamm"); raimund@836: if (kategorie == null || raimund@836: !authorization.isAuthorized( raimund@836: request, raimund@836: kategorie, raimund@836: RequestMethod.DELETE, raimund@836: MessprogrammKategorie.class raimund@836: ) raimund@836: ) { raimund@836: return new Response(false, 699, null); raimund@836: } raimund@836: return repository.delete(kategorie, "stamm"); raimund@836: } raimund@836: }