de.cismet.cids.custom.utils.alkis.VermessungsrissPictureFinder.java Source code

Java tutorial

Introduction

Here is the source code for de.cismet.cids.custom.utils.alkis.VermessungsrissPictureFinder.java

Source

/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
*              ... and it just works.
*
****************************************************/
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package de.cismet.cids.custom.utils.alkis;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;

import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import java.net.URL;
import java.net.URLEncoder;

import java.util.ArrayList;
import java.util.List;

import de.cismet.cids.dynamics.CidsBean;

import de.cismet.commons.security.handler.ExtendedAccessHandler;
import de.cismet.commons.security.handler.SimpleHttpAccessHandler;

/**
 * DOCUMENT ME!
 *
 * @author   daniel
 * @version  $Revision$, $Date$
 */
public class VermessungsrissPictureFinder {

    //~ Static fields/initializers ---------------------------------------------

    public static final String SEP = "/";
    static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger
            .getLogger(VermessungsrissPictureFinder.class);
    private static final String[] SUFFIXE = new String[] { ".tif", ".jpg", ".jpe", ".tiff", ".jpeg", ".TIF", ".JPG",
            ".JPE", ".TIFF", ".JPEG" };
    public static final String SUFFIX_REDUCED_SIZE = "_rs";
    private static final String LINKEXTENSION = ".txt";
    private static final String PREFIX_GRENZNIEDERSCHRIFT = "GN";
    private static final String PREFIX_VERMESSUNGSRISS = "VR";
    private static final String PREFIX_ERGAENZUNGSKARTEN = "GN";
    private static final String PREFIX_FLURBUECHER = "FB";
    private static final String PREFIX_LIEGENSCHAFTSBUECHER = "LB";
    private static final String PREFIX_NAMENSVERZEICHNIS = "NV";
    private static final String SCHLUESSEL_ERGAENZUNGSKARTEN = "518";
    private static final String SCHLUESSEL_FLURBUECHER1 = "536";
    private static final String SCHLUESSEL_FLURBUECHER2 = "537";
    private static final String SCHLUESSEL_LIEGENSCHAFTSBUECHER1 = "546";
    private static final String SCHLUESSEL_LIEGENSCHAFTSBUECHER2 = "547";
    private static final String SCHLUESSEL_NAMENSVERZEICHNIS = "566";
    private static final String PATH_PLATZHALTER = "platzhalter";

    //~ Instance fields --------------------------------------------------------

    private final ExtendedAccessHandler simpleUrlAccessHandler;
    private final AlkisConf alkisConf;

    //~ Constructors -----------------------------------------------------------

    /**
     * Creates a new VermessungsrissPictureFinder object.
     *
     * @param  simpleUrlAccessHandler  DOCUMENT ME!
     * @param  alkisConf               DOCUMENT ME!
     */
    protected VermessungsrissPictureFinder(final ExtendedAccessHandler simpleUrlAccessHandler,
            final AlkisConf alkisConf) {
        this.simpleUrlAccessHandler = simpleUrlAccessHandler;
        this.alkisConf = alkisConf;
    }

    /**
     * Creates a new VermessungsrissPictureFinder object.
     */
    private VermessungsrissPictureFinder() {
        this.simpleUrlAccessHandler = new SimpleHttpAccessHandler();
        this.alkisConf = ServerAlkisConf.getInstance();
    }

    //~ Methods ----------------------------------------------------------------

    /**
     * DOCUMENT ME!
     *
     * @param   riss       blattnummer picture DOCUMENT ME!
     * @param   gemarkung  laufendeNummer DOCUMENT ME!
     * @param   flur       DOCUMENT ME!
     * @param   blatt      DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    public List<URL> findVermessungsrissPicture(final String riss, final Integer gemarkung, final String flur,
            final String blatt) {
        return findVermessungsrissPicture(true, riss, gemarkung, flur, blatt);
    }

    /**
     * DOCUMENT ME!
     *
     * @param   schluessel    DOCUMENT ME!
     * @param   gemarkung     DOCUMENT ME!
     * @param   steuerbezirk  DOCUMENT ME!
     * @param   bezeichner    DOCUMENT ME!
     * @param   historisch    DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    public List<URL> findVermessungsbuchwerkPicture(final String schluessel, final CidsBean gemarkung,
            final Integer steuerbezirk, final String bezeichner, final boolean historisch) {
        return findVermessungsbuchwerkPicture(true, schluessel, gemarkung, steuerbezirk, bezeichner, historisch);
    }

    /**
     * DOCUMENT ME!
     *
     * @param   checkReducedSize  DOCUMENT ME!
     * @param   riss              DOCUMENT ME!
     * @param   gemarkung         DOCUMENT ME!
     * @param   flur              DOCUMENT ME!
     * @param   blatt             DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    public List<URL> findVermessungsrissPicture(final boolean checkReducedSize, final String riss,
            final Integer gemarkung, final String flur, final String blatt) {
        final String picturePath = getVermessungsrissPictureFilename(riss, gemarkung, flur, blatt);
        if (LOG.isDebugEnabled()) {
            LOG.debug("findVermessungrissPicture: " + picturePath);
        }

        return probeWebserverForRightSuffix(checkReducedSize, picturePath);
    }

    /**
     * DOCUMENT ME!
     *
     * @param   checkReducedSize  DOCUMENT ME!
     * @param   schluessel        DOCUMENT ME!
     * @param   gemarkung         DOCUMENT ME!
     * @param   steuerbezirk      DOCUMENT ME!
     * @param   bezeichner        DOCUMENT ME!
     * @param   historisch        DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    public List<URL> findVermessungsbuchwerkPicture(final boolean checkReducedSize, final String schluessel,
            final CidsBean gemarkung, final Integer steuerbezirk, final String bezeichner,
            final boolean historisch) {
        final String picturePath = getVermessungsbuchwerkPictureFilename(schluessel, gemarkung, steuerbezirk,
                bezeichner, historisch);
        if (LOG.isDebugEnabled()) {
            LOG.debug("findVermessungrissPicture: " + picturePath);
        }

        return probeWebserverForRightSuffix(checkReducedSize, picturePath);
    }

    /**
     * DOCUMENT ME!
     *
     * @param   riss       blattnummer picture DOCUMENT ME!
     * @param   gemarkung  laufendeNummer DOCUMENT ME!
     * @param   flur       DOCUMENT ME!
     * @param   blatt      DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    public List<URL> findGrenzniederschriftPicture(final String riss, final Integer gemarkung, final String flur,
            final String blatt) {
        return findGrenzniederschriftPicture(false, riss, gemarkung, flur, blatt);
    }

    /**
     * DOCUMENT ME!
     *
     * @param   checkReducedSize  DOCUMENT ME!
     * @param   riss              DOCUMENT ME!
     * @param   gemarkung         DOCUMENT ME!
     * @param   flur              DOCUMENT ME!
     * @param   blatt             DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    public List<URL> findGrenzniederschriftPicture(final boolean checkReducedSize, final String riss,
            final Integer gemarkung, final String flur, final String blatt) {
        final String picturePath = getGrenzniederschriftFilename(riss, gemarkung, flur, blatt);
        if (LOG.isDebugEnabled()) {
            LOG.debug("findGrenzniederschriftPicture: " + picturePath);
        }
        return probeWebserverForRightSuffix(checkReducedSize, picturePath);
    }

    /**
     * DOCUMENT ME!
     *
     * @param   riss       blattnummer DOCUMENT ME!
     * @param   gemarkung  laufendeNummer DOCUMENT ME!
     * @param   flur       DOCUMENT ME!
     * @param   blatt      DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    public String getGrenzniederschriftFilename(final String riss, final Integer gemarkung, final String flur,
            final String blatt) {
        final String ret = getObjectFilename(true, true, riss, gemarkung, flur, blatt);

        return (ret != null) ? ret : null;
    }

    /**
     * DOCUMENT ME!
     *
     * @param   withPath              DOCUMENT ME!
     * @param   isGrenzniederschrift  blattnummer DOCUMENT ME!
     * @param   schluessel            laufendeNummer DOCUMENT ME!
     * @param   gemarkung             DOCUMENT ME!
     * @param   flur                  DOCUMENT ME!
     * @param   blatt                 DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    public String getObjectFilename(final boolean withPath, final boolean isGrenzniederschrift,
            final String schluessel, final Integer gemarkung, final String flur, final String blatt) {
        final boolean isErganzungskarte = SCHLUESSEL_ERGAENZUNGSKARTEN.equals(schluessel);
        final StringBuffer buf = new StringBuffer();
        if (isGrenzniederschrift) {
            buf.append(PREFIX_GRENZNIEDERSCHRIFT);
        } else {
            buf.append(PREFIX_VERMESSUNGSRISS);
        }
        buf.append("_");
        buf.append(StringUtils.leftPad(schluessel, 3, '0'));
        buf.append("-");
        buf.append(String.format("%04d", gemarkung));
        buf.append("-");
        buf.append(StringUtils.leftPad(flur, 3, '0'));
        buf.append("-");
        buf.append(StringUtils.leftPad(blatt, 8, '0'));
        final StringBuffer b = new StringBuffer();
        if (withPath) {
            b.append(getFolder(isErganzungskarte, isGrenzniederschrift, gemarkung));
            b.append(SEP);
        }
        b.append(buf.toString());
        return b.toString();
    }

    /**
     * DOCUMENT ME!
     *
     * @param   schluessel    DOCUMENT ME!
     * @param   gemarkung     DOCUMENT ME!
     * @param   steuerbezirk  DOCUMENT ME!
     * @param   bezeichner    DOCUMENT ME!
     * @param   historisch    isGrenzniederschrift DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     *
     * @throws  UnsupportedEncodingException  DOCUMENT ME!
     */
    public String getBuchwerkFilename(final String schluessel, final CidsBean gemarkung, final Integer steuerbezirk,
            final String bezeichner, final boolean historisch) throws UnsupportedEncodingException {
        final StringBuffer buf = new StringBuffer();
        buf.append(getBuchwerkFolder(schluessel, gemarkung));
        buf.append(SEP);
        if (SCHLUESSEL_ERGAENZUNGSKARTEN.equals(schluessel)) {
            buf.append(PREFIX_ERGAENZUNGSKARTEN).append("_");
        } else if (SCHLUESSEL_FLURBUECHER1.equals(schluessel) || SCHLUESSEL_FLURBUECHER2.equals(schluessel)) {
            buf.append(PREFIX_FLURBUECHER).append("_");
        } else if (SCHLUESSEL_LIEGENSCHAFTSBUECHER1.equals(schluessel)
                || SCHLUESSEL_LIEGENSCHAFTSBUECHER2.equals(schluessel)) {
            buf.append(PREFIX_LIEGENSCHAFTSBUECHER).append("_");
        } else if (SCHLUESSEL_NAMENSVERZEICHNIS.equals(schluessel)) {
            buf.append(PREFIX_NAMENSVERZEICHNIS).append("_");
        }
        buf.append(StringUtils.leftPad(schluessel, 3, '0')).append("-")
                .append(String.format("%04d", (Integer) gemarkung.getProperty("id"))).append("-")
                .append(historisch ? "001" : "000").append("-").append(steuerbezirk)
                .append(StringUtils.leftPad(bezeichner, 7, '0'));
        return buf.toString();
    }

    /**
     * DOCUMENT ME!
     *
     * @param   isGrenzNiederschrift  DOCUMENT ME!
     * @param   filename              DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    public String getObjectPath(final boolean isGrenzNiederschrift, final String filename) {
        if (filename.startsWith(PATH_PLATZHALTER)) {
            return (isGrenzNiederschrift ? alkisConf.getVermessungHostGrenzniederschriften()
                    : alkisConf.getVermessungHostBilder()) + filename;
        }
        final boolean isErganzungskarte = filename
                .contains((isGrenzNiederschrift ? PREFIX_VERMESSUNGSRISS : PREFIX_GRENZNIEDERSCHRIFT) + "_"
                        + SCHLUESSEL_ERGAENZUNGSKARTEN + "-");
        final String[] splittedFilename = filename.split("-");
        final Integer gemarkung = Integer.parseInt(splittedFilename[1]);
        final String filenameWithPrefix = (isGrenzNiederschrift ? PREFIX_GRENZNIEDERSCHRIFT
                : PREFIX_VERMESSUNGSRISS) + "_" + filename;
        return new StringBuffer(getFolder(isErganzungskarte, isGrenzNiederschrift, gemarkung)).append(SEP)
                .append(filenameWithPrefix).toString();
    }

    /**
     * DOCUMENT ME!
     *
     * @param   isGrenzNiederschrift  DOCUMENT ME!
     * @param   documentFileName      DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    public String getLinkFromLinkDocument(final boolean isGrenzNiederschrift, final String documentFileName) {
        InputStream urlStream = null;
        try {
            final URL objectURL = new URL(documentFileName + LINKEXTENSION);
            if (simpleUrlAccessHandler.checkIfURLaccessible(objectURL)) {
                urlStream = simpleUrlAccessHandler.doRequest(objectURL);
                if (urlStream != null) {
                    final String link = IOUtils.toString(urlStream);
                    return link;
                }
            }
        } catch (Exception ex) {
            LOG.error("Exception while checking link docuemtn", ex);
        } finally {
            if (urlStream != null) {
                try {
                    urlStream.close();
                } catch (Exception e) {
                    LOG.warn("Error during closing InputStream.", e);
                }
            }
        }
        return null;
    }

    /**
     * DOCUMENT ME!
     *
     * @param   riss       blattnummer DOCUMENT ME!
     * @param   gemarkung  laufendeNummer DOCUMENT ME!
     * @param   flur       DOCUMENT ME!
     * @param   blatt      DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    public String getVermessungsrissPictureFilename(final String riss, final Integer gemarkung, final String flur,
            final String blatt) {
        final String ret = getObjectFilename(true, false, riss, gemarkung, flur, blatt);

        return (ret != null) ? ret : null;
    }

    /**
     * DOCUMENT ME!
     *
     * @param   schluessel    DOCUMENT ME!
     * @param   gemarkung     DOCUMENT ME!
     * @param   steuerbezirk  DOCUMENT ME!
     * @param   bezeichner    DOCUMENT ME!
     * @param   historisch    DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    public String getVermessungsbuchwerkPictureFilename(final String schluessel, final CidsBean gemarkung,
            final Integer steuerbezirk, final String bezeichner, final boolean historisch) {
        final String ret;
        try {
            ret = getBuchwerkFilename(schluessel, gemarkung, steuerbezirk, bezeichner, historisch);
        } catch (final UnsupportedEncodingException ex) {
            LOG.error(ex, ex);
            return null;
        }

        return (ret != null) ? ret : null;
    }

    /**
     * DOCUMENT ME!
     *
     * @param   checkReducedSize   DOCUMENT ME!
     * @param   fileWithoutSuffix  DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    private List<URL> probeWebserverForRightSuffix(final boolean checkReducedSize, final String fileWithoutSuffix) {
        return probeWebserverForRightSuffix(checkReducedSize, fileWithoutSuffix, 0);
    }

    /**
     * DOCUMENT ME!
     *
     * @param   checkReducedSize   DOCUMENT ME!
     * @param   fileWithoutSuffix  DOCUMENT ME!
     * @param   recursionDepth     DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    public List<URL> probeWebserverForRightSuffix(final boolean checkReducedSize, final String fileWithoutSuffix,
            final int recursionDepth) {
        if (LOG.isDebugEnabled()) {
            LOG.debug("Searching for picture: " + fileWithoutSuffix + "xxx");
        }
        final List<URL> results = new ArrayList<>();
        // check if there is a reduced size image direcly...
        final String searchName = checkReducedSize ? (fileWithoutSuffix + SUFFIX_REDUCED_SIZE) : fileWithoutSuffix;
        for (final String suffix : SUFFIXE) {
            try {
                final URL objectURL = new URL(searchName + suffix);

                if (simpleUrlAccessHandler.checkIfURLaccessible(objectURL)) {
                    results.add(objectURL);
                }
            } catch (Exception ex) {
                LOG.error("Problem occured, during checking for " + searchName + suffix, ex);
            }
        }
        // we need to do an extra round if we checked with _rs suffix...
        if (results.isEmpty() && checkReducedSize) {
            for (final String suffix : SUFFIXE) {
                try {
                    final URL objectURL = new URL(fileWithoutSuffix + suffix);

                    if (simpleUrlAccessHandler.checkIfURLaccessible(objectURL)) {
                        results.add(objectURL);
                    }
                } catch (Exception ex) {
                    LOG.error("Problem occured, during checking for " + searchName + suffix, ex);
                }
            }
        }
        // if the results is still empty check if there is a link...
        if (results.isEmpty()) {
            if (LOG.isDebugEnabled()) {
                LOG.debug("No picture file found. Check for Links");
            }
            if (recursionDepth < 3) {
                InputStream urlStream = null;
                try {
                    final URL objectURL = new URL(fileWithoutSuffix + LINKEXTENSION);
                    if (simpleUrlAccessHandler.checkIfURLaccessible(objectURL)) {
                        urlStream = simpleUrlAccessHandler.doRequest(objectURL);
                        if (urlStream != null) {
                            final String link = IOUtils.toString(urlStream);
                            final boolean isGrenzNiederschrift = fileWithoutSuffix
                                    .contains(PREFIX_GRENZNIEDERSCHRIFT);
                            return probeWebserverForRightSuffix(checkReducedSize,
                                    getObjectPath(isGrenzNiederschrift, link.trim()), recursionDepth + 1);
                        }
                    }
                } catch (Exception ex) {
                    LOG.error(ex, ex);
                } finally {
                    if (urlStream != null) {
                        try {
                            urlStream.close();
                        } catch (Exception ex) {
                            LOG.warn("Error during closing InputStream.", ex);
                        }
                    }
                }
            } else {
                LOG.error("No hop,hop,hop possible within this logic. Seems to be an endless loop, sorry.",
                        new Exception("JustTheStackTrace"));
            }
        }
        return results;
    }

    /**
     * DOCUMENT ME!
     *
     * @param   isErgaenzungskarte    DOCUMENT ME!
     * @param   isGrenzniederschrift  DOCUMENT ME!
     * @param   gemarkung             DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    public String getFolder(final boolean isErgaenzungskarte, final boolean isGrenzniederschrift,
            final Integer gemarkung) {
        final StringBuffer buf;
        if (isErgaenzungskarte) {
            buf = new StringBuffer(alkisConf.getVermessungHostErgaenzungskarten());
        } else if (isGrenzniederschrift) {
            buf = new StringBuffer(alkisConf.getVermessungHostGrenzniederschriften());
        } else {
            buf = new StringBuffer(alkisConf.getVermessungHostBilder());
        }
        if (!isErgaenzungskarte) {
            buf.append(String.format("%04d", gemarkung));
        }
        return buf.toString();
    }

    /**
     * DOCUMENT ME!
     *
     * @param   schluessel  DOCUMENT ME!
     * @param   gemarkung   DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     *
     * @throws  UnsupportedEncodingException  DOCUMENT ME!
     */
    public String getBuchwerkFolder(final String schluessel, final CidsBean gemarkung)
            throws UnsupportedEncodingException {
        final StringBuffer buf = new StringBuffer();
        if (SCHLUESSEL_NAMENSVERZEICHNIS.equals(schluessel)) {
            buf.append(alkisConf.getVermessungHostNamensverzeichnis()).append(SEP).append(PREFIX_NAMENSVERZEICHNIS)
                    .append("_").append(StringUtils.leftPad(schluessel, 3, '0')).append("-")
                    .append(String.format("%04d", (Integer) gemarkung.getProperty("id")));
        } else if (SCHLUESSEL_FLURBUECHER1.equals(schluessel) || SCHLUESSEL_FLURBUECHER2.equals(schluessel)) {
            buf.append(alkisConf.getVermessungHostFlurbuecher());
        } else if (SCHLUESSEL_LIEGENSCHAFTSBUECHER1.equals(schluessel)
                || SCHLUESSEL_LIEGENSCHAFTSBUECHER2.equals(schluessel)) {
            buf.append(alkisConf.getVermessungHostLiegenschaftsbuecher()).append(SEP)
                    .append(URLEncoder.encode((String) gemarkung.getProperty("name"), "UTF-8"));
        }
        return buf.toString();
    }

    /**
     * DOCUMENT ME!
     *
     * @return  DOCUMENT ME!
     */
    public static VermessungsrissPictureFinder getInstance() {
        return LazyInitialiser.INSTANCE;
    }

    //~ Inner Classes ----------------------------------------------------------

    /**
     * DOCUMENT ME!
     *
     * @version  $Revision$, $Date$
     */
    private static final class LazyInitialiser {

        //~ Static fields/initializers -----------------------------------------

        private static final VermessungsrissPictureFinder INSTANCE = new VermessungsrissPictureFinder();

        //~ Constructors -------------------------------------------------------

        /**
         * Creates a new LazyInitialiser object.
         */
        private LazyInitialiser() {
        }
    }
}