# HG changeset patch # User Raimund Renkert # Date 1460561832 -7200 # Node ID e5a9c27047a4fb2eacff475588bdf46e3196776c # Parent 9f6b1df4b1e6e5494b61c652952d6e821badb68e Updated stammdaten services: allow multiselect filters and check duplicates before update or insert diff -r 9f6b1df4b1e6 -r e5a9c27047a4 src/main/java/de/intevation/lada/rest/stamm/DatensatzErzeugerService.java --- a/src/main/java/de/intevation/lada/rest/stamm/DatensatzErzeugerService.java Fri Apr 08 19:36:25 2016 +0200 +++ b/src/main/java/de/intevation/lada/rest/stamm/DatensatzErzeugerService.java Wed Apr 13 17:37:12 2016 +0200 @@ -121,7 +121,16 @@ if (param == null || param.isEmpty()) { continue; } - builder.or(filter.getDataIndex(), param); + if (filter.getMultiselect()) { + param = param.trim(); + String[] parts = param.split(","); + for (String part: parts) { + builder.or(filter.getDataIndex(), part); + } + } + else { + builder.or(filter.getDataIndex(), param); + } } erzeuger = repository.filterPlain(builder.getQuery(), "stamm"); @@ -189,8 +198,20 @@ ) { return new Response(false, 699, datensatzerzeuger); } + QueryBuilder builder = + new QueryBuilder( + repository.entityManager("stamm"), + DatensatzErzeuger.class + ); + builder.and("daErzeugerId", datensatzerzeuger.getDaErzeugerId()); + builder.and("netzbetreiberId", datensatzerzeuger.getNetzbetreiberId()); - return repository.create(datensatzerzeuger, "stamm"); + List erzeuger = + repository.filterPlain(builder.getQuery(), "stamm"); + if (erzeuger.isEmpty()) { + return repository.create(datensatzerzeuger, "stamm"); + } + return new Response(false, 672, null); } @PUT @@ -208,8 +229,21 @@ ) { return new Response(false, 699, datensatzerzeuger); } + QueryBuilder builder = + new QueryBuilder( + repository.entityManager("stamm"), + DatensatzErzeuger.class + ); + builder.and("daErzeugerId", datensatzerzeuger.getDaErzeugerId()); + builder.and("netzbetreiberId", datensatzerzeuger.getNetzbetreiberId()); - return repository.update(datensatzerzeuger, "stamm"); + List erzeuger = + repository.filterPlain(builder.getQuery(), "stamm"); + if (erzeuger.isEmpty() || + erzeuger.get(0).getId() == datensatzerzeuger.getId()) { + return repository.update(datensatzerzeuger, "stamm"); + } + return new Response(false, 672, null); } @DELETE diff -r 9f6b1df4b1e6 -r e5a9c27047a4 src/main/java/de/intevation/lada/rest/stamm/MessprogrammKategorieService.java --- a/src/main/java/de/intevation/lada/rest/stamm/MessprogrammKategorieService.java Fri Apr 08 19:36:25 2016 +0200 +++ b/src/main/java/de/intevation/lada/rest/stamm/MessprogrammKategorieService.java Wed Apr 13 17:37:12 2016 +0200 @@ -120,7 +120,16 @@ if (param == null || param.isEmpty()) { continue; } - mBuilder.or(filter.getDataIndex(), param); + if (filter.getMultiselect()) { + param = param.trim(); + String[] parts = param.split(","); + for (String part: parts) { + mBuilder.or(filter.getDataIndex(), part); + } + } + else { + mBuilder.or(filter.getDataIndex(), param); + } } kategorie = repository.filterPlain(mBuilder.getQuery(), "stamm"); @@ -187,8 +196,21 @@ ) { return new Response(false, 699, kategorie); } + QueryBuilder builder = + new QueryBuilder( + repository.entityManager("stamm"), + MessprogrammKategorie.class + ); + builder.and("ortId", kategorie.getMplId()); + builder.and("netzbetreiberId", kategorie.getNetzbetreiberId()); - return repository.create(kategorie, "stamm"); + List kategorien = + repository.filterPlain(builder.getQuery(), "stamm"); + if (kategorien.isEmpty() || + kategorien.get(0).getId() == kategorie.getId()) { + return repository.create(kategorie, "stamm"); + } + return new Response(false, 672, null); } @PUT @@ -206,8 +228,21 @@ ) { return new Response(false, 699, kategorie); } + QueryBuilder builder = + new QueryBuilder( + repository.entityManager("stamm"), + MessprogrammKategorie.class + ); + builder.and("ortId", kategorie.getMplId()); + builder.and("netzbetreiberId", kategorie.getNetzbetreiberId()); - return repository.update(kategorie, "stamm"); + List kategorien = + repository.filterPlain(builder.getQuery(), "stamm"); + if (kategorien.isEmpty() || + kategorien.get(0).getId() == kategorie.getId()) { + return repository.update(kategorie, "stamm"); + } + return new Response(false, 672, null); } @DELETE diff -r 9f6b1df4b1e6 -r e5a9c27047a4 src/main/java/de/intevation/lada/rest/stamm/OrtService.java --- a/src/main/java/de/intevation/lada/rest/stamm/OrtService.java Fri Apr 08 19:36:25 2016 +0200 +++ b/src/main/java/de/intevation/lada/rest/stamm/OrtService.java Wed Apr 13 17:37:12 2016 +0200 @@ -25,6 +25,7 @@ import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.UriInfo; +import de.intevation.lada.model.stamm.Filter; import de.intevation.lada.model.stamm.Ort; import de.intevation.lada.util.annotation.AuthorizationConfig; import de.intevation.lada.util.annotation.RepositoryConfig; @@ -83,7 +84,7 @@ */ @Inject @RepositoryConfig(type=RepositoryType.RW) - private Repository defaultRepo; + private Repository repository; @Inject @AuthorizationConfig(type=AuthorizationType.HEADER) @@ -107,38 +108,86 @@ @Context UriInfo info ) { MultivaluedMap params = info.getQueryParameters(); - if (params.isEmpty() || !params.containsKey("ortId")) { - List orte = defaultRepo.getAllPlain(Ort.class, "stamm"); - int size = orte.size(); - if (params.containsKey("start") && params.containsKey("limit")) { - int start = Integer.valueOf(params.getFirst("start")); - int limit = Integer.valueOf(params.getFirst("limit")); - int end = limit + start; - if (limit == 0) { - end = orte.size(); - } - else if (start + limit > orte.size()) { - end = orte.size(); - } - orte = orte.subList(start, end); + List orte = repository.getAllPlain(Ort.class, "stamm"); + if (params.containsKey("ortId")) { + Integer id; + try { + id = Integer.valueOf(params.getFirst("qid")); } - for (Ort o : orte) { - o.setReadonly( - !authorization.isAuthorized( - request, - o, - RequestMethod.POST, - Ort.class)); + catch (NumberFormatException e) { + return new Response(false, 603, "Not a valid filter id"); } - return new Response(true, 200, orte, size); + + Ort o = repository.getByIdPlain(Ort.class, id, "stamm"); + o.setReadonly( + !authorization.isAuthorized( + request, + o, + RequestMethod.POST, + Ort.class)); + return new Response(true, 200, o); } - String ortId = params.getFirst("ortId"); - QueryBuilder builder = - new QueryBuilder( - defaultRepo.entityManager("stamm"), - Ort.class); - builder.and("id", ortId); - return defaultRepo.filter(builder.getQuery(), "stamm"); + if (params.containsKey("qid")) { + Integer id = null; + try { + id = Integer.valueOf(params.getFirst("qid")); + } + catch (NumberFormatException e) { + return new Response(false, 603, "Not a valid filter id"); + } + QueryBuilder fBuilder = new QueryBuilder( + repository.entityManager("stamm"), + Filter.class + ); + fBuilder.and("query", id); + List filters = repository.filterPlain(fBuilder.getQuery(), "stamm"); + QueryBuilder builder = + new QueryBuilder( + repository.entityManager("stamm"), + Ort.class + ); + for (Filter filter: filters) { + String param = params.get(filter.getDataIndex()).get(0); + if (param == null || param.isEmpty()) { + continue; + } + if (filter.getMultiselect()) { + param = param.trim(); + String[] parts = param.split(","); + for (String part: parts) { + builder.or(filter.getDataIndex(), part); + } + } + else { + builder.or(filter.getDataIndex(), param); + } + } + + orte = repository.filterPlain(builder.getQuery(), "stamm"); + } + + int size = orte.size(); + if (params.containsKey("start") && params.containsKey("limit")) { + int start = Integer.valueOf(params.getFirst("start")); + int limit = Integer.valueOf(params.getFirst("limit")); + int end = limit + start; + if (limit == 0) { + end = orte.size(); + } + else if (start + limit > orte.size()) { + end = orte.size(); + } + orte = orte.subList(start, end); + } + for (Ort o : orte) { + o.setReadonly( + !authorization.isAuthorized( + request, + o, + RequestMethod.POST, + Ort.class)); + } + return new Response(true, 200, orte, size); } /** @@ -157,7 +206,7 @@ @Context HttpHeaders headers, @PathParam("id") String id ) { - return defaultRepo.getById( + return repository.getById( Ort.class, Integer.valueOf(id), "stamm"); @@ -204,8 +253,21 @@ ) { return new Response(false, 699, ort); } - /* Persist the new object*/ - return defaultRepo.create(ort, "stamm"); + QueryBuilder builder = + new QueryBuilder( + repository.entityManager("stamm"), + Ort.class + ); + builder.and("ortId", ort.getOrtId()); + builder.and("netzbetreiberId", ort.getNetzbetreiberId()); + + List orte = + repository.filterPlain(builder.getQuery(), "stamm"); + if (orte.isEmpty() || + orte.get(0).getId() == ort.getId()) { + return repository.create(ort, "stamm"); + } + return new Response(false, 672, null); } /** @@ -250,11 +312,21 @@ ) { return new Response(false, 699, ort); } - Response response = defaultRepo.update(ort, "stamm"); - Response updated = defaultRepo.getById( - Ort.class, - ((Ort)response.getData()).getId(), "stamm"); - return updated; + QueryBuilder builder = + new QueryBuilder( + repository.entityManager("stamm"), + Ort.class + ); + builder.and("ortId", ort.getOrtId()); + builder.and("netzbetreiberId", ort.getNetzbetreiberId()); + + List orte = + repository.filterPlain(builder.getQuery(), "stamm"); + if (orte.isEmpty() || + orte.get(0).getId() == ort.getId()) { + return repository.update(ort, "stamm"); + } + return new Response(false, 672, null); } /** @@ -275,7 +347,7 @@ ) { /* Get the object by id*/ Ort ort = - defaultRepo.getByIdPlain(Ort.class, Integer.valueOf(id), "stamm"); + repository.getByIdPlain(Ort.class, Integer.valueOf(id), "stamm"); if (!authorization.isAuthorized( request, ort, @@ -285,6 +357,6 @@ return new Response(false, 699, ort); } /* Delete the object*/ - return defaultRepo.delete(ort, "stamm"); + return repository.delete(ort, "stamm"); } } diff -r 9f6b1df4b1e6 -r e5a9c27047a4 src/main/java/de/intevation/lada/rest/stamm/ProbenehmerService.java --- a/src/main/java/de/intevation/lada/rest/stamm/ProbenehmerService.java Fri Apr 08 19:36:25 2016 +0200 +++ b/src/main/java/de/intevation/lada/rest/stamm/ProbenehmerService.java Wed Apr 13 17:37:12 2016 +0200 @@ -25,6 +25,7 @@ import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.UriInfo; +import de.intevation.lada.model.stamm.DatensatzErzeuger; import de.intevation.lada.model.stamm.Filter; import de.intevation.lada.model.stamm.Probenehmer; import de.intevation.lada.util.annotation.AuthorizationConfig; @@ -118,14 +119,20 @@ if (param == null || param.isEmpty()) { continue; } - builder.or(filter.getDataIndex(), param); + if (filter.getMultiselect()) { + param = param.trim(); + String[] parts = param.split(","); + for (String part: parts) { + builder.or(filter.getDataIndex(), part); + } + } + else { + builder.or(filter.getDataIndex(), param); + } } nehmer = repository.filterPlain(builder.getQuery(), "stamm"); } - else { - nehmer = repository.getAllPlain(Probenehmer.class, "stamm"); - } int size = nehmer.size(); if (params.containsKey("start") && params.containsKey("limit")) { @@ -186,8 +193,20 @@ ) { return new Response(false, 699, probenehmer); } + QueryBuilder builder = + new QueryBuilder( + repository.entityManager("stamm"), + Probenehmer.class + ); + builder.and("prnId", probenehmer.getPrnId()); + builder.and("netzbetreiberId", probenehmer.getNetzbetreiberId()); - return repository.create(probenehmer, "stamm"); + List nehmer= + repository.filterPlain(builder.getQuery(), "stamm"); + if (nehmer.isEmpty()) { + return repository.create(probenehmer, "stamm"); + } + return new Response(false, 672, null); } @PUT @@ -205,8 +224,21 @@ ) { return new Response(false, 699, probenehmer); } + QueryBuilder builder = + new QueryBuilder( + repository.entityManager("stamm"), + Probenehmer.class + ); + builder.and("prnId", probenehmer.getPrnId()); + builder.and("netzbetreiberId", probenehmer.getNetzbetreiberId()); - return repository.update(probenehmer, "stamm"); + List nehmer= + repository.filterPlain(builder.getQuery(), "stamm"); + if (nehmer.isEmpty() || + nehmer.get(0).getId() == probenehmer.getId()) { + return repository.update(probenehmer, "stamm"); + } + return new Response(false, 672, null); } @DELETE