Commit 1a4e1ab4 authored by Christian Kniss's avatar Christian Kniss

Initialisierung GitLab-Repo fuer Sourcecode der SWE de.bsvrz.kex.lmstic3-FREI_V1.1.1_D2017-07-04

parents
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: gysi
Created-By: Apache Maven
Build-Jdk: 1.8.0_121
/*
* Segment 2 (KEx), SWE LMS-TIC3
* Copyright (C) 2016 BitCtrl Systems GmbH
*
* This library 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 library 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Contact Information:
* BitCtrl Systems GmbH
* Weißenfelser Straße 67
* 04229 Leipzig
* Phone: +49 341-490670
* mailto: info@bitctrl.de
*/
package de.bsvrz.kex.lmstic3.empfang.dekoder;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import de.bsvrz.kex.lmstic3.vew.daten.tic.TIC3Exception;
import de.bsvrz.kex.lmstic3.vew.daten.tic.TIC3Meldung;
import de.bsvrz.kex.lmstic3.vew.daten.tic.TIC3MeldungsDaten;
/**
* Klasse zum Zugriff auf Dateien nach TIC3-Info Spezifikation.
*
* @author BitCtrl Systems GmbH, Gieseler
* @version $Id: TIC3InfoDatei.java 64239 2016-11-09 12:34:02Z gieseler $
*/
public class TIC3InfoDatei {
/** TIC-Info Schema Location. */
private final String ticSchemaDatei = "de/bsvrz/kex/lms/vew/TIC Info XML.xsd";
/** die Datei. */
private final File ticDatei;
/**
* Konstruktor aus Datei.
*
* @param datei
* Datei
*/
public TIC3InfoDatei(final File datei) {
ticDatei = datei;
}
/**
* Erzeugt aus der Datei eine Liste von enthaltenen TIC3-Meldungen.
*
* @param mitVerifikation
* legt fest, ob die empfangenen Dateien gegen das Schema
* validiert werden sollen
* @return {@link TIC3InfoDateiDaten}
*/
public TIC3InfoDateiDaten bildeMeldungen(final boolean mitVerifikation) {
final TIC3InfoDateiDaten daten = new TIC3InfoDateiDaten();
final Document doc;
try {
doc = getDocument(mitVerifikation);
} catch (final TIC3InfoDateiException e) {
daten.setExeption(new TIC3InfoDateiException(e.getMessage()));
return daten;
}
final NodeList nl = doc.getElementsByTagName(TIC3Meldung.XML_ELEMENT_MELDUNG);
for (int i = 0; i < nl.getLength(); i++) {
try {
final TIC3MeldungsDaten meldung = new TIC3MeldungsDaten(nl.item(i));
daten.addMeldung(meldung);
} catch (final TIC3Exception | NumberFormatException e) {
// speichere die erste Exception
if (daten.getExeption() == null) {
daten.setExeption(new TIC3InfoDateiException(e.getMessage()));
}
}
}
return daten;
}
/**
* Erzeugt das Document zur Datei. (Falls eine Verifikation der Datei gegen
* das Schema einmal m&ouml;glich ist, sollte dies hier erfolgen)
*
* @param mitVerifikation
* legt fest, ob die empfangenen Dateien gegen das Schema
* validiert werden sollen
* @return Document
* @throws TIC3InfoDateiException
* bei Fehlern
*/
private Document getDocument(final boolean mitVerifikation) throws TIC3InfoDateiException {
Document doc = null;
final DocumentBuilderFactory docfactory = DocumentBuilderFactory.newInstance();
if (mitVerifikation) {
final SchemaFactory schemafactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
final URL schemaurl;
try {
schemaurl = new URL("file://" + ticSchemaDatei);
// final URL schemaurl =
// ClassLoader.getSystemResource(_ticSchemaDatei);
// Validierung gegen Schema nicht möglich
// Aussage Herr Kuske, Fa. GEWI
final Schema ticschema = schemafactory.newSchema(schemaurl);
docfactory.setSchema(ticschema);
docfactory.setValidating(true);
} catch (final MalformedURLException e) {
throw new TIC3InfoDateiException(e.getMessage());
} catch (final SAXException e) {
throw new TIC3InfoDateiException(e.getMessage());
}
}
InputStream is = null;
try {
final DocumentBuilder parser = docfactory.newDocumentBuilder();
is = new FileInputStream(ticDatei);
doc = parser.parse(is);
} catch (final Exception e) {
throw new TIC3InfoDateiException(e.getMessage());
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
}
}
}
return doc;
}
}
/*
* Segment 2 (KEx), SWE LMS-TIC3
* Copyright (C) 2016 BitCtrl Systems GmbH
*
* This library 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 library 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Contact Information:
* BitCtrl Systems GmbH
* Weißenfelser Straße 67
* 04229 Leipzig
* Phone: +49 341-490670
* mailto: info@bitctrl.de
*/
package de.bsvrz.kex.lmstic3.empfang.dekoder;
import java.util.ArrayList;
import java.util.Collection;
import de.bsvrz.kex.lmstic3.vew.daten.tic.TIC3MeldungsDaten;
/**
* Ergebnis Einlesen der TIC3-Datei.
*
* @author BitCtrl Systems GmbH, Gieseler
* @version $Id: $
*/
public class TIC3InfoDateiDaten {
private Collection<TIC3MeldungsDaten> meldungen = new ArrayList<>();
private TIC3InfoDateiException exeption;
/**
* Gibt die in der Datei enthaltenen Meldungen zur&uuml;ck.
*
* @return {@link TIC3MeldungsDaten}
*/
public Collection<TIC3MeldungsDaten> getMeldungen() {
return meldungen;
}
/**
* F&uuml;gt Meldungsdaten hinzu.
*
* @param meldung
* {@link TIC3MeldungsDaten}
*/
public void addMeldung(final TIC3MeldungsDaten meldung) {
meldungen.add(meldung);
}
/**
* Gibt die erste aufgetretene Ausnahme zur&uuml;ck.
*
* @return {@link TIC3InfoDateiException}
*/
public TIC3InfoDateiException getExeption() {
return exeption;
}
/**
* Setzt aufgetretene Ausnahme.
*
* @param exeption
* {@link TIC3InfoDateiException}
*/
public void setExeption(final TIC3InfoDateiException exeption) {
this.exeption = exeption;
}
}
/*
* Segment 2 (KEx), SWE LMS-TIC3
* Copyright (C) 2016 BitCtrl Systems GmbH
*
* This library 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 library 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Contact Information:
* BitCtrl Systems GmbH
* Weißenfelser Straße 67
* 04229 Leipzig
* Phone: +49 341-490670
* mailto: info@bitctrl.de
*/
package de.bsvrz.kex.lmstic3.empfang.dekoder;
/**
* Ausnahmeklasse f&uuml;r Ausnahmen beim Einlesen von TIC3-Info Dateien.
*
* @author BitCtrl Systems GmbH, Gieseler
*/
public class TIC3InfoDateiException extends Exception {
/**
* VersionUID .
*/
private static final long serialVersionUID = 5674973184064158638L;
/**
* Konstruktor mit Message-Argument.
*
* @param message
* Grund der Ausnahme
*/
public TIC3InfoDateiException(final String message) {
super(message);
}
}
/*
* Segment 2 (KEx), SWE LMS-TIC3
* Copyright (C) 2016 BitCtrl Systems GmbH
*
* This library 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 library 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Contact Information:
* BitCtrl Systems GmbH
* Weißenfelser Straße 67
* 04229 Leipzig
* Phone: +49 341-490670
* mailto: info@bitctrl.de
*/
/** Komponente Dekoder. */
package de.bsvrz.kex.lmstic3.empfang.dekoder;
/*
* Segment 2 (KEx), SWE LMS-TIC3
* Copyright (C) 2016 BitCtrl Systems GmbH
*
* This library 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 library 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Contact Information:
* BitCtrl Systems GmbH
* Weißenfelser Straße 67
* 04229 Leipzig
* Phone: +49 341-490670
* mailto: info@bitctrl.de
*/
/** Modul Meldungserzeugung. */
package de.bsvrz.kex.lmstic3.empfang.erzeugung;
/*
* Segment 2 (KEx), SWE LMS-TIC3
* Copyright (C) 2016 BitCtrl Systems GmbH
*
* This library 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 library 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Contact Information:
* BitCtrl Systems GmbH
* Weißenfelser Straße 67
* 04229 Leipzig
* Phone: +49 341-490670
* mailto: info@bitctrl.de
*/
package de.bsvrz.kex.lmstic3.empfang.ftpempfang;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import de.bsvrz.kex.lmstic3.vew.LMSFTPListener;
import de.bsvrz.kex.lmstic3.vew.LMSKommunikationsstatus;
import de.bsvrz.kex.lmstic3.vew.LMSParameter;
import de.bsvrz.kex.lmstic3.vew.LMSProperties;
import de.bsvrz.sys.funclib.debug.Debug;
/**
* Modul FTP-Empfang.
*
* @author BitCtrl Systems GmbH, Gieseler
* @version $Id: FTPEmpfang.java 63743 2016-10-05 16:18:58Z gieseler $
*/
public class FTPEmpfang extends Thread {
/**
* Filter zur Dateiauswahl.
*/
class XmlFilenameFilter implements FilenameFilter {
@Override
public boolean accept(final File f, final String s) {
return s.toLowerCase().endsWith(".xml");
}
}
/**
* Logger f&uuml;r Debug-Ausgaben.
*/
private final Debug debug = Debug.getLogger();
/**
* Zyklus, mit dem das Eingangsverzeichnis auf neue Dateien
* &uuml;berpr&uuml;ft wird.
*/
private final int zyklus = 10000;
/**
* Die aktuellen Parameter.
*/
private LMSParameter parameter;
/**
* Liste der angemeldeten Listener.
*/
private final List<LMSFTPListener> listenerList = new ArrayList<>();
/**
* Der Kommunikationsstatus mit der Landesmeldestelle.
*/
private LMSKommunikationsstatus kommunikationsStatus = LMSKommunikationsstatus.GESTOERT;
/**
* HashSet der bereits empfangenen Dateien.
*/
private Map<File, Long> dateimap = new HashMap<>();
/**
* Zeitpunkt des letzten Empfanges einer Datei.
*/
private long letzterEmpfang;
/**
* Run-Flag.
*/
private boolean run = true;
/**
* Erzeugt eine Instanz und startet diese als Thread.
*
* @param parameter
* Der Parametersatz
*/
public FTPEmpfang(final LMSParameter parameter) {
this.parameter = parameter;
this.setName(this.getClass().getSimpleName());
// selbst starten
start();
}
/**
* F&uuml;gt einen Listener hinzu.
*
* @param listner
* neuer Listener
*/
public void addListener(final LMSFTPListener listner) {
listenerList.add(listner);
}
/**
* &Uuml;berpr&uuml;ft das Eingangsverzeichnis auf neue empfangene Dateien.
*/
private void findeNeueDateien() {
final Map<File, Long> dateimapneu = new HashMap<>();
final File dir = new File(parameter.getEingangsverzeichnis());
final File[] dateien = dir.listFiles(new XmlFilenameFilter());
List<File> neueDateien = new ArrayList<>();
if (dateien != null) {
for (final File datei : dateien) {
if (datei.getName().equalsIgnoreCase(LMSProperties.KEEP_ALIVE_DATEINAME)) {
debug.info("KeepAlive-Datei empfangen");
letzterEmpfang = System.currentTimeMillis();
setzeKommunikationsStatus(LMSKommunikationsstatus.NICHT_GESTOERT);
datei.delete();
continue;
}
boolean isNeu = false;
// Test, ob immer die gleiche Datei überschrieben wird
if (dateimap.containsKey(datei)) {
final Long fileTime = dateimap.get(datei);
if (fileTime != datei.lastModified()) {
isNeu = true;
}
} else {
isNeu = true;
}
if (isNeu) {
dateimapneu.put(datei, datei.lastModified());
neueDateien.add(datei);
}
}
}
dateimap = dateimapneu;
neueDateien = checkFileReady(neueDateien);
neueDateien = handleOverrideMode(neueDateien);
if (neueDateien.size() > 0) {
debug.fine(neueDateien.size() + " neue Datei(en) empfangen (" + neueDateien + ")");
setzeKommunikationsStatus(LMSKommunikationsstatus.NICHT_GESTOERT);
letzterEmpfang = System.currentTimeMillis();
informiereListenerDateien(neueDateien);
}
}
/**
* Prüft, ob der Transfer der Dateien beendet ist.
* <p>
* Es wird geprüft, ob sich innerhalb einer Sekunde die Größe ändert.
* </p>
*
* @param neueDateien
* neue Dateien
* @return Liste von Dateien
*/
private List<File> checkFileReady(final List<File> neueDateien) {
final List<File> result = new ArrayList<>();
final Map<File, Long> sizeMap = new HashMap<>();
for (File f : neueDateien) {
final long length = f.length();
sizeMap.put(f, length);
}
try {
Thread.sleep(1000);
} catch (final InterruptedException e) {
}
for (File f : neueDateien) {
final long length = f.length();
if (sizeMap.get(f) == length) {
result.add(f);
}
}
return result;
}
private List<File> handleOverrideMode(final List<File> dateien) {
final List<File> neueDateien = new ArrayList<>();
final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");
final String ts = simpleDateFormat.format(new Date(System.currentTimeMillis()));
for (File f : dateien) {
final String destname = f.getAbsolutePath() + "_" + ts;
final File dest = new File(destname);
try {
Files.move(f.toPath(), dest.toPath(), StandardCopyOption.ATOMIC_MOVE);
neueDateien.add(dest);
} catch (final IOException e) {
debug.error(e.getMessage());
}
}
return neueDateien;
}
/**
* Informiert die Listener &uuml;ber neue Dateien.
*
* @param dateien
* Liste der neuen Dateien
*/
void informiereListenerDateien(final List<File> dateien) {
for (final LMSFTPListener listener : listenerList) {
listener.empfangen(dateien);
}
}
/**
* Informiert die Listener &uuml;ber den Kommunikationsstatus.
*/
void informiereListenerStatus() {
for (final LMSFTPListener listener : listenerList) {
listener.kommunikationsStatus(kommunikationsStatus);
}
}
@Override
public void run() {
try {
while (run) {
Thread.sleep(zyklus);
findeNeueDateien();
// ueberpruefe Kommunikationsstatus
if ((System.currentTimeMillis() - letzterEmpfang) > parameter.getTestIntervallKommunikation()) {
debug.warning("Der Kommunikationsstatus ist gestört");
setzeKommunikationsStatus(LMSKommunikationsstatus.GESTOERT);
letzterEmpfang = System.currentTimeMillis();
}
}
} catch (final InterruptedException ie) {
/**
*
*/
} catch (final Exception e) {
debug.error(e.getMessage());
}