/*
* MediathekView
* Copyright (C) 2008 W. Xaver
* W.Xaver[at]googlemail.com
* http://zdfmediathk.sourceforge.net/
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package mediathek.controller;
import mSearch.Const;
import mSearch.filmlisten.DatenFilmlisteUrl;
import mSearch.tool.Duration;
import mSearch.tool.Listener;
import mSearch.tool.Log;
import mSearch.tool.ReplaceList;
import mediathek.config.Daten;
import mediathek.config.MVConfig;
import mediathek.daten.*;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Path;
public class IoXmlLesen {
public static boolean datenLesen(Path xmlFilePath) {
Daten daten = Daten.getInstance();
Duration.counterStart("Konfig lesen");
boolean ret = false;
if (Files.exists(xmlFilePath)) {
int event;
XMLInputFactory inFactory = XMLInputFactory.newInstance();
inFactory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE);
DatenPset datenPset = null;
try (InputStreamReader in = new InputStreamReader(Files.newInputStream(xmlFilePath), Const.KODIERUNG_UTF)) {
//XMLStreamReader parser = inFactory.createXMLStreamReader(new BufferedReader(in, 25_000));
XMLStreamReader parser = inFactory.createXMLStreamReader(in);
while (parser.hasNext()) {
event = parser.next();
if (event == XMLStreamConstants.START_ELEMENT) {
//String t = parser.getLocalName();
switch (parser.getLocalName()) {
case MVConfig.SYSTEM:
//System
getConfig(parser, MVConfig.SYSTEM);
break;
case DatenPset.TAG:
//Programmgruppen
datenPset = new DatenPset();
if (get(parser, DatenPset.TAG, DatenPset.XML_NAMES, datenPset.arr)) {
Daten.listePset.add(datenPset);
}
break;
case DatenProg.TAG:
DatenProg datenProg = new DatenProg();
if (get(parser, DatenProg.TAG, DatenProg.XML_NAMES, datenProg.arr)) {
if (datenPset != null) {
datenPset.addProg(datenProg);
}
}
//ende Programgruppen
break;
case ReplaceList.REPLACELIST:
// Ersetzungstabelle
String[] sa = new String[ReplaceList.MAX_ELEM];
if (get(parser, ReplaceList.REPLACELIST, ReplaceList.COLUMN_NAMES, sa)) {
ReplaceList.list.add(sa);
}
break;
case DatenAbo.TAG:
//Abo
DatenAbo datenAbo = new DatenAbo();
if (get(parser, DatenAbo.TAG, DatenAbo.XML_NAMES, datenAbo.arr)) {
daten.getListeAbo().addAbo(datenAbo);
}
break;
case DatenDownload.TAG:
//Downloads
DatenDownload d = new DatenDownload();
if (get(parser, DatenDownload.TAG, DatenDownload.XML_NAMES, d.arr)) {
d.init();
daten.getListeDownloads().add(d);
}
break;
case DatenBlacklist.TAG:
//Blacklist
DatenBlacklist datenBlacklist = new DatenBlacklist();
if (get(parser, DatenBlacklist.TAG, DatenBlacklist.XML_NAMES, datenBlacklist.arr)) {
daten.getListeBlacklist().addWithoutNotification(datenBlacklist);
}
break;
case DatenMediaPath.TAG:
//Blacklist
DatenMediaPath mp = new DatenMediaPath();
if (get(parser, DatenMediaPath.TAG, DatenMediaPath.XML_NAMES, mp.arr)) {
daten.getListeMediaPath().add(mp);
}
break;
case DatenFilmlisteUrl.FILM_UPDATE_SERVER:
//Urls Filmlisten
DatenFilmlisteUrl datenFilmlisteUrl = new DatenFilmlisteUrl();
if (get(parser, DatenFilmlisteUrl.FILM_UPDATE_SERVER, DatenFilmlisteUrl.FILM_UPDATE_SERVER_COLUMN_NAMES, datenFilmlisteUrl.arr)) {
switch (datenFilmlisteUrl.arr[DatenFilmlisteUrl.FILM_UPDATE_SERVER_ART_NR]) {
case DatenFilmlisteUrl.SERVER_ART_AKT:
daten.getFilmeLaden().getDownloadUrlsFilmlisten_akt().addWithCheck(datenFilmlisteUrl);
break;
case DatenFilmlisteUrl.SERVER_ART_DIFF:
daten.getFilmeLaden().getDownloadUrlsFilmlisten_diff().addWithCheck(datenFilmlisteUrl);
break;
}
}
break;
}
}
}
parser.close();
ret = true;
} catch (Exception ex) {
ret = false;
Log.errorLog(392840096, ex);
}
daten.getListeDownloads().listeNummerieren();
daten.getListeAbo().sort();
//ListeFilmUpdateServer aufbauen
daten.getFilmeLaden().getDownloadUrlsFilmlisten_akt().sort();
daten.getFilmeLaden().getDownloadUrlsFilmlisten_diff().sort();
MVConfig.loadSystemParameter();
}
Duration.counterStop("Konfig lesen");
return ret;
}
public static boolean einstellungenExistieren() {
Path xmlFilePath = Daten.getMediathekXmlFilePath();
return Files.exists(xmlFilePath);
}
public static int[] importAboBlacklist(String datei, boolean abo, boolean black, boolean replace) {
int[] found = new int[]{0, 0, 0};
Daten daten = Daten.getInstance();
try {
int event;
XMLInputFactory inFactory = XMLInputFactory.newInstance();
inFactory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE);
XMLStreamReader parser;
InputStreamReader in;
in = new InputStreamReader(new FileInputStream(datei), Const.KODIERUNG_UTF);
parser = inFactory.createXMLStreamReader(in);
while (parser.hasNext()) {
event = parser.next();
if (event == XMLStreamConstants.START_ELEMENT) {
//String t = parser.getLocalName();
if (abo && parser.getLocalName().equals(DatenAbo.TAG)) {
//Abo
DatenAbo datenAbo = new DatenAbo();
if (get(parser, DatenAbo.TAG, DatenAbo.XML_NAMES, datenAbo.arr)) {
++found[0];
daten.getListeAbo().addAbo(datenAbo);
}
} else if (black && parser.getLocalName().equals(DatenBlacklist.TAG)) {
//Blacklist
ListeBlacklist blacklist = daten.getListeBlacklist();
DatenBlacklist datenBlacklist = new DatenBlacklist();
if (get(parser, DatenBlacklist.TAG, DatenBlacklist.XML_NAMES, datenBlacklist.arr)) {
++found[1];
blacklist.addWithoutNotification(datenBlacklist);
}
} else if (replace && parser.getLocalName().equals(ReplaceList.REPLACELIST)) {
//Ersetzungstabelle
String[] sa = new String[ReplaceList.MAX_ELEM];
if (get(parser, ReplaceList.REPLACELIST, ReplaceList.COLUMN_NAMES, sa)) {
++found[2];
ReplaceList.list.add(sa);
}
}
}
}
in.close();
} catch (Exception ex) {
Log.errorLog(302045698, ex);
}
if (found[0] > 0) {
daten.getListeAbo().aenderungMelden();
}
if (found[1] > 0) {
daten.getListeBlacklist().filterListAndNotifyListeners();
}
if (found[2] > 0) {
Listener.notify(Listener.EREIGNIS_REPLACELIST_CHANGED, IoXmlLesen.class.getSimpleName());
}
return found;
}
// ##############################
// private
// ##############################
private static boolean get(XMLStreamReader parser, String xmlElem, String[] xmlNames, String[] strRet) {
boolean ret = true;
int maxElem = strRet.length;
for (int i = 0; i < maxElem; ++i) {
if (strRet[i] == null) {
// damit Vorgaben nicht verschwinden!
strRet[i] = "";
}
}
try {
while (parser.hasNext()) {
int event = parser.next();
if (event == XMLStreamConstants.END_ELEMENT) {
if (parser.getLocalName().equals(xmlElem)) {
break;
}
}
if (event == XMLStreamConstants.START_ELEMENT) {
for (int i = 0; i < maxElem; ++i) {
if (parser.getLocalName().equals(xmlNames[i])) {
strRet[i] = parser.getElementText();
break;
}
}
}
}
} catch (Exception ex) {
ret = false;
Log.errorLog(739530149, ex);
}
return ret;
}
private static boolean getConfig(XMLStreamReader parser, String xmlElem) {
boolean ret = true;
try {
while (parser.hasNext()) {
int event = parser.next();
if (event == XMLStreamConstants.END_ELEMENT) {
if (parser.getLocalName().equals(xmlElem)) {
break;
}
}
if (event == XMLStreamConstants.START_ELEMENT) {
String s = parser.getLocalName();
String n = parser.getElementText();
MVConfig.add(s, n);
}
}
} catch (Exception ex) {
ret = false;
Log.errorLog(945120369, ex);
}
return ret;
}
}