changeset 610:374a2e78cec5

Added importer impl for laf file format.
author Raimund Renkert <raimund.renkert@intevation.de>
date Thu, 16 Apr 2015 15:49:04 +0200
parents 093bfdcdb09c
children 8782e3a00b71
files src/main/java/de/intevation/lada/importer/laf/AttributeMapper.java src/main/java/de/intevation/lada/importer/laf/EntryFormat.java src/main/java/de/intevation/lada/importer/laf/LafFormat.java src/main/java/de/intevation/lada/importer/laf/LafImporter.java src/main/java/de/intevation/lada/importer/laf/LafParser.java src/main/java/de/intevation/lada/importer/laf/LafParserException.java src/main/java/de/intevation/lada/importer/laf/LafProducer.java src/main/java/de/intevation/lada/importer/laf/LafWriter.java src/main/java/de/intevation/lada/importer/laf/OrtCreator.java
diffstat 9 files changed, 2510 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/de/intevation/lada/importer/laf/AttributeMapper.java	Thu Apr 16 15:49:04 2015 +0200
@@ -0,0 +1,555 @@
+package de.intevation.lada.importer.laf;
+
+import java.math.BigInteger;
+import java.sql.Timestamp;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+import javax.persistence.Query;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.lada.importer.ReportItem;
+import de.intevation.lada.model.land.LKommentarM;
+import de.intevation.lada.model.land.LKommentarP;
+import de.intevation.lada.model.land.LMessung;
+import de.intevation.lada.model.land.LMesswert;
+import de.intevation.lada.model.land.LProbe;
+import de.intevation.lada.model.land.LZusatzWert;
+import de.intevation.lada.model.land.MessungTranslation;
+import de.intevation.lada.model.land.ProbeTranslation;
+import de.intevation.lada.util.annotation.RepositoryConfig;
+import de.intevation.lada.util.data.QueryBuilder;
+import de.intevation.lada.util.data.Repository;
+import de.intevation.lada.util.data.RepositoryType;
+import de.intevation.lada.util.rest.Response;
+
+/**
+ * The AttributeMapper is used to set object attributes via string based
+ * key value pairs. The key represents a member of an entity object.
+ *
+ * @author <a href="mailto:rrenkert@intevation.de">Raimund Renkert</a>
+ */
+@Stateless
+public class AttributeMapper
+{
+
+    @Inject
+    private Logger logger;
+
+    @Inject
+    @RepositoryConfig(type=RepositoryType.RW)
+    private Repository repository;
+
+    private List<ReportItem> warnings;
+    private List<ReportItem> errors;
+
+    /**
+     * Default constructor to create a new AttributeMapper object.
+     */
+    public AttributeMapper() {
+        this.warnings = new ArrayList<ReportItem>();
+        this.errors = new ArrayList<ReportItem>();
+    }
+
+    /**
+     * Add an attribute to the given LProbe object.
+     *
+     * @param key       The key mapping to a object member.
+     * @param value     The value to set.
+     * @param probe     The entity object.
+     * @return The updated entity object.
+     */
+    public LProbe addAttribute(String key, Object value, LProbe probe) {
+        DateFormat format = new SimpleDateFormat("yyyyMMdd HHmm");
+        if ("datenbasis_s".equals(key) && probe.getDatenbasisId() == null) {
+            Integer v = Integer.valueOf(value.toString());
+            probe.setDatenbasisId(v);
+        }
+        else if ("datenbasis_s".equals(key) && probe.getDatenbasisId() != null){
+            this.warnings.add(new ReportItem(key, value.toString(), 672));
+        }
+
+        if ("datenbasis".equals(key) && probe.getDatenbasisId() == null) {
+            String nativeQuery = "select id from stammdaten.datenbasis where datenbasis = '";
+            nativeQuery += value.toString() + "'";
+            Query query = repository.entityManager("land").createNativeQuery(nativeQuery);
+            List<Object[]> result = query.getResultList();
+
+            Integer v = Integer.valueOf(result.get(0)[0].toString());
+            probe.setDatenbasisId(v);
+        }
+        else if ("datenbasis".equals(key) && probe.getDatenbasisId() != null){
+            this.warnings.add(new ReportItem(key, value.toString(), 672));
+        }
+
+        if ("probe_id".equals(key)) {
+            QueryBuilder<ProbeTranslation> builder =
+                new QueryBuilder<ProbeTranslation>(
+                    repository.entityManager("land"), ProbeTranslation.class);
+            builder.and("probeIdAlt", value);
+            Response response =
+                repository.filter(builder.getQuery(), "land");
+            List<ProbeTranslation> info = (List<ProbeTranslation>)response.getData();
+            logger.debug("found " + info.size() + " items");
+            if (info != null && info.size() > 0) {
+                logger.debug("found probe with old id: " + value);
+                errors.add(new ReportItem("probe_id", value.toString(), 671));
+                return null;
+            }
+            probe.setTest(true);
+            probe.setProbenartId(1);
+            repository.create(probe, "land");
+            ProbeTranslation trans = new ProbeTranslation();
+
+            logger.debug("###### probeidalt: " + value);
+            trans.setProbeIdAlt(value.toString());
+            //Query q = repository.queryFromString("select nextval('bund.probe_id_seq')");
+            //BigInteger id = (BigInteger)q.getSingleResult();
+            //probe.setId(id.intValue());
+            //logger.debug("id of the new probe: " + id);
+            trans.setProbeId(probe);
+            repository.create(trans, "land");
+        }
+
+        if ("hauptprobennummer".equals(key)) {
+            probe.setHauptprobenNr(value.toString());
+        }
+
+        if ("mpr_id".equals(key)) {
+            Integer v = Integer.valueOf(value.toString());
+            probe.setMprId(v);
+        }
+
+        if ("netzkennung".equals(key)) {
+            probe.setNetzbetreiberId(value.toString());
+        }
+
+        if ("messstelle".equals(key)) {
+            probe.setMstId(value.toString());
+        }
+
+        if ("messprogramm_s".equals(key) && probe.getBaId() == null) {
+            probe.setBaId(value.toString());
+        }
+        else if ("messprogramm_s".equals(key) && probe.getBaId() != null){
+            this.warnings.add(new ReportItem(key, value.toString(), 672));
+        }
+
+        if ("soll_datum_uhrzeit_a".equals(key)) {
+            try {
+                Date d = format.parse(value.toString());
+                probe.setSolldatumBeginn(new Timestamp(d.getTime()));
+            }
+            catch (ParseException e) {
+                this.warnings.add(new ReportItem(key, value.toString(), 674));
+            }
+        }
+        if ("soll_datum_uhrzeit_e".equals(key)) {
+            try {
+                Date d = format.parse(value.toString());
+                probe.setSolldatumEnde(new Timestamp(d.getTime()));
+            }
+            catch (ParseException e) {
+                this.warnings.add(new ReportItem(key, value.toString(), 674));
+            }
+        }
+        if ("probenahme_datum_uhrzeit_a".equals(key)) {
+            try {
+                Date d = format.parse(value.toString());
+                probe.setProbeentnahmeBeginn(new Timestamp(d.getTime()));
+            }
+            catch (ParseException e) {
+                this.warnings.add(new ReportItem(key, value.toString(), 674));
+            }
+        }
+        if ("probenahme_datum_uhrzeit_e".equals(key)) {
+            try {
+                Date d = format.parse(value.toString());
+                probe.setProbeentnahmeEnde(new Timestamp(d.getTime()));
+            }
+            catch (ParseException e) {
+                this.warnings.add(new ReportItem(key, value.toString(), 674));
+            }
+        }
+
+        if ("umweltbereich_s".equals(key) && probe.getUmwId() == null) {
+            probe.setUmwId(value.toString());
+        }
+        else if ("umweltbereich_s".equals(key) && probe.getUmwId() != null){
+            this.warnings.add(new ReportItem(key, value.toString(), 672));
+        }
+        if ("umweltbereich_c".equals(key) && probe.getUmwId() == null) {
+            String nativeQuery = "select id from stammdaten.umwelt where umwelt_bereich= '";
+            int length = value.toString().length() > 80 ? 80 : value.toString().length();
+            nativeQuery += value.toString().substring(0, length) + "'";
+            Query query = repository.entityManager("land").createNativeQuery(nativeQuery);
+            List<Object[]> result = query.getResultList();
+            probe.setUmwId(result.get(0)[0].toString());
+        }
+        else if ("umweltbereich_c".equals(key) && probe.getUmwId() != null){
+            this.warnings.add(new ReportItem(key, value.toString(), 672));
+        }
+
+        if ("deskriptoren".equals(key)) {
+            probe.setMediaDesk(value.toString());
+        }
+
+        if ("testdaten".equals(key)) {
+            if (!value.toString().equals("0")) {
+                probe.setTest(true);
+            }
+            else {
+                probe.setTest(false);
+            }
+        }
+
+        if ("medium".equals(key)) {
+            probe.setMedia(value.toString());
+        }
+
+        if ("probenart".equals(key)) {
+            String nativeQuery = "select id from stammdaten.probenart where probenart = '";
+            nativeQuery += value.toString() + "'";
+            Query query = repository.entityManager("land").createNativeQuery(nativeQuery);
+            List<Object> result = query.getResultList();
+            probe.setProbenartId(Integer.valueOf(result.get(0).toString()));
+        }
+        return probe;
+    }
+
+    /**
+     * Add an attribute to the given LKommentarP object.
+     *
+     * @param key       The key mapping to a object member.
+     * @param value     The value to set.
+     * @param kommentar The entity object.
+     * @return The updated entity object.
+     */
+    public LKommentarP addAttribute(
+        String key,
+        Object value,
+        LKommentarP kommentar
+    ) {
+        DateFormat format = new SimpleDateFormat("yyyyMMdd HHmm");
+        String v = value.toString();
+        String erzeuger = v.substring(1, 6);
+        logger.debug("erzeuger is " + erzeuger);
+        String date = v.substring(8, 21);
+        Date d;
+        try {
+            d = format.parse(date);
+            kommentar.setDatum(new Timestamp(d.getTime()));
+        }
+        catch (ParseException e) {
+            this.warnings.add(new ReportItem(key, value.toString(), 674));
+        }
+        String text = v.substring(23, v.length() -1);
+        kommentar.setErzeuger(erzeuger);
+        kommentar.setText(text);
+        return kommentar;
+    }
+
+    /**
+     * Add an attribute to the given LKommentarM object.
+     *
+     * @param key       The key mapping to a object member.
+     * @param value     The value to set.
+     * @param kommentar The entity object.
+     * @return The updated entity object.
+     */
+    public LKommentarM addAttribute(
+        String key,
+        Object value,
+        LKommentarM kommentar
+    ) {
+        DateFormat format = new SimpleDateFormat("yyyyMMdd HHmm");
+        String v = value.toString();
+        String erzeuger = v.substring(1, 6);
+        String date = v.substring(8, 21);
+        Date d;
+        try {
+            d = format.parse(date);
+            kommentar.setDatum(new Timestamp(d.getTime()));
+        }
+        catch (ParseException e) {
+            this.warnings.add(new ReportItem(key, value.toString(), 674));
+        }
+        String text = v.substring(23, v.length() -1);
+        kommentar.setErzeuger(erzeuger);
+        kommentar.setText(text);
+        return kommentar;
+    }
+
+    /**
+     * Add an attribute to the given LMessung object.
+     *
+     * @param key       The key mapping to a object member.
+     * @param value     The value to set.
+     * @param messung   The entity object.
+     * @return The updated entity object.
+     */
+    public LMessung addAttribute(
+        String key,
+        Object value,
+        LMessung messung
+    ) {
+        DateFormat format = new SimpleDateFormat("yyyyMMdd HHmm");
+        if ("nebenprobennummer".equals(key)) {
+            messung.setNebenprobenNr(value.toString());
+        }
+        else if ("mess_datum_uhrzeit".equals(key)) {
+            try {
+                Date d = format.parse(value.toString());
+                messung.setMesszeitpunkt(new Timestamp(d.getTime()));
+            }
+            catch (ParseException e) {
+                this.warnings.add(new ReportItem(key, value.toString(), 674));
+            }
+        }
+        else if ("messzeit_sekunden".equals(key)) {
+            Integer i = Integer.valueOf(value.toString());
+            messung.setMessdauer(i);
+        }
+        else if ("messmethode_s".equals(key)) {
+            messung.setMmtId(value.toString());
+        }
+        else if ("bearbeitungsstatus".equals(key)) {
+            //ignored.!?
+        }
+        else if ("erfassung_abgeschlossen".equals(key)) {
+            if(!value.toString().equals("0")) {
+                messung.setFertig(true);
+            }
+            else {
+                messung.setFertig(false);
+            }
+        }
+        return messung;
+    }
+
+    public MessungTranslation addAttribute(
+        String key,
+        Object value,
+        MessungTranslation mt
+    ) {
+        logger.debug("###### set messungsidalt");
+        if ("messungs_id".equals(key)) {
+            logger.debug("###### set messungsid alt: " + value);
+            mt.setMessungsIdAlt(Integer.valueOf(value.toString()));
+        }
+        return mt;
+    }
+
+    /**
+     * Add an attribute to the given LMesswert object.
+     *
+     * @param key       The key mapping to a object member.
+     * @param value     The value to set.
+     * @param messwert  The entity object.
+     * @return The updated entity object.
+     */
+    public LMesswert addAttribute(
+        String key,
+        Object value,
+        LMesswert messwert
+    ) {
+        Pattern p = Pattern.compile(
+            "(\".+\")( .+ )(\".+\")( .*)( .{1,12})( .{1,9})(.{0,9})(.{0,3})");
+        //TODO Does not perfectly match... Use better matching for floats.
+        Matcher m = p.matcher(value.toString());
+        if (m.matches()) {
+            String messgroesse = m.group(1).substring(1, m.group(1).length() - 1);
+            String wert = m.group(2);
+            String einheit = m.group(3).substring(1, m.group(3).length() - 1);
+            if (wert.startsWith(" <")) {
+                wert = wert.substring(2);
+                messwert.setGrenzwertueberschreitung(false);
+            }
+            else if (wert.startsWith(" >")) {
+                wert = wert.substring(2);
+                messwert.setGrenzwertueberschreitung(true);
+            }
+            float fWert = Float.valueOf(wert);
+            messwert.setMesswert(fWert);
+
+            String nativeQuery = "select id from stammdaten.mess_einheit where einheit = '";
+            nativeQuery += einheit + "'";
+            Query query = repository.entityManager("land").createNativeQuery(nativeQuery);
+            List<Object> result = query.getResultList();
+
+            if (result.isEmpty()) {
+                this.errors.add(new ReportItem("messeinheit", "null", 673));
+                return null;
+            }
+            else {
+                messwert.setMehId((Integer)result.get(0));
+            }
+
+            String nativeQuery2 = "select id from stammdaten.messgroesse where messgroesse = '";
+            nativeQuery2 += messgroesse + "'";
+            Query query2 = repository.entityManager("land").createNativeQuery(nativeQuery2);
+            List<Object> result2 = query2.getResultList();
+
+            if (result2.isEmpty()) {
+                this.errors.add(new ReportItem("messgroesse", "null", 673));
+                return null;
+            }
+            else {
+                messwert.setMessgroesseId((Integer)result2.get(0));
+            }
+        }
+        return messwert;
+    }
+
+    /**
+     * Add an attribute to the OrtCreator. The creator is used to build the
+     * two objects Ort and LOrt.
+     *
+     * @param key       The key mapping to a object member.
+     * @param value     The value to set.
+     * @param ort       The creator object.
+     * @return The updated creator object.
+     */
+    public OrtCreator addAttribute(
+        String key,
+        Object value,
+        OrtCreator ort
+    ) {
+        if ("ort_code".equals(key)) {
+            ort.setOrtCode(value.toString());
+        }
+        if ("ort_typ".equals(key)) {
+            ort.setOrtTyp(value.toString());
+        }
+        if ("ort_zusatz".equals(key)) {
+            ort.setZusatztext(value.toString());
+        }
+        if ("ort_land_lang".equals(key)) {
+            ort.setLandLang(value.toString());
+        }
+        if ("ort_land_kurz".equals(key)) {
+            ort.setLandKurz(value.toString());
+        }
+        if ("ort_land_s".equals(key)) {
+            ort.setLandS(value.toString());
+        }
+        if ("ort_gemeindeschlüssel".equals(key)) {
+            ort.setGemSchluessel(value.toString());
+        }
+        if ("ort_bezeichnung".equals(key)) {
+            ort.setBezeichnung(value.toString());
+        }
+        if ("ort_beschreibung".equals(key)) {
+            ort.setBeschreibung(value.toString());
+        }
+        if ("ort_nuts_code".equals(key)) {
+            ort.setNuts(value.toString());
+        }
+        if ("ort_hoehe_land".equals(key)) {
+            ort.setHoehe(value.toString());
+        }
+        if ("ort_koordinaten".equals(key)) {
+            ort.setKoordinaten(value.toString());
+        }
+        if ("ort_koordinaten_s".equals(key)) {
+            ort.setKoordinatenS(value.toString());
+        }
+        return ort;
+    }
+
+    /**
+     * Add an attribute to the given LZusatzwert object.
+     *
+     * @param lKey       The key mapping to a object member.
+     * @param value     The value to set.
+     * @param wert      The entity object.
+     * @return The updated entity object.
+     */
+    public LZusatzWert addAttribute(
+        String lKey,
+        Object value,
+        LZusatzWert wert
+    ) {
+        String v = value.toString().substring(1);
+        int ndx = v.indexOf("\"");
+        String groesse = v.substring(0, ndx);
+        v = v.substring(ndx + 2);
+        ndx = v.indexOf(" ");
+        String w = v.substring(0, ndx);
+        v = v.substring(ndx + 2);
+        ndx = v.indexOf("\"");
+        String einheit = v.substring(0, ndx);
+        String fehler = v.substring(ndx + 2);
+
+        String nativeQuery = "select id from stammdaten.probenzusatz where zusatzwert = '";
+        nativeQuery += groesse + "'";
+        Query query = repository.entityManager("land").createNativeQuery(nativeQuery);
+        List<Object[]> result = query.getResultList();
+
+        if (result == null || result.isEmpty()) {
+            this.errors.add(new ReportItem(lKey, "zusatzwert", 673));
+            return null;
+        }
+        wert.setPzsId(result.get(0)[0].toString());
+        wert.setMesswertPzs(Float.valueOf(w));
+        wert.setMessfehler(Float.valueOf(fehler));
+        return wert;
+    }
+
+    /**
+     * Add an attribute to the given LZusatzwert object.
+     *
+     * @param lKey       The key mapping to a object member.
+     * @param value     The value to set.
+     * @param wert     The entity object.
+     * @return The updated entity object.
+     */
+    public LZusatzWert addAttributeS(
+        String lKey,
+        Object value,
+        LZusatzWert wert
+    ) {
+        String v = value.toString().substring(1);
+        int ndx = v.indexOf("\"");
+        String groesse = v.substring(0, ndx);
+        v = v.substring(ndx + 2);
+        ndx = v.indexOf(" ");
+        String w = v.substring(0, ndx);
+        v = v.substring(ndx + 2);
+        ndx = v.indexOf(" ");
+        String einheit = v.substring(0, ndx);
+        String fehler = v.substring(ndx + 2);
+        wert.setPzsId(groesse);
+        wert.setMesswertPzs(Float.valueOf(w));
+        wert.setMessfehler(Float.valueOf(fehler));
+        return wert;
+    }
+
+    /**
+     * @return the warnings
+     */
+    public List<ReportItem> getWarnings() {
+        return warnings;
+    }
+
+    /**
+     * @return the errors
+     */
+    public List<ReportItem> getErrors() {
+        return errors;
+    }
+
+    public void reset() {
+        errors = new ArrayList<ReportItem>();
+        warnings = new ArrayList<ReportItem>();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/de/intevation/lada/importer/laf/EntryFormat.java	Thu Apr 16 15:49:04 2015 +0200
@@ -0,0 +1,66 @@
+package de.intevation.lada.importer.laf;
+
+import java.util.regex.Pattern;
+
+/**
+ * An EntryFormat describes the internal structure of LAF-based key-value pairs.
+ * The pattern is a regular expression used to match the value in the LAF
+ * importer.
+ * The entry formats are defined in a config file
+ * (see wiki-doc: https://bfs-intern.intevation.de/Server/Importer).
+ * @author <a href="mailto:rrenkert@intevation.de">Raimund Renkert</a>
+ */
+public class EntryFormat
+{
+    private String key;
+    private Pattern pattern;
+    private Object defaultValue;
+
+    /**
+     * Default constructor to create a new EntryFormat object.
+     */
+    public EntryFormat() {
+    }
+
+    /**
+     * @return the key.
+     */
+    public String getKey() {
+        return key;
+    }
+
+    /**
+     * @param key The key to set.
+     */
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    /**
+     * @return the pattern
+     */
+    public Pattern getPattern() {
+        return pattern;
+    }
+
+    /**
+     * @param pattern The pattern to set.
+     */
+    public void setPattern(Pattern pattern) {
+        this.pattern = pattern;
+    }
+
+    /**
+     * @return the default value.
+     */
+    public Object getDefaultValue() {
+        return defaultValue;
+    }
+
+    /**
+     * @param defaultValue the default value to set.
+     */
+    public void setDefaultValue(Object defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/de/intevation/lada/importer/laf/LafFormat.java	Thu Apr 16 15:49:04 2015 +0200
@@ -0,0 +1,87 @@
+package de.intevation.lada.importer.laf;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import javax.json.Json;
+import javax.json.JsonArray;
+import javax.json.JsonException;
+import javax.json.JsonObject;
+import javax.json.JsonReader;
+
+/**
+ * The LAFFormat reads the config file
+ * (https://bfs-intern.intevation.de/Server/Importer) and creates format
+ * objects for each entry.
+ *
+ * @author <a href="mailto:rrenkert@intevation.de">Raimund Renkert</a>
+ */
+public class LafFormat
+{
+    private JsonObject fileContent;
+
+    /**
+     * Reads the config file.
+     *
+     * @param fileName  Path to the config file.
+     * @return success
+     */
+    public boolean readConfigFile(String fileName) {
+        try {
+            InputStream inputStream =
+                LafFormat.class.getResourceAsStream(fileName);
+            int ch;
+            StringBuilder builder = new StringBuilder();
+            while((ch = inputStream.read()) != -1) {
+                builder.append((char)ch);
+            }
+            JsonReader reader =
+                Json.createReader(new StringReader(builder.toString()));
+            fileContent = reader.readObject();
+            return true;
+        }
+        catch (IOException ioe) {
+            return false;
+        }
+        catch (JsonException je) {
+            return false;
+        }
+    }
+
+    /**
+     * Returns a List of EntryFormat for the requested entity type.
+     * The Entity type can be one of:
+     * * "probe"
+     * * "messung"
+     * * "ort"
+     *
+     * @param dataType The entity type
+     * @return List of entry formats defined for the requested type.
+     */
+    public List<EntryFormat> getFormat(String dataType) {
+        List<EntryFormat> formats = new LinkedList<EntryFormat>();
+        try {
+            JsonArray block = fileContent.getJsonArray(dataType);
+            for (int i = 0; i < block.size(); i++) {
+                JsonObject jEntry = block.getJsonObject(i);
+                EntryFormat entry = new EntryFormat();
+                entry.setKey(jEntry.getString("key"));
+                Pattern pattern =
+                    Pattern.compile(
+                        jEntry.getString("regex"),
+                        Pattern.MULTILINE);
+                entry.setPattern(pattern);
+                entry.setDefaultValue(jEntry.get("default"));
+                formats.add(entry);
+            }
+            return formats;
+        }
+        catch (JsonException e) {
+            return null;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/de/intevation/lada/importer/laf/LafImporter.java	Thu Apr 16 15:49:04 2015 +0200
@@ -0,0 +1,84 @@
+package de.intevation.lada.importer.laf;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.lada.importer.ImportConfig;
+import de.intevation.lada.importer.ImportFormat;
+import de.intevation.lada.importer.Importer;
+import de.intevation.lada.importer.ReportItem;
+import de.intevation.lada.util.auth.UserInfo;
+
+@ImportConfig(format=ImportFormat.LAF)
+@Stateless
+public class LafImporter implements Importer {
+
+    @Inject
+    private Logger logger;
+
+    @Inject
+    private LafParser parser;
+
+    private Map<String, List<ReportItem>> warnings;
+    private Map<String, List<ReportItem>> errors;
+
+    /**
+     * Default constructor.
+     */
+    public LafImporter() {
+        warnings = new HashMap<String, List<ReportItem>>();
+        errors = new HashMap<String, List<ReportItem>>();
+    }
+
+    /**
+     * @return the warnings
+     */
+    @Override
+    public Map<String, List<ReportItem>> getWarnings() {
+        return warnings;
+    }
+
+    /**
+     * @return the errors
+     */
+    @Override
+    public Map<String, List<ReportItem>> getErrors() {
+        return errors;
+    }
+
+    /**
+     * Reset the errors and warnings. Use this before calling doImport()
+     * to have a clean error and warning report.
+     */
+    @Override
+    public void reset() {
+        parser.reset();
+        warnings = new HashMap<String, List<ReportItem>>();
+        errors = new HashMap<String, List<ReportItem>>();
+    }
+
+    @Override
+    public void doImport(String content, UserInfo userInfo) {
+        this.warnings.clear();
+        this.errors.clear();
+        this.parser.reset();
+        logger.debug("doing import");
+        boolean success = parser.parse(userInfo, content);
+        logger.debug("import success: " + success);
+        if (!success) {
+                List<ReportItem> report = new ArrayList<ReportItem>();
+                report.add(new ReportItem("parser", "no success", 660));
+                errors.put("parser", report);
+                warnings.put("parser", new ArrayList<ReportItem>());
+        }
+        this.warnings.putAll(this.parser.getWarnings());
+        this.errors.putAll(this.parser.getErrors());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/de/intevation/lada/importer/laf/LafParser.java	Thu Apr 16 15:49:04 2015 +0200
@@ -0,0 +1,368 @@
+package de.intevation.lada.importer.laf;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.lada.importer.ReportItem;
+import de.intevation.lada.model.land.LMessung;
+import de.intevation.lada.model.land.LMesswert;
+import de.intevation.lada.model.land.LOrt;
+import de.intevation.lada.model.land.LProbe;
+import de.intevation.lada.model.land.MessungTranslation;
+import de.intevation.lada.util.auth.UserInfo;
+import de.intevation.lada.validation.Validator;
+import de.intevation.lada.validation.annotation.ValidationConfig;
+
+/**
+ * This parser is used to read data in LAF based key-value pair structure.
+ *
+ * @author <a href="mailto:rrenkert@intevation.de">Raimund Renkert</a>
+ */
+public class LafParser {
+
+    @Inject
+    private Logger logger;
+
+    private static final String PROBE_NEXT = "\n%PROBE%";
+
+    private boolean dryRun;
+
+    @Inject
+    private LafProducer producer;
+
+    @Inject
+    private LafWriter writer;
+
+    @Inject
+    @ValidationConfig(type="Probe")
+    private Validator probeValidator;
+
+    @Inject
+    @ValidationConfig(type="Messung")
+    private Validator messungValidator;
+
+    //@Inject
+    //@ValidationConfig(type="Messwert")
+    //private Validator messwertValidator;
+
+    //@Inject
+    //@ValidationConfig(type="Ort")
+    //private Validator ortValidator;
+
+    private Map<String, List<ReportItem>> warnings;
+    private Map<String, List<ReportItem>> errors;
+
+    /**
+     * Default constructor.
+     */
+    public LafParser() {
+        this.warnings = new HashMap<String, List<ReportItem>>();
+        this.errors = new HashMap<String, List<ReportItem>>();
+        this.setDryRun(false);
+    }
+
+    /**
+     * Read and parse the data and write the objects to the database.
+     *
+     * @param auth  Authentication information
+     * @param laf   The LAF formated data.
+     * @return success
+     * @throws LafParserException
+     */
+    public boolean parse(UserInfo userInfo, String laf) {
+        if (!laf.startsWith("%PROBE%\n")) {
+            logger.debug("no %PROBE% tag found!");
+            return false;
+        }
+        boolean parsed = false;
+        while (laf.startsWith("%PROBE%\n")) {
+            parsed = true;
+            int nextPos = laf.indexOf(PROBE_NEXT);
+            String single = "";
+            if (nextPos > 0) {
+                single = laf.substring(0, nextPos + 1);
+                laf = laf.substring(nextPos + 1);
+                try {
+                    logger.debug("parsing probe");
+                    readAll(single);
+                    this.warnings.putAll(producer.getWarnings());
+                    this.errors.putAll(producer.getErrors());
+                    logger.debug("writing to database");
+                    writeAll(userInfo);
+                    this.producer.reset();
+                    this.writer.reset();
+                }
+                catch (LafParserException lpe) {
+                    Map<String, List<ReportItem>> pErr = producer.getErrors();
+                    if (pErr.isEmpty()) {
+                        List<ReportItem> err = new ArrayList<ReportItem>();
+                        err.add(new ReportItem("parser", lpe.getMessage(), 673));
+                        this.errors.put("parser", err);
+                        this.warnings.put("parser", new ArrayList<ReportItem>());
+                    }
+                    else {
+                        this.errors.putAll(pErr);
+                        this.warnings.putAll(producer.getWarnings());
+                    }
+                    this.producer.reset();
+                    continue;
+                }
+            }
+            else {
+                try {
+                    logger.debug("parsing single probe");
+                    readAll(laf);
+                    this.warnings.putAll(producer.getWarnings());
+                    this.errors.putAll(producer.getErrors());
+                    logger.debug("writing single to database");
+                    writeAll(userInfo);
+                    this.producer.reset();
+                    this.writer.reset();
+                    laf = "";
+                }
+                catch (LafParserException lpe) {
+                    Map<String, List<ReportItem>> pErr = producer.getErrors();
+                    if (pErr.isEmpty()) {
+                        List<ReportItem> err = new ArrayList<ReportItem>();
+                        err.add(new ReportItem("parser", lpe.getMessage(), 673));
+                        this.errors.put("parser", err);
+                        this.warnings.put("parser", new ArrayList<ReportItem>());
+                    }
+                    else {
+                        this.errors.putAll(pErr);
+                        this.warnings.putAll(producer.getWarnings());
+                    }
+                    this.producer.reset();
+                    laf = "";
+                    continue;
+                }
+            }
+        }
+        return parsed;
+    }
+
+    /**
+     * Write all created objects to the database.
+     *
+     * @param auth  The authentication information.
+     */
+    private void writeAll(UserInfo userInfo) {
+        String probeId = producer.getProbe().getId() == null ?
+            "probeId" : producer.getProbe().getId().toString();
+        boolean p = writer.writeProbe(userInfo, producer.getProbe());
+        logger.debug("write probe: " + p);
+        if (!p) {
+            this.errors.put(probeId, writer.getErrors());
+            return;
+        }
+        writer.writeProbenKommentare(userInfo, producer.getProbenKommentare());
+        boolean m = writer.writeMessungen(userInfo, producer.getMessungen());
+        if (!m) {
+            return;
+        }
+        for (LMessung tm : producer.getMessungen().keySet()) {
+            logger.debug("messungsid: " + tm.getId());
+        }
+        writer.writeOrte(userInfo, producer.getOrte());
+        logger.debug("### i have " + producer.getLOrte().size() + " orte");
+        writer.writeLOrte(userInfo, producer.getLOrte());
+        writer.writeMessungKommentare(userInfo, producer.getMessungsKommentare());
+        writer.writeMesswerte(userInfo, producer.getMesswerte());
+        this.validateProbe(producer.getProbe());
+        this.validateMessungen(producer.getMessungen());
+        this.validateMesswerte(producer.getMesswerte());
+        this.validateLOrte(producer.getLOrte());
+    }
+
+    private void validateProbe(LProbe probe) {
+    }
+
+    private void validateMessungen(Map<LMessung, MessungTranslation> messungen) {
+    }
+
+    private void validateMesswerte(Map<LMessung, List<LMesswert>> werte) {
+    }
+
+    private void validateLOrte(List<LOrt> orte) {
+    }
+
+    /**
+     * Read all attributes from a single probe block and create entity objects.
+     *
+     * @param content   Single probe block enclosed by %PROBE%
+     * @throws LafParserException
+     */
+    private void readAll(String content)
+    throws LafParserException
+    {
+        boolean key = false;
+        boolean value = false;
+        boolean header = false;
+        boolean white = false;
+        boolean string = false;
+        boolean multiValue = false;
+        String keyString = "";
+        String valueString = "";
+        String headerString = "";
+        for (int i = 0; i < content.length(); i++) {
+            char current = content.charAt(i);
+
+            if ((current == '"' || (current == ' ' && !string)) &&
+                value &&
+                i < content.length() - 1 &&
+                (content.charAt(i + 1) != '\n' &&
+                content.charAt(i + 1) != '\r')) {
+                multiValue = true;
+            }
+
+            if (current == '"' && !string) {
+                string = true;
+            }
+            else if (current == '"' && string) {
+                string = false;
+            }
+
+            if (current == ' ' && !value) {
+                key = false;
+                white = true;
+                continue;
+            }
+            else if (current != ' ' &&
+                current != '\n' &&
+                current != '\r' &&
+                white) {
+                value = true;
+                white = false;
+            }
+            else if (current == '%' && !header && !value) {
+                headerString = "";
+                producer.finishOrt();
+                key = false;
+                header = true;
+            }
+            else if ((current == '\n' || current == '\r') && header) {
+                header = false;
+                key = true;
+                if (!dryRun) {
+                    if (headerString.contains("MESSUNG")) {
+                        producer.newMessung();
+                    }
+                    if (headerString.contains("ORT")) {
+                        producer.newOrt();
+                    }
+                }
+                if (headerString.contains("%ENDE%")) {
+                    if (!dryRun) {
+                        this.producer.newMessung();
+                        this.producer.newOrt();
+                    }
+                    return;
+                }
+                continue;
+            }
+            else if (current == '"' && !value) {
+                value = true;
+            }
+            else if ((current == '\n' || current == '\r') && value && !string) {
+                if (!multiValue && valueString.startsWith("\"")) {
+                    valueString =
+                        valueString.substring(1, valueString.length() - 1);
+                }
+                value = false;
+                multiValue = false;
+                key = true;
+                if (!this.dryRun) {
+                    producer.addData(keyString, valueString);
+                }
+                keyString = "";
+                valueString = "";
+                continue;
+            }
+            if ((current == '\n' || current == '\r') && (key || white)) {
+                //TODO error!!!
+                return;
+            }
+
+            if (key) {
+                keyString += current;
+            }
+            else if (value) {
+                valueString += current;
+            }
+            else if (header) {
+                headerString += current;
+            }
+        }
+        if (!dryRun) {
+            this.producer.newMessung();
+            this.producer.newOrt();
+        }
+    }
+
+    /**
+     * @return if objects are or not.
+     */
+    public boolean isDryRun() {
+        return dryRun;
+    }
+
+    /**
+     * If set to true, no objects will be created and written to database.
+     *
+     * @param dryRun
+     */
+    public void setDryRun(boolean dryRun) {
+        this.dryRun = dryRun;
+    }
+
+    /**
+     * @return the warnings
+     */
+    public Map<String, List<ReportItem>> getWarnings() {
+        return warnings;
+    }
+
+    /**
+     * @return the errors
+     */
+    public Map<String, List<ReportItem>> getErrors() {
+        return errors;
+    }
+
+    /**
+     * Reset errors and warnings.
+     */
+    public void reset() {
+        producer.reset();
+        this.errors = new HashMap<String, List<ReportItem>>();
+        this.warnings = new HashMap<String, List<ReportItem>>();
+    }
+
+    private void appendErrors(String probeId, List<ReportItem> errs) {
+        List<ReportItem> err = this.errors.get(probeId);
+        if (err == null) {
+            this.errors.put(probeId, errs);
+        }
+        else {
+            err.addAll(errs);
+            this.errors.put(probeId, err);
+        }
+    }
+
+    private void appendWarnings(String probeId, List<ReportItem> warns) {
+        List<ReportItem> warn = this.warnings.get(probeId);
+        if (warn == null) {
+            this.warnings.put(probeId, warns);
+        }
+        else {
+            warn.addAll(warns);
+            this.warnings.put(probeId, warn);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/de/intevation/lada/importer/laf/LafParserException.java	Thu Apr 16 15:49:04 2015 +0200
@@ -0,0 +1,19 @@
+package de.intevation.lada.importer.laf;
+
+/**
+ * Exception thrown in the LAF import process.
+ *
+ * @author <a href="mailto:rrenkert@intevation.de">Raimund Renkert</a>
+ */
+public class LafParserException
+extends Exception
+{
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    public LafParserException(String message) {
+        super(message);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/de/intevation/lada/importer/laf/LafProducer.java	Thu Apr 16 15:49:04 2015 +0200
@@ -0,0 +1,405 @@
+package de.intevation.lada.importer.laf;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.lada.importer.ReportItem;
+import de.intevation.lada.model.Ort;
+import de.intevation.lada.model.land.LKommentarM;
+import de.intevation.lada.model.land.LKommentarP;
+import de.intevation.lada.model.land.LMessung;
+import de.intevation.lada.model.land.LMesswert;
+import de.intevation.lada.model.land.LOrt;
+import de.intevation.lada.model.land.LProbe;
+import de.intevation.lada.model.land.LZusatzWert;
+import de.intevation.lada.model.land.MessungTranslation;
+import de.intevation.lada.model.stamm.SOrt;
+
+/**
+ * The LAFProducer creates entity objects form key-value pairs using the
+ * AttributeMapper.
+ *
+ * @author <a href="mailto:rrenkert@intevation.de">Raimund Renkert</a>
+ */
+public class LafProducer
+{
+    @Inject
+    private Logger logger;
+
+    private LProbe probe;
+    private LMessung messung;
+    private MessungTranslation messungTranslation;
+
+    @Inject
+    private OrtCreator ort;
+
+    private List<LKommentarP> pKommentare;
+    private Map<LMessung, List<LKommentarM>> mKommentare;
+    private Map<LMessung, MessungTranslation> messungen;
+    private List<LOrt> lorte;
+    private List<SOrt> orte;
+    private Map<LMessung, List<LMesswert>> messwerte;
+    private List<LZusatzWert> zusatzwerte;
+
+    private List<EntryFormat> probenFormat;
+    private List<EntryFormat> messungFormat;
+    private List<EntryFormat> ortFormat;
+
+    private Map<String, List<ReportItem>> warnings;
+    private Map<String, List<ReportItem>> errors;
+
+    @Inject
+    private AttributeMapper mapper;
+
+    /**
+     * Default contructor. Initializes the producer and reads the config file
+     * using the systemproperty "de.intevation.lada.importconfig".
+     */
+    public LafProducer() {
+        this.warnings = new HashMap<String, List<ReportItem>>();
+        this.errors = new HashMap<String, List<ReportItem>>();
+        this.probe = new LProbe();
+        this.pKommentare = new ArrayList<LKommentarP>();
+        this.mKommentare = new HashMap<LMessung, List<LKommentarM>>();
+        this.messungen = new HashMap<LMessung, MessungTranslation>();
+        this.lorte = new ArrayList<LOrt>();
+        this.messwerte = new HashMap<LMessung, List<LMesswert>>();
+        String fileName = "/import.json";
+        LafFormat format = new LafFormat();
+        format.readConfigFile(fileName);
+        probenFormat = format.getFormat("probe");
+        messungFormat = format.getFormat("messung");
+        ortFormat = format.getFormat("ort");
+    }
+
+    /**
+     * Add data to the producer.
+     * This triggers the producer to create a new object or add data to
+     * existing objects.
+     *
+     * @param key       The key.
+     * @param values    The value
+     * @throws LafParserException
+     */
+    public void addData(String key, Object values)
+    throws LafParserException {
+        logger.debug("adding " + key + ": " + values);
+        String lKey = key.toLowerCase();
+        if(lKey.equals("probenkommentar")) {
+            LKommentarP kommentar = new LKommentarP();
+            kommentar.setProbeId(this.probe.getId());
+            this.pKommentare.add(
+                mapper.addAttribute(lKey, values, kommentar));
+        }
+        else if (lKey.equals("kommentar")) {
+            LKommentarM kommentar = new LKommentarM();
+            kommentar.setMessungsId(this.messung.getId());
+            if (this.mKommentare.get(this.messung) == null) {
+                this.mKommentare.put(this.messung, new ArrayList<LKommentarM>());
+            }
+            this.mKommentare.get(this.messung).add(
+                mapper.addAttribute(lKey, values, kommentar));
+        }
+        else if (lKey.equals("probenzusatzbeschreibung")) {
+            LZusatzWert wert = new LZusatzWert();
+            LZusatzWert zusatzWert = mapper.addAttribute(lKey, values, wert);
+            if (zusatzWert != null) {
+                zusatzWert.setProbeId(probe.getId());
+                this.zusatzwerte.add(zusatzWert);
+            }
+            else {
+                String ekey = probe.getId() == null ?
+                    "probeId" : probe.getId().toString();
+                List<ReportItem> err = this.errors.get(ekey);
+                if (err == null) {
+                    this.errors.put(ekey, mapper.getErrors());
+                }
+                else {
+                    err.addAll(mapper.getErrors());
+                }
+            }
+        }
+        else if (lKey.equals("pzb_s")) {
+            LZusatzWert wert = new LZusatzWert();
+            LZusatzWert zusatzWert = mapper.addAttributeS(lKey, values, wert);
+            if (zusatzWert != null) {
+                zusatzWert.setProbeId(probe.getId());
+                this.zusatzwerte.add(zusatzWert);
+            }
+            else {
+                String ekey = probe.getId() == null ?
+                    "probeId" : probe.getId().toString();
+                List<ReportItem> err = this.errors.get(ekey);
+                if (err == null) {
+                    this.errors.put(ekey, mapper.getErrors());
+                }
+                else {
+                    err.addAll(mapper.getErrors());
+                }
+            }
+        }
+        else if (lKey.equals("messwert")) {
+            LMesswert m = new LMesswert();
+            m.setMessungsId(this.messung.getId());
+            LMesswert wert = mapper.addAttribute(lKey, values, m);
+            if (wert != null) {
+                if (this.messwerte.get(this.messung) == null) {
+                    this.messwerte.put(this.messung, new ArrayList<LMesswert>());
+                }
+                this.messwerte.get(this.messung).add(
+                    mapper.addAttribute(lKey, values, wert));
+            }
+            else {
+                String ekey = probe.getId() == null ?
+                    "probeId" : probe.getId().toString();
+                List<ReportItem> err = this.errors.get(ekey);
+                if (err == null) {
+                    this.errors.put(ekey, mapper.getErrors());
+                }
+                else {
+                    err.addAll(mapper.getErrors());
+                }
+            }
+        }
+        else if (isValidMessung(lKey, values.toString())) {
+            this.messung = mapper.addAttribute(lKey, values, this.messung);
+            logger.debug("####### " + lKey + ": " + values);
+            this.messungTranslation =
+                mapper.addAttribute(lKey, values, this.messungTranslation);
+        }
+        else if (isValidProbe(lKey, values.toString())) {
+            this.probe = mapper.addAttribute(lKey, values, this.probe);
+            if (this.probe == null) {
+                this.errors.put(values.toString(), mapper.getErrors());
+                throw new LafParserException(values.toString() + " exists");
+            }
+        }
+        else if (isValidOrt(lKey, values.toString())) {
+            this.ort.addAttribute(lKey, values);
+        }
+    }
+
+    /**
+     * Check if the key is defined in the config file and validate the value
+     * using the pattern defined for this key.
+     *
+     * @param key   The key.
+     * @param value The value.
+     * @return valid or not.
+     */
+    private boolean isValidOrt(String key, String value) {
+        for (EntryFormat ef: ortFormat) {
+            if (ef.getKey().equals(key.toLowerCase())) {
+                if (ef.getPattern().matcher(value).matches()) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Check if the key is defined in the config file and validate the value
+     * using the pattern defined for this key.
+     *
+     * @param key   The key.
+     * @param value The value.
+     * @return valid or not.
+     */
+    private boolean isValidMessung(String key, String value) {
+        for (EntryFormat ef: messungFormat) {
+            if (ef.getKey().equals(key.toLowerCase())) {
+                if (ef.getPattern().matcher(value).matches()) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Check if the key is defined in the config file and validate the value
+     * using the pattern defined for this key.
+     *
+     * @param key   The key.
+     * @param value The value.
+     * @return valid or not.
+     */
+    private boolean isValidProbe(String key, String value) {
+        for (EntryFormat ef: probenFormat) {
+            if (ef.getKey().equals(key.toLowerCase())) {
+                if (ef.getPattern().matcher(value).matches()) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * @return the {@link LProbe} entity.
+     */
+    public LProbe getProbe() {
+        return this.probe;
+    }
+
+    /**
+     * @return List of {@link LMessung} entities.
+     */
+    public Map<LMessung, MessungTranslation> getMessungen() {
+        return this.messungen;
+    }
+
+    /**
+     * @return List of {@link Ort} entities.
+     */
+    public List<SOrt> getOrte() {
+        return this.orte;
+    }
+
+    /**
+     * @return List of {@link LOrt} entities.
+     */
+    public List<LOrt> getLOrte() {
+        return this.lorte;
+    }
+
+    /**
+     * @return List of {@link LKommentarP} entities.
+     */
+    public List<LKommentarP> getProbenKommentare() {
+        return this.pKommentare;
+    }
+
+    /**
+     * @return List of {@link LKommentarM} entities.
+     */
+    public Map<LMessung, List<LKommentarM>> getMessungsKommentare() {
+        return this.mKommentare;
+    }
+
+    /**
+     * @return List of {@link LMesswert} entities.
+     */
+    public Map<LMessung, List<LMesswert>> getMesswerte() {
+        return this.messwerte;
+    }
+
+    /**
+     * @return List of {@link LZusatzWert} entities.
+     */
+    public List<LZusatzWert> getZusatzwerte() {
+        return this.zusatzwerte;
+    }
+
+    /**
+     * Reset errors and warnings.
+     */
+    public void reset() {
+        this.errors = new HashMap<String, List<ReportItem>>();
+        this.warnings = new HashMap<String, List<ReportItem>>();
+        this.probe = new LProbe();
+        this.messungen = new HashMap<LMessung, MessungTranslation>();
+        this.messung = null;
+        this.lorte = new ArrayList<LOrt>();
+        this.orte = new ArrayList<SOrt>();
+        this.ort.reset();
+        this.messwerte = new HashMap<LMessung, List<LMesswert>>();
+        this.mKommentare = new HashMap<LMessung, List<LKommentarM>>();
+        this.pKommentare = new ArrayList<LKommentarP>();
+        mapper.reset();
+    }
+
+    /**
+     * Add the current {@link LMessung} entity to the List and create a new one.
+     */
+    public void newMessung() {
+        if (this.messung != null && this.messungTranslation != null) {
+            if (this.messung.getFertig() == null) {
+                this.messung.setFertig(false);
+            }
+            if (this.messung.getGeplant() == null) {
+                this.messung.setGeplant(false);
+            }
+            this.messungen.put(this.messung, this.messungTranslation);
+        }
+        this.messung = new LMessung();
+        this.messungTranslation = new MessungTranslation();
+        this.messung.setProbeId(this.probe.getId());
+    }
+
+    /**
+     * Add the {@link Ort} and {@link LOrt} entities to the lists and create
+     * a new {@link OrtCreator}.
+     */
+    public void newOrt() {
+        if (this.ort != null) {
+            SOrt o = this.ort.toOrt();
+            if (o != null) {
+                this.orte.add(o);
+            }
+            logger.debug("ort: " + this.ort.getProbeId());
+            LOrt lo = this.ort.toLOrt();
+            logger.debug("lo is " + lo != null);
+            if (lo != null) {
+                this.lorte.add(lo);
+            }
+        }
+        OrtCreator creator = this.ort;
+        creator.reset();
+        logger.debug(this.probe.getId());
+        logger.debug(creator.hashCode());
+        creator.setProbeId(this.probe.getId());
+        logger.debug("ort: " + creator.getProbeId());
+        logger.debug(creator.hashCode());
+    }
+
+    /**
+     * @return the warnings
+     */
+    public Map<String, List<ReportItem>> getWarnings() {
+        if (this.probe == null) {
+            return this.warnings;
+        }
+        String key = probe.getId() == null ? "probeId" : probe.getId().toString();
+        List<ReportItem> warn = this.warnings.get(key);
+        if (warn == null) {
+            this.warnings.put(key, mapper.getWarnings());
+        }
+        else {
+            warn.addAll(mapper.getWarnings());
+        }
+        return this.warnings;
+    }
+
+    /**
+     * @return the errors
+     */
+    public Map<String, List<ReportItem>> getErrors() {
+        if (this.probe == null) {
+            return this.errors;
+        }
+        String key = probe.getId() == null ?
+            "probeId" : probe.getId().toString();
+        List<ReportItem> err = this.errors.get(key);
+        if (err == null) {
+            this.errors.put(key, mapper.getErrors());
+        }
+        else {
+            err.addAll(mapper.getErrors());
+        }
+        return this.errors;
+    }
+
+    public void finishOrt() {
+        if (orte.isEmpty()) {
+            return;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/de/intevation/lada/importer/laf/LafWriter.java	Thu Apr 16 15:49:04 2015 +0200
@@ -0,0 +1,210 @@
+package de.intevation.lada.importer.laf;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+import javax.persistence.PersistenceException;
+
+import de.intevation.lada.importer.ReportItem;
+import de.intevation.lada.model.land.LKommentarM;
+import de.intevation.lada.model.land.LKommentarP;
+import de.intevation.lada.model.land.LMessung;
+import de.intevation.lada.model.land.LMesswert;
+import de.intevation.lada.model.land.LOrt;
+import de.intevation.lada.model.land.LProbe;
+import de.intevation.lada.model.land.MessungTranslation;
+import de.intevation.lada.model.stamm.SOrt;
+import de.intevation.lada.util.annotation.AuthorizationConfig;
+import de.intevation.lada.util.annotation.RepositoryConfig;
+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.data.Repository;
+import de.intevation.lada.util.data.RepositoryType;
+
+/**
+ * Writer to persist new entities in the database.
+ *
+ * @author <a href="mailto:rrenkert@intevation.de">Raimund Renkert</a>
+ */
+@Stateless
+public class LafWriter {
+
+    @Inject
+    @RepositoryConfig(type=RepositoryType.RW)
+    private Repository repository;
+
+    @Inject
+    @AuthorizationConfig(type=AuthorizationType.OPEN_ID)
+    private Authorization authorization;
+
+    private List<ReportItem> errors;
+    private List<ReportItem> warnings;
+
+    /**
+     * Default constructor.
+     */
+    public LafWriter() {
+        errors = new ArrayList<ReportItem>();
+        warnings = new ArrayList<ReportItem>();
+    }
+
+    /**
+     * Write a new {@link LProbe} object to the database using
+     * authorization and validation.
+     *
+     * @param auth      The authentication information.
+     * @param probe     The new {@link LProbe} object.
+     * @return success
+     */
+    public boolean writeProbe(UserInfo userInfo, LProbe probe) {
+        if (!authorization.isAuthorized(userInfo, probe)) {
+            errors.add(new ReportItem("auth", "not authorized", 699));
+            return false;
+        }
+        if (probe.getId() == null) {
+            errors.add(new ReportItem("probeId", "missing", 673));
+            return false;
+        }
+        try {
+            repository.update(probe, "land");
+        }
+        catch (PersistenceException e) {
+            errors.add(new ReportItem("probe", "writing", 670));
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Write new {@link LMessung} objects to the database using
+     * authorization and validation.
+     *
+     * @param auth      The authentication information.
+     * @param messungen The new {@link LMessung} objects.
+     * @return success
+     */
+    public boolean writeMessungen(
+        UserInfo userInfo,
+        Map<LMessung, MessungTranslation> messungen
+    ) {
+        for(LMessung messung: messungen.keySet()) {
+            repository.create(messung, "land");
+            MessungTranslation mt = messungen.get(messung);
+            mt.setMessungsId(messung);
+            repository.create(mt, "land");
+        }
+        return true;
+    }
+
+    /**
+     * Write new {@link SOrt} objects to the database.
+     *
+     * @param auth      The authentication information.
+     * @param orte      List of {@link SOrt} objects.
+     * @return success
+     */
+    public boolean writeOrte(UserInfo userInfo, List<SOrt> orte) {
+        for (SOrt ort :orte) {
+            //TODO create the SOrt!!!
+            //repository.create(ort, "land");
+        }
+        return true;
+    }
+
+    /**
+     * Write new {@link LOrt} objects to the database using validation.
+     *
+     * @param auth  The authentication information.
+     * @param orte  List of {@link LOrt} objects.
+     * @return success
+     */
+    public boolean writeLOrte(UserInfo userInfo, List<LOrt> orte) {
+        for(LOrt ort: orte) {
+            repository.create(ort, "land");
+        }
+        return true;
+    }
+
+    /**
+     * Write new {@link LKommentarP} objects to the database.
+     *
+     * @param auth          The authentication information.
+     * @param kommentare    List of {@link LKommentarP} objects.
+     * @return success
+     */
+    public boolean writeProbenKommentare(
+        UserInfo userInfo,
+        List<LKommentarP> kommentare
+    ) {
+        for(LKommentarP kommentar: kommentare) {
+            repository.create(kommentar, "land");
+        }
+        return true;
+    }
+
+    /**
+     * Write new {@link LKommentarM} objects to the database.
+     *
+     * @param auth          The authentication information.
+     * @param kommentare    List of {@link LKommentarM} objects.
+     * @return success
+     */
+    public boolean writeMessungKommentare(
+        UserInfo userInfo,
+        Map<LMessung, List<LKommentarM>> kommentare
+    ) {
+        for (LMessung messung : kommentare.keySet()) {
+            for (LKommentarM kommentar: kommentare.get(messung)) {
+                kommentar.setMessungsId(messung.getId());
+                repository.create(kommentar, "land");
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Write new {@link LMesswert} objects to the database using validation.
+     *
+     * @param auth      The authentication information.
+     * @param werte     List of {@link LMesswert} objects.
+     * @return success
+     */
+    public boolean writeMesswerte(
+        UserInfo userInfo,
+        Map<LMessung, List<LMesswert>> werte
+    ) {
+        for (LMessung messung : werte.keySet()) {
+            for(LMesswert messwert: werte.get(messung)) {
+                messwert.setMessungsId(messung.getId());
+                repository.create(messwert, "land");
+            }
+        }
+        return true;
+    }
+
+    /**
+     * @return the errors
+     */
+    public List<ReportItem> getErrors() {
+        return errors;
+    }
+
+    /**
+     * @return the warnings
+     */
+    public List<ReportItem> getWarnings() {
+        return warnings;
+    }
+
+    /**
+     * Reset the errors and warnings.
+     */
+    public void reset() {
+        this.warnings = new ArrayList<ReportItem>();
+        this.errors = new ArrayList<ReportItem>();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/de/intevation/lada/importer/laf/OrtCreator.java	Thu Apr 16 15:49:04 2015 +0200
@@ -0,0 +1,716 @@
+package de.intevation.lada.importer.laf;
+
+import java.math.BigInteger;
+import java.util.List;
+
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+import javax.persistence.Query;
+
+import org.apache.log4j.Logger;
+
+import de.intevation.lada.model.land.LOrt;
+import de.intevation.lada.model.stamm.SOrt;
+import de.intevation.lada.util.annotation.RepositoryConfig;
+import de.intevation.lada.util.data.Repository;
+import de.intevation.lada.util.data.RepositoryType;
+
+/**
+ * Class to produce Ort/LOrt objects from a given set of attributes.
+ *
+ * @author <a href="mailto:rrenkert@intevation.de">Raimund Renkert</a>
+ */
+public class OrtCreator
+{
+    @Inject
+    private Logger logger;
+
+    @Inject
+    @RepositoryConfig(type=RepositoryType.RW)
+    private Repository repository;
+
+    private Integer probeId;
+    private Integer ortId;
+    private String ortCode;
+    private String ortTyp;
+    private String zusatztext;
+    private String landLang;
+    private String landKurz;
+    private String landS;
+    private String gemSchluessel;
+    private String gemName;
+    private String koordArt;
+    private String koord;
+    private String koordS;
+    private String bezeichnung;
+    private String beschreibung;
+    private String nuts;
+    private String hoehe;
+    private String koordinaten;
+    private String koordinatenS;
+
+    public OrtCreator() {
+        this.ortId = null;
+    }
+
+    /**
+     * @return the probeId
+     */
+    public Integer getProbeId() {
+        return this.probeId;
+    }
+
+    /**
+     * @param probeId the probeId to set
+     */
+    public void setProbeId(Integer probeId) {
+        this.probeId = probeId;
+    }
+
+    /**
+     * @return the ortCode
+     */
+    public String getOrtCode() {
+        return ortCode;
+    }
+
+    /**
+     * @param ortCode   the ortCode to set
+     */
+    public void setOrtCode(String ortCode) {
+        logger.debug("ort code is " + ortCode);
+        this.ortCode = ortCode;
+    }
+
+    /**
+     * @return the ortTyp
+     */
+    public String getOrtTyp() {
+        return ortTyp;
+    }
+
+    /**
+     * @param ortTyp the ortTyp to set
+     */
+    public void setOrtTyp(String ortTyp) {
+        this.ortTyp = ortTyp;
+    }
+
+    /**
+     * @return the zusatztext
+     */
+    public String getZusatztext() {
+        return zusatztext;
+    }
+
+    /**
+     * @param zusatztext the zusatztext to set
+     */
+    public void setZusatztext(String zusatztext) {
+        this.zusatztext = zusatztext;
+    }
+
+    /**
+     * @return the landLang
+     */
+    public String getLandLang() {
+        return landLang;
+    }
+
+    /**
+     * @param landLang the landLang to set
+     */
+    public void setLandLang(String landLang) {
+        this.landLang = landLang;
+    }
+
+    /**
+     * @return the landKurz
+     */
+    public String getLandKurz() {
+        return landKurz;
+    }
+
+    /**
+     * @param landKurz the landKurz to set
+     */
+    public void setLandKurz(String landKurz) {
+        this.landKurz = landKurz;
+    }
+
+    /**
+     * @return the landS
+     */
+    public String getLandS() {
+        return landS;
+    }
+
+    /**
+     * @param landS the landS to set
+     */
+    public void setLandS(String landS) {
+        this.landS = landS;
+    }
+
+    /**
+     * @return the gemSchluessel
+     */
+    public String getGemSchluessel() {
+        return gemSchluessel;
+    }
+
+    /**
+     * @param gemSchluessel the gemSchluessel to set
+     */
+    public void setGemSchluessel(String gemSchluessel) {
+        this.gemSchluessel = gemSchluessel;
+    }
+
+    /**
+     * @return the koordArt
+     */
+    public String getKoordArt() {
+        return koordArt;
+    }
+
+    /**
+     * @param koordArt the koordArt to set
+     */
+    public void setKoordArt(String koordArt) {
+        this.koordArt = koordArt;
+    }
+
+    /**
+     * @return the koord
+     */
+    public String getKoord() {
+        return koord;
+    }
+
+    /**
+     * @param koord the koord to set
+     */
+    public void setKoord(String koord) {
+        this.koord = koord;
+    }
+
+    /**
+     * @return the koordS
+     */
+    public String getKoordS() {
+        return koordS;
+    }
+
+    /**
+     * @param koordS the koordS to set
+     */
+    public void setKoordS(String koordS) {
+        this.koordS = koordS;
+    }
+
+    /**
+     * @return the nuts
+     */
+    public String getNuts() {
+        return nuts;
+    }
+
+    /**
+     * @param nuts the nuts to set
+     */
+    public void setNuts(String nuts) {
+        this.nuts = nuts;
+    }
+
+    /**
+     * @return the hoehe
+     */
+    public String getHoehe() {
+        return hoehe;
+    }
+
+    /**
+     * @param hoehe the hoehe to set
+     */
+    public void setHoehe(String hoehe) {
+        this.hoehe = hoehe;
+    }
+
+    /**
+     * @return the bezeichung
+     */
+    public String getBezeichnung() {
+        return bezeichnung;
+    }
+
+    /**
+     * @param bezeichnung the bezeichnung to set
+     */
+    public void setBezeichnung(String bezeichnung) {
+        this.bezeichnung = bezeichnung;
+    }
+
+    /**
+     * @return the gemName
+     */
+    public String getGemName() {
+        return gemName;
+    }
+
+    /**
+     * @param gemName the gemName to set
+     */
+    public void setGemName(String gemName) {
+        this.gemName = gemName;
+    }
+
+    /**
+     * @return the beschreibung
+     */
+    public String getBeschreibung() {
+        return beschreibung;
+    }
+
+    /**
+     * @param beschreibung the beschreibung to set
+     */
+    public void setBeschreibung(String beschreibung) {
+        this.beschreibung = beschreibung;
+    }
+
+    /**
+     * @return the koordinaten
+     */
+    public String getKoordinaten() {
+        return koordinaten;
+    }
+
+    /**
+     * @param koordinaten the koordinaten to set
+     */
+    public void setKoordinaten(String koordinaten) {
+        this.koordinaten = koordinaten;
+    }
+
+    /**
+     * @return the koordinatenS
+     */
+    public String getKoordinatenS() {
+        return koordinatenS;
+    }
+
+    /**
+     * @param koordinatenS the koordinatenS to set
+     */
+    public void setKoordinatenS(String koordinatenS) {
+        this.koordinatenS = koordinatenS;
+    }
+
+    /**
+     * Add an attribute to the OrtCreator. The creator is used to build the
+     * two objects Ort and LOrt.
+     *
+     * @param key       The key mapping to a object member.
+     * @param value     The value to set.
+     * @param ort       The creator object.
+     * @return The updated creator object.
+     */
+    public void addAttribute(
+        String key,
+        Object value
+    ) {
+        logger.debug("# adding " + key + ": " + value);
+        if ("ort_code".equals(key)) {
+            this.setOrtCode(value.toString());
+        }
+        if ("ort_typ".equals(key)) {
+            this.setOrtTyp(value.toString());
+        }
+        if ("ort_zusatz".equals(key)) {
+            this.setZusatztext(value.toString());
+        }
+        if ("ort_land_lang".equals(key)) {
+            this.setLandLang(value.toString());
+        }
+        if ("ort_land_kurz".equals(key)) {
+            this.setLandKurz(value.toString());
+        }
+        if ("ort_land_s".equals(key)) {
+            this.setLandS(value.toString());
+        }
+        if ("ort_gemeindeschluessel".equals(key)) {
+            this.setGemSchluessel(value.toString());
+        }
+        if ("ort_bezeichnung".equals(key)) {
+            this.setBezeichnung(value.toString());
+        }
+        if ("ort_beschreibung".equals(key)) {
+            this.setBeschreibung(value.toString());
+        }
+        if ("ort_nuts_code".equals(key)) {
+            this.setNuts(value.toString());
+        }
+        if ("ort_hoehe_land".equals(key)) {
+            this.setHoehe(value.toString());
+        }
+        if ("ort_koordinaten".equals(key)) {
+            this.setKoordinaten(value.toString());
+        }
+        if ("ort_koordinaten_s".equals(key)) {
+            this.setKoordinatenS(value.toString());
+        }
+    }
+
+
+    /**
+     * Create the Ort object.
+     *
+     * @return The new Ort.
+     */
+    public SOrt toOrt() {
+        if (this.ortCode != null && this.ortCode.length() > 0) {
+            return null;
+        }
+        SOrt ort = new SOrt();
+        // TODO USE NATIVE QUERY...
+        //repository.create(ort, "land");
+        this.ortId = ort.getId();
+        boolean koord = true;
+        if (this.koordinatenS != null && this.koordinatenS.length() > 0) {
+            ort = setKoordinatenS(ort);
+            koord = false;
+            if (this.koordinaten != null && this.koordinaten.length() > 0) {
+                //TODO: add warning.
+            }
+        }
+        else if (this.koordinaten != null && this.koordinaten.length() > 0) {
+            ort = setKoordinaten(ort);
+            koord = false;
+        }
+        if (this.gemSchluessel != null &&
+            this.gemSchluessel.length() > 0){
+            ort = setGemeindeS(ort, koord);
+            koord = false;
+            if(this.gemName != null && this.gemName.length() > 0) {
+                //TODO: add warning.
+            }
+        }
+        else if (this.gemName != null && this.gemName.length() > 0) {
+            ort = setGemeinde(ort, koord);
+            koord = false;
+        }
+        if(this.landS != null && this.landS.length() > 0) {
+            ort = setLandS(ort, koord);
+            koord = false;
+            if (this.landLang != null && this.landLang.length() > 0) {
+                //TODO: add warning.
+            }
+            if (this.landKurz != null && this.landKurz.length() > 0) {
+                //TODO: add warning.
+            }
+        }
+        else if (this.landKurz != null && this.landKurz.length() > 0) {
+            ort = setLandKurz(ort, koord);
+            koord = false;
+            if (this.landLang != null && this.landLang.length() > 0) {
+                //TODO: add warning.
+            }
+        }
+        else if (this.landLang != null && this.landLang.length() > 0) {
+            ort = setLandLang(ort, koord);
+        }
+        if (koord) {
+            //TODO: add warning.
+            return null;
+        }
+        if (this.nuts != null && this.nuts.length() > 0) {
+            ort.setNutsCode(nuts);
+        }
+        else if (ort.getVerwaltungseinheitId() != null &&
+            ort.getVerwaltungseinheitId().length() > 0)
+        {
+            String nativeQuery = "select nuts from stammdaten.verwaltungseinheit where gem_id = '";
+            nativeQuery += ort.getVerwaltungseinheitId() + "'";
+            Query query = repository.entityManager("land").createNativeQuery(nativeQuery);
+            List<Object[]> result = query.getResultList();
+
+            ort.setNutsCode(result.get(0)[0].toString());
+        }
+        ort.setBeschreibung(beschreibung);
+        if (this.hoehe != null) {
+            ort.setHoeheLand(Float.valueOf(hoehe));
+        }
+        //TODO USE NATIVE QUERY...
+        //repository.update(ort, "land");
+        return ort;
+    }
+
+    /**
+     * Find the SStaat object identified by the land_lang string and set a
+     * reference to the ort object.
+     *
+     * @param ort       The ort object.
+     * @param koord     Set the coordinates or not.
+     * @return The Ort object.
+     */
+    private SOrt setLandLang(SOrt ort, boolean koord) {
+        String nativeQuery = "select id, koord_x_extern, koord_y_extern from stammdaten.staat where staat = '";
+        nativeQuery += this.landLang + "'";
+        Query query = repository.entityManager("land").createNativeQuery(nativeQuery);
+        List<Object[]> result = query.getResultList();
+
+        if (result.isEmpty()) {
+            //TODO: add warning.
+            return ort;
+        }
+        ort.setStaatId(Integer.valueOf(result.get(0)[0].toString()));
+        if (koord) {
+            ort.setKoordXExtern(result.get(0)[1].toString());
+            ort.setKoordYExtern(result.get(0)[2].toString());
+        }
+        return ort;
+    }
+
+    /**
+     * Find the SStaat object identified by the land_kurz string and set a
+     * reference to the ort object.
+     *
+     * @param ort       The ort object.
+     * @param koord     Set the coordinates or not.
+     * @return The Ort object.
+     */
+    private SOrt setLandKurz(SOrt ort, boolean koord) {
+        String nativeQuery = "select id, koord_x_extern, koord_y_extern from stammdaten.staat where staat_kurz = '";
+        nativeQuery += this.landKurz + "'";
+        Query query = repository.entityManager("land").createNativeQuery(nativeQuery);
+        List<Object[]> result = query.getResultList();
+
+        if (result.isEmpty()) {
+            //TODO add warning.
+            return ort;
+        }
+        ort.setStaatId((Integer)result.get(0)[0]);
+        if (koord) {
+            ort.setKoordXExtern(result.get(0)[1].toString());
+            ort.setKoordYExtern(result.get(0)[2].toString());
+        }
+        return ort;
+    }
+
+    /**
+     * Find the SStaat object identified by the land_s id and set a
+     * reference to the ort object.
+     *
+     * @param ort       The ort object.
+     * @param koord     Set the coordinates or not.
+     * @return The Ort object.
+     */
+    private SOrt setLandS(SOrt ort, boolean koord) {
+        ort.setStaatId(Integer.valueOf(this.landS));
+        if (koord) {
+            String nativeQuery = "select koord_x_extern, koord_y_extern from stammdaten.staat where id = '";
+            nativeQuery += this.landS + "'";
+            Query query = repository.entityManager("land").createNativeQuery(nativeQuery);
+            List<Object[]> result = query.getResultList();
+            if (result.isEmpty()) {
+                //TODO: add warning.
+                return ort;
+            }
+            ort.setKoordXExtern(result.get(0)[0].toString());
+            ort.setLongitude(Double.valueOf(result.get(0)[0].toString()));
+            ort.setKoordYExtern(result.get(0)[1].toString());
+            ort.setLatitude(Double.valueOf(result.get(0)[1].toString()));
+        }
+        return ort;
+    }
+
+    /**
+     * Find the SVerwaltungseinheit object identified by the gem_name string
+     * and set a reference to the ort object.
+     *
+     * @param ort       The ort object.
+     * @param koord     Set the coordinates or not.
+     * @return The Ort object.
+     */
+    private SOrt setGemeinde(SOrt ort, boolean koord) {
+        String nativeQuery = "select id, koord_x_extern, koord_y_extern from stammdaten.verwaltungseinheit where bezeichnung = '";
+        nativeQuery += this.gemName + "'";
+        Query query = repository.entityManager("land").createNativeQuery(nativeQuery);
+        List<Object[]> result = query.getResultList();
+        if (result.isEmpty()) {
+            //TODO: add warning.
+            return ort;
+        }
+        ort.setVerwaltungseinheitId(result.get(0)[0].toString());
+        if (koord) {
+            ort.setKoordXExtern(result.get(0)[1].toString());
+            ort.setKoordYExtern(result.get(0)[2].toString());
+        }
+        return ort;
+    }
+
+    /**
+     * Find the SVerwaltungseinheit object identified by the gem_schluessel id
+     * and set a reference to the ort object.
+     *
+     * @param ort       The ort object.
+     * @param koord     Set the coordinates or not.
+     * @return The Ort object.
+     */
+    private SOrt setGemeindeS(SOrt ort, boolean koord) {
+        ort.setVerwaltungseinheitId(this.gemSchluessel);
+        if (koord) {
+            String nativeQuery = "select koord_x_extern, koord_y_extern from stammdaten.verwaltungseinheit where bezeichnung = '";
+            nativeQuery += this.gemName + "'";
+            Query query = repository.entityManager("land").createNativeQuery(nativeQuery);
+            List<Object[]> result = query.getResultList();
+            if (result.isEmpty()) {
+                // TODO: add warning.
+                return ort;
+            }
+            ort.setKoordXExtern(result.get(0)[0].toString());
+            ort.setKoordYExtern(result.get(0)[1].toString());
+        }
+        return ort;
+    }
+
+    /**
+     * Parse the coordinates and the the attributes to the new ort object.
+     *
+     * @param ort       The ort object.
+     * @return The Ort object.
+     */
+    private SOrt setKoordinaten(SOrt ort) {
+        String art = "";
+        String x = "";
+        String y = "";
+        String tmp = "";
+        if (this.koordinaten.startsWith("\"")) {
+            tmp = this.koordinaten.substring(1);
+            art = tmp.substring(0, tmp.indexOf("\""));
+            tmp = tmp.substring(tmp.indexOf("\"") + 2);
+        }
+        else {
+            art = this.koordinaten.substring(0, this.koordinaten.indexOf(" "));
+            tmp = this.koordinaten.substring(
+                0, this.koordinaten.indexOf(" ") + 1);
+        }
+        if (tmp.startsWith("\"")) {
+            tmp = tmp.substring(1);
+            x = tmp.substring(0, tmp.indexOf("\""));
+            tmp = tmp.substring(0, tmp.indexOf("\"") + 2);
+        }
+        else {
+            x = tmp.substring(0, tmp.indexOf(" "));
+            tmp = tmp.substring(0, tmp.indexOf(" ") + 1);
+        }
+        if (tmp.startsWith("\"")) {
+            tmp = tmp.substring(1);
+            y = tmp.substring(0, tmp.indexOf("\""));
+        }
+        else {
+            y = tmp;
+        }
+        ort.setKoordXExtern(x);
+        ort.setKoordYExtern(y);
+        return ort;
+    }
+
+    /**
+     * Parse the coordinates and the the attributes to the new ort object.
+     *
+     * @param ort       The ort object.
+     * @return The Ort object.
+     */
+    private SOrt setKoordinatenS(SOrt ort) {
+        String art = "";
+        String x = "";
+        String y = "";
+        String tmp = "";
+        if (this.koordinatenS.startsWith("\"")) {
+            tmp = this.koordinatenS.substring(1);
+            art = tmp.substring(0, tmp.indexOf("\""));
+            tmp = tmp.substring(tmp.indexOf("\"") + 2);
+        }
+        else {
+            art = this.koordinatenS.substring(0, this.koordinatenS.indexOf(" "));
+            tmp = this.koordinatenS.substring(
+                this.koordinatenS.indexOf(" ") + 1);
+        }
+        if (tmp.startsWith("\"")) {
+            tmp = tmp.substring(1);
+            x = tmp.substring(0, tmp.indexOf("\""));
+            tmp = tmp.substring(tmp.indexOf("\"") + 2);
+        }
+        else {
+            x = tmp.substring(0, tmp.indexOf(" "));
+            tmp = tmp.substring(tmp.indexOf(" ") + 1);
+        }
+        if (tmp.startsWith("\"")) {
+            tmp = tmp.substring(1);
+            y = tmp.substring(0, tmp.indexOf("\""));
+        }
+        else {
+            y = tmp;
+        }
+        ort.setKoordXExtern(x);
+        ort.setLongitude(Double.valueOf(x));
+        ort.setKoordYExtern(y);
+        ort.setLatitude(Double.valueOf(y));
+        return ort;
+    }
+
+    /**
+     * Create the new LOrt object from the given attributes.
+     *
+     * @return The new LOrt object.
+     */
+    public LOrt toLOrt() {
+        logger.debug("#### getting lort");
+        if (this.ortId == null &&
+            (this.ortCode == null || this.ortCode.length() == 0) ||
+            this.probeId == null) {
+            logger.debug("return null: " + this.probeId + "; " + this.ortCode);
+            return null;
+        }
+        if(this.ortCode != null && this.ortCode.length() > 0) {
+            String nativeQuery = "select id from stammdaten.ort where bezeichnung = '";
+            nativeQuery += this.ortCode + "'";
+            Query query = repository.entityManager("land").createNativeQuery(nativeQuery);
+            List<Integer> result = query.getResultList();
+            if (result != null && !result.isEmpty()) {
+                this.ortId = result.get(0);
+            }
+        }
+        LOrt ort = new LOrt();
+        ort.setOrt(BigInteger.valueOf(this.ortId));
+        ort.setProbeId(this.probeId);
+        ort.setOrtsTyp(this.ortTyp);
+        ort.setOrtszusatztext(this.zusatztext);
+        logger.debug("yeah a new ort");
+        return ort;
+    }
+
+    public void reset() {
+        logger.debug("resetting ortcreator");
+        this.beschreibung = null;
+        this.bezeichnung = null;
+        this.gemName = null;
+        this.gemSchluessel = null;
+        this.hoehe = null;
+        this.koord = null;
+        this.koordArt = null;
+        this.koordinaten = null;
+        this.koordinatenS = null;
+        this.koordS = null;
+        this.landKurz = null;
+        this.landLang = null;
+        this.landS = null;
+        this.nuts = null;
+        this.ortCode = null;
+        this.ortId = null;
+        this.ortTyp = null;
+        this.probeId = null;
+        this.zusatztext = null;
+    }
+}
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)