Persoenliche Mediazentrale
ulrich
2021-04-05 b1bf963e57050d6c423a80db76f9d36197a0b475
commit | author | age
081606 1 /*
U 2  * To change this license header, choose License Headers in Project Properties.
3  * To change this template file, choose Tools | Templates
4  * and open the template in the editor.
5  */
6 package de.uhilger.mediaz.store;
7
8 import com.google.gson.Gson;
b1bf96 9 import com.google.gson.reflect.TypeToken;
081606 10 import de.uhilger.mediaz.App;
U 11 import de.uhilger.mediaz.Server;
12 import de.uhilger.mediaz.entity.Ablageort;
13 import java.io.BufferedReader;
14 import java.io.File;
15 import java.io.FileNotFoundException;
16 import java.io.FileReader;
17 import java.io.FileWriter;
18 import java.io.IOException;
19 import java.util.logging.Logger;
20 import de.uhilger.mediaz.entity.Entity;
21 import java.util.ArrayList;
b1bf96 22 import java.util.HashMap;
081606 23 import java.util.List;
b1bf96 24 import java.util.Map;
081606 25 import java.util.logging.Level;
U 26
27 /**
28  * Ablage fuer Dateien
29  * 
30  * [Basispfad]/[Typ]/[Name]
31  * 
32  * Typ ist eine der Klassen der Package entity
33  * Name muss identisch mit dem Element laut Entity.getName() sein
34  * 
35  * @author ulrich
36  * @version 1, 5.4.2021
37  */
38 public class FileStorage implements Storage {
39   
40   private static final Logger logger = Logger.getLogger(FileStorage.class.getName());
41   
42   /** StorageType Ablageort */
43   public static final String ST_ABLAGEORT = "Ablageort";
44   
45   private String fileBase;
46   
b1bf96 47   private Map<String, TypeToken> types;
U 48   
081606 49   public FileStorage(String base) {
U 50     this.fileBase = base;
b1bf96 51     
U 52     //TypeToken<List<String>> list = new TypeToken<List<String>>() {};
53     TypeToken<Ablageort> ttAblageort = new TypeToken<Ablageort>() {};
54     types = new HashMap();
55     types.put(Ablageort.class.getSimpleName(), ttAblageort);
081606 56   }
U 57   
58   /**
59    * Ein Objekt als JSON in eine Datei schreiben
60    * 
61    * Es wird in den Ordner geschrieben, der von conf angegeben ist
62    * 
63    * Wenn es z.B. ein Ablage-Objekt ist, wird das Objekt in die Datei
64    * [conf]/Ablage/[name der Ablage].json geschrieben
65    * 
66    * Der Name der Ablage muss eindeutig sein
67    * 
68    * 
69    * @param o 
70    */
71   public File writeToFile(Entity o) throws IOException {
72     Gson gson = new Gson();
73     String className = o.getClass().getSimpleName();
74     logger.finer(className); 
75     File dir = new File(fileBase, className);
76     dir.mkdirs();
77     File file = new File(dir, o.getName());
78     if(file.exists()) {
79       file.delete();
80     }
81     FileWriter fw = new FileWriter(file);
82     fw.write(gson.toJson(o));
83     fw.flush();
84     fw.close();
85     return file;
86   }
87   
88   public Entity readFromFile(File file) throws ClassNotFoundException, FileNotFoundException, IOException {
b1bf96 89     String type = typeNameFromPath(file);
081606 90     StringBuilder sb = new StringBuilder();
U 91     FileReader in = new FileReader(file);
92     BufferedReader r = new BufferedReader(in);
93     String line = r.readLine();
94     while(line != null) {
95       sb.append(line);
96       line = r.readLine();
97     }
98     r.close();
99     in.close();
100     String json = sb.toString();
101     Gson gson = new Gson();
102     switch(type) {
103       case ST_ABLAGEORT:
104         return gson.fromJson(json, Ablageort.class);
105       default:
106         Ablageort ablage = new Ablageort();
107         ablage.setName("Test");
108         return ablage;
109     }
110   }
111   
b1bf96 112   private String typeNameFromPath(File file) {
081606 113     String[] parts = file.getPath().split(App.getRs(Server.RB_SLASH));
U 114     logger.info(parts[parts.length-2]);
115     return parts[parts.length-2];
116   }
117
118   @Override
119   public Object write(Entity e) {
120     try {
121       return writeToFile(e);
122     } catch (IOException ex) {
123       logger.log(Level.SEVERE, null, ex);
124       return null;
125     }
126   }
127
128   @Override
129   public Entity read(String typ, String name) {
130     File base = new File(fileBase);
131     File dir = new File(base, typ);
132     File file = new File(dir, name);
133     try {
134       return readFromFile(file);
135     } catch (ClassNotFoundException | IOException ex) {
136       logger.log(Level.SEVERE, null, ex);
137       return null;
138     }
139   }
140
141   @Override
142   public List<String> list(String typ) {
143     File base = new File(fileBase);
144     File dir = new File(base, typ);
145     File[] files = dir.listFiles();
146     List<String> list = new ArrayList();
147     for(File file : files) {
148       list.add(file.getName());
149     }
150     return list;
151   }
152
b1bf96 153   @Override
U 154   public TypeToken typeFromName(String name) {
155     return types.get(name);
156   }
157
081606 158   
U 159   
160 }