Persoenliche Mediazentrale
ulrich
2021-04-06 2597cdc3863be2c566c6bba8fe985eaff4a87df6
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;
25 import java.io.BufferedReader;
26 import java.io.File;
27 import java.io.FileNotFoundException;
28 import java.io.FileReader;
29 import java.io.FileWriter;
30 import java.io.IOException;
31 import java.util.logging.Logger;
32 import de.uhilger.mediaz.entity.Entity;
33 import java.util.ArrayList;
b1bf96 34 import java.util.HashMap;
081606 35 import java.util.List;
b1bf96 36 import java.util.Map;
081606 37 import java.util.logging.Level;
U 38
39 /**
2b5c60 40  * Ablage fuer Dateien der Mediazentrale
081606 41  * 
U 42  * [Basispfad]/[Typ]/[Name]
43  * 
44  * Typ ist eine der Klassen der Package entity
45  * Name muss identisch mit dem Element laut Entity.getName() sein
46  * 
47  * @author ulrich
48  * @version 1, 5.4.2021
49  */
50 public class FileStorage implements Storage {
51   
52   private static final Logger logger = Logger.getLogger(FileStorage.class.getName());
53   
54   /** StorageType Ablageort */
55   public static final String ST_ABLAGEORT = "Ablageort";
56   
57   private String fileBase;
58   
b1bf96 59   private Map<String, TypeToken> types;
U 60   
081606 61   public FileStorage(String base) {
U 62     this.fileBase = base;
b1bf96 63     
5f70da 64     // Beispiel: TypeToken<List<String>> list = new TypeToken<List<String>>() {};
b1bf96 65     TypeToken<Ablageort> ttAblageort = new TypeToken<Ablageort>() {};
U 66     types = new HashMap();
67     types.put(Ablageort.class.getSimpleName(), ttAblageort);
081606 68   }
U 69   
70   /**
71    * Ein Objekt als JSON in eine Datei schreiben
72    * 
73    * Es wird in den Ordner geschrieben, der von conf angegeben ist
74    * 
75    * Wenn es z.B. ein Ablage-Objekt ist, wird das Objekt in die Datei
76    * [conf]/Ablage/[name der Ablage].json geschrieben
77    * 
78    * Der Name der Ablage muss eindeutig sein
79    * 
80    * 
2b5c60 81    * @param entity 
081606 82    */
2597cd 83   public File writeToFile(Entity entity, boolean overwrite) throws IOException {
2b5c60 84     String className = entity.getClass().getSimpleName();
081606 85     logger.finer(className); 
U 86     File dir = new File(fileBase, className);
87     dir.mkdirs();
2b5c60 88     File file = new File(dir, entity.getName());
2597cd 89     //if(file.exists()) {
U 90     //  file.delete();
91     //}
92     if(file.exists() && !overwrite) {      
93       return null;
94     } else {
95       FileWriter fw = new FileWriter(file);
96       Gson gson = new Gson();
97       fw.write(gson.toJson(entity));
98       fw.flush();
99       fw.close();
100       return file;
081606 101     }
U 102   }
103   
5f70da 104   public String readFromFile(File file) throws IOException {
081606 105     StringBuilder sb = new StringBuilder();
5f70da 106     BufferedReader r = new BufferedReader(new FileReader(file));
081606 107     String line = r.readLine();
U 108     while(line != null) {
109       sb.append(line);
110       line = r.readLine();
111     }
112     r.close();
5f70da 113     return sb.toString();
U 114   }
115   
116   public Entity entityFromFile(File file) throws ClassNotFoundException, FileNotFoundException, IOException {
117     String json = readFromFile(file);
081606 118     Gson gson = new Gson();
5f70da 119     return gson.fromJson(json, typeFromName(typeNameFromPath(file)).getType());
081606 120   }
U 121   
b1bf96 122   private String typeNameFromPath(File file) {
081606 123     String[] parts = file.getPath().split(App.getRs(Server.RB_SLASH));
U 124     return parts[parts.length-2];
125   }
126
127   @Override
2597cd 128   public Object write(Entity e, boolean overwrite) {
081606 129     try {
2597cd 130       return writeToFile(e, overwrite);
081606 131     } catch (IOException ex) {
U 132       logger.log(Level.SEVERE, null, ex);
133       return null;
134     }
135   }
136
137   @Override
138   public Entity read(String typ, String name) {
139     try {
5f70da 140       return entityFromFile(getFile(typ, name));
081606 141     } catch (ClassNotFoundException | IOException ex) {
U 142       logger.log(Level.SEVERE, null, ex);
143       return null;
144     }
145   }
146
147   @Override
148   public List<String> list(String typ) {
149     File base = new File(fileBase);
150     File dir = new File(base, typ);
151     File[] files = dir.listFiles();
152     List<String> list = new ArrayList();
153     for(File file : files) {
a43e1a 154       //NamedItem n = new NamedItem();
U 155       //n.setLabel(file.getName());
081606 156       list.add(file.getName());
U 157     }
158     return list;
159   }
160
b1bf96 161   @Override
U 162   public TypeToken typeFromName(String name) {
163     return types.get(name);
164   }
165
5f70da 166   @Override
U 167   public String readJson(String typ, String name) {
168     try {
169       return readFromFile(getFile(typ, name));
170     } catch (IOException ex) {
171       logger.log(Level.SEVERE, null, ex);
172       return null;
173     }
174   }
175   
176   private File getFile(String typ, String name) {
177     File base = new File(fileBase);
178     File dir = new File(base, typ);
179     return new File(dir, name);    
180   }
181
2b5c60 182   @Override
U 183   public boolean delete(String typ, String name) {
184     File file = getFile(typ, name);
185     if(file.exists()) {
186       return file.delete();
187     } else {
188       return false;
189     }
190   }
081606 191   
U 192 }