Persoenliche Mediazentrale
ulrich
2021-04-08 8d7d357497e80b87f1d3be2357cb9cb2e853e582
commit | author | age
081606 1 /*
2b5c60 2   Mediazentrale - Personal Media Center
U 3   Copyright (C) 2021  Ulrich Hilger
4
5   This program is free software: you can redistribute it and/or modify
6   it under the terms of the GNU Affero General Public License as
7   published by the Free Software Foundation, either version 3 of the
8   License, or (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU Affero General Public License for more details.
14
15   You should have received a copy of the GNU Affero General Public License
16   along with this program.  If not, see <https://www.gnu.org/licenses/>.
081606 17  */
U 18 package de.uhilger.mediaz.store;
19
20 import com.google.gson.Gson;
b1bf96 21 import com.google.gson.reflect.TypeToken;
081606 22 import de.uhilger.mediaz.App;
U 23 import de.uhilger.mediaz.Server;
24 import de.uhilger.mediaz.entity.Ablageort;
3d4bca 25 import de.uhilger.mediaz.entity.Abspieler;
8d7d35 26 import de.uhilger.mediaz.entity.Abspielliste;
cf6509 27 import de.uhilger.mediaz.entity.Einstellung;
081606 28 import java.io.BufferedReader;
U 29 import java.io.File;
30 import java.io.FileNotFoundException;
31 import java.io.FileReader;
32 import java.io.FileWriter;
33 import java.io.IOException;
34 import java.util.logging.Logger;
35 import de.uhilger.mediaz.entity.Entity;
36 import java.util.ArrayList;
b1bf96 37 import java.util.HashMap;
081606 38 import java.util.List;
b1bf96 39 import java.util.Map;
081606 40 import java.util.logging.Level;
U 41
42 /**
2b5c60 43  * Ablage fuer Dateien der Mediazentrale
081606 44  * 
U 45  * [Basispfad]/[Typ]/[Name]
46  * 
47  * Typ ist eine der Klassen der Package entity
48  * Name muss identisch mit dem Element laut Entity.getName() sein
49  * 
50  * @author ulrich
51  * @version 1, 5.4.2021
52  */
53 public class FileStorage implements Storage {
54   
55   private static final Logger logger = Logger.getLogger(FileStorage.class.getName());
56   
57   /** StorageType Ablageort */
58   public static final String ST_ABLAGEORT = "Ablageort";
dce2c7 59   public static final String ST_EINSTELLUNG = "Einstellung";
3d4bca 60   public static final String ST_ABSPIELER = "Abspieler";
081606 61   
cf6509 62   private final String fileBase;
081606 63   
cf6509 64   private final Map<String, TypeToken> types;
b1bf96 65   
081606 66   public FileStorage(String base) {
U 67     this.fileBase = base;
b1bf96 68     
5f70da 69     // Beispiel: TypeToken<List<String>> list = new TypeToken<List<String>>() {};
b1bf96 70     TypeToken<Ablageort> ttAblageort = new TypeToken<Ablageort>() {};
cf6509 71     TypeToken<Einstellung> ttEinstellung = new TypeToken<Einstellung>() {};
3d4bca 72     TypeToken<Abspieler> ttAbspieler = new TypeToken<Abspieler>() {};
8d7d35 73     TypeToken<Abspielliste> ttAbspielliste = new TypeToken<Abspielliste>() {};
b1bf96 74     types = new HashMap();
U 75     types.put(Ablageort.class.getSimpleName(), ttAblageort);
cf6509 76     types.put(Einstellung.class.getSimpleName(), ttEinstellung);
3d4bca 77     types.put(Abspieler.class.getSimpleName(), ttAbspieler);
8d7d35 78     types.put(Abspielliste.class.getSimpleName(), ttAbspielliste);
081606 79   }
U 80   
81   /**
82    * Ein Objekt als JSON in eine Datei schreiben
83    * 
84    * Es wird in den Ordner geschrieben, der von conf angegeben ist
85    * 
cf6509 86    * Wenn es z.B.ein Ablage-Objekt ist, wird das Objekt in die Datei
U 87  [conf]/Ablage/[name der Ablage].json geschrieben
88  
89  Der Name der Ablage muss eindeutig sein
081606 90    * 
U 91    * 
cf6509 92    * @param entity  das Objekt, das geschrieben werden soll
U 93    * @param overwrite true, wenn Aenderung, false fuer neue Elemente
94    * @return  die Datei oder null, wenn die Datei existiert und ein 
95    * neues Element (overwrite=false) uebergeben wurde
96    * @throws java.io.IOException 
081606 97    */
2597cd 98   public File writeToFile(Entity entity, boolean overwrite) throws IOException {
2b5c60 99     String className = entity.getClass().getSimpleName();
081606 100     logger.finer(className); 
U 101     File dir = new File(fileBase, className);
102     dir.mkdirs();
2b5c60 103     File file = new File(dir, entity.getName());
2597cd 104     if(file.exists() && !overwrite) {      
U 105       return null;
106     } else {
107       FileWriter fw = new FileWriter(file);
108       Gson gson = new Gson();
109       fw.write(gson.toJson(entity));
110       fw.flush();
111       fw.close();
112       return file;
081606 113     }
U 114   }
115   
5f70da 116   public String readFromFile(File file) throws IOException {
081606 117     StringBuilder sb = new StringBuilder();
5f70da 118     BufferedReader r = new BufferedReader(new FileReader(file));
081606 119     String line = r.readLine();
U 120     while(line != null) {
121       sb.append(line);
122       line = r.readLine();
123     }
124     r.close();
5f70da 125     return sb.toString();
U 126   }
127   
128   public Entity entityFromFile(File file) throws ClassNotFoundException, FileNotFoundException, IOException {
129     String json = readFromFile(file);
081606 130     Gson gson = new Gson();
5f70da 131     return gson.fromJson(json, typeFromName(typeNameFromPath(file)).getType());
081606 132   }
U 133   
b1bf96 134   private String typeNameFromPath(File file) {
081606 135     String[] parts = file.getPath().split(App.getRs(Server.RB_SLASH));
U 136     return parts[parts.length-2];
137   }
138
139   @Override
2597cd 140   public Object write(Entity e, boolean overwrite) {
081606 141     try {
2597cd 142       return writeToFile(e, overwrite);
081606 143     } catch (IOException ex) {
U 144       logger.log(Level.SEVERE, null, ex);
145       return null;
146     }
147   }
148
149   @Override
150   public Entity read(String typ, String name) {
151     try {
5f70da 152       return entityFromFile(getFile(typ, name));
081606 153     } catch (ClassNotFoundException | IOException ex) {
U 154       logger.log(Level.SEVERE, null, ex);
155       return null;
156     }
157   }
158
159   @Override
160   public List<String> list(String typ) {
161     File base = new File(fileBase);
162     File dir = new File(base, typ);
163     List<String> list = new ArrayList();
b29119 164     File[] files = dir.listFiles();
U 165     if(files != null) {
166       for(File file : files) {
167         //NamedItem n = new NamedItem();
168         //n.setLabel(file.getName());
169         list.add(file.getName());
170       }
081606 171     }
U 172     return list;
173   }
f45e20 174   
b1bf96 175   @Override
U 176   public TypeToken typeFromName(String name) {
177     return types.get(name);
178   }
179
5f70da 180   @Override
U 181   public String readJson(String typ, String name) {
182     try {
183       return readFromFile(getFile(typ, name));
184     } catch (IOException ex) {
185       logger.log(Level.SEVERE, null, ex);
186       return null;
187     }
188   }
189   
190   private File getFile(String typ, String name) {
191     File base = new File(fileBase);
192     File dir = new File(base, typ);
193     return new File(dir, name);    
194   }
195
2b5c60 196   @Override
U 197   public boolean delete(String typ, String name) {
198     File file = getFile(typ, name);
199     if(file.exists()) {
200       return file.delete();
201     } else {
202       return false;
203     }
204   }
f45e20 205
U 206   @Override
207   public List<Entity> listObjects(String typ) {
208     File base = new File(fileBase);
209     File dir = new File(base, typ);
210     List<Entity> list = new ArrayList();
211     File[] files = dir.listFiles();
212     if(files != null) {
213       for(File file : files) {
214         try {
215           list.add(entityFromFile(file));
216         } catch (ClassNotFoundException | IOException ex) {
217           logger.log(Level.SEVERE, null, ex);
218         }
219       }
220     }
221     return list;
222   }
081606 223   
dfb7d3 224   public boolean exists(String typ, String name) {
U 225     return getFile(typ, name).exists();
226   }
227   
081606 228 }