org.polymap.kaps.exporter.VertragStaLaAgrarExporter.java Source code

Java tutorial

Introduction

Here is the source code for org.polymap.kaps.exporter.VertragStaLaAgrarExporter.java

Source

/*
 * polymap.org Copyright 2013 Polymap GmbH. All rights reserved.
 * 
 * This is free software; you can redistribute it and/or modify it under the terms of
 * the GNU Lesser General Public License as published by the Free Software
 * Foundation; either version 2.1 of the License, or (at your option) any later
 * version.
 * 
 * This software is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
 */
package org.polymap.kaps.exporter;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

import org.geotools.feature.FeatureCollection;
import org.geotools.feature.FeatureIterator;
import org.opengis.feature.Feature;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.google.common.base.Charsets;

import org.eclipse.rwt.widgets.ExternalBrowser;

import org.eclipse.jface.dialogs.MessageDialog;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;

import org.polymap.core.data.operation.DefaultFeatureOperation;
import org.polymap.core.data.operation.DownloadServiceHandler;
import org.polymap.core.data.operation.DownloadServiceHandler.ContentProvider;
import org.polymap.core.data.operation.FeatureOperationExtension;
import org.polymap.core.data.operation.IFeatureOperation;
import org.polymap.core.data.operation.IFeatureOperationContext;
import org.polymap.core.runtime.Polymap;
import org.polymap.core.workbench.PolymapWorkbench;

import org.polymap.kaps.model.KapsRepository;
import org.polymap.kaps.model.data.ArtDesBaugebietsComposite;
import org.polymap.kaps.model.data.FlurComposite;
import org.polymap.kaps.model.data.FlurstueckComposite;
import org.polymap.kaps.model.data.GemarkungComposite;
import org.polymap.kaps.model.data.GemeindeComposite;
import org.polymap.kaps.model.data.KaeuferKreisComposite;
import org.polymap.kaps.model.data.NutzungComposite;
import org.polymap.kaps.model.data.RichtwertzoneComposite;
import org.polymap.kaps.model.data.RichtwertzoneZeitraumComposite;
import org.polymap.kaps.model.data.VertragComposite;
import org.polymap.kaps.model.data.VertragsdatenAgrarComposite;
import org.polymap.kaps.model.data.VertragsdatenErweitertComposite;
import org.polymap.kaps.ui.form.EingangsNummerFormatter;

/**
 * @author <a href="http://www.polymap.de">Steffen Stundzig</a>
 */
public class VertragStaLaAgrarExporter extends DefaultFeatureOperation implements IFeatureOperation {

    // Struktur
    // 000000000201300016;Mittelsachsen;Lichtenau;4535;000;00016;01012013;2;4;9;00250329;00250329;00310000;;;;A-164072m-1,64/
    // GR-40597m-0,49/ VS-960m-1,66/ Vertrag von 26.09.2012;
    // ;A-164072m-1,64/ GR-40597m-0,49/ VS-960m-1,66/ Vertrag von 26.09.2012;
    //
    // 18 Eingangsnummer 000000000201300016
    // Landkreis Mittelsachsen
    // Gemeinde Lichtenau
    // Gemarkung SCHL 4535
    // Flur 000
    // Flurstck Hauptnummer 5 Stellen 00016
    // Vertragsdatum TTMMJJJJ
    // Veruerer Stala AGRAR 2
    // Erwerber Stala AGRAR 4
    // Art des Baugebietes SCHL 9
    // Gesamtflche ber alle Grundstcke
    // Flche der landwirtschaftlichen Nutzung = Gesamtflche 8 stellig siehe Reiter
    // Weiteres
    // Geldleistung bereinigter Vollpreis 8 stelling
    // Hypothek leer alles aus FLURZWI_AGRAR
    // Tauschgrundstck leer
    // sonstige Leistung leer
    // leer
    // Bemerkung StaLa siehe Reiter Weiteres

    private static Log log = LogFactory.getLog(VertragStaLaAgrarExporter.class);

    protected static DateFormat fileFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");

    private final static String DELIMITER = ";";

    @Override
    public boolean init(IFeatureOperationContext ctx) {
        super.init(ctx);
        try {
            return context.featureSource().getSchema().getName().getLocalPart().equals(VertragComposite.NAME);
        } catch (Exception e) {
            log.warn("", e);
            return false;
        }
    }

    @Override
    public Status execute(IProgressMonitor monitor) throws Exception {
        monitor.beginTask(context.adapt(FeatureOperationExtension.class).getLabel(), context.features().size());

        final Date now = new Date();

        final File f = File.createTempFile("StatLandesamt_Agrar", ".txt");
        f.deleteOnExit();
        BufferedWriter out = new BufferedWriter(new FileWriter(f));

        final List<String> lines = new ArrayList<String>();
        final List<String> errors = new ArrayList<String>();

        try {
            export(context.features(), lines, monitor, errors);
            if (!lines.isEmpty()) {
                for (String line : lines) {
                    out.write(new String((line + "\n").getBytes(Charsets.UTF_8), Charsets.ISO_8859_1));
                }
                out.flush();
            }
            if (!errors.isEmpty()) {
                final StringBuilder allErrors = new StringBuilder();
                int count = 0;
                for (String line : errors) {
                    allErrors.append(line).append("\n");
                    count++;
                    if (count > 15) {
                        break;
                    }
                }
                if (count < errors.size()) {
                    allErrors.append("\n").append("Weitere " + (errors.size() - count) + " Fehler entfernt...");
                }
                allErrors.append("\n").append("Es wurden " + lines.size() + " Vertrge exportiert.");

                Polymap.getSessionDisplay().asyncExec(new Runnable() {

                    public void run() {
                        MessageDialog.openError(PolymapWorkbench.getShellToParentOn(), "Fehler beim Export",
                                allErrors.toString());
                    }
                });
            } else {
                Polymap.getSessionDisplay().asyncExec(new Runnable() {

                    public void run() {
                        MessageDialog.openInformation(PolymapWorkbench.getShellToParentOn(), "Export durchgefhrt",
                                "Es wurden " + lines.size() + " Vertrge exportiert.");
                    }
                });
            }
        } catch (OperationCanceledException e) {
            return Status.Cancel;
        } finally {
            IOUtils.closeQuietly(out);
        }

        // open download
        if (!lines.isEmpty()) {
            Polymap.getSessionDisplay().asyncExec(new Runnable() {

                public void run() {

                    String url = DownloadServiceHandler.registerContent(new ContentProvider() {

                        public String getContentType() {
                            return "text/plain; charset=" + Charsets.ISO_8859_1.name();
                        }

                        public String getFilename() {
                            return "StatLandesamt_Agrar_" + fileFormat.format(new Date()) + ".txt";
                        }

                        public InputStream getInputStream() throws Exception {
                            return new BufferedInputStream(new FileInputStream(f));
                        }

                        public boolean done(boolean success) {
                            f.delete();
                            return true;
                        }

                    });

                    log.info("TXT: download URL: " + url);

                    ExternalBrowser.open("download_window", url,
                            ExternalBrowser.NAVIGATION_BAR | ExternalBrowser.STATUS);
                }
            });
        }

        monitor.done();
        return Status.OK;
    }

    private void export(FeatureCollection features, List<String> lines, IProgressMonitor monitor,
            List<String> errors) throws IOException {

        final KapsRepository repo = KapsRepository.instance();

        FeatureIterator it = null;

        try {
            // reload the iterator
            it = features.features();
            int count = 0;
            while (it.hasNext()) {
                if (monitor.isCanceled()) {
                    throw new OperationCanceledException();
                }
                if ((++count % 100) == 0) {
                    monitor.subTask("Objekte: " + count++);
                    monitor.worked(100);
                }
                Feature feature = it.next();

                VertragComposite vdc = repo.findEntity(VertragComposite.class, feature.getIdentifier().getID());
                // all properties
                export(lines, vdc, errors);

            }
        } finally {
            if (it != null) {
                it.close();
            }
        }
    }

    private void export(List<String> lines, VertragComposite vertrag, List<String> errors) {

        VertragsdatenAgrarComposite vdc = VertragsdatenAgrarComposite.Mixin.forVertrag(vertrag);
        if (vdc == null) {
            errors.add(error(vertrag, "Erweiterte Vertragsdaten Agrar nicht gefunden"));
            return;
        }
        FlurstueckComposite flurstueck = null;
        for (FlurstueckComposite fs : FlurstueckComposite.Mixin.forEntity(vertrag)) {
            NutzungComposite nutzung = fs.nutzung().get();
            if (nutzung != null && nutzung.isAgrar().get() != null && nutzung.isAgrar().get() == Boolean.TRUE) {
                flurstueck = fs;
                break;
            }
        }
        if (flurstueck == null) {
            errors.add(error(vertrag, "Flurstck mit Nutzung Agrar nicht gefunden"));
            return;
        }
        GemarkungComposite gemarkung = flurstueck.gemarkung().get();
        if (gemarkung == null) {
            errors.add(error(vertrag, "Gemarkung nicht gefunden"));
            return;
        }
        RichtwertzoneZeitraumComposite richtwertzoneZ = vdc.richtwertZone1().get();
        if (richtwertzoneZ == null) {
            errors.add(error(vertrag, "Richtwertzone nicht gefunden"));
            return;
        }
        RichtwertzoneComposite richtwertzone = richtwertzoneZ.zone().get();
        if (richtwertzone == null) {
            errors.add(error(vertrag, "Richtwertzone nicht gefunden"));
            return;
        }
        GemeindeComposite gemeinde = richtwertzone.gemeinde().get();
        if (gemeinde == null) {
            errors.add(error(vertrag, "Gemeinde nicht gefunden"));
            return;
        }
        VertragsdatenErweitertComposite vertragErweitert = vertrag.erweiterteVertragsdaten().get();
        if (vertragErweitert == null) {
            errors.add(error(vertrag, "Erweiterte Vertragsdaten fehlen"));
            return;
        }

        List<String> contents = new ArrayList<String>();
        // data

        // String kennnummer = 18
        contents.add(String.format("%018d", vertrag.eingangsNr().get()));

        // String land =
        contents.add("Mittelsachsen");
        // String kreisGemeinde =
        contents.add(gemeinde.name().get());
        contents.add(gemarkung.schl().get());

        FlurComposite flur = flurstueck.flur().get();
        // gibts in Sachsen nicht
        contents.add(flur == null ? "000" : flur.schl().get());

        // flurstueck1
        contents.add(String.format("%05d", flurstueck.hauptNummer().get()));
        // flurstueck2
        contents.add(
                flurstueck.unterNummer().get() != null ? StringUtils.leftPad(flurstueck.unterNummer().get(), 5, "0")
                        : "");

        // Datum
        Calendar cal = new GregorianCalendar();
        cal.setTime(vertrag.vertragsDatum().get());

        // String tag =
        contents.add(String.format("%02d", cal.get(Calendar.DAY_OF_MONTH))
                + String.format("%02d", cal.get(Calendar.MONTH) + 1)
                + String.format("%04d", cal.get(Calendar.YEAR)));

        KaeuferKreisComposite verkaeuferKreisComposite = vertrag.verkaeuferKreis().get();
        if (verkaeuferKreisComposite == null) {
            errors.add(error(vertrag, "Verkufer nicht gefunden"));
            return;
        }
        if (verkaeuferKreisComposite.stalaAgrar().get() == null) {
            errors.add(error(vertrag, "Verkufer - StaLa Zuordnung nicht gefunden"));
            return;
        }
        // String veruerer - 2
        contents.add(verkaeuferKreisComposite.stalaAgrar().get().schl().get());

        KaeuferKreisComposite kaeuferKreisComposite = vertrag.kaeuferKreis().get();
        if (kaeuferKreisComposite == null) {
            errors.add(error(vertrag, "Erwerber nicht gefunden"));
            return;
        }
        if (kaeuferKreisComposite.stalaAgrar().get() == null) {
            errors.add(error(vertrag, "Erwerber - StaLa Zuordnung nicht gefunden"));
            return;
        }
        // String Erwerber - 2
        contents.add(kaeuferKreisComposite.stalaAgrar().get().schl().get());

        ArtDesBaugebietsComposite artDesBaugebietsC = flurstueck.artDesBaugebiets().get();
        if (artDesBaugebietsC == null) {
            errors.add(error(vertrag, "Art des Grundstcks nicht gefunden"));
            return;
        }
        // String artDesBaugebiets =
        contents.add(artDesBaugebietsC.schl().get());

        // String flaeche =
        if (vdc.verkaufteFlaeche().get() == null) {
            errors.add(error(vertrag, "Verkaufte Flche gesamt nicht gefunden"));
            return;
        }
        contents.add(String.format("%08d", vdc.verkaufteFlaeche().get().intValue()));

        // String flaeche =
        Double flaecheLandwirtschaftStala = vdc.flaecheLandwirtschaftStala().get();
        if (flaecheLandwirtschaftStala == null) {
            errors.add(error(vertrag, "Flche der landwirtschaftlichen Nutzung nicht gefunden, nutze 0"));
        }
        contents.add(String.format("%08d",
                flaecheLandwirtschaftStala != null ? flaecheLandwirtschaftStala.intValue() : 0));

        if (vertragErweitert.bereinigterVollpreis().get() == null) {
            errors.add(error(vertrag, "Bereinigter Vollpreis nicht gefunden"));
            return;
        }
        // String geldwert =
        contents.add(String.format("%08d", vertragErweitert.bereinigterVollpreis().get().intValue()));

        // String hypotheken =
        Double h = vdc.hypothekStala().get();
        //        if (h == null) {
        //            errors.add( error( vertrag, "Hypotheken nicht gefunden, nutze 0" ) );
        //        }
        contents.add(String.format("%08d", h != null ? h.intValue() : 0));

        // String tauschgrundstck =
        h = vdc.wertTauschStala().get();
        //        if (h == null) {
        //            errors.add( error( vertrag, "Wert des Tauschgrundstckes nicht gefunden, nutze 0" ) );
        //        }
        contents.add(String.format("%08d", h != null ? h.intValue() : 0));

        // String sonstiges =
        h = vdc.wertSonstigesStala().get();
        //        if (h == null) {
        //            errors.add( error( vertrag, "Wert sonstige Leistungen nicht gefunden, nutze 0" ) );
        //        }
        contents.add(String.format("%08d", h != null ? h.intValue() : 0));

        String b = vdc.bemerkungStala().get();
        if (b != null) {
            contents.add(b);
        }

        StringBuilder ret = new StringBuilder();
        for (String s : contents) {
            ret.append(s).append(DELIMITER);
        }
        lines.add(ret.toString());
    }

    private String error(VertragComposite vertrag, String msg) {
        return EingangsNummerFormatter.format(vertrag.eingangsNr().get()) + ": " + msg;
    }
}