Mercurial > lada > lada-server
changeset 1043:1b9516c60a5a schema-update
Added json export.
author | Raimund Renkert <raimund.renkert@intevation.de> |
---|---|
date | Mon, 05 Sep 2016 10:19:23 +0200 |
parents | 3a5a9a0492d1 |
children | 434b46ead134 |
files | pom.xml src/main/java/de/intevation/lada/exporter/ExportFormat.java src/main/java/de/intevation/lada/exporter/json/JsonExporter.java src/main/java/de/intevation/lada/rest/exporter/JsonExportService.java src/main/java/de/intevation/lada/rest/exporter/LafExportService.java |
diffstat | 5 files changed, 448 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/pom.xml Mon Sep 05 10:18:38 2016 +0200 +++ b/pom.xml Mon Sep 05 10:19:23 2016 +0200 @@ -70,6 +70,16 @@ <version>2.5.1</version> </dependency> <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + <version>2.5.1</version> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>2.5</version> + </dependency> + <dependency> <groupId>org.opensaml</groupId> <artifactId>opensaml</artifactId> <version>2.6.4</version>
--- a/src/main/java/de/intevation/lada/exporter/ExportFormat.java Mon Sep 05 10:18:38 2016 +0200 +++ b/src/main/java/de/intevation/lada/exporter/ExportFormat.java Mon Sep 05 10:19:23 2016 +0200 @@ -13,5 +13,6 @@ * @author <a href="mailto:rrenkert@intevation.de">Raimund Renkert</a> */ public enum ExportFormat { - LAF + LAF, + JSON }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/de/intevation/lada/exporter/json/JsonExporter.java Mon Sep 05 10:19:23 2016 +0200 @@ -0,0 +1,328 @@ +/* Copyright (C) 2013 by Bundesamt fuer Strahlenschutz + * Software engineering by Intevation GmbH + * + * This file is Free Software under the GNU GPL (v>=3) + * and comes with ABSOLUTELY NO WARRANTY! Check out + * the documentation coming with IMIS-Labordaten-Application for details. + */ +package de.intevation.lada.exporter.json; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +import javax.inject.Inject; + +import org.apache.log4j.Logger; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; + +import de.intevation.lada.exporter.ExportConfig; +import de.intevation.lada.exporter.ExportFormat; +import de.intevation.lada.exporter.Exporter; +import de.intevation.lada.model.land.KommentarM; +import de.intevation.lada.model.land.KommentarP; +import de.intevation.lada.model.land.Messung; +import de.intevation.lada.model.land.Messwert; +import de.intevation.lada.model.land.Ortszuordnung; +import de.intevation.lada.model.land.Probe; +import de.intevation.lada.model.land.StatusProtokoll; +import de.intevation.lada.model.land.ZusatzWert; +import de.intevation.lada.model.stammdaten.Deskriptoren; +import de.intevation.lada.model.stammdaten.MessStelle; +import de.intevation.lada.model.stammdaten.Ort; +import de.intevation.lada.model.stammdaten.StatusKombi; +import de.intevation.lada.util.annotation.RepositoryConfig; +import de.intevation.lada.util.auth.UserInfo; +import de.intevation.lada.util.data.QueryBuilder; +import de.intevation.lada.util.data.Repository; +import de.intevation.lada.util.data.RepositoryType; + +@ExportConfig(format=ExportFormat.JSON) +public class JsonExporter implements Exporter { + + @Inject private Logger logger; + + @Inject + @RepositoryConfig(type=RepositoryType.RO) + private Repository repository; + + @Override + public InputStream export(List<Integer> proben, UserInfo userInfo) { + logger.debug("export json"); + String json = ""; + + //Create json. + json = createJsonString(proben, userInfo); + if (json == null) { + return null; + } + + InputStream in = new ByteArrayInputStream(json.getBytes()); + try { + in.close(); + } + catch (IOException e) { + logger.debug("Error while closing Stream."); + return null; + } + return in; + } + + private String createJsonString(List<Integer> probeIds, UserInfo userInfo) { + QueryBuilder<Probe> builder = new QueryBuilder<Probe>( + repository.entityManager("land"), + Probe.class + ); + for (Integer id : probeIds) { + builder.or("id", id); + } + List<Probe> proben = repository.filterPlain(builder.getQuery(), "land"); + final ObjectMapper mapper = new ObjectMapper(); + try { + String tmp = mapper.writeValueAsString(proben); + JsonNode nodes = mapper.readTree(tmp); + addSubObjects(nodes); + return mapper.writeValueAsString(nodes); + } catch (IOException e) { + logger.debug("Error parsing object structure."); + return null; + } + } + + private JsonNode addSubObjects(JsonNode proben) { + for (int i = 0; i < proben.size(); i++) { + addMessungen(proben.get(i)); + addKommentare(proben.get(i)); + addZusatzwerte(proben.get(i)); + addDeskriptoren(proben.get(i)); + addOrtszuordung(proben.get(i)); + addMessstelle(proben.get(i)); + } + return proben; + } + + private void addMessstelle(JsonNode node) { + MessStelle messstelle = repository.getByIdPlain( + MessStelle.class, + node.get("mstId").asText(), + "stamm"); + final ObjectMapper mapper = new ObjectMapper(); + try { + String tmp = mapper.writeValueAsString(messstelle); + JsonNode nodes = mapper.readTree(tmp); + ((ObjectNode)node).set("messstelle", nodes); + } catch (IOException e) { + logger.debug("Could not export Messstelle for Probe " + + node.get("idAlt").asText()); + } + } + + private void addMessungen(JsonNode probe) { + QueryBuilder<Messung> builder = new QueryBuilder<Messung>( + repository.entityManager("land"), + Messung.class + ); + builder.and("probeId", probe.get("id").asInt()); + List<Messung> messungen = repository.filterPlain(builder.getQuery(), "land"); + final ObjectMapper mapper = new ObjectMapper(); + try { + String tmp = mapper.writeValueAsString(messungen); + JsonNode nodes = mapper.readTree(tmp); + for (int i = 0; i < nodes.size(); i++) { + addMesswerte(nodes.get(i)); + addMessungsKommentare(nodes.get(i)); + addStatusProtokoll(nodes.get(i)); + } + ((ObjectNode)probe).set("messungen", nodes); + } catch (IOException e) { + logger.debug("Could not export Messungen for Probe " + + probe.get("idAlt").asText()); + } + } + + private void addKommentare(JsonNode probe) { + QueryBuilder<KommentarP> builder = new QueryBuilder<KommentarP>( + repository.entityManager("land"), + KommentarP.class + ); + builder.and("probeId", probe.get("id").asInt()); + List<KommentarP> kommentare = + repository.filterPlain(builder.getQuery(), "land"); + final ObjectMapper mapper = new ObjectMapper(); + try { + String tmp = mapper.writeValueAsString(kommentare); + JsonNode nodes = mapper.readTree(tmp); + ((ObjectNode)probe).set("kommentare", nodes); + } catch (IOException e) { + logger.debug("Could not export Kommentare for Probe " + + probe.get("idAlt").asText()); + } + } + + private void addZusatzwerte(JsonNode probe) { + QueryBuilder<ZusatzWert> builder = new QueryBuilder<ZusatzWert>( + repository.entityManager("land"), + ZusatzWert.class + ); + builder.and("probeId", probe.get("id").asInt()); + List<ZusatzWert> zusatzwerte= + repository.filterPlain(builder.getQuery(), "land"); + final ObjectMapper mapper = new ObjectMapper(); + try { + String tmp = mapper.writeValueAsString(zusatzwerte); + JsonNode nodes = mapper.readTree(tmp); + ((ObjectNode)probe).set("zusatzwerte", nodes); + } catch (IOException e) { + logger.debug("Could not export Zusatzwerte for Probe " + + probe.get("idAlt").asText()); + } + } + + private void addDeskriptoren(JsonNode probe) { + String desk = probe.get("mediaDesk").asText(); + String[] parts = desk.split(" "); + + QueryBuilder<Deskriptoren> builder = new QueryBuilder<Deskriptoren>( + repository.entityManager("stamm"), + Deskriptoren.class + ); + int vorgaenger = 0; + ObjectNode node = new ObjectNode(JsonNodeFactory.instance); + for (int i = 0; i < parts.length - 1; i++) { + logger.debug("ebene: " + i); + logger.debug("sn: " + Integer.parseInt(parts[i+1])); + String beschreibung = ""; + if (Integer.parseInt(parts[i+1]) != 0) { + builder.and("ebene", i); + builder.and("sn", Integer.parseInt(parts[i+1])); + logger.debug(vorgaenger); + if (vorgaenger != 0) { + builder.and("vorgaenger", vorgaenger); + } + List<Deskriptoren> found = repository.filterPlain(builder.getQuery(), "stamm"); + if (found.size() > 0) { + beschreibung = found.get(0).getBeschreibung(); + vorgaenger = found.get(0).getId(); + } + } + node.put("S" + i, beschreibung); + builder = builder.getEmptyBuilder(); + } + ((ObjectNode)probe).set("deskriptoren", node); + } + + private void addMesswerte(JsonNode node) { + QueryBuilder<Messwert> builder = new QueryBuilder<Messwert>( + repository.entityManager("land"), + Messwert.class + ); + builder.and("messungsId", node.get("id").asInt()); + List<Messwert> messwerte = + repository.filterPlain(builder.getQuery(), "land"); + final ObjectMapper mapper = new ObjectMapper(); + try { + String tmp = mapper.writeValueAsString(messwerte); + JsonNode nodes = mapper.readTree(tmp); + ((ObjectNode)node).set("messwerte", nodes); + } catch (IOException e) { + logger.debug("Could not export Messwerte for Messung " + + node.get("nebenprobenNr").asText()); + } + } + + private void addMessungsKommentare(JsonNode node) { + QueryBuilder<KommentarM> builder = new QueryBuilder<KommentarM>( + repository.entityManager("land"), + KommentarM.class + ); + builder.and("messungsId", node.get("id").asInt()); + List<KommentarM> kommentare = + repository.filterPlain(builder.getQuery(), "land"); + final ObjectMapper mapper = new ObjectMapper(); + try { + String tmp = mapper.writeValueAsString(kommentare); + JsonNode nodes = mapper.readTree(tmp); + ((ObjectNode)node).set("kommentare", nodes); + } catch (IOException e) { + logger.debug("Could not export Kommentare for Messung " + + node.get("nebenprobenNr").asText()); + } + } + + private void addStatusProtokoll(JsonNode node) { + QueryBuilder<StatusProtokoll> builder = new QueryBuilder<StatusProtokoll>( + repository.entityManager("land"), + StatusProtokoll.class + ); + builder.and("messungsId", node.get("id").asInt()); + List<StatusProtokoll> status = + repository.filterPlain(builder.getQuery(), "land"); + final ObjectMapper mapper = new ObjectMapper(); + try { + String tmp = mapper.writeValueAsString(status); + JsonNode nodes = mapper.readTree(tmp); + for (int i = 0; i < nodes.size(); i++) { + StatusKombi kombi = repository.getByIdPlain( + StatusKombi.class, + nodes.get(i).get("statusKombi").asInt(), + "stamm"); + ((ObjectNode)nodes.get(i)).put( + "statusStufe", + kombi.getStatusStufe().getStufe()); + ((ObjectNode)nodes.get(i)).put( + "statusWert", + kombi.getStatusWert().getWert()); + } + ((ObjectNode)node).set("statusprotokoll", nodes); + } catch (IOException e) { + logger.debug("Could not export Statusprotokoll for Messung " + + node.get("nebenprobenNr").asText()); + } + } + + private void addOrtszuordung(JsonNode node) { + QueryBuilder<Ortszuordnung> builder = new QueryBuilder<Ortszuordnung>( + repository.entityManager("land"), + Ortszuordnung.class + ); + builder.and("probeId", node.get("id").asInt()); + List<Ortszuordnung> ortszuordnung = + repository.filterPlain(builder.getQuery(), "land"); + final ObjectMapper mapper = new ObjectMapper(); + try { + String tmp = mapper.writeValueAsString(ortszuordnung); + JsonNode nodes = mapper.readTree(tmp); + for (int i = 0; i < nodes.size(); i++) { + addOrt(nodes.get(i)); + } + ((ObjectNode)node).set("ortszuordnung", nodes); + } catch (IOException e) { + logger.debug("Could not export Ortszuordnugen for Probe " + + node.get("idAlt").asText()); + } + } + + private void addOrt(JsonNode node) { + QueryBuilder<Ort> builder = new QueryBuilder<Ort>( + repository.entityManager("stamm"), + Ort.class + ); + builder.and("id", node.get("ortId").asInt()); + List<Ort> ort= + repository.filterPlain(builder.getQuery(), "stamm"); + final ObjectMapper mapper = new ObjectMapper(); + try { + String tmp = mapper.writeValueAsString(ort); + JsonNode nodes = mapper.readTree(tmp); + ((ObjectNode)node).set("ort", nodes); + } catch (IOException e) { + logger.debug("Could not export Ort for Ortszuordnung " + + node.get("id").asText()); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/de/intevation/lada/rest/exporter/JsonExportService.java Mon Sep 05 10:19:23 2016 +0200 @@ -0,0 +1,107 @@ +/* Copyright (C) 2013 by Bundesamt fuer Strahlenschutz + * Software engineering by Intevation GmbH + * + * This file is Free Software under the GNU GPL (v>=3) + * and comes with ABSOLUTELY NO WARRANTY! Check out + * the documentation coming with IMIS-Labordaten-Application for details. + */ +package de.intevation.lada.rest.exporter; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.json.JsonArray; +import javax.json.JsonObject; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; + +import org.apache.commons.io.IOUtils; + +import de.intevation.lada.exporter.ExportConfig; +import de.intevation.lada.exporter.ExportFormat; +import de.intevation.lada.exporter.Exporter; +import de.intevation.lada.util.annotation.AuthorizationConfig; +import de.intevation.lada.util.auth.Authorization; +import de.intevation.lada.util.auth.AuthorizationType; +import de.intevation.lada.util.auth.UserInfo; +import de.intevation.lada.util.rest.Response; + +/** + * REST service to export probe objects and the child objects associated with + * the selected Probe objects. + * <p> + * To request objects post a JSON formatted string with an array of probe ids. + * <pre> + * <code> + * { + * "proben": [[number], [number], ...] + * } + * </code> + * </pre> + * + * @author <a href="mailto:rrenkert@intevation.de">Raimund Renkert</a> + */ +@Path("data/export") +@RequestScoped +public class JsonExportService { + + /** + * The exporter. + */ + @Inject + @ExportConfig(format=ExportFormat.JSON) + private Exporter exporter; + + /** + * The authorization module. + */ + @Inject + @AuthorizationConfig(type=AuthorizationType.HEADER) + private Authorization authorization; + + + /** + * Export Probe objects. + * + * The service takes JSON formatted POST data containing probe ids and + * exports the Probe objects filtered by these ids. + * + * @param proben JSON formatted string with an array of probe ids. + * @param header The HTTP header containing authorization information. + * @return The LAF file to export. + */ + @POST + @Path("/json") + @Consumes("application/json") + @Produces("application/json") + public String download( + JsonObject proben, + @Context HttpServletRequest request + ) { + JsonArray array = proben.getJsonArray("proben"); + List<Integer> probeIds = new ArrayList<Integer>(); + UserInfo userInfo = authorization.getInfo(request); + for (int i = 0; i < array.size(); i++) { + Integer probeId = array.getInt(i); + probeIds.add(probeId); + } + InputStream exported = exporter.export(probeIds, userInfo); + if (exported == null) { + return new Response(false, 600, null).toString(); + } + try { + return IOUtils.toString(exported, "utf-8"); + } catch (IOException e) { + return new Response(false, 600, null).toString(); + } + } +} +
--- a/src/main/java/de/intevation/lada/rest/exporter/LafExportService.java Mon Sep 05 10:18:38 2016 +0200 +++ b/src/main/java/de/intevation/lada/rest/exporter/LafExportService.java Mon Sep 05 10:19:23 2016 +0200 @@ -47,7 +47,7 @@ * * @author <a href="mailto:rrenkert@intevation.de">Raimund Renkert</a> */ -@Path("data/laf/export") +@Path("data/export") @RequestScoped public class LafExportService {