From ab8b2496218f49f49d2602987481e2dd7a3e7293 Mon Sep 17 00:00:00 2001
From: ulrich <undisclosed@undiclosed>
Date: Sat, 10 Apr 2021 17:59:27 +0000
Subject: [PATCH] UI-Anpassungen
---
src/de/uhilger/mediaz/store/FileStorage.java | 192 ++++++++++++++++++++++++++++++++++-------------
1 files changed, 137 insertions(+), 55 deletions(-)
diff --git a/src/de/uhilger/mediaz/store/FileStorage.java b/src/de/uhilger/mediaz/store/FileStorage.java
index 1d6373a..2d768cf 100644
--- a/src/de/uhilger/mediaz/store/FileStorage.java
+++ b/src/de/uhilger/mediaz/store/FileStorage.java
@@ -1,14 +1,30 @@
/*
- * 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.
+ Mediazentrale - Personal Media Center
+ Copyright (C) 2021 Ulrich Hilger
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.uhilger.mediaz.store;
import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
import de.uhilger.mediaz.App;
import de.uhilger.mediaz.Server;
import de.uhilger.mediaz.entity.Ablageort;
+import de.uhilger.mediaz.entity.Abspieler;
+import de.uhilger.mediaz.entity.Abspielliste;
+import de.uhilger.mediaz.entity.Einstellung;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
@@ -17,12 +33,15 @@
import java.io.IOException;
import java.util.logging.Logger;
import de.uhilger.mediaz.entity.Entity;
+import de.uhilger.mediaz.entity.Titel;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.logging.Level;
/**
- * Ablage fuer Dateien
+ * Ablage fuer Dateien der Mediazentrale
*
* [Basispfad]/[Typ]/[Name]
*
@@ -38,11 +57,29 @@
/** StorageType Ablageort */
public static final String ST_ABLAGEORT = "Ablageort";
+ public static final String ST_EINSTELLUNG = "Einstellung";
+ public static final String ST_ABSPIELER = "Abspieler";
+ public static final String ST_ABSPIELLISTE = "Abspielliste";
- private String fileBase;
+ private final String fileBase;
+
+ private final Map<String, TypeToken> types;
public FileStorage(String base) {
this.fileBase = base;
+
+ // Beispiel: TypeToken<List<String>> list = new TypeToken<List<String>>() {};
+ TypeToken<Ablageort> ttAblageort = new TypeToken<Ablageort>() {};
+ TypeToken<Einstellung> ttEinstellung = new TypeToken<Einstellung>() {};
+ TypeToken<Abspieler> ttAbspieler = new TypeToken<Abspieler>() {};
+ TypeToken<Abspielliste> ttAbspielliste = new TypeToken<Abspielliste>() {};
+ TypeToken<Titel> ttTitel = new TypeToken<Titel>() {};
+ types = new HashMap();
+ types.put(Ablageort.class.getSimpleName(), ttAblageort);
+ types.put(Einstellung.class.getSimpleName(), ttEinstellung);
+ types.put(Abspieler.class.getSimpleName(), ttAbspieler);
+ types.put(Abspielliste.class.getSimpleName(), ttAbspielliste);
+ types.put(Titel.class.getSimpleName(), ttTitel);
}
/**
@@ -50,71 +87,64 @@
*
* Es wird in den Ordner geschrieben, der von conf angegeben ist
*
- * Wenn es z.B. ein Ablage-Objekt ist, wird das Objekt in die Datei
- * [conf]/Ablage/[name der Ablage].json geschrieben
- *
- * Der Name der Ablage muss eindeutig sein
+ * Wenn es z.B.ein Ablage-Objekt ist, wird das Objekt in die Datei
+ [conf]/Ablage/[name der Ablage].json geschrieben
+
+ Der Name der Ablage muss eindeutig sein
*
*
- * @param o
+ * @param entity das Objekt, das geschrieben werden soll
+ * @param overwrite true, wenn Aenderung, false fuer neue Elemente
+ * @return die Datei oder null, wenn die Datei existiert und ein
+ * neues Element (overwrite=false) uebergeben wurde
+ * @throws java.io.IOException
*/
- public File writeToFile(Entity o) throws IOException {
- Gson gson = new Gson();
- String className = o.getClass().getSimpleName();
+ public File writeToFile(Entity entity, boolean overwrite) throws IOException {
+ String className = entity.getClass().getSimpleName();
logger.finer(className);
File dir = new File(fileBase, className);
dir.mkdirs();
- File file = new File(dir, o.getName());
- if(file.exists()) {
- file.delete();
+ File file = new File(dir, entity.getName());
+ if(file.exists() && !overwrite) {
+ return null;
+ } else {
+ FileWriter fw = new FileWriter(file);
+ Gson gson = new Gson();
+ fw.write(gson.toJson(entity));
+ fw.flush();
+ fw.close();
+ return file;
}
- FileWriter fw = new FileWriter(file);
- fw.write(gson.toJson(o));
- fw.flush();
- fw.close();
- return file;
}
- public Entity readFromFile(File file) throws ClassNotFoundException, FileNotFoundException, IOException {
- String type = typeFromName(file);
+ public String readFromFile(File file) throws IOException {
StringBuilder sb = new StringBuilder();
- FileReader in = new FileReader(file);
- BufferedReader r = new BufferedReader(in);
+ BufferedReader r = new BufferedReader(new FileReader(file));
String line = r.readLine();
while(line != null) {
sb.append(line);
line = r.readLine();
}
r.close();
- in.close();
- String json = sb.toString();
- Gson gson = new Gson();
- switch(type) {
- case ST_ABLAGEORT:
- return gson.fromJson(json, Ablageort.class);
- default:
- Ablageort ablage = new Ablageort();
- ablage.setName("Test");
- return ablage;
- }
+ return sb.toString();
}
- private String typeFromName(File file) {
- //String path = file.getPath();
- //logger.info(path);
- String[] parts = file.getPath().split(App.getRs(Server.RB_SLASH));
- //for(String part : parts) {
- //logger.info(part);
- //}
- //logger.info("" + parts.length);
- logger.info(parts[parts.length-2]);
+ public Entity entityFromFile(File file) throws ClassNotFoundException, FileNotFoundException, IOException {
+ String json = readFromFile(file);
+ logger.finer("json: " + json);
+ Gson gson = new Gson();
+ return gson.fromJson(json, typeFromName(typeNameFromPath(file)).getType());
+ }
+
+ private String typeNameFromPath(File file) {
+ String[] parts = file.getPath().split(Server.SLASH);
return parts[parts.length-2];
}
@Override
- public Object write(Entity e) {
+ public Object write(Entity e, boolean overwrite) {
try {
- return writeToFile(e);
+ return writeToFile(e, overwrite);
} catch (IOException ex) {
logger.log(Level.SEVERE, null, ex);
return null;
@@ -123,11 +153,8 @@
@Override
public Entity read(String typ, String name) {
- File base = new File(fileBase);
- File dir = new File(base, typ);
- File file = new File(dir, name);
try {
- return readFromFile(file);
+ return entityFromFile(getFile(typ, name));
} catch (ClassNotFoundException | IOException ex) {
logger.log(Level.SEVERE, null, ex);
return null;
@@ -138,14 +165,69 @@
public List<String> list(String typ) {
File base = new File(fileBase);
File dir = new File(base, typ);
- File[] files = dir.listFiles();
List<String> list = new ArrayList();
- for(File file : files) {
- list.add(file.getName());
+ File[] files = dir.listFiles();
+ if(files != null) {
+ for(File file : files) {
+ //NamedItem n = new NamedItem();
+ //n.setLabel(file.getName());
+ list.add(file.getName());
+ }
}
return list;
}
-
+ @Override
+ public TypeToken typeFromName(String name) {
+ return types.get(name);
+ }
+
+ @Override
+ public String readJson(String typ, String name) {
+ try {
+ return readFromFile(getFile(typ, name));
+ } catch (IOException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ return null;
+ }
+ }
+
+ private File getFile(String typ, String name) {
+ File base = new File(fileBase);
+ File dir = new File(base, typ);
+ return new File(dir, name);
+ }
+
+ @Override
+ public boolean delete(String typ, String name) {
+ File file = getFile(typ, name);
+ if(file.exists()) {
+ return file.delete();
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public List<Entity> listObjects(String typ) {
+ File base = new File(fileBase);
+ File dir = new File(base, typ);
+ List<Entity> list = new ArrayList();
+ File[] files = dir.listFiles();
+ if(files != null) {
+ for(File file : files) {
+ try {
+ list.add(entityFromFile(file));
+ } catch (ClassNotFoundException | IOException ex) {
+ logger.log(Level.SEVERE, null, ex);
+ }
+ }
+ }
+ return list;
+ }
+
+ public boolean exists(String typ, String name) {
+ return getFile(typ, name).exists();
+ }
}
--
Gitblit v1.9.3