Persoenliche Mediazentrale
ulrich
2021-04-21 757acef98231fb7b5923befbe0498924874ebd32
commit | author | age
b379f5 1 /*
5f70da 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/>.
b379f5 17  */
U 18 package de.uhilger.mediaz.api;
19
20 import com.google.gson.Gson;
21 import com.sun.net.httpserver.HttpExchange;
22 import de.uhilger.mediaz.App;
f45e20 23 import static de.uhilger.mediaz.App.RB_EP_LISTE;
b379f5 24 import de.uhilger.mediaz.Server;
081606 25 import de.uhilger.mediaz.store.FileStorage;
b1bf96 26 import de.uhilger.mediaz.entity.Entity;
d769f3 27 import de.uhilger.mediaz.entity.Geraet;
d027b5 28 import static de.uhilger.mediaz.store.FileStorage.ST_ABLAGEORT;
d769f3 29 import static de.uhilger.mediaz.store.FileStorage.ST_GERAET;
757ace 30 import de.uhilger.mediaz.store.Storage;
d769f3 31 import java.io.BufferedReader;
b379f5 32 import java.io.IOException;
d769f3 33 import java.io.InputStream;
U 34 import java.io.InputStreamReader;
35 import java.net.Authenticator;
36 import java.net.HttpURLConnection;
37 import java.net.InetSocketAddress;
38 import java.net.ProxySelector;
39 import java.net.URI;
40 import java.net.URL;
41 import java.util.Iterator;
2b5c60 42 import java.util.List;
081606 43 import java.util.logging.Level;
b379f5 44 import java.util.logging.Logger;
d769f3 45
U 46 import java.net.http.HttpClient;
47 import java.net.http.HttpClient.Version;
48 import java.net.http.HttpClient.Redirect;
49 import java.net.http.HttpClient.Builder;
50 import java.net.http.HttpRequest;
51 import java.net.http.HttpResponse;
52 import java.net.http.HttpResponse.BodyHandlers;
53 import java.time.Duration;
54 import java.util.ArrayList;
55
b379f5 56
U 57 /**
2597cd 58  * HttpHandler fuer die Verwaltung von Entitaeten der Mediazentrale
5f70da 59  * 
U 60  * @author Ulrich Hilger
61  * @version 1, 5.4.2021
b379f5 62  */
8d7d35 63 public class StorageHandler extends AbstractHandler {
b379f5 64   
081606 65   private static final Logger logger = Logger.getLogger(StorageHandler.class.getName());
b379f5 66
8d7d35 67   @Override
U 68   protected String put(HttpExchange e) throws IOException {
dfb7d3 69     String path = e.getRequestURI().toString();
0e9cd3 70     String[] elems = path.split(Server.SLASH);
dfb7d3 71     String type = elems[elems.length - 2];
U 72     String elemName = elems[elems.length - 1]; // alter Name, wenn Aenderung
73     if(!elemName.equalsIgnoreCase(App.getRs(RB_EP_LISTE))) {
74       FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
75       Gson gson = new Gson();
76       logger.log(Level.FINE, "type: {0}, token: {1}", new Object[]{type, fs.typeFromName(type).getType().getTypeName()});
77       Object o = gson.fromJson(bodyLesen(e), fs.typeFromName(type).getType());
78       if(o instanceof Entity) {
79         Entity entity = (Entity) o;
80         if(fs.exists(type, elemName)) {
81           fs.delete(type, elemName);
82           fs.write(entity, true);
83         } else {
84           fs.write(entity, false);
85         }
0e9cd3 86         return type + Server.SLASH + entity.getName();
dfb7d3 87       } else {
U 88         return "Ungueltiges Objekt im Body.";
89       }
90     } else {
91       return "Ungueltiger Elementname: " + App.getRs(RB_EP_LISTE);
92     }
93   }
8d7d35 94   
2b5c60 95   private boolean loeschen(HttpExchange e) {
5f70da 96     String path = e.getRequestURI().toString();
0e9cd3 97     String[] elems = path.split(Server.SLASH);
5f70da 98     String type = elems[elems.length - 2];
U 99     String elemName = elems[elems.length - 1];
100     FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
2b5c60 101     return fs.delete(type, elemName);
U 102   }
103   
d769f3 104   private String lesen(HttpExchange e) throws IOException, InterruptedException {
2b5c60 105     String path = e.getRequestURI().toString();
0e9cd3 106     String[] elems = path.split(Server.SLASH);
2b5c60 107     FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
0e9cd3 108     if(path.endsWith(Server.SLASH)) {
f45e20 109       List list = null;
dfb7d3 110       if(elems[elems.length - 1].equalsIgnoreCase(App.getRs(RB_EP_LISTE))) {
f45e20 111         String type = elems[elems.length - 2];
U 112         logger.fine(type);
d769f3 113         if(type.equalsIgnoreCase(ST_GERAET)) {
757ace 114           list = collectDeviceStatus(fs, type);
29be41 115           Gson gson = new Gson();
U 116           Object o = gson.fromJson(bodyLesen(e), fs.typeFromName(type).getType());
757ace 117           return gson.toJson(list);
d769f3 118         } else {        
U 119           list = fs.list(type);
120         }
d027b5 121         if(type.equalsIgnoreCase(ST_ABLAGEORT)) {
U 122           list.add("Livestreams");
123         }
f45e20 124       } else {
U 125         String type = elems[elems.length - 1];
126         logger.fine(type);
127         list = fs.listObjects(type);
128       }
a43e1a 129       return jsonWithEnclosingType(list);
2b5c60 130     } else {
U 131       String type = elems[elems.length - 2];
132       String elemName = elems[elems.length - 1];
133       return fs.readJson(type, elemName);
134     }
a43e1a 135   }
b379f5 136   
8d7d35 137   @Override
U 138   public String get(HttpExchange e) {
d769f3 139     try {
U 140       return lesen(e);
141     } catch (IOException | InterruptedException ex) {
142       Logger.getLogger(StorageHandler.class.getName()).log(Level.SEVERE, null, ex);
143       return ex.getLocalizedMessage();
144     }
8d7d35 145   }
U 146
147   @Override
148   public String post(HttpExchange e) {
149     return "nicht unterstuetzt";
150   }
151
152   @Override
153   public boolean delete(HttpExchange e) {
154     return loeschen(e);
b379f5 155   }
757ace 156   
U 157   private List collectDeviceStatus(Storage fs, String type) throws IOException, InterruptedException {
158     List list = fs.listObjects(type);
159     List<Geraet> newList = new ArrayList();
160     Iterator<Entity> i = list.iterator();
161     while (i.hasNext()) {
162       Entity entity = i.next();
163       if (entity instanceof Geraet) {
164         Geraet g = (Geraet) entity;
165         String statusurl = g.getStatusUrl();
166         logger.info(statusurl);
167
168         HttpRequest request = HttpRequest.newBuilder()
169                 .uri(URI.create(statusurl))
170                 .build();
171         HttpClient client = HttpClient.newBuilder()
172                 .version(Version.HTTP_1_1)
173                 .followRedirects(Redirect.NORMAL)
174                 .connectTimeout(Duration.ofSeconds(20))
175                 //.proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
176                 //.authenticator(Authenticator.getDefault())
177                 .build();
178         HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
179         logger.finer(Integer.toString(response.statusCode()));
180         logger.finer(response.body());
181         // {"ison":false,"has_timer":false,"overpower":false}
182         String[] parts = response.body().split(",")[0].split(":");
183         logger.finer("ison: " + parts[1]);
184         g.setStatus(parts[1]);
185         newList.add(g);
186       }
187     }
188     return newList;
189   }
b379f5 190 }